PopFxProcessWorkPool
NTSTATUS __stdcall PopFxProcessWorkPool(INT64 a1, UINT64 a2){
__int64 v2;
_ETHREAD *CurrentThread;
__int64 v5;
_LARGE_INTEGER *v6;
NTSTATUS result;
NTSTATUS v8;
signed __int32 v9;
signed __int32 v10;
INT64 *v11;
VOID *Object[2];
_LARGE_INTEGER v13;
v2 = (unsigned int)a2;
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
v5 = (_DWORD)a2 != -1;
if( (_DWORD)a2 == -1 )
*(_QWORD *)(a1 + 264) = CurrentThread;
else
*(_QWORD *)(a1 + 8i64 * (unsigned int)a2 + 272) = CurrentThread;
*(__m128i *)Object = _mm_add_epi64(
_mm_slli_epi64(_mm_unpacklo_epi32(_mm_load_si128((const __m128i *)&_xmm), (__m128i)0i64), 5u),
_mm_unpacklo_epi64((__m128i)(unsigned __int64)(a1 + 32), (__m128i)(unsigned __int64)(a1 + 32)));
while( 1 )
{
v13.QuadPart = 0i64;
if( KeWaitForSingleObject(a1 + 32 * ((int)v5 + 1i64), 0, 0, 0, (INT64)&v13) != 258 )
{
v8 = v5;
goto LABEL_10;
}
if( (_DWORD)v2 == -1 )
{
v6 = 0i64;
}
else
{
v13.QuadPart = -50000i64;
v6 = &v13;
}
result = KeWaitForMultipleObjects(2ui64, Object, WaitAny, Executive, 0, 0, v6, 0i64);
v8 = result;
if( result == 258 )
break;
LABEL_10:
if( v8 )
{
if( v8 == 1 )
PopFxDispatchPluginWorkOnce(*(_QWORD *)a1);
}
else
{
v11 = ExInterlockedRemoveHeadList((INT64 **)(a1 + 16), (INT32 *)(a1 + 8));
*(_OWORD *)v11 = 0i64;
((void(__fastcall *)(INT64))v11[2])(v11[3]);
}
if( (_DWORD)v2 == -1 )
{
_m_prefetchw((const void *)(a1 + 96));
v9 = *(_DWORD *)(a1 + 96);
do
{
v10 = v9;
v9 = _InterlockedCompareExchange((volatile signed __int32 *)(a1 + 96), v9, v9);
}
while( v10 != v9 );
if( v9 )
LODWORD(v5) = 0;
else
LODWORD(v5) = ((int)v5 + 1) % 2;
}
}
*(_QWORD *)(a1 + 8 * v2 + 272) = 0i64;
_InterlockedAnd((volatile signed __int32 *)(a1 + 96), ~(1 << v2));
return result;
}Referenced by:
PopFxEmergencyWorker
PopFxPluginWork