MiLockOwnedProtoPage

INT64 __fastcall MiLockOwnedProtoPage(INT64 a1, UINT8 a2){
  MMPTE *v2; 
  char v3; 
  unsigned __int64 i; 
  INT64 result; 
  int v7; 
  v2 = (MMPTE *)(*(_QWORD *)(a1 + 8) | 0x8000000000000000ui64);
  v3 = *(_BYTE *)(a1 + 34);
  for( i = a2; (v3 & 0x20) != 0; v3 = *(_BYTE *)(a1 + 34) )
  {
    _InterlockedAnd64((volatile signed __int64 *)(a1 + 24), 0x7FFFFFFFFFFFFFFFui64);
    if( (_BYTE)i != 17 )
      __writecr8(i);
    v7 = 0;
    while( (*(_BYTE *)(a1 + 34) & 0x20) != 0 )
    {
      ++v7;
      _mm_pause();
    }
    MiLockPageInline(a1);
  }
  *(_BYTE *)(a1 + 34) = v3 | 0x20;
  result = *(_QWORD *)(a1 + 24) >> 62;
  if( (*(_QWORD *)(a1 + 24) & 0x4000000000000000i64) == 0 && (*(_BYTE *)v2 & 0x20) == 0 )
    MiWriteValidPteVolatile(v2, 1ui64);
  _InterlockedAnd64((volatile signed __int64 *)(a1 + 24), 0x7FFFFFFFFFFFFFFFui64);
  return result;
}

Referenced by:

MiLockProtoPoolPage
MiMakePageAvoidRead
MiRelockProtoPoolPage
MmCheckCachedPageStates