PiQueryPowerDependencyRelations

NTSTATUS __stdcall PiQueryPowerDependencyRelations(_DEVICE_NODE *DevNode){
  NTSTATUS v2; 
  _PO_DEVICE_NOTIFY *p_Notify; 
  _LIST_ENTRY *ProviderList; 
  _LIST_ENTRY *p_PowerParents; 
  _LIST_ENTRY *Flink; 
  _LIST_ENTRY *v7; 
  _LIST_ENTRY *v9; 
  _LIST_ENTRY *v10; 
  char *DeviceNode; 
  _LIST_ENTRY *v12; 
  _LIST_ENTRY *Blink; 
  _LIST_ENTRY *v14; 
  _LIST_ENTRY *v15; 
  _QWORD *v16; 
  _LIST_ENTRY *v17; 
  VOID **PoolWithTag; 
  _LIST_ENTRY *v19; 
  _LIST_ENTRY *v20; 
  char *v21; 
  _LIST_ENTRY **p_Blink; 
  char **v23; 
  _DEVICE_OBJECT *Provider; 

  v2 = 0;
  Provider = 0i64;
  PnpAcquireDependencyRelationsLock(0);
  p_Notify = &DevNode->Notify;
  ProviderList = PiGetProviderList(DevNode->PhysicalDeviceObject);
  p_PowerParents = &DevNode->Notify.PowerParents;
  Flink = DevNode->Notify.PowerParents.Flink;
  while( Flink != p_PowerParents )
  {
    v9 = Flink;
    Flink = Flink->Flink;
    if( LOBYTE(v9[3].Flink) )
    {
      v10 = ProviderList->Flink;
      if( ProviderList->Flink == ProviderList )
        goto LABEL_13;
      do
      {
        PiEnumerateProviderListEntry(v10, &Provider, 0i64);
        if( Provider )
        {
          DeviceNode = (char *)Provider->DeviceObjectExtension->DeviceNode;
          if( DeviceNode )
          {
            if( (char *)v9[2].Blink == DeviceNode + 160 )
              break;
          }
        }
        v10 = v10->Flink;
      }
      while( v10 != ProviderList );
      if( v10 == ProviderList )
      {
LABEL_13:
        v12 = v9->Flink;
        if( v9->Flink->Blink != v9
          || (Blink = v9->Blink, Blink->Flink != v9)
          || (Blink->Flink = v12, v12->Blink = Blink, v14 = v9[1].Blink, v14->Blink != (_LIST_ENTRY *)&v9[1].Blink)
          || (v15 = v9[2].Flink, v15->Flink != (_LIST_ENTRY *)&v9[1].Blink) )
        {
LABEL_29:
          __fastfail(3u);
        }
        v15->Flink = v14;
        v14->Blink = v15;
        ExFreePoolWithTag(v9, 0x72775044u);
      }
    }
  }
  v7 = ProviderList->Flink;
  while( v7 != ProviderList )
  {
    PiEnumerateProviderListEntry(v7, &Provider, 0i64);
    v7 = v7->Flink;
    if( Provider )
    {
      v16 = Provider->DeviceObjectExtension->DeviceNode;
      if( v16 )
      {
        if( v16[2] )
        {
          v17 = p_PowerParents->Flink;
          if( p_PowerParents->Flink == p_PowerParents )
            goto LABEL_25;
          do
          {
            if( v17[2].Blink == (_LIST_ENTRY *)(v16 + 20) )
              break;
            v17 = v17->Flink;
          }
          while( v17 != p_PowerParents );
          if( v17 == p_PowerParents )
          {
LABEL_25:
            PoolWithTag = ExAllocatePoolWithTag(0x200ui64, 0x38ui64, 1920421956i64);
            v19 = (_LIST_ENTRY *)PoolWithTag;
            if( !PoolWithTag )
            {
              v2 = -1073741670;
              break;
            }
            *((_BYTE *)PoolWithTag + 48) = 1;
            PoolWithTag[2] = p_Notify;
            PoolWithTag[5] = v16 + 20;
            v20 = p_PowerParents->Blink;
            if( v20->Flink != p_PowerParents )
              goto LABEL_29;
            v19->Flink = p_PowerParents;
            v21 = (char *)(v16 + 22);
            v19->Blink = v20;
            v20->Flink = v19;
            p_PowerParents->Blink = v19;
            p_Blink = &v19[1].Blink;
            v23 = (char **)*((_QWORD *)v21 + 1);
            if( *v23 != v21 )
              goto LABEL_29;
            *p_Blink = (_LIST_ENTRY *)v21;
            p_Blink[1] = (_LIST_ENTRY *)v23;
            *v23 = (char *)p_Blink;
            *((_QWORD *)v21 + 1) = p_Blink;
          }
        }
      }
    }
  }
  ExReleaseResourceLite((PERESOURCE)((char *)&stru_140C452E0 + 384));
  PpDevNodeUnlockTree(PPL_SIMPLE_READ);
  return v2;
}

Referenced by:

PiQueryPowerRelations