MiCheckProtoPtePageState

_MMPFN *__stdcall MiCheckProtoPtePageState(_MMPTE *ProtoPte, UINT8 *PageIrql){
  unsigned __int64 *v4; 
  char *v5; 
  unsigned __int64 v6; 
  unsigned __int64 v7; 
  _MMPFN *PfnDb; 
  __int64 v9; 
  INT64 v10; 
  UINT8 CurrentIrql; 
  unsigned __int64 v12; 
  MMPTE *v13; 
  char v14; 
  _MMPFN *result; 
  __int64 v16[9]; 
  UINT64 SpinCount; 
  UINT64 v18; 
  v4 = (unsigned __int64 *)((char *)MmGetPteBase() + (((unsigned __int64)ProtoPte >> 9) & 0x7FFFFFFFF8i64));
  while( 2 )
  {
    while( 2 )
    {
      v5 = (char *)MmGetPfnDb() + 40;
      do
      {
        while( 1 )
        {
          v6 = *v4;
          v16[0] = v6;
          if( (v6 & 1) != 0 )
            break;
          if( (v6 & 0x400) != 0 || (v6 & 0x800) == 0 )
            goto LABEL_20;
          if( MiInvalidPteConforms(v6) )
          {
            if( qword_140C4DC80 && (v6 & 0x10) == 0 )
              v6 &= ~qword_140C4DC80;
            goto LABEL_6;
          }
        }
        if( (v6 & 0x200) != 0 )
          goto LABEL_20;
        MiPteInShadowRange((UINT64)v16);
        v7 = 2i64;
        PfnDb = MmGetPfnDb();
LABEL_6:
        v9 = (v6 >> 12) & 0xFFFFFFFFFi64;
      }
      while( (*(_QWORD *)&v5[48 * v9] & 0x4000000000000i64) == 0 );
      v10 = (INT64)PfnDb + 48 * v9;
      CurrentIrql = KeGetCurrentIrql();
      __writecr8(v7);
      LODWORD(v18) = 0;
      while( _interlockedbittestandset64((volatile signed __int32 *)(v10 + 24), 0x3Fui64) )
      {
        do
          KeYieldProcessorEx(&v18);
        while( *(__int64 *)(v10 + 24) < 0 );
      }
      *PageIrql = CurrentIrql;
      if( *v4 != v16[0] )
      {
        _InterlockedAnd64((volatile signed __int64 *)(v10 + 24), 0x7FFFFFFFFFFFFFFFui64);
        __writecr8(CurrentIrql);
        continue;
      }
      break;
    }
    if( (*v4 & 1) == 0 )
    {
      if( (*(_BYTE *)(v10 + 34) & 7u) >= 6 )
      {
        _InterlockedAnd64((volatile signed __int64 *)(v10 + 24), 0x7FFFFFFFFFFFFFFFui64);
        __writecr8(CurrentIrql);
        MmAccessFault(2ui64, ProtoPte, 0, 0i64);
        continue;
      }
LABEL_29:
      _InterlockedAnd64((volatile signed __int64 *)(v10 + 24), 0x7FFFFFFFFFFFFFFFui64);
      __writecr8(CurrentIrql);
LABEL_20:
      result = 0i64;
      *PageIrql = 17;
      return result;
    }
    break;
  }
  if( (*(_QWORD *)(v10 + 24) & 0x3FFFFFFFFFFFFFFFi64) == 1 )
    goto LABEL_29;
  if( !(unsigned int)MiAreChargesNeededToLockPage(v10) || (unsigned int)MiChargeForLockedPage(v10, 1) )
    ++*(_WORD *)(v10 + 32);
  v12 = *PageIrql;
  v13 = (MMPTE *)(*(_QWORD *)(v10 + 8) | 0x8000000000000000ui64);
  v14 = *(_BYTE *)(v10 + 34);
  for( LODWORD(SpinCount) = 0; (v14 & 0x20) != 0; v14 = *(_BYTE *)(v10 + 34) )
  {
    _InterlockedAnd64((volatile signed __int64 *)(v10 + 24), 0x7FFFFFFFFFFFFFFFui64);
    if( (_BYTE)v12 != 17 )
      __writecr8(v12);
    LODWORD(SpinCount) = 0;
    while( (*(_BYTE *)(v10 + 34) & 0x20) != 0 )
      KeYieldProcessorEx(&SpinCount);
    MiLockPageInline(v10);
  }
  *(_BYTE *)(v10 + 34) = v14 | 0x20;
  if( (*(_QWORD *)(v10 + 24) & 0x4000000000000000i64) == 0 && (*(_BYTE *)v13 & 0x20) == 0 )
    MiWriteValidPteVolatile(v13, 1ui64);
  _InterlockedAnd64((volatile signed __int64 *)(v10 + 24), 0x7FFFFFFFFFFFFFFFui64);
  return(_MMPFN *)v10;
}

Referenced by:

MiAnyProtosAreMapped
MiFlushSectionInternal
MiIsSubsectionClean
MiPurgeFileOnlyPfn
MiPurgeSubsection
MiWalkEntireImage
MmPurgeSection