MiInitializePoolCommitPacket
INT64 __fastcall MiInitializePoolCommitPacket(
INT64 *a1,
UINT64 *a2,
INT64 a3,
UINT64 a4,
CHAR a5,
UINT64 a6,
INT64 a7,
INT64 a8){
INT64 v8;
ULONG_PTR v9;
unsigned int ProtectionMask;
unsigned int v11;
ULONG_PTR v12;
unsigned int v13;
int v14;
__int16 v15;
__int64 v16;
int v17;
INT64 *v18;
__int64 v19;
__int64 v20;
bool v21;
INT64 result;
INT64 LargePageChain;
INT64 PoolPages;
UINT64 v25;
__int128 v26;
__int64 v27;
__int128 v28;
v8 = *a1;
v9 = *a2;
*(_WORD *)(a8 + 78) = 0;
*(_QWORD *)a8 = v8;
ProtectionMask = MiMakeProtectionMask((unsigned int)a4);
if( ProtectionMask > 0x18 || (v14 = 16777298, !_bittest(&v14, ProtectionMask)) )
KeBugCheckEx(0x1Au, 0x5300ui64, v12, v9, v11);
*(_QWORD *)(a8 + 16) = 0i64;
*(_QWORD *)(a8 + 40) = 5i64;
v15 = 8 * (ProtectionMask & 0x1F);
*(_WORD *)(a8 + 78) = v15;
*(_QWORD *)(a8 + 48) = &qword_140C4F380;
*(_QWORD *)(a8 + 56) = (char *)MmGetPteBase() + (((v12 + v9 - 1) >> 9) & 0x7FFFFFFFF8i64);
v16 = ((__int64)((((v12 + v9 - 1) >> 9) & 0x7FFFFFFFF8i64) - ((v12 >> 9) & 0x7FFFFFFFF8i64)) >> 3) + 1;
if( (a5 & 1) != 0 )
{
*(_WORD *)(a8 + 78) = v15 | 2;
if( (a5 & 0x20) != 0 )
{
*(_DWORD *)(a8 + 44) = 2;
v17 = 1;
v18 = (INT64 *)(*(_QWORD *)(*((_QWORD *)KeGetCurrentThread() + 23) + 1368i64) + 256i64);
}
else
{
v17 = 6;
v18 = &qword_140C4EFC0;
}
v19 = *((unsigned __int16 *)v18 + 87);
*(_QWORD *)(a8 + 48) = v18;
v20 = qword_140C4E388;
*(_DWORD *)(a8 + 40) = v17;
v21 = (unsigned int)MiChargeCommit(*(_MI_PARTITION **)(v20 + 8 * v19), v16, 1ui64) == 0;
goto LABEL_7;
}
if( (v13 & 0x20000000) == 0 )
{
if( a7 )
{
*(_QWORD *)(a8 + 16) = a7;
*(_DWORD *)(a8 + 40) = 15;
*(_WORD *)(a8 + 78) = v15 | 0x100;
goto LABEL_8;
}
PoolPages = MiGetPoolPages(v13, (unsigned int)a6, v16);
*(_QWORD *)(a8 + 16) = PoolPages;
v21 = PoolPages == 0;
LABEL_7:
if( !v21 )
{
LABEL_8:
*(_QWORD *)(a8 + 24) = 0i64;
result = 0i64;
*(_QWORD *)(a8 + 8) = v16;
*(_DWORD *)(a8 + 72) = a6;
*(_QWORD *)(a8 + 64) = 0i64;
*(_QWORD *)(a8 + 32) = 0i64;
return result;
}
return 3221225626i64;
}
if( (unsigned int)MiObtainPoolCharges(v16, 0i64) )
{
LargePageChain = MiGetLargePageChain((unsigned int)a6, v16);
*(_QWORD *)(a8 + 16) = LargePageChain;
if( LargePageChain )
{
*(_WORD *)(a8 + 78) |= 4u;
goto LABEL_8;
}
v27 = v16;
v25 = v16;
v26 = 0i64;
v28 = 0i64;
MiReturnPoolCharges(&v25, 0i64);
}
return 3221225626i64;
}Referenced by:
MmAllocatePoolMemory
MmAllocateSecurePoolMemory