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@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 = ();