MiPageTableLockIsContended
__int64 __fastcall MiPageTableLockIsContended(__int64 a1, UINT64 a2){
char v3;
_MMPTE *Pml4eBase;
_MMPTE *Pml4eLimit;
unsigned __int64 v6;
_KLOCK_QUEUE_HANDLE *SelfmapLockHandle;
struct _KPRCB *CurrentPrcb;
bool v10;
_MMPTE *NextPteToAge;
char *PageTableLockBuffer;
int v13;
v3 = *(_BYTE *)(a1 + 184) & 7;
v13 = 0;
if( (_MMPTE *)a2 == MmGetPxeSelfRef() )
{
if( v3 )
{
if( v3 == 7 )
{
SelfmapLockHandle = &KeGetCurrentPrcb()->SelfmapLockHandle[1];
}
else
{
CurrentPrcb = KeGetCurrentPrcb();
v10 = v3 == 5;
SelfmapLockHandle = CurrentPrcb->SelfmapLockHandle;
if( !v10 )
SelfmapLockHandle = &CurrentPrcb->SelfmapLockHandle[3];
}
}
else
{
SelfmapLockHandle = &KeGetCurrentPrcb()->SelfmapLockHandle[2];
}
return SelfmapLockHandle->LockQueue.Next != 0;
}
Pml4eBase = MmGetPml4eBase();
Pml4eLimit = MmGetPml4eLimit();
if( !v3 )
{
if( a2 >= (unsigned __int64)Pml4eBase && a2 <= (unsigned __int64)Pml4eLimit )
{
NextPteToAge = KeGetCurrentThread()->ApcState.Process->Vm.Instance.VmWorkingSetList[15].NextPteToAge;
if( NextPteToAge )
return(*((_DWORD *)&NextPteToAge->u.Long + ((a2 >> 3) & 0x1FF)) >> 30) & 1;
}
LABEL_4:
v6 = *(_QWORD *)a2;
MiPteInShadowRange(a2);
return(v6 >> 60) & 2;
}
if( a2 < (unsigned __int64)Pml4eBase || a2 > (unsigned __int64)Pml4eLimit )
goto LABEL_4;
PageTableLockBuffer = MiGetPageTableLockBuffer(a1, a2, &v13);
return((*(_DWORD *)PageTableLockBuffer >> v13) & 2) != 0;
}Referenced by:
MiAddPagesToEnclave
MiCommitEnclavePages
MiDecommitHardwareEnclavePages
MiDeleteSystemPagableVm
MiDispatchFault
MiFreePhysicalPages
MiInsertViewOfPhysicalSection
MiMapLockedPagesInUserSpaceHelper
MiProbeAndLockPages
MiProbePacketContended
MiProtectEnclavePages
MiRemoveMappedPtes
MiReplaceRotateWithDemandZero
MiScrubLargeMappedPage
MiSharePages
MiWriteAwePtes
NtLockVirtualMemory
NtUnlockVirtualMemory