Claire Girka : hidclass: Expose ContainerID from underlying driver.

Alexandre Julliard julliard at winehq.org
Mon Jul 25 16:18:24 CDT 2022


Module: wine
Branch: master
Commit: bfb7fe4bfb050ca59dc0dec74a29e70b43b5f74a
URL:    https://gitlab.winehq.org/wine/wine/-/commit/bfb7fe4bfb050ca59dc0dec74a29e70b43b5f74a

Author: Claire Girka <claire at sitedethib.com>
Date:   Tue Jul 12 12:44:39 2022 +0200

hidclass: Expose ContainerID from underlying driver.

---

 dlls/hidclass.sys/hid.h |  1 +
 dlls/hidclass.sys/pnp.c | 17 ++++++++++++++++-
 2 files changed, 17 insertions(+), 1 deletion(-)

diff --git a/dlls/hidclass.sys/hid.h b/dlls/hidclass.sys/hid.h
index e20f12809eb..b8cec55fb7c 100644
--- a/dlls/hidclass.sys/hid.h
+++ b/dlls/hidclass.sys/hid.h
@@ -81,6 +81,7 @@ typedef struct _BASE_DEVICE_EXTENSION
      * for convenience. */
     WCHAR device_id[MAX_DEVICE_ID_LEN];
     WCHAR instance_id[MAX_DEVICE_ID_LEN];
+    WCHAR container_id[MAX_GUID_STRING_LEN];
     const GUID *class_guid;
 
     BOOL is_fdo;
diff --git a/dlls/hidclass.sys/pnp.c b/dlls/hidclass.sys/pnp.c
index d2d3dc25b95..91624b40eff 100644
--- a/dlls/hidclass.sys/pnp.c
+++ b/dlls/hidclass.sys/pnp.c
@@ -173,6 +173,9 @@ static NTSTATUS WINAPI driver_add_device(DRIVER_OBJECT *driver, DEVICE_OBJECT *b
     swprintf(ext->device_id, ARRAY_SIZE(ext->device_id), L"HID\\%s", wcsrchr(device_id, '\\') + 1);
     wcscpy(ext->instance_id, instance_id);
 
+    if (get_device_id(bus_pdo, BusQueryContainerID, ext->container_id))
+        ext->container_id[0] = 0;
+
     is_xinput_class = !wcsncmp(device_id, L"WINEXINPUT\\", 7) && wcsstr(device_id, L"&XI_") != NULL;
     if (is_xinput_class) ext->class_guid = &GUID_DEVINTERFACE_WINEXINPUT;
     else ext->class_guid = &GUID_DEVINTERFACE_HID;
@@ -229,6 +232,7 @@ static void create_child(minidriver *minidriver, DEVICE_OBJECT *fdo)
     KeInitializeSpinLock( &pdo_ext->u.pdo.queues_lock );
     wcscpy(pdo_ext->device_id, fdo_ext->device_id);
     wcscpy(pdo_ext->instance_id, fdo_ext->instance_id);
+    wcscpy(pdo_ext->container_id, fdo_ext->container_id);
     pdo_ext->class_guid = fdo_ext->class_guid;
 
     pdo_ext->u.pdo.information.VendorID = attr.VendorID;
@@ -416,8 +420,19 @@ static NTSTATUS pdo_pnp(DEVICE_OBJECT *device, IRP *irp)
                     irp->IoStatus.Information = (ULONG_PTR)id;
                     status = STATUS_SUCCESS;
                     break;
-
                 case BusQueryContainerID:
+                    if (ext->container_id[0])
+                    {
+                        lstrcpyW(id, ext->container_id);
+                        irp->IoStatus.Information = (ULONG_PTR)id;
+                        status = STATUS_SUCCESS;
+                    }
+                    else
+                    {
+                        ExFreePool(id);
+                    }
+                    break;
+
                 case BusQueryDeviceSerialNumber:
                     FIXME("unimplemented id type %#x\n", irpsp->Parameters.QueryId.IdType);
                     ExFreePool(id);




More information about the wine-cvs mailing list