MiLockOwnedProtoPage
VOID __stdcall MiLockOwnedProtoPage(_MMPFN *ProtoPagePfn, UINT8 PageIrql){
_MMPTE *v2;
char v3;
unsigned __int64 i;
int v6;
v2 = (_MMPTE *)(ProtoPagePfn->PteLong | 0x8000000000000000ui64);
v3 = *((_BYTE *)&ProtoPagePfn->u3 + 2);
for( i = PageIrql; (v3 & 0x20) != 0; v3 = *((_BYTE *)&ProtoPagePfn->u3 + 2) )
{
_InterlockedAnd64(&ProtoPagePfn->u2.Lock, 0x7FFFFFFFFFFFFFFFui64);
if( (_BYTE)i != 17 )
__writecr8(i);
v6 = 0;
while( (*(_BYTE *)(&ProtoPagePfn->u3 + 1) & 0x20) != 0 )
{
++v6;
_mm_pause();
}
MiLockPageInline(ProtoPagePfn);
}
*((_BYTE *)&ProtoPagePfn->u3 + 2) = v3 | 0x20;
if( (ProtoPagePfn->u2._bf_0 & 0x4000000000000000i64) == 0 && (v2->u.Long & 0x20) == 0 )
MiWriteValidPteVolatile(v2, 1ui64);
_InterlockedAnd64(&ProtoPagePfn->u2.Lock, 0x7FFFFFFFFFFFFFFFui64);
}Referenced by:
MiLockProtoPoolPage
MiMakePageAvoidRead
MiRelockProtoPoolPage
MmCheckCachedPageStates