MiReplaceRotateWithDemandZero

INT64 __fastcall MiReplaceRotateWithDemandZero(UINT64 a1, UINT64 a2, INT64 a3){
  char *v5; 
  unsigned int v6; 
  __int64 v7; 
  __int64 v8; 
  _MMPTE *PteBase; 
  unsigned __int64 v10; 
  unsigned __int64 *v11; 
  INT64 v12; 
  CHAR v13; 
  __int64 v14; 
  unsigned int v15; 
  __int64 v16; 
  __int64 v17; 
  UINT64 v18; 
  INT64 v19; 
  INT64 v20; 
  int v21; 
  __int64 *v22; 
  unsigned __int64 v23; 
  char *v24; 
  INT64 a5; 
  _MI_PFN_CACHE_ATTRIBUTE CacheAttribute[2]; 
  UINT64 IoPageFrame; 
  unsigned __int64 v29; 
  INT64 v30; 
  __int64 v31; 
  int result; 
  __int16 result_4; 
  __int64 v34; 
  __int64 v35; 
  __int64 v36; 
  __int64 v37[44]; 
  CacheAttribute[0] = a3;
  v5 = 0i64;
  IoPageFrame = 0i64;
  memset((INT64)&result, 0i64);
  v6 = 0;
  HIDWORD(a5) = 0;
  v7 = 0i64;
  v8 = *((_QWORD *)KeGetCurrentThread() + 23);
  PteBase = MmGetPteBase();
  v10 = (unsigned __int64)PteBase + ((a1 >> 9) & 0x7FFFFFFFF8i64);
  v29 = (unsigned __int64)PteBase + ((a2 >> 9) & 0x7FFFFFFFF8i64);
  v11 = (unsigned __int64 *)((char *)PteBase + ((v10 >> 9) & 0x7FFFFFFFF8i64));
  result_4 = 0;
  v12 = v8 + 1664;
  v35 = 0i64;
  LODWORD(v34) = 20;
  result = 1;
  v36 = 0i64;
  v30 = v12;
  LOBYTE(a5) = MiLockWorkingSetShared(v12);
  if( v10 <= v29 )
  {
    v14 = (_QWORD)MmGetPteBase() << 25;
    v31 = v14;
    while( 1 )
    {
      if( !v5 )
        goto LABEL_29;
      if( (v10 & 0xFFF) == 0 )
        break;
LABEL_5:
      if( !v6 )
      {
        MiIsProbeActive((_MMPTE *)v10, 1ui64, 3i64, v13);
        v6 = v15;
      }
      if( (unsigned int)MiUnmapFrameBuffer((_MMPTE *)v10, CacheAttribute[0], v6, &IoPageFrame) )
        v6 = 1;
      if( IoPageFrame != -1i64 )
      {
        if( (_DWORD)v7
          && (v16 = 2i64 * (unsigned int)(v7 - 1), v17 = v37[2 * (unsigned int)(v7 - 1) + 1], v17 == IoPageFrame) )
        {
          v18 = v17 + 1;
        }
        else
        {
          v18 = IoPageFrame + 1;
          v16 = 2i64 * (unsigned int)v7;
          v7 = (unsigned int)(v7 + 1);
          v37[v16] = IoPageFrame;
        }
        v37[v16 + 1] = v18;
      }
      MiInsertTbFlushEntry((INT64)&result, (__int64)((v10 << 25) - v14) >> 16, 1i64, 0i64);
      ++HIDWORD(a5);
      v10 += 8i64;
      if( (v10 & 0xFFF) != 0 && v10 <= v29 && (_DWORD)v7 != 22 )
      {
        if( (v10 & 0x78) != 0 )
          continue;
        if( !MiWorkingSetIsContended(v12) )
        {
          MiPageTableLockIsContended(v12, (UINT64)v5, v19, v20, a5, *(INT64 *)CacheAttribute, IoPageFrame);
          if( !v21 && !KeShouldYieldProcessor() )
            continue;
        }
      }
      MiFlushTbList((__int64)&result);
      if( (_DWORD)v7 )
      {
        v22 = v37;
        do
        {
          MiDereferenceIoPages(1i64, *v22, v22[1] - *v22);
          v22 += 2;
          --v7;
        }
        while( v7 );
        v12 = v30;
        v14 = v31;
      }
      v23 = *v11;
      MiPteInShadowRange((UINT64)v11);
      v24 = (char *)MmGetPfnDb() + 48 * ((v23 >> 12) & 0xFFFFFFFFFi64);
      CacheAttribute[1] = MiNonCached;
      while( _interlockedbittestandset64((volatile signed __int32 *)v24 + 6, 0x3Fui64) )
      {
        do
          KeYieldProcessorEx((UINT64 *)&CacheAttribute[1]);
        while( *((__int64 *)v24 + 3) < 0 );
      }
      *((_QWORD *)v24 + 3) ^= (*((_QWORD *)v24 + 3) ^ (*((_QWORD *)v24 + 3) - HIDWORD(a5))) & 0x3FFFFFFFFFFFFFFFi64;
      _InterlockedAnd64((volatile signed __int64 *)v24 + 3, 0x7FFFFFFFFFFFFFFFui64);
      MiUnlockPageTableInternal(v12, (UINT64)v5);
      MiUnlockWorkingSetShared(v12, a5);
      if( v10 > v29 )
        return v6;
      v7 = 0i64;
      v11 = (unsigned __int64 *)((char *)MmGetPteBase() + ((v10 >> 9) & 0x7FFFFFFFF8i64));
      HIDWORD(a5) = 0;
      v5 = 0i64;
      MiLockWorkingSetShared(v12);
    }
    MiUnlockPageTableInternal(v12, (UINT64)v5);
LABEL_29:
    v5 = (char *)MmGetPteBase() + ((v10 >> 9) & 0x7FFFFFFFF8i64);
    MiLockPageTableInternal(v12, (UINT64)v5, 0i64);
    goto LABEL_5;
  }
  return v6;
}

Referenced by:

MmRotatePhysicalView