Aric Stewart : winehid.sys: Implement handing internal ioctls.
Module: wine Branch: master Commit: f2e9a215343323458535ce0aea3bc2841ecd9f1a URL: http://source.winehq.org/git/wine.git/?a=commit;h=f2e9a215343323458535ce0aea... Author: Aric Stewart <aric(a)codeweavers.com> Date: Fri Oct 14 08:12:46 2016 +0200 winehid.sys: Implement handing internal ioctls. Signed-off-by: Aric Stewart <aric(a)codeweavers.com> Signed-off-by: Sebastian Lackner <sebastian(a)fds-team.de> Signed-off-by: Alexandre Julliard <julliard(a)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));
participants (1)
-
Alexandre Julliard