hidclass.sys: IOCTL_HID_GET_INPUT_REPORT has report ID as first byte.

Signed-off-by: Aric Stewart <aric@codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
Aric Stewart 2017-02-02 10:35:55 -06:00 committed by Alexandre Julliard
parent 1707df3da2
commit 1ccb1719cb
2 changed files with 20 additions and 8 deletions

View File

@ -356,6 +356,7 @@ static void test_get_input_report(void)
if (rc) if (rc)
{ {
ok(data[0] == 0, "Report ID (0) is not the first byte of the data\n");
report[0] = 0; report[0] = 0;
for (i = 0; i < Caps.InputReportByteLength && i < Caps.InputReportByteLength; i++) for (i = 0; i < Caps.InputReportByteLength && i < Caps.InputReportByteLength; i++)
{ {

View File

@ -584,19 +584,30 @@ NTSTATUS WINAPI HID_Device_ioctl(DEVICE_OBJECT *device, IRP *irp)
} }
case IOCTL_HID_GET_INPUT_REPORT: 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); BYTE *buffer = MmGetSystemAddressForMdlSafe(irp->MdlAddress, NormalPagePriority);
ULONG out_length;
packet = HeapAlloc(GetProcessHeap(), 0, packet_size);
if (extension->preparseData->InputReports[0].reportID) if (extension->preparseData->InputReports[0].reportID)
packet.reportId = buffer[0]; packet->reportId = buffer[0];
else else
packet.reportId = 0; packet->reportId = 0;
packet.reportBuffer = buffer; packet->reportBuffer = (BYTE *)packet + sizeof(*packet);
packet.reportBufferLen = irpsp->Parameters.DeviceIoControl.OutputBufferLength; packet->reportBufferLen = irpsp->Parameters.DeviceIoControl.OutputBufferLength - 1;
call_minidriver(IOCTL_HID_GET_INPUT_REPORT, device, NULL, 0, &packet, sizeof(packet)); rc = call_minidriver(IOCTL_HID_GET_INPUT_REPORT, device, NULL, 0, packet, sizeof(*packet));
irp->IoStatus.Information = packet.reportBufferLen; if (rc == STATUS_SUCCESS)
irp->IoStatus.u.Status = 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; break;
} }
case IOCTL_SET_NUM_DEVICE_INPUT_BUFFERS: case IOCTL_SET_NUM_DEVICE_INPUT_BUFFERS: