NtShutdownWorkerFactory

NTSTATUS __stdcall NtShutdownWorkerFactory(
        VOID *WorkerFactoryHandle,
        INT64 *PendingWorkerCount,
        INT64 a3,
        INT64 a4,
        INT64 a5,
        INT64 a6,
        INT64 a7,
        INT64 a8){
  char PreviousMode; 
  int v10; 
  PVOID v11; 
  _DWORD *v12; 
  _KLOCK_QUEUE_HANDLE LockHandle; 
  PVOID Object; 

  memset(&LockHandle, 0, sizeof(LockHandle));
  PreviousMode = KeGetCurrentThread()->PreviousMode;
  if( PreviousMode )
  {
    if( ((unsigned __int8)PendingWorkerCount & 3) != 0 )
      ExRaiseDatatypeMisalignment();
    if( (unsigned __int64)PendingWorkerCount + 4 > 0x7FFFFFFF0000i64
      || (INT64 *)((char *)PendingWorkerCount + 4) < PendingWorkerCount )
    {
      MEMORY[0x7FFFFFFF0000] = 0;
    }
  }
  Object = 0i64;
  v10 = ObReferenceObjectByHandle(
          WorkerFactoryHandle,
          0x20ui64,
          ExpWorkerFactoryObjectType,
          PreviousMode,
          &Object,
          0i64);
  if( v10 >= 0 )
  {
    v11 = Object;
    ExpShutdownWorkerFactory((_EX_WORKER_FACTORY *)Object);
    ExWaitForRundownProtectionRelease((_EX_RUNDOWN_REF *)v11 + 13);
    _InterlockedExchangeAdd((volatile signed __int32 *)PendingWorkerCount, *((_DWORD *)v11 + 74));
    v12 = Object;
    KeAcquireInStackQueuedSpinLock(*((PKSPIN_LOCK *)Object + 2), &LockHandle);
    v12[74] = 0;
    KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
    __writecr8(LockHandle.OldIrql);
    ObfDereferenceObjectWithTag(Object, 0x746C6644ui64);
  }
  return v10;
}

Referenced by:

No references.