PipMergeDependencyEdgeList

VOID __fastcall PipMergeDependencyEdgeList(INT64 a1, INT64 a2, INT64 a3){
  _DWORD *v3; 
  unsigned int v5; 
  LIST_ENTRY *v6; 
  LIST_ENTRY *v7; 
  LIST_ENTRY *Flink; 
  INT64 v9; 
  INT64 v10; 
  _QWORD *v11; 
  INT64 v12; 
  INT64 *v13; 
  INT64 v14; 
  bool v15; 
  INT64 v16; 
  INT64 v17; 
  UNICODE_STRING *v18; 
  const UNICODE_STRING **v19; 
  bool v20; 
  INT64 v21; 
  UINT64 v22; 
  PVOID P; 
  unsigned int v25; 
  LIST_ENTRY *v26; 
  v25 = a3;
  P = 0i64;
  v3 = (_DWORD *)a2;
  v5 = a3;
  v6 = (LIST_ENTRY *)(((_DWORD)a3 != 0 ? 0x10 : 0) + a1 + 16);
  v26 = v6;
  v7 = (LIST_ENTRY *)(a2 + 16 + ((_DWORD)a3 != 0 ? 0x10 : 0));
  PiPnpRtlBeginOperation((__int64 **)&P);
  Flink = v7->Flink;
  if( v7->Flink == v7 )
    goto LABEL_22;
  do
  {
    v9 = PiListEntryToDependencyEdge((INT64)Flink, v5);
    v10 = (INT64)v6->Flink;
    v11 = (_QWORD *)v9;
    Flink = Flink->Flink;
    if( v6->Flink == v6 )
      goto LABEL_10;
    while( 1 )
    {
      v12 = PiListEntryToDependencyEdge(v10, v5);
      v10 = *v13;
      v14 = v12;
      if( !v5 )
      {
        v15 = v11[4] == *(_QWORD *)(v12 + 32);
        goto LABEL_7;
      }
      if( v11[5] == *(_QWORD *)(v12 + 40) )
        break;
      v15 = 0;
LABEL_7:
      if( v15 )
        goto LABEL_13;
      if( (LIST_ENTRY *)v10 == v6 )
      {
        v3 = (_DWORD *)a2;
        goto LABEL_10;
      }
    }
    v15 = 1;
LABEL_13:
    v18 = (UNICODE_STRING *)v11[7];
    while( v18 != (UNICODE_STRING *)(v11 + 7) )
    {
      v19 = (const UNICODE_STRING **)v18;
      v18 = *(UNICODE_STRING **)&v18->Length;
      PipAddRequestToEdge(v14, v19 + 2);
    }
    PipFreeDependencyEdge(v11, v14);
    v5 = v25;
    v11 = 0i64;
    v20 = !v15;
    v3 = (_DWORD *)a2;
    if( v20 )
    {
LABEL_10:
      if( v5 )
      {
        v17 = v11[5];
        v16 = a1;
        v11[4] = a1;
      }
      else
      {
        v16 = v11[4];
        v17 = a1;
        v11[5] = a1;
      }
      PipNotifyDependenciesChanged(v17, v16);
      ++*(_DWORD *)(a1 + 88);
      v20 = v3[22]-- == 1;
      if( v20 )
        PipDeleteDependencyNode(v3, v21, v22);
    }
    v6 = v26;
  }
  while( Flink != v7 );
LABEL_22:
  PipMoveListEntries(v6, v7);
  if( P )
    PiPnpRtlEndOperation(P);
}

Referenced by:

PipMergeDependencyNodes