IoDuplicateDependency

NTSTATUS __stdcall IoDuplicateDependency(_DEVICE_OBJECT *ProviderPdo, _DEVICE_OBJECT *NewProviderPdo){
  NTSTATUS v2; 
  _PNP_DEPENDENCY_NODE *BindingResolution; 
  PNP_DEPENDENCY_NODE *DependencyNode; 
  _LIST_ENTRY *DependentList; 
  _LIST_ENTRY *Flink; 
  PNP_DEPENDENCY_EDGE *v9; 
  NTSTATUS v10; 
  _PNP_BINDING_RESOLUTION Query[2]; 
  _DEVICE_OBJECT *v14; 

  v2 = 0;
  Query[1] = 0;
  if( ProviderPdo && NewProviderPdo )
  {
    PnpAcquireDependencyRelationsLock(1);
    if( !ProviderPdo->DeviceObjectExtension->DependencyNode )
    {
LABEL_4:
      ExReleaseResourceLite((PERESOURCE)((char *)&stru_140C452E0 + 384));
      PpDevNodeUnlockTree(PPL_SIMPLE_READ);
      return v2;
    }
    Query[0] = 0;
    v14 = NewProviderPdo;
    BindingResolution = PipQueryBindingResolution(Query);
    DependencyNode = BindingResolution;
    if( BindingResolution )
    {
      ++BindingResolution[22];
    }
    else
    {
      DependencyNode = (PNP_DEPENDENCY_NODE *)PipCreateDependencyNode(Query);
      if( !DependencyNode )
      {
        v2 = -1073741670;
        goto LABEL_4;
      }
    }
    DependentList = PiGetDependentList(ProviderPdo);
    Flink = DependentList->Flink;
    if( DependentList->Flink != DependentList )
    {
      while( 1 )
      {
        v9 = PiListEntryToDependencyEdge(Flink, DependentList);
        Flink = Flink->Flink;
        v10 = PipDependencyCopyEdge(v9, DependencyNode);
        if( v10 < 0 )
          break;
        if( Flink == DependentList )
          goto LABEL_14;
      }
      v2 = v10;
    }
LABEL_14:
    if( DependencyNode[22]-- == 1 )
      PipDeleteDependencyNode(DependencyNode);
    PipAddDependentsToRebuildPowerRelationsQueue(NewProviderPdo);
    ExReleaseResourceLite((PERESOURCE)((char *)&stru_140C452E0 + 384));
    PpDevNodeUnlockTree(PPL_SIMPLE_READ);
    PipProcessRebuildPowerRelationsQueue();
    return v2;
  }
  return -1073741811;
}

Referenced by:

No references.