Module: wine Branch: master Commit: a883b3c5c7bf5313e4831fa2da9cdf06f99aa769 URL: https://gitlab.winehq.org/wine/wine/-/commit/a883b3c5c7bf5313e4831fa2da9cdf0...
Author: Jacek Caban jacek@codeweavers.com Date: Tue Jul 18 13:39:04 2023 +0200
win32u: Use user message packing for WM_GETDLGCODE.
---
dlls/user32/winproc.c | 17 ++--------------- dlls/win32u/message.c | 46 ++++++++++++++++++---------------------------- dlls/win32u/tests/win32u.c | 6 ++++++ dlls/wow64win/user.c | 4 ++++ 4 files changed, 30 insertions(+), 43 deletions(-)
diff --git a/dlls/user32/winproc.c b/dlls/user32/winproc.c index e759c5565b7..6fd35691e68 100644 --- a/dlls/user32/winproc.c +++ b/dlls/user32/winproc.c @@ -856,25 +856,11 @@ BOOL unpack_message( HWND hwnd, UINT message, WPARAM *wparam, LPARAM *lparam, case WM_HELP: case WM_STYLECHANGING: case WM_STYLECHANGED: + case WM_GETDLGCODE: break; case WM_NOTIFY: /* WM_NOTIFY cannot be sent across processes (MSDN) */ return FALSE; - case WM_GETDLGCODE: - if (*lparam) - { - MSG msg; - if (size < sizeof(ps->msg)) return FALSE; - msg.hwnd = unpack_handle( ps->msg.hwnd ); - msg.message = ps->msg.message; - msg.wParam = (ULONG_PTR)unpack_ptr( ps->msg.wParam ); - msg.lParam = (ULONG_PTR)unpack_ptr( ps->msg.lParam ); - msg.time = ps->msg.time; - msg.pt = ps->msg.pt; - memcpy( &ps->msg, &msg, sizeof(msg) ); - break; - } - return TRUE; case SBM_SETSCROLLINFO: minsize = sizeof(SCROLLINFO); break; @@ -1103,6 +1089,7 @@ BOOL WINAPI User32CallWindowProc( struct win_proc_params *params, ULONG size ) case WM_HELP: case WM_STYLECHANGING: case WM_STYLECHANGED: + case WM_GETDLGCODE: { LRESULT *result_ptr = (LRESULT *)buffer - 1; *result_ptr = result; diff --git a/dlls/win32u/message.c b/dlls/win32u/message.c index f3068a9c618..9f8bf863b55 100644 --- a/dlls/win32u/message.c +++ b/dlls/win32u/message.c @@ -540,6 +540,21 @@ static BOOL unpack_message( HWND hwnd, UINT message, WPARAM *wparam, LPARAM *lpa case WM_STYLECHANGED: minsize = sizeof(STYLESTRUCT); break; + case WM_GETDLGCODE: + if (*lparam) + { + MSG msg; + if (size < sizeof(ps->msg)) return FALSE; + msg.hwnd = wine_server_ptr_handle( ps->msg.hwnd ); + msg.message = ps->msg.message; + msg.wParam = (ULONG_PTR)unpack_ptr( ps->msg.wParam ); + msg.lParam = (ULONG_PTR)unpack_ptr( ps->msg.lParam ); + msg.time = ps->msg.time; + msg.pt = ps->msg.pt; + memcpy( &ps->msg, &msg, sizeof(msg) ); + break; + } + return TRUE; case WM_WINE_SETWINDOWPOS: { WINDOWPOS wp; @@ -1006,19 +1021,6 @@ static void pack_reply( HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam, push_data( data, &data->ps.wp, sizeof(data->ps.wp) ); break; } - case WM_GETDLGCODE: - if (lparam) - { - MSG *msg = (MSG *)lparam; - data->ps.msg.hwnd = wine_server_user_handle( msg->hwnd ); - data->ps.msg.message = msg->message; - data->ps.msg.wParam = msg->wParam; - data->ps.msg.lParam = msg->lParam; - data->ps.msg.time = msg->time; - data->ps.msg.pt = msg->pt; - push_data( data, &data->ps.msg, sizeof(data->ps.msg) ); - } - break; case SBM_GETSCROLLINFO: push_data( data, (SCROLLINFO *)lparam, sizeof(SCROLLINFO) ); break; @@ -1159,18 +1161,6 @@ static void unpack_reply( HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam, wp->flags = ps->wp.flags; } break; - case WM_GETDLGCODE: - if (lparam && size >= sizeof(ps->msg)) - { - MSG *msg = (MSG *)lparam; - msg->hwnd = wine_server_ptr_handle( ps->msg.hwnd ); - msg->message = ps->msg.message; - msg->wParam = (ULONG_PTR)unpack_ptr( ps->msg.wParam ); - msg->lParam = (ULONG_PTR)unpack_ptr( ps->msg.lParam ); - msg->time = ps->msg.time; - msg->pt = ps->msg.pt; - } - break; case SBM_GETSCROLLINFO: memcpy( (SCROLLINFO *)lparam, buffer, min( sizeof(SCROLLINFO), size )); break; @@ -1356,6 +1346,9 @@ size_t user_message_size( UINT message, WPARAM wparam, LPARAM lparam, BOOL other case WM_STYLECHANGED: size = sizeof(STYLESTRUCT); break; + case WM_GETDLGCODE: + size = sizeof(MSG); + break; }
return size; @@ -1514,9 +1507,6 @@ static void copy_reply( LRESULT result, HWND hwnd, UINT message, WPARAM wparam, case CB_GETCOMBOBOXINFO: copy_size = sizeof(COMBOBOXINFO); break; - case WM_GETDLGCODE: - if (lparam) copy_size = sizeof(MSG); - break; case SBM_GETSCROLLINFO: copy_size = sizeof(SCROLLINFO); break; diff --git a/dlls/win32u/tests/win32u.c b/dlls/win32u/tests/win32u.c index fd526bcb36b..d6cecc778d9 100644 --- a/dlls/win32u/tests/win32u.c +++ b/dlls/win32u/tests/win32u.c @@ -1658,6 +1658,7 @@ static void test_wndproc_hook(void) static const COPYDATASTRUCT cds5_in = { .lpData = (void *)0xdeadbeef }; static const STYLESTRUCT style_in = { .styleOld = 1, .styleNew = 2 }; static const STYLESTRUCT style_out = { .styleOld = 10, .styleNew = 20 }; + static const MSG msg_in = { .wParam = 1, .lParam = 2 };
static const struct lparam_hook_test lparam_hook_tests[] = { @@ -1807,6 +1808,11 @@ static void test_wndproc_hook(void) .lparam_size = sizeof(style_in), .lparam = &style_in, .poison_lparam = TRUE, .check_size = sizeof(style_in), }, + { + "WM_GETDLGCODE", WM_GETDLGCODE, + .lparam_size = sizeof(msg_in), .lparam = &msg_in, .poison_lparam = TRUE, + .check_size = sizeof(msg_in), + }, /* 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 d5d017a086f..c90dc22e31f 100644 --- a/dlls/wow64win/user.c +++ b/dlls/wow64win/user.c @@ -758,6 +758,10 @@ static size_t packed_message_64to32( UINT message, WPARAM wparam, memcpy( params32, &hi32, sizeof(hi32) ); return sizeof(hi32); } + + case WM_GETDLGCODE: + msg_64to32( params64, params32 ); + return sizeof(MSG32); }
memmove( params32, params64, size );