PipCreateNewDependencyEdge

_PNP_DEPENDENCY_EDGE *__stdcall PipCreateNewDependencyEdge(
        _PNP_DEPENDENCY_NODE *Dependent,
        _PNP_DEPENDENCY_NODE *Provider,
        _PNP_BINDING_REQUEST *Request){
  VOID **PoolWithTag; 
  VOID **v7; 
  __int64 v8; 
  unsigned __int64 v10; 
  _PNP_DEPENDENCY_NODE *v11; 
  _PNP_DEPENDENCY_NODE **v12; 
  _PNP_DEPENDENCY_NODE **v13; 

  PoolWithTag = ExAllocatePoolWithTag(0x200ui64, 0x50ui64, 1399877200i64);
  v7 = PoolWithTag;
  if( PoolWithTag )
  {
    *((_DWORD *)PoolWithTag + 12) = 0;
    PoolWithTag[8] = PoolWithTag + 7;
    PoolWithTag[7] = PoolWithTag + 7;
    PoolWithTag[5] = Dependent;
    PoolWithTag[4] = Provider;
    *((_BYTE *)PoolWithTag + 72) = 0;
    LODWORD(v8) = PipAddRequestToEdge((_PNP_DEPENDENCY_EDGE *)PoolWithTag, (_UNICODE_STRING **)Request);
    if( v8 )
    {
      PipReferenceDependencyNode(Dependent);
      PipReferenceDependencyNode(Provider);
      v10 = (unsigned __int8)KeAcquireSpinLockRaiseToDpc((UINT64 *)&stru_140C452E0 + 44);
      v11 = (_PNP_DEPENDENCY_NODE *)(v7 + 2);
      v12 = (_PNP_DEPENDENCY_NODE **)*((_QWORD *)Provider + 5);
      if( *v12 != Provider + 8
        || (*(_QWORD *)v11 = Provider + 8,
            v7[3] = v12,
            *v12 = v11,
            *((_QWORD *)Provider + 5) = v11,
            v13 = (_PNP_DEPENDENCY_NODE **)*((_QWORD *)Dependent + 3),
            *v13 != Dependent + 4) )
      {
        __fastfail(3u);
      }
      *v7 = Dependent + 4;
      v7[1] = v13;
      *v13 = (_PNP_DEPENDENCY_NODE *)v7;
      *((_QWORD *)Dependent + 3) = v7;
      KxReleaseSpinLock((UINT64 *)&stru_140C452E0 + 44);
      __writecr8(v10);
      PipNotifyDependenciesChanged(Dependent, Provider);
    }
    else
    {
      ExFreePoolWithTag(v7, 0x53706E50u);
      return 0i64;
    }
  }
  return(_PNP_DEPENDENCY_EDGE *)v7;
}

Referenced by:

PipAddDependencyEdgeBetweenNodes