Aric Stewart : hidclass.sys: IOCTL_HID_GET_INPUT_REPORT has report ID as first byte.
Module: wine Branch: master Commit: 1ccb1719cb33c15c7a25854e9fdeef376104a6ec URL: http://source.winehq.org/git/wine.git/?a=commit;h=1ccb1719cb33c15c7a25854e9f... Author: Aric Stewart <aric(a)codeweavers.com> Date: Thu Feb 2 10:35:55 2017 -0600 hidclass.sys: IOCTL_HID_GET_INPUT_REPORT has report ID as first byte. Signed-off-by: Aric Stewart <aric(a)codeweavers.com> Signed-off-by: Alexandre Julliard <julliard(a)winehq.org> --- 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 ff47e30..91fade4 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 ff9655e..40d458a 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:
participants (1)
-
Alexandre Julliard