From c66984d17481ac336c1ed335d1e60f7a3da835f2 Mon Sep 17 00:00:00 2001 From: Jacek Caban Date: Tue, 18 Jul 2023 22:07:07 +0200 Subject: [PATCH] win32u: Use user message packing for LB_GETSELITEMS. --- dlls/user32/winproc.c | 3 +-- dlls/win32u/message.c | 12 +++++++++--- dlls/win32u/tests/win32u.c | 6 ++++++ dlls/wow64win/user.c | 1 + 4 files changed, 17 insertions(+), 5 deletions(-) diff --git a/dlls/user32/winproc.c b/dlls/user32/winproc.c index dc59413b048..a8524c746b3 100644 --- a/dlls/user32/winproc.c +++ b/dlls/user32/winproc.c @@ -875,9 +875,7 @@ BOOL unpack_message( HWND hwnd, UINT message, WPARAM *wparam, LPARAM *lparam, case LB_SELECTSTRING: case CB_GETLBTEXT: case LB_GETTEXT: - break; case LB_GETSELITEMS: - if (!get_buffer_space( buffer, *wparam * sizeof(UINT), size )) return FALSE; break; case WM_NEXTMENU: { @@ -1063,6 +1061,7 @@ BOOL WINAPI User32CallWindowProc( struct win_proc_params *params, ULONG size ) case LB_SELECTSTRING: case CB_GETLBTEXT: case LB_GETTEXT: + case LB_GETSELITEMS: { LRESULT *result_ptr = (LRESULT *)buffer - 1; *result_ptr = result; diff --git a/dlls/win32u/message.c b/dlls/win32u/message.c index a32d4bfa1cf..bb052ade359 100644 --- a/dlls/win32u/message.c +++ b/dlls/win32u/message.c @@ -631,6 +631,9 @@ static BOOL unpack_message( HWND hwnd, UINT message, WPARAM *wparam, LPARAM *lpa if (!get_buffer_space( buffer, size, prev_size )) return FALSE; break; } + case LB_GETSELITEMS: + if (!get_buffer_space( buffer, *wparam * sizeof(UINT), size )) return FALSE; + break; case WM_WINE_SETWINDOWPOS: { WINDOWPOS wp; @@ -1470,6 +1473,9 @@ size_t user_message_size( HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam, size = send_message_timeout( hwnd, LB_GETTEXTLEN, wparam, 0, SMTO_NORMAL, 0, ansi ); size = (size + 1) * char_size( ansi ); break; + case LB_GETSELITEMS: + size = wparam * sizeof(UINT); + break; } return size; @@ -1640,6 +1646,9 @@ static void copy_user_result( void *buffer, size_t size, LRESULT result, UINT me case EM_GETLINE: copy_size = string_size( buffer, ansi ); break; + case LB_GETSELITEMS: + copy_size = wparam * sizeof(UINT); + break; default: return; } @@ -1667,9 +1676,6 @@ static void copy_reply( LRESULT result, HWND hwnd, UINT message, WPARAM wparam, case WM_MOVING: copy_size = sizeof(RECT); break; - case LB_GETSELITEMS: - copy_size = wparam * sizeof(UINT); - break; case WM_MDIGETACTIVE: if (lparam) copy_size = sizeof(BOOL); break; diff --git a/dlls/win32u/tests/win32u.c b/dlls/win32u/tests/win32u.c index a435ca47bb4..d0f79b5c124 100644 --- a/dlls/win32u/tests/win32u.c +++ b/dlls/win32u/tests/win32u.c @@ -1681,6 +1681,7 @@ static void test_wndproc_hook(void) static const SCROLLBARINFO sbi_out = { .xyThumbTop = 60 }; static const DWORD dw_in = 1, dw_out = 2; static const UINT32 tabstops_in[2] = { 3, 4 }; + static const UINT32 items_out[2] = { 1, 2 }; static const struct lparam_hook_test lparam_hook_tests[] = { @@ -1891,6 +1892,11 @@ static void test_wndproc_hook(void) .lparam_size = sizeof(tabstops_in), .lparam = &tabstops_in, .poison_lparam = TRUE, .check_size = sizeof(tabstops_in), }, + { + "LB_GETSELITEMS", LB_GETSELITEMS, + .wparam = ARRAYSIZE(items_out), .msg_result = ARRAYSIZE(items_out), + .lparam_size = sizeof(items_out), .change_lparam = items_out, + }, /* messages that don't change lparam */ { "WM_USER", WM_USER }, { "WM_NOTIFY", WM_NOTIFY }, diff --git a/dlls/wow64win/user.c b/dlls/wow64win/user.c index c03fd4cabf9..326c9256f1d 100644 --- a/dlls/wow64win/user.c +++ b/dlls/wow64win/user.c @@ -846,6 +846,7 @@ static size_t packed_result_32to64( UINT message, WPARAM wparam, const void *par case EM_GETLINE: case CB_GETLBTEXT: case LB_GETTEXT: + case LB_GETSELITEMS: break; default: