PopFxRequestWorker
VOID __stdcall PopFxRequestWorker(POHANDLE *PluginHandle){
UINT64 v1;
KSEMAPHORE *v2;
__int64 v4;
int v5;
v2 = (KSEMAPHORE *)&PopFxSystemWorkPool;
if( PluginHandle )
v2 = (KSEMAPHORE *)(PluginHandle + 15);
KeReleaseSemaphoreEx(v2 + 2, 0i64, 1i64, v1);
if( !PluginHandle || ((_BYTE)PluginHandle[3] & 1) != 0 )
{
v4 = 0i64;
while( 1 )
{
v5 = 1 << v4;
_m_prefetchw(&v2[3]);
if( (_InterlockedOr(&v2[3].Header.Lock, 1 << v4) & (1 << v4)) == 0 )
break;
v4 = (unsigned int)(v4 + 1);
if( (unsigned int)v4 >= 4 )
return;
}
if( !ExTryQueueWorkItem(
(WORK_QUEUE_ITEM *)(&v2[v4 + 3].Header.WaitListHead.Blink + (unsigned int)v4),
(WORK_QUEUE_TYPE)48) )
_InterlockedAnd(&v2[3].Header.Lock, ~v5);
}
}Referenced by:
PopPepRequestWork