PipFreeDependencyEdge

void __fastcall PipFreeDependencyEdge(PVOID P, __int64 a2){
  __int64 **v3; 
  __int64 *v5; 
  __int64 v6; 
  unsigned __int8 v7; 
  unsigned __int64 v8; 
  _QWORD *v9; 
  PVOID *v10; 
  PVOID *v11; 
  PVOID *v12; 
  v3 = (__int64 **)((char *)P + 56);
  while( 1 )
  {
    v5 = *v3;
    if( *v3 == (__int64 *)v3 )
      break;
    v6 = *v5;
    if( (__int64 **)v5[1] != v3 || *(__int64 **)(v6 + 8) != v5 )
      goto LABEL_13;
    *v3 = (__int64 *)v6;
    *(_QWORD *)(v6 + 8) = v3;
    PipFreeBindingRequestEntry(v5);
  }
  KeAcquireSpinLockRaiseToDpc(&PiDependencyEdgeWriteLock, a2);
  v8 = v7;
  if( a2 )
    *(_DWORD *)(a2 + 48) |= *((_DWORD *)P + 12);
  v9 = *(_QWORD **)P;
  v10 = (PVOID *)*((_QWORD *)P + 1);
  if( *(PVOID *)(*(_QWORD *)P + 8i64) != P
    || *v10 != P
    || (*v10 = v9,
        v9[1] = v10,
        v11 = (PVOID *)*((_QWORD *)P + 2),
        v12 = (PVOID *)*((_QWORD *)P + 3),
        v11[1] != (char *)P + 16)
    || *v12 != (char *)P + 16 )
  {
LABEL_13:
    __fastfail(3u);
  }
  *v12 = v11;
  v11[1] = v12;
  KxReleaseSpinLock(&PiDependencyEdgeWriteLock);
  __writecr8(v8);
  PipNotifyDependenciesChanged(*((_QWORD *)P + 5), *((_QWORD *)P + 4));
  PipDereferenceDependencyNode(*((_QWORD *)P + 4));
  PipDereferenceDependencyNode(*((_QWORD *)P + 5));
  ExFreePoolWithTag(P, 0x53706E50u);
}

Referenced by:

PipMergeDependencyEdgeList