[PATCH v3 2/4] server: Add HID reports count / length to rawinput union.

Rémi Bernon rbernon at codeweavers.com
Mon May 17 03:36:07 CDT 2021


And send HID reports data in send_hardware_message request, then append
the reports after hardware_msg_data.

Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=50506
Signed-off-by: Rémi Bernon <rbernon at codeweavers.com>
---
 dlls/user32/message.c |  4 +++-
 server/protocol.def   |  3 +++
 server/queue.c        | 11 +++++++++--
 server/trace.c        |  4 ++--
 tools/make_requests   |  2 +-
 5 files changed, 18 insertions(+), 6 deletions(-)

diff --git a/dlls/user32/message.c b/dlls/user32/message.c
index 9af33c3291e..71d0be8913e 100644
--- a/dlls/user32/message.c
+++ b/dlls/user32/message.c
@@ -3288,11 +3288,13 @@ NTSTATUS send_hardware_message( HWND hwnd, const INPUT *input, const RAWINPUT *r
                 switch (rawinput->header.dwType)
                 {
                 case RIM_TYPEHID:
-                    assert( rawinput->data.hid.dwCount <= 1 );
                     req->input.hw.rawinput.hid.device = HandleToUlong( rawinput->header.hDevice );
                     req->input.hw.rawinput.hid.param = rawinput->header.wParam;
                     req->input.hw.rawinput.hid.usage_page = hid_usage_page;
                     req->input.hw.rawinput.hid.usage = hid_usage;
+                    req->input.hw.rawinput.hid.count = rawinput->data.hid.dwCount;
+                    req->input.hw.rawinput.hid.length = rawinput->data.hid.dwSizeHid;
+                    wine_server_add_data( req, rawinput->data.hid.bRawData, rawinput->data.hid.dwCount * rawinput->data.hid.dwSizeHid );
                     break;
                 default:
                     assert( 0 );
diff --git a/server/protocol.def b/server/protocol.def
index 6d8208b128b..924dc406a49 100644
--- a/server/protocol.def
+++ b/server/protocol.def
@@ -302,6 +302,8 @@ union rawinput
         unsigned int   param;   /* rawinput message param */
         unsigned short usage_page;/* HID usage page */
         unsigned short usage;   /* HID usage */
+        unsigned int   count;   /* HID report count */
+        unsigned int   length;  /* HID report length */
     } hid;
 };
 
@@ -2030,6 +2032,7 @@ enum message_type
     user_handle_t   win;       /* window handle */
     hw_input_t      input;     /* input data */
     unsigned int    flags;     /* flags (see below) */
+    VARARG(report,bytes);      /* HID report data */
 @REPLY
     int             wait;      /* do we need to wait for a reply? */
     int             prev_x;    /* previous cursor position */
diff --git a/server/queue.c b/server/queue.c
index c43386ee317..4f1695c92cc 100644
--- a/server/queue.c
+++ b/server/queue.c
@@ -2000,8 +2000,15 @@ static void queue_custom_hardware_message( struct desktop *desktop, user_handle_
         raw_msg.source     = source;
         raw_msg.time       = get_tick_count();
         raw_msg.message    = input->hw.msg;
-        raw_msg.extra      = NULL;
-        raw_msg.extra_len  = 0;
+        raw_msg.extra      = get_req_data();
+        raw_msg.extra_len  = get_req_data_size();
+
+        if (input->hw.rawinput.type == RIM_TYPEHID &&
+            raw_msg.extra_len != input->hw.rawinput.hid.length * input->hw.rawinput.hid.count)
+        {
+            set_error( STATUS_INVALID_PARAMETER );
+            return;
+        }
 
         msg_data = &raw_msg.data;
         msg_data->info     = 0;
diff --git a/server/trace.c b/server/trace.c
index ad7236dd393..3cb601e774d 100644
--- a/server/trace.c
+++ b/server/trace.c
@@ -408,9 +408,9 @@ static void dump_rawinput( const char *prefix, const union rawinput *rawinput )
                  rawinput->kbd.message, rawinput->kbd.vkey, rawinput->kbd.scan );
         break;
     case RIM_TYPEHID:
-        fprintf( stderr, "%s{type=HID,device=%04x,param=%04x,page=%04hx,usage=%04hx}",
+        fprintf( stderr, "%s{type=HID,device=%04x,param=%04x,page=%04hx,usage=%04hx,count=%u,length=%u}",
                  prefix, rawinput->hid.device, rawinput->hid.param, rawinput->hid.usage_page,
-                 rawinput->hid.usage );
+                 rawinput->hid.usage, rawinput->hid.count, rawinput->hid.length );
         break;
     default:
         fprintf( stderr, "%s{type=%04x}", prefix, rawinput->type );
diff --git a/tools/make_requests b/tools/make_requests
index a70b29df3d2..1c4e5977c8b 100755
--- a/tools/make_requests
+++ b/tools/make_requests
@@ -52,7 +52,7 @@ my %formats =
     "luid_t"        => [  8,   4,  "&dump_luid" ],
     "generic_map_t" => [  16,  4,  "&dump_generic_map" ],
     "ioctl_code_t"  => [  4,   4,  "&dump_ioctl_code" ],
-    "hw_input_t"    => [  32,  8,  "&dump_hw_input" ],
+    "hw_input_t"    => [  40,  8,  "&dump_hw_input" ],
 );
 
 my @requests = ();
-- 
2.31.0




More information about the wine-devel mailing list