ExpWorkQueueManagerThread

VOID __stdcall ExpWorkQueueManagerThread(){
  __int64 v0; 
  char v1; 
  __int64 v2; 
  _WORK_QUEUE_ITEM *v3; 
  VOID **PoolWithTag; 
  _ETHREAD *CurrentThread; 
  char v6; 
  UINT64 v7; 
  NTSTATUS v8; 
  _LIST_ENTRY *v9; 
  int v10; 
  __int64 v11; 
  __int64 v12; 
  INT64 v13; 
  NTSTATUS PoolDelayed; 
  __int64 v15; 
  __int64 v16; 
  _LIST_ENTRY *v17; 
  __int64 j; 
  __int64 v19; 
  _ENODE *v20; 
  NTSTATUS v21; 
  int v22; 
  __int64 i; 
  __int64 v24; 
  UINT64 v25; 
  __int64 v26; 
  _LIST_ENTRY *v27; 
  NTSTATUS WorkerThread; 
  char v29; 
  USHORT Count; 
  _ETHREAD *Thread; 
  UINT64 v32; 
  _EXT_SET_PARAMETERS_V0 Parameters; 
  _GROUP_AFFINITY Affinity; 
  VOID *Object[3]; 

  v1 = 0;
  v29 = 1;
  v2 = v0;
  Count = 0;
  Affinity = 0i64;
  v3 = 0i64;
  PoolWithTag = ExAllocatePoolWithTag(0x200ui64, 0x10ui64, 1817671749i64);
  if( PoolWithTag )
  {
    v3 = (_WORK_QUEUE_ITEM *)ExAllocatePoolWithTag(0x200ui64, 0x20ui64, 1817671749i64);
    if( v3 )
    {
      v29 = 0;
    }
    else
    {
      ExFreePoolWithTag(PoolWithTag, 0);
      PoolWithTag = 0i64;
    }
  }
  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  Thread = CurrentThread;
  KeSetActualBasePriorityThread(&CurrentThread->Tcb, 12i64);
  Parameters.NoWakeTolerance = -1i64;
  *(_QWORD *)&Parameters.Version = 0i64;
  KeSetTimer2(
    v2 + 128,
    -((10000000i64 * (unsigned int)ExpWorkerThreadTimeoutInSeconds) >> 2),
    (10000000i64 * (unsigned int)ExpWorkerThreadTimeoutInSeconds) >> 2,
    (INT64)&Parameters);
  v6 = 0;
  v7 = 10000000i64 * (unsigned int)ExpWorkerThreadTimeoutInSeconds;
  Object[0] = (VOID *)(v2 + 16);
  Object[1] = (VOID *)(v2 + 40);
  v32 = v7;
  Object[2] = (VOID *)(v2 + 104);
  while( 1 )
  {
    v8 = KeWaitForMultipleObjects(3ui64, Object, WaitAny, Executive, 1, 0, 0i64, 0i64);
    v9 = 0i64;
    if( !v8 )
      break;
    v22 = v8 - 1;
    if( v22 )
    {
      if( v22 == 1 )
      {
        for( i = 0i64; i < 64; i += 8i64 )
        {
          v24 = *(_QWORD *)(*(_QWORD *)(*(_QWORD *)(*(_QWORD *)v2 + 8i64)
                                      + 8i64 * *(unsigned __int16 *)(*(_QWORD *)(v2 + 8) + 146i64))
                          + i);
          if( (v24 & 1) == 0 )
          {
            if( v24 )
            {
              if( (*(_DWORD *)(v24 + 712) & 0x4000) == 0 && !*(_DWORD *)(v24 + 4) )
              {
                v25 = (*(_DWORD *)(v24 + 712) & 0x3FFFu) - ((2 * *(_DWORD *)(v24 + 716)) >> 1);
                if( (_DWORD)v25 )
                {
                  KeTimeOutQueueWaiters((_DISPATCHER_HEADER *)v24, v7, v25);
                  v9 = 0i64;
                }
              }
            }
          }
        }
        CurrentThread = Thread;
      }
      LOBYTE(v11) = 1;
LABEL_15:
      if( v6 )
        goto LABEL_25;
      goto LABEL_16;
    }
    v6 = 0;
    v26 = 0i64;
    v11 = 1i64;
    do
    {
      v27 = *(_LIST_ENTRY **)(*(_QWORD *)(*(_QWORD *)(*(_QWORD *)v2 + 8i64)
                                        + 8i64 * *(unsigned __int16 *)(*(_QWORD *)(v2 + 8) + 146i64))
                            + 8 * v26);
      if( ((unsigned __int8)v27 & (unsigned __int8)v11) != 0 )
        v27 = v9;
      if( LODWORD(v27[44].Flink) == HIDWORD(v27[44].Flink) && ExpNewThreadNecessary((_EX_WORK_QUEUE *)v27, 0x3FFFi64) )
      {
        if( (*(&WheapDeferredInternalLogsEventLock + 2720) & 2) != 0 )
          KeBugCheckEx(0x163u, (PVOID)*(&WheapDeferredInternalLogsEventLock + 680), (PVOID)2, 0i64, v9);
        if( v26 == v11 && v29 == (_BYTE)v9 )
        {
          *(_DWORD *)PoolWithTag = v11;
          PoolWithTag[1] = v27;
          v3->WorkerRoutine = (void(__fastcall *)(void *))ExpIoPoolDeadlockWorker;
          v3->Parameter = PoolWithTag;
          v3->List.Flink = v9;
          ExQueueWorkItem(v3, NormalWorkQueue);
          v29 = 1;
        }
        WorkerThread = ExpCreateWorkerThread((_ENODE *)v27, (_EX_WORK_QUEUE *)(v2 + 276));
        v9 = 0i64;
        v11 = 1i64;
        if( WorkerThread < 0 )
          v1 = 1;
      }
      v26 += v11;
    }
    while( v26 <= v11 );
LABEL_16:
    v16 = (__int64)v9;
    do
    {
      v17 = *(_LIST_ENTRY **)(*(_QWORD *)(*(_QWORD *)(*(_QWORD *)v2 + 8i64)
                                        + 8i64 * *(unsigned __int16 *)(*(_QWORD *)(v2 + 8) + 146i64))
                            + v16);
      if( ((unsigned __int8)v17 & (unsigned __int8)v11) != 0 )
        v17 = v9;
      HIDWORD(v17[44].Flink) = v17[44].Flink;
      if( ((__int64)v17[44].Blink & 0x3FFF) >= SLODWORD(v17[45].Flink) || v1 )
        v6 = v11;
      v16 += 8i64;
    }
    while( v16 <= 8 );
    if( v6 )
      KeSetCoalescableTimer(v2 + 40, -10000000i64, 0i64, 0xA0ui64, (INT64)v9);
    CurrentThread = Thread;
LABEL_25:
    KeQueryNodeActiveAffinity(*(_WORD *)(*(_QWORD *)(v2 + 8) + 146i64), &Affinity, &Count);
    if( CurrentThread->Tcb.UserAffinity.Group != Affinity.Group
      || CurrentThread->Tcb.UserAffinity.Mask != Affinity.Mask )
    {
      KeSetAffinityThread((INT64)CurrentThread, (INT64)&Affinity);
    }
    v1 = 0;
    for( j = 0i64; j < 64; j += 8i64 )
    {
      v19 = *(_QWORD *)(*(_QWORD *)(*(_QWORD *)(*(_QWORD *)v2 + 8i64)
                                  + 8i64 * *(unsigned __int16 *)(*(_QWORD *)(v2 + 8) + 146i64))
                      + j);
      if( (v19 & 1) == 0 && v19 && *(_DWORD *)(v19 + 664) != Count )
        KeSetMaximumCountPriQueue((_KPRIQUEUE *)v19, Count);
    }
    CurrentThread = Thread;
    v7 = v32;
  }
  if( !*(_DWORD *)(v2 + 272) )
  {
    v10 = 0;
    LODWORD(v11) = 1;
    v12 = 0i64;
    do
    {
      v13 = *(_QWORD *)(v2 + 8);
      if( ((unsigned __int8)*(_QWORD *)(*(_QWORD *)(*(_QWORD *)(*(_QWORD *)v2 + 8i64)
                                                   + 8i64 * *(unsigned __int16 *)(v13 + 146))
                                       + v12) & (unsigned __int8)v11) != 0 )
      {
        PoolDelayed = ExpPartitionCreatePoolDelayed(*(_QWORD *)v2, v13, (unsigned int)v10);
        v9 = 0i64;
        LODWORD(v11) = 1;
      }
      else
      {
        PoolDelayed = (int)v9;
      }
      if( PoolDelayed < 0 )
      {
        v1 = v11;
      }
      else
      {
        v15 = *(_QWORD *)(*(_QWORD *)(*(_QWORD *)(*(_QWORD *)v2 + 8i64)
                                    + 8i64 * *(unsigned __int16 *)(*(_QWORD *)(v2 + 8) + 146i64))
                        + v12);
        if( ((unsigned __int8)v15 & (unsigned __int8)v11) == 0 )
        {
          if( v15 )
          {
            if( ExpNewThreadNecessary((_EX_WORK_QUEUE *)v15, *(unsigned int *)(v15 + 720)) )
            {
              v21 = ExpCreateWorkerThread(v20, (_EX_WORK_QUEUE *)(v2 + 276));
              v9 = 0i64;
              LODWORD(v11) = 1;
              if( v21 < 0 )
                v1 = 1;
            }
          }
        }
      }
      v10 += v11;
      v12 += 8i64;
    }
    while( v10 < 8 );
    CurrentThread = Thread;
    goto LABEL_15;
  }
  if( PoolWithTag )
    ExFreePoolWithTag(PoolWithTag, 0);
  if( v3 )
    ExFreePoolWithTag(v3, 0);
}

Referenced by:

No references.