MiCheckSystemTrimEndCriteria

__int64 __fastcall MiCheckSystemTrimEndCriteria(_QWORD *a1, __int64 a2, struct _KLOCK_QUEUE_HANDLE *a3){
  __int64 v4; 
  unsigned __int64 v7; 
  __int64 v8; 
  _QWORD *v9; 
  unsigned int v10; 
  __int64 v11; 
  __int64 v12; 
  __int64 v13; 
  unsigned __int64 v14; 
  unsigned __int64 v15; 
  unsigned __int64 v16; 
  unsigned __int64 v17; 
  __int64 v18; 
  _QWORD *v19; 
  __int64 v20; 
  char v21; 
  unsigned __int64 v23; 
  unsigned __int64 v24; 
  v4 = a1[856];
  if( (unsigned __int8)(*(_BYTE *)(a2 + 2) - 2) <= 1u )
  {
    v23 = *(_QWORD *)(v4 + 2360);
    if( *(_QWORD *)(a2 + 96) < v23 )
      v24 = v23 - *(_QWORD *)(a2 + 80);
    else
      v24 = 0i64;
    *(_QWORD *)(v4 + 2360) = v24;
    return 1i64;
  }
  if( (*(_BYTE *)a2 & 0x7Fu) >= 4 )
    return 1i64;
  v7 = a1[888];
  if( v7 >= *(_QWORD *)(a2 + 72) )
    return 1i64;
  if( *(_QWORD *)(a2 + 96) >= *(_QWORD *)(a2 + 80) )
  {
    if( v7 < 0x420 )
    {
      *(_QWORD *)(a2 + 96) = 0i64;
      goto LABEL_7;
    }
    return 1i64;
  }
LABEL_7:
  v8 = 0i64;
  v9 = (_QWORD *)(v4 + 2416);
  v10 = 0;
  v11 = a2 - v4;
  do
  {
    v12 = *(_QWORD *)((char *)v9 + v11 - 2408);
    *v9++ = v12;
    v13 = v12 + v8;
    if( v10 < 6 )
      v13 = v8;
    ++v10;
    v8 = v13;
  }
  while( v10 < 8 );
  *(_QWORD *)(v4 + 2408) = v13;
  KeReleaseInStackQueuedSpinLockFromDpcLevel(a3);
  __writecr8(a3->OldIrql);
  if( a1[936] < 0x420ui64 )
  {
    ++*(_DWORD *)(v4 + 2564);
  }
  else
  {
    ++*(_DWORD *)(v4 + 2560);
    KeDelayExecutionThread(0, 0, (PLARGE_INTEGER)&MiShortTime);
  }
  v14 = a1[888];
  v15 = *(_QWORD *)(a2 + 72);
  if( v14 >= v15 )
  {
    KeAcquireInStackQueuedSpinLock(&WorkerRoutine, a3);
    return 1i64;
  }
  v16 = v15 - v14;
  v17 = 0i64;
  v18 = *((unsigned __int8 *)MiTrimPassToAge + (*(_BYTE *)a2 & 0x7F));
  if( (unsigned int)v18 < 8 )
  {
    v19 = (_QWORD *)(v4 + 2416 + 8 * v18);
    v20 = (unsigned int)(8 - v18);
    do
    {
      v17 += *v19++;
      --v20;
    }
    while( v20 );
  }
  *(_OWORD *)(a2 + 8) = 0i64;
  *(_OWORD *)(a2 + 24) = 0i64;
  *(_OWORD *)(a2 + 40) = 0i64;
  *(_OWORD *)(a2 + 56) = 0i64;
  if( v17 < v16 + 256 || *(char *)a2 < 0 )
    v21 = *(_BYTE *)a2 ^ (*(_BYTE *)a2 ^ (*(_BYTE *)a2 + 1)) & 0x7F;
  else
    v21 = *(_BYTE *)a2 | 0x80;
  *(_BYTE *)a2 = v21;
  MiLogContinueTrim();
  KeAcquireInStackQueuedSpinLock(&WorkerRoutine, a3);
  return 0i64;
}

Referenced by:

MiProcessWorkingSets