Signed-off-by: Zebediah Figura zfigura@codeweavers.com --- An alternative approach is not to go through the HID stack, but rather to create a winemouse.sys directly. In the event that an application ever needs to use the mouse device, this may be easier than implementing translation to and from HID reports. On the other hand, given that evdev and hidraw can already expose mice, implementing mouhid.sys may be worthwhile anyway.
dlls/hidclass.sys/device.c | 9 +++++++++ dlls/hidclass.sys/hid.h | 3 +++ dlls/hidclass.sys/pnp.c | 5 +++++ 3 files changed, 17 insertions(+)
diff --git a/dlls/hidclass.sys/device.c b/dlls/hidclass.sys/device.c index e96177225ba..60506ec9ce7 100644 --- a/dlls/hidclass.sys/device.c +++ b/dlls/hidclass.sys/device.c @@ -33,6 +33,7 @@
#include "initguid.h" #include "devguid.h" +#include "ntddmou.h"
WINE_DEFAULT_DEBUG_CHANNEL(hid); WINE_DECLARE_DEBUG_CHANNEL(hid_report); @@ -122,6 +123,14 @@ NTSTATUS HID_LinkDevice(DEVICE_OBJECT *device) return status; }
+ /* FIXME: This should probably be done in mouhid.sys. */ + if (ext->preparseData->caps.UsagePage == HID_USAGE_PAGE_GENERIC + && ext->preparseData->caps.Usage == HID_USAGE_GENERIC_MOUSE) + { + if (!IoRegisterDeviceInterface(device, &GUID_DEVINTERFACE_MOUSE, NULL, &ext->mouse_link_name)) + ext->is_mouse = TRUE; + } + return STATUS_SUCCESS;
error: diff --git a/dlls/hidclass.sys/hid.h b/dlls/hidclass.sys/hid.h index 0f82323dfb5..86d7bdf98f1 100644 --- a/dlls/hidclass.sys/hid.h +++ b/dlls/hidclass.sys/hid.h @@ -55,6 +55,9 @@ typedef struct _BASE_DEVICE_EXTENSION { KSPIN_LOCK irp_queue_lock; LIST_ENTRY irp_queue;
+ BOOL is_mouse; + UNICODE_STRING mouse_link_name; + /* Minidriver Specific stuff will end up here */ } BASE_DEVICE_EXTENSION;
diff --git a/dlls/hidclass.sys/pnp.c b/dlls/hidclass.sys/pnp.c index 8265efd9b4e..b5c99870148 100644 --- a/dlls/hidclass.sys/pnp.c +++ b/dlls/hidclass.sys/pnp.c @@ -215,6 +215,9 @@ NTSTATUS PNP_RemoveDevice(minidriver *minidriver, DEVICE_OBJECT *device, IRP *ir return rc; }
+ if (ext->is_mouse) + IoSetDeviceInterfaceState(&ext->mouse_link_name, FALSE); + if (irp) rc = minidriver->PNPDispatch(device, irp); HID_DeleteDevice(device); @@ -294,6 +297,8 @@ NTSTATUS WINAPI HID_PNP_Dispatch(DEVICE_OBJECT *device, IRP *irp) rc = minidriver->PNPDispatch(device, irp);
IoSetDeviceInterfaceState(&ext->link_name, TRUE); + if (ext->is_mouse) + IoSetDeviceInterfaceState(&ext->mouse_link_name, TRUE); return rc; } case IRP_MN_REMOVE_DEVICE: