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