MiIsPageTableLocked
unsigned __int64 __fastcall MiIsPageTableLocked(INT64 a1, UINT64 a2){
char v2;
char v4;
int v5;
INT64 v6;
__int64 v7;
unsigned __int64 v8;
_MMPTE *NextPteToAge;
char *v11;
bool v12;
char *PageTableLockBuffer;
int v14;
v2 = *(_BYTE *)(a1 + 184);
v14 = 0;
v4 = v2 & 7;
if( (_MMPTE *)a2 == MmGetPxeSelfRef() )
{
if( v4 )
{
if( v4 == 7 )
{
v11 = (char *)&stru_140C4DB30 + 1800;
}
else
{
v11 = (char *)&stru_140C4DB30 + 1792;
if( v4 != 5 )
v11 = (char *)&stru_140C4DB30 + 1816;
}
}
else
{
v11 = (char *)(a1 + 176);
}
v12 = *(_QWORD *)v11 == 0i64;
}
else
{
if( v4
|| a2 < (unsigned __int64)MmGetPml4eBase()
|| a2 > (unsigned __int64)MmGetPml4eLimit()
|| (NextPteToAge = KeGetCurrentThread()->ApcState.Process->Vm.Instance.VmWorkingSetList[15].NextPteToAge) == 0i64 )
{
LOBYTE(v5) = MiShouldLockPteDirectly(a1, a2);
if( v5 )
{
LODWORD(v8) = MI_READ_PTE_LOCK_FREE(v6);
return(v8 >> 60) & 1;
}
PageTableLockBuffer = MiGetPageTableLockBuffer(v7, v6, &v14);
return((*(_DWORD *)PageTableLockBuffer >> v14) & 1) != 0;
}
v12 = *((_DWORD *)&NextPteToAge->u.Long + ((a2 >> 3) & 0x1FF)) == 0;
}
return !v12;
}Referenced by:
MiAgePte
MiResetAccessBitPte
MiTrimPte
MiWalkVaCheckCommon