MiChangePageAttributeBatch

void __fastcall MiChangePageAttributeBatch(INT64 a1, _BYTE *a2, INT64 a3){
  unsigned int v4; 
  INT64 v5; 
  unsigned __int8 v6; 
  unsigned int v7; 
  INT64 v8; 
  int v9; 
  int v10; 
  int v11; 
  unsigned int v12; 
  char v13; 
  int v14; 
  INT64 *v15; 
  INT64 v16; 
  int v17; 
  if( a1 )
  {
    v4 = (unsigned int)a2;
    v5 = a1;
    v6 = 17;
    do
    {
      v7 = 0;
      v8 = v5;
      v17 = 0;
      v9 = 1;
      do
      {
        v10 = v9;
        if( v7 >= 0x1000 )
          break;
        if( v7 )
        {
          if( _interlockedbittestandset64((volatile signed __int32 *)(v8 + 24), 0x3Fui64) )
            break;
        }
        else
        {
          v6 = MiLockPageInline(v8);
        }
        v9 = 0;
        if( (*(_BYTE *)(v8 + 34) & 0xC0) == 0xC0 )
          v9 = v10;
        MiAbortCombineScan(v8);
        v8 = *(_QWORD *)(v8 + 16);
        ++v7;
      }
      while( v8 );
      if( v9 || (MiFlushEntireTbDueToAttributeChange(a1, a2), v7 < dword_140C4DC4C) || v4 == 1 )
      {
        v11 = 0;
      }
      else
      {
        ++dword_140C4DC44;
        KeInvalidateAllCaches();
        v11 = 1;
        v17 = 1;
      }
      v14 = 0;
      v16 = v5;
      LOBYTE(a2) = (_BYTE)v4 << 6;
      do
      {
        v12 = *(unsigned __int8 *)(v16 + 34);
        v13 = (unsigned __int8)a2 | v12 & 0x3F;
        a1 = v12 >> 6;
        *(_BYTE *)(v16 + 34) = v13;
        if( !v11 && !v9 && v4 != 1 && (_DWORD)a1 != v4 && (_DWORD)a1 == 1 )
        {
          ++dword_140C4DC48;
          MiFlushCacheForAttributeChange((v16 - (__int64)MmGetPfnDb()) / 48, 1i64, v4);
        }
        *(_QWORD *)(v16 + 24) &= 0xF0FFFFFFFFFFFFFFui64;
        ++v14;
        _InterlockedAnd64((volatile signed __int64 *)(v16 + 24), 0x7FFFFFFFFFFFFFFFui64);
        if( v14 == v7 )
        {
          __writecr8(v6);
          v15 = (INT64 *)(v16 + 16);
          v16 = 0i64;
          v5 = *v15;
        }
        else
        {
          v15 = (INT64 *)(v16 + 16);
          v16 = *(_QWORD *)(v16 + 16);
        }
        if( a3 != -1 )
          *v15 = a3;
        LOBYTE(a2) = (_BYTE)v4 << 6;
        v11 = v17;
      }
      while( v16 );
    }
    while( v5 );
  }
}

Referenced by:

MiChangeAwePageAttributes
MiConvertContiguousPages
MiGetPageChain
MiInitializeMdlOneNodeBatchPages
MiPerformFinalZeroing
MiSwitchToTransition