MiChangePageAttributeContiguous

NTSTATUS __fastcall MiChangePageAttributeContiguous(INT64 a1, INT64 a2, INT64 a3){
  NTSTATUS v3; 
  _MI_PFN_CACHE_ATTRIBUTE v4; 
  _MMPFN *v5; 
  _MMPFN *v6; 
  unsigned int v7; 
  _MMPFN *v8; 
  int v9; 
  int v10; 
  unsigned int v11; 
  unsigned int v12; 
  char v13; 
  unsigned int v14; 
  _MMPFN *v16; 
  _MMPFN *v17; 
  UINT8 v18; 
  int v19; 
  int v20; 

  v3 = 1;
  v20 = 1;
  v4 = (int)a3;
  v5 = &MmGetPfnDb()[a1];
  v18 = 17;
  v6 = &v5[a2];
  v17 = v6;
  while( v5 < v6 )
  {
    v19 = 0;
    v7 = 0;
    v16 = v5;
    v8 = v5;
    v9 = 1;
    if( v5 < v6 )
    {
      do
      {
        v10 = v9;
        if( v7 >= 0x1000 )
          break;
        if( v7 )
        {
          if( _interlockedbittestandset64((volatile signed __int32 *)&v5->u2, 0x3Fui64) )
            break;
        }
        else
        {
          v18 = MiLockPageInline(v5);
        }
        v9 = 0;
        if( (*(_BYTE *)(&v5->u3 + 1) & 0xC0) == 0xC0 )
          v9 = v10;
        MiAbortCombineScan(v5);
        if( v3 && MiPfnZeroingNeeded(v5, v4) )
          v3 = 0;
        ++v7;
        ++v5;
      }
      while( v5 < v6 );
      v8 = v16;
      v20 = v3;
      if( !v9 )
      {
        MiFlushEntireTbDueToAttributeChange();
        if( v7 >= *(&stru_140C4DB30 + 71) && v4 != MiCached )
        {
          ++*(&stru_140C4DB30 + 69);
          KeInvalidateAllCaches();
          v19 = 1;
        }
      }
    }
    v5 = v8;
    v11 = 0;
    if( v7 )
    {
      do
      {
        v12 = *((unsigned __int8 *)&v5->u3 + 2);
        v13 = ((_BYTE)v4 << 6) | v12 & 0x3F;
        v14 = v12 >> 6;
        *((_BYTE *)&v5->u3 + 2) = v13;
        if( !v19 && !v9 && v4 != MiCached && v14 != v4 && v14 == 1 )
        {
          ++*(&stru_140C4DB30 + 70);
          MiFlushCacheForAttributeChange(v5 - MmGetPfnDb(), 1ui64, v4);
        }
        MiSetPfnTbFlushStamp(v5, 0i64, 1ui64);
        if( v11 < v7 - 1 )
          _InterlockedAnd64(&v5->u2.Lock, 0x7FFFFFFFFFFFFFFFui64);
        ++v5;
        ++v11;
      }
      while( v11 < v7 );
      v6 = v17;
      v3 = v20;
    }
    _InterlockedAnd64(&v5[-1].u2.Lock, 0x7FFFFFFFFFFFFFFFui64);
    __writecr8(v18);
  }
  return v3;
}

Referenced by:

MiChangePageAttributeLargeFreeZeroPage
MiUnlinkNodeLargePages
MiZeroAndConvertPage