ExpCovQueryLoadedModule
__int64 __fastcall ExpCovQueryLoadedModule(
__int64 a1,
char a2,
unsigned int a3,
__int64 a4,
unsigned int *a5,
unsigned int *a6){
__int64 v6;
__int64 v7;
int FriendlyName;
size_t v12;
size_t Length;
unsigned int v14;
unsigned int v15;
__int64 v16;
unsigned __int16 MaximumLength;
wchar_t *Buffer;
VOID *v19;
_UNICODE_STRING UnicodeString[3];
v6 = *(_QWORD *)(a1 + 128);
v7 = a1 + 72;
*(_QWORD *)&UnicodeString[0].Length = 0i64;
UnicodeString[0].Buffer = 0i64;
FriendlyName = ExpCovReadFriendlyName(v6, (_UNICODE_STRING *)(a1 + 72), UnicodeString);
if( FriendlyName >= 0 )
{
v12 = *(_DWORD *)(a1 + 124);
if( !a2 )
v12 -= *(_DWORD *)(v6 + 28);
Length = UnicodeString[0].Length;
if( v12 < 0xFFFFFFE0 )
{
v14 = UnicodeString[0].Length + v12 + 32;
if( v14 < 0x20 )
v14 = -1;
}
else
{
v14 = -1;
}
*a6 = v14;
if( v14 == -1 )
{
DbgPrintEx(0x7Eu, 2u, "COV: Overflow when calculating RequiredLengthForCurrentModule for %wZ\n", v7);
LABEL_10:
FriendlyName = -1073741675;
goto LABEL_17;
}
v15 = *a5 + v14;
if( v15 < *a5 )
{
DbgPrintEx(0x7Eu, 2u, "COV: Overflow when calculating total required length for %wZ\n", v7);
goto LABEL_10;
}
*a5 = v15;
if( a3 >= v15 )
{
*(_DWORD *)a4 = v14;
*(_DWORD *)(a4 + 4) = 1;
*(_DWORD *)(a4 + 24) = v12;
v16 = v12;
memmove((VOID *)(a4 + 28), *(const VOID **)(a1 + 128), v12);
MaximumLength = UnicodeString[0].MaximumLength;
Buffer = UnicodeString[0].Buffer;
v19 = (VOID *)(v16 + a4 + 32);
*(_QWORD *)(a4 + 16) = v19;
*(_WORD *)(a4 + 8) = Length;
*(_WORD *)(a4 + 10) = MaximumLength;
memmove(v19, Buffer, Length);
if( a2 )
memset((VOID *)(v6 + *(unsigned int *)(v6 + 32)), 0i64, *(_DWORD *)(v6 + 28));
}
else
{
FriendlyName = -1073741820;
}
}
LABEL_17:
if( UnicodeString[0].Buffer )
RtlFreeAnsiString(UnicodeString);
return(unsigned int)FriendlyName;
}Referenced by:
ExpCovQueryInfoCallBack