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.
This commit is contained in:
Ivo Ivanov 2022-08-20 07:23:49 +03:00 committed by Alexandre Julliard
parent a51af111ab
commit 647bec85ee
3 changed files with 17 additions and 5 deletions

View file

@ -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;

View file

@ -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;

View file

@ -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: