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)
|
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)
|
|||||||
}
|
}
|
||||||
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:
|
||||||
|
Loading…
x
Reference in New Issue
Block a user