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