MiSwapStackPageNoDpc
__int64 __fastcall MiSwapStackPageNoDpc(__int64 a1, __int64 a2, __int64 a3){
unsigned __int64 v3;
_MMPFN *PfnDb;
__int64 v8;
signed __int64 v9;
signed __int64 v10;
char v12;
char v13;
v3 = *(_QWORD *)(a2 + 8) | 0x8000000000000000ui64;
PfnDb = MmGetPfnDb();
v8 = (a3 - (__int64)PfnDb) / 48;
v9 = MI_READ_PTE_LOCK_FREE(v3);
v10 = v9 & 0xFFFFFFFFFFFFFFDFui64;
if( v9 != _InterlockedCompareExchange64((volatile signed __int64 *)v3, v9 & 0xFFFFFFFFFFFFFFDFui64, v9) )
return 0i64;
KeFlushSingleTb((__int64)((v3 << 25) - ((_QWORD)MmGetPteBase() << 25)) >> 16, 0i64, 2i64);
MiLockNestedPageAtDpcInline(a3);
MiCopyPfnEntryEx(a3, a2);
MiCopyPage(v8, (a2 - (__int64)PfnDb) / 48, (__int128 *)a1, 68);
if( v10 != _InterlockedCompareExchange64(
(volatile signed __int64 *)v3,
v10 ^ (v10 ^ (v8 << 12)) & 0xFFFFFFFFF000i64 | 0x20,
v10) )
{
*(_BYTE *)(a3 + 34) = *(_BYTE *)(a3 + 34) & 0xF8 | 5;
MiSetOriginalPtePfnFromFreeList((UINT64 *)(a3 + 16));
*(_QWORD *)(a3 + 40) &= 0x8FFFFFFFFFFFFFFFui64;
_InterlockedAnd64((volatile signed __int64 *)(a3 + 24), 0x7FFFFFFFFFFFFFFFui64);
return 0i64;
}
_InterlockedAnd64((volatile signed __int64 *)(a3 + 24), 0x7FFFFFFFFFFFFFFFui64);
v12 = *(_BYTE *)(a2 + 34);
*(_QWORD *)(a2 + 40) &= 0xFFFFFFFFFFFFFFFui64;
v13 = v12 & 0xF8 | 5;
*(_BYTE *)(a2 + 34) = v13;
*(_BYTE *)(a2 + 34) = v13 & 0xC7;
*(_BYTE *)(a2 + 35) &= ~0x20u;
*(_QWORD *)(a2 + 24) &= 0xC000000000000000ui64;
return 1i64;
}Referenced by:
MiJumpStackTarget
MiSwapStackPage