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:
parent
1707df3da2
commit
1ccb1719cb
|
@ -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++)
|
||||
{
|
||||
|
|
|
@ -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:
|
||||
|
|
Loading…
Reference in New Issue