winebus.sys: Reports for iohid.
Signed-off-by: Aric Stewart <aric@codeweavers.com> Signed-off-by: Ken Thomases <ken@codeweavers.com> Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
parent
0d96ffbca9
commit
2b568a1148
|
@ -107,6 +107,7 @@ DEFINE_GUID(GUID_DEVCLASS_IOHID, 0x989D309D,0x0470,0x4E1A,0x89,0x38,0x50,0x1F,0x
|
||||||
struct platform_private
|
struct platform_private
|
||||||
{
|
{
|
||||||
IOHIDDeviceRef device;
|
IOHIDDeviceRef device;
|
||||||
|
uint8_t *buffer;
|
||||||
};
|
};
|
||||||
|
|
||||||
static inline struct platform_private *impl_from_DEVICE_OBJECT(DEVICE_OBJECT *device)
|
static inline struct platform_private *impl_from_DEVICE_OBJECT(DEVICE_OBJECT *device)
|
||||||
|
@ -129,6 +130,14 @@ static DWORD CFNumberToDWORD(CFNumberRef num)
|
||||||
return dwNum;
|
return dwNum;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void handle_IOHIDDeviceIOHIDReportCallback(void *context,
|
||||||
|
IOReturn result, void *sender, IOHIDReportType type,
|
||||||
|
uint32_t reportID, uint8_t *report, CFIndex report_length)
|
||||||
|
{
|
||||||
|
DEVICE_OBJECT *device = (DEVICE_OBJECT*)context;
|
||||||
|
process_hid_report(device, report, report_length);
|
||||||
|
}
|
||||||
|
|
||||||
static int compare_platform_device(DEVICE_OBJECT *device, void *platform_dev)
|
static int compare_platform_device(DEVICE_OBJECT *device, void *platform_dev)
|
||||||
{
|
{
|
||||||
struct platform_private *private = impl_from_DEVICE_OBJECT(device);
|
struct platform_private *private = impl_from_DEVICE_OBJECT(device);
|
||||||
|
@ -192,7 +201,19 @@ static NTSTATUS get_string(DEVICE_OBJECT *device, DWORD index, WCHAR *buffer, DW
|
||||||
|
|
||||||
static NTSTATUS begin_report_processing(DEVICE_OBJECT *device)
|
static NTSTATUS begin_report_processing(DEVICE_OBJECT *device)
|
||||||
{
|
{
|
||||||
return STATUS_NOT_IMPLEMENTED;
|
DWORD length;
|
||||||
|
struct platform_private *private = impl_from_DEVICE_OBJECT(device);
|
||||||
|
CFNumberRef num;
|
||||||
|
|
||||||
|
if (private->buffer)
|
||||||
|
return STATUS_SUCCESS;
|
||||||
|
|
||||||
|
num = IOHIDDeviceGetProperty(private->device, CFSTR(kIOHIDMaxInputReportSizeKey));
|
||||||
|
length = CFNumberToDWORD(num);
|
||||||
|
private->buffer = HeapAlloc(GetProcessHeap(), 0, length);
|
||||||
|
|
||||||
|
IOHIDDeviceRegisterInputReportCallback(private->device, private->buffer, length, handle_IOHIDDeviceIOHIDReportCallback, device);
|
||||||
|
return STATUS_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
static NTSTATUS set_output_report(DEVICE_OBJECT *device, UCHAR id, BYTE *report, DWORD length, ULONG_PTR *written)
|
static NTSTATUS set_output_report(DEVICE_OBJECT *device, UCHAR id, BYTE *report, DWORD length, ULONG_PTR *written)
|
||||||
|
@ -250,6 +271,7 @@ static void handle_DeviceMatchingCallback(void *context, IOReturn result, void *
|
||||||
{
|
{
|
||||||
struct platform_private *private = impl_from_DEVICE_OBJECT(device);
|
struct platform_private *private = impl_from_DEVICE_OBJECT(device);
|
||||||
private->device = IOHIDDevice;
|
private->device = IOHIDDevice;
|
||||||
|
private->buffer = NULL;
|
||||||
IoInvalidateDeviceRelations(device, BusRelations);
|
IoInvalidateDeviceRelations(device, BusRelations);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -258,6 +280,9 @@ static void handle_RemovalCallback(void *context, IOReturn result, void *sender,
|
||||||
{
|
{
|
||||||
DEVICE_OBJECT *device;
|
DEVICE_OBJECT *device;
|
||||||
TRACE("OS/X IOHID Device Removed %p\n", IOHIDDevice);
|
TRACE("OS/X IOHID Device Removed %p\n", IOHIDDevice);
|
||||||
|
IOHIDDeviceRegisterInputReportCallback(IOHIDDevice, NULL, 0, NULL, NULL);
|
||||||
|
/* Note: Yes, we leak the buffer. But according to research there is no
|
||||||
|
safe way to deallocate that buffer. */
|
||||||
device = bus_find_hid_device(&iohid_vtbl, IOHIDDevice);
|
device = bus_find_hid_device(&iohid_vtbl, IOHIDDevice);
|
||||||
if (device)
|
if (device)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue