[PATCH 0/1] MR9685: wineusb.sys: Use the full port path to avoid collisions with identical devices connected to other hubs on the same bus.
From: Ivo Ivanov <logos128(a)gmail.com> --- dlls/wineusb.sys/unixlib.c | 6 +++++- dlls/wineusb.sys/unixlib.h | 2 +- dlls/wineusb.sys/wineusb.c | 13 ++++++++++--- 3 files changed, 16 insertions(+), 5 deletions(-) diff --git a/dlls/wineusb.sys/unixlib.c b/dlls/wineusb.sys/unixlib.c index a42482657b2..34067b6d9b3 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, usb_event.u.added_device.portpath, pp_len)) < 0) + ret = 0; + if (ret < pp_len) + memset(&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..310dc74641d 100644 --- a/dlls/wineusb.sys/unixlib.h +++ b/dlls/wineusb.sys/unixlib.h @@ -43,7 +43,7 @@ struct usb_event { struct unix_device *device; UINT16 vendor, product, revision, usbver; - UINT8 class, subclass, protocol, busnum, portnum; + UINT8 class, subclass, protocol, busnum, portpath[8]; bool interface; INT16 interface_index; } added_device; diff --git a/dlls/wineusb.sys/wineusb.c b/dlls/wineusb.sys/wineusb.c index 4d86fb1cdd4..82f84a97273 100644 --- a/dlls/wineusb.sys/wineusb.c +++ b/dlls/wineusb.sys/wineusb.c @@ -78,7 +78,7 @@ struct usb_device bool interface; int16_t interface_index; - uint8_t class, subclass, protocol, busnum, portnum; + uint8_t class, subclass, protocol, busnum, portpath[8]; uint16_t vendor, product, revision, usbver; @@ -134,7 +134,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; + memcpy(device->portpath, event->portpath, sizeof(event->portpath)); device->vendor = event->vendor; device->product = event->product; @@ -371,7 +371,14 @@ 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); + WCHAR tmp[ARRAY_SIZE(device->portpath)*2+1]; + int i = 0; + + do + swprintf(&tmp[i*2], ARRAY_SIZE(tmp) - (i * 2), L"%02X", device->portpath[i]); + while (++i < ARRAY_SIZE(device->portpath) && device->portpath[i]); + + append_id(buffer, L"%u&%u&%u&%s", device->usbver, device->revision, device->busnum, tmp); } static void get_hardware_ids(const struct usb_device *device, struct string_buffer *buffer) -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/9685
participants (2)
-
Ivo Ivanov -
Ivo Ivanov (@logos128)