IoDuplicateDependency

INT64 __fastcall IoDuplicateDependency(_DEVICE_OBJECT *ProviderPdo, _DEVICE_OBJECT *NewProviderPdo){
  unsigned int v2; 
  INT64 *BindingResolution; 
  INT64 *v6; 
  INT64 v7; 
  UINT64 v8; 
  LIST_ENTRY *DependentList; 
  LIST_ENTRY *Flink; 
  INT64 v11; 
  int v12; 
  INT64 a1; 
  _DEVICE_OBJECT *v16; 
  v2 = 0;
  HIDWORD(a1) = 0;
  if( ProviderPdo && NewProviderPdo )
  {
    PnpAcquireDependencyRelationsLock(1u);
    if( !*(_QWORD *)(*((_QWORD *)ProviderPdo + 39) + 80i64) )
    {
LABEL_4:
      ExReleaseResourceLite(&PiDependencyRelationsLock);
      PpDevNodeUnlockTree(0);
      return v2;
    }
    LODWORD(a1) = 0;
    v16 = NewProviderPdo;
    BindingResolution = PipQueryBindingResolution((INT64)&a1);
    v6 = BindingResolution;
    if( BindingResolution )
    {
      ++*((_DWORD *)BindingResolution + 22);
    }
    else
    {
      v6 = (INT64 *)PipCreateDependencyNode(&a1);
      if( !v6 )
      {
        v2 = -1073741670;
        goto LABEL_4;
      }
    }
    DependentList = PiGetDependentList(ProviderPdo);
    Flink = DependentList->Flink;
    if( DependentList->Flink != DependentList )
    {
      while( 1 )
      {
        v11 = PiListEntryToDependencyEdge((INT64)Flink, 1i64);
        Flink = Flink->Flink;
        v12 = PipDependencyCopyEdge(v11, (INT64)v6);
        if( v12 < 0 )
          break;
        if( Flink == DependentList )
          goto LABEL_14;
      }
      v2 = v12;
    }
LABEL_14:
    if( (*((_DWORD *)v6 + 22))-- == 1 )
      PipDeleteDependencyNode(v6, v7, v8);
    PipAddDependentsToRebuildPowerRelationsQueue(NewProviderPdo);
    ExReleaseResourceLite(&PiDependencyRelationsLock);
    PpDevNodeUnlockTree(0);
    PipProcessRebuildPowerRelationsQueue();
    return v2;
  }
  return 3221225485i64;
}

Referenced by:

No references.