IoResolveDependency

NTSTATUS __stdcall IoResolveDependency(_UNICODE_STRING *BindingId, _DEVICE_OBJECT *Device){
  int v4; 
  _PNP_DEPENDENCY_NODE *BindingResolution; 
  _PNP_DEPENDENCY_NODE *v6; 
  void *v7; 
  PNP_DEPENDENCY_NODE *v8; 
  _PNP_DEPENDENCY_NODE *v9; 
  _DEVOBJ_EXTENSION *DeviceObjectExtension; 
  _DWORD *DeviceNode; 
  PNP_DEPENDENCY_NODE *v13; 
  _DEVICE_OBJECT *v14; 
  void *DependencyNode; 
  _PNP_DEPENDENCY_NODE *v16; 
  _DEVICE_NODE *v17; 
  _PNP_BINDING_RESOLUTION Query[2]; 
  void *v19; 

  Query[1] = 0;
  v4 = 0;
  PnpAcquireDependencyRelationsLock(1);
  Query[0] = 1;
  v19 = BindingId;
  BindingResolution = PipQueryBindingResolution(Query);
  v6 = BindingResolution;
  if( BindingResolution )
  {
    v14 = (_DEVICE_OBJECT *)*((_QWORD *)BindingResolution + 6);
    if( v14 )
    {
      if( v14 == Device )
        goto LABEL_15;
      v4 = PipDeleteBindingId(v6, BindingId);
      v6 = 0i64;
    }
    if( v6 )
    {
      if( !*((_QWORD *)v6 + 6) )
      {
        if( Device )
          DependencyNode = Device->DeviceObjectExtension->DependencyNode;
        else
          DependencyNode = 0i64;
        if( DependencyNode )
        {
          if( Device )
            v16 = (_PNP_DEPENDENCY_NODE *)Device->DeviceObjectExtension->DependencyNode;
          else
            v16 = 0i64;
          PipMergeDependencyNodes(v16, v6);
        }
        else
        {
          PipLinkDeviceObjectAndDependencyNode(Device, v6);
        }
      }
      goto LABEL_8;
    }
  }
  if( Device )
    v7 = Device->DeviceObjectExtension->DependencyNode;
  else
    v7 = 0i64;
  if( !v7 )
  {
    Query[0] = 0;
    v19 = Device;
    v8 = (PNP_DEPENDENCY_NODE *)PipCreateDependencyNode(Query);
    v9 = v8;
    if( v8 )
    {
      v4 = PipAddBindingId(v8, BindingId);
      if( v4 >= 0 )
      {
        PipDereferenceDependencyNode(v9);
        goto LABEL_8;
      }
      PipUnlinkDeviceObjectAndDependencyNode(Device, v9);
      PipDereferenceDependencyNode(v9);
    }
    else
    {
      v4 = -1073741670;
    }
LABEL_15:
    PnpReleaseDependencyRelationsLock();
    return v4;
  }
  if( Device )
    v13 = (PNP_DEPENDENCY_NODE *)Device->DeviceObjectExtension->DependencyNode;
  else
    v13 = 0i64;
  v4 = PipAddBindingId(v13, BindingId);
  if( v4 < 0 )
    goto LABEL_15;
LABEL_8:
  if( Device )
  {
    DeviceObjectExtension = Device->DeviceObjectExtension;
    DeviceNode = DeviceObjectExtension->DeviceNode;
    if( DeviceNode )
    {
      if( (DeviceNode[99] & 0x20000) == 0 && PipIsProviderStarted((_DEVICE_NODE *)DeviceObjectExtension->DeviceNode) )
        PipAttemptDependentsStart(v17);
    }
  }
  PipAddtoRebuildPowerRelationsQueue(Device);
  PipAddDependentsToRebuildPowerRelationsQueue(Device);
  PnpReleaseDependencyRelationsLock();
  PipProcessRebuildPowerRelationsQueue();
  return v4;
}

Referenced by:

No references.