MiPurgePartitionStandby
VOID __stdcall MiPurgePartitionStandby(_MI_PARTITION *Partition, UINT64 EndPurgeIndex){
unsigned int v2;
unsigned __int8 CurrentIrql;
UINT64 v5;
UINT64 v6;
_MMPFN *v7;
int v8;
INT64 v9;
UINT64 v10;
UINT64 v11;
UINT64 v12;
UINT64 SpinCount;
v2 = EndPurgeIndex;
while( 1 )
{
CurrentIrql = KeGetCurrentIrql();
__writecr8(2ui64);
LODWORD(v5) = MiRemoveLowestPriorityStandbyPage(Partition, v2, 0x2000ui64);
v6 = v5;
if( v5 == -1i64 )
break;
v7 = &MmGetPfnDb()[v5];
LODWORD(SpinCount) = 0;
while( _interlockedbittestandset64((volatile signed __int32 *)&v7->u2, 0x3Fui64) )
{
do
KeYieldProcessorEx(&SpinCount);
while( v7->u2._bf_0 < 0 );
}
v7->u2._bf_0 |= 0x4000000000000000ui64;
LOBYTE(v8) = MiIsFreeZeroPfnCold((INT64)v7);
MiInsertPageInFreeOrZeroedList(v6, v8 != 0 ? 1026 : 2, v9, v10, v11, v12);
_InterlockedAnd64(&v7->u2.Lock, 0x7FFFFFFFFFFFFFFFui64);
__writecr8(CurrentIrql);
}
__writecr8(CurrentIrql);
}Referenced by:
MiFinishResume
MiTrimAllSystemPagableMemory
MmPerformMemoryListCommand