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