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