PipSetDependency

INT64 __fastcall PipSetDependency(INT64 a1, const UNICODE_STRING **a2){
  INT64 *BindingResolution; 
  INT64 *DependencyNode; 
  unsigned int v6; 
  INT64 *v7; 
  INT64 *v8; 
  INT64 v9; 
  UINT64 v10; 
  bool v11; 
  BindingResolution = PipQueryBindingResolution(a1);
  DependencyNode = BindingResolution;
  if( BindingResolution )
  {
    ++*((_DWORD *)BindingResolution + 22);
  }
  else
  {
    DependencyNode = (INT64 *)PipCreateDependencyNode(a1);
    if( !DependencyNode )
      return(unsigned int)-1073741670;
  }
  v7 = PipQueryBindingResolution((INT64)a2);
  v8 = v7;
  if( v7 )
  {
    ++*((_DWORD *)v7 + 22);
    goto LABEL_9;
  }
  v8 = (INT64 *)PipCreateDependencyNode(a2);
  if( v8 )
  {
LABEL_9:
    v6 = PipAddDependencyEdgeBetweenNodes((__int64)DependencyNode, (__int64)v8, a2);
    goto LABEL_10;
  }
  v6 = -1073741670;
LABEL_10:
  v11 = (*((_DWORD *)DependencyNode + 22))-- == 1;
  if( v11 )
    PipDeleteDependencyNode(DependencyNode, v9, v10);
  if( v8 )
  {
    v11 = (*((_DWORD *)v8 + 22))-- == 1;
    if( v11 )
      PipDeleteDependencyNode(v8, v9, v10);
  }
  return v6;
}

Referenced by:

IoReserveDependency
IoSetDependency
PipConvertResolutionsToReservations