From: Ivo Ivanov logos128@gmail.com
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 e717106c3ff..dc720759d89 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 2b362abde6c..7c1fa337788 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 8e9fc45ab85..7ee7c6524d4 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: