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