[PATCH 7/8] hidclass.sys: Enforce output packet lengths to match report lengths.
Rémi Bernon
rbernon at codeweavers.com
Mon Sep 13 03:48:58 CDT 2021
Signed-off-by: Rémi Bernon <rbernon at codeweavers.com>
---
dlls/dinput8/tests/driver_hid.c | 3 ---
dlls/dinput8/tests/driver_hid.h | 1 -
dlls/dinput8/tests/hid.c | 3 ---
dlls/hidclass.sys/device.c | 17 ++++++-----------
4 files changed, 6 insertions(+), 18 deletions(-)
diff --git a/dlls/dinput8/tests/driver_hid.c b/dlls/dinput8/tests/driver_hid.c
index 7d613f1d92c..91f420d7bf6 100644
--- a/dlls/dinput8/tests/driver_hid.c
+++ b/dlls/dinput8/tests/driver_hid.c
@@ -389,7 +389,6 @@ static NTSTATUS WINAPI driver_internal_ioctl( DEVICE_OBJECT *device, IRP *irp )
winetest_push_context( "%s expect[%d]", expect.context, index );
ok( expect.code == code, "got %#x, expected %#x\n", expect.code, code );
ok( packet->reportId == expect.report_id, "got id %u\n", packet->reportId );
- todo_wine_if( expect.todo_report_len )
ok( packet->reportBufferLen == expect.report_len, "got len %u\n", packet->reportBufferLen );
ok( RtlCompareMemory( packet->reportBuffer, expect.report_buf, expect.report_len ) == expect.report_len,
"unexpected data\n" );
@@ -439,7 +438,6 @@ static NTSTATUS WINAPI driver_internal_ioctl( DEVICE_OBJECT *device, IRP *irp )
winetest_push_context( "%s expect[%d]", expect.context, index );
ok( expect.code == code, "got %#x, expected %#x\n", expect.code, code );
ok( packet->reportId == expect.report_id, "got id %u\n", packet->reportId );
- todo_wine_if( expect.todo_report_len )
ok( packet->reportBufferLen == expect.report_len, "got len %u\n", packet->reportBufferLen );
ok( RtlCompareMemory( packet->reportBuffer, expect.report_buf, expect.report_len ) == expect.report_len,
"unexpected data\n" );
@@ -489,7 +487,6 @@ static NTSTATUS WINAPI driver_internal_ioctl( DEVICE_OBJECT *device, IRP *irp )
winetest_push_context( "%s expect[%d]", expect.context, index );
ok( expect.code == code, "got %#x, expected %#x\n", expect.code, code );
ok( packet->reportId == expect.report_id, "got id %u\n", packet->reportId );
- todo_wine_if( expect.todo_report_len )
ok( packet->reportBufferLen == expect.report_len, "got len %u\n", packet->reportBufferLen );
ok( RtlCompareMemory( packet->reportBuffer, expect.report_buf, expect.report_len ) == expect.report_len,
"unexpected data\n" );
diff --git a/dlls/dinput8/tests/driver_hid.h b/dlls/dinput8/tests/driver_hid.h
index e7202594c25..c9c75c6d081 100644
--- a/dlls/dinput8/tests/driver_hid.h
+++ b/dlls/dinput8/tests/driver_hid.h
@@ -48,7 +48,6 @@ struct hid_expect
DWORD ret_status;
BYTE broken; /* missing on some win versions */
BYTE report_id;
- BYTE todo_report_len;
BYTE report_len;
BYTE report_buf[128];
char context[64];
diff --git a/dlls/dinput8/tests/hid.c b/dlls/dinput8/tests/hid.c
index 5bcfc5b9f83..85ccc2a05df 100644
--- a/dlls/dinput8/tests/hid.c
+++ b/dlls/dinput8/tests/hid.c
@@ -946,7 +946,6 @@ static void test_hidp_set_feature( HANDLE file, int report_id, ULONG report_len,
{
.code = IOCTL_HID_SET_FEATURE,
.report_id = report_id,
- .todo_report_len = TRUE,
.report_len = report_len - (report_id ? 0 : 1),
.report_buf =
{
@@ -1048,7 +1047,6 @@ static void test_hidp_set_output( HANDLE file, int report_id, ULONG report_len,
{
.code = IOCTL_HID_SET_OUTPUT_REPORT,
.report_id = report_id,
- .todo_report_len = TRUE,
.report_len = report_len - (report_id ? 0 : 1),
.report_buf = {report_id,0,0xcd,0xcd,0xcd},
.ret_length = 3,
@@ -1135,7 +1133,6 @@ static void test_write_file( HANDLE file, int report_id, ULONG report_len )
{
.code = IOCTL_HID_WRITE_REPORT,
.report_id = report_id,
- .todo_report_len = report_id == 0,
.report_len = report_len - (report_id ? 0 : 1),
.report_buf = {report_id ? report_id : 0xcd,0xcd,0xcd,0xcd,0xcd},
.ret_length = 3,
diff --git a/dlls/hidclass.sys/device.c b/dlls/hidclass.sys/device.c
index 9b91834267e..71fb4a366db 100644
--- a/dlls/hidclass.sys/device.c
+++ b/dlls/hidclass.sys/device.c
@@ -365,7 +365,7 @@ static void hid_device_xfer_report( BASE_DEVICE_EXTENSION *ext, ULONG code, IRP
HIDP_REPORT_IDS *reports = ext->u.pdo.device_desc.ReportIDs;
ULONG report_count = ext->u.pdo.device_desc.ReportIDsLength;
IO_STACK_LOCATION *stack = IoGetCurrentIrpStackLocation( irp );
- ULONG i, report_len = 0, buffer_len = 0;
+ ULONG i, offset = 0, report_len = 0, buffer_len = 0;
HID_XFER_PACKET packet;
BYTE *buffer = NULL;
@@ -402,6 +402,7 @@ static void hid_device_xfer_report( BASE_DEVICE_EXTENSION *ext, ULONG code, IRP
irp->IoStatus.Status = STATUS_INVALID_PARAMETER;
return;
}
+ if (!reports[i].ReportID) offset = 1;
switch (code)
{
@@ -423,26 +424,20 @@ static void hid_device_xfer_report( BASE_DEVICE_EXTENSION *ext, ULONG code, IRP
return;
}
- packet.reportId = buffer[0];
- packet.reportBuffer = buffer;
- packet.reportBufferLen = buffer_len;
-
- if (!reports[i].ReportID)
- {
- packet.reportId = 0;
- packet.reportBuffer++;
- packet.reportBufferLen--;
- }
+ packet.reportId = reports[i].ReportID;
+ packet.reportBuffer = buffer + offset;
switch (code)
{
case IOCTL_HID_GET_FEATURE:
case IOCTL_HID_GET_INPUT_REPORT:
+ packet.reportBufferLen = buffer_len - offset;
call_minidriver( code, ext->u.pdo.parent_fdo, NULL, 0, &packet, sizeof(packet), &irp->IoStatus );
break;
case IOCTL_HID_SET_FEATURE:
case IOCTL_HID_SET_OUTPUT_REPORT:
case IOCTL_HID_WRITE_REPORT:
+ packet.reportBufferLen = report_len - offset;
call_minidriver( code, ext->u.pdo.parent_fdo, NULL, sizeof(packet), &packet, 0, &irp->IoStatus );
if (code == IOCTL_HID_WRITE_REPORT && packet.reportId) irp->IoStatus.Information--;
break;
--
2.33.0
More information about the wine-devel
mailing list