Rémi Bernon : user32: Inform rawinput_from_hardware_message of available buffer size.
Alexandre Julliard
julliard at winehq.org
Mon May 31 15:58:36 CDT 2021
Module: wine
Branch: master
Commit: ae7458aca6d174212b03d37e7daabb8deafb5e0e
URL: https://source.winehq.org/git/wine.git/?a=commit;h=ae7458aca6d174212b03d37e7daabb8deafb5e0e
Author: Rémi Bernon <rbernon at codeweavers.com>
Date: Fri May 28 16:12:18 2021 +0200
user32: Inform rawinput_from_hardware_message of available buffer size.
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=50506
Signed-off-by: Rémi Bernon <rbernon at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/user32/message.c | 1 +
dlls/user32/rawinput.c | 7 +++++--
2 files changed, 6 insertions(+), 2 deletions(-)
diff --git a/dlls/user32/message.c b/dlls/user32/message.c
index 9af33c3291e..be178072e6f 100644
--- a/dlls/user32/message.c
+++ b/dlls/user32/message.c
@@ -2292,6 +2292,7 @@ static BOOL process_rawinput_message( MSG *msg, UINT hw_id, const struct hardwar
if (msg->message == WM_INPUT)
{
+ thread_data->buffer->header.dwSize = RAWINPUT_BUFFER_SIZE;
if (!rawinput_from_hardware_message( thread_data->buffer, msg_data )) return FALSE;
thread_data->hw_id = hw_id;
msg->lParam = (LPARAM)hw_id;
diff --git a/dlls/user32/rawinput.c b/dlls/user32/rawinput.c
index 115513ea144..efc736625d5 100644
--- a/dlls/user32/rawinput.c
+++ b/dlls/user32/rawinput.c
@@ -564,7 +564,7 @@ UINT WINAPI DECLSPEC_HOTPATCH GetRawInputBuffer(RAWINPUT *data, UINT *data_size,
struct hardware_msg_data *msg_data;
struct rawinput_thread_data *thread_data;
RAWINPUT *rawinput;
- UINT count = 0, rawinput_size, next_size, overhead;
+ UINT count = 0, remaining, rawinput_size, next_size, overhead;
BOOL is_wow64;
int i;
@@ -617,12 +617,15 @@ UINT WINAPI DECLSPEC_HOTPATCH GetRawInputBuffer(RAWINPUT *data, UINT *data_size,
}
SERVER_END_REQ;
+ remaining = *data_size;
for (i = 0; i < count; ++i)
{
- rawinput_from_hardware_message(data, msg_data);
+ data->header.dwSize = remaining;
+ if (!rawinput_from_hardware_message(data, msg_data)) break;
if (overhead) memmove((char *)&data->data + overhead, &data->data,
data->header.dwSize - sizeof(RAWINPUTHEADER));
data->header.dwSize += overhead;
+ remaining -= data->header.dwSize;
data = NEXTRAWINPUTBLOCK(data);
msg_data = (struct hardware_msg_data *)((char *)msg_data + msg_data->size);
}
More information about the wine-cvs
mailing list