MiSwapHardFaultPage
VOID __stdcall MiSwapHardFaultPage(_MMPTE *PointerPte, PVOID Pfn1, _MMPFN *NewPfn){
INT64 v6;
_MMPFN *PfnDb;
union {unsigned __int64 Long;volatile unsigned __int64 VolatileLong;_MMPTE_HARDWARE Hard;_MMPTE_PROTOTYPE Proto;_MMPTE_SOFTWARE Soft;_MMPTE_TIMESTAMP TimeStamp;_MMPTE_TRANSITION Trans;_MMPTE_SUBSECTION Subsect;_MMPTE_LIST List;} v8;
union {unsigned __int64 Long;volatile unsigned __int64 VolatileLong;_MMPTE_HARDWARE Hard;_MMPTE_PROTOTYPE Proto;_MMPTE_SOFTWARE Soft;_MMPTE_TIMESTAMP TimeStamp;_MMPTE_TRANSITION Trans;_MMPTE_SUBSECTION Subsect;_MMPTE_LIST List;} v9;
int v10;
__int64 v11;
UINT8 v12;
LODWORD(v6) = MI_READ_PTE_LOCK_FREE((INT64)PointerPte);
PfnDb = MmGetPfnDb();
LODWORD(v8.Long) = MiUpdateTransitionPteFrame(v6, NewPfn - PfnDb);
v9.Long = v8.Long;
LOBYTE(v10) = MiPteInShadowRange((UINT64)PointerPte);
if( v10 && (KeGetCurrentThread()->ApcState.Process->Flags3 & 0x1000) != 0 && (v9.Long & 1) != 0 )
v9.Long |= 0x8000000000000000ui64;
PointerPte->u.Long = v9.Long;
MiLockNestedPageAtDpcInline(NewPfn);
MiCopyPfnEntryEx((INT64)NewPfn, (INT64)Pfn1);
if( ((*((_QWORD *)Pfn1 + 5) >> 60) & 7) == 3 )
NewPfn->u4._bf_0 = NewPfn->u4._bf_0 & 0x8FFFFFFFFFFFFFFFui64 | 0x3000000000000000i64;
NewPfn->u2._bf_0 &= 0xC000000000000000ui64;
*((_QWORD *)Pfn1 + 3) |= 0x4000000000000000ui64;
v11 = *((_QWORD *)Pfn1 + 2);
if( (v11 & 4) != 0 )
{
v11 &= ~4ui64;
*((_QWORD *)Pfn1 + 2) = v11;
}
if( (v11 & 2) != 0 )
*((_QWORD *)Pfn1 + 2) = v11 & 0xFFFFFFFFFFFFFFFDui64;
if( MiRemoveLockedPageCharge((_MMPFN *)Pfn1) )
MiPfnReferenceCountIsZero((_MMPFN *)Pfn1, ((_BYTE *)Pfn1 - (_BYTE *)PfnDb) / 48, v12);
else
NewPfn->u3.ReferenceCount = 1;
_InterlockedAnd64((volatile signed __int64 *)Pfn1 + 3, 0x7FFFFFFFFFFFFFFFui64);
}Referenced by:
MiFinishHardFault
MiIdealClusterPage