MiLockPoolCommitPageTable
INT64 __fastcall MiLockPoolCommitPageTable(INT64 a1, INT64 *a2){
_MMPTE *PteBase;
INT64 v5;
__int64 v6;
int v7;
__int64 v8;
UINT64 v9;
UINT64 v10;
MMPTE *v12;
char v13;
UINT64 v14[2];
__int128 v15;
INT64 v16;
v16 = 0i64;
PteBase = MmGetPteBase();
v5 = *(_QWORD *)(a1 + 48);
v6 = (__int64)(((_QWORD)a2 << 25) - ((_QWORD)PteBase << 25)) >> 16;
v7 = MiFastLockLeafPageTable(v5, v6);
v8 = v7;
if( !v7
|| (*(_OWORD *)v14 = 0i64,
v15 = 0i64,
MiFillPteHierarchy(v6, v14),
v9 = v14[v8],
v10 = v14[(int)v8 - 1],
v16 = v10,
!v9) )
{
v12 = MiLockLowestValidPageTable(v5, a2, (INT64 **)&v16);
v10 = v16;
v9 = (UINT64)v12;
if( (INT64 *)v16 == a2 )
{
LODWORD(v8) = 1;
LABEL_5:
if( (*(_BYTE *)(a1 + 78) & 4) != 0 )
KeBugCheckEx(0x1Au, 0x5301ui64, v6, 0i64, 0i64);
goto LABEL_6;
}
if( (_MMPTE *)v16 == (_MMPTE *)((char *)PteBase + (((unsigned __int64)a2 >> 9) & 0x7FFFFFFFF8i64)) )
{
LODWORD(v8) = 2;
goto LABEL_10;
}
LODWORD(v8) = 0;
}
if( (_DWORD)v8 )
{
if( (_DWORD)v8 == 1 )
goto LABEL_5;
if( (_DWORD)v8 != 2 )
{
LODWORD(v8) = 0;
goto LABEL_12;
}
LABEL_10:
v13 = MI_READ_PTE_LOCK_FREE(v10);
if( (v13 & 1) != 0 )
{
if( v13 < 0 )
KeBugCheckEx(0x1Au, 0x5302ui64, v6, 0i64, 0i64);
if( (*(_BYTE *)(a1 + 78) & 4) != 0 )
KeBugCheckEx(0x1Au, 0x5303ui64, v6, 0i64, 0i64);
}
LODWORD(v8) = (*(_BYTE *)(a1 + 78) & 4) != 0 ? v8 : 0;
LABEL_12:
if( (_DWORD)v8 )
goto LABEL_6;
}
if( v9 )
{
MiUnlockPageTableInternal(v5, v9);
v9 = 0i64;
}
LABEL_6:
*(_QWORD *)(a1 + 64) = v9;
return(unsigned int)v8;
}Referenced by:
MiCommitPoolMemory
MiFillPoolCommitPageTable