MiFillPoolCommitPageTable
CHAR __stdcall MiFillPoolCommitPageTable(INT64 a1){
void **CurrentThread;
char v3;
UINT64 v4;
_MMPTE *PteBase;
UINT64 v6;
unsigned __int64 v7;
int v8;
int v9;
__int16 v10;
unsigned __int64 v11;
int v12;
int v13;
unsigned __int64 Long;
void *retaddr;
CurrentThread = &retaddr;
if( (*(_BYTE *)(a1 + 78) & 4) == 0 )
{
v3 = 0;
v4 = *(_QWORD *)(a1 + 32);
if( v4 )
{
PteBase = MmGetPteBase();
do
{
v6 = *(_QWORD *)(a1 + 64);
if( v6 )
{
if( (_MMPTE *)((char *)PteBase + ((v4 >> 9) & 0x7FFFFFFFF8i64)) == (_MMPTE *)v6 )
goto LABEL_6;
MiUnlockPageTableInternal(*(_QWORD *)(a1 + 48), v6);
*(_QWORD *)(a1 + 64) = 0i64;
}
if( !MiLockPoolCommitPageTable(a1, (INT64 *)v4) )
KeBugCheckEx(0x1Au, (PVOID)0x5310, (PVOID)v4, 0i64, 0i64);
LABEL_6:
v7 = *(_QWORD *)v4;
LOBYTE(v8) = MiPteInShadowRange(v4);
v9 = v8;
if( !v7 )
goto LABEL_11;
if( *(&stru_140C4DB30 + 42) && (v7 & 0x10) == 0 )
v7 &= ~*(&stru_140C4DB30 + 42);
v7 >>= 28;
if( v7 == 0xFFFFFFFFFi64 )
CurrentThread = 0i64;
else
LABEL_11:
CurrentThread = (void **)&PteBase[v7 + 0x800000000i64];
*(_QWORD *)(a1 + 32) = CurrentThread;
v10 = *(_WORD *)(a1 + 78);
if( (v10 & 1) != 0 )
{
Long = ZeroPte.u.Long;
if( v9 )
{
CurrentThread = (void **)KeGetCurrentThread();
if( (*((_DWORD *)CurrentThread[23] + 543) & 0x1000) != 0 && (ZeroPte.u.Long & 1) != 0 )
{
LOBYTE(CurrentThread) = 0;
Long = ZeroPte.u.Long | 0x8000000000000000ui64;
}
}
*(_QWORD *)v4 = Long;
goto LABEL_17;
}
if( (v10 & 2) != 0 )
{
CurrentThread = (void **)MiSwizzleInvalidPte(4i64 * ((unsigned __int8)v10 & 0xF8));
v11 = (unsigned __int64)CurrentThread;
if( v12 )
{
CurrentThread = (void **)KeGetCurrentThread();
if( (*((_DWORD *)CurrentThread[23] + 543) & 0x1000) != 0 && (v11 & 1) != 0 )
{
LOBYTE(CurrentThread) = 0;
v11 |= 0x8000000000000000ui64;
}
}
*(_QWORD *)v4 = v11;
LABEL_16:
++*(_QWORD *)(a1 + 24);
goto LABEL_17;
}
LODWORD(CurrentThread) = MiAssignNonPagedPoolPte(a1, (__int64)((v4 << 25) - ((_QWORD)PteBase << 25)) >> 16);
if( (_DWORD)CurrentThread )
goto LABEL_16;
LABEL_17:
++v3;
if( *(_QWORD *)(a1 + 32) )
{
if( (v3 & 0xF) == 0 && *(_BYTE *)(a1 + 76) < 2u )
{
LOBYTE(v13) = MiWorkingSetIsContended(*(_QWORD *)(a1 + 48));
if( v13 || (LODWORD(CurrentThread) = KeShouldYieldProcessor(), (_DWORD)CurrentThread) )
{
MiUnlockPoolCommitWs(a1);
LOBYTE(CurrentThread) = MiLockPoolCommitWs(a1);
}
}
}
v4 = *(_QWORD *)(a1 + 32);
}
while( v4 );
}
}
return(char)CurrentThread;
}Referenced by:
MiCommitPoolMemory