MiCheckSystemTrimEndCriteria
NTSTATUS __stdcall MiCheckSystemTrimEndCriteria(
_MI_PARTITION *Partition,
_MMWS_TRIM_CRITERIA *Criteria,
_KLOCK_QUEUE_HANDLE *LockHandle){
_QWORD *WorkingSetControl;
volatile unsigned __int64 AvailablePages;
__int64 v8;
_QWORD *v9;
unsigned int v10;
char *v11;
__int64 v12;
__int64 v13;
volatile unsigned __int64 v14;
volatile unsigned __int64 v15;
unsigned __int64 v16;
unsigned __int64 v17;
__int64 v18;
_QWORD *v19;
__int64 v20;
__int8 v21;
unsigned __int64 v23;
unsigned __int64 v24;
WorkingSetControl = Partition->WorkingSetControl;
if( (unsigned __int8)(Criteria->TrimReason - 2) <= 1u )
{
v23 = WorkingSetControl[295];
if( *(_QWORD *)&Criteria[1].PagesToTrim < v23 )
v24 = v23 - *(_QWORD *)&Criteria[1].ClaimDistribution[4];
else
v24 = 0i64;
WorkingSetControl[295] = v24;
return 1;
}
if( (Criteria->_bf_0 & 0x7Fu) >= 4 )
return 1;
AvailablePages = Partition->Vp.AvailablePages;
if( AvailablePages >= *(_QWORD *)&Criteria[1].ClaimDistribution[2] )
return 1;
if( *(_QWORD *)&Criteria[1].PagesToTrim >= *(_QWORD *)&Criteria[1].ClaimDistribution[4] )
{
if( AvailablePages < 0x420 )
{
*(_QWORD *)&Criteria[1].PagesToTrim = 0i64;
goto LABEL_7;
}
return 1;
}
LABEL_7:
v8 = 0i64;
v9 = WorkingSetControl + 302;
v10 = 0;
v11 = (char *)((char *)Criteria - (char *)WorkingSetControl);
do
{
v12 = *(_QWORD *)((char *)v9 + (_QWORD)v11 - 2408);
*v9++ = v12;
v13 = v12 + v8;
if( v10 < 6 )
v13 = v8;
++v10;
v8 = v13;
}
while( v10 < 8 );
WorkingSetControl[301] = v13;
KeReleaseInStackQueuedSpinLockFromDpcLevel(LockHandle);
__writecr8(LockHandle->OldIrql);
if( Partition->Vp.ModifiedPageListHead.Total < 0x420 )
{
++*((_DWORD *)WorkingSetControl + 641);
}
else
{
++*((_DWORD *)WorkingSetControl + 640);
KeDelayExecutionThread(0, 0, (_LARGE_INTEGER *)&Interval);
}
v14 = Partition->Vp.AvailablePages;
v15 = *(_QWORD *)&Criteria[1].ClaimDistribution[2];
if( v14 >= v15 )
{
KeAcquireInStackQueuedSpinLock((PKSPIN_LOCK)&stru_140C4DB30 + 522, LockHandle);
return 1;
}
v16 = v15 - v14;
v17 = 0i64;
v18 = *((unsigned __int8 *)MiTrimPassToAge + (Criteria->_bf_0 & 0x7F));
if( (unsigned int)v18 < 8 )
{
v19 = &WorkingSetControl[v18 + 302];
v20 = (unsigned int)(8 - v18);
do
{
v17 += *v19++;
--v20;
}
while( v20 );
}
*(_OWORD *)Criteria->ClaimDistribution = 0i64;
*(_OWORD *)&Criteria->ClaimDistribution[4] = 0i64;
*(_OWORD *)&Criteria->PagesToTrim = 0i64;
*(_OWORD *)&Criteria[1]._bf_0 = 0i64;
if( v17 < v16 + 256 || Criteria->_bf_0 < 0 )
v21 = Criteria->_bf_0 ^ (Criteria->_bf_0 ^ (Criteria->_bf_0 + 1)) & 0x7F;
else
v21 = Criteria->_bf_0 | 0x80;
Criteria->_bf_0 = v21;
MiLogContinueTrim(Partition, Criteria);
KeAcquireInStackQueuedSpinLock((PKSPIN_LOCK)&stru_140C4DB30 + 522, LockHandle);
return 0;
}Referenced by:
MiProcessWorkingSets