[PATCH v2 6/9] ntoskrnl.exe/tests: Read the HID report descriptor from the registry.

Rémi Bernon rbernon at codeweavers.com
Thu Sep 2 04:00:41 CDT 2021


Signed-off-by: Rémi Bernon <rbernon at codeweavers.com>
---
 dlls/ntoskrnl.exe/tests/driver_hid.c | 268 ++-------------------------
 dlls/ntoskrnl.exe/tests/ntoskrnl.c   | 250 +++++++++++++++++++++++++
 2 files changed, 265 insertions(+), 253 deletions(-)

diff --git a/dlls/ntoskrnl.exe/tests/driver_hid.c b/dlls/ntoskrnl.exe/tests/driver_hid.c
index ed0767877ac..590483f528f 100644
--- a/dlls/ntoskrnl.exe/tests/driver_hid.c
+++ b/dlls/ntoskrnl.exe/tests/driver_hid.c
@@ -40,6 +40,8 @@
 static UNICODE_STRING control_symlink;
 
 static unsigned int got_start_device;
+static char report_descriptor_buf[4096];
+static DWORD report_descriptor_len;
 static DWORD report_id;
 static DWORD polled;
 
@@ -161,253 +163,6 @@ static NTSTATUS WINAPI driver_power(DEVICE_OBJECT *device, IRP *irp)
 
 static NTSTATUS WINAPI driver_internal_ioctl(DEVICE_OBJECT *device, IRP *irp)
 {
-#include "psh_hid_macros.h"
-/* Replace REPORT_ID with USAGE_PAGE when id is 0 */
-#define REPORT_ID_OR_USAGE_PAGE(size, id, off) SHORT_ITEM_1((id ? 8 : 0), 1, (id + off))
-    const unsigned char report_descriptor[] =
-    {
-        USAGE_PAGE(1, HID_USAGE_PAGE_GENERIC),
-        USAGE(1, HID_USAGE_GENERIC_JOYSTICK),
-        COLLECTION(1, Application),
-            USAGE(1, HID_USAGE_GENERIC_JOYSTICK),
-            COLLECTION(1, Logical),
-                REPORT_ID_OR_USAGE_PAGE(1, report_id, 0),
-                USAGE_PAGE(1, HID_USAGE_PAGE_GENERIC),
-                USAGE(1, HID_USAGE_GENERIC_X),
-                USAGE(1, HID_USAGE_GENERIC_Y),
-                LOGICAL_MINIMUM(1, -128),
-                LOGICAL_MAXIMUM(1, 127),
-                REPORT_SIZE(1, 8),
-                REPORT_COUNT(1, 2),
-                INPUT(1, Data|Var|Abs),
-
-                USAGE_PAGE(1, HID_USAGE_PAGE_BUTTON),
-                USAGE_MINIMUM(1, 1),
-                USAGE_MAXIMUM(1, 8),
-                LOGICAL_MINIMUM(1, 0),
-                LOGICAL_MAXIMUM(1, 1),
-                REPORT_COUNT(1, 8),
-                REPORT_SIZE(1, 1),
-                INPUT(1, Data|Var|Abs),
-
-                USAGE_MINIMUM(1, 0x18),
-                USAGE_MAXIMUM(1, 0x1f),
-                LOGICAL_MINIMUM(1, 0),
-                LOGICAL_MAXIMUM(1, 1),
-                REPORT_COUNT(1, 8),
-                REPORT_SIZE(1, 1),
-                INPUT(1, Cnst|Var|Abs),
-                REPORT_COUNT(1, 8),
-                REPORT_SIZE(1, 1),
-                INPUT(1, Cnst|Var|Abs),
-                /* needs to be 8 bit aligned as next has Buff */
-
-                USAGE_MINIMUM(4, (HID_USAGE_PAGE_KEYBOARD<<16)|0x8),
-                USAGE_MAXIMUM(4, (HID_USAGE_PAGE_KEYBOARD<<16)|0xf),
-                LOGICAL_MINIMUM(1, 0),
-                LOGICAL_MAXIMUM(1, 8),
-                REPORT_COUNT(1, 2),
-                REPORT_SIZE(1, 8),
-                INPUT(2, Data|Ary|Rel|Wrap|Lin|Pref|Null|Vol|Buff),
-
-                /* needs to be 8 bit aligned as previous has Buff */
-                USAGE(1, 0x20),
-                LOGICAL_MINIMUM(1, 0),
-                LOGICAL_MAXIMUM(1, 1),
-                REPORT_COUNT(1, 8),
-                REPORT_SIZE(1, 1),
-                INPUT(1, Data|Var|Abs),
-                USAGE_MINIMUM(1, 0x21),
-                USAGE_MAXIMUM(1, 0x22),
-                REPORT_COUNT(1, 2),
-                REPORT_SIZE(1, 0),
-                INPUT(1, Data|Var|Abs),
-                USAGE(1, 0x23),
-                REPORT_COUNT(1, 0),
-                REPORT_SIZE(1, 1),
-                INPUT(1, Data|Var|Abs),
-
-                USAGE_PAGE(1, HID_USAGE_PAGE_GENERIC),
-                USAGE(1, HID_USAGE_GENERIC_HATSWITCH),
-                LOGICAL_MINIMUM(1, 1),
-                LOGICAL_MAXIMUM(1, 8),
-                REPORT_SIZE(1, 4),
-                REPORT_COUNT(1, 2),
-                INPUT(1, Data|Var|Abs),
-
-                USAGE_PAGE(1, HID_USAGE_PAGE_GENERIC),
-                USAGE(1, HID_USAGE_GENERIC_Z),
-                LOGICAL_MINIMUM(4, 0x00000000),
-                LOGICAL_MAXIMUM(4, 0x3fffffff),
-                PHYSICAL_MINIMUM(4, 0x80000000),
-                PHYSICAL_MAXIMUM(4, 0x7fffffff),
-                REPORT_SIZE(1, 32),
-                REPORT_COUNT(1, 1),
-                INPUT(1, Data|Var|Abs),
-
-                /* reset physical range to its default interpretation */
-                USAGE_PAGE(1, HID_USAGE_PAGE_GENERIC),
-                USAGE(1, HID_USAGE_GENERIC_RX),
-                PHYSICAL_MINIMUM(4, 0),
-                PHYSICAL_MAXIMUM(4, 0),
-                REPORT_SIZE(1, 32),
-                REPORT_COUNT(1, 1),
-                INPUT(1, Data|Var|Abs),
-
-                USAGE_PAGE(1, HID_USAGE_PAGE_GENERIC),
-                USAGE(1, HID_USAGE_GENERIC_RY),
-                LOGICAL_MINIMUM(4, 0x7fff),
-                LOGICAL_MAXIMUM(4, 0x0000),
-                PHYSICAL_MINIMUM(4, 0x0000),
-                PHYSICAL_MAXIMUM(4, 0x7fff),
-                REPORT_SIZE(1, 32),
-                REPORT_COUNT(1, 1),
-                INPUT(1, Data|Var|Abs),
-            END_COLLECTION,
-
-            USAGE_PAGE(1, HID_USAGE_PAGE_GENERIC),
-            USAGE(1, HID_USAGE_GENERIC_JOYSTICK),
-            COLLECTION(1, Report),
-                REPORT_ID_OR_USAGE_PAGE(1, report_id, 1),
-                USAGE_PAGE(1, HID_USAGE_PAGE_BUTTON),
-                USAGE_MINIMUM(1, 9),
-                USAGE_MAXIMUM(1, 10),
-                LOGICAL_MINIMUM(1, 0),
-                LOGICAL_MAXIMUM(1, 1),
-                REPORT_COUNT(1, 8),
-                REPORT_SIZE(1, 1),
-                INPUT(1, Data|Var|Abs),
-            END_COLLECTION,
-
-            USAGE_PAGE(1, HID_USAGE_PAGE_LED),
-            USAGE(1, HID_USAGE_LED_GREEN),
-            COLLECTION(1, Report),
-                REPORT_ID_OR_USAGE_PAGE(1, report_id, 0),
-                USAGE_PAGE(1, HID_USAGE_PAGE_LED),
-                USAGE(1, 1),
-                USAGE(1, 2),
-                USAGE(1, 3),
-                USAGE(1, 4),
-                USAGE(1, 5),
-                USAGE(1, 6),
-                USAGE(1, 7),
-                USAGE(1, 8),
-                LOGICAL_MINIMUM(1, 0),
-                LOGICAL_MAXIMUM(1, 1),
-                PHYSICAL_MINIMUM(1, 0),
-                PHYSICAL_MAXIMUM(1, 1),
-                REPORT_COUNT(1, 8),
-                REPORT_SIZE(1, 1),
-                INPUT(1, Data|Var|Abs),
-
-                USAGE(4, (HID_USAGE_PAGE_KEYBOARD<<16)|0x8c),
-                USAGE(4, (HID_USAGE_PAGE_KEYBOARD<<16)|0x8d),
-                USAGE(4, (HID_USAGE_PAGE_KEYBOARD<<16)|0x8e),
-                USAGE(4, (HID_USAGE_PAGE_KEYBOARD<<16)|0x8f),
-                LOGICAL_MINIMUM(1, 1),
-                LOGICAL_MAXIMUM(1, 16),
-                REPORT_COUNT(1, 2),
-                REPORT_SIZE(1, 8),
-                INPUT(1, Data|Ary|Abs),
-            END_COLLECTION,
-
-            USAGE_PAGE(2, HID_USAGE_PAGE_HAPTICS),
-            USAGE(1, HID_USAGE_HAPTICS_SIMPLE_CONTROLLER),
-            COLLECTION(1, Logical),
-                REPORT_ID_OR_USAGE_PAGE(1, report_id, 0),
-                USAGE_PAGE(2, HID_USAGE_PAGE_HAPTICS),
-
-                USAGE(1, HID_USAGE_HAPTICS_WAVEFORM_LIST),
-                COLLECTION(1, NamedArray),
-                    USAGE_PAGE(1, HID_USAGE_PAGE_ORDINAL),
-                    USAGE(1, 3), /* HID_USAGE_HAPTICS_WAVEFORM_RUMBLE */
-                    USAGE(1, 4), /* HID_USAGE_HAPTICS_WAVEFORM_BUZZ */
-                    LOGICAL_MINIMUM(2, 0x0000),
-                    LOGICAL_MAXIMUM(2, 0xffff),
-                    REPORT_COUNT(1, 2),
-                    REPORT_SIZE(1, 16),
-                    FEATURE(1, Data|Var|Abs|Null),
-                END_COLLECTION,
-
-                USAGE_PAGE(2, HID_USAGE_PAGE_HAPTICS),
-                USAGE(1, HID_USAGE_HAPTICS_DURATION_LIST),
-                COLLECTION(1, NamedArray),
-                    USAGE_PAGE(1, HID_USAGE_PAGE_ORDINAL),
-                    USAGE(1, 3), /* 0 (HID_USAGE_HAPTICS_WAVEFORM_RUMBLE) */
-                    USAGE(1, 4), /* 0 (HID_USAGE_HAPTICS_WAVEFORM_BUZZ) */
-                    LOGICAL_MINIMUM(2, 0x0000),
-                    LOGICAL_MAXIMUM(2, 0xffff),
-                    REPORT_COUNT(1, 2),
-                    REPORT_SIZE(1, 16),
-                    FEATURE(1, Data|Var|Abs|Null),
-                END_COLLECTION,
-
-                USAGE_PAGE(2, HID_USAGE_PAGE_HAPTICS),
-                USAGE(1, HID_USAGE_HAPTICS_WAVEFORM_CUTOFF_TIME),
-                UNIT(2, 0x1001), /* seconds */
-                UNIT_EXPONENT(1, -3), /* 10^-3 */
-                LOGICAL_MINIMUM(2, 0x8000),
-                LOGICAL_MAXIMUM(2, 0x7fff),
-                PHYSICAL_MINIMUM(4, 0x00000000),
-                PHYSICAL_MAXIMUM(4, 0xffffffff),
-                REPORT_SIZE(1, 32),
-                REPORT_COUNT(1, 2),
-                FEATURE(1, Data|Var|Abs),
-                /* reset global items */
-                UNIT(1, 0), /* None */
-                UNIT_EXPONENT(1, 0),
-
-                USAGE_PAGE(1, HID_USAGE_PAGE_GENERIC),
-                USAGE(1, HID_USAGE_GENERIC_Z),
-                LOGICAL_MINIMUM(4, 0x0000),
-                LOGICAL_MAXIMUM(4, 0x7fff),
-                PHYSICAL_MINIMUM(4, 0xfff90000),
-                PHYSICAL_MAXIMUM(4, 0x0003ffff),
-                REPORT_SIZE(1, 32),
-                REPORT_COUNT(1, 1),
-                FEATURE(1, Data|Var|Abs),
-            END_COLLECTION,
-
-            USAGE_PAGE(1, HID_USAGE_PAGE_GENERIC),
-            USAGE(1, HID_USAGE_GENERIC_JOYSTICK),
-            COLLECTION(1, Report),
-                REPORT_ID_OR_USAGE_PAGE(1, report_id, 1),
-                USAGE_PAGE(1, HID_USAGE_PAGE_BUTTON),
-                USAGE_MINIMUM(1, 9),
-                USAGE_MAXIMUM(1, 10),
-                LOGICAL_MINIMUM(1, 0),
-                LOGICAL_MAXIMUM(1, 1),
-                PHYSICAL_MINIMUM(1, 0),
-                PHYSICAL_MAXIMUM(1, 1),
-                REPORT_COUNT(1, 8),
-                REPORT_SIZE(1, 1),
-                FEATURE(1, Data|Var|Abs),
-            END_COLLECTION,
-
-            USAGE_PAGE(1, HID_USAGE_PAGE_LED),
-            USAGE(1, HID_USAGE_LED_GREEN),
-            COLLECTION(1, Report),
-                REPORT_ID_OR_USAGE_PAGE(1, report_id, 0),
-                USAGE_PAGE(1, HID_USAGE_PAGE_LED),
-                REPORT_COUNT(1, 8),
-                REPORT_SIZE(1, 1),
-                OUTPUT(1, Cnst|Var|Abs),
-            END_COLLECTION,
-
-            USAGE_PAGE(1, HID_USAGE_PAGE_LED),
-            USAGE(1, HID_USAGE_LED_RED),
-            COLLECTION(1, Report),
-                REPORT_ID_OR_USAGE_PAGE(1, report_id, 1),
-                USAGE_PAGE(1, HID_USAGE_PAGE_LED),
-                REPORT_COUNT(1, 8),
-                REPORT_SIZE(1, 1),
-                OUTPUT(1, Cnst|Var|Abs),
-            END_COLLECTION,
-        END_COLLECTION,
-    };
-#undef REPORT_ID_OR_USAGE_PAGE
-#include "pop_hid_macros.h"
-
     IO_STACK_LOCATION *stack = IoGetCurrentIrpStackLocation(irp);
     HID_DEVICE_EXTENSION *ext = device->DeviceExtension;
     struct hid_device *impl = ext->MiniDeviceExtension;
@@ -455,7 +210,7 @@ static NTSTATUS WINAPI driver_internal_ioctl(DEVICE_OBJECT *device, IRP *irp)
                 desc->bCountry = 0;
                 desc->bNumDescriptors = 1;
                 desc->DescriptorList[0].bReportType = HID_REPORT_DESCRIPTOR_TYPE;
-                desc->DescriptorList[0].wReportLength = sizeof(report_descriptor);
+                desc->DescriptorList[0].wReportLength = report_descriptor_len;
                 irp->IoStatus.Information = sizeof(*desc);
             }
             ret = STATUS_SUCCESS;
