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