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