NtShutdownWorkerFactory
NTSTATUS __stdcall NtShutdownWorkerFactory(PVOID WorkerFactoryHandle, INT64 *PendingWorkerCount){
KPROCESSOR_MODE v3;
int v4;
PVOID v5;
_DWORD *v6;
struct _KLOCK_QUEUE_HANDLE LockHandle;
PVOID Object;
memset(&LockHandle, 0, sizeof(LockHandle));
v3 = *((_BYTE *)KeGetCurrentThread() + 562);
if( v3 )
{
if( ((unsigned __int8)PendingWorkerCount & 3) != 0 )
ExRaiseDatatypeMisalignment();
if( (unsigned __int64)PendingWorkerCount + 4 > 0x7FFFFFFF0000i64
|| (INT64 *)((char *)PendingWorkerCount + 4) < PendingWorkerCount )
{
MEMORY[0x7FFFFFFF0000] = 0;
}
}
Object = 0i64;
v4 = ObReferenceObjectByHandle(WorkerFactoryHandle, 0x20u, ExpWorkerFactoryObjectType, v3, &Object, 0i64);
if( v4 >= 0 )
{
v5 = Object;
ExpShutdownWorkerFactory((CHAR *)Object);
ExWaitForRundownProtectionRelease((EX_RUNDOWN_REF *)v5 + 13);
_InterlockedExchangeAdd((volatile signed __int32 *)PendingWorkerCount, *((_DWORD *)v5 + 74));
v6 = Object;
KeAcquireInStackQueuedSpinLock(*((UINT64 **)Object + 2), &LockHandle);
v6[74] = 0;
KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
__writecr8(LockHandle.OldIrql);
ObfDereferenceObjectWithTag(Object, 0x746C6644ui64);
}
return v4;
}Referenced by:
No references.