[PATCH 1/5] wineusb.sys: Implement device and instance IDs.

Zebediah Figura z.figura12 at gmail.com
Thu Apr 16 19:58:15 CDT 2020


Signed-off-by: Zebediah Figura <z.figura12 at gmail.com>
---
 dlls/wineusb.sys/wineusb.c | 43 ++++++++++++++++++++++++++++++++++++++
 1 file changed, 43 insertions(+)

diff --git a/dlls/wineusb.sys/wineusb.c b/dlls/wineusb.sys/wineusb.c
index b60d496e9e..918c7a584b 100644
--- a/dlls/wineusb.sys/wineusb.c
+++ b/dlls/wineusb.sys/wineusb.c
@@ -278,15 +278,58 @@ static NTSTATUS fdo_pnp(IRP *irp)
     return IoCallDriver(bus_pdo, irp);
 }
 
+static void get_device_id(const struct usb_device *device, WCHAR *buffer)
+{
+    static const WCHAR formatW[] = {'U','S','B','\\','V','I','D','_','%','0','4','X',
+            '&','P','I','D','_','%','0','4','X',0};
+    struct libusb_device_descriptor desc;
+
+    libusb_get_device_descriptor(device->libusb_device, &desc);
+    sprintfW(buffer, formatW, desc.idVendor, desc.idProduct);
+}
+
+static NTSTATUS query_id(const struct usb_device *device, IRP *irp, BUS_QUERY_ID_TYPE type)
+{
+    WCHAR *id = NULL;
+
+    switch (type)
+    {
+        case BusQueryDeviceID:
+            if ((id = ExAllocatePool(PagedPool, 28 * sizeof(WCHAR))))
+                get_device_id(device, id);
+            break;
+
+        case BusQueryInstanceID:
+            if ((id = ExAllocatePool(PagedPool, 2 * sizeof(WCHAR))))
+            {
+                id[0] = '0';
+                id[1] = 0;
+            }
+            break;
+
+        default:
+            FIXME("Unhandled ID query type %#x.\n", type);
+            return irp->IoStatus.Status;
+    }
+
+    irp->IoStatus.Information = (ULONG_PTR)id;
+    return STATUS_SUCCESS;
+}
+
 static NTSTATUS pdo_pnp(DEVICE_OBJECT *device_obj, IRP *irp)
 {
     IO_STACK_LOCATION *stack = IoGetCurrentIrpStackLocation(irp);
+    struct usb_device *device = device_obj->DeviceExtension;
     NTSTATUS ret = irp->IoStatus.Status;
 
     TRACE("device_obj %p, irp %p, minor function %#x.\n", device_obj, irp, stack->MinorFunction);
 
     switch (stack->MinorFunction)
     {
+        case IRP_MN_QUERY_ID:
+            ret = query_id(device, irp, stack->Parameters.QueryId.IdType);
+            break;
+
         case IRP_MN_START_DEVICE:
         case IRP_MN_QUERY_CAPABILITIES:
             ret = STATUS_SUCCESS;
-- 
2.26.0




More information about the wine-devel mailing list