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