@@ -464,12 +219,12 @@ static NTSTATUS WINAPI driver_internal_ioctl(DEVICE_OBJECT *device, IRP *irp)
 
         case IOCTL_HID_GET_REPORT_DESCRIPTOR:
             ok(!in_size, "got input size %u\n", in_size);
-            ok(out_size == sizeof(report_descriptor), "got output size %u\n", out_size);
+            ok(out_size == report_descriptor_len, "got output size %u\n", out_size);
 
-            if (out_size == sizeof(report_descriptor))
+            if (out_size == report_descriptor_len)
             {
-                memcpy(irp->UserBuffer, report_descriptor, sizeof(report_descriptor));
-                irp->IoStatus.Information = sizeof(report_descriptor);
+                memcpy(irp->UserBuffer, report_descriptor_buf, report_descriptor_len);
+                irp->IoStatus.Information = report_descriptor_len;
             }
             ret = STATUS_SUCCESS;
             break;
@@ -679,7 +434,7 @@ static void WINAPI driver_unload(DRIVER_OBJECT *driver)
 NTSTATUS WINAPI DriverEntry(DRIVER_OBJECT *driver, UNICODE_STRING *registry)
 {
     static const int info_size = offsetof( KEY_VALUE_PARTIAL_INFORMATION, Data );
-    char buffer[offsetof( KEY_VALUE_PARTIAL_INFORMATION, Data ) + sizeof(DWORD)];
+    char buffer[offsetof( KEY_VALUE_PARTIAL_INFORMATION, Data ) + sizeof(report_descriptor_buf)];
     HID_MINIDRIVER_REGISTRATION params =
     {
         .Revision = HID_REVISION,
@@ -713,6 +468,13 @@ NTSTATUS WINAPI DriverEntry(DRIVER_OBJECT *driver, UNICODE_STRING *registry)
     memcpy(&polled, buffer + info_size, size - info_size);
     params.DevicesArePolled = polled;
 
+    RtlInitUnicodeString(&name_str, L"Descriptor");
+    size = info_size + sizeof(report_descriptor_buf);
+    ret = ZwQueryValueKey(hkey, &name_str, KeyValuePartialInformation, buffer, size, &size);
+    ok(!ret, "ZwQueryValueKey returned %#x\n", ret);
+    memcpy(report_descriptor_buf, buffer + info_size, size - info_size);
+    report_descriptor_len = size - info_size;
+
     driver->DriverExtension->AddDevice = driver_add_device;
     driver->DriverUnload = driver_unload;
     driver->MajorFunction[IRP_MJ_PNP] = driver_pnp;
diff --git a/dlls/ntoskrnl.exe/tests/ntoskrnl.c b/dlls/ntoskrnl.exe/tests/ntoskrnl.c
index cf4b9d811cb..adb5b05aa90 100644
--- a/dlls/ntoskrnl.exe/tests/ntoskrnl.c
+++ b/dlls/ntoskrnl.exe/tests/ntoskrnl.c
@@ -3347,6 +3347,253 @@ static void test_hid_device(DWORD report_id, DWORD polled)
 
 static void test_hid_driver(struct testsign_context *ctx, DWORD report_id, DWORD polled)
 {
+#include "psh_hid_macros.h"
+/* Replace REPORT_ID with USAGE_PAGE when id is 0 */
+#define REPORT_ID_OR_USAGE_PAGE(size, id, off) SHORT_ITEM_1((id ? 8 : 0), 1, (id + off))
+    const unsigned char report_descriptor[] =
+    {
+        USAGE_PAGE(1, HID_USAGE_PAGE_GENERIC),
+        USAGE(1, HID_USAGE_GENERIC_JOYSTICK),
+        COLLECTION(1, Application),
+            USAGE(1, HID_USAGE_GENERIC_JOYSTICK),
+            COLLECTION(1, Logical),
+                REPORT_ID_OR_USAGE_PAGE(1, report_id, 0),
+                USAGE_PAGE(1, HID_USAGE_PAGE_GENERIC),
+                USAGE(1, HID_USAGE_GENERIC_X),
+                USAGE(1, HID_USAGE_GENERIC_Y),
+                LOGICAL_MINIMUM(1, -128),
+                LOGICAL_MAXIMUM(1, 127),
+                REPORT_SIZE(1, 8),
+                REPORT_COUNT(1, 2),
+                INPUT(1, Data|Var|Abs),
+
+                USAGE_PAGE(1, HID_USAGE_PAGE_BUTTON),
+                USAGE_MINIMUM(1, 1),
+                USAGE_MAXIMUM(1, 8),
+                LOGICAL_MINIMUM(1, 0),
+                LOGICAL_MAXIMUM(1, 1),
+                REPORT_COUNT(1, 8),
+                REPORT_SIZE(1, 1),
+                INPUT(1, Data|Var|Abs),
+
+                USAGE_MINIMUM(1, 0x18),
+                USAGE_MAXIMUM(1, 0x1f),
+                LOGICAL_MINIMUM(1, 0),
+                LOGICAL_MAXIMUM(1, 1),
+                REPORT_COUNT(1, 8),
+                REPORT_SIZE(1, 1),
+                INPUT(1, Cnst|Var|Abs),
+                REPORT_COUNT(1, 8),
+                REPORT_SIZE(1, 1),
+                INPUT(1, Cnst|Var|Abs),
+                /* needs to be 8 bit aligned as next has Buff */
+
+                USAGE_MINIMUM(4, (HID_USAGE_PAGE_KEYBOARD<<16)|0x8),
+                USAGE_MAXIMUM(4, (HID_USAGE_PAGE_KEYBOARD<<16)|0xf),
+                LOGICAL_MINIMUM(1, 0),
+                LOGICAL_MAXIMUM(1, 8),
+                REPORT_COUNT(1, 2),
+                REPORT_SIZE(1, 8),
+                INPUT(2, Data|Ary|Rel|Wrap|Lin|Pref|Null|Vol|Buff),
+
+                /* needs to be 8 bit aligned as previous has Buff */
+                USAGE(1, 0x20),
+                LOGICAL_MINIMUM(1, 0),
+                LOGICAL_MAXIMUM(1, 1),
+                REPORT_COUNT(1, 8),
+                REPORT_SIZE(1, 1),
+                INPUT(1, Data|Var|Abs),
+                USAGE_MINIMUM(1, 0x21),
+                USAGE_MAXIMUM(1, 0x22),
+                REPORT_COUNT(1, 2),
+                REPORT_SIZE(1, 0),
+                INPUT(1, Data|Var|Abs),
+                USAGE(1, 0x23),
+                REPORT_COUNT(1, 0),
+                REPORT_SIZE(1, 1),
+                INPUT(1, Data|Var|Abs),
+
+                USAGE_PAGE(1, HID_USAGE_PAGE_GENERIC),
+                USAGE(1, HID_USAGE_GENERIC_HATSWITCH),
+                LOGICAL_MINIMUM(1, 1),
+                LOGICAL_MAXIMUM(1, 8),
+                REPORT_SIZE(1, 4),
+                REPORT_COUNT(1, 2),
+                INPUT(1, Data|Var|Abs),
+
+                USAGE_PAGE(1, HID_USAGE_PAGE_GENERIC),
+                USAGE(1, HID_USAGE_GENERIC_Z),
+                LOGICAL_MINIMUM(4, 0x00000000),
+                LOGICAL_MAXIMUM(4, 0x3fffffff),
+                PHYSICAL_MINIMUM(4, 0x80000000),
+                PHYSICAL_MAXIMUM(4, 0x7fffffff),
+                REPORT_SIZE(1, 32),
+                REPORT_COUNT(1, 1),
+                INPUT(1, Data|Var|Abs),
+
+                /* reset physical range to its default interpretation */
+                USAGE_PAGE(1, HID_USAGE_PAGE_GENERIC),
+                USAGE(1, HID_USAGE_GENERIC_RX),
+                PHYSICAL_MINIMUM(4, 0),
+                PHYSICAL_MAXIMUM(4, 0),
+                REPORT_SIZE(1, 32),
+                REPORT_COUNT(1, 1),
+                INPUT(1, Data|Var|Abs),
+
+                USAGE_PAGE(1, HID_USAGE_PAGE_GENERIC),
+                USAGE(1, HID_USAGE_GENERIC_RY),
+                LOGICAL_MINIMUM(4, 0x7fff),
+                LOGICAL_MAXIMUM(4, 0x0000),
+                PHYSICAL_MINIMUM(4, 0x0000),
+                PHYSICAL_MAXIMUM(4, 0x7fff),
+                REPORT_SIZE(1, 32),
+                REPORT_COUNT(1, 1),
+                INPUT(1, Data|Var|Abs),
+            END_COLLECTION,
+
+            USAGE_PAGE(1, HID_USAGE_PAGE_GENERIC),
+            USAGE(1, HID_USAGE_GENERIC_JOYSTICK),
+            COLLECTION(1, Report),
+                REPORT_ID_OR_USAGE_PAGE(1, report_id, 1),
+                USAGE_PAGE(1, HID_USAGE_PAGE_BUTTON),
+                USAGE_MINIMUM(1, 9),
+                USAGE_MAXIMUM(1, 10),
+                LOGICAL_MINIMUM(1, 0),
+                LOGICAL_MAXIMUM(1, 1),
+                REPORT_COUNT(1, 8),
+                REPORT_SIZE(1, 1),
+                INPUT(1, Data|Var|Abs),
+            END_COLLECTION,
+
+            USAGE_PAGE(1, HID_USAGE_PAGE_LED),
+            USAGE(1, HID_USAGE_LED_GREEN),
+            COLLECTION(1, Report),
+                REPORT_ID_OR_USAGE_PAGE(1, report_id, 0),
+                USAGE_PAGE(1, HID_USAGE_PAGE_LED),
+                USAGE(1, 1),
+                USAGE(1, 2),
+                USAGE(1, 3),
+                USAGE(1, 4),
+                USAGE(1, 5),
+                USAGE(1, 6),
+                USAGE(1, 7),
+                USAGE(1, 8),
+                LOGICAL_MINIMUM(1, 0),
+                LOGICAL_MAXIMUM(1, 1),
+                PHYSICAL_MINIMUM(1, 0),
+                PHYSICAL_MAXIMUM(1, 1),
+                REPORT_COUNT(1, 8),
+                REPORT_SIZE(1, 1),
+                INPUT(1, Data|Var|Abs),
+
+                USAGE(4, (HID_USAGE_PAGE_KEYBOARD<<16)|0x8c),
+                USAGE(4, (HID_USAGE_PAGE_KEYBOARD<<16)|0x8d),
+                USAGE(4, (HID_USAGE_PAGE_KEYBOARD<<16)|0x8e),
+                USAGE(4, (HID_USAGE_PAGE_KEYBOARD<<16)|0x8f),
+                LOGICAL_MINIMUM(1, 1),
+                LOGICAL_MAXIMUM(1, 16),
+                REPORT_COUNT(1, 2),
+                REPORT_SIZE(1, 8),
+                INPUT(1, Data|Ary|Abs),
+            END_COLLECTION,
+
+            USAGE_PAGE(2, HID_USAGE_PAGE_HAPTICS),
+            USAGE(1, HID_USAGE_HAPTICS_SIMPLE_CONTROLLER),
+            COLLECTION(1, Logical),
+                REPORT_ID_OR_USAGE_PAGE(1, report_id, 0),
+                USAGE_PAGE(2, HID_USAGE_PAGE_HAPTICS),
+
+                USAGE(1, HID_USAGE_HAPTICS_WAVEFORM_LIST),
+                COLLECTION(1, NamedArray),
+                    USAGE_PAGE(1, HID_USAGE_PAGE_ORDINAL),
+                    USAGE(1, 3), /* HID_USAGE_HAPTICS_WAVEFORM_RUMBLE */
+                    USAGE(1, 4), /* HID_USAGE_HAPTICS_WAVEFORM_BUZZ */
+                    LOGICAL_MINIMUM(2, 0x0000),
+                    LOGICAL_MAXIMUM(2, 0xffff),
+                    REPORT_COUNT(1, 2),
+                    REPORT_SIZE(1, 16),
+                    FEATURE(1, Data|Var|Abs|Null),
+                END_COLLECTION,
+
+                USAGE_PAGE(2, HID_USAGE_PAGE_HAPTICS),
+                USAGE(1, HID_USAGE_HAPTICS_DURATION_LIST),
+                COLLECTION(1, NamedArray),
+                    USAGE_PAGE(1, HID_USAGE_PAGE_ORDINAL),
+                    USAGE(1, 3), /* 0 (HID_USAGE_HAPTICS_WAVEFORM_RUMBLE) */
+                    USAGE(1, 4), /* 0 (HID_USAGE_HAPTICS_WAVEFORM_BUZZ) */
+                    LOGICAL_MINIMUM(2, 0x0000),
+                    LOGICAL_MAXIMUM(2, 0xffff),
+                    REPORT_COUNT(1, 2),
+                    REPORT_SIZE(1, 16),
+                    FEATURE(1, Data|Var|Abs|Null),
+                END_COLLECTION,
+
+                USAGE_PAGE(2, HID_USAGE_PAGE_HAPTICS),
+                USAGE(1, HID_USAGE_HAPTICS_WAVEFORM_CUTOFF_TIME),
+                UNIT(2, 0x1001), /* seconds */
+                UNIT_EXPONENT(1, -3), /* 10^-3 */
+                LOGICAL_MINIMUM(2, 0x8000),
+                LOGICAL_MAXIMUM(2, 0x7fff),
+                PHYSICAL_MINIMUM(4, 0x00000000),
+                PHYSICAL_MAXIMUM(4, 0xffffffff),
+                REPORT_SIZE(1, 32),
+                REPORT_COUNT(1, 2),
+                FEATURE(1, Data|Var|Abs),
+                /* reset global items */
+                UNIT(1, 0), /* None */
+                UNIT_EXPONENT(1, 0),
+
+                USAGE_PAGE(1, HID_USAGE_PAGE_GENERIC),
+                USAGE(1, HID_USAGE_GENERIC_Z),
+                LOGICAL_MINIMUM(4, 0x0000),
+                LOGICAL_MAXIMUM(4, 0x7fff),
+                PHYSICAL_MINIMUM(4, 0xfff90000),
+                PHYSICAL_MAXIMUM(4, 0x0003ffff),
+                REPORT_SIZE(1, 32),
+                REPORT_COUNT(1, 1),
+                FEATURE(1, Data|Var|Abs),
+            END_COLLECTION,
+
+            USAGE_PAGE(1, HID_USAGE_PAGE_GENERIC),
+            USAGE(1, HID_USAGE_GENERIC_JOYSTICK),
+            COLLECTION(1, Report),
+                REPORT_ID_OR_USAGE_PAGE(1, report_id, 1),
+                USAGE_PAGE(1, HID_USAGE_PAGE_BUTTON),
+                USAGE_MINIMUM(1, 9),
+                USAGE_MAXIMUM(1, 10),
+                LOGICAL_MINIMUM(1, 0),
+                LOGICAL_MAXIMUM(1, 1),
+                PHYSICAL_MINIMUM(1, 0),
+                PHYSICAL_MAXIMUM(1, 1),
+                REPORT_COUNT(1, 8),
+                REPORT_SIZE(1, 1),
+                FEATURE(1, Data|Var|Abs),
+            END_COLLECTION,
+
+            USAGE_PAGE(1, HID_USAGE_PAGE_LED),
+            USAGE(1, HID_USAGE_LED_GREEN),
+            COLLECTION(1, Report),
+                REPORT_ID_OR_USAGE_PAGE(1, report_id, 0),
+                USAGE_PAGE(1, HID_USAGE_PAGE_LED),
+                REPORT_COUNT(1, 8),
+                REPORT_SIZE(1, 1),
+                OUTPUT(1, Cnst|Var|Abs),
+            END_COLLECTION,
+
+            USAGE_PAGE(1, HID_USAGE_PAGE_LED),
+            USAGE(1, HID_USAGE_LED_RED),
+            COLLECTION(1, Report),
+                REPORT_ID_OR_USAGE_PAGE(1, report_id, 1),
+                USAGE_PAGE(1, HID_USAGE_PAGE_LED),
+                REPORT_COUNT(1, 8),
+                REPORT_SIZE(1, 1),
+                OUTPUT(1, Cnst|Var|Abs),
+            END_COLLECTION,
+        END_COLLECTION,
+    };
+#undef REPORT_ID_OR_USAGE_PAGE
+#include "pop_hid_macros.h"
+
     char cwd[MAX_PATH], tempdir[MAX_PATH];
     LSTATUS status;
     HKEY hkey;
@@ -3364,6 +3611,9 @@ static void test_hid_driver(struct testsign_context *ctx, DWORD report_id, DWORD
     status = RegSetValueExW(hkey, L"PolledMode", 0, REG_DWORD, (void *)&polled, sizeof(polled));
     ok(!status, "RegSetValueExW returned %#x\n", status);
 
+    status = RegSetValueExW(hkey, L"Descriptor", 0, REG_BINARY, (void *)report_descriptor, sizeof(report_descriptor));
+    ok(!status, "RegSetValueExW returned %#x\n", status);
+
     driver_start(ctx, L"driver_hid.dll");
     test_hid_device(report_id, polled);
     driver_stop();
-- 
2.33.0




More information about the wine-devel mailing list