MiComputeTrimAmount
NTSTATUS __stdcall MiComputeTrimAmount(_MMWS_TRIM_CRITERIA *Criteria, _MMSUPPORT_INSTANCE *Vm, UINT64 VmLocked){
unsigned __int64 v4;
unsigned __int64 v5;
unsigned __int64 v6;
unsigned __int64 v7;
char v8;
unsigned __int64 WorkingSetSize;
unsigned __int64 v10;
unsigned __int64 LockedEntries;
__int8 bf_0;
NTSTATUS result;
unsigned __int64 MinimumWorkingSetSize;
__int64 TrimAge;
unsigned __int64 v16;
unsigned __int64 *v17;
__int64 v18;
unsigned __int8 v19;
unsigned __int64 v20;
unsigned __int64 v21;
unsigned __int64 v22;
unsigned __int64 v23;
unsigned __int64 v24;
__int64 v25;
v4 = *(_QWORD *)&Criteria[1].ClaimDistribution[4];
v5 = *(_QWORD *)&Criteria[1].PagesToTrim;
v6 = v4 - v5;
if( v4 == v5 )
return 0;
v7 = *(_QWORD *)(*(_QWORD *)(*(&stru_140C4DB30 + 267) + 8i64 * Vm->PartitionId) + 7104i64);
v8 = 3;
if( v7 >= *(_QWORD *)&Criteria[1].ClaimDistribution[2]
&& (Criteria->StandbyRemovedPercentage < 3u || (Criteria->_bf_0 & 0x7F) != 0) )
{
return 0;
}
WorkingSetSize = Vm->WorkingSetSize;
v10 = WorkingSetSize;
LockedEntries = Vm->VmWorkingSetList->LockedEntries;
if( WorkingSetSize <= LockedEntries )
return 0;
bf_0 = Vm->Flags._bf_0;
if( (bf_0 & 7) == 0 )
{
if( bf_0 >= 0 )
{
if( (HIDWORD(Vm[-3].WorkingSetExpansionLinks.Blink) & 0x40) != 0 )
goto LABEL_17;
goto LABEL_14;
}
goto LABEL_8;
}
if( (Vm->Flags._bf_0 & 7) == 1 && bf_0 < 0 )
{
LABEL_8:
if( WorkingSetSize <= Vm->MinimumWorkingSetSize )
return 0;
}
LABEL_14:
MinimumWorkingSetSize = Vm->MinimumWorkingSetSize;
if( WorkingSetSize <= MinimumWorkingSetSize )
v10 = 0i64;
else
v10 = WorkingSetSize - MinimumWorkingSetSize;
LABEL_17:
TrimAge = Criteria->TrimAge;
if( (_BYTE)TrimAge )
{
v16 = 0i64;
if( (unsigned int)TrimAge >= 8 )
return 0;
v17 = &Vm->AgeDistribution[TrimAge];
v18 = 8 - (unsigned int)Criteria->TrimAge;
do
{
v16 += *v17++;
--v18;
}
while( v18 );
if( !v16 )
return 0;
}
else
{
v16 = (WorkingSetSize - Vm->MinimumWorkingSetSize) & -(__int64)(Vm->MinimumWorkingSetSize < WorkingSetSize);
}
v19 = Criteria->_bf_0 & 0x7F;
if( v19 > 1u )
{
if( v19 == 4 && v7 < 0xE0 )
{
v10 = WorkingSetSize - LockedEntries;
}
else
{
if( v5 > v4 )
return 0;
if( Vm->Flags.MemoryPriority != 2 )
{
v23 = *(_QWORD *)&Criteria[1].PagesTrimmed;
v24 = *(_QWORD *)&Criteria[1].ClaimDistribution[6];
if( v23 > v24 )
v16 /= v23 / v24;
}
if( v16 > v10 )
v16 = v10;
v10 = v16;
}
}
else
{
if( Vm->Flags.MemoryPriority != 2 )
v8 = 1;
v20 = v16 >> v8;
v21 = *(_QWORD *)&Criteria[1].PagesTrimmed;
if( v21 >= v16 )
{
v22 = v16 * (100 * v16 / v21) / 0x64;
if( v20 < v22 )
v20 = v22;
}
if( v20 <= v10 )
v10 = v20;
}
if( v10 <= v6 )
LODWORD(v6) = v10;
result = v6;
v25 = *(_QWORD *)(*(&stru_140C4DB30 + 267) + 8i64 * Vm->PartitionId);
++*(_DWORD *)(*(_QWORD *)(v25 + 6848) + 4i64 * (Criteria->_bf_0 & 0x7F) + 2540);
return result;
}Referenced by:
MiTrimOrAgeWorkingSet