MiEmptyDecayClusterTimers
VOID __stdcall MiEmptyDecayClusterTimers(_MI_PARTITION *Partition){
unsigned __int64 UnbiasedInterruptTime;
char v3;
__int64 v4;
__int64 v5;
_MMPFN *PfnDb;
unsigned __int8 CurrentIrql;
unsigned __int64 v8;
unsigned __int64 v9;
_MMPFN *v10;
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;} v11;
__int64 v12;
_MMPFN *v13;
unsigned int v14;
UINT8 *v15;
_KLOCK_QUEUE_HANDLE LockQueue;
int v17;
memset(&LockQueue, 0, sizeof(LockQueue));
UnbiasedInterruptTime = KiQueryUnbiasedInterruptTime(1u);
if( UnbiasedInterruptTime - Partition->PageLists.LastDecayHandUpdateTime >= 0x989680 )
{
v3 = Partition->PageLists.DecayHand + 1;
Partition->PageLists.LastDecayHandUpdateTime = UnbiasedInterruptTime;
v4 = v3 & 3;
v17 = v4;
v5 = (unsigned int)v4;
if( Partition->PageLists.DecayClusterTimerHeads[v4].u1.Long >> 33 != 0x7FFFFFFF )
{
PfnDb = MmGetPfnDb();
while( 1 )
{
CurrentIrql = KeGetCurrentIrql();
__writecr8(2ui64);
LockQueue.LockQueue.Next = 0i64;
LockQueue.LockQueue.Lock = &Partition->PageLists.StandbyPageListByPriority[5].Lock;
KxAcquireQueuedSpinLock(&LockQueue.LockQueue, &Partition->PageLists.StandbyPageListByPriority[5].Lock);
v8 = Partition->PageLists.DecayClusterTimerHeads[v5].u1.Long >> 33;
if( v8 == 0x7FFFFFFF )
break;
v9 = v8 + *(&stru_140C4DB30 + 374);
v10 = &PfnDb[v8 + *(&stru_140C4DB30 + 374)];
v11.Long = (unsigned __int64)v10->OriginalPte.u;
if( *(&stru_140C4DB30 + 42) && (v11.Long & 0x10) == 0 )
v11.Long &= ~*(&stru_140C4DB30 + 42);
v12 = (v11.Long >> 12) & 0xFFFFFFFFFi64;
if( v12 == v9 )
{
MiUnlinkPageFromList(v10, 1ui64);
*((_BYTE *)&v10->u3 + 3) &= ~8u;
MiRemoveDecayClusterTimer(v10);
KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockQueue);
}
else
{
v13 = &PfnDb[v12];
if( _interlockedbittestandset64((volatile signed __int32 *)&v13->u2, 0x3Fui64) )
{
KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockQueue);
}
else
{
v14 = *((_BYTE *)&v13->u3 + 3) & 7;
KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockQueue);
MiRelinkStandbyPage((ULONG_PTR)v13, v14, v15);
_InterlockedAnd64(&v13->u2.Lock, 0x7FFFFFFFFFFFFFFFui64);
}
}
__writecr8(CurrentIrql);
}
KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockQueue);
LODWORD(v4) = v17;
__writecr8(CurrentIrql);
}
Partition->PageLists.DecayHand = v4;
}
}Referenced by:
MiWorkingSetManager