MiChangePageAttributeBatch

VOID __stdcall MiChangePageAttributeBatch(
        _MMPFN *PfnChain,
        _MI_PFN_CACHE_ATTRIBUTE NewCacheAttribute,
        _MMPTE OriginalPteValue){
  _MMPFN *v5; 
  UINT8 v6; 
  unsigned int v7; 
  _MMPFN *Long; 
  int v9; 
  int v10; 
  int v11; 
  unsigned int v12; 
  char v13; 
  unsigned int v14; 
  int v15; 
  _MMPFN **p_Long; 
  _MMPFN *v17; 
  char v18; 
  int v19; 

  if( PfnChain )
  {
    v5 = PfnChain;
    v6 = 17;
    do
    {
      v7 = 0;
      Long = v5;
      v19 = 0;
      v9 = 1;
      do
      {
        v10 = v9;
        if( v7 >= 0x1000 )
          break;
        if( v7 )
        {
          if( _interlockedbittestandset64((volatile signed __int32 *)&Long->u2, 0x3Fui64) )
            break;
        }
        else
        {
          v6 = MiLockPageInline(Long);
        }
        v9 = 0;
        if( (*(_BYTE *)(&Long->u3 + 1) & 0xC0) == 0xC0 )
          v9 = v10;
        MiAbortCombineScan(Long);
        Long = (_MMPFN *)Long->OriginalPte.u.Long;
        ++v7;
      }
      while( Long );
      if( v9 || (MiFlushEntireTbDueToAttributeChange(), v7 < *(&stru_140C4DB30 + 71)) || NewCacheAttribute == MiCached )
      {
        v11 = 0;
      }
      else
      {
        ++*(&stru_140C4DB30 + 69);
        KeInvalidateAllCaches();
        v11 = 1;
        v19 = 1;
      }
      v15 = 0;
      v17 = v5;
      v18 = (_BYTE)NewCacheAttribute << 6;
      do
      {
        v12 = *((unsigned __int8 *)&v17->u3 + 2);
        v13 = v18 | v12 & 0x3F;
        v14 = v12 >> 6;
        *((_BYTE *)&v17->u3 + 2) = v13;
        if( !v11 && !v9 && NewCacheAttribute != MiCached && v14 != NewCacheAttribute && v14 == 1 )
        {
          ++*(&stru_140C4DB30 + 70);
          MiFlushCacheForAttributeChange(v17 - MmGetPfnDb(), 1ui64, NewCacheAttribute);
        }
        v17->u2._bf_0 &= 0xF0FFFFFFFFFFFFFFui64;
        ++v15;
        _InterlockedAnd64(&v17->u2.Lock, 0x7FFFFFFFFFFFFFFFui64);
        if( v15 == v7 )
        {
          __writecr8(v6);
          p_Long = (_MMPFN **)&v17->OriginalPte.u.Long;
          v17 = 0i64;
          v5 = *p_Long;
        }
        else
        {
          p_Long = (_MMPFN **)&v17->OriginalPte.u.Long;
          v17 = (_MMPFN *)v17->OriginalPte.u.Long;
        }
        if( OriginalPteValue.u.Long != -1i64 )
          *p_Long = (_MMPFN *)OriginalPteValue.u.Long;
        v18 = (_BYTE)NewCacheAttribute << 6;
        v11 = v19;
      }
      while( v17 );
    }
    while( v5 );
  }
}

Referenced by:

MiChangeAwePageAttributes
MiConvertContiguousPages
MiGetPageChain
MiInitializeMdlOneNodeBatchPages
MiPerformFinalZeroing
MiSwitchToTransition