Aric Stewart : winebus.sys: Implement IOCTL_HID_GET_DEVICE_ATTRIBUTES for hid devices.
Alexandre Julliard
julliard at winehq.org
Thu Oct 6 14:46:53 CDT 2016
Module: wine
Branch: master
Commit: ea95a47bb54741215811c535d7a46102422be041
URL: http://source.winehq.org/git/wine.git/?a=commit;h=ea95a47bb54741215811c535d7a46102422be041
Author: Aric Stewart <aric at codeweavers.com>
Date: Thu Oct 6 07:19:27 2016 -0500
winebus.sys: Implement IOCTL_HID_GET_DEVICE_ATTRIBUTES for hid devices.
Signed-off-by: Aric Stewart <aric at codeweavers.com>
Signed-off-by: Sebastian Lackner <sebastian at fds-team.de>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/winebus.sys/bus.h | 1 +
dlls/winebus.sys/bus_udev.c | 1 +
dlls/winebus.sys/main.c | 46 +++++++++++++++++++++++++++++++++++++++++++++
3 files changed, 48 insertions(+)
diff --git a/dlls/winebus.sys/bus.h b/dlls/winebus.sys/bus.h
index 099558b..342a66b 100644
--- a/dlls/winebus.sys/bus.h
+++ b/dlls/winebus.sys/bus.h
@@ -34,3 +34,4 @@ DEVICE_OBJECT *bus_create_hid_device(DRIVER_OBJECT *driver, const WCHAR *busidW,
const GUID *class, const platform_vtbl *vtbl, DWORD platform_data_size) DECLSPEC_HIDDEN;
DEVICE_OBJECT *bus_find_hid_device(const platform_vtbl *vtbl, void *platform_dev) DECLSPEC_HIDDEN;
void bus_remove_hid_device(DEVICE_OBJECT *device) DECLSPEC_HIDDEN;
+NTSTATUS WINAPI hid_internal_dispatch(DEVICE_OBJECT *device, IRP *irp) DECLSPEC_HIDDEN;
diff --git a/dlls/winebus.sys/bus_udev.c b/dlls/winebus.sys/bus_udev.c
index 93e56f3..a01d88e 100644
--- a/dlls/winebus.sys/bus_udev.c
+++ b/dlls/winebus.sys/bus_udev.c
@@ -299,6 +299,7 @@ NTSTATUS WINAPI udev_driver_init(DRIVER_OBJECT *driver, UNICODE_STRING *registry
udev_driver_obj = driver;
driver->MajorFunction[IRP_MJ_PNP] = common_pnp_dispatch;
+ driver->MajorFunction[IRP_MJ_INTERNAL_DEVICE_CONTROL] = hid_internal_dispatch;
if (!(events[0] = CreateEventW(NULL, TRUE, FALSE, NULL)))
goto error;
diff --git a/dlls/winebus.sys/main.c b/dlls/winebus.sys/main.c
index 09a59d6..eaa0b93 100644
--- a/dlls/winebus.sys/main.c
+++ b/dlls/winebus.sys/main.c
@@ -30,7 +30,9 @@
#include "winternl.h"
#include "winreg.h"
#include "setupapi.h"
+#include "winioctl.h"
#include "ddk/wdm.h"
+#include "ddk/hidport.h"
#include "wine/debug.h"
#include "wine/unicode.h"
#include "wine/list.h"
@@ -346,6 +348,50 @@ NTSTATUS WINAPI common_pnp_dispatch(DEVICE_OBJECT *device, IRP *irp)
return status;
}
+NTSTATUS WINAPI hid_internal_dispatch(DEVICE_OBJECT *device, IRP *irp)
+{
+ NTSTATUS status = irp->IoStatus.u.Status;
+ IO_STACK_LOCATION *irpsp = IoGetCurrentIrpStackLocation(irp);
+ struct device_extension *extension = (struct device_extension *)device->DeviceExtension;
+
+ TRACE("(%p, %p)\n", device, irp);
+
+ switch (irpsp->Parameters.DeviceIoControl.IoControlCode)
+ {
+ case IOCTL_HID_GET_DEVICE_ATTRIBUTES:
+ {
+ HID_DEVICE_ATTRIBUTES *attr = (HID_DEVICE_ATTRIBUTES *)irp->UserBuffer;
+ TRACE("IOCTL_HID_GET_DEVICE_ATTRIBUTES\n");
+
+ if (irpsp->Parameters.DeviceIoControl.OutputBufferLength < sizeof(*attr))
+ {
+ irp->IoStatus.u.Status = status = STATUS_BUFFER_TOO_SMALL;
+ break;
+ }
+
+ memset(attr, 0, sizeof(*attr));
+ attr->Size = sizeof(HID_DEVICE_ATTRIBUTES);
+ attr->VendorID = extension->vid;
+ attr->ProductID = extension->pid;
+ attr->VersionNumber = extension->version;
+ irp->IoStatus.u.Status = status = STATUS_SUCCESS;
+ irp->IoStatus.Information = sizeof(HID_DEVICE_ATTRIBUTES);
+ break;
+ }
+ 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;
+}
+
NTSTATUS WINAPI DriverEntry( DRIVER_OBJECT *driver, UNICODE_STRING *path )
{
static const WCHAR udevW[] = {'\\','D','r','i','v','e','r','\\','U','D','E','V',0};
More information about the wine-cvs
mailing list