RtlCreateRvaList
INT64 __fastcall RtlCreateRvaList(_DWORD *a1, INT64 a2, INT64 a3, INT64 a4, UINT8 *Src, UINT64 Size, INT64 a7){
__int64 v7;
INT64 *v9;
int v10;
INT64 v11;
unsigned __int64 v12;
INT64 v13;
unsigned __int64 v14;
INT64 *PoolWithTag;
char *v16;
INT64 v17;
INT64 v18;
UINT8 *v19;
UINT8 *v20;
INT64 a6;
unsigned int v23;
int v24;
v24 = HIDWORD(a3);
v7 = (unsigned int)a4;
v23 = 0;
a6 = 0i64;
v9 = 0i64;
v10 = RtlpCompressRvaList(0i64, a1, a3, a4, 0i64, (INT64)&a6, (INT64)&v23);
if( v10 >= 0 )
{
v11 = v23;
if( (unsigned int)v7 <= 1 )
v12 = 0i64;
else
v12 = (((unsigned __int64)((unsigned int)v7 * v23) + 63) >> 3) & 0x1FFFFFFFFFFFFFF8i64;
v13 = a6;
v14 = (a6 + 7) & 0xFFFFFFFFFFFFFFF8ui64;
Size = v12 + 4 * v7 + v14;
PoolWithTag = (INT64 *)ExAllocatePoolWithTag(PagedPool, Size + 64, 0x4C617652ui64);
v9 = PoolWithTag;
if( PoolWithTag )
{
PoolWithTag[3] = v13;
v16 = (char *)(PoolWithTag + 8);
*PoolWithTag = v11;
*((_DWORD *)PoolWithTag + 2) = v7;
PoolWithTag[2] = (INT64)(PoolWithTag + 8);
memset((INT64)(PoolWithTag + 8), 0i64);
v19 = Src;
v20 = (UINT8 *)&v16[v14];
if( Src )
{
v9[6] = (INT64)v20;
memmove(v20, v19, 4 * v7);
v20 += 4 * v7;
}
if( v12 )
{
v9[5] = (INT64)v20;
v9[4] = (unsigned int)(v7 * v11);
}
v10 = RtlpCompressRvaList((INT64)v9, a1, v17, v18, v9[2], (INT64)&a6, (INT64)&v23);
if( v10 < 0 )
{
ExFreePoolWithTag(v9, 0x4C617652u);
v9 = 0i64;
}
}
else
{
v10 = -1073741670;
}
}
*(_QWORD *)a7 = v9;
return(unsigned int)v10;
}Referenced by:
MiParseImageLoadConfig