MiCommitPoolMemory
NTSTATUS __stdcall MiCommitPoolMemory(INT64 a1){
_MMPTE *PteBase;
UINT64 v3;
NTSTATUS v4;
INT64 v5;
UINT64 v6;
int v7;
unsigned __int64 v8;
unsigned int v9;
__int64 v11;
int v12;
INT64 v13;
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 )
{
LOBYTE(v7) = MiWorkingSetIsContended(*(_QWORD *)(a1 + 48));
if( v7 || (unsigned int)KeShouldYieldProcessor() )
{
MiUnlockPoolCommitWs(a1);
MiLockPoolCommitWs(a1);
}
}
v8 = v3 & 0xFFFFFFFFFFFFF000ui64;
if( MiLockPoolCommitPageTable(a1, (INT64 *)v3) )
{
MiLinkPoolCommitChain(a1, v3);
v3 = v8 + 4096;
}
else
{
MiUnlockPoolCommitWs(a1);
v5 = v8 + 4088;
if( v8 + 4088 > *(_QWORD *)(a1 + 56) )
v5 = *(_QWORD *)(a1 + 56);
LODWORD(v13) = *(_DWORD *)(a1 + 72) + 1;
if( !MiMakeZeroedPageTablesEx(v3, v5, (*(_WORD *)(a1 + 78) & 4 | 0x400u) >> 1, *(unsigned int *)(a1 + 40), v13) )
{
*(_WORD *)(a1 + 78) |= 1u;
MiLockPoolCommitWs(a1);
break;
}
MiLockPoolCommitWs(a1);
}
}
MiFillPoolCommitPageTable(a1);
MiUnlockPoolCommitWs(a1);
v9 = *(unsigned __int16 *)(a1 + 78);
if( (v9 & 1) != 0 )
{
if( (v9 & 2) == 0 )
{
v11 = (*(_QWORD *)a1 >> 9) & 0x7FFFFFFFF8i64;
if( (_MMPTE *)v3 != (_MMPTE *)((char *)PteBase + v11) )
{
v12 = (v9 >> 2) & 1 | 2;
if( (v9 & 0x100) == 0 )
v12 = (v9 >> 2) & 1;
MiClearNonPagedPtes(*(VOID **)a1, (__int64)(v3 - v11 - (_QWORD)PteBase) >> 3, 0x4000i64, (_KTBFLUSH_TYPE)v12);
}
}
v4 = -1073741670;
}
else
{
MiCountSystemPool(*(unsigned int *)(a1 + 40), *(_QWORD *)(a1 + 24), 1i64);
}
MiReturnExcessPoolCommit(a1);
return v4;
}Referenced by:
MmAllocatePoolMemory
MmAllocateSecurePoolMemory