PiDqObjectManagerServiceActionQueue
VOID __stdcall PiDqObjectManagerServiceActionQueue(VOID *Parameter){
INT64 v1;
_FAST_MUTEX *v2;
char *v3;
char v4;
char *v5;
_ETHREAD *CurrentThread;
_PI_DQ_QUERY **v7;
__int64 v8;
char v9;
VOID **PoolWithTag;
__int64 v11;
volatile signed __int32 *i;
_PI_PNPRTL_OBJECT_EVENT **v13;
__int64 v14;
_PI_DQ_QUERY **v15;
_GUID *v16;
_PI_DQ_QUERY *v17;
__int64 v18;
_GUID *v19;
_ETHREAD *v20;
_PI_DQ_QUERY v21;
__int64 v22;
_ETHREAD *v23;
_PI_DQ_QUERY **v24;
__int64 v25;
int v26;
_EX_PUSH_LOCK *j;
_ETHREAD *v28;
char v29;
char v30;
PVOID P[2];
int v32;
_GUID *OriginalId;
VOID **v34;
char *v35;
_GUID ActivityId;
OriginalId = 0i64;
v2 = (_FAST_MUTEX *)((char *)Parameter + 104);
v35 = (char *)Parameter;
*(_OWORD *)P = 0i64;
v3 = (char *)Parameter;
v30 = 1;
ActivityId = 0i64;
v4 = 1;
v5 = (char *)Parameter + 208;
do
{
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
v7 = 0i64;
LODWORD(v8) = 0;
v34 = 0i64;
v32 = 0;
--CurrentThread->Tcb.KernelApcDisable;
ExAcquireResourceExclusiveLite((UINT64)v3, 1, v1);
ExAcquireFastMutex(v2);
if( *(char **)v5 == v5 )
{
P[1] = P;
P[0] = P;
}
else
{
*(_OWORD *)P = *(_OWORD *)v5;
*((_QWORD *)P[0] + 1) = P;
*(_QWORD *)P[1] = P;
*((_QWORD *)v5 + 1) = v5;
*(_QWORD *)v5 = v5;
}
v9 = 0;
if( (*((_DWORD *)v3 + 57) & 2) == 0 )
v9 = v4;
v4 = v9;
if( v9 )
{
LODWORD(v8) = *((_DWORD *)v3 + 56);
v32 = v8;
if( (_DWORD)v8 )
{
PoolWithTag = ExAllocatePoolWithTag(1ui64, 8i64 * (unsigned int)v8, 1483763280i64);
v34 = PoolWithTag;
v7 = (_PI_DQ_QUERY **)PoolWithTag;
if( PoolWithTag )
{
v11 = 0i64;
for( i = (volatile signed __int32 *)*((_QWORD *)v3 + 24);
i != (volatile signed __int32 *)(v3 + 192);
i = *(volatile signed __int32 **)i )
{
if( (unsigned int)v11 >= (unsigned int)v8 )
goto LABEL_49;
PoolWithTag[v11] = (VOID *)i;
v11 = (unsigned int)(v11 + 1);
_InterlockedIncrement(i + 53);
}
}
else
{
LABEL_49:
v4 = 0;
}
}
}
if( !v4 )
{
for( j = (_EX_PUSH_LOCK *)*((_QWORD *)v3 + 24); j != (_EX_PUSH_LOCK *)(v3 + 192); j = (_EX_PUSH_LOCK *)j->_bf_0 )
{
v28 = (_ETHREAD *)KeGetCurrentThread();
--v28->Tcb.KernelApcDisable;
ExAcquirePushLockExclusiveEx(j + 8, 0i64);
LODWORD(j[27]._bf_0) |= 1u;
PiDqQueryFreeActiveData((_PI_DQ_QUERY *)j);
PiDqQueryCompletePendedIrp((_PI_DQ_QUERY *)j);
ExReleasePushLockEx((_DWORD)j + 64, 0);
KeLeaveCriticalRegionThread(KeGetCurrentThread());
}
*((_DWORD *)v3 + 57) &= ~2u;
v2 = (_FAST_MUTEX *)(v3 + 104);
}
KeReleaseGuardedMutex(v2);
while( 1 )
{
v13 = (_PI_PNPRTL_OBJECT_EVENT **)P[0];
if( P[0] == P )
break;
if( *((PVOID **)P[0] + 1) != P || (v14 = *(_QWORD *)P[0], *(PVOID *)(*(_QWORD *)P[0] + 8i64) != P[0]) )
__fastfail(3u);
P[0] = *(PVOID *)P[0];
*(_QWORD *)(v14 + 8) = P;
if( v4 && (_DWORD)v8 )
{
v15 = v7;
v16 = OriginalId;
v8 = (unsigned int)v8;
do
{
v17 = *v15;
if( *((_QWORD *)*v15 + 28) <= (unsigned __int64)v13[3] )
{
v29 = 0;
if( !PnpIsNullGuid(*((VOID **)v17 + 3)) )
{
ActivityId = *(_GUID *)*((_QWORD *)v17 + 3);
LODWORD(v19) = IoSetActivityIdThread((INT64)&ActivityId);
v16 = v19;
v29 = 1;
}
if( byte_140C130BA < 0 )
McTemplateK0p_EtwWriteTransfer(
v18,
(const _EVENT_DESCRIPTOR *)KMPnPEvt_DevQuery_ProcessingStart,
*((const _GUID **)v17 + 3),
v17);
v20 = (_ETHREAD *)KeGetCurrentThread();
--v20->Tcb.KernelApcDisable;
ExAcquirePushLockExclusiveEx((_EX_PUSH_LOCK *)v17 + 8, 0i64);
v21 = v17[54];
ExReleasePushLockEx((_DWORD)v17 + 64, 0);
KeLeaveCriticalRegionThread(KeGetCurrentThread());
if( (v21 & 9) == 0 )
{
PiDqQueryApplyObjectEvent(v17, v13[2]);
v23 = (_ETHREAD *)KeGetCurrentThread();
--v23->Tcb.KernelApcDisable;
ExAcquirePushLockExclusiveEx((_EX_PUSH_LOCK *)v17 + 8, 0i64);
if( (v17[54] & 1) != 0 || *((_PI_DQ_QUERY **)v17 + 24) != v17 + 48 )
PiDqQueryCompletePendedIrp(v17);
ExReleasePushLockEx((_DWORD)v17 + 64, 0);
KeLeaveCriticalRegionThread(KeGetCurrentThread());
}
if( byte_140C130BA < 0 )
McTemplateK0p_EtwWriteTransfer(
v22,
(const _EVENT_DESCRIPTOR *)KMPnPEvt_DevQuery_ProcessingStop,
*((const _GUID **)v17 + 3),
v17);
if( v29 )
IoClearActivityIdThread(v16);
}
++v15;
--v8;
}
while( v8 );
v3 = v35;
LODWORD(v8) = v32;
OriginalId = v16;
v7 = (_PI_DQ_QUERY **)v34;
}
PiPnpRtlObjectEventRelease(v13[2]);
ExFreePoolWithTag(v13, 0x58706E50u);
}
if( v7 )
{
if( (_DWORD)v8 )
{
v24 = v7;
v25 = (unsigned int)v8;
do
{
PiDqQueryRelease(*v24++);
--v25;
}
while( v25 );
}
ExFreePoolWithTag(v7, 0x58706E50u);
}
v2 = (_FAST_MUTEX *)(v3 + 104);
ExAcquireFastMutex((PFAST_MUTEX)(v3 + 104));
v5 = v3 + 208;
if( *(char **)v5 == v5 )
{
v26 = *((_DWORD *)v3 + 57);
if( (v26 & 2) == 0 )
{
v30 = 0;
*((_DWORD *)v3 + 57) = v26 & 0xFFFFFFFE;
}
}
KeReleaseGuardedMutex((PKGUARDED_MUTEX)(v3 + 104));
ExReleaseResourceLite((PERESOURCE)v3);
KeLeaveCriticalRegionThread(KeGetCurrentThread());
}
while( v30 );
}Referenced by:
No references.