From 1ccb1719cb33c15c7a25854e9fdeef376104a6ec Mon Sep 17 00:00:00 2001 From: Aric Stewart Date: Thu, 2 Feb 2017 10:35:55 -0600 Subject: [PATCH] hidclass.sys: IOCTL_HID_GET_INPUT_REPORT has report ID as first byte. Signed-off-by: Aric Stewart Signed-off-by: Alexandre Julliard --- dlls/hid/tests/device.c | 1 + dlls/hidclass.sys/device.c | 27 +++++++++++++++++++-------- 2 files changed, 20 insertions(+), 8 deletions(-) diff --git a/dlls/hid/tests/device.c b/dlls/hid/tests/device.c index ff47e30dca7..91fade49ae9 100644 --- a/dlls/hid/tests/device.c +++ b/dlls/hid/tests/device.c @@ -356,6 +356,7 @@ static void test_get_input_report(void) if (rc) { + ok(data[0] == 0, "Report ID (0) is not the first byte of the data\n"); report[0] = 0; for (i = 0; i < Caps.InputReportByteLength && i < Caps.InputReportByteLength; i++) { diff --git a/dlls/hidclass.sys/device.c b/dlls/hidclass.sys/device.c index ff9655e3da6..40d458aa10d 100644 --- a/dlls/hidclass.sys/device.c +++ b/dlls/hidclass.sys/device.c @@ -584,19 +584,30 @@ NTSTATUS WINAPI HID_Device_ioctl(DEVICE_OBJECT *device, IRP *irp) } case IOCTL_HID_GET_INPUT_REPORT: { - HID_XFER_PACKET packet; + HID_XFER_PACKET *packet; + UINT packet_size = sizeof(*packet) + irpsp->Parameters.DeviceIoControl.OutputBufferLength; BYTE *buffer = MmGetSystemAddressForMdlSafe(irp->MdlAddress, NormalPagePriority); + ULONG out_length; + + packet = HeapAlloc(GetProcessHeap(), 0, packet_size); if (extension->preparseData->InputReports[0].reportID) - packet.reportId = buffer[0]; + packet->reportId = buffer[0]; else - packet.reportId = 0; - packet.reportBuffer = buffer; - packet.reportBufferLen = irpsp->Parameters.DeviceIoControl.OutputBufferLength; + packet->reportId = 0; + packet->reportBuffer = (BYTE *)packet + sizeof(*packet); + packet->reportBufferLen = irpsp->Parameters.DeviceIoControl.OutputBufferLength - 1; - call_minidriver(IOCTL_HID_GET_INPUT_REPORT, device, NULL, 0, &packet, sizeof(packet)); - irp->IoStatus.Information = packet.reportBufferLen; - irp->IoStatus.u.Status = STATUS_SUCCESS; + rc = call_minidriver(IOCTL_HID_GET_INPUT_REPORT, device, NULL, 0, packet, sizeof(*packet)); + if (rc == STATUS_SUCCESS) + { + rc = copy_packet_into_buffer(packet, buffer, irpsp->Parameters.DeviceIoControl.OutputBufferLength, &out_length); + irp->IoStatus.Information = out_length; + } + else + irp->IoStatus.Information = 0; + irp->IoStatus.u.Status = rc; + HeapFree(GetProcessHeap(), 0, packet); break; } case IOCTL_SET_NUM_DEVICE_INPUT_BUFFERS: