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.