MiDecayPfnFullyInitialized
VOID __stdcall MiDecayPfnFullyInitialized(_MMPFN *DecayPfn){
int v2;
signed __int64 v3;
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;} v4;
__int64 v5;
char v6;
_KLOCK_QUEUE_HANDLE LockHandle;
memset(&LockHandle, 0, sizeof(LockHandle));
v2 = 0;
v3 = DecayPfn - MmGetPfnDb();
KeAcquireInStackQueuedSpinLock(
(PKSPIN_LOCK)(*(_QWORD *)(*(&stru_140C4DB30 + 267) + 8 * (((unsigned __int64)DecayPfn->u4._bf_0 >> 39) & 0x3FF))
+ 2664i64),
&LockHandle);
v4.Long = (unsigned __int64)DecayPfn->OriginalPte.u;
if( *(&stru_140C4DB30 + 42) && (v4.Long & 0x10) == 0 )
v4.Long &= ~*(&stru_140C4DB30 + 42);
v5 = (v4.Long >> 12) & 0xFFFFFFFFFi64;
v6 = *((_BYTE *)&DecayPfn->u3 + 3);
if( (v6 & 8) != 0 )
{
if( v5 != v3 )
goto LABEL_6;
MiUnlinkPageFromList(DecayPfn, 1ui64);
MiRemoveDecayClusterTimer(DecayPfn);
v6 = *((_BYTE *)&DecayPfn->u3 + 3);
}
v2 = 1;
LABEL_6:
*((_BYTE *)&DecayPfn->u3 + 3) = v6 & 0xF7;
KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
__writecr8(LockHandle.OldIrql);
if( v2 == 1 )
RtlpInterlockedPushEntrySList((PSLIST_HEADER)&stru_140C4DB30 + 188, (PSLIST_ENTRY)DecayPfn);
}Referenced by:
MiCopyDataPageToImagePage
MiDeleteVaTail
MiFinishHardFault
MiWalkEntireImage