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>
oldstable
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)
{
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++)
{

View File

@ -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: