Zebediah Figura : wineusb.sys: Implement device and instance IDs.

Alexandre Julliard julliard at winehq.org
Fri Apr 17 16:12:54 CDT 2020


Module: wine
Branch: master
Commit: a66d44b96e81750d33bb1e36cb30239d65e83e0e
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=a66d44b96e81750d33bb1e36cb30239d65e83e0e

Author: Zebediah Figura <z.figura12 at gmail.com>
Date:   Thu Apr 16 19:58:15 2020 -0500

wineusb.sys: Implement device and instance IDs.

Signed-off-by: Zebediah Figura <z.figura12 at gmail.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 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;




More information about the wine-cvs mailing list