MiStoreUpdateMemoryConditions
VOID __stdcall MiStoreUpdateMemoryConditions(_MI_PARTITION *Partition){
volatile unsigned __int64 AvailablePages;
NTSTATUS v3;
int v4;
int v5;
unsigned int v6;
unsigned __int64 v7;
unsigned __int64 TotalPagesForPagingFile;
int v9;
int v10[8];
_KLOCK_QUEUE_HANDLE LockHandle;
memset(&LockHandle, 0, sizeof(LockHandle));
KeAcquireInStackQueuedSpinLock(&Partition->PageLists.AvailableEventsLock, &LockHandle);
AvailablePages = Partition->Vp.AvailablePages;
v3 = MiUseLowIoPriorityForModifiedPages(Partition);
v4 = v3 == 0;
if( AvailablePages < 0xA0 )
{
v9 = 0;
v6 = 18;
v5 = 1;
}
else
{
v5 = 0;
if( AvailablePages < 0x420 )
{
v9 = 1;
v6 = 18;
}
else
{
v6 = 8;
LODWORD(v7) = MiGetAvailablePagesBelowPriority(Partition, 6ui64);
if( v7 < 3i64 * *((_QWORD *)Partition->WorkingSetControl + 299) )
{
v9 = 2;
}
else
{
TotalPagesForPagingFile = Partition->Vp.TotalPagesForPagingFile;
if( TotalPagesForPagingFile >= v7 + 0x2000 )
v9 = (TotalPagesForPagingFile < v7 + 0x2000 + v7) + 2;
else
v9 = 4;
}
}
}
if( KeQueryEffectiveBasePriorityThread(&Partition->Store.EvictionThread->Tcb) != v6 )
KeSetActualBasePriorityThread(&Partition->Store.EvictionThread->Tcb, v6);
if( v5 )
KeSetEvent((PRKEVENT)Partition->Store.gap30, 0, 0);
if( (unsigned __int8)byte_140D23168 != v9 || !v9 || (unsigned __int8)byte_140D23169 != v4 )
{
byte_140D23168 = v9;
byte_140D23169 = v3 == 0;
_InterlockedOr(v10, 0);
SMKM_STORE_MGR::SmUpdateMemoryConditions((_SMKM_STORE_LIST *)SmGlobals, v9, v4);
}
KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
__writecr8(LockHandle.OldIrql);
if( !v9 )
SMKM_STORE_MGR::SmDrainSList(&stru_140D22F40, 0);
}Referenced by:
MiAdjustModifiedPageLoad
MiFlushAllHintedStorePages
MiFlushAllPagesWorker
MiModifiedPageWriter