ExpWorkerFactoryCreateThread

NTSTATUS __stdcall ExpWorkerFactoryCreateThread(_EX_WORKER_FACTORY *WorkerFactory){
  _EX_WORKER_FACTORY v1; 
  _ETHREAD *CurrentThread; 
  NTSTATUS v3; 
  int v4; 
  _EX_RUNDOWN_REF *v6; 
  _EX_WORKER_FACTORY v7; 
  NTSTATUS UserThread; 
  int v10; 
  __int64 v11[2]; 
  _KLOCK_QUEUE_HANDLE LockHandle; 
  VOID *ThreadHandle; 

  v1 = WorkerFactory[78];
  ThreadHandle = 0i64;
  memset(&LockHandle, 0, sizeof(LockHandle));
  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  v3 = 128;
  v4 = (v1 & 0x800 | 0x80u) >> 7;
  --CurrentThread->Tcb.KernelApcDisable;
  *(_OWORD *)v11 = 0i64;
  v6 = (_EX_RUNDOWN_REF *)(WorkerFactory + 26);
  if( ExAcquireRundownProtection((_EX_RUNDOWN_REF *)WorkerFactory + 13) )
  {
    KeAcquireInStackQueuedSpinLock(*((PKSPIN_LOCK *)WorkerFactory + 2), &LockHandle);
    if( !*(_BYTE *)(*((_QWORD *)WorkerFactory + 2) + 33i64) )
    {
      ++WorkerFactory[74];
      v7 = WorkerFactory[78];
      KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
      __writecr8(LockHandle.OldIrql);
      UserThread = RtlpCreateUserThreadEx(
                     *((VOID **)WorkerFactory + 5),
                     0i64,
                     v4,
                     0,
                     *((_QWORD *)WorkerFactory + 7),
                     *((_QWORD *)WorkerFactory + 8),
                     v10,
                     *((VOID **)WorkerFactory + 3),
                     *((VOID **)WorkerFactory + 4),
                     (__int64)&ThreadHandle,
                     (__int64)v11);
      WorkerFactory[80] = UserThread;
      v3 = UserThread;
      if( UserThread >= 0 )
      {
        if( (v7 & 0x8000) == 0 )
        {
          KeAcquireInStackQueuedSpinLock(*((PKSPIN_LOCK *)WorkerFactory + 2), &LockHandle);
          WorkerFactory[78] |= 0x8000u;
          KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
          __writecr8(LockHandle.OldIrql);
        }
        if( WorkerFactory[79] )
          ZwSetInformationThread((UINT64)ThreadHandle, 3i64, (UINT64)(WorkerFactory + 79), 4ui64);
        if( (WorkerFactory[78] & 0x4000) != 0 )
          ZwSetInformationThread(
            (UINT64)ThreadHandle,
            39i64,
            (UINT64)(WorkerFactory + 30),
            8 * (unsigned int)(unsigned __int16)KiActiveGroups);
        v3 = ZwResumeThread(ThreadHandle, 0i64);
        ObCloseHandle(ThreadHandle, 0);
        goto LABEL_11;
      }
      KeAcquireInStackQueuedSpinLock(*((PKSPIN_LOCK *)WorkerFactory + 2), &LockHandle);
      --WorkerFactory[74];
    }
    KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
    __writecr8(LockHandle.OldIrql);
LABEL_11:
    ExReleaseRundownProtection(v6);
  }
  KeLeaveCriticalRegionThread(KeGetCurrentThread());
  return v3;
}

Referenced by:

ExpWorkerFactoryCheckCreate
NtSetInformationWorkerFactory