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