MiLockLeafPage
_MMPFN *__fastcall MiLockLeafPage(_MMPTE *ProtoPte, UINT64 PageLockHeld){
int v2;
char *v3;
_MMPFN *PfnDb;
unsigned __int64 v6;
INT64 v7;
unsigned __int64 v8;
volatile signed __int32 *v9;
UINT64 SpinCount;
v2 = PageLockHeld;
v3 = (char *)MmGetPfnDb() + 40;
PfnDb = MmGetPfnDb();
v6 = 0x7FFFFFFFFFFFFFFFi64;
while( 1 )
{
while( 1 )
{
v7 = *(_QWORD *)ProtoPte;
v8 = *(_QWORD *)ProtoPte;
if( (*(_QWORD *)ProtoPte & 1) == 0 )
break;
LABEL_8:
if( (*(_QWORD *)&v3[48 * ((v8 >> 12) & 0xFFFFFFFFFi64)] & 0x4000000000000i64) != 0 )
{
v9 = (volatile signed __int32 *)((char *)PfnDb + 48 * ((v8 >> 12) & 0xFFFFFFFFFi64));
if( v2 )
{
MiLockNestedPageAtDpcInline((INT64)PfnDb + 48 * ((v8 >> 12) & 0xFFFFFFFFFi64));
}
else
{
LODWORD(SpinCount) = 0;
if( !_interlockedbittestandset64(v9 + 6, 0x3Fui64) )
goto LABEL_11;
do
{
do
KeYieldProcessorEx(&SpinCount);
while( *((__int64 *)v9 + 3) < 0 );
}
while( _interlockedbittestandset64(v9 + 6, 0x3Fui64) );
}
v6 = 0x7FFFFFFFFFFFFFFFi64;
LABEL_11:
if( *(_QWORD *)ProtoPte == v7 )
return(_MMPFN *)v9;
_InterlockedAnd64((volatile signed __int64 *)v9 + 3, v6);
}
}
if( (*(_QWORD *)ProtoPte & 0xC00i64) != 2048 )
return 0i64;
if( MiInvalidPteConforms(*(_QWORD *)ProtoPte) )
{
v8 = v7;
if( qword_140C4DC80 && (v7 & 0x10) == 0 )
v8 = v7 & ~qword_140C4DC80;
goto LABEL_8;
}
}
}Referenced by:
MiActOnPte
MiConvertPrivateToProto
MiDecrementLargeSubsections
MiDeletePerSessionProtos
MiEliminateStaleExtents
MiEnableLargeSubsection
MiGetWorkingSetInfoList
MiIsSubsectionClean
MiMakeImageReadOnly
MiPurgeFileOnlyPfn
MiPurgeImageSection
MiPurgeSubsection
MiReplacePageOfProtoPool
MiReservePageFileSpaceForPage
MiResolveProtoCombine
MiSectionCreated
MiTranslatePageForCopy
MiZeroCfgSystemWideBitmapWorker
MmCopyToCachedPage