PipMergeDependencyEdgeList

VOID __stdcall PipMergeDependencyEdgeList(
        _PNP_DEPENDENCY_NODE *Target,
        _PNP_DEPENDENCY_NODE *Source,
        PNP_DEPENDENCY_EDGE_LIST_TYPE Mode){
  _PNP_DEPENDENCY_NODE *v3; 
  PNP_DEPENDENCY_EDGE_LIST_TYPE v5; 
  _LIST_ENTRY *v6; 
  _LIST_ENTRY *v7; 
  _LIST_ENTRY *Flink; 
  _PNP_DEPENDENCY_EDGE *v9; 
  _LIST_ENTRY *v10; 
  _PNP_DEPENDENCY_EDGE *v11; 
  _PNP_DEPENDENCY_EDGE *v12; 
  _LIST_ENTRY **v13; 
  _PNP_DEPENDENCY_EDGE *v14; 
  bool v15; 
  _PNP_DEPENDENCY_NODE *v16; 
  _PNP_DEPENDENCY_NODE *v17; 
  _PNP_DEPENDENCY_EDGE *v18; 
  _UNICODE_STRING **v19; 
  bool v20; 
  PVOID P; 
  _LIST_ENTRY *v24; 

  P = 0i64;
  v3 = Source;
  v5 = Mode;
  v6 = (_LIST_ENTRY *)((char *)Target + (Mode != ProviderList ? 0x10 : 0) + 16);
  v24 = v6;
  v7 = (_LIST_ENTRY *)((char *)Source + (Mode != ProviderList ? 0x10 : 0) + 16);
  PiPnpRtlBeginOperation((HPNPOPCTX **)&P);
  Flink = v7->Flink;
  if( v7->Flink == v7 )
    goto LABEL_22;
  do
  {
    v9 = PiListEntryToDependencyEdge(Flink, v5);
    v10 = v6->Flink;
    v11 = v9;
    Flink = Flink->Flink;
    if( v6->Flink == v6 )
      goto LABEL_10;
    while( 1 )
    {
      v12 = PiListEntryToDependencyEdge(v10, v5);
      v10 = *v13;
      v14 = v12;
      if( v5 == ProviderList )
      {
        v15 = *((_QWORD *)v11 + 4) == *((_QWORD *)v12 + 4);
        goto LABEL_7;
      }
      if( *((_QWORD *)v11 + 5) == *((_QWORD *)v12 + 5) )
        break;
      v15 = 0;
LABEL_7:
      if( v15 )
        goto LABEL_13;
      if( v10 == v6 )
      {
        v3 = Source;
        goto LABEL_10;
      }
    }
    v15 = 1;
LABEL_13:
    v18 = (_PNP_DEPENDENCY_EDGE *)*((_QWORD *)v11 + 7);
    while( v18 != v11 + 14 )
    {
      v19 = (_UNICODE_STRING **)v18;
      v18 = *(_PNP_DEPENDENCY_EDGE **)v18;
      PipAddRequestToEdge(v14, v19 + 2);
    }
    PipFreeDependencyEdge(v11, v14);
    v5 = Mode;
    v11 = 0i64;
    v20 = !v15;
    v3 = Source;
    if( v20 )
    {
LABEL_10:
      if( v5 )
      {
        v17 = (_PNP_DEPENDENCY_NODE *)*((_QWORD *)v11 + 5);
        v16 = Target;
        *((_QWORD *)v11 + 4) = Target;
      }
      else
      {
        v16 = (_PNP_DEPENDENCY_NODE *)*((_QWORD *)v11 + 4);
        v17 = Target;
        *((_QWORD *)v11 + 5) = Target;
      }
      PipNotifyDependenciesChanged(v17, v16);
      ++Target[22];
      v20 = v3[22]-- == 1;
      if( v20 )
        PipDeleteDependencyNode(v3);
    }
    v6 = v24;
  }
  while( Flink != v7 );
LABEL_22:
  PipMoveListEntries(v6, v7);
  if( P )
    PiPnpRtlEndOperation(P);
}

Referenced by:

PipMergeDependencyNodes