winehid.sys: Implement handing internal ioctls. (v5)
Sebastian Lackner
sebastian at fds-team.de
Fri Oct 14 01:12:46 CDT 2016
From: Aric Stewart <aric at codeweavers.com>
Signed-off-by: Aric Stewart <aric at codeweavers.com>
Signed-off-by: Sebastian Lackner <sebastian at fds-team.de>
---
Changes in v5:
* Use NONAMELESSUNION to avoid possible compile issues on unusual platforms.
(Sorry if this was a misunderstanding, I was only removing it from patch 1
because it was not necessary for the stub driver yet.)
* Minor style improvements (for example, put the comma in the FIXME on the
previous line, so that the style is the same as in winebus).
dlls/winehid.sys/Makefile.in | 2 +-
dlls/winehid.sys/main.c | 42 ++++++++++++++++++++++++++++++++++++++++++
2 files changed, 43 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..42e2e48 100644
--- a/dlls/winehid.sys/main.c
+++ b/dlls/winehid.sys/main.c
@@ -20,17 +20,58 @@
#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);
+
+ switch (irpsp->Parameters.DeviceIoControl.IoControlCode)
+ {
+ 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:
+ {
+ ULONG code = irpsp->Parameters.DeviceIoControl.IoControlCode;
+ FIXME("Unsupported ioctl %x (device=%x access=%x func=%x method=%x)\n",
+ code, code >> 16, (code >> 14) & 3, (code >> 2) & 0xfff, code & 3);
+ break;
+ }
+ }
+ 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 +84,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));
--
2.9.0
More information about the wine-patches
mailing list