MiProcessWorkingSets

VOID __fastcall MiProcessWorkingSets(INT64 a1, INT64 a2){
  INT64 v3; 
  PRKEVENT v4; 
  int v5; 
  __int64 v6; 
  __int64 v7; 
  __int64 *v8; 
  BOOL v9; 
  __int16 v10; 
  __int64 *v11; 
  __int64 v12; 
  __int64 v13; 
  __int64 *v14; 
  int v15; 
  _KSPIN_LOCK_QUEUE *volatile Next; 
  struct _KPRCB *CurrentPrcb; 
  unsigned __int8 CurrentIrql; 
  KSPIN_LOCK_QUEUE *v19; 
  int v20; 
  int v21; 
  __int64 v22; 
  __int64 v23; 
  __int64 **v24; 
  _KGATE *v25; 
  __int64 **v26; 
  __int64 **v27; 
  __int64 *v28; 
  __int64 **v29; 
  char v30; 
  unsigned int v31; 
  int Blink; 
  __int64 v33; 
  INT64 v34; 
  _QWORD *v35; 
  _QWORD *v36; 
  _QWORD *v37; 
  int v38; 
  _MMSUPPORT_INSTANCE *v39; 
  __int64 v40; 
  _QWORD *v41; 
  __int64 v42; 
  UINT64 v43; 
  __int64 **v44; 
  unsigned __int64 v45; 
  unsigned __int64 v46; 
  int v47; 
  unsigned int v48; 
  int v49; 
  unsigned int v50; 
  int v51; 
  PRKEVENT Event; 
  struct _KLOCK_QUEUE_HANDLE LockHandle; 
  __int16 v56; 
  int v57; 
  __int16 v58; 
  int v59; 
  int v60; 
  v3 = a1;
  memset(&LockHandle, 0, sizeof(LockHandle));
  if( *(_BYTE *)(a1 + 12) )
    MiInitializeWorkingSetManagerParameters((_MI_PARTITION *)a1);
  if( (*(_DWORD *)(v3 + 4) & 0x20) != 0 )
    return;
  v4 = *(PRKEVENT *)(v3 + 6848);
  Event = v4;
  MiComputeAgingPercent((_MI_PARTITION *)v3);
  v48 = MiComputeSystemTrimCriteria((_QWORD *)v3, a2);
  v5 = v48;
  MiLogProcessWorkingSetsStart(v3, a2, v48);
  if( (v48 & 5) != 0 )
    MiDrainZeroLookasides((_MI_PARTITION *)v3, 0i64, 0i64, 0i64);
  v49 = 0;
  v50 = 0;
  if( (v48 & 5) != 0 )
    LOBYTE(v4[2].Header.SignalState) = 1;
  if( (v48 & 2) != 0 )
    ++HIDWORD(v4[3].Header.WaitListHead.Flink);
  v6 = 0i64;
  if( (v48 & 0x40) != 0 )
  {
    if( WORD1(v4[97].Header.WaitListHead.Blink) > 0xAu )
      WORD1(v4[97].Header.WaitListHead.Blink) = 10;
    KeAcquireInStackQueuedSpinLock(&WorkerRoutine, &LockHandle);
    if( BYTE2(v4[2].Header.SignalState) == 1 )
    {
      v35 = (_QWORD *)(v3 + 6856);
      BYTE2(v4[2].Header.SignalState) = 0;
      v36 = *(_QWORD **)(v3 + 6856);
      if( v36 != (_QWORD *)(v3 + 6856) )
      {
        do
        {
          v37 = v36;
          v36 = (_QWORD *)*v36;
          if( (_LIST_ENTRY *)v37[9] >= v4[2].Header.WaitListHead.Flink )
          {
            v40 = *v37;
            v41 = (_QWORD *)v37[1];
            if( *(_QWORD **)(*v37 + 8i64) != v37
              || (_QWORD *)*v41 != v37
              || (*v41 = v40, *(_QWORD *)(v40 + 8) = v41, v42 = *v35, *(_QWORD **)(*v35 + 8i64) != v35) )
            {
LABEL_77:
              __fastfail(3u);
            }
            *v37 = v42;
            v37[1] = v35;
            *(_QWORD *)(v42 + 8) = v37;
            *v35 = v37;
          }
        }
        while( v36 != v35 );
      }
    }
  }
  else
  {
    KeAcquireInStackQueuedSpinLock(&WorkerRoutine, &LockHandle);
  }
  v7 = a2;
  v8 = (__int64 *)(v3 + 6856);
  BYTE1(v4[2].Header.SignalState) = 1;
LABEL_13:
  while( 2 )
  {
    v9 = 0;
    v51 = v5 & 1;
    if( (v5 & 1) != 0 )
    {
      v43 = MiOrderTrimList((_MI_PARTITION *)v3, *((unsigned __int8 *)MiTrimPassToAge + (*(_BYTE *)v7 & 0x7F)));
      v7 = a2;
      *(_QWORD *)(a2 + 104) = v43;
    }
    v10 = ++LOWORD(v4[97].Header.WaitListHead.Blink);
    *(_QWORD *)(v7 + 88) = *(_QWORD *)(v7 + 80) - *(_QWORD *)(v7 + 96);
    v56 = v10;
    while( 1 )
    {
      v11 = (__int64 *)*v8;
      if( (__int64 *)*v8 == v8 )
        goto LABEL_41;
      v12 = *v11;
      if( (__int64 *)v11[1] != v8 || *(__int64 **)(v12 + 8) != v11 )
        goto LABEL_77;
      *v8 = v12;
      v13 = (__int64)(v11 - 3);
      *(_QWORD *)(v12 + 8) = v8;
      v14 = v11;
      *v11 = 0i64;
      if( *((_WORD *)v11 + 74) == v10 )
      {
        v28 = (__int64 *)*v8;
        v29 = (__int64 **)(v13 + 24);
        if( *(__int64 **)(*v8 + 8) != v8 )
          goto LABEL_77;
        v3 = a1;
        *v29 = v28;
        v29[1] = v8;
        v28[1] = (__int64)v29;
        *v8 = (__int64)v29;
        if( !v51 )
          goto LABEL_44;
        v47 = MiCheckSystemTrimEndCriteria((_QWORD *)a1, v7, &LockHandle);
        v7 = a2;
        v4 = Event;
        if( v47 )
          goto LABEL_44;
        goto LABEL_13;
      }
      *(_WORD *)(v13 + 172) = v10;
      v15 = v5 & 0x40;
      if( (v5 & 0x40) != 0 && (_LIST_ENTRY *)*(_QWORD *)(v13 + 96) < Event[2].Header.WaitListHead.Flink )
        break;
      if( *(_QWORD *)(v13 + 136) > 1ui64 || (*(_BYTE *)(v13 + 184) & 7) != 0 )
      {
        v57 = *(_DWORD *)(v13 + 184);
        BYTE1(v57) = BYTE1(v57) & 0xF9 | 2;
        *(_WORD *)(v13 + 184) = v57;
        if( *(_BYTE *)(v7 + 2) == 2 )
        {
          v45 = *(_QWORD *)(v13 + 136);
          v46 = *(_QWORD *)(v13 + 112);
          if( v45 <= v46 || v45 - v46 < 0x40000 )
            goto LABEL_30;
        }
        _m_prefetchw(&LockHandle);
        Next = LockHandle.LockQueue.Next;
        if( !LockHandle.LockQueue.Next )
        {
          Next = (_KSPIN_LOCK_QUEUE *volatile)_InterlockedCompareExchange64(
                                                (volatile signed __int64 *)LockHandle.LockQueue.Lock,
                                                0i64,
                                                (signed __int64)&LockHandle);
          if( Next == (_KSPIN_LOCK_QUEUE *volatile)&LockHandle )
            goto LABEL_25;
          Next = KxWaitForLockChainValid(&LockHandle.LockQueue);
          v7 = a2;
        }
        LockHandle.LockQueue.Next = 0i64;
        _InterlockedXor64((volatile signed __int64 *)&Next->Lock, 1ui64);
LABEL_25:
        CurrentPrcb = KeGetCurrentPrcb();
        if( *((_QWORD *)CurrentPrcb + 4247) && *((_BYTE *)CurrentPrcb + 32) <= 1u && !(_DWORD)Next )
          v7 = a2;
        __writecr8(LockHandle.OldIrql);
        v5 = v48;
        v9 = MiTrimOrAgeWorkingSet(v13, v7, v48);
        if( v9 )
          *(_BYTE *)(a2 + 4) = 2;
        LockHandle.LockQueue.Lock = &WorkerRoutine;
        LockHandle.LockQueue.Next = 0i64;
        CurrentIrql = KeGetCurrentIrql();
        __writecr8(2ui64);
        LockHandle.OldIrql = CurrentIrql;
        v19 = (KSPIN_LOCK_QUEUE *)_InterlockedExchange64((volatile __int64 *)&WorkerRoutine, (__int64)&LockHandle);
        if( v19 )
          KxWaitForLockOwnerShip(&LockHandle.LockQueue, v19);
LABEL_30:
        if( !v15
          || (v20 = 0, (_LIST_ENTRY *)*(_QWORD *)(v13 + 96) < Event[2].Header.WaitListHead.Flink)
          || *(_QWORD *)(v13 + 104) )
        {
          v20 = 1;
        }
        v21 = *(_DWORD *)(v13 + 184);
        LOBYTE(v58) = v21;
        if( v20 )
        {
          HIBYTE(v58) = BYTE1(v21) & 0xF9;
          *(_WORD *)(v13 + 184) = v58;
          v22 = *(unsigned __int16 *)(v13 + 174);
          v23 = *(_QWORD *)(qword_140C4E388 + 8 * v22) + 6856i64;
          v24 = *(__int64 ***)(*(_QWORD *)(qword_140C4E388 + 8 * v22) + 6864i64);
          if( *v24 != (__int64 *)v23 )
            goto LABEL_77;
          *v14 = v23;
          v14[1] = (__int64)v24;
          *v24 = v14;
          *(_QWORD *)(v23 + 8) = v14;
          v25 = *(_KGATE **)(v13 + 104);
          if( v25 )
            KeSignalGate(v25, 1i64);
        }
        else
        {
          *(_QWORD *)(v13 + 32) = v6;
          HIBYTE(v58) = BYTE1(v21) | 6;
          v6 = v13 + 32;
          *(_WORD *)(v13 + 184) = v58;
        }
        v7 = a2;
        if( v9 )
          goto LABEL_41;
        v10 = v56;
      }
      else if( *(_QWORD *)(v13 + 104) )
      {
        v44 = (__int64 **)v8[1];
        if( *v44 != v8 )
          goto LABEL_77;
        *v14 = (__int64)v8;
        v14[1] = (__int64)v44;
        *v44 = v14;
        v8[1] = (__int64)v14;
      }
      else
      {
        v59 = *(_DWORD *)(v13 + 184);
        BYTE1(v59) |= 6u;
        *(_WORD *)(v13 + 184) = v59;
        KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
        __writecr8(LockHandle.OldIrql);
        KeRetryOutswapProcess((_KPROCESS *)(v13 - 1664));
        KeAcquireInStackQueuedSpinLock(&WorkerRoutine, &LockHandle);
        v60 = *(_DWORD *)(v13 + 184);
        BYTE1(v60) &= 0xF9u;
        *(_WORD *)(v13 + 184) = v60;
        MiReturnWsToExpansionList((_MMSUPPORT_INSTANCE *)v13, 0i64);
        v10 = v56;
        v7 = a2;
        v5 = v48;
      }
    }
    v26 = (__int64 **)v8[1];
    v27 = (__int64 **)(v13 + 24);
    if( *v26 != v8 )
      goto LABEL_77;
    *v27 = v8;
    v27[1] = (__int64 *)v26;
    *v26 = (__int64 *)v27;
    v8[1] = (__int64)v27;
LABEL_41:
    v3 = a1;
LABEL_44:
    if( (v5 & 0x40) != 0 )
    {
      while( v6 )
      {
        v38 = *(_DWORD *)(v6 + 152);
        v39 = (_MMSUPPORT_INSTANCE *)(v6 - 32);
        v6 = *(_QWORD *)v6;
        v39->Flags.u1 = v38 & 0xF9FF;
        MiReturnWsToExpansionList(v39, 1ui64);
      }
      v7 = a2;
    }
    v4 = Event;
    v30 = v5 | v49;
    v49 |= v5;
    if( !v9 )
    {
      v31 = v5 & 0xFFFFFF3C | v50;
      Blink = (int)Event[1].Header.WaitListHead.Blink;
      v50 = v31;
      if( v31 == Blink )
      {
        BYTE1(Event[2].Header.SignalState) = 0;
        if( (v30 & 5) != 0 )
          LOBYTE(Event[2].Header.SignalState) = 0;
        if( Blink )
        {
          LODWORD(Event[1].Header.WaitListHead.Blink) = 0;
          KeSetEvent(Event, 0);
        }
        if( (v30 & 0x83) != 0 )
        {
          Event[100].Header.WaitListHead.Blink = *(_LIST_ENTRY **)(a2 + 8);
          *(_QWORD *)&Event[101].Header.Lock = *(_QWORD *)(a2 + 16);
          Event[101].Header.WaitListHead.Flink = *(_LIST_ENTRY **)(a2 + 24);
          Event[101].Header.WaitListHead.Blink = *(_LIST_ENTRY **)(a2 + 32);
          *(_QWORD *)&Event[102].Header.Lock = *(_QWORD *)(a2 + 40);
          Event[102].Header.WaitListHead.Flink = *(_LIST_ENTRY **)(a2 + 48);
          Event[102].Header.WaitListHead.Blink = *(_LIST_ENTRY **)(a2 + 56);
          v33 = *(_QWORD *)(a2 + 64);
          *(_QWORD *)&Event[103].Header.Lock = v33;
          Event[100].Header.WaitListHead.Flink = (_LIST_ENTRY *)((char *)Event[102].Header.WaitListHead.Blink + v33);
        }
        goto LABEL_53;
      }
      v5 = v31 ^ Blink;
      v48 = v5;
      if( (v5 & 5) != 0 )
        LOBYTE(Event[2].Header.SignalState) = 1;
      *(_BYTE *)(v7 + 2) = 6;
      continue;
    }
    break;
  }
  BYTE1(Event[2].Header.SignalState) = 0;
  if( (v30 & 5) != 0 )
    LOBYTE(Event[2].Header.SignalState) = 0;
LABEL_53:
  KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
  __writecr8(LockHandle.OldIrql);
  MiLogProcessWorkingSetsStop((_MI_PARTITION *)v3, v34);
}

Referenced by:

MiWorkingSetManager