MxMovePageTables

int __fastcall MxMovePageTables(unsigned __int64 a1, unsigned __int64 a2, int a3, __int64 a4, __int64 a5){
  unsigned __int64 v5; 
  UINT64 v8; 
  UINT64 PxeSelfRef; 
  UINT64 v10; 
  __int64 v11; 
  UINT64 v12; 
  UINT64 v13; 
  char *v14; 
  int v15; 
  UINT64 v16; 
  UINT64 *v17; 
  __int64 v18; 
  UINT64 v20[2]; 
  UINT64 v21; 
  _LOADER_PARAMETER_BLOCK *LoaderBlock; 
  LoaderBlock = (_LOADER_PARAMETER_BLOCK *)a4;
  v5 = a1;
  v20[0] = MI_READ_PTE_LOCK_FREE((INT64)MmGetPteBase() + ((a1 >> 9) & 0x7FFFFFFFF8i64));
  v8 = v20[0];
  LODWORD(PxeSelfRef) = MiPteInShadowRange((UINT64)v20);
  v10 = (v8 >> 12) & 0xFFFFFFFFFi64;
  if( v5 <= a2 )
  {
    v11 = a5;
    while( 1 )
    {
      if( (v5 & 0xFFF) == 0 )
      {
        v20[0] = MI_READ_PTE_LOCK_FREE((INT64)MmGetPteBase() + ((v5 >> 9) & 0x7FFFFFFFF8i64));
        v10 = (v20[0] >> 12) & 0xFFFFFFFFFi64;
      }
      PxeSelfRef = MI_READ_PTE_LOCK_FREE(v5);
      v21 = PxeSelfRef;
      v12 = PxeSelfRef;
      if( (PxeSelfRef & 1) == 0 )
        goto LABEL_11;
      PxeSelfRef = (UINT64)MmGetPxeSelfRef();
      if( v5 == PxeSelfRef )
        goto LABEL_11;
      if( a3 && (v12 & 0x80u) != 0i64 )
      {
        v15 = 512;
        v21 = MI_READ_PTE_LOCK_FREE(v5);
        v16 = v21;
        MiPteInShadowRange((UINT64)&v21);
        v17 = (UINT64 *)((char *)MmGetPfnDb() + 48 * ((v16 >> 12) & 0xFFFFFFFFFi64) + 40);
        do
        {
          PxeSelfRef = v10 & 0xFFFFFFFFFi64 | *v17 & 0xFFFFFFF000000000ui64;
          *v17 = PxeSelfRef;
          v17 += 6;
          --v15;
        }
        while( v15 );
        goto LABEL_11;
      }
      MiPteInShadowRange((UINT64)&v21);
      v13 = (v12 >> 12) & 0xFFFFFFFFFi64;
      if( a3 )
        break;
      LODWORD(PxeSelfRef) = MiIsRegularMemory(LoaderBlock, v13);
      if( (_DWORD)PxeSelfRef )
        goto LABEL_10;
LABEL_11:
      v5 += 8i64;
      if( v5 > a2 )
        return PxeSelfRef;
    }
    MxSwapPages(v11, v5);
    v18 = (__int64)((v5 << 25) - ((_QWORD)MmGetPteBase() << 25)) >> 16;
    MxMovePageTables(v18, v18 + 4088, a3 - 1, (__int64)LoaderBlock, v11);
    v21 = MI_READ_PTE_LOCK_FREE(v5);
    v13 = (v21 >> 12) & 0xFFFFFFFFFi64;
LABEL_10:
    v14 = (char *)MmGetPfnDb() + 48 * v13;
    PxeSelfRef = (*((_QWORD *)v14 + 5) ^ v10) & 0xFFFFFFFFFi64;
    *((_QWORD *)v14 + 5) ^= PxeSelfRef;
    goto LABEL_11;
  }
  return PxeSelfRef;
}

Referenced by:

MxMovePageTables
MxRelocatePageTables