PopDequeueQuerySetIrp
VOID __stdcall PopDequeueQuerySetIrp(IRP *Irp){
__int64 v2;
__int64 v3;
__int64 v4;
__int64 v5;
__int64 v6;
__int64 v7;
_QWORD *v8;
_QWORD *v9;
__int64 *v10;
_QWORD *v11;
_QWORD *v12;
__int64 **v13;
__int64 **v14;
__int64 v15;
__int64 *v16;
_DEVICE_OBJECT *v17;
__int64 *i;
__int64 *v19;
__int64 v20;
__int64 v21;
__int64 v22;
__int64 *v23;
__int64 ***v24;
__int64 **v25;
_QWORD *v26;
__int64 *v27;
__int64 **v28;
struct _KLOCK_QUEUE_HANDLE LockHandle;
KLOCK_QUEUE_HANDLE v30;
memset(&LockHandle, 0, sizeof(LockHandle));
PopDiagTraceIrpFinish(Irp);
v2 = *((char *)Irp + 66);
memset(&v30, 0, sizeof(v30));
v3 = *((_QWORD *)Irp + 9 * v2 + 25);
if( *(_BYTE *)(v3 + 196) && !KeCancelTimer((PKTIMER)(v3 + 56)) )
{
KeAcquireInStackQueuedSpinLock(&PopIrpLock, &v30);
PopIrpWatchdogBugcheck(v3);
}
v28 = &v27;
v27 = (__int64 *)&v27;
v4 = *((_QWORD *)Irp + 9 * *((char *)Irp + 66) + 25);
v5 = *(_QWORD *)(v4 + 24);
if( v5 )
v6 = *(_QWORD *)(*(_QWORD *)(v5 + 312) + 40i64);
else
v6 = 0i64;
v7 = 264i64;
if( *(_DWORD *)(v4 + 188) != 1 )
v7 = 280i64;
v8 = (_QWORD *)(v6 + v7);
KeAcquireInStackQueuedSpinLock(&PopIrpLock, &LockHandle);
*v8 = 0i64;
if( Irp == (IRP *)PopInrushIrp )
{
PopInrushIrp = 0i64;
for( i = (__int64 *)PopInrushIrpList; ; i = (__int64 *)*i )
{
if( i == &PopInrushIrpList )
goto LABEL_8;
v19 = i - 21;
v20 = *(_QWORD *)(i[9 * *((char *)i - 102) + 4] + 24);
v21 = v20 ? *(_QWORD *)(*(_QWORD *)(v20 + 312) + 40i64) : 0i64;
if( !*(_QWORD *)(v21 + 264) && *(__int64 **)(v21 + 272) == v19 )
break;
}
v22 = *i;
v23 = (__int64 *)i[1];
if( *(__int64 **)(*i + 8) != i )
goto LABEL_23;
if( (__int64 *)*v23 != i )
goto LABEL_23;
*v23 = v22;
*(_QWORD *)(v22 + 8) = v23;
v24 = (__int64 ***)(v19 + 15);
*(_QWORD *)(v21 + 264) = v19;
*(_QWORD *)(v21 + 272) = v19[15];
v25 = v28;
PopInrushIrp = (__int64)(i - 21);
if( *v28 != (__int64 *)&v27 )
goto LABEL_23;
v19[16] = (__int64)v28;
*v24 = &v27;
*v25 = (__int64 *)v24;
v28 = (__int64 **)(v19 + 15);
if( *v8 )
goto LABEL_9;
}
LABEL_8:
v9 = (_QWORD *)v8[1];
if( v9 )
{
v11 = v9 + 21;
v12 = (_QWORD *)v9[21];
if( v12 != v9 + 21 )
{
if( PopInrushIrp )
{
v9 = 0i64;
}
else
{
v26 = (_QWORD *)v9[22];
PopInrushIrp = v8[1];
if( (_QWORD *)v12[1] != v11 || (_QWORD *)*v26 != v11 )
goto LABEL_23;
*v26 = v12;
v12[1] = v26;
}
}
if( !v9 )
goto LABEL_9;
*v8 = v9;
v13 = (__int64 **)(v9 + 15);
v8[1] = v9[15];
v14 = v28;
if( *v28 == (__int64 *)&v27 )
{
v13[1] = (__int64 *)v28;
*v13 = (__int64 *)&v27;
*v14 = (__int64 *)v13;
v28 = v13;
goto LABEL_9;
}
LABEL_23:
__fastfail(3u);
}
LABEL_9:
KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
__writecr8(LockHandle.OldIrql);
while( 1 )
{
v10 = v27;
if( v27 == (__int64 *)&v27 )
break;
v15 = *v27;
if( (__int64 **)v27[1] != &v27 || *(__int64 **)(v15 + 8) != v27 )
goto LABEL_23;
v27 = (__int64 *)*v27;
*(_QWORD *)(v15 + 8) = &v27;
v16 = v10 - 15;
v17 = *(_DEVICE_OBJECT **)(v16[23] - 32);
PopDiagTraceIrpStart((IRP *)&v27, (IRP *)v16);
PopEnableIrpWatchdog((IRP *)v16);
IofCallDriver(v17, (PIRP)v16);
}
if( *(_BYTE *)(v4 + 184) == 2
&& *(_DWORD *)(v4 + 188) == 1
&& _InterlockedExchangeAdd(&PopPendingSetPowerDeviceIrps, 0xFFFFFFFF) == 1 )
{
PopDeepSleepClearDisengageReason(2i64);
}
}Referenced by:
PopRequestCompletion
PopSystemIrpCompletion