MiLockLeafPage
_MMPFN *__stdcall MiLockLeafPage(_MMPTE *ProtoPte, UINT64 PageLockHeld){
int v2;
union {$8D9ED47C9F2F2CD645B633E301950288 __s0;unsigned __int64 EntireField;} *p_u4;
_MMPFN *PfnDb;
unsigned __int64 v6;
union {unsigned __int64 Long;volatile unsigned __int64 VolatileLong;_MMPTE_HARDWARE Hard;_MMPTE_PROTOTYPE Proto;_MMPTE_SOFTWARE Soft;_MMPTE_TIMESTAMP TimeStamp;_MMPTE_TRANSITION Trans;_MMPTE_SUBSECTION Subsect;_MMPTE_LIST List;} v7;
union {unsigned __int64 Long;volatile unsigned __int64 VolatileLong;_MMPTE_HARDWARE Hard;_MMPTE_PROTOTYPE Proto;_MMPTE_SOFTWARE Soft;_MMPTE_TIMESTAMP TimeStamp;_MMPTE_TRANSITION Trans;_MMPTE_SUBSECTION Subsect;_MMPTE_LIST List;} v8;
int v9;
_MMPFN *v10;
UINT64 SpinCount;
v2 = PageLockHeld;
p_u4 = &MmGetPfnDb()->u4;
PfnDb = MmGetPfnDb();
v6 = 0x7FFFFFFFFFFFFFFFi64;
while( 1 )
{
while( 1 )
{
v7.Long = (unsigned __int64)ProtoPte->u;
v8.Long = (unsigned __int64)ProtoPte->u;
if( (ProtoPte->u.Long & 1) == 0 )
break;
LABEL_8:
PageLockHeld = 6 * ((v8.Long >> 12) & 0xFFFFFFFFFi64);
if( (p_u4[6 * ((v8.Long >> 12) & 0xFFFFFFFFFi64)]._bf_0 & 0x4000000000000i64) != 0 )
{
v10 = &PfnDb[(v8.Long >> 12) & 0xFFFFFFFFFi64];
if( v2 )
{
MiLockNestedPageAtDpcInline(&PfnDb[(v8.Long >> 12) & 0xFFFFFFFFFi64]);
}
else
{
LODWORD(SpinCount) = 0;
if( !_interlockedbittestandset64((volatile signed __int32 *)&v10->u2, 0x3Fui64) )
goto LABEL_11;
do
{
do
KeYieldProcessorEx(&SpinCount);
while( v10->u2._bf_0 < 0 );
}
while( _interlockedbittestandset64((volatile signed __int32 *)&v10->u2, 0x3Fui64) );
}
v6 = 0x7FFFFFFFFFFFFFFFi64;
LABEL_11:
if( ProtoPte->u.Long == v7.Long )
return v10;
_InterlockedAnd64(&v10->u2.Lock, v6);
}
}
if( (ProtoPte->u.Long & 0xC00) != 2048 )
return 0i64;
LOBYTE(v9) = MiInvalidPteConforms(ProtoPte->u.Long, (INT64 *)PageLockHeld);
if( v9 )
{
v8.Long = v7.Long;
if( *(&stru_140C4DB30 + 42) && (v7.Long & 0x10) == 0 )
v8.Long = v7.Long & ~*(&stru_140C4DB30 + 42);
goto LABEL_8;
}
}
}Referenced by:
MiActOnPte
MiConvertPrivateToProto
MiDecrementLargeSubsections
MiDeletePerSessionProtos
MiEliminateStaleExtents
MiEnableLargeSubsection
MiGetWorkingSetInfoList
MiIsSubsectionClean
MiMakeImageReadOnly
MiPurgeFileOnlyPfn
MiPurgeImageSection
MiPurgeSubsection
MiReplacePageOfProtoPool
MiReservePageFileSpaceForPage
MiResolveProtoCombine
MiSectionCreated
MiTranslatePageForCopy
MiZeroCfgSystemWideBitmapWorker
MmCopyToCachedPage