ExpShutdownWorkerFactory

VOID __stdcall ExpShutdownWorkerFactory(_EX_WORKER_FACTORY *WorkerFactory){
  unsigned __int64 *v2; 
  VOID **v3; 
  __int64 v4; 
  __int64 v5; 
  char v6; 
  _KLOCK_QUEUE_HANDLE LockHandle; 

  v2 = (unsigned __int64 *)*((_QWORD *)WorkerFactory + 2);
  memset(&LockHandle, 0, sizeof(LockHandle));
  KeAcquireInStackQueuedSpinLock(v2, &LockHandle);
  v3 = (VOID **)(WorkerFactory + 18);
  v4 = 4i64;
  WorkerFactory[78] = WorkerFactory[78] & 0xFFFFFFF8 | 4;
  do
  {
    if( *v3 )
    {
      ObfDereferenceObjectWithTag(*v3, 0x746C6644ui64);
      *v3 = 0i64;
    }
    ++v3;
    --v4;
  }
  while( v4 );
  if( (WorkerFactory[78] & 0x200) != 0 )
    ExpLeaveWorkerFactoryAwayMode(WorkerFactory);
  if( *((_EX_WORKER_FACTORY **)WorkerFactory + 62) == WorkerFactory + 82
    && KeDeregisterObjectNotification(WorkerFactory + 82, (_KWAIT_BLOCK *)(WorkerFactory + 116)) )
  {
    ObfDereferenceObjectWithTag(WorkerFactory, 0x746C6644ui64);
  }
  *(_BYTE *)(*((_QWORD *)WorkerFactory + 2) + 33i64) = 1;
  v5 = *((_QWORD *)WorkerFactory + 2);
  WorkerFactory[71] = 0;
  WorkerFactory[70] = 0;
  if( !*(_DWORD *)(v5 + 28) || *(_BYTE *)(v5 + 32) )
  {
    v6 = 0;
  }
  else
  {
    *(_BYTE *)(v5 + 32) = 1;
    v6 = 1;
  }
  KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
  __writecr8(LockHandle.OldIrql);
  KeCancelTimer2((INT64)(WorkerFactory + 82));
  if( v6 )
    IoSetIoCompletionEx2(
      *(VOID **)(*((_QWORD *)WorkerFactory + 2) + 8i64),
      0i64,
      0i64,
      0i64,
      0i64,
      0,
      *(_IO_MINI_COMPLETION_PACKET_USER **)(*((_QWORD *)WorkerFactory + 2) + 16i64),
      0);
}

Referenced by:

ExpCloseWorkerFactory
NtShutdownWorkerFactory