MiLockTransitionLeafPage
_MMPFN *__stdcall MiLockTransitionLeafPage(ULONG_PTR PointerPte, _BYTE *PageIrql){
void *v3;
INT64 v4;
INT64 *v5;
unsigned __int64 v6;
int v7;
unsigned __int64 v8;
__int64 v9;
_MMPFN *PfnDb;
_MMPFN *v11;
signed __int8 v12;
void *v14;
unsigned __int64 v15;
UINT64 SpinCount;
v3 = *(void **)&PointerPte;
while( 1 )
{
while( 1 )
{
LODWORD(v4) = MI_READ_PTE_LOCK_FREE((INT64)v3);
v6 = v4;
if( (unsigned __int64)PageIrql > 1 && ((v4 & 1) != 0 || (v4 & 0x400) != 0) || (v4 & 0x800) == 0 )
return 0i64;
LOBYTE(v7) = MiInvalidPteConforms(v4, v5);
if( v7 )
{
v8 = v6;
if( *(&stru_140C4DB30 + 42) )
{
if( (v6 & 0x10) != 0 )
v8 = v6 & 0xFFFFFFFFFFFFFFEFui64;
else
v8 = v6 & ~*(&stru_140C4DB30 + 42);
}
v9 = (v8 >> 12) & 0xFFFFFFFFFi64;
if( (MmGetPfnDb()[(v8 >> 12) & 0xFFFFFFFFFi64].u4._bf_0 & 0x4000000000000i64) != 0 )
break;
}
}
PfnDb = MmGetPfnDb();
v11 = &PfnDb[v9];
if( (unsigned __int64)PageIrql <= 1 )
{
v12 = _interlockedbittestandset64((volatile signed __int32 *)&v11->u2, 0x3Fui64);
if( PageIrql == (_BYTE *)1 )
{
if( v12 )
return 0i64;
}
else
{
LODWORD(SpinCount) = 0;
if( v12 )
{
do
{
do
KeYieldProcessorEx(&SpinCount);
while( v11->u2._bf_0 < 0 );
}
while( _interlockedbittestandset64((volatile signed __int32 *)&v11->u2, 0x3Fui64) );
}
}
}
else
{
*PageIrql = MiLockPageInline(&PfnDb[v9]);
}
LODWORD(v14) = MI_READ_PTE_LOCK_FREE((INT64)v3);
if( v14 == (void *)v6 )
break;
if( (unsigned __int64)PageIrql <= 1 )
{
_InterlockedAnd64(&v11->u2.Lock, 0x7FFFFFFFFFFFFFFFui64);
}
else
{
v15 = (unsigned __int8)*PageIrql;
_InterlockedAnd64(&v11->u2.Lock, 0x7FFFFFFFFFFFFFFFui64);
__writecr8(v15);
}
}
if( (unsigned __int64)PageIrql <= 1
&& (void *)(v11->PteLong | 0x8000000000000000ui64) != v3
&& (v11->u4._bf_0 & 0x1000000000i64) == 0 )
{
KeBugCheckEx(0x1Au, (PVOID)0x411, v3, (PVOID)v6, v11->ListEntry.Blink);
}
return v11;
}Referenced by:
MiAccessCheck
MiActOnPte
MiCheckCommitReleaseFromVad
MiCheckPteForWriteCluster
MiDecommitPages
MiDeleteSystemPagableVm
MiGetPageProtection
MiGetWorkingSetInfoList
MiHandleForkTransitionPte
MiMakeVaRangePhysicallyContiguous
MiOutSwapWorkingSetPte
MiQueryVaPhysicalContiguity
MiReplacePageTablePage
MiReservePageFileSpaceForPage
MiSetProtectionOnTransitionPte
MiSetSystemCodeProtection
MiSharePages
MiTranslatePageForCopy
MiTryDeleteTransitionPte
MiUpdatePrefetchPriority
MiUserFault
MiWalkResetCommitPte
MmProtectPool