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