MiSwapStackPageNoDpc
NTSTATUS __stdcall MiSwapStackPageNoDpc(_MMPTE_COPY_LIST *PteCopyList, _MMPFN *Pfn1, _MMPFN *NewPfn){
unsigned __int64 v3;
_MMPFN *PfnDb;
__int64 v8;
signed __int64 v9;
signed __int64 v10;
char v12;
char v13;
v3 = Pfn1->PteLong | 0x8000000000000000ui64;
PfnDb = MmGetPfnDb();
v8 = NewPfn - PfnDb;
LODWORD(v9) = MI_READ_PTE_LOCK_FREE(v3);
v10 = v9 & 0xFFFFFFFFFFFFFFDFui64;
if( v9 != _InterlockedCompareExchange64((volatile signed __int64 *)v3, v9 & 0xFFFFFFFFFFFFFFDFui64, v9) )
return 0;
KeFlushSingleTb((__int64)((v3 << 25) - ((_QWORD)MmGetPteBase() << 25)) >> 16, FlushKernel, 2i64);
MiLockNestedPageAtDpcInline(NewPfn);
MiCopyPfnEntryEx((INT64)NewPfn, (INT64)Pfn1);
MiCopyPage(v8, Pfn1 - PfnDb, PteCopyList, 0x44ui64);
if( v10 != _InterlockedCompareExchange64(
(volatile signed __int64 *)v3,
v10 ^ (v10 ^ (v8 << 12)) & 0xFFFFFFFFF000i64 | 0x20,
v10) )
{
*((_BYTE *)&NewPfn->u3 + 2) = *(_BYTE *)(&NewPfn->u3 + 1) & 0xF8 | 5;
MiSetOriginalPtePfnFromFreeList(&NewPfn->OriginalPte.u.Long);
NewPfn->u4._bf_0 &= 0x8FFFFFFFFFFFFFFFui64;
_InterlockedAnd64(&NewPfn->u2.Lock, 0x7FFFFFFFFFFFFFFFui64);
return 0;
}
_InterlockedAnd64(&NewPfn->u2.Lock, 0x7FFFFFFFFFFFFFFFui64);
v12 = *((_BYTE *)&Pfn1->u3 + 2);
Pfn1->u4._bf_0 &= 0xFFFFFFFFFFFFFFFui64;
v13 = v12 & 0xF8 | 5;
*((_BYTE *)&Pfn1->u3 + 2) = v13;
*((_BYTE *)&Pfn1->u3 + 2) = v13 & 0xC7;
*((_BYTE *)&Pfn1->u3 + 3) &= ~0x20u;
Pfn1->u2._bf_0 &= 0xC000000000000000ui64;
return 1;
}Referenced by:
MiJumpStackTarget
MiSwapStackPage