PiQueryPowerRelations

INT64 __stdcall PiQueryPowerRelations(_DEVICE_NODE *DevNode, UINT8 InternalRelations){
  unsigned int v2; 
  NTSTATUS v4; 
  char *v6; 
  char *v7; 
  __int64 v8; 
  char *v9; 
  char **v10; 
  __int64 v11; 
  char **v12; 
  _DWORD *v13; 
  unsigned int v14; 
  __int64 v15; 
  __int64 v16; 
  char *PoolWithTag; 
  char **v18; 
  __int64 v19; 
  _QWORD *v20; 
  _QWORD *v21; 
  int v22; 
  PADAPTER_OBJECT *v23; 
  int v24; 
  unsigned __int16 *v25; 
  __int16 *v26; 
  _WORD *v27; 
  __int64 v28; 
  __int64 v29; 
  __int64 v30; 
  __int64 v31; 
  void *v32; 
  __int64 v33; 
  __int64 v34; 
  __int64 v35; 
  __int64 v36; 
  __int64 v37; 
  __int64 v38; 
  __int64 v39; 
  __int64 v40; 
  __int64 v41; 
  __int64 v42; 
  __int64 v43; 
  __int64 v44; 
  __int64 v45; 
  PVOID P; 
  v2 = 0;
  v4 = 0;
  P = 0i64;
  if( !*((_QWORD *)DevNode + 2) )
    return 3221225865i64;
  if( !InternalRelations )
  {
    v4 = PnpQueryDeviceRelations(*((PDEVICE_OBJECT *)DevNode + 4), PowerRelations, 0i64, &P);
    if( v4 >= 0 )
    {
      v6 = (char *)DevNode + 192;
      v7 = (char *)*((_QWORD *)DevNode + 24);
      while( v7 != v6 )
      {
        v8 = *(_QWORD *)v7;
        v9 = v7;
        v7 = (char *)v8;
        if( *(char **)(v8 + 8) != v9
          || (v10 = (char **)*((_QWORD *)v9 + 1), *v10 != v9)
          || (*v10 = (char *)v8, *(_QWORD *)(v8 + 8) = v10, v11 = *((_QWORD *)v9 + 3), *(char **)(v11 + 8) != v9 + 24)
          || (v12 = (char **)*((_QWORD *)v9 + 4), *v12 != v9 + 24) )
        {
LABEL_26:
          __fastfail(3u);
        }
        *v12 = (char *)v11;
        *(_QWORD *)(v11 + 8) = v12;
        ExFreePoolWithTag(v9, 0x72775044u);
      }
      v13 = P;
      if( !P || !*(_DWORD *)P )
      {
        v4 = 0;
        goto LABEL_29;
      }
      v14 = 0;
      while( 1 )
      {
        v15 = *(_QWORD *)&v13[2 * v14 + 2];
        if( !v15 || (v16 = *(_QWORD *)(*(_QWORD *)(v15 + 312) + 40i64)) == 0 || (*(_DWORD *)(v16 + 396) & 0x20000) != 0 )
        {
          v25 = *(unsigned __int16 **)&v13[2 * v14 + 2];
          if( v25 )
          {
            IoAddTriageDumpDataBlock(v25, v25[1]);
            v13 = P;
            v26 = *(__int16 **)(*((_QWORD *)P + v14 + 1) + 8i64);
            if( v26 )
            {
              IoAddTriageDumpDataBlock(v26, (unsigned int)v26[1]);
              v13 = P;
              v27 = (_WORD *)(*(_QWORD *)(*((_QWORD *)P + v14 + 1) + 8i64) + 56i64);
              if( *v27 )
              {
                IoAddTriageDumpDataBlock(v27, 2ui64);
                v28 = *(_QWORD *)(*((_QWORD *)P + v14 + 1) + 8i64);
                IoAddTriageDumpDataBlock(*(PVOID *)(v28 + 64), *(unsigned __int16 *)(v28 + 56));
                v13 = P;
              }
            }
            v29 = *(_QWORD *)&v13[2 * v14 + 2];
            if( v29 )
              v30 = *(_QWORD *)(*(_QWORD *)(v29 + 312) + 40i64);
            else
              v30 = 0i64;
            if( v30 )
            {
              if( v29 )
                v31 = *(_QWORD *)(*(_QWORD *)(v29 + 312) + 40i64);
              else
                v31 = 0i64;
              if( v29 )
                v32 = *(void **)(*(_QWORD *)(v29 + 312) + 40i64);
              else
                v32 = 0i64;
              IoAddTriageDumpDataBlock(v32, 0x310ui64);
              if( *(_WORD *)(v31 + 40) )
              {
                IoAddTriageDumpDataBlock((PVOID)(v31 + 40), 2ui64);
                IoAddTriageDumpDataBlock(*(PVOID *)(v31 + 48), *(unsigned __int16 *)(v31 + 40));
              }
              v13 = P;
              v33 = *((_QWORD *)P + v14 + 1);
              if( v33 )
                v34 = *(_QWORD *)(*(_QWORD *)(v33 + 312) + 40i64);
              else
                v34 = 0i64;
              if( *(_WORD *)(v34 + 56) )
              {
                if( v33 )
                  v35 = *(_QWORD *)(*(_QWORD *)(v33 + 312) + 40i64);
                else
                  v35 = 0i64;
                IoAddTriageDumpDataBlock((PVOID)(v35 + 56), 2ui64);
                v36 = *((_QWORD *)P + v14 + 1);
                if( v36 )
                  v37 = *(_QWORD *)(*(_QWORD *)(v36 + 312) + 40i64);
                else
                  v37 = 0i64;
                if( v36 )
                  v38 = *(_QWORD *)(*(_QWORD *)(v36 + 312) + 40i64);
                else
                  v38 = 0i64;
                IoAddTriageDumpDataBlock(*(PVOID *)(v38 + 64), *(unsigned __int16 *)(v37 + 56));
                v13 = P;
              }
              v39 = *(_QWORD *)&v13[2 * v14 + 2];
              if( v39 )
                v40 = *(_QWORD *)(*(_QWORD *)(v39 + 312) + 40i64);
              else
                v40 = 0i64;
              if( *(_QWORD *)(v40 + 16) )
              {
                v41 = v39 ? *(_QWORD *)(*(_QWORD *)(v39 + 312) + 40i64) : 0i64;
                if( *(_WORD *)(*(_QWORD *)(v41 + 16) + 56i64) )
                {
                  if( v39 )
                    v42 = *(_QWORD *)(*(_QWORD *)(v39 + 312) + 40i64);
                  else
                    v42 = 0i64;
                  IoAddTriageDumpDataBlock((PVOID)(*(_QWORD *)(v42 + 16) + 56i64), 2ui64);
                  v43 = *((_QWORD *)P + v14 + 1);
                  if( v43 )
                    v44 = *(_QWORD *)(*(_QWORD *)(v43 + 312) + 40i64);
                  else
                    v44 = 0i64;
                  if( v43 )
                    v45 = *(_QWORD *)(*(_QWORD *)(v43 + 312) + 40i64);
                  else
                    v45 = 0i64;
                  IoAddTriageDumpDataBlock(
                    *(PVOID *)(*(_QWORD *)(v45 + 16) + 64i64),
                    *(unsigned __int16 *)(*(_QWORD *)(v44 + 16) + 56i64));
                  v13 = P;
                }
              }
            }
          }
          KeBugCheckEx(0xCAu, 2ui64, *(_QWORD *)&v13[2 * v14 + 2], 0i64, 0i64);
        }
        if( *(_QWORD *)(v16 + 16) )
        {
          PoolWithTag = (char *)ExAllocatePoolWithTag(NonPagedPoolNx, 0x38ui64, 0x72775044ui64);
          if( !PoolWithTag )
          {
            v4 = -1073741670;
            goto LABEL_29;
          }
          PoolWithTag[48] = 0;
          *((_QWORD *)PoolWithTag + 2) = (char *)DevNode + 160;
          *((_QWORD *)PoolWithTag + 5) = v16 + 160;
          v18 = (char **)*((_QWORD *)DevNode + 25);
          if( *v18 != v6 )
            goto LABEL_26;
          *(_QWORD *)PoolWithTag = v6;
          v19 = v16 + 176;
          *((_QWORD *)PoolWithTag + 1) = v18;
          *v18 = PoolWithTag;
          *((_QWORD *)DevNode + 25) = PoolWithTag;
          v20 = PoolWithTag + 24;
          v21 = *(_QWORD **)(v19 + 8);
          if( *v21 != v19 )
            goto LABEL_26;
          *v20 = v19;
          v20[1] = v21;
          *v21 = v20;
          *(_QWORD *)(v19 + 8) = v20;
          v13 = P;
        }
        if( ++v14 >= *v13 )
          goto LABEL_29;
      }
    }
    P = 0i64;
  }
LABEL_29:
  PiQueryPowerDependencyRelations(DevNode);
  if( v4 >= 0 && v22 < 0 )
    v4 = v22;
  PiValidatePowerRelations((__int64)DevNode);
  v23 = (PADAPTER_OBJECT *)P;
  if( P )
  {
    if( *(_DWORD *)P )
    {
      do
      {
        HalPutDmaAdapter(v23[v2 + 1]);
        v23 = (PADAPTER_OBJECT *)P;
        ++v2;
      }
      while( v2 < *(_DWORD *)P );
    }
    ExFreePoolWithTag(v23, 0);
  }
  PpDevNodeLockTree(0);
  v24 = *((_DWORD *)DevNode + 75);
  if( (unsigned int)(v24 - 768) > 1 && (unsigned int)(v24 - 787) > 1 )
    PiPnpRtlPdoRaiseNtPlugPlayPropertyChangeEvent(*((_QWORD *)DevNode + 4), 19i64);
  PpDevNodeUnlockTree(0);
  return(unsigned int)v4;
}

Referenced by:

PipProcessRebuildPowerRelationsQueue
PnpDeviceActionWorker