MiComputeAgeDistribution
UINT16 __stdcall MiComputeAgeDistribution(_MI_PARTITION *Partition, UINT64 Recompute){
int v2;
__int64 v4;
_QWORD **v5;
_QWORD *i;
_QWORD *v7;
__int64 v8;
unsigned __int64 v9;
unsigned int v10;
int v11;
unsigned __int64 v12;
unsigned __int64 v13;
struct _KLOCK_QUEUE_HANDLE LockHandle;
__int64 Src[8];
v2 = Recompute;
memset(&LockHandle, 0, sizeof(LockHandle));
memset((INT64)Src, 0i64);
v4 = *((_QWORD *)Partition + 856);
if( v2 == 1 )
{
KeAcquireInStackQueuedSpinLock(&WorkerRoutine, &LockHandle);
v5 = (_QWORD **)((char *)Partition + 6856);
for( i = *v5; i != v5; i = (_QWORD *)*i )
MiUpdateClaimDistribution((INT64)(i - 3), (UINT64 *)Src);
memmove((UINT8 *)(v4 + 2416), (UINT8 *)Src, 0x40ui64);
v7 = (_QWORD *)(v4 + 2464);
v8 = 2i64;
v9 = 0i64;
do
{
v9 += *v7++;
--v8;
}
while( v8 );
*(_QWORD *)(v4 + 2408) = v9;
KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
__writecr8(LockHandle.OldIrql);
}
else
{
v9 = *(_QWORD *)(v4 + 2408);
}
v10 = 5;
v11 = 0;
while( v9 < 4i64 * *(_QWORD *)(v4 + 2384) )
{
++v11;
v9 += *(_QWORD *)(v4 + 8i64 * v10 + 2416);
if( v10 == 1 )
break;
--v10;
}
v12 = *(_QWORD *)(v4 + 2352);
if( v12 )
{
v13 = (unsigned int)(1000 * v11) / v12;
if( (unsigned __int16)v13 > 0x3E8u )
LOWORD(v13) = 1000;
return v13;
}
else if( v11 )
{
return 1000;
}
else
{
return 0;
}
}Referenced by:
MiComputeSystemTrimCriteria
MiOrderTrimList