MiCheckProtoPtePageState

_MMPFN *__stdcall MiCheckProtoPtePageState(VOID *ProtoPte, UINT8 *PageIrql){
  UINT8 *v3; 
  unsigned __int64 *v4; 
  union {$8D9ED47C9F2F2CD645B633E301950288 __s0;unsigned __int64 EntireField;} *p_u4; 
  unsigned __int64 v6; 
  unsigned __int64 v7; 
  _MMPFN *PfnDb; 
  __int64 v9; 
  _MMPFN *v10; 
  unsigned __int8 CurrentIrql; 
  unsigned __int64 v12; 
  _MMPTE *v13; 
  char v14; 
  _MMPFN *result; 
  int v16; 
  __int64 v17[9]; 
  UINT64 SpinCount; 
  UINT64 v19; 

  v3 = PageIrql;
  v4 = (unsigned __int64 *)((char *)&MmGetPteBase()->u.Long + (((unsigned __int64)ProtoPte >> 9) & 0x7FFFFFFFF8i64));
  while( 2 )
  {
    while( 2 )
    {
      p_u4 = &MmGetPfnDb()->u4;
      do
      {
        while( 1 )
        {
          v6 = *v4;
          v17[0] = v6;
          if( (v6 & 1) != 0 )
            break;
          if( (v6 & 0x400) != 0 || (v6 & 0x800) == 0 )
            goto LABEL_20;
          LOBYTE(v16) = MiInvalidPteConforms(v6, (INT64 *)PageIrql);
          if( v16 )
          {
            if( *(&stru_140C4DB30 + 42) && (v6 & 0x10) == 0 )
              v6 &= ~*(&stru_140C4DB30 + 42);
            goto LABEL_6;
          }
        }
        if( (v6 & 0x200) != 0 )
          goto LABEL_20;
        MiPteInShadowRange((UINT64)v17);
        v7 = 2i64;
        PfnDb = MmGetPfnDb();
LABEL_6:
        v9 = (v6 >> 12) & 0xFFFFFFFFFi64;
        PageIrql = (UINT8 *)(6 * v9);
      }
      while( (p_u4[6 * v9]._bf_0 & 0x4000000000000i64) == 0 );
      v10 = &PfnDb[v9];
      CurrentIrql = KeGetCurrentIrql();
      __writecr8(v7);
      LODWORD(v19) = 0;
      while( _interlockedbittestandset64((volatile signed __int32 *)&v10->u2, 0x3Fui64) )
      {
        do
          KeYieldProcessorEx(&v19);
        while( v10->u2._bf_0 < 0 );
      }
      *v3 = CurrentIrql;
      if( *v4 != v17[0] )
      {
        _InterlockedAnd64(&v10->u2.Lock, 0x7FFFFFFFFFFFFFFFui64);
        __writecr8(CurrentIrql);
        continue;
      }
      break;
    }
    if( (*v4 & 1) == 0 )
    {
      if( (*(_BYTE *)(&v10->u3 + 1) & 7u) >= 6 )
      {
        _InterlockedAnd64(&v10->u2.Lock, 0x7FFFFFFFFFFFFFFFui64);
        __writecr8(CurrentIrql);
        MmAccessFault(2ui64, ProtoPte, 0, 0i64);
        continue;
      }
LABEL_29:
      _InterlockedAnd64(&v10->u2.Lock, 0x7FFFFFFFFFFFFFFFui64);
      __writecr8(CurrentIrql);
LABEL_20:
      result = 0i64;
      *v3 = 17;
      return result;
    }
    break;
  }
  if( (v10->u2._bf_0 & 0x3FFFFFFFFFFFFFFFi64) == 1 )
    goto LABEL_29;
  if( !MiAreChargesNeededToLockPage(v10) || MiChargeForLockedPage(v10, 1ui64) )
    ++v10->u3.ReferenceCount;
  v12 = *v3;
  v13 = (_MMPTE *)(v10->PteLong | 0x8000000000000000ui64);
  v14 = *((_BYTE *)&v10->u3 + 2);
  for( LODWORD(SpinCount) = 0; (v14 & 0x20) != 0; v14 = *((_BYTE *)&v10->u3 + 2) )
  {
    _InterlockedAnd64(&v10->u2.Lock, 0x7FFFFFFFFFFFFFFFui64);
    if( (_BYTE)v12 != 17 )
      __writecr8(v12);
    LODWORD(SpinCount) = 0;
    while( (*(_BYTE *)(&v10->u3 + 1) & 0x20) != 0 )
      KeYieldProcessorEx(&SpinCount);
    MiLockPageInline(v10);
  }
  *((_BYTE *)&v10->u3 + 2) = v14 | 0x20;
  if( (v10->u2._bf_0 & 0x4000000000000000i64) == 0 && (v13->u.Long & 0x20) == 0 )
    MiWriteValidPteVolatile(v13, 1ui64);
  _InterlockedAnd64(&v10->u2.Lock, 0x7FFFFFFFFFFFFFFFui64);
  return v10;
}

Referenced by:

MiAnyProtosAreMapped
MiFlushSectionInternal
MiIsSubsectionClean
MiPurgeFileOnlyPfn
MiPurgeSubsection
MiWalkEntireImage
MmPurgeSection