Commit 1ccb1719 authored by Aric Stewart's avatar Aric Stewart Committed by Alexandre Julliard

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

parent 1707df3d
...@@ -356,6 +356,7 @@ static void test_get_input_report(void) ...@@ -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++)
{ {
......
...@@ -584,19 +584,30 @@ NTSTATUS WINAPI HID_Device_ioctl(DEVICE_OBJECT *device, IRP *irp) ...@@ -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:
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment