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