Module: wine Branch: master Commit: f2e9a215343323458535ce0aea3bc2841ecd9f1a URL: http://source.winehq.org/git/wine.git/?a=commit;h=f2e9a215343323458535ce0aea...
Author: Aric Stewart aric@codeweavers.com Date: Fri Oct 14 08:12:46 2016 +0200
winehid.sys: Implement handing internal ioctls.
Signed-off-by: Aric Stewart aric@codeweavers.com Signed-off-by: Sebastian Lackner sebastian@fds-team.de Signed-off-by: Alexandre Julliard julliard@winehq.org
---
dlls/winehid.sys/Makefile.in | 2 +- dlls/winehid.sys/main.c | 38 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 39 insertions(+), 1 deletion(-)
diff --git a/dlls/winehid.sys/Makefile.in b/dlls/winehid.sys/Makefile.in index ad7881e..8db0f0e 100644 --- a/dlls/winehid.sys/Makefile.in +++ b/dlls/winehid.sys/Makefile.in @@ -1,5 +1,5 @@ MODULE = winehid.sys -IMPORTS = hidclass +IMPORTS = hidclass ntoskrnl EXTRADLLFLAGS = -Wb,--subsystem,native
C_SRCS = \ diff --git a/dlls/winehid.sys/main.c b/dlls/winehid.sys/main.c index cdef3c5..0f18514 100644 --- a/dlls/winehid.sys/main.c +++ b/dlls/winehid.sys/main.c @@ -20,17 +20,54 @@
#include <stdarg.h>
+#define NONAMELESSUNION + #include "ntstatus.h" #define WIN32_NO_STATUS #include "windef.h" #include "winbase.h" #include "winternl.h" +#include "winioctl.h" #include "ddk/wdm.h" #include "ddk/hidport.h" #include "wine/debug.h"
WINE_DEFAULT_DEBUG_CHANNEL(hid);
+static NTSTATUS WINAPI internal_ioctl(DEVICE_OBJECT *device, IRP *irp) +{ + NTSTATUS status = irp->IoStatus.u.Status; + IO_STACK_LOCATION *irpsp = IoGetCurrentIrpStackLocation(irp); + ULONG code = irpsp->Parameters.DeviceIoControl.IoControlCode; + + switch (code) + { + case IOCTL_GET_PHYSICAL_DESCRIPTOR: + case IOCTL_HID_ACTIVATE_DEVICE: + case IOCTL_HID_DEACTIVATE_DEVICE: + case IOCTL_HID_GET_INDEXED_STRING: + case IOCTL_HID_GET_DEVICE_ATTRIBUTES: + case IOCTL_HID_GET_DEVICE_DESCRIPTOR: + case IOCTL_HID_GET_REPORT_DESCRIPTOR: + case IOCTL_HID_GET_STRING: + case IOCTL_HID_GET_INPUT_REPORT: + case IOCTL_HID_READ_REPORT: + case IOCTL_HID_SET_OUTPUT_REPORT: + case IOCTL_HID_WRITE_REPORT: + case IOCTL_HID_GET_FEATURE: + case IOCTL_HID_SET_FEATURE: + /* All these are handled by the lower level driver */ + IoSkipCurrentIrpStackLocation(irp); + return IoCallDriver(((HID_DEVICE_EXTENSION *)device->DeviceExtension)->NextDeviceObject, irp); + + default: + FIXME("Unsupported ioctl %x (device=%x access=%x func=%x method=%x)\n", + code, code >> 16, (code >> 14) & 3, (code >> 2) & 0xfff, code & 3); + IoCompleteRequest(irp, IO_NO_INCREMENT); + return status; + } +} + static NTSTATUS WINAPI add_device(DRIVER_OBJECT *driver, DEVICE_OBJECT *device) { TRACE("(%p, %p)\n", driver, device); @@ -43,6 +80,7 @@ NTSTATUS WINAPI DriverEntry(DRIVER_OBJECT *driver, UNICODE_STRING *path)
TRACE("(%p, %s)\n", driver, debugstr_w(path->Buffer));
+ driver->MajorFunction[IRP_MJ_INTERNAL_DEVICE_CONTROL] = internal_ioctl; driver->DriverExtension->AddDevice = add_device;
memset(®istration, 0, sizeof(registration));