PipFreeDependencyEdge
VOID __stdcall PipFreeDependencyEdge(_PNP_DEPENDENCY_EDGE *Edge, _PNP_DEPENDENCY_EDGE *MergeTarget){
_PNP_DEPENDENCY_EDGE *v3;
__int64 *v5;
__int64 v6;
unsigned __int64 v7;
__int64 v8;
_PNP_DEPENDENCY_EDGE **v9;
__int64 v10;
_PNP_DEPENDENCY_EDGE **v11;
v3 = Edge + 14;
while( 1 )
{
v5 = *(__int64 **)v3;
if( *(_PNP_DEPENDENCY_EDGE **)v3 == v3 )
break;
v6 = *v5;
if( (_PNP_DEPENDENCY_EDGE *)v5[1] != v3 || *(__int64 **)(v6 + 8) != v5 )
goto LABEL_13;
*(_QWORD *)v3 = v6;
*(_QWORD *)(v6 + 8) = v3;
PipFreeBindingRequestEntry(v5);
}
v7 = (unsigned __int8)KeAcquireSpinLockRaiseToDpc((UINT64 *)&stru_140C452E0 + 44);
if( MergeTarget )
MergeTarget[12] |= Edge[12];
v8 = *(_QWORD *)Edge;
v9 = (_PNP_DEPENDENCY_EDGE **)*((_QWORD *)Edge + 1);
if( *(_PNP_DEPENDENCY_EDGE **)(*(_QWORD *)Edge + 8i64) != Edge
|| *v9 != Edge
|| (*v9 = (_PNP_DEPENDENCY_EDGE *)v8,
*(_QWORD *)(v8 + 8) = v9,
v10 = *((_QWORD *)Edge + 2),
v11 = (_PNP_DEPENDENCY_EDGE **)*((_QWORD *)Edge + 3),
*(_PNP_DEPENDENCY_EDGE **)(v10 + 8) != Edge + 4)
|| *v11 != Edge + 4 )
{
LABEL_13:
__fastfail(3u);
}
*v11 = (_PNP_DEPENDENCY_EDGE *)v10;
*(_QWORD *)(v10 + 8) = v11;
KxReleaseSpinLock((UINT64 *)&stru_140C452E0 + 44);
__writecr8(v7);
PipNotifyDependenciesChanged(*((_PNP_DEPENDENCY_NODE **)Edge + 5), *((_PNP_DEPENDENCY_NODE **)Edge + 4));
PipDereferenceDependencyNode(*((_PNP_DEPENDENCY_NODE **)Edge + 4));
PipDereferenceDependencyNode(*((_PNP_DEPENDENCY_NODE **)Edge + 5));
ExFreePoolWithTag(Edge, 0x53706E50u);
}Referenced by:
PipDeleteAllDependencyRelations
PipMergeDependencyEdgeList