Continuation of !3388.
From: Jacek Caban jacek@codeweavers.com
--- dlls/user32/winproc.c | 3 ++- dlls/win32u/message.c | 40 ++++++++++++++++++++++++++++++++------ dlls/win32u/tests/win32u.c | 7 ------- dlls/wow64win/user.c | 4 ++++ 4 files changed, 40 insertions(+), 14 deletions(-)
diff --git a/dlls/user32/winproc.c b/dlls/user32/winproc.c index 1f9b42d0c06..530f87633d9 100644 --- a/dlls/user32/winproc.c +++ b/dlls/user32/winproc.c @@ -833,7 +833,6 @@ BOOL unpack_message( HWND hwnd, UINT message, WPARAM *wparam, LPARAM *lparam, break; case WM_GETTEXT: case WM_ASKCBFORMATNAME: - if (!get_buffer_space( buffer, (*wparam * sizeof(WCHAR)), size )) return FALSE; break; case WM_WININICHANGE: if (!*lparam) return TRUE; @@ -1183,6 +1182,8 @@ BOOL WINAPI User32CallWindowProc( struct win_proc_params *params, ULONG size ) case WM_NCCREATE: case WM_CREATE: case WM_NCCALCSIZE: + case WM_GETTEXT: + case WM_ASKCBFORMATNAME: { LRESULT *result_ptr = (LRESULT *)buffer - 1; *result_ptr = result; diff --git a/dlls/win32u/message.c b/dlls/win32u/message.c index 58294f4d385..6cf5d4ea47d 100644 --- a/dlls/win32u/message.c +++ b/dlls/win32u/message.c @@ -308,6 +308,13 @@ static inline void push_string( struct packed_message *data, LPCWSTR str ) push_data( data, str, (lstrlenW(str) + 1) * sizeof(WCHAR) ); }
+/* make sure that there is space for 'size' bytes in buffer, growing it if needed */ +static inline void *get_buffer_space( void **buffer, size_t size, size_t prev_size ) +{ + if (prev_size < size) *buffer = malloc( size ); + return *buffer; +} + /* check whether a combobox expects strings or ids in CB_ADDSTRING/CB_INSERTSTRING */ static inline BOOL combobox_has_strings( HWND hwnd ) { @@ -409,6 +416,10 @@ static BOOL unpack_message( HWND hwnd, UINT message, WPARAM *wparam, LPARAM *lpa *ncp.lppos = wp; } break; + case WM_GETTEXT: + case WM_ASKCBFORMATNAME: + if (!get_buffer_space( buffer, (*wparam * sizeof(WCHAR)), size )) return FALSE; + break; case WM_WINE_SETWINDOWPOS: { WINDOWPOS wp; @@ -1139,6 +1150,11 @@ static void unpack_reply( HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam, } }
+static size_t char_size( BOOL ansi ) +{ + return ansi ? sizeof(char) : sizeof(WCHAR); +} + static size_t string_size( const void *str, BOOL ansi ) { return ansi ? strlen( str ) + 1 : (wcslen( str ) + 1) * sizeof(WCHAR); @@ -1175,6 +1191,10 @@ size_t user_message_size( UINT message, WPARAM wparam, LPARAM lparam, BOOL ansi case WM_NCCALCSIZE: size = wparam ? sizeof(NCCALCSIZE_PARAMS) + sizeof(WINDOWPOS) : sizeof(RECT); break; + case WM_GETTEXT: + case WM_ASKCBFORMATNAME: + size = wparam * char_size( ansi ); + break; }
return size; @@ -1222,6 +1242,10 @@ void pack_user_message( void *buffer, size_t size, UINT message, size = sizeof(*ncp); } break; + case WM_GETTEXT: + case WM_ASKCBFORMATNAME: + if (wparam) memset( buffer, 0, char_size( ansi )); + return; }
if (size) memcpy( buffer, lparam_ptr, size ); @@ -1232,7 +1256,8 @@ void pack_user_message( void *buffer, size_t size, UINT message, * * Copy a message result received from client. */ -static void copy_user_result( void *buffer, size_t size, UINT message, WPARAM wparam, LPARAM lparam ) +static void copy_user_result( void *buffer, size_t size, LRESULT result, UINT message, + WPARAM wparam, LPARAM lparam, BOOL ansi ) { void *lparam_ptr = (void *)lparam; size_t copy_size = 0; @@ -1274,6 +1299,13 @@ static void copy_user_result( void *buffer, size_t size, UINT message, WPARAM wp } copy_size = sizeof(RECT); break; + case WM_GETTEXT: + if (!result) memset( buffer, 0, char_size( ansi )); + copy_size = string_size( buffer, ansi ); + break; + case WM_ASKCBFORMATNAME: + copy_size = string_size( buffer, ansi ); + break; default: return; } @@ -1294,7 +1326,6 @@ static void copy_reply( LRESULT result, HWND hwnd, UINT message, WPARAM wparam,
switch(message) { - case WM_GETTEXT: case CB_GETLBTEXT: case LB_GETTEXT: copy_size = (result + 1) * sizeof(WCHAR); @@ -1355,9 +1386,6 @@ static void copy_reply( LRESULT result, HWND hwnd, UINT message, WPARAM wparam, case WM_MDICREATE: copy_size = sizeof(MDICREATESTRUCTW); break; - case WM_ASKCBFORMATNAME: - copy_size = (lstrlenW((WCHAR *)lparam) + 1) * sizeof(WCHAR); - break; default: return; } @@ -1590,7 +1618,7 @@ static LRESULT call_window_proc( HWND hwnd, UINT msg, WPARAM wparam, LPARAM lpar result = dispatch_win_proc_params( params, sizeof(*params) + size, &ret_ptr, &ret_len ); if (params != &p) free( params );
- copy_user_result( ret_ptr, min( ret_len, packed_size ), msg, wparam, lparam ); + copy_user_result( ret_ptr, min( ret_len, packed_size ), result, msg, wparam, lparam, ansi );
/* and finally the WH_CALLWNDPROCRET hook */ cwpret.lResult = result; diff --git a/dlls/win32u/tests/win32u.c b/dlls/win32u/tests/win32u.c index 7ce6e990874..8653049b828 100644 --- a/dlls/win32u/tests/win32u.c +++ b/dlls/win32u/tests/win32u.c @@ -1533,7 +1533,6 @@ static void test_msg_output( const struct lparam_hook_test *test, LRESULT result else expected = test->lparam; if (expected) - todo_wine_if( test->message == WM_GETTEXT && !test->msg_result ) ok( !memcmp( lparam_buffer, expected, test->lparam_size ), "unexpected lparam content\n" );
todo_wine_if(test->todo) @@ -1626,32 +1625,26 @@ static void test_wndproc_hook(void) { "WM_GETTEXT", WM_GETTEXT, .wparam = 8, .lparam_size = sizeof(strbufW), .change_lparam = strbufW, .check_lparam = strbuf2W, - .todo = TRUE }, { "WM_GETTEXT2", WM_GETTEXT, .wparam = 8, .msg_result = 1, .lparam_size = sizeof(strbufW), .change_lparam = strbufW, .check_lparam = strbufW, - .todo = TRUE }, { "WM_GETTEXT3", WM_GETTEXT, .wparam = 8, .msg_result = 9, .lparam_size = sizeof(strbufW), .change_lparam = strbufW, .check_lparam = strbufW, - .todo = TRUE }, { "WM_ASKCBFORMATNAME", WM_ASKCBFORMATNAME, .wparam = 8, .lparam_size = sizeof(strbufW), .change_lparam = strbufW, .check_lparam = strbufW, - .todo = TRUE }, { "WM_ASKCBFORMATNAME2", WM_ASKCBFORMATNAME, .wparam = 8, .msg_result = 1, .lparam_size = sizeof(strbufW), .change_lparam = strbufW, .check_lparam = strbufW, - .todo = TRUE }, { "WM_ASKCBFORMATNAME3", WM_ASKCBFORMATNAME, .wparam = 8, .msg_result = 9, .lparam_size = sizeof(strbufW), .change_lparam = strbufW, .check_lparam = strbufW, - .todo = TRUE }, { "CB_GETLBTEXT", CB_GETLBTEXT, .msg_result = 7, .check_result = 4, .todo_result = TRUE, diff --git a/dlls/wow64win/user.c b/dlls/wow64win/user.c index 7aea543ea6a..79298ae2eed 100644 --- a/dlls/wow64win/user.c +++ b/dlls/wow64win/user.c @@ -695,6 +695,10 @@ static size_t packed_result_32to64( UINT message, WPARAM wparam, const void *par } break;
+ case WM_GETTEXT: + case WM_ASKCBFORMATNAME: + break; + default: return 0; }
From: Jacek Caban jacek@codeweavers.com
--- dlls/win32u/tests/win32u.c | 28 ++++++++++++++++++---------- 1 file changed, 18 insertions(+), 10 deletions(-)
diff --git a/dlls/win32u/tests/win32u.c b/dlls/win32u/tests/win32u.c index 8653049b828..cd3fa6e7aa3 100644 --- a/dlls/win32u/tests/win32u.c +++ b/dlls/win32u/tests/win32u.c @@ -1533,6 +1533,8 @@ static void test_msg_output( const struct lparam_hook_test *test, LRESULT result else expected = test->lparam; if (expected) + todo_wine_if((test->message == CB_GETLBTEXT && test->msg_result == 7) || + (test->message == LB_GETTEXT && test->msg_result == 7)) ok( !memcmp( lparam_buffer, expected, test->lparam_size ), "unexpected lparam content\n" );
todo_wine_if(test->todo) @@ -1578,8 +1580,13 @@ static void init_hook_test( const struct lparam_hook_test *test ) retwnd_hook_lparam = 0; retwnd_hook_lparam2 = 0;
- if (test->lparam_size && test->lparam) - memcpy( lparam_buffer, test->lparam, test->lparam_size ); + if (test->lparam_size) + { + if (test->lparam) + memcpy( lparam_buffer, test->lparam, test->lparam_size ); + else + memset( lparam_buffer, 0xcc, test->lparam_size ); + } }
static void test_wndproc_hook(void) @@ -1593,8 +1600,9 @@ static void test_wndproc_hook(void)
static const BOOL false_lparam = FALSE; static const WCHAR strbufW[8] = L"abc\0defg"; - static const WCHAR strbuf2W[8] = L"\0bc\0defg"; + static const WCHAR strbuf2W[8] = L"\0\xcccc\xcccc\xcccc\xcccc\xcccc\xcccc\xcccc"; static const WCHAR strbuf3W[8] = L"abcdefgh"; + static const WCHAR strbuf4W[8] = L"abc\0\xcccc\xcccc\xcccc\xcccc"; static const RECT rect_in = { 1, 2, 100, 200 }; static const RECT rect_out = { 3, 4, 110, 220 };
@@ -1628,27 +1636,27 @@ static void test_wndproc_hook(void) }, { "WM_GETTEXT2", WM_GETTEXT, .wparam = 8, .msg_result = 1, - .lparam_size = sizeof(strbufW), .change_lparam = strbufW, .check_lparam = strbufW, + .lparam_size = sizeof(strbufW), .change_lparam = strbufW, .check_lparam = strbuf4W, }, { "WM_GETTEXT3", WM_GETTEXT, .wparam = 8, .msg_result = 9, - .lparam_size = sizeof(strbufW), .change_lparam = strbufW, .check_lparam = strbufW, + .lparam_size = sizeof(strbufW), .change_lparam = strbufW, .check_lparam = strbuf4W, }, { "WM_ASKCBFORMATNAME", WM_ASKCBFORMATNAME, .wparam = 8, - .lparam_size = sizeof(strbufW), .change_lparam = strbufW, .check_lparam = strbufW, + .lparam_size = sizeof(strbufW), .change_lparam = strbufW, .check_lparam = strbuf4W, }, { "WM_ASKCBFORMATNAME2", WM_ASKCBFORMATNAME, .wparam = 8, .msg_result = 1, - .lparam_size = sizeof(strbufW), .change_lparam = strbufW, .check_lparam = strbufW, + .lparam_size = sizeof(strbufW), .change_lparam = strbufW, .check_lparam = strbuf4W, }, { "WM_ASKCBFORMATNAME3", WM_ASKCBFORMATNAME, .wparam = 8, .msg_result = 9, - .lparam_size = sizeof(strbufW), .change_lparam = strbufW, .check_lparam = strbufW, + .lparam_size = sizeof(strbufW), .change_lparam = strbufW, .check_lparam = strbuf4W, }, { "CB_GETLBTEXT", CB_GETLBTEXT, .msg_result = 7, .check_result = 4, .todo_result = TRUE, - .lparam_size = sizeof(strbufW), .change_lparam = strbufW, .check_lparam = strbufW, + .lparam_size = sizeof(strbufW), .change_lparam = strbufW, .check_lparam = strbuf4W, .todo = TRUE }, { @@ -1663,7 +1671,7 @@ static void test_wndproc_hook(void) }, { "LB_GETTEXT", LB_GETTEXT, .msg_result = 7, .check_result = 4, .todo_result = TRUE, - .lparam_size = sizeof(strbufW), .change_lparam = strbufW, .check_lparam = strbufW, + .lparam_size = sizeof(strbufW), .change_lparam = strbufW, .check_lparam = strbuf4W, .todo = TRUE }, {
From: Jacek Caban jacek@codeweavers.com
--- dlls/user32/winproc.c | 11 +++++++---- dlls/win32u/hook.c | 2 +- dlls/win32u/message.c | 23 +++++++++++++++++++++-- dlls/win32u/tests/win32u.c | 13 ++++++++++++- dlls/win32u/win32u_private.h | 3 ++- 5 files changed, 43 insertions(+), 9 deletions(-)
diff --git a/dlls/user32/winproc.c b/dlls/user32/winproc.c index 530f87633d9..c457fef7d11 100644 --- a/dlls/user32/winproc.c +++ b/dlls/user32/winproc.c @@ -833,17 +833,13 @@ BOOL unpack_message( HWND hwnd, UINT message, WPARAM *wparam, LPARAM *lparam, break; case WM_GETTEXT: case WM_ASKCBFORMATNAME: - break; case WM_WININICHANGE: - if (!*lparam) return TRUE; - /* fall through */ case WM_SETTEXT: case WM_DEVMODECHANGE: case CB_DIR: case LB_DIR: case LB_ADDFILE: case EM_REPLACESEL: - if (!check_string( *buffer, size )) return FALSE; break; case WM_GETMINMAXINFO: minsize = sizeof(MINMAXINFO); @@ -1184,6 +1180,13 @@ BOOL WINAPI User32CallWindowProc( struct win_proc_params *params, ULONG size ) case WM_NCCALCSIZE: case WM_GETTEXT: case WM_ASKCBFORMATNAME: + case WM_WININICHANGE: + case WM_SETTEXT: + case WM_DEVMODECHANGE: + case CB_DIR: + case LB_DIR: + case LB_ADDFILE: + case EM_REPLACESEL: { LRESULT *result_ptr = (LRESULT *)buffer - 1; *result_ptr = result; diff --git a/dlls/win32u/hook.c b/dlls/win32u/hook.c index c53ec57c32b..8fcb7ef2796 100644 --- a/dlls/win32u/hook.c +++ b/dlls/win32u/hook.c @@ -246,7 +246,7 @@ static LRESULT call_hook( struct win_hook_params *info, const WCHAR *module, siz if (params->id == WH_CBT && params->code == HCBT_CREATEWND) { CBT_CREATEWNDW *cbtc = (CBT_CREATEWNDW *)params->lparam; - message_size = user_message_size( WM_NCCREATE, 0, (LPARAM)cbtc->lpcs, FALSE ); + message_size = user_message_size( WM_NCCREATE, 0, (LPARAM)cbtc->lpcs, TRUE, FALSE ); lparam_size = lparam_ret_size = 0; }
diff --git a/dlls/win32u/message.c b/dlls/win32u/message.c index 6cf5d4ea47d..6e1b31bc93d 100644 --- a/dlls/win32u/message.c +++ b/dlls/win32u/message.c @@ -420,6 +420,16 @@ static BOOL unpack_message( HWND hwnd, UINT message, WPARAM *wparam, LPARAM *lpa case WM_ASKCBFORMATNAME: if (!get_buffer_space( buffer, (*wparam * sizeof(WCHAR)), size )) return FALSE; break; + case WM_WININICHANGE: + if (!*lparam) return TRUE; + /* fall through */ + case WM_SETTEXT: + case WM_DEVMODECHANGE: + case CB_DIR: + case LB_DIR: + case LB_ADDFILE: + case EM_REPLACESEL: + break; case WM_WINE_SETWINDOWPOS: { WINDOWPOS wp; @@ -1172,7 +1182,7 @@ static size_t copy_string( void *ptr, const void *str, BOOL ansi ) * * Calculate size of packed message buffer. */ -size_t user_message_size( UINT message, WPARAM wparam, LPARAM lparam, BOOL ansi ) +size_t user_message_size( UINT message, WPARAM wparam, LPARAM lparam, BOOL other_process, BOOL ansi ) { const void *lparam_ptr = (const void *)lparam; size_t size = 0; @@ -1195,6 +1205,15 @@ size_t user_message_size( UINT message, WPARAM wparam, LPARAM lparam, BOOL ansi case WM_ASKCBFORMATNAME: size = wparam * char_size( ansi ); break; + case WM_WININICHANGE: + case WM_SETTEXT: + case WM_DEVMODECHANGE: + case CB_DIR: + case LB_DIR: + case LB_ADDFILE: + case EM_REPLACESEL: + if (other_process && lparam) size = string_size( lparam_ptr, ansi ); + break; }
return size; @@ -1590,7 +1609,7 @@ static LRESULT call_window_proc( HWND hwnd, UINT msg, WPARAM wparam, LPARAM lpar if (!needs_unpack) size = 0; if (!is_current_thread_window( hwnd )) return 0;
- packed_size = user_message_size( msg, wparam, lparam, ansi ); + packed_size = user_message_size( msg, wparam, lparam, needs_unpack, ansi ); if (packed_size) size = packed_size;
/* first the WH_CALLWNDPROC hook */ diff --git a/dlls/win32u/tests/win32u.c b/dlls/win32u/tests/win32u.c index cd3fa6e7aa3..5d9186d901d 100644 --- a/dlls/win32u/tests/win32u.c +++ b/dlls/win32u/tests/win32u.c @@ -1362,6 +1362,7 @@ struct lparam_hook_test const void *change_lparam; const void *check_lparam; size_t lparam_size; + size_t lparam_init_size; size_t check_size; BOOL poison_lparam; BOOL todo; @@ -1582,7 +1583,9 @@ static void init_hook_test( const struct lparam_hook_test *test )
if (test->lparam_size) { - if (test->lparam) + if (test->lparam_init_size) + memcpy( lparam_buffer, test->lparam, test->lparam_init_size ); + else if (test->lparam) memcpy( lparam_buffer, test->lparam, test->lparam_size ); else memset( lparam_buffer, 0xcc, test->lparam_size ); @@ -1689,8 +1692,16 @@ static void test_wndproc_hook(void) .lparam_size = sizeof(BOOL), .change_lparam = &false_lparam, .todo = TRUE }, + /* messages that don't change lparam */ { "WM_USER", WM_USER }, { "WM_NOTIFY", WM_NOTIFY }, + { "WM_SETTEXT", WM_SETTEXT, .lparam = strbufW, .lparam_init_size = sizeof(strbufW) }, + { "WM_DEVMODECHANGE", WM_DEVMODECHANGE, .lparam = strbufW, .lparam_init_size = sizeof(strbufW) }, + { "CB_DIR", CB_DIR, .lparam = strbufW, .lparam_init_size = sizeof(strbufW) }, + { "LB_DIR", LB_DIR, .lparam = strbufW, .lparam_init_size = sizeof(strbufW) }, + { "LB_ADDFILE", LB_ADDFILE, .lparam = strbufW, .lparam_init_size = sizeof(strbufW) }, + { "EM_REPLACESEL", EM_REPLACESEL, .lparam = strbufW, .lparam_init_size = sizeof(strbufW) }, + { "WM_WININICHANGE", WM_WININICHANGE, .lparam = strbufW, .lparam_init_size = sizeof(strbufW) }, };
cls.lpfnWndProc = lparam_test_proc; diff --git a/dlls/win32u/win32u_private.h b/dlls/win32u/win32u_private.h index 27a3d1a0305..d23026876da 100644 --- a/dlls/win32u/win32u_private.h +++ b/dlls/win32u/win32u_private.h @@ -140,7 +140,8 @@ extern LRESULT send_message( HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam ) extern BOOL send_notify_message( HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam, BOOL ansi ) DECLSPEC_HIDDEN; extern LRESULT send_message_timeout( HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam, UINT flags, UINT timeout, BOOL ansi ) DECLSPEC_HIDDEN; -extern size_t user_message_size( UINT message, WPARAM wparam, LPARAM lparam, BOOL ansi ) DECLSPEC_HIDDEN; +extern size_t user_message_size( UINT message, WPARAM wparam, LPARAM lparam, + BOOL other_process, BOOL ansi ) DECLSPEC_HIDDEN; extern void pack_user_message( void *buffer, size_t size, UINT message, WPARAM wparam, LPARAM lparam, BOOL ansi ) DECLSPEC_HIDDEN;
From: Jacek Caban jacek@codeweavers.com
--- dlls/user32/winproc.c | 3 +-- dlls/win32u/message.c | 12 +++++++++--- dlls/win32u/tests/win32u.c | 7 +++++++ dlls/wow64win/user.c | 1 + 4 files changed, 18 insertions(+), 5 deletions(-)
diff --git a/dlls/user32/winproc.c b/dlls/user32/winproc.c index c457fef7d11..27b63dbf90f 100644 --- a/dlls/user32/winproc.c +++ b/dlls/user32/winproc.c @@ -840,9 +840,7 @@ BOOL unpack_message( HWND hwnd, UINT message, WPARAM *wparam, LPARAM *lparam, case LB_DIR: case LB_ADDFILE: case EM_REPLACESEL: - break; case WM_GETMINMAXINFO: - minsize = sizeof(MINMAXINFO); break; case WM_DRAWITEM: { @@ -1187,6 +1185,7 @@ BOOL WINAPI User32CallWindowProc( struct win_proc_params *params, ULONG size ) case LB_DIR: case LB_ADDFILE: case EM_REPLACESEL: + case WM_GETMINMAXINFO: { LRESULT *result_ptr = (LRESULT *)buffer - 1; *result_ptr = result; diff --git a/dlls/win32u/message.c b/dlls/win32u/message.c index 6e1b31bc93d..01bf238e87a 100644 --- a/dlls/win32u/message.c +++ b/dlls/win32u/message.c @@ -430,6 +430,9 @@ static BOOL unpack_message( HWND hwnd, UINT message, WPARAM *wparam, LPARAM *lpa case LB_ADDFILE: case EM_REPLACESEL: break; + case WM_GETMINMAXINFO: + minsize = sizeof(MINMAXINFO); + break; case WM_WINE_SETWINDOWPOS: { WINDOWPOS wp; @@ -1214,6 +1217,9 @@ size_t user_message_size( UINT message, WPARAM wparam, LPARAM lparam, BOOL other case EM_REPLACESEL: if (other_process && lparam) size = string_size( lparam_ptr, ansi ); break; + case WM_GETMINMAXINFO: + size = sizeof(MINMAXINFO); + break; }
return size; @@ -1325,6 +1331,9 @@ static void copy_user_result( void *buffer, size_t size, LRESULT result, UINT me case WM_ASKCBFORMATNAME: copy_size = string_size( buffer, ansi ); break; + case WM_GETMINMAXINFO: + copy_size = sizeof(MINMAXINFO); + break; default: return; } @@ -1349,9 +1358,6 @@ static void copy_reply( LRESULT result, HWND hwnd, UINT message, WPARAM wparam, case LB_GETTEXT: copy_size = (result + 1) * sizeof(WCHAR); break; - case WM_GETMINMAXINFO: - copy_size = sizeof(MINMAXINFO); - break; case WM_MEASUREITEM: copy_size = sizeof(MEASUREITEMSTRUCT); break; diff --git a/dlls/win32u/tests/win32u.c b/dlls/win32u/tests/win32u.c index 5d9186d901d..57eb9691993 100644 --- a/dlls/win32u/tests/win32u.c +++ b/dlls/win32u/tests/win32u.c @@ -1608,6 +1608,8 @@ static void test_wndproc_hook(void) static const WCHAR strbuf4W[8] = L"abc\0\xcccc\xcccc\xcccc\xcccc"; static const RECT rect_in = { 1, 2, 100, 200 }; static const RECT rect_out = { 3, 4, 110, 220 }; + static const MINMAXINFO minmax_in = { .ptMinTrackSize.x = 1 }; + static const MINMAXINFO minmax_out = { .ptMinTrackSize.x = 2 };
static const struct lparam_hook_test lparam_hook_tests[] = { @@ -1692,6 +1694,11 @@ static void test_wndproc_hook(void) .lparam_size = sizeof(BOOL), .change_lparam = &false_lparam, .todo = TRUE }, + { + "WM_GETMINMAXINFO", WM_GETMINMAXINFO, + .lparam_size = sizeof(minmax_in), .lparam = &minmax_in, .change_lparam = &minmax_out, + .check_size = sizeof(minmax_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 79298ae2eed..982104867f7 100644 --- a/dlls/wow64win/user.c +++ b/dlls/wow64win/user.c @@ -697,6 +697,7 @@ static size_t packed_result_32to64( UINT message, WPARAM wparam, const void *par
case WM_GETTEXT: case WM_ASKCBFORMATNAME: + case WM_GETMINMAXINFO: break;
default:
From: Jacek Caban jacek@codeweavers.com
--- dlls/user32/winproc.c | 15 --------------- dlls/win32u/message.c | 19 +++++++++++++++++++ dlls/win32u/tests/win32u.c | 17 +++++++++++++++++ dlls/wow64win/user.c | 21 +++++++++++++++++++++ 4 files changed, 57 insertions(+), 15 deletions(-)
diff --git a/dlls/user32/winproc.c b/dlls/user32/winproc.c index 27b63dbf90f..22874360af0 100644 --- a/dlls/user32/winproc.c +++ b/dlls/user32/winproc.c @@ -841,23 +841,8 @@ BOOL unpack_message( HWND hwnd, UINT message, WPARAM *wparam, LPARAM *lparam, case LB_ADDFILE: case EM_REPLACESEL: case WM_GETMINMAXINFO: - break; case WM_DRAWITEM: - { - DRAWITEMSTRUCT dis; - if (size < sizeof(ps->dis)) return FALSE; - dis.CtlType = ps->dis.CtlType; - dis.CtlID = ps->dis.CtlID; - dis.itemID = ps->dis.itemID; - dis.itemAction = ps->dis.itemAction; - dis.itemState = ps->dis.itemState; - dis.hwndItem = unpack_handle( ps->dis.hwndItem ); - dis.hDC = unpack_handle( ps->dis.hDC ); - dis.rcItem = ps->dis.rcItem; - dis.itemData = (ULONG_PTR)unpack_ptr( ps->dis.itemData ); - memcpy( *buffer, &dis, sizeof(dis) ); break; - } case WM_MEASUREITEM: { MEASUREITEMSTRUCT mis; diff --git a/dlls/win32u/message.c b/dlls/win32u/message.c index 01bf238e87a..679e349f817 100644 --- a/dlls/win32u/message.c +++ b/dlls/win32u/message.c @@ -433,6 +433,22 @@ static BOOL unpack_message( HWND hwnd, UINT message, WPARAM *wparam, LPARAM *lpa case WM_GETMINMAXINFO: minsize = sizeof(MINMAXINFO); break; + case WM_DRAWITEM: + { + DRAWITEMSTRUCT dis; + if (size < sizeof(ps->dis)) return FALSE; + dis.CtlType = ps->dis.CtlType; + dis.CtlID = ps->dis.CtlID; + dis.itemID = ps->dis.itemID; + dis.itemAction = ps->dis.itemAction; + dis.itemState = ps->dis.itemState; + dis.hwndItem = wine_server_ptr_handle( ps->dis.hwndItem ); + dis.hDC = wine_server_ptr_handle( ps->dis.hDC ); + dis.rcItem = ps->dis.rcItem; + dis.itemData = (ULONG_PTR)unpack_ptr( ps->dis.itemData ); + memcpy( *buffer, &dis, sizeof(dis) ); + break; + } case WM_WINE_SETWINDOWPOS: { WINDOWPOS wp; @@ -1220,6 +1236,9 @@ size_t user_message_size( UINT message, WPARAM wparam, LPARAM lparam, BOOL other case WM_GETMINMAXINFO: size = sizeof(MINMAXINFO); break; + case WM_DRAWITEM: + size = sizeof(DRAWITEMSTRUCT); + break; }
return size; diff --git a/dlls/win32u/tests/win32u.c b/dlls/win32u/tests/win32u.c index 57eb9691993..0fa46a57c2e 100644 --- a/dlls/win32u/tests/win32u.c +++ b/dlls/win32u/tests/win32u.c @@ -1365,6 +1365,7 @@ struct lparam_hook_test size_t lparam_init_size; size_t check_size; BOOL poison_lparam; + BOOL not_allowed; BOOL todo; };
@@ -1506,6 +1507,16 @@ static void test_msg_output( const struct lparam_hook_test *test, LRESULT result const LPARAM orig = (LPARAM)lparam_buffer; const void *expected;
+ /* Some messages are not allowed with NtUserMessageCall, they seem to be reserved + * for system. Unhooked SendMessage still works for them. */ + if (test->not_allowed) + { + todo_wine ok( !wndproc_lparam, "wndproc_lparam called\n" ); + return; + } + + ok( wndproc_lparam, "wndproc_lparam not called\n" ); + if (test->check_result) todo_wine_if(test->todo_result) ok( result == test->check_result, "unexpected result %Ix\n", result ); @@ -1610,6 +1621,7 @@ static void test_wndproc_hook(void) static const RECT rect_out = { 3, 4, 110, 220 }; static const MINMAXINFO minmax_in = { .ptMinTrackSize.x = 1 }; static const MINMAXINFO minmax_out = { .ptMinTrackSize.x = 2 }; + static const DRAWITEMSTRUCT drawitem_in = { .itemID = 1 };
static const struct lparam_hook_test lparam_hook_tests[] = { @@ -1709,6 +1721,11 @@ static void test_wndproc_hook(void) { "LB_ADDFILE", LB_ADDFILE, .lparam = strbufW, .lparam_init_size = sizeof(strbufW) }, { "EM_REPLACESEL", EM_REPLACESEL, .lparam = strbufW, .lparam_init_size = sizeof(strbufW) }, { "WM_WININICHANGE", WM_WININICHANGE, .lparam = strbufW, .lparam_init_size = sizeof(strbufW) }, + /* messages not allowed to be sent by NtUserMessageCall */ + { + "WM_DRAWITEM", WM_DRAWITEM, .wparam = 10, + .lparam_size = sizeof(drawitem_in), .lparam = &drawitem_in, .not_allowed = TRUE, + }, };
cls.lpfnWndProc = lparam_test_proc; diff --git a/dlls/wow64win/user.c b/dlls/wow64win/user.c index 982104867f7..32dea8e84ac 100644 --- a/dlls/wow64win/user.c +++ b/dlls/wow64win/user.c @@ -648,6 +648,27 @@ static size_t packed_message_64to32( UINT message, WPARAM wparam, return sizeof(ncp32) + sizeof(WINDOWPOS32); } break; + + case WM_DRAWITEM: + { + DRAWITEMSTRUCT32 dis32; + const DRAWITEMSTRUCT *dis64 = params64; + + dis32.CtlType = dis64->CtlType; + dis32.CtlID = dis64->CtlID; + dis32.itemID = dis64->itemID; + dis32.itemAction = dis64->itemAction; + dis32.itemState = dis64->itemState; + dis32.hwndItem = HandleToLong( dis64->hwndItem ); + dis32.hDC = HandleToUlong( dis64->hDC ); + dis32.itemData = dis64->itemData; + dis32.rcItem.left = dis64->rcItem.left; + dis32.rcItem.top = dis64->rcItem.top; + dis32.rcItem.right = dis64->rcItem.right; + dis32.rcItem.bottom = dis64->rcItem.bottom; + memcpy( params32, &dis32, sizeof(dis32) ); + return sizeof(dis32); + } }
memmove( params32, params64, size );
From: Jacek Caban jacek@codeweavers.com
--- dlls/user32/winproc.c | 13 +------------ dlls/win32u/message.c | 22 +++++++++++++++++++--- dlls/win32u/tests/win32u.c | 7 +++++++ dlls/wow64win/user.c | 33 +++++++++++++++++++++++++++++++++ 4 files changed, 60 insertions(+), 15 deletions(-)
diff --git a/dlls/user32/winproc.c b/dlls/user32/winproc.c index 22874360af0..43d57766616 100644 --- a/dlls/user32/winproc.c +++ b/dlls/user32/winproc.c @@ -842,20 +842,8 @@ BOOL unpack_message( HWND hwnd, UINT message, WPARAM *wparam, LPARAM *lparam, case EM_REPLACESEL: case WM_GETMINMAXINFO: case WM_DRAWITEM: - break; case WM_MEASUREITEM: - { - MEASUREITEMSTRUCT mis; - if (size < sizeof(ps->mis)) return FALSE; - mis.CtlType = ps->mis.CtlType; - mis.CtlID = ps->mis.CtlID; - mis.itemID = ps->mis.itemID; - mis.itemWidth = ps->mis.itemWidth; - mis.itemHeight = ps->mis.itemHeight; - mis.itemData = (ULONG_PTR)unpack_ptr( ps->mis.itemData ); - memcpy( *buffer, &mis, sizeof(mis) ); break; - } case WM_DELETEITEM: { DELETEITEMSTRUCT dls; @@ -1171,6 +1159,7 @@ BOOL WINAPI User32CallWindowProc( struct win_proc_params *params, ULONG size ) case LB_ADDFILE: case EM_REPLACESEL: case WM_GETMINMAXINFO: + case WM_MEASUREITEM: { LRESULT *result_ptr = (LRESULT *)buffer - 1; *result_ptr = result; diff --git a/dlls/win32u/message.c b/dlls/win32u/message.c index 679e349f817..fe2e1c77400 100644 --- a/dlls/win32u/message.c +++ b/dlls/win32u/message.c @@ -449,6 +449,19 @@ static BOOL unpack_message( HWND hwnd, UINT message, WPARAM *wparam, LPARAM *lpa memcpy( *buffer, &dis, sizeof(dis) ); break; } + case WM_MEASUREITEM: + { + MEASUREITEMSTRUCT mis; + if (size < sizeof(ps->mis)) return FALSE; + mis.CtlType = ps->mis.CtlType; + mis.CtlID = ps->mis.CtlID; + mis.itemID = ps->mis.itemID; + mis.itemWidth = ps->mis.itemWidth; + mis.itemHeight = ps->mis.itemHeight; + mis.itemData = (ULONG_PTR)unpack_ptr( ps->mis.itemData ); + memcpy( *buffer, &mis, sizeof(mis) ); + break; + } case WM_WINE_SETWINDOWPOS: { WINDOWPOS wp; @@ -1239,6 +1252,9 @@ size_t user_message_size( UINT message, WPARAM wparam, LPARAM lparam, BOOL other case WM_DRAWITEM: size = sizeof(DRAWITEMSTRUCT); break; + case WM_MEASUREITEM: + size = sizeof(MEASUREITEMSTRUCT); + break; }
return size; @@ -1353,6 +1369,9 @@ static void copy_user_result( void *buffer, size_t size, LRESULT result, UINT me case WM_GETMINMAXINFO: copy_size = sizeof(MINMAXINFO); break; + case WM_MEASUREITEM: + copy_size = sizeof(MEASUREITEMSTRUCT); + break; default: return; } @@ -1377,9 +1396,6 @@ static void copy_reply( LRESULT result, HWND hwnd, UINT message, WPARAM wparam, case LB_GETTEXT: copy_size = (result + 1) * sizeof(WCHAR); break; - case WM_MEASUREITEM: - copy_size = sizeof(MEASUREITEMSTRUCT); - break; case WM_WINDOWPOSCHANGING: case WM_WINDOWPOSCHANGED: copy_size = sizeof(WINDOWPOS); diff --git a/dlls/win32u/tests/win32u.c b/dlls/win32u/tests/win32u.c index 0fa46a57c2e..8008e6aff10 100644 --- a/dlls/win32u/tests/win32u.c +++ b/dlls/win32u/tests/win32u.c @@ -1622,6 +1622,8 @@ static void test_wndproc_hook(void) static const MINMAXINFO minmax_in = { .ptMinTrackSize.x = 1 }; static const MINMAXINFO minmax_out = { .ptMinTrackSize.x = 2 }; static const DRAWITEMSTRUCT drawitem_in = { .itemID = 1 }; + static const MEASUREITEMSTRUCT mis_in = { .itemID = 1 }; + static const MEASUREITEMSTRUCT mis_out = { .itemID = 2, .CtlType = 3, .CtlID = 4, .itemData = 5 };
static const struct lparam_hook_test lparam_hook_tests[] = { @@ -1711,6 +1713,11 @@ static void test_wndproc_hook(void) .lparam_size = sizeof(minmax_in), .lparam = &minmax_in, .change_lparam = &minmax_out, .check_size = sizeof(minmax_in) }, + { + "WM_MEASUREITEM", WM_MEASUREITEM, .wparam = 10, + .lparam_size = sizeof(mis_in), .lparam = &mis_in, .change_lparam = &mis_out, + .check_size = sizeof(mis_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 32dea8e84ac..937ceea5b90 100644 --- a/dlls/wow64win/user.c +++ b/dlls/wow64win/user.c @@ -669,6 +669,21 @@ static size_t packed_message_64to32( UINT message, WPARAM wparam, memcpy( params32, &dis32, sizeof(dis32) ); return sizeof(dis32); } + + case WM_MEASUREITEM: + { + MEASUREITEMSTRUCT32 mis32; + const MEASUREITEMSTRUCT *mis64 = params64; + + mis32.CtlType = mis64->CtlType; + mis32.CtlID = mis64->CtlID; + mis32.itemID = mis64->itemID; + mis32.itemWidth = mis64->itemWidth; + mis32.itemHeight = mis64->itemHeight; + mis32.itemData = mis64->itemData; + memcpy( params32, &mis32, sizeof(mis32) ); + return sizeof(mis32); + } }
memmove( params32, params64, size ); @@ -716,6 +731,20 @@ static size_t packed_result_32to64( UINT message, WPARAM wparam, const void *par } break;
+ case WM_MEASUREITEM: + { + const MEASUREITEMSTRUCT32 *mis32 = params32; + MEASUREITEMSTRUCT *mis64 = params64; + + mis64->CtlType = mis32->CtlType; + mis64->CtlID = mis32->CtlID; + mis64->itemID = mis32->itemID; + mis64->itemWidth = mis32->itemWidth; + mis64->itemHeight = mis32->itemHeight; + mis64->itemData = mis32->itemData; + return sizeof(*mis64); + } + case WM_GETTEXT: case WM_ASKCBFORMATNAME: case WM_GETMINMAXINFO: @@ -3155,8 +3184,12 @@ static LRESULT message_call_32to64( HWND hwnd, UINT msg, WPARAM wparam, LPARAM l mis.itemHeight = mis32->itemHeight; mis.itemData = mis32->itemData; ret = NtUserMessageCall( hwnd, msg, wparam, (LPARAM)&mis, result_info, type, ansi ); + mis32->CtlType = mis.CtlType; + mis32->CtlID = mis.CtlID; + mis32->itemID = mis.itemID; mis32->itemWidth = mis.itemWidth; mis32->itemHeight = mis.itemHeight; + mis32->itemData = mis.itemData; return ret; }
From: Jacek Caban jacek@codeweavers.com
--- dlls/user32/winproc.c | 12 +----------- dlls/win32u/message.c | 15 +++++++++++++++ dlls/win32u/tests/win32u.c | 6 ++++++ dlls/wow64win/user.c | 15 +++++++++++++++ 4 files changed, 37 insertions(+), 11 deletions(-)
diff --git a/dlls/user32/winproc.c b/dlls/user32/winproc.c index 43d57766616..adbc258c1f1 100644 --- a/dlls/user32/winproc.c +++ b/dlls/user32/winproc.c @@ -843,19 +843,8 @@ BOOL unpack_message( HWND hwnd, UINT message, WPARAM *wparam, LPARAM *lparam, case WM_GETMINMAXINFO: case WM_DRAWITEM: case WM_MEASUREITEM: - break; case WM_DELETEITEM: - { - DELETEITEMSTRUCT dls; - if (size < sizeof(ps->dls)) return FALSE; - dls.CtlType = ps->dls.CtlType; - dls.CtlID = ps->dls.CtlID; - dls.itemID = ps->dls.itemID; - dls.hwndItem = unpack_handle( ps->dls.hwndItem ); - dls.itemData = (ULONG_PTR)unpack_ptr( ps->dls.itemData ); - memcpy( *buffer, &dls, sizeof(dls) ); break; - } case WM_COMPAREITEM: { COMPAREITEMSTRUCT cis; @@ -1160,6 +1149,7 @@ BOOL WINAPI User32CallWindowProc( struct win_proc_params *params, ULONG size ) case EM_REPLACESEL: case WM_GETMINMAXINFO: case WM_MEASUREITEM: + case WM_DELETEITEM: { LRESULT *result_ptr = (LRESULT *)buffer - 1; *result_ptr = result; diff --git a/dlls/win32u/message.c b/dlls/win32u/message.c index fe2e1c77400..253d4df15fe 100644 --- a/dlls/win32u/message.c +++ b/dlls/win32u/message.c @@ -462,6 +462,18 @@ static BOOL unpack_message( HWND hwnd, UINT message, WPARAM *wparam, LPARAM *lpa memcpy( *buffer, &mis, sizeof(mis) ); break; } + case WM_DELETEITEM: + { + DELETEITEMSTRUCT dls; + if (size < sizeof(ps->dls)) return FALSE; + dls.CtlType = ps->dls.CtlType; + dls.CtlID = ps->dls.CtlID; + dls.itemID = ps->dls.itemID; + dls.hwndItem = wine_server_ptr_handle( ps->dls.hwndItem ); + dls.itemData = (ULONG_PTR)unpack_ptr( ps->dls.itemData ); + memcpy( *buffer, &dls, sizeof(dls) ); + break; + } case WM_WINE_SETWINDOWPOS: { WINDOWPOS wp; @@ -1255,6 +1267,9 @@ size_t user_message_size( UINT message, WPARAM wparam, LPARAM lparam, BOOL other case WM_MEASUREITEM: size = sizeof(MEASUREITEMSTRUCT); break; + case WM_DELETEITEM: + size = sizeof(DELETEITEMSTRUCT); + break; }
return size; diff --git a/dlls/win32u/tests/win32u.c b/dlls/win32u/tests/win32u.c index 8008e6aff10..e46e82718d1 100644 --- a/dlls/win32u/tests/win32u.c +++ b/dlls/win32u/tests/win32u.c @@ -1624,6 +1624,7 @@ static void test_wndproc_hook(void) static const DRAWITEMSTRUCT drawitem_in = { .itemID = 1 }; static const MEASUREITEMSTRUCT mis_in = { .itemID = 1 }; static const MEASUREITEMSTRUCT mis_out = { .itemID = 2, .CtlType = 3, .CtlID = 4, .itemData = 5 }; + static const DELETEITEMSTRUCT dis_in = { .itemID = 1 };
static const struct lparam_hook_test lparam_hook_tests[] = { @@ -1718,6 +1719,11 @@ static void test_wndproc_hook(void) .lparam_size = sizeof(mis_in), .lparam = &mis_in, .change_lparam = &mis_out, .check_size = sizeof(mis_in), }, + { + "WM_DELETEITEM", WM_DELETEITEM, .wparam = 10, + .lparam_size = sizeof(dis_in), .lparam = &dis_in, .poison_lparam = TRUE, + .check_size = sizeof(dis_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 937ceea5b90..36544032d70 100644 --- a/dlls/wow64win/user.c +++ b/dlls/wow64win/user.c @@ -684,6 +684,20 @@ static size_t packed_message_64to32( UINT message, WPARAM wparam, memcpy( params32, &mis32, sizeof(mis32) ); return sizeof(mis32); } + + case WM_DELETEITEM: + { + DELETEITEMSTRUCT32 dis32; + const DELETEITEMSTRUCT *dis64 = params64; + + dis32.CtlType = dis64->CtlType; + dis32.CtlID = dis64->CtlID; + dis32.itemID = dis64->itemID; + dis32.hwndItem = HandleToLong( dis64->hwndItem ); + dis32.itemData = dis64->itemData; + memcpy( params32, &dis32, sizeof(dis32) ); + return sizeof(dis32); + } }
memmove( params32, params64, size ); @@ -3167,6 +3181,7 @@ static LRESULT message_call_32to64( HWND hwnd, UINT msg, WPARAM wparam, LPARAM l
dis.CtlType = dis32->CtlType; dis.CtlID = dis32->CtlID; + dis.itemID = dis32->itemID; dis.hwndItem = LongToHandle( dis32->hwndItem ); dis.itemData = dis32->itemData; return NtUserMessageCall( hwnd, msg, wparam, (LPARAM)&dis, result_info, type, ansi );
From: Jacek Caban jacek@codeweavers.com
--- dlls/user32/winproc.c | 15 +-------------- dlls/win32u/message.c | 18 ++++++++++++++++++ dlls/win32u/tests/win32u.c | 6 ++++++ dlls/wow64win/user.c | 17 +++++++++++++++++ 4 files changed, 42 insertions(+), 14 deletions(-)
diff --git a/dlls/user32/winproc.c b/dlls/user32/winproc.c index adbc258c1f1..d1fe0d4c4ce 100644 --- a/dlls/user32/winproc.c +++ b/dlls/user32/winproc.c @@ -844,22 +844,8 @@ BOOL unpack_message( HWND hwnd, UINT message, WPARAM *wparam, LPARAM *lparam, case WM_DRAWITEM: case WM_MEASUREITEM: case WM_DELETEITEM: - break; case WM_COMPAREITEM: - { - COMPAREITEMSTRUCT cis; - if (size < sizeof(ps->cis)) return FALSE; - cis.CtlType = ps->cis.CtlType; - cis.CtlID = ps->cis.CtlID; - cis.hwndItem = unpack_handle( ps->cis.hwndItem ); - cis.itemID1 = ps->cis.itemID1; - cis.itemData1 = (ULONG_PTR)unpack_ptr( ps->cis.itemData1 ); - cis.itemID2 = ps->cis.itemID2; - cis.itemData2 = (ULONG_PTR)unpack_ptr( ps->cis.itemData2 ); - cis.dwLocaleId = ps->cis.dwLocaleId; - memcpy( *buffer, &cis, sizeof(cis) ); break; - } case WM_WINDOWPOSCHANGING: case WM_WINDOWPOSCHANGED: { @@ -1150,6 +1136,7 @@ BOOL WINAPI User32CallWindowProc( struct win_proc_params *params, ULONG size ) case WM_GETMINMAXINFO: case WM_MEASUREITEM: case WM_DELETEITEM: + case WM_COMPAREITEM: { LRESULT *result_ptr = (LRESULT *)buffer - 1; *result_ptr = result; diff --git a/dlls/win32u/message.c b/dlls/win32u/message.c index 253d4df15fe..a752407c52b 100644 --- a/dlls/win32u/message.c +++ b/dlls/win32u/message.c @@ -474,6 +474,21 @@ static BOOL unpack_message( HWND hwnd, UINT message, WPARAM *wparam, LPARAM *lpa memcpy( *buffer, &dls, sizeof(dls) ); break; } + case WM_COMPAREITEM: + { + COMPAREITEMSTRUCT cis; + if (size < sizeof(ps->cis)) return FALSE; + cis.CtlType = ps->cis.CtlType; + cis.CtlID = ps->cis.CtlID; + cis.hwndItem = wine_server_ptr_handle( ps->cis.hwndItem ); + cis.itemID1 = ps->cis.itemID1; + cis.itemData1 = (ULONG_PTR)unpack_ptr( ps->cis.itemData1 ); + cis.itemID2 = ps->cis.itemID2; + cis.itemData2 = (ULONG_PTR)unpack_ptr( ps->cis.itemData2 ); + cis.dwLocaleId = ps->cis.dwLocaleId; + memcpy( *buffer, &cis, sizeof(cis) ); + break; + } case WM_WINE_SETWINDOWPOS: { WINDOWPOS wp; @@ -1270,6 +1285,9 @@ size_t user_message_size( UINT message, WPARAM wparam, LPARAM lparam, BOOL other case WM_DELETEITEM: size = sizeof(DELETEITEMSTRUCT); break; + case WM_COMPAREITEM: + size = sizeof(COMPAREITEMSTRUCT); + break; }
return size; diff --git a/dlls/win32u/tests/win32u.c b/dlls/win32u/tests/win32u.c index e46e82718d1..38686535384 100644 --- a/dlls/win32u/tests/win32u.c +++ b/dlls/win32u/tests/win32u.c @@ -1625,6 +1625,7 @@ static void test_wndproc_hook(void) static const MEASUREITEMSTRUCT mis_in = { .itemID = 1 }; static const MEASUREITEMSTRUCT mis_out = { .itemID = 2, .CtlType = 3, .CtlID = 4, .itemData = 5 }; static const DELETEITEMSTRUCT dis_in = { .itemID = 1 }; + static const COMPAREITEMSTRUCT cis_in = { .itemID1 = 1 };
static const struct lparam_hook_test lparam_hook_tests[] = { @@ -1724,6 +1725,11 @@ static void test_wndproc_hook(void) .lparam_size = sizeof(dis_in), .lparam = &dis_in, .poison_lparam = TRUE, .check_size = sizeof(dis_in), }, + { + "WM_COMPAREITEM", WM_COMPAREITEM, .wparam = 10, + .lparam_size = sizeof(cis_in), .lparam = &cis_in, .poison_lparam = TRUE, + .check_size = sizeof(cis_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 36544032d70..388a028e3f3 100644 --- a/dlls/wow64win/user.c +++ b/dlls/wow64win/user.c @@ -698,6 +698,23 @@ static size_t packed_message_64to32( UINT message, WPARAM wparam, memcpy( params32, &dis32, sizeof(dis32) ); return sizeof(dis32); } + + case WM_COMPAREITEM: + { + COMPAREITEMSTRUCT32 cis32; + const COMPAREITEMSTRUCT *cis64 = params64; + + cis32.CtlType = cis64->CtlType; + cis32.CtlID = cis64->CtlID; + cis32.hwndItem = HandleToLong( cis64->hwndItem ); + cis32.itemID1 = cis64->itemID1; + cis32.itemData1 = cis64->itemData1; + cis32.itemID2 = cis64->itemID2; + cis32.itemData2 = cis64->itemData2; + cis32.dwLocaleId = cis64->dwLocaleId; + memcpy( params32, &cis32, sizeof(cis32) ); + return sizeof(cis32); + } }
memmove( params32, params64, size );
From: Jacek Caban jacek@codeweavers.com
--- dlls/user32/winproc.c | 15 ++------------- dlls/win32u/message.c | 26 ++++++++++++++++++++++---- dlls/win32u/tests/win32u.c | 12 ++++++++++++ dlls/wow64win/user.c | 10 ++++++++++ 4 files changed, 46 insertions(+), 17 deletions(-)
diff --git a/dlls/user32/winproc.c b/dlls/user32/winproc.c index d1fe0d4c4ce..fb41d444a45 100644 --- a/dlls/user32/winproc.c +++ b/dlls/user32/winproc.c @@ -845,22 +845,9 @@ BOOL unpack_message( HWND hwnd, UINT message, WPARAM *wparam, LPARAM *lparam, case WM_MEASUREITEM: case WM_DELETEITEM: case WM_COMPAREITEM: - break; case WM_WINDOWPOSCHANGING: case WM_WINDOWPOSCHANGED: - { - WINDOWPOS wp; - if (size < sizeof(ps->wp)) return FALSE; - wp.hwnd = unpack_handle( ps->wp.hwnd ); - wp.hwndInsertAfter = unpack_handle( ps->wp.hwndInsertAfter ); - wp.x = ps->wp.x; - wp.y = ps->wp.y; - wp.cx = ps->wp.cx; - wp.cy = ps->wp.cy; - wp.flags = ps->wp.flags; - memcpy( *buffer, &wp, sizeof(wp) ); break; - } case WM_COPYDATA: { COPYDATASTRUCT cds; @@ -1137,6 +1124,8 @@ BOOL WINAPI User32CallWindowProc( struct win_proc_params *params, ULONG size ) case WM_MEASUREITEM: case WM_DELETEITEM: case WM_COMPAREITEM: + case WM_WINDOWPOSCHANGING: + case WM_WINDOWPOSCHANGED: { LRESULT *result_ptr = (LRESULT *)buffer - 1; *result_ptr = result; diff --git a/dlls/win32u/message.c b/dlls/win32u/message.c index a752407c52b..641fa905af3 100644 --- a/dlls/win32u/message.c +++ b/dlls/win32u/message.c @@ -489,6 +489,21 @@ static BOOL unpack_message( HWND hwnd, UINT message, WPARAM *wparam, LPARAM *lpa memcpy( *buffer, &cis, sizeof(cis) ); break; } + case WM_WINDOWPOSCHANGING: + case WM_WINDOWPOSCHANGED: + { + WINDOWPOS wp; + if (size < sizeof(ps->wp)) return FALSE; + wp.hwnd = wine_server_ptr_handle( ps->wp.hwnd ); + wp.hwndInsertAfter = wine_server_ptr_handle( ps->wp.hwndInsertAfter ); + wp.x = ps->wp.x; + wp.y = ps->wp.y; + wp.cx = ps->wp.cx; + wp.cy = ps->wp.cy; + wp.flags = ps->wp.flags; + memcpy( *buffer, &wp, sizeof(wp) ); + break; + } case WM_WINE_SETWINDOWPOS: { WINDOWPOS wp; @@ -1288,6 +1303,10 @@ size_t user_message_size( UINT message, WPARAM wparam, LPARAM lparam, BOOL other case WM_COMPAREITEM: size = sizeof(COMPAREITEMSTRUCT); break; + case WM_WINDOWPOSCHANGING: + case WM_WINDOWPOSCHANGED: + size = sizeof(WINDOWPOS); + break; }
return size; @@ -1405,6 +1424,9 @@ static void copy_user_result( void *buffer, size_t size, LRESULT result, UINT me case WM_MEASUREITEM: copy_size = sizeof(MEASUREITEMSTRUCT); break; + case WM_WINDOWPOSCHANGING: + copy_size = sizeof(WINDOWPOS); + break; default: return; } @@ -1429,10 +1451,6 @@ static void copy_reply( LRESULT result, HWND hwnd, UINT message, WPARAM wparam, case LB_GETTEXT: copy_size = (result + 1) * sizeof(WCHAR); break; - case WM_WINDOWPOSCHANGING: - case WM_WINDOWPOSCHANGED: - copy_size = sizeof(WINDOWPOS); - break; case CB_GETCOMBOBOXINFO: copy_size = sizeof(COMBOBOXINFO); break; diff --git a/dlls/win32u/tests/win32u.c b/dlls/win32u/tests/win32u.c index 38686535384..8d72dba243a 100644 --- a/dlls/win32u/tests/win32u.c +++ b/dlls/win32u/tests/win32u.c @@ -1626,6 +1626,8 @@ static void test_wndproc_hook(void) static const MEASUREITEMSTRUCT mis_out = { .itemID = 2, .CtlType = 3, .CtlID = 4, .itemData = 5 }; static const DELETEITEMSTRUCT dis_in = { .itemID = 1 }; static const COMPAREITEMSTRUCT cis_in = { .itemID1 = 1 }; + static const WINDOWPOS winpos_in = { .x = 1, .cy = 2 }; + static const WINDOWPOS winpos_out = { .x = 10, .cy = 22 };
static const struct lparam_hook_test lparam_hook_tests[] = { @@ -1730,6 +1732,16 @@ static void test_wndproc_hook(void) .lparam_size = sizeof(cis_in), .lparam = &cis_in, .poison_lparam = TRUE, .check_size = sizeof(cis_in), }, + { + "WM_WINDOWPOSCHANGING", WM_WINDOWPOSCHANGING, + .lparam_size = sizeof(WINDOWPOS), .lparam = &winpos_in, .change_lparam = &winpos_out, + .check_size = sizeof(WINDOWPOS) + }, + { + "WM_WINDOWPOSCHANGED", WM_WINDOWPOSCHANGED, + .lparam_size = sizeof(WINDOWPOS), .lparam = &winpos_in, .poison_lparam = TRUE, + .check_size = sizeof(WINDOWPOS), + }, /* 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 388a028e3f3..b2a7a3887cc 100644 --- a/dlls/wow64win/user.c +++ b/dlls/wow64win/user.c @@ -715,6 +715,11 @@ static size_t packed_message_64to32( UINT message, WPARAM wparam, memcpy( params32, &cis32, sizeof(cis32) ); return sizeof(cis32); } + + case WM_WINDOWPOSCHANGING: + case WM_WINDOWPOSCHANGED: + winpos_64to32( params64, params32 ); + return sizeof(WINDOWPOS32); }
memmove( params32, params64, size ); @@ -776,6 +781,11 @@ static size_t packed_result_32to64( UINT message, WPARAM wparam, const void *par return sizeof(*mis64); }
+ case WM_WINDOWPOSCHANGING: + case WM_WINDOWPOSCHANGED: + winpos_32to64( params64, params32 ); + return sizeof(WINDOWPOS); + case WM_GETTEXT: case WM_ASKCBFORMATNAME: case WM_GETMINMAXINFO:
This merge request was approved by Huw Davies.