ExpWorkerFactoryManagerThread
VOID __stdcall __noreturn ExpWorkerFactoryManagerThread(VOID *Context){
_LIST_ENTRY *v1;
_LIST_ENTRY *v2;
_LIST_ENTRY *Flink;
unsigned int v4;
unsigned int Blink;
char v6;
_KLOCK_QUEUE_HANDLE LockHandle;
memset(&LockHandle, 0, sizeof(LockHandle));
while( 1 )
{
while( 1 )
{
v1 = KeRemoveQueue((_KQUEUE *)((char *)&WheapDeferredInternalLogsEventLock + 2048), 0, 0i64);
if( v1 != (_LIST_ENTRY *)((char *)&WheapDeferredInternalLogsEventLock + 2208) )
break;
ExpWorkerFactoryDeferredThreadCreation();
KeRegisterObjectNotification(
(char *)&WheapDeferredInternalLogsEventLock + 2144,
(_KQUEUE *)((char *)&WheapDeferredInternalLogsEventLock + 2048),
(_KWAIT_BLOCK *)&WheapDeferredInternalLogsEventLock + 46);
}
if( !LODWORD(v1[3].Flink) )
break;
v2 = v1 - 29;
Flink = v1[-28].Flink;
KeAcquireInStackQueuedSpinLock((PKSPIN_LOCK)Flink, &LockHandle);
if( !LODWORD(v2[19].Flink) )
{
v4 = (unsigned int)v2[18].Flink;
Blink = (unsigned int)v2[17].Blink;
if( v4 > Blink )
KeTimeOutQueueWaiters((_DISPATCHER_HEADER *)Flink->Blink, -(__int64)v2[7].Flink, v4 - Blink);
}
if( BYTE1(Flink[2].Flink) )
{
v6 = 1;
}
else
{
v6 = 0;
KeRegisterObjectNotification(
&v2[20].Blink,
(_KQUEUE *)((char *)&WheapDeferredInternalLogsEventLock + 2048),
(_KWAIT_BLOCK *)&v2[29]);
}
KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
__writecr8(LockHandle.OldIrql);
if( v6 )
LABEL_14:
ObfDereferenceObjectWithTag(v2, 0x746C6644ui64);
}
v2 = (_LIST_ENTRY *)((char *)v1 - 520);
KeAcquireInStackQueuedSpinLock((PKSPIN_LOCK)v1[-32].Blink, &LockHandle);
LODWORD(v2[19].Blink) &= ~0x400u;
if( ((__int64)v2[19].Blink & 0x200) != 0 && ExpTryEnterWorkerFactoryAwayMode((_EX_WORKER_FACTORY *)v2) )
{
ExpWorkerFactoryCheckCreate(v2, &LockHandle, 0);
}
else
{
KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
__writecr8(LockHandle.OldIrql);
}
goto LABEL_14;
}Referenced by:
No references.