Module: wine Branch: master Commit: 647bec85eebceea5cc99771659365b9e1d73bdc8 URL: https://gitlab.winehq.org/wine/wine/-/commit/647bec85eebceea5cc99771659365b9...
Author: Ivo Ivanov logos128@gmail.com Date: Sat Aug 20 07:23:49 2022 +0300
wineusb.sys: Add usbver, revision, busnum and portnum to PDO's instance id.
Makes the device instance id unique (at least to the bus), as required by MS. It is also easily addressable by other drivers.
---
dlls/wineusb.sys/unixlib.c | 3 +++ dlls/wineusb.sys/unixlib.h | 4 ++-- dlls/wineusb.sys/wineusb.c | 15 ++++++++++++--- 3 files changed, 17 insertions(+), 5 deletions(-)
diff --git a/dlls/wineusb.sys/unixlib.c b/dlls/wineusb.sys/unixlib.c index 406049d2fe3..8116e46c67c 100644 --- a/dlls/wineusb.sys/unixlib.c +++ b/dlls/wineusb.sys/unixlib.c @@ -139,9 +139,12 @@ static void add_usb_device(libusb_device *libusb_device) usb_event.u.added_device.vendor = device_desc.idVendor; usb_event.u.added_device.product = device_desc.idProduct; usb_event.u.added_device.revision = device_desc.bcdDevice; + usb_event.u.added_device.usbver = device_desc.bcdUSB; usb_event.u.added_device.class = device_desc.bDeviceClass; 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;
diff --git a/dlls/wineusb.sys/unixlib.h b/dlls/wineusb.sys/unixlib.h index 9941bd138ed..33469f5a2b5 100644 --- a/dlls/wineusb.sys/unixlib.h +++ b/dlls/wineusb.sys/unixlib.h @@ -42,8 +42,8 @@ struct usb_event struct usb_add_device_event { struct unix_device *device; - UINT16 vendor, product, revision; - UINT8 class, subclass, protocol; + UINT16 vendor, product, revision, usbver; + UINT8 class, subclass, protocol, busnum, portnum; bool interface; INT16 interface_index; } added_device; diff --git a/dlls/wineusb.sys/wineusb.c b/dlls/wineusb.sys/wineusb.c index 5447fabacda..f965241d59e 100644 --- a/dlls/wineusb.sys/wineusb.c +++ b/dlls/wineusb.sys/wineusb.c @@ -78,9 +78,9 @@ struct usb_device bool interface; int16_t interface_index;
- uint8_t class, subclass, protocol; + uint8_t class, subclass, protocol, busnum, portnum;
- uint16_t vendor, product, revision; + uint16_t vendor, product, revision, usbver;
struct unix_device *unix_device;
@@ -133,9 +133,13 @@ static void add_unix_device(const struct usb_add_device_event *event) device->class = event->class; device->subclass = event->subclass; device->protocol = event->protocol; + device->busnum = event->busnum; + device->portnum = event->portnum; + device->vendor = event->vendor; device->product = event->product; device->revision = event->revision; + device->usbver = event->usbver;
EnterCriticalSection(&wineusb_cs); list_add_tail(&device_list, &device->entry); @@ -362,6 +366,11 @@ static void get_device_id(const struct usb_device *device, struct string_buffer append_id(buffer, L"USB\VID_%04X&PID_%04X", device->vendor, device->product); }
+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); +} + static void get_hardware_ids(const struct usb_device *device, struct string_buffer *buffer) { if (device->interface) @@ -407,7 +416,7 @@ static NTSTATUS query_id(struct usb_device *device, IRP *irp, BUS_QUERY_ID_TYPE break;
case BusQueryInstanceID: - append_id(&buffer, L"0"); + get_instance_id(device, &buffer); break;
case BusQueryHardwareIDs: