MxMovePageTables

VOID __stdcall MxMovePageTables(
        _MMPTE *PointerPxe,
        _MMPTE *EndPxe,
        UINT64 PagingLevel,
        _LOADER_PARAMETER_BLOCK *LoaderBlock,
        _MI_COLOR_BASE *ColorBase){
  unsigned __int64 v5; 
  int v6; 
  __int64 v8; 
  unsigned __int64 v9; 
  __int64 v10; 
  _MI_COLOR_BASE *v11; 
  UINT64 v12; 
  UINT64 v13; 
  __int64 v14; 
  _MMPFN *v15; 
  int v16; 
  UINT64 v17; 
  UINT64 v18; 
  union {$8D9ED47C9F2F2CD645B633E301950288 __s0;unsigned __int64 EntireField;} *p_u4; 
  unsigned __int64 v20; 
  _MMPTE *v21; 
  UINT64 v22; 
  __int64 v23[2]; 
  UINT64 v24; 
  _LOADER_PARAMETER_BLOCK *LoaderBlocka; 

  LoaderBlocka = LoaderBlock;
  v5 = (unsigned __int64)PointerPxe;
  v6 = PagingLevel;
  LODWORD(v8) = MI_READ_PTE_LOCK_FREE((INT64)MmGetPteBase() + (((unsigned __int64)PointerPxe >> 9) & 0x7FFFFFFFF8i64));
  v23[0] = v8;
  v9 = v8;
  MiPteInShadowRange((UINT64)v23);
  v10 = (v9 >> 12) & 0xFFFFFFFFFi64;
  if( v5 <= (unsigned __int64)EndPxe )
  {
    v11 = ColorBase;
    while( 1 )
    {
      if( (v5 & 0xFFF) == 0 )
      {
        LODWORD(v20) = MI_READ_PTE_LOCK_FREE((INT64)MmGetPteBase() + ((v5 >> 9) & 0x7FFFFFFFF8i64));
        v23[0] = v20;
        v10 = (v20 >> 12) & 0xFFFFFFFFFi64;
      }
      LODWORD(v12) = MI_READ_PTE_LOCK_FREE(v5);
      v24 = v12;
      v13 = v12;
      if( (v12 & 1) == 0 || (_MMPTE *)v5 == MmGetPxeSelfRef() )
        goto LABEL_11;
      if( v6 && (v12 & 0x80u) != 0i64 )
      {
        v16 = 512;
        LODWORD(v17) = MI_READ_PTE_LOCK_FREE(v5);
        v24 = v17;
        v18 = v17;
        MiPteInShadowRange((UINT64)&v24);
        p_u4 = &MmGetPfnDb()[(v18 >> 12) & 0xFFFFFFFFFi64].u4;
        do
        {
          p_u4->_bf_0 = v10 & 0xFFFFFFFFFi64 | p_u4->_bf_0 & 0xFFFFFFF000000000ui64;
          p_u4 += 6;
          --v16;
        }
        while( v16 );
        goto LABEL_11;
      }
      MiPteInShadowRange((UINT64)&v24);
      v14 = (v13 >> 12) & 0xFFFFFFFFFi64;
      if( v6 )
        break;
      if( MiIsRegularMemory(LoaderBlocka, v14) )
        goto LABEL_10;
LABEL_11:
      v5 += 8i64;
      if( v5 > (unsigned __int64)EndPxe )
        return;
    }
    MxSwapPages(v11, (_MMPTE *)v5);
    v21 = (_MMPTE *)((__int64)((v5 << 25) - ((_QWORD)MmGetPteBase() << 25)) >> 16);
    MxMovePageTables(v21, v21 + 511, (unsigned int)(v6 - 1), LoaderBlocka, v11);
    LODWORD(v22) = MI_READ_PTE_LOCK_FREE(v5);
    v24 = v22;
    v14 = (v22 >> 12) & 0xFFFFFFFFFi64;
LABEL_10:
    v15 = &MmGetPfnDb()[v14];
    v15->u4._bf_0 ^= (v15->u4._bf_0 ^ v10) & 0xFFFFFFFFFi64;
    goto LABEL_11;
  }
}

Referenced by:

MxMovePageTables
MxRelocatePageTables