Module: wine
Branch: master
Commit: a883b3c5c7bf5313e4831fa2da9cdf06f99aa769
URL:
https://gitlab.winehq.org/wine/wine/-/commit/a883b3c5c7bf5313e4831fa2da9cdf…
Author: Jacek Caban <jacek(a)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 );