Signed-off-by: Rémi Bernon rbernon@codeweavers.com --- dlls/dinput8/tests/driver_hid.c | 268 ++------------------------------ dlls/dinput8/tests/hid.c | 250 +++++++++++++++++++++++++++++ 2 files changed, 265 insertions(+), 253 deletions(-)
diff --git a/dlls/dinput8/tests/driver_hid.c b/dlls/dinput8/tests/driver_hid.c index 1fc52999c84..6bd5611c86c 100644 --- a/dlls/dinput8/tests/driver_hid.c +++ b/dlls/dinput8/tests/driver_hid.c @@ -39,6 +39,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;
@@ -159,253 +161,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; @@ -453,7 +208,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; @@ -462,12 +217,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; @@ -677,7 +432,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, @@ -710,6 +465,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/dinput8/tests/hid.c b/dlls/dinput8/tests/hid.c index d89974a14ab..ec2575aa9c1 100644 --- a/dlls/dinput8/tests/hid.c +++ b/dlls/dinput8/tests/hid.c @@ -2054,6 +2054,253 @@ static void test_hid_device( DWORD report_id, DWORD polled )
static void test_hid_driver( 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_desc[] = + { + 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" + WCHAR cwd[MAX_PATH], tempdir[MAX_PATH]; LSTATUS status; HKEY hkey; @@ -2072,6 +2319,9 @@ static void test_hid_driver( DWORD report_id, DWORD polled ) 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_desc, sizeof(report_desc) ); + ok( !status, "RegSetValueExW returned %#x\n", status ); + if (pnp_driver_start( L"driver_hid.dll" )) test_hid_device( report_id, polled );
pnp_driver_stop();
Signed-off-by: Rémi Bernon rbernon@codeweavers.com --- dlls/dinput8/tests/driver_hid.c | 24 +++++++++++------------- dlls/dinput8/tests/hid.c | 11 +++++++++++ 2 files changed, 22 insertions(+), 13 deletions(-)
diff --git a/dlls/dinput8/tests/driver_hid.c b/dlls/dinput8/tests/driver_hid.c index 6bd5611c86c..06b223d1611 100644 --- a/dlls/dinput8/tests/driver_hid.c +++ b/dlls/dinput8/tests/driver_hid.c @@ -39,6 +39,7 @@ static UNICODE_STRING control_symlink;
static unsigned int got_start_device; +static HID_DEVICE_ATTRIBUTES attributes; static char report_descriptor_buf[4096]; static DWORD report_descriptor_len; static DWORD report_id; @@ -228,25 +229,16 @@ static NTSTATUS WINAPI driver_internal_ioctl( DEVICE_OBJECT *device, IRP *irp ) break;
case IOCTL_HID_GET_DEVICE_ATTRIBUTES: - { - HID_DEVICE_ATTRIBUTES *attr = irp->UserBuffer; - ok( !in_size, "got input size %u\n", in_size ); - ok( out_size == sizeof(*attr), "got output size %u\n", out_size ); + ok( out_size == sizeof(attributes), "got output size %u\n", out_size );
- if (out_size == sizeof(*attr)) + if (out_size == sizeof(attributes)) { - ok( !attr->Size, "got size %u\n", attr->Size ); - - attr->Size = sizeof(*attr); - attr->VendorID = 0x1209; - attr->ProductID = 0x0001; - attr->VersionNumber = 0xface; - irp->IoStatus.Information = sizeof(*attr); + memcpy( irp->UserBuffer, &attributes, sizeof(attributes) ); + irp->IoStatus.Information = sizeof(attributes); } ret = STATUS_SUCCESS; break; - }
case IOCTL_HID_READ_REPORT: { @@ -472,6 +464,12 @@ NTSTATUS WINAPI DriverEntry( DRIVER_OBJECT *driver, UNICODE_STRING *registry ) memcpy( report_descriptor_buf, buffer + info_size, size - info_size ); report_descriptor_len = size - info_size;
+ RtlInitUnicodeString( &name_str, L"Attributes" ); + size = info_size + sizeof(attributes); + ret = ZwQueryValueKey( hkey, &name_str, KeyValuePartialInformation, buffer, size, &size ); + ok( !ret, "ZwQueryValueKey returned %#x\n", ret ); + memcpy( &attributes, buffer + info_size, size - info_size ); + driver->DriverExtension->AddDevice = driver_add_device; driver->DriverUnload = driver_unload; driver->MajorFunction[IRP_MJ_PNP] = driver_pnp; diff --git a/dlls/dinput8/tests/hid.c b/dlls/dinput8/tests/hid.c index ec2575aa9c1..51b204c736d 100644 --- a/dlls/dinput8/tests/hid.c +++ b/dlls/dinput8/tests/hid.c @@ -2301,6 +2301,14 @@ static void test_hid_driver( DWORD report_id, DWORD polled ) #undef REPORT_ID_OR_USAGE_PAGE #include "pop_hid_macros.h"
+ static const HID_DEVICE_ATTRIBUTES attributes = + { + .Size = sizeof(HID_DEVICE_ATTRIBUTES), + .VendorID = 0x1209, + .ProductID = 0x0001, + .VersionNumber = 0x0100, + }; + WCHAR cwd[MAX_PATH], tempdir[MAX_PATH]; LSTATUS status; HKEY hkey; @@ -2322,6 +2330,9 @@ static void test_hid_driver( DWORD report_id, DWORD polled ) status = RegSetValueExW( hkey, L"Descriptor", 0, REG_BINARY, (void *)report_desc, sizeof(report_desc) ); ok( !status, "RegSetValueExW returned %#x\n", status );
+ status = RegSetValueExW( hkey, L"Attributes", 0, REG_BINARY, (void *)&attributes, sizeof(attributes) ); + ok( !status, "RegSetValueExW returned %#x\n", status ); + if (pnp_driver_start( L"driver_hid.dll" )) test_hid_device( report_id, polled );
pnp_driver_stop();
Hi,
While running your changed tests, I think I found new failures. Being a bot and all I'm not very good at pattern recognition, so I might be wrong, but could you please double-check?
Full results can be found at: https://testbot.winehq.org/JobDetails.pl?Key=97686
Your paranoid android.
=== w8 (32 bit report) ===
dinput8: device.c:130: Test failed: GetDeviceData() failed: 00000000 device.c:133: Test failed: GetDeviceData() failed: 00000000 cnt:0
On 9/10/21 10:07 AM, Marvin wrote:
Hi,
While running your changed tests, I think I found new failures. Being a bot and all I'm not very good at pattern recognition, so I might be wrong, but could you please double-check?
Full results can be found at: https://testbot.winehq.org/JobDetails.pl?Key=97686
Your paranoid android.
=== w8 (32 bit report) ===
dinput8: device.c:130: Test failed: GetDeviceData() failed: 00000000 device.c:133: Test failed: GetDeviceData() failed: 00000000 cnt:0
These are unrelated and already failing spuriously. It's testing for event queue overflow and I think it's sometimes checking the queue too soon.
Signed-off-by: Rémi Bernon rbernon@codeweavers.com --- dlls/dinput8/tests/driver_hid.c | 19 ++++++---- dlls/dinput8/tests/hid.c | 61 +++++++++++++-------------------- 2 files changed, 36 insertions(+), 44 deletions(-)
diff --git a/dlls/dinput8/tests/driver_hid.c b/dlls/dinput8/tests/driver_hid.c index 06b223d1611..eefdc05d1a3 100644 --- a/dlls/dinput8/tests/driver_hid.c +++ b/dlls/dinput8/tests/driver_hid.c @@ -42,6 +42,7 @@ static unsigned int got_start_device; static HID_DEVICE_ATTRIBUTES attributes; static char report_descriptor_buf[4096]; static DWORD report_descriptor_len; +static HIDP_CAPS caps; static DWORD report_id; static DWORD polled;
@@ -242,7 +243,7 @@ static NTSTATUS WINAPI driver_internal_ioctl( DEVICE_OBJECT *device, IRP *irp )
case IOCTL_HID_READ_REPORT: { - ULONG expected_size = 25; + ULONG expected_size = caps.InputReportByteLength - (report_id ? 0 : 1); ok( !in_size, "got input size %u\n", in_size ); ok( out_size == expected_size, "got output size %u\n", out_size );
@@ -266,7 +267,7 @@ static NTSTATUS WINAPI driver_internal_ioctl( DEVICE_OBJECT *device, IRP *irp ) case IOCTL_HID_WRITE_REPORT: { HID_XFER_PACKET *packet = irp->UserBuffer; - ULONG expected_size = 2; + ULONG expected_size = caps.OutputReportByteLength - (report_id ? 0 : 1);
ok( in_size == sizeof(*packet), "got input size %u\n", in_size ); ok( !out_size, "got output size %u\n", out_size ); @@ -284,7 +285,7 @@ static NTSTATUS WINAPI driver_internal_ioctl( DEVICE_OBJECT *device, IRP *irp ) case IOCTL_HID_GET_INPUT_REPORT: { HID_XFER_PACKET *packet = irp->UserBuffer; - ULONG expected_size = 23; + ULONG expected_size = caps.InputReportByteLength - (report_id ? 0 : 1); ok( !in_size, "got input size %u\n", in_size ); ok( out_size == sizeof(*packet), "got output size %u\n", out_size );
@@ -303,7 +304,7 @@ static NTSTATUS WINAPI driver_internal_ioctl( DEVICE_OBJECT *device, IRP *irp ) case IOCTL_HID_SET_OUTPUT_REPORT: { HID_XFER_PACKET *packet = irp->UserBuffer; - ULONG expected_size = 2; + ULONG expected_size = caps.OutputReportByteLength - (report_id ? 0 : 1); ok( in_size == sizeof(*packet), "got input size %u\n", in_size ); ok( !out_size, "got output size %u\n", out_size );
@@ -319,7 +320,7 @@ static NTSTATUS WINAPI driver_internal_ioctl( DEVICE_OBJECT *device, IRP *irp ) case IOCTL_HID_GET_FEATURE: { HID_XFER_PACKET *packet = irp->UserBuffer; - ULONG expected_size = 17; + ULONG expected_size = caps.FeatureReportByteLength - (report_id ? 0 : 1); ok( !in_size, "got input size %u\n", in_size ); ok( out_size == sizeof(*packet), "got output size %u\n", out_size );
@@ -337,7 +338,7 @@ static NTSTATUS WINAPI driver_internal_ioctl( DEVICE_OBJECT *device, IRP *irp ) case IOCTL_HID_SET_FEATURE: { HID_XFER_PACKET *packet = irp->UserBuffer; - ULONG expected_size = 17; + ULONG expected_size = caps.FeatureReportByteLength - (report_id ? 0 : 1); ok( in_size == sizeof(*packet), "got input size %u\n", in_size ); ok( !out_size, "got output size %u\n", out_size );
@@ -470,6 +471,12 @@ NTSTATUS WINAPI DriverEntry( DRIVER_OBJECT *driver, UNICODE_STRING *registry ) ok( !ret, "ZwQueryValueKey returned %#x\n", ret ); memcpy( &attributes, buffer + info_size, size - info_size );
+ RtlInitUnicodeString( &name_str, L"Caps" ); + size = info_size + sizeof(caps); + ret = ZwQueryValueKey( hkey, &name_str, KeyValuePartialInformation, buffer, size, &size ); + ok( !ret, "ZwQueryValueKey returned %#x\n", ret ); + memcpy( &caps, buffer + info_size, size - info_size ); + driver->DriverExtension->AddDevice = driver_add_device; driver->DriverUnload = driver_unload; driver->MajorFunction[IRP_MJ_PNP] = driver_pnp; diff --git a/dlls/dinput8/tests/hid.c b/dlls/dinput8/tests/hid.c index 51b204c736d..4483a5ec479 100644 --- a/dlls/dinput8/tests/hid.c +++ b/dlls/dinput8/tests/hid.c @@ -724,41 +724,8 @@ static BOOL sync_ioctl( HANDLE file, DWORD code, void *in_buf, DWORD in_len, voi return ret; }
-static void test_hidp( HANDLE file, HANDLE async_file, int report_id, BOOL polled ) +static void test_hidp( HANDLE file, HANDLE async_file, int report_id, BOOL polled, const HIDP_CAPS *expect_caps ) { - const HIDP_CAPS expect_hidp_caps[] = - { - /* without report id */ - { - .Usage = HID_USAGE_GENERIC_JOYSTICK, - .UsagePage = HID_USAGE_PAGE_GENERIC, - .InputReportByteLength = 26, - .OutputReportByteLength = 3, - .FeatureReportByteLength = 22, - .NumberLinkCollectionNodes = 10, - .NumberInputButtonCaps = 17, - .NumberInputValueCaps = 7, - .NumberInputDataIndices = 47, - .NumberFeatureButtonCaps = 1, - .NumberFeatureValueCaps = 6, - .NumberFeatureDataIndices = 8, - }, - /* with report id */ - { - .Usage = HID_USAGE_GENERIC_JOYSTICK, - .UsagePage = HID_USAGE_PAGE_GENERIC, - .InputReportByteLength = 25, - .OutputReportByteLength = 2, - .FeatureReportByteLength = 21, - .NumberLinkCollectionNodes = 10, - .NumberInputButtonCaps = 17, - .NumberInputValueCaps = 7, - .NumberInputDataIndices = 47, - .NumberFeatureButtonCaps = 1, - .NumberFeatureValueCaps = 6, - .NumberFeatureDataIndices = 8, - }, - }; const HIDP_BUTTON_CAPS expect_button_caps[] = { { @@ -942,7 +909,7 @@ static void test_hidp( HANDLE file, HANDLE async_file, int report_id, BOOL polle ok( status == HIDP_STATUS_INVALID_PREPARSED_DATA, "HidP_GetCaps returned %#x\n", status ); status = HidP_GetCaps( preparsed_data, &caps ); ok( status == HIDP_STATUS_SUCCESS, "HidP_GetCaps returned %#x\n", status ); - check_hidp_caps( &caps, &expect_hidp_caps[report_id] ); + check_hidp_caps( &caps, expect_caps );
collection_count = 0; status = HidP_GetLinkCollectionNodes( collections, &collection_count, preparsed_data ); @@ -1883,7 +1850,7 @@ static void test_hidp( HANDLE file, HANDLE async_file, int report_id, BOOL polle HidD_FreePreparsedData( preparsed_data ); }
-static void test_hid_device( DWORD report_id, DWORD polled ) +static void test_hid_device( DWORD report_id, DWORD polled, const HIDP_CAPS *expect_caps ) { char buffer[FIELD_OFFSET( SP_DEVICE_INTERFACE_DETAIL_DATA_W, DevicePath[MAX_PATH] )]; SP_DEVICE_INTERFACE_DATA iface = {sizeof(SP_DEVICE_INTERFACE_DATA)}; @@ -2038,7 +2005,7 @@ static void test_hid_device( DWORD report_id, DWORD polled ) ok( poll_freq == 500, "got poll_freq %u, expected 500\n", poll_freq ); }
- test_hidp( file, async_file, report_id, polled ); + test_hidp( file, async_file, report_id, polled, expect_caps );
CloseHandle( async_file ); CloseHandle( file ); @@ -2308,6 +2275,21 @@ static void test_hid_driver( DWORD report_id, DWORD polled ) .ProductID = 0x0001, .VersionNumber = 0x0100, }; + const HIDP_CAPS caps = + { + .Usage = HID_USAGE_GENERIC_JOYSTICK, + .UsagePage = HID_USAGE_PAGE_GENERIC, + .InputReportByteLength = report_id ? 25 : 26, + .OutputReportByteLength = report_id ? 2 : 3, + .FeatureReportByteLength = report_id ? 21 : 22, + .NumberLinkCollectionNodes = 10, + .NumberInputButtonCaps = 17, + .NumberInputValueCaps = 7, + .NumberInputDataIndices = 47, + .NumberFeatureButtonCaps = 1, + .NumberFeatureValueCaps = 6, + .NumberFeatureDataIndices = 8, + };
WCHAR cwd[MAX_PATH], tempdir[MAX_PATH]; LSTATUS status; @@ -2333,7 +2315,10 @@ static void test_hid_driver( DWORD report_id, DWORD polled ) status = RegSetValueExW( hkey, L"Attributes", 0, REG_BINARY, (void *)&attributes, sizeof(attributes) ); ok( !status, "RegSetValueExW returned %#x\n", status );
- if (pnp_driver_start( L"driver_hid.dll" )) test_hid_device( report_id, polled ); + status = RegSetValueExW( hkey, L"Caps", 0, REG_BINARY, (void *)&caps, sizeof(caps) ); + ok( !status, "RegSetValueExW returned %#x\n", status ); + + if (pnp_driver_start( L"driver_hid.dll" )) test_hid_device( report_id, polled, &caps );
pnp_driver_stop(); SetCurrentDirectoryW( cwd );
Signed-off-by: Rémi Bernon rbernon@codeweavers.com --- dlls/dinput8/tests/driver_hid.c | 1 - dlls/dinput8/tests/hid.c | 1 + 2 files changed, 1 insertion(+), 1 deletion(-)
diff --git a/dlls/dinput8/tests/driver_hid.c b/dlls/dinput8/tests/driver_hid.c index eefdc05d1a3..b393ddb41cb 100644 --- a/dlls/dinput8/tests/driver_hid.c +++ b/dlls/dinput8/tests/driver_hid.c @@ -295,7 +295,6 @@ static NTSTATUS WINAPI driver_internal_ioctl( DEVICE_OBJECT *device, IRP *irp )
memset( packet->reportBuffer, 0xa5, 3 ); if (report_id) ((char *)packet->reportBuffer)[0] = report_id; - ((char *)packet->reportBuffer)[1] = seq++; irp->IoStatus.Information = 3; ret = STATUS_SUCCESS; break; diff --git a/dlls/dinput8/tests/hid.c b/dlls/dinput8/tests/hid.c index 4483a5ec479..ebf3a6e7da9 100644 --- a/dlls/dinput8/tests/hid.c +++ b/dlls/dinput8/tests/hid.c @@ -1839,6 +1839,7 @@ static void test_hidp( HANDLE file, HANDLE async_file, int report_id, BOOL polle ret = GetOverlappedResult( async_file, &overlapped, &value, FALSE ); ok( ret, "GetOverlappedResult failed, last error %u\n", GetLastError() ); ok( value == (report_id ? 3 : 4), "GetOverlappedResult returned length %u, expected 3\n", value ); + todo_wine ok( memcmp( report, buffer + caps.InputReportByteLength, caps.InputReportByteLength ), "expected different report\n" ); ok( !memcmp( report, buffer, caps.InputReportByteLength ), "expected identical reports\n" );
Hi,
While running your changed tests, I think I found new failures. Being a bot and all I'm not very good at pattern recognition, so I might be wrong, but could you please double-check?
Full results can be found at: https://testbot.winehq.org/JobDetails.pl?Key=97688
Your paranoid android.
=== w7u_el (32 bit report) ===
dinput8: device: Timeout
Signed-off-by: Rémi Bernon rbernon@codeweavers.com --- dlls/dinput8/tests/hid.c | 1 - dlls/hidclass.sys/device.c | 8 ++------ 2 files changed, 2 insertions(+), 7 deletions(-)
diff --git a/dlls/dinput8/tests/hid.c b/dlls/dinput8/tests/hid.c index ebf3a6e7da9..4483a5ec479 100644 --- a/dlls/dinput8/tests/hid.c +++ b/dlls/dinput8/tests/hid.c @@ -1839,7 +1839,6 @@ static void test_hidp( HANDLE file, HANDLE async_file, int report_id, BOOL polle ret = GetOverlappedResult( async_file, &overlapped, &value, FALSE ); ok( ret, "GetOverlappedResult failed, last error %u\n", GetLastError() ); ok( value == (report_id ? 3 : 4), "GetOverlappedResult returned length %u, expected 3\n", value ); - todo_wine ok( memcmp( report, buffer + caps.InputReportByteLength, caps.InputReportByteLength ), "expected different report\n" ); ok( !memcmp( report, buffer, caps.InputReportByteLength ), "expected identical reports\n" ); diff --git a/dlls/hidclass.sys/device.c b/dlls/hidclass.sys/device.c index ed7cd76fcde..9b91834267e 100644 --- a/dlls/hidclass.sys/device.c +++ b/dlls/hidclass.sys/device.c @@ -278,12 +278,8 @@ static DWORD CALLBACK hid_device_thread(void *args) packet->reportBufferLen--; }
- if (!poll_interval) - call_minidriver( IOCTL_HID_READ_REPORT, ext->u.pdo.parent_fdo, NULL, 0, - packet->reportBuffer, packet->reportBufferLen, &io ); - else - call_minidriver( IOCTL_HID_GET_INPUT_REPORT, ext->u.pdo.parent_fdo, NULL, 0, - packet, sizeof(*packet), &io ); + call_minidriver( IOCTL_HID_READ_REPORT, ext->u.pdo.parent_fdo, NULL, 0, + packet->reportBuffer, packet->reportBufferLen, &io );
if (io.Status == STATUS_SUCCESS) {