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(&registration, 0, sizeof(registration));
-- 
2.9.0



More information about the wine-patches mailing list