From: Ivo Ivanov <logos128(a)gmail.com> --- dlls/wineusb.sys/unixlib.c | 6 +++++- dlls/wineusb.sys/unixlib.h | 3 ++- dlls/wineusb.sys/wineusb.c | 8 +++++--- 3 files changed, 12 insertions(+), 5 deletions(-) diff --git a/dlls/wineusb.sys/unixlib.c b/dlls/wineusb.sys/unixlib.c index a42482657b2..4ae35f34e13 100644 --- a/dlls/wineusb.sys/unixlib.c +++ b/dlls/wineusb.sys/unixlib.c @@ -112,6 +112,7 @@ static void add_usb_device(libusb_device *libusb_device) struct libusb_device_descriptor device_desc; struct unix_device *unix_device; struct usb_event usb_event; + const size_t pp_len = sizeof(usb_event.u.added_device.portpath); int ret; libusb_get_device_descriptor(libusb_device, &device_desc); @@ -144,9 +145,12 @@ static void add_usb_device(libusb_device *libusb_device) usb_event.u.added_device.subclass = device_desc.bDeviceSubClass; usb_event.u.added_device.protocol = device_desc.bDeviceProtocol; usb_event.u.added_device.busnum = libusb_get_bus_number(libusb_device); - usb_event.u.added_device.portnum = libusb_get_port_number(libusb_device); usb_event.u.added_device.interface = false; usb_event.u.added_device.interface_index = -1; + if ((ret = libusb_get_port_numbers(libusb_device, (uint8_t *)&usb_event.u.added_device.portpath, pp_len)) < 0) + ret = 0; + if (ret < pp_len) + memset((uint8_t *)&usb_event.u.added_device.portpath + ret, 0, pp_len - ret); if (!(ret = libusb_get_active_config_descriptor(libusb_device, &config_desc))) { diff --git a/dlls/wineusb.sys/unixlib.h b/dlls/wineusb.sys/unixlib.h index 33469f5a2b5..b5138f2011a 100644 --- a/dlls/wineusb.sys/unixlib.h +++ b/dlls/wineusb.sys/unixlib.h @@ -43,7 +43,8 @@ struct usb_event { struct unix_device *device; UINT16 vendor, product, revision, usbver; - UINT8 class, subclass, protocol, busnum, portnum; + UINT8 class, subclass, protocol, busnum; + UINT64 portpath; bool interface; INT16 interface_index; } added_device; diff --git a/dlls/wineusb.sys/wineusb.c b/dlls/wineusb.sys/wineusb.c index 4d86fb1cdd4..44ee1c34607 100644 --- a/dlls/wineusb.sys/wineusb.c +++ b/dlls/wineusb.sys/wineusb.c @@ -78,7 +78,8 @@ struct usb_device bool interface; int16_t interface_index; - uint8_t class, subclass, protocol, busnum, portnum; + uint8_t class, subclass, protocol, busnum; + uint64_t portpath; uint16_t vendor, product, revision, usbver; @@ -134,7 +135,7 @@ static void add_unix_device(const struct usb_add_device_event *event) device->subclass = event->subclass; device->protocol = event->protocol; device->busnum = event->busnum; - device->portnum = event->portnum; + device->portpath = event->portpath; device->vendor = event->vendor; device->product = event->product; @@ -371,7 +372,8 @@ static void get_device_id(const struct usb_device *device, struct string_buffer static void get_instance_id(const struct usb_device *device, struct string_buffer *buffer) { - append_id(buffer, L"%u&%u&%u&%u", device->usbver, device->revision, device->busnum, device->portnum); + append_id(buffer, L"%u&%u&%u&%llx", device->usbver, device->revision, + device->busnum, device->portpath); } static void get_hardware_ids(const struct usb_device *device, struct string_buffer *buffer) -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/9685