[PATCH v3 5/6] user32: Use HID ioctls directly.

Zebediah Figura wine at gitlab.winehq.org
Wed Jun 1 19:40:46 CDT 2022


From: Zebediah Figura <zfigura at codeweavers.com>

Signed-off-by: Zebediah Figura <zfigura at codeweavers.com>
---
 dlls/user32/Makefile.in |  2 +-
 dlls/user32/rawinput.c  | 53 +++++++++++++++++++++++++----------------
 2 files changed, 33 insertions(+), 22 deletions(-)

diff --git a/dlls/user32/Makefile.in b/dlls/user32/Makefile.in
index 3f4115c5679..79821929390 100644
--- a/dlls/user32/Makefile.in
+++ b/dlls/user32/Makefile.in
@@ -3,7 +3,7 @@ MODULE    = user32.dll
 IMPORTLIB = user32
 IMPORTS   = $(PNG_PE_LIBS) gdi32 version sechost advapi32 kernelbase win32u
 EXTRAINCL = $(PNG_PE_CFLAGS)
-DELAYIMPORTS = hid setupapi imm32
+DELAYIMPORTS = setupapi imm32
 
 C_SRCS = \
 	button.c \
diff --git a/dlls/user32/rawinput.c b/dlls/user32/rawinput.c
index c9afc18ea53..5f5c898be0e 100644
--- a/dlls/user32/rawinput.c
+++ b/dlls/user32/rawinput.c
@@ -26,11 +26,11 @@
 #include "windef.h"
 #include "winbase.h"
 #include "wingdi.h"
+#include "winioctl.h"
 #include "winnls.h"
 #include "winreg.h"
 #include "winuser.h"
 #include "setupapi.h"
-#include "ddk/hidsdi.h"
 #include "wine/debug.h"
 #include "wine/server.h"
 #include "wine/hid.h"
@@ -53,7 +53,7 @@ struct device
     HANDLE file;
     HANDLE handle;
     RID_DEVICE_INFO info;
-    PHIDP_PREPARSED_DATA data;
+    struct hid_preparsed_data *data;
 };
 
 static struct device *rawinput_devices;
@@ -100,12 +100,13 @@ static struct device *add_device( HDEVINFO set, SP_DEVICE_INTERFACE_DATA *iface,
     static const RID_DEVICE_INFO_KEYBOARD keyboard_info = {0, 0, 1, 12, 3, 101};
     static const RID_DEVICE_INFO_MOUSE mouse_info = {1, 5, 0, FALSE};
     SP_DEVINFO_DATA device_data = {sizeof(device_data)};
-    PHIDP_PREPARSED_DATA preparsed_data = NULL;
+    struct hid_preparsed_data *preparsed = NULL;
     SP_DEVICE_INTERFACE_DETAIL_DATA_W *detail;
-    struct hid_preparsed_data *preparsed;
+    HID_COLLECTION_INFORMATION hid_info;
     struct device *device = NULL;
     RID_DEVICE_INFO info;
-    HIDD_ATTRIBUTES attr;
+    IO_STATUS_BLOCK io;
+    NTSTATUS status;
     UINT32 handle;
     DWORD i, size;
     HANDLE file;
@@ -152,23 +153,33 @@ static struct device *add_device( HDEVINFO set, SP_DEVICE_INTERFACE_DATA *iface,
     switch (type)
     {
     case RIM_TYPEHID:
-        attr.Size = sizeof(HIDD_ATTRIBUTES);
-        if (!HidD_GetAttributes( device->file, &attr ))
+        status = NtDeviceIoControlFile( device->file, NULL, NULL, NULL, &io,
+                                        IOCTL_HID_GET_COLLECTION_INFORMATION,
+                                        NULL, 0, &hid_info, sizeof(hid_info) );
+        if (status)
         {
-            ERR( "Failed to get attributes.\n" );
+            ERR( "Failed to get collection information, status %#lx.\n", status );
             goto fail;
         }
 
-        info.hid.dwVendorId = attr.VendorID;
-        info.hid.dwProductId = attr.ProductID;
-        info.hid.dwVersionNumber = attr.VersionNumber;
+        info.hid.dwVendorId = hid_info.VendorID;
+        info.hid.dwProductId = hid_info.ProductID;
+        info.hid.dwVersionNumber = hid_info.VersionNumber;
+
+        if (!(preparsed = malloc( hid_info.DescriptorSize )))
+        {
+            ERR( "Failed to allocate memory.\n" );
+            goto fail;
+        }
 
-        if (!HidD_GetPreparsedData( file, &preparsed_data ))
+        status = NtDeviceIoControlFile( device->file, NULL, NULL, NULL, &io,
+                                        IOCTL_HID_GET_COLLECTION_DESCRIPTOR,
+                                        NULL, 0, preparsed, hid_info.DescriptorSize );
+        if (status)
         {
-            ERR( "Failed to get preparsed data.\n" );
+            ERR( "Failed to get collection descriptor, status %#lx.\n", status );
             goto fail;
         }
-        preparsed = (struct hid_preparsed_data *)preparsed_data;
 
         info.hid.usUsagePage = preparsed->usage_page;
         info.hid.usUsage = preparsed->usage;
@@ -190,7 +201,7 @@ static struct device *add_device( HDEVINFO set, SP_DEVICE_INTERFACE_DATA *iface,
     if (device)
     {
         TRACE("Updating device %x / %s.\n", handle, debugstr_w(detail->DevicePath));
-        HidD_FreePreparsedData(device->data);
+        free(device->data);
         CloseHandle(device->file);
         free(device->detail);
     }
@@ -210,12 +221,12 @@ static struct device *add_device( HDEVINFO set, SP_DEVICE_INTERFACE_DATA *iface,
     device->file = file;
     device->handle = ULongToHandle(handle);
     device->info = info;
-    device->data = preparsed_data;
+    device->data = preparsed;
 
     return device;
 
 fail:
-    free( preparsed_data );
+    free( preparsed );
     CloseHandle( file );
     free( detail );
     return NULL;
@@ -235,7 +246,7 @@ void rawinput_update_device_list(void)
     /* destroy previous list */
     for (idx = 0; idx < rawinput_devices_count; ++idx)
     {
-        HidD_FreePreparsedData(rawinput_devices[idx].data);
+        free(rawinput_devices[idx].data);
         CloseHandle(rawinput_devices[idx].file);
         free(rawinput_devices[idx].detail);
     }
@@ -779,12 +790,12 @@ UINT WINAPI GetRawInputDeviceInfoW(HANDLE handle, UINT command, void *data, UINT
         break;
 
     case RIDI_PREPARSEDDATA:
-        if (!(preparsed = (struct hid_preparsed_data *)device->data)) len = 0;
+        if (!(preparsed = device->data)) len = 0;
         else len = preparsed->caps_size + FIELD_OFFSET(struct hid_preparsed_data, value_caps[0]) +
                    preparsed->number_link_collection_nodes * sizeof(struct hid_collection_node);
 
-        if (device->data && len <= data_len && data)
-            memcpy(data, device->data, len);
+        if (preparsed && len <= data_len && data)
+            memcpy(data, preparsed, len);
         *data_size = len;
         break;
 
-- 
GitLab


https://gitlab.winehq.org/wine/wine/-/merge_requests/130



More information about the wine-devel mailing list