MiCommitPoolMemory
INT64 __fastcall MiCommitPoolMemory(INT64 a1){
_MMPTE *PteBase;
UINT64 v3;
unsigned int v4;
INT64 v5;
UINT64 v6;
unsigned __int64 v7;
unsigned int v8;
__int64 v10;
int v11;
INT64 v12;
PteBase = MmGetPteBase();
v3 = (UINT64)PteBase + ((*(_QWORD *)a1 >> 9) & 0x7FFFFFFFF8i64);
MiLockPoolCommitWs(a1);
v4 = 0;
while( v3 <= *(_QWORD *)(a1 + 56) )
{
v6 = *(_QWORD *)(a1 + 64);
if( v6 )
{
MiUnlockPageTableInternal(*(_QWORD *)(a1 + 48), v6);
*(_QWORD *)(a1 + 64) = 0i64;
}
if( *(_BYTE *)(a1 + 76) < 2u && (MiWorkingSetIsContended(*(_QWORD *)(a1 + 48)) || KeShouldYieldProcessor()) )
{
MiUnlockPoolCommitWs(a1);
MiLockPoolCommitWs(a1);
}
v7 = v3 & 0xFFFFFFFFFFFFF000ui64;
if( (unsigned int)MiLockPoolCommitPageTable(a1, (INT64 *)v3) )
{
MiLinkPoolCommitChain(a1, v3);
v3 = v7 + 4096;
}
else
{
MiUnlockPoolCommitWs(a1);
v5 = v7 + 4088;
if( v7 + 4088 > *(_QWORD *)(a1 + 56) )
v5 = *(_QWORD *)(a1 + 56);
LODWORD(v12) = *(_DWORD *)(a1 + 72) + 1;
if( !(unsigned int)MiMakeZeroedPageTablesEx(
v3,
v5,
(*(_WORD *)(a1 + 78) & 4 | 0x400u) >> 1,
*(unsigned int *)(a1 + 40),
v12) )
{
*(_WORD *)(a1 + 78) |= 1u;
MiLockPoolCommitWs(a1);
break;
}
MiLockPoolCommitWs(a1);
}
}
MiFillPoolCommitPageTable(a1);
MiUnlockPoolCommitWs(a1);
v8 = *(unsigned __int16 *)(a1 + 78);
if( (v8 & 1) != 0 )
{
if( (v8 & 2) == 0 )
{
v10 = (*(_QWORD *)a1 >> 9) & 0x7FFFFFFFF8i64;
if( (_MMPTE *)v3 != (_MMPTE *)((char *)PteBase + v10) )
{
v11 = (v8 >> 2) & 1 | 2;
if( (v8 & 0x100) == 0 )
v11 = (v8 >> 2) & 1;
MiClearNonPagedPtes(*(_QWORD *)a1, (__int64)(v3 - v10 - (_QWORD)PteBase) >> 3, 0x4000u, v11);
}
}
v4 = -1073741670;
}
else
{
MiCountSystemPool(*(unsigned int *)(a1 + 40), *(_QWORD *)(a1 + 24), 1i64);
}
MiReturnExcessPoolCommit(a1);
return v4;
}Referenced by:
MmAllocatePoolMemory
MmAllocateSecurePoolMemory