MiInitializePoolCommitPacket
NTSTATUS __stdcall MiInitializePoolCommitPacket(
INT64 *a1,
UINT64 *a2,
INT64 a3,
UINT64 a4,
CHAR a5,
UINT64 RequiredNode,
INT64 a7,
INT64 a8){
INT64 v8;
void *v9;
unsigned int ProtectionMask;
unsigned int v11;
unsigned __int64 v12;
unsigned int v13;
int v14;
__int16 v15;
__int64 v16;
int v17;
char *v18;
__int64 v19;
__int64 v20;
bool v21;
NTSTATUS result;
_MMPFN *LargePageChain;
__int64 v24;
UINT64 v25;
__int128 v26;
__int64 v27;
__int128 v28;
v8 = *a1;
v9 = (void *)*a2;
*(_WORD *)(a8 + 78) = 0;
*(_QWORD *)a8 = v8;
ProtectionMask = MiMakeProtectionMask((unsigned int)a4);
if( ProtectionMask > 0x18 || (v14 = 16777298, !_bittest(&v14, ProtectionMask)) )
KeBugCheckEx(0x1Au, (PVOID)0x5300, (PVOID)v12, v9, (PVOID)v11);
*(_QWORD *)(a8 + 16) = 0i64;
*(_QWORD *)(a8 + 40) = 5i64;
v15 = 8 * (ProtectionMask & 0x1F);
*(_WORD *)(a8 + 78) = v15;
*(_QWORD *)(a8 + 48) = (char *)&stru_140C4DB30 + 6224;
*(_QWORD *)(a8 + 56) = (char *)MmGetPteBase() + ((((unsigned __int64)v9 + v12 - 1) >> 9) & 0x7FFFFFFFF8i64);
v16 = ((__int64)(((((unsigned __int64)v9 + v12 - 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 = (char *)KeGetCurrentThread()->ApcState.Process->Session + 256;
}
else
{
v17 = 6;
v18 = (char *)&stru_140C4DB30 + 5264;
}
v19 = *((unsigned __int16 *)v18 + 87);
*(_QWORD *)(a8 + 48) = v18;
v20 = *(&stru_140C4DB30 + 267);
*(_DWORD *)(a8 + 40) = v17;
v21 = 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;
}
LODWORD(v24) = MiGetPoolPages(v13, (unsigned int)RequiredNode, v16);
*(_QWORD *)(a8 + 16) = v24;
v21 = v24 == 0;
LABEL_7:
if( !v21 )
{
LABEL_8:
*(_QWORD *)(a8 + 24) = 0i64;
result = 0;
*(_QWORD *)(a8 + 8) = v16;
*(_DWORD *)(a8 + 72) = RequiredNode;
*(_QWORD *)(a8 + 64) = 0i64;
*(_QWORD *)(a8 + 32) = 0i64;
return result;
}
return -1073741670;
}
if( MiObtainPoolCharges(v16, 0i64) )
{
LargePageChain = MiGetLargePageChain((unsigned int)RequiredNode, 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 -1073741670;
}Referenced by:
MmAllocatePoolMemory
MmAllocateSecurePoolMemory