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