MxSwapPages

__int64 __fastcall MxSwapPages(__int64 a1, __int64 a2){
  UINT64 v3; 
  __int64 v4; 
  __int64 result; 
  unsigned __int64 v6; 
  INT64 v7; 
  _MMPFN *PfnDb; 
  INT64 v9; 
  INT64 v10; 
  unsigned __int64 v11; 
  UINT64 v12; 
  UINT64 ValidPte; 
  __int64 v14; 
  __int64 v15; 
  unsigned __int64 v16; 
  unsigned __int8 v17; 
  char v18; 
  unsigned __int64 v19; 
  __int64 v20; 
  BOOL v22; 
  UINT64 v23; 
  v23 = MI_READ_PTE_LOCK_FREE(a2);
  v3 = v23;
  MiPteInShadowRange((UINT64)&v23);
  v4 = (v3 >> 12) & 0xFFFFFFFFFi64;
  result = (__int64)MxGetPhase0Mapping();
  v20 = result;
  v6 = result;
  if( result )
  {
    result = MiGetPage(
               (_MI_PARTITION *)&MiSystemPartition,
               *(_DWORD *)(a1 + 8) & (unsigned int)_InterlockedExchangeAdd(*(volatile signed __int32 **)a1, 1u) | *(_DWORD *)(a1 + 12),
               8ui64);
    v7 = result;
    if( result != -1 )
    {
      PfnDb = MmGetPfnDb();
      v9 = (INT64)PfnDb + 48 * result;
      v10 = (INT64)PfnDb + 48 * v4;
      v11 = (unsigned __int8)MiLockPageInline(v10);
      MiLockNestedPageAtDpcInline(v9);
      MiFinalizePageAttribute((_MMPFN *)v9, (_MI_PFN_CACHE_ATTRIBUTE)(*(unsigned __int8 *)(v10 + 34) >> 6), 1ui64);
      MiCopyPfnEntryEx(v9, v10);
      _InterlockedAnd64((volatile signed __int64 *)(v9 + 24), 0x7FFFFFFFFFFFFFFFui64);
      _InterlockedAnd64((volatile signed __int64 *)(v10 + 24), 0x7FFFFFFFFFFFFFFFui64);
      __writecr8(v11);
      v12 = (UINT64)MmGetPteBase() + ((v6 >> 9) & 0x7FFFFFFFF8i64);
      ValidPte = MiMakeValidPte(v12, v7, 2684354564i64);
      v22 = MiPteInShadowRange(v12);
      if( v22 && (*(_DWORD *)(*((_QWORD *)KeGetCurrentThread() + 23) + 2172i64) & 0x1000) != 0 && (ValidPte & 1) != 0 )
        ValidPte |= v14;
      *(_QWORD *)v12 = ValidPte;
      v15 = ((a2 << 25) - ((_QWORD)MmGetPteBase() << 25)) >> 16;
      memmove((UINT8 *)v6, (UINT8 *)v15, 0x1000ui64);
      if( ((v12 ^ v15) & 0xFFFFFFFFFFFFF000ui64) != 0 )
      {
        v16 = ZeroPte;
        if( v22 && (*(_DWORD *)(*((_QWORD *)KeGetCurrentThread() + 23) + 2172i64) & 0x1000) != 0 && (ZeroPte & 1) != 0 )
          v16 = ZeroPte | 0x8000000000000000ui64;
        *(_QWORD *)v12 = v16;
      }
      else
      {
        *(_QWORD *)(v6 + 8 * ((v12 >> 3) & 0x1FF)) = ZeroPte;
        v6 = v20;
      }
      v23 = v23 ^ (v23 ^ (v7 << 12)) & 0xFFFFFFFFF000i64 | 0x20;
      MiWriteValidPteNewPage((INT64 *)a2, v23, 0i64);
      KeFlushSingleTb(v15, 0i64, 1i64);
      KeFlushSingleTb(v6, 0i64, 1i64);
      v17 = MiLockPageInline(v10);
      v18 = *(_BYTE *)(v10 + 34) & 0xDF;
      *(_WORD *)(v10 + 32) = 0;
      v19 = v17;
      *(_QWORD *)(v10 + 24) &= 0xC000000000000000ui64;
      *(_BYTE *)(v10 + 34) = v18;
      *(_BYTE *)(v10 + 34) &= ~8u;
      MiInsertPageInFreeOrZeroedList(v4, 2ui64);
      _InterlockedAnd64((volatile signed __int64 *)(v10 + 24), 0x7FFFFFFFFFFFFFFFui64);
      result = (unsigned int)KiIrqlFlags;
      __writecr8(v19);
    }
  }
  return result;
}

Referenced by:

MxMovePageTables
MxRelocatePageTables