More of !3388.
From: Jacek Caban jacek@codeweavers.com
--- dlls/user32/winproc.c | 26 +++++------------ dlls/win32u/message.c | 33 +++++++++++++++++++++ dlls/win32u/tests/win32u.c | 59 ++++++++++++++++++++++++++++++++++++-- dlls/wow64win/user.c | 14 +++++++++ 4 files changed, 110 insertions(+), 22 deletions(-)
diff --git a/dlls/user32/winproc.c b/dlls/user32/winproc.c index fb41d444a45..1363aad3340 100644 --- a/dlls/user32/winproc.c +++ b/dlls/user32/winproc.c @@ -831,6 +831,12 @@ BOOL unpack_message( HWND hwnd, UINT message, WPARAM *wparam, LPARAM *lparam, ncp->lppos = (WINDOWPOS *)((NCCALCSIZE_PARAMS *)ncp + 1); } break; + case WM_COPYDATA: + { + COPYDATASTRUCT *cds = *buffer; + if (cds->lpData) cds->lpData = cds + 1; + break; + } case WM_GETTEXT: case WM_ASKCBFORMATNAME: case WM_WININICHANGE: @@ -848,25 +854,6 @@ BOOL unpack_message( HWND hwnd, UINT message, WPARAM *wparam, LPARAM *lparam, case WM_WINDOWPOSCHANGING: case WM_WINDOWPOSCHANGED: break; - case WM_COPYDATA: - { - COPYDATASTRUCT cds; - if (size < sizeof(ps->cds)) return FALSE; - cds.dwData = (ULONG_PTR)unpack_ptr( ps->cds.dwData ); - if (ps->cds.lpData) - { - cds.cbData = ps->cds.cbData; - cds.lpData = &ps->cds + 1; - minsize = sizeof(ps->cds) + cds.cbData; - } - else - { - cds.cbData = 0; - cds.lpData = 0; - } - memcpy( &ps->cds, &cds, sizeof(cds) ); - break; - } case WM_NOTIFY: /* WM_NOTIFY cannot be sent across processes (MSDN) */ return FALSE; @@ -1126,6 +1113,7 @@ BOOL WINAPI User32CallWindowProc( struct win_proc_params *params, ULONG size ) case WM_COMPAREITEM: case WM_WINDOWPOSCHANGING: case WM_WINDOWPOSCHANGED: + case WM_COPYDATA: { LRESULT *result_ptr = (LRESULT *)buffer - 1; *result_ptr = result; diff --git a/dlls/win32u/message.c b/dlls/win32u/message.c index 641fa905af3..5cadaa9e75b 100644 --- a/dlls/win32u/message.c +++ b/dlls/win32u/message.c @@ -504,6 +504,25 @@ static BOOL unpack_message( HWND hwnd, UINT message, WPARAM *wparam, LPARAM *lpa memcpy( *buffer, &wp, sizeof(wp) ); break; } + case WM_COPYDATA: + { + COPYDATASTRUCT cds; + if (size < sizeof(ps->cds)) return FALSE; + cds.dwData = (ULONG_PTR)unpack_ptr( ps->cds.dwData ); + if (ps->cds.lpData) + { + cds.cbData = ps->cds.cbData; + cds.lpData = &ps->cds + 1; + minsize = sizeof(ps->cds) + cds.cbData; + } + else + { + cds.cbData = 0; + cds.lpData = 0; + } + memcpy( &ps->cds, &cds, sizeof(cds) ); + break; + } case WM_WINE_SETWINDOWPOS: { WINDOWPOS wp; @@ -1307,6 +1326,12 @@ size_t user_message_size( UINT message, WPARAM wparam, LPARAM lparam, BOOL other case WM_WINDOWPOSCHANGED: size = sizeof(WINDOWPOS); break; + case WM_COPYDATA: + { + const COPYDATASTRUCT *cds = lparam_ptr; + size = sizeof(*cds) + cds->cbData; + break; + } }
return size; @@ -1358,6 +1383,14 @@ void pack_user_message( void *buffer, size_t size, UINT message, case WM_ASKCBFORMATNAME: if (wparam) memset( buffer, 0, char_size( ansi )); return; + case WM_COPYDATA: + { + const COPYDATASTRUCT *cds = lparam_ptr; + if (cds->lpData && cds->cbData) + memcpy( (char *)buffer + sizeof(*cds), cds->lpData, cds->cbData ); + size = sizeof(*cds); + break; + } }
if (size) memcpy( buffer, lparam_ptr, size ); diff --git a/dlls/win32u/tests/win32u.c b/dlls/win32u/tests/win32u.c index aaa27361206..501938cd039 100644 --- a/dlls/win32u/tests/win32u.c +++ b/dlls/win32u/tests/win32u.c @@ -1386,9 +1386,31 @@ static void check_params( const struct lparam_hook_test *test, UINT message, ok ((LPARAM)&message < lparam && lparam < (LPARAM)NtCurrentTeb()->Tib.StackBase, "lparam is not on the stack\n");
- if (test->check_size) { - const void *expected = is_ret && test->change_lparam ? test->change_lparam : test->lparam; - ok( !memcmp( (const void *)lparam, expected, test->check_size ), "unexpected lparam content\n"); + switch (test->message) + { + case WM_COPYDATA: + { + const COPYDATASTRUCT *cds = (const COPYDATASTRUCT *)lparam; + const COPYDATASTRUCT *cds_in = (const COPYDATASTRUCT *)lparam_buffer; + ok( cds->dwData == cds_in->dwData, "cds->dwData != cds_in->dwData\n"); + ok( cds->cbData == cds_in->cbData, "cds->dwData != cds_in->dwData\n"); + if (cds_in->lpData) + { + ok( cds->lpData != cds_in->lpData, "cds->lpData == cds_in->lpData\n" ); + if (cds->cbData) + ok( !memcmp( cds->lpData, cds_in->lpData, cds->cbData ), "unexpected pvData %s\n", + wine_dbgstr_an( cds->lpData, cds->cbData )); + } + else + ok( !cds->lpData, "cds->lpData = %p\n", cds->lpData ); + } + break; + + default: + if (test->check_size) { + const void *expected = is_ret && test->change_lparam ? test->change_lparam : test->lparam; + ok( !memcmp( (const void *)lparam, expected, test->check_size ), "unexpected lparam content\n" ); + } } }
@@ -1628,6 +1650,12 @@ static void test_wndproc_hook(void) 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 COPYDATASTRUCT cds_in = { .dwData = 1 }; + static WORD data_word = 3; + static const COPYDATASTRUCT cds2_in = { .cbData = 2, .lpData = &data_word }; + static const COPYDATASTRUCT cds3_in = { .dwData = 2, .lpData = (void *)0xdeadbeef }; + static const COPYDATASTRUCT cds4_in = { .cbData = 2 }; + static const COPYDATASTRUCT cds5_in = { .lpData = (void *)0xdeadbeef };
static const struct lparam_hook_test lparam_hook_tests[] = { @@ -1742,6 +1770,31 @@ static void test_wndproc_hook(void) .lparam_size = sizeof(WINDOWPOS), .lparam = &winpos_in, .poison_lparam = TRUE, .check_size = sizeof(WINDOWPOS), }, + { + "WM_COPYDATA", WM_COPYDATA, .wparam = 0xdeadbeef, + .lparam_size = sizeof(cds_in), .lparam = &cds_in, .poison_lparam = TRUE, + .check_size = sizeof(cds_in), + }, + { + "WM_COPYDATA-2", WM_COPYDATA, .wparam = 0xdeadbeef, + .lparam_size = sizeof(cds2_in), .lparam = &cds2_in, .poison_lparam = TRUE, + .check_size = sizeof(cds2_in), + }, + { + "WM_COPYDATA-3", WM_COPYDATA, .wparam = 0xdeadbeef, + .lparam_size = sizeof(cds3_in), .lparam = &cds3_in, .poison_lparam = TRUE, + .check_size = sizeof(cds3_in), + }, + { + "WM_COPYDATA-4", WM_COPYDATA, .wparam = 0xdeadbeef, + .lparam_size = sizeof(cds4_in), .lparam = &cds4_in, .poison_lparam = TRUE, + .check_size = sizeof(cds4_in), + }, + { + "WM_COPYDATA-5", WM_COPYDATA, .wparam = 0xdeadbeef, + .lparam_size = sizeof(cds5_in), .lparam = &cds5_in, .poison_lparam = TRUE, + .check_size = sizeof(cds5_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 b2a7a3887cc..429854f1950 100644 --- a/dlls/wow64win/user.c +++ b/dlls/wow64win/user.c @@ -720,6 +720,20 @@ static size_t packed_message_64to32( UINT message, WPARAM wparam, case WM_WINDOWPOSCHANGED: winpos_64to32( params64, params32 ); return sizeof(WINDOWPOS32); + + case WM_COPYDATA: + { + COPYDATASTRUCT32 cds32; + const COPYDATASTRUCT *cds64 = params64; + + cds32.dwData = cds64->dwData; + cds32.cbData = cds64->cbData; + cds32.lpData = PtrToUlong( cds64->lpData ); + memcpy( params32, &cds32, sizeof(cds32) ); + size -= sizeof(cds32); + if (size) memmove( (char *)params32 + sizeof(cds32), cds64 + 1, size ); + return sizeof(cds32) + size; + } }
memmove( params32, params64, size );
From: Jacek Caban jacek@codeweavers.com
--- dlls/user32/winproc.c | 15 ++------------- dlls/win32u/message.c | 16 ++++++++++++++++ dlls/wow64win/user.c | 38 ++++++++++++++++++++++++++++++++++++++ 3 files changed, 56 insertions(+), 13 deletions(-)
diff --git a/dlls/user32/winproc.c b/dlls/user32/winproc.c index 1363aad3340..8d6f89eaa6f 100644 --- a/dlls/user32/winproc.c +++ b/dlls/user32/winproc.c @@ -853,23 +853,11 @@ BOOL unpack_message( HWND hwnd, UINT message, WPARAM *wparam, LPARAM *lparam, case WM_COMPAREITEM: case WM_WINDOWPOSCHANGING: case WM_WINDOWPOSCHANGED: + case WM_HELP: break; case WM_NOTIFY: /* WM_NOTIFY cannot be sent across processes (MSDN) */ return FALSE; - case WM_HELP: - { - HELPINFO hi; - if (size < sizeof(ps->hi)) return FALSE; - hi.cbSize = sizeof(hi); - hi.iContextType = ps->hi.iContextType; - hi.iCtrlId = ps->hi.iCtrlId; - hi.hItemHandle = unpack_handle( ps->hi.hItemHandle ); - hi.dwContextId = (ULONG_PTR)unpack_ptr( ps->hi.dwContextId ); - hi.MousePos = ps->hi.MousePos; - memcpy( &ps->hi, &hi, sizeof(hi) ); - break; - } case WM_STYLECHANGING: case WM_STYLECHANGED: minsize = sizeof(STYLESTRUCT); @@ -1114,6 +1102,7 @@ BOOL WINAPI User32CallWindowProc( struct win_proc_params *params, ULONG size ) case WM_WINDOWPOSCHANGING: case WM_WINDOWPOSCHANGED: case WM_COPYDATA: + case WM_HELP: { LRESULT *result_ptr = (LRESULT *)buffer - 1; *result_ptr = result; diff --git a/dlls/win32u/message.c b/dlls/win32u/message.c index 5cadaa9e75b..7a3acf13ba5 100644 --- a/dlls/win32u/message.c +++ b/dlls/win32u/message.c @@ -523,6 +523,19 @@ static BOOL unpack_message( HWND hwnd, UINT message, WPARAM *wparam, LPARAM *lpa memcpy( &ps->cds, &cds, sizeof(cds) ); break; } + case WM_HELP: + { + HELPINFO hi; + if (size < sizeof(ps->hi)) return FALSE; + hi.cbSize = sizeof(hi); + hi.iContextType = ps->hi.iContextType; + hi.iCtrlId = ps->hi.iCtrlId; + hi.hItemHandle = wine_server_ptr_handle( ps->hi.hItemHandle ); + hi.dwContextId = (ULONG_PTR)unpack_ptr( ps->hi.dwContextId ); + hi.MousePos = ps->hi.MousePos; + memcpy( &ps->hi, &hi, sizeof(hi) ); + break; + } case WM_WINE_SETWINDOWPOS: { WINDOWPOS wp; @@ -1332,6 +1345,9 @@ size_t user_message_size( UINT message, WPARAM wparam, LPARAM lparam, BOOL other size = sizeof(*cds) + cds->cbData; break; } + case WM_HELP: + size = sizeof(HELPINFO); + break; }
return size; diff --git a/dlls/wow64win/user.c b/dlls/wow64win/user.c index 429854f1950..5914a8d6d4e 100644 --- a/dlls/wow64win/user.c +++ b/dlls/wow64win/user.c @@ -218,6 +218,16 @@ typedef struct ULONG lpData; } COPYDATASTRUCT32;
+typedef struct +{ + UINT cbSize; + INT iContextType; + INT iCtrlId; + ULONG hItemHandle; + DWORD dwContextId; + POINT MousePos; +} HELPINFO32; + typedef struct { UINT CtlType; @@ -734,6 +744,20 @@ static size_t packed_message_64to32( UINT message, WPARAM wparam, if (size) memmove( (char *)params32 + sizeof(cds32), cds64 + 1, size ); return sizeof(cds32) + size; } + case WM_HELP: + { + HELPINFO32 hi32; + const HELPINFO *hi64 = params64; + + hi32.cbSize = sizeof(hi32); + hi32.iContextType = hi64->iContextType; + hi32.iCtrlId = hi64->iCtrlId; + hi32.hItemHandle = HandleToLong( hi64->hItemHandle ); + hi32.dwContextId = hi64->dwContextId; + hi32.MousePos = hi64->MousePos; + memcpy( params32, &hi32, sizeof(hi32) ); + return sizeof(hi32); + } }
memmove( params32, params64, size ); @@ -3280,6 +3304,20 @@ static LRESULT message_call_32to64( HWND hwnd, UINT msg, WPARAM wparam, LPARAM l return NtUserMessageCall( hwnd, msg, wparam, (LPARAM)&cds, result_info, type, ansi ); }
+ case WM_HELP: + { + HELPINFO32 *hi32 = (void *)lparam; + HELPINFO hi64; + + hi64.cbSize = sizeof(hi64); + hi64.iContextType = hi32->iContextType; + hi64.iCtrlId = hi32->iCtrlId; + hi64.hItemHandle = LongToHandle( hi32->hItemHandle ); + hi64.dwContextId = hi32->dwContextId; + hi64.MousePos = hi32->MousePos; + return NtUserMessageCall( hwnd, msg, wparam, (LPARAM)&hi64, result_info, type, ansi ); + } + case WM_GETDLGCODE: if (lparam) {
From: Jacek Caban jacek@codeweavers.com
--- dlls/user32/winproc.c | 8 ++++---- dlls/win32u/message.c | 14 +++++++++++--- dlls/win32u/tests/win32u.c | 12 ++++++++++++ dlls/wow64win/user.c | 1 + 4 files changed, 28 insertions(+), 7 deletions(-)
diff --git a/dlls/user32/winproc.c b/dlls/user32/winproc.c index 8d6f89eaa6f..e759c5565b7 100644 --- a/dlls/user32/winproc.c +++ b/dlls/user32/winproc.c @@ -854,14 +854,12 @@ BOOL unpack_message( HWND hwnd, UINT message, WPARAM *wparam, LPARAM *lparam, case WM_WINDOWPOSCHANGING: case WM_WINDOWPOSCHANGED: case WM_HELP: + case WM_STYLECHANGING: + case WM_STYLECHANGED: break; case WM_NOTIFY: /* WM_NOTIFY cannot be sent across processes (MSDN) */ return FALSE; - case WM_STYLECHANGING: - case WM_STYLECHANGED: - minsize = sizeof(STYLESTRUCT); - break; case WM_GETDLGCODE: if (*lparam) { @@ -1103,6 +1101,8 @@ BOOL WINAPI User32CallWindowProc( struct win_proc_params *params, ULONG size ) case WM_WINDOWPOSCHANGED: case WM_COPYDATA: case WM_HELP: + case WM_STYLECHANGING: + case WM_STYLECHANGED: { LRESULT *result_ptr = (LRESULT *)buffer - 1; *result_ptr = result; diff --git a/dlls/win32u/message.c b/dlls/win32u/message.c index 7a3acf13ba5..f3068a9c618 100644 --- a/dlls/win32u/message.c +++ b/dlls/win32u/message.c @@ -536,6 +536,10 @@ static BOOL unpack_message( HWND hwnd, UINT message, WPARAM *wparam, LPARAM *lpa memcpy( &ps->hi, &hi, sizeof(hi) ); break; } + case WM_STYLECHANGING: + case WM_STYLECHANGED: + minsize = sizeof(STYLESTRUCT); + break; case WM_WINE_SETWINDOWPOS: { WINDOWPOS wp; @@ -1348,6 +1352,10 @@ size_t user_message_size( UINT message, WPARAM wparam, LPARAM lparam, BOOL other case WM_HELP: size = sizeof(HELPINFO); break; + case WM_STYLECHANGING: + case WM_STYLECHANGED: + size = sizeof(STYLESTRUCT); + break; }
return size; @@ -1476,6 +1484,9 @@ static void copy_user_result( void *buffer, size_t size, LRESULT result, UINT me case WM_WINDOWPOSCHANGING: copy_size = sizeof(WINDOWPOS); break; + case WM_STYLECHANGING: + copy_size = sizeof(STYLESTRUCT); + break; default: return; } @@ -1503,9 +1514,6 @@ static void copy_reply( LRESULT result, HWND hwnd, UINT message, WPARAM wparam, case CB_GETCOMBOBOXINFO: copy_size = sizeof(COMBOBOXINFO); break; - case WM_STYLECHANGING: - copy_size = sizeof(STYLESTRUCT); - break; case WM_GETDLGCODE: if (lparam) copy_size = sizeof(MSG); break; diff --git a/dlls/win32u/tests/win32u.c b/dlls/win32u/tests/win32u.c index 501938cd039..fd526bcb36b 100644 --- a/dlls/win32u/tests/win32u.c +++ b/dlls/win32u/tests/win32u.c @@ -1656,6 +1656,8 @@ static void test_wndproc_hook(void) static const COPYDATASTRUCT cds3_in = { .dwData = 2, .lpData = (void *)0xdeadbeef }; static const COPYDATASTRUCT cds4_in = { .cbData = 2 }; 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 struct lparam_hook_test lparam_hook_tests[] = { @@ -1795,6 +1797,16 @@ static void test_wndproc_hook(void) .lparam_size = sizeof(cds5_in), .lparam = &cds5_in, .poison_lparam = TRUE, .check_size = sizeof(cds5_in), }, + { + "WM_STYLECHANGING", WM_STYLECHANGING, + .lparam_size = sizeof(style_in), .lparam = &style_in, .change_lparam = &style_out, + .check_size = sizeof(style_in) + }, + { + "WM_STYLECHANGED", WM_STYLECHANGED, + .lparam_size = sizeof(style_in), .lparam = &style_in, .poison_lparam = TRUE, + .check_size = sizeof(style_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 5914a8d6d4e..d5d017a086f 100644 --- a/dlls/wow64win/user.c +++ b/dlls/wow64win/user.c @@ -827,6 +827,7 @@ static size_t packed_result_32to64( UINT message, WPARAM wparam, const void *par case WM_GETTEXT: case WM_ASKCBFORMATNAME: case WM_GETMINMAXINFO: + case WM_STYLECHANGING: break;
default:
From: Jacek Caban jacek@codeweavers.com
--- 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 );
From: Jacek Caban jacek@codeweavers.com
--- dlls/user32/winproc.c | 15 ++++++--------- dlls/win32u/message.c | 29 +++++++++++++++++++++++------ dlls/win32u/tests/win32u.c | 19 +++++++++++++++++++ dlls/wow64win/user.c | 3 +++ 4 files changed, 51 insertions(+), 15 deletions(-)
diff --git a/dlls/user32/winproc.c b/dlls/user32/winproc.c index 6fd35691e68..66974e053ed 100644 --- a/dlls/user32/winproc.c +++ b/dlls/user32/winproc.c @@ -857,19 +857,13 @@ BOOL unpack_message( HWND hwnd, UINT message, WPARAM *wparam, LPARAM *lparam, case WM_STYLECHANGING: case WM_STYLECHANGED: case WM_GETDLGCODE: - break; - case WM_NOTIFY: - /* WM_NOTIFY cannot be sent across processes (MSDN) */ - return FALSE; case SBM_SETSCROLLINFO: - minsize = sizeof(SCROLLINFO); - break; case SBM_GETSCROLLINFO: - if (!get_buffer_space( buffer, sizeof(SCROLLINFO), size )) return FALSE; - break; case SBM_GETSCROLLBARINFO: - if (!get_buffer_space( buffer, sizeof(SCROLLBARINFO), size )) return FALSE; break; + case WM_NOTIFY: + /* WM_NOTIFY cannot be sent across processes (MSDN) */ + return FALSE; case EM_GETSEL: case SBM_GETRANGE: case CB_GETEDITSEL: @@ -1090,6 +1084,9 @@ BOOL WINAPI User32CallWindowProc( struct win_proc_params *params, ULONG size ) case WM_STYLECHANGING: case WM_STYLECHANGED: case WM_GETDLGCODE: + case SBM_SETSCROLLINFO: + case SBM_GETSCROLLINFO: + case SBM_GETSCROLLBARINFO: { LRESULT *result_ptr = (LRESULT *)buffer - 1; *result_ptr = result; diff --git a/dlls/win32u/message.c b/dlls/win32u/message.c index 9f8bf863b55..e2967446372 100644 --- a/dlls/win32u/message.c +++ b/dlls/win32u/message.c @@ -555,6 +555,15 @@ static BOOL unpack_message( HWND hwnd, UINT message, WPARAM *wparam, LPARAM *lpa break; } return TRUE; + case SBM_SETSCROLLINFO: + minsize = sizeof(SCROLLINFO); + break; + case SBM_GETSCROLLINFO: + if (!get_buffer_space( buffer, sizeof(SCROLLINFO), size )) return FALSE; + break; + case SBM_GETSCROLLBARINFO: + if (!get_buffer_space( buffer, sizeof(SCROLLBARINFO), size )) return FALSE; + break; case WM_WINE_SETWINDOWPOS: { WINDOWPOS wp; @@ -1349,6 +1358,13 @@ size_t user_message_size( UINT message, WPARAM wparam, LPARAM lparam, BOOL other case WM_GETDLGCODE: size = sizeof(MSG); break; + case SBM_SETSCROLLINFO: + case SBM_GETSCROLLINFO: + size = sizeof(SCROLLINFO); + break; + case SBM_GETSCROLLBARINFO: + size = sizeof(SCROLLBARINFO); + break; }
return size; @@ -1480,6 +1496,13 @@ static void copy_user_result( void *buffer, size_t size, LRESULT result, UINT me case WM_STYLECHANGING: copy_size = sizeof(STYLESTRUCT); break; + case SBM_SETSCROLLINFO: + case SBM_GETSCROLLINFO: + copy_size = sizeof(SCROLLINFO); + break; + case SBM_GETSCROLLBARINFO: + copy_size = sizeof(SCROLLBARINFO); + break; default: return; } @@ -1507,12 +1530,6 @@ static void copy_reply( LRESULT result, HWND hwnd, UINT message, WPARAM wparam, case CB_GETCOMBOBOXINFO: copy_size = sizeof(COMBOBOXINFO); break; - case SBM_GETSCROLLINFO: - copy_size = sizeof(SCROLLINFO); - break; - case SBM_GETSCROLLBARINFO: - copy_size = sizeof(SCROLLBARINFO); - break; case EM_GETRECT: case LB_GETITEMRECT: case CB_GETDROPPEDCONTROLRECT: diff --git a/dlls/win32u/tests/win32u.c b/dlls/win32u/tests/win32u.c index d6cecc778d9..c6ed563d444 100644 --- a/dlls/win32u/tests/win32u.c +++ b/dlls/win32u/tests/win32u.c @@ -1659,6 +1659,10 @@ static void test_wndproc_hook(void) 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 SCROLLINFO si_in = { .cbSize = sizeof(si_in), .nPos = 6 }; + static const SCROLLINFO si_out = { .cbSize = sizeof(si_in), .nPos = 60 }; + static const SCROLLBARINFO sbi_in = { .xyThumbTop = 6 }; + static const SCROLLBARINFO sbi_out = { .xyThumbTop = 60 };
static const struct lparam_hook_test lparam_hook_tests[] = { @@ -1813,6 +1817,21 @@ static void test_wndproc_hook(void) .lparam_size = sizeof(msg_in), .lparam = &msg_in, .poison_lparam = TRUE, .check_size = sizeof(msg_in), }, + { + "SBM_SETSCROLLINFO", SBM_SETSCROLLINFO, + .lparam_size = sizeof(si_in), .lparam = &si_in, .change_lparam = &si_out, + .check_size = sizeof(si_in), + }, + { + "SBM_GETSCROLLINFO", SBM_GETSCROLLINFO, + .lparam_size = sizeof(si_in), .lparam = &si_in, .change_lparam = &si_out, + .check_size = sizeof(si_in), + }, + { + "SBM_GETSCROLLBARINFO", SBM_GETSCROLLBARINFO, + .lparam_size = sizeof(sbi_in), .lparam = &sbi_in, .change_lparam = &sbi_out, + .check_size = sizeof(sbi_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 c90dc22e31f..47c3ae6849d 100644 --- a/dlls/wow64win/user.c +++ b/dlls/wow64win/user.c @@ -832,6 +832,9 @@ static size_t packed_result_32to64( UINT message, WPARAM wparam, const void *par case WM_ASKCBFORMATNAME: case WM_GETMINMAXINFO: case WM_STYLECHANGING: + case SBM_SETSCROLLINFO: + case SBM_GETSCROLLINFO: + case SBM_GETSCROLLBARINFO: break;
default:
From: Jacek Caban jacek@codeweavers.com
--- dlls/user32/winproc.c | 22 ++++++++++++---------- dlls/win32u/message.c | 34 ++++++++++++++++++++++++++++------ dlls/win32u/tests/win32u.c | 27 +++++++++++++++++++++++++-- dlls/wow64win/user.c | 3 +++ 4 files changed, 68 insertions(+), 18 deletions(-)
diff --git a/dlls/user32/winproc.c b/dlls/user32/winproc.c index 66974e053ed..9f073fabb70 100644 --- a/dlls/user32/winproc.c +++ b/dlls/user32/winproc.c @@ -837,6 +837,15 @@ BOOL unpack_message( HWND hwnd, UINT message, WPARAM *wparam, LPARAM *lparam, if (cds->lpData) cds->lpData = cds + 1; break; } + case EM_GETSEL: + case SBM_GETRANGE: + case CB_GETEDITSEL: + { + DWORD *ptr = *buffer; + *wparam = (WPARAM)ptr++; + *lparam = (LPARAM)ptr; + return TRUE; + } case WM_GETTEXT: case WM_ASKCBFORMATNAME: case WM_WININICHANGE: @@ -864,16 +873,6 @@ BOOL unpack_message( HWND hwnd, UINT message, WPARAM *wparam, LPARAM *lparam, case WM_NOTIFY: /* WM_NOTIFY cannot be sent across processes (MSDN) */ return FALSE; - case EM_GETSEL: - case SBM_GETRANGE: - case CB_GETEDITSEL: - if (*wparam || *lparam) - { - if (!get_buffer_space( buffer, 2*sizeof(DWORD), size )) return FALSE; - if (*wparam) *wparam = (WPARAM)*buffer; - if (*lparam) *lparam = (LPARAM)((DWORD *)*buffer + 1); - } - return TRUE; case EM_GETRECT: case LB_GETITEMRECT: case CB_GETDROPPEDCONTROLRECT: @@ -1087,6 +1086,9 @@ BOOL WINAPI User32CallWindowProc( struct win_proc_params *params, ULONG size ) case SBM_SETSCROLLINFO: case SBM_GETSCROLLINFO: case SBM_GETSCROLLBARINFO: + case EM_GETSEL: + case SBM_GETRANGE: + case CB_GETEDITSEL: { LRESULT *result_ptr = (LRESULT *)buffer - 1; *result_ptr = result; diff --git a/dlls/win32u/message.c b/dlls/win32u/message.c index e2967446372..540c58797b9 100644 --- a/dlls/win32u/message.c +++ b/dlls/win32u/message.c @@ -564,6 +564,16 @@ static BOOL unpack_message( HWND hwnd, UINT message, WPARAM *wparam, LPARAM *lpa case SBM_GETSCROLLBARINFO: if (!get_buffer_space( buffer, sizeof(SCROLLBARINFO), size )) return FALSE; break; + case EM_GETSEL: + case SBM_GETRANGE: + case CB_GETEDITSEL: + if (*wparam || *lparam) + { + if (!get_buffer_space( buffer, 2 * sizeof(DWORD), size )) return FALSE; + if (*wparam) *wparam = (WPARAM)*buffer; + if (*lparam) *lparam = (LPARAM)((DWORD *)*buffer + 1); + } + return TRUE; case WM_WINE_SETWINDOWPOS: { WINDOWPOS wp; @@ -1365,6 +1375,11 @@ size_t user_message_size( UINT message, WPARAM wparam, LPARAM lparam, BOOL other case SBM_GETSCROLLBARINFO: size = sizeof(SCROLLBARINFO); break; + case EM_GETSEL: + case SBM_GETRANGE: + case CB_GETEDITSEL: + size = 2 * sizeof(DWORD); + break; }
return size; @@ -1424,6 +1439,10 @@ void pack_user_message( void *buffer, size_t size, UINT message, size = sizeof(*cds); break; } + case EM_GETSEL: + case SBM_GETRANGE: + case CB_GETEDITSEL: + return; }
if (size) memcpy( buffer, lparam_ptr, size ); @@ -1503,6 +1522,15 @@ static void copy_user_result( void *buffer, size_t size, LRESULT result, UINT me case SBM_GETSCROLLBARINFO: copy_size = sizeof(SCROLLBARINFO); break; + case EM_GETSEL: + case SBM_GETRANGE: + case CB_GETEDITSEL: + { + DWORD *ptr = buffer; + if (wparam) *(DWORD *)wparam = ptr[0]; + if (lparam) *(DWORD *)lparam = ptr[1]; + break; + } default: return; } @@ -1549,12 +1577,6 @@ static void copy_reply( LRESULT result, HWND hwnd, UINT message, WPARAM wparam, case WM_MDIGETACTIVE: if (lparam) copy_size = sizeof(BOOL); break; - case EM_GETSEL: - case SBM_GETRANGE: - case CB_GETEDITSEL: - if (wparam) *(DWORD *)wparam = *(DWORD *)wparam_src; - if (lparam) copy_size = sizeof(DWORD); - break; case WM_NEXTMENU: copy_size = sizeof(MDINEXTMENU); break; diff --git a/dlls/win32u/tests/win32u.c b/dlls/win32u/tests/win32u.c index c6ed563d444..d2a298436d9 100644 --- a/dlls/win32u/tests/win32u.c +++ b/dlls/win32u/tests/win32u.c @@ -1355,6 +1355,7 @@ struct lparam_hook_test const char *name; UINT message; WPARAM wparam; + BOOL no_wparam_check; LRESULT msg_result; LRESULT check_result; BOOL todo_result; @@ -1378,7 +1379,7 @@ static char lparam_buffer[521]; static void check_params( const struct lparam_hook_test *test, UINT message, WPARAM wparam, LPARAM lparam, BOOL is_ret ) { - if (test->message != WM_MDIGETACTIVE) + if (!test->no_wparam_check) ok( wparam == test->wparam, "got wparam %Ix, expected %Ix\n", wparam, test->wparam ); if (lparam == (LPARAM)lparam_buffer) return; @@ -1406,6 +1407,12 @@ static void check_params( const struct lparam_hook_test *test, UINT message, } break;
+ case EM_GETSEL: + case SBM_GETRANGE: + case CB_GETEDITSEL: + ok( wparam, "wparam = 0\n" ); + break; + default: if (test->check_size) { const void *expected = is_ret && test->change_lparam ? test->change_lparam : test->lparam; @@ -1663,6 +1670,7 @@ static void test_wndproc_hook(void) static const SCROLLINFO si_out = { .cbSize = sizeof(si_in), .nPos = 60 }; static const SCROLLBARINFO sbi_in = { .xyThumbTop = 6 }; static const SCROLLBARINFO sbi_out = { .xyThumbTop = 60 }; + static const DWORD dw_in = 1, dw_out = 2;
static const struct lparam_hook_test lparam_hook_tests[] = { @@ -1743,7 +1751,7 @@ static void test_wndproc_hook(void) .todo = TRUE }, { - "WM_MDIGETACTIVE", WM_MDIGETACTIVE, + "WM_MDIGETACTIVE", WM_MDIGETACTIVE, .no_wparam_check = TRUE, .lparam_size = sizeof(BOOL), .change_lparam = &false_lparam, .todo = TRUE }, @@ -1832,6 +1840,21 @@ static void test_wndproc_hook(void) .lparam_size = sizeof(sbi_in), .lparam = &sbi_in, .change_lparam = &sbi_out, .check_size = sizeof(sbi_in), }, + { + "EM_GETSEL", EM_GETSEL, .no_wparam_check = TRUE, + .lparam_size = sizeof(DWORD), .lparam = &dw_in, .change_lparam = &dw_out, + .check_size = sizeof(DWORD), + }, + { + "SBM_GETRANGE", SBM_GETRANGE, .no_wparam_check = TRUE, + .lparam_size = sizeof(DWORD), .lparam = &dw_in, .change_lparam = &dw_out, + .check_size = sizeof(DWORD), + }, + { + "CB_GETEDITSEL", CB_GETEDITSEL, .no_wparam_check = TRUE, + .lparam_size = sizeof(DWORD), .lparam = &dw_in, .change_lparam = &dw_out, + .check_size = sizeof(DWORD), + }, /* 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 47c3ae6849d..9685a51029d 100644 --- a/dlls/wow64win/user.c +++ b/dlls/wow64win/user.c @@ -835,6 +835,9 @@ static size_t packed_result_32to64( UINT message, WPARAM wparam, const void *par case SBM_SETSCROLLINFO: case SBM_GETSCROLLINFO: case SBM_GETSCROLLBARINFO: + case EM_GETSEL: + case SBM_GETRANGE: + case CB_GETEDITSEL: break;
default:
From: Jacek Caban jacek@codeweavers.com
--- dlls/user32/winproc.c | 15 ++++++++------- dlls/win32u/message.c | 28 +++++++++++++++++++++++++--- dlls/win32u/tests/win32u.c | 16 ++++++++++++++-- dlls/wow64win/user.c | 5 +++++ 4 files changed, 52 insertions(+), 12 deletions(-)
diff --git a/dlls/user32/winproc.c b/dlls/user32/winproc.c index 9f073fabb70..5d0e4eb5205 100644 --- a/dlls/user32/winproc.c +++ b/dlls/user32/winproc.c @@ -869,18 +869,11 @@ BOOL unpack_message( HWND hwnd, UINT message, WPARAM *wparam, LPARAM *lparam, case SBM_SETSCROLLINFO: case SBM_GETSCROLLINFO: case SBM_GETSCROLLBARINFO: - break; - case WM_NOTIFY: - /* WM_NOTIFY cannot be sent across processes (MSDN) */ - return FALSE; case EM_GETRECT: case LB_GETITEMRECT: case CB_GETDROPPEDCONTROLRECT: - if (!get_buffer_space( buffer, sizeof(RECT), size )) return FALSE; - break; case EM_SETRECT: case EM_SETRECTNP: - minsize = sizeof(RECT); break; case EM_GETLINE: { @@ -982,6 +975,9 @@ BOOL unpack_message( HWND hwnd, UINT message, WPARAM *wparam, LPARAM *lparam, if (!(*wparam & 0x8000)) return TRUE; minsize = sizeof(DEV_BROADCAST_HDR); break; + case WM_NOTIFY: + /* WM_NOTIFY cannot be sent across processes (MSDN) */ + return FALSE; case WM_NCPAINT: if (*wparam <= 1) return TRUE; FIXME( "WM_NCPAINT hdc unpacking not supported\n" ); @@ -1089,6 +1085,11 @@ BOOL WINAPI User32CallWindowProc( struct win_proc_params *params, ULONG size ) case EM_GETSEL: case SBM_GETRANGE: case CB_GETEDITSEL: + case EM_GETRECT: + case LB_GETITEMRECT: + case CB_GETDROPPEDCONTROLRECT: + case EM_SETRECT: + case EM_SETRECTNP: { LRESULT *result_ptr = (LRESULT *)buffer - 1; *result_ptr = result; diff --git a/dlls/win32u/message.c b/dlls/win32u/message.c index 540c58797b9..cb6dac39bb6 100644 --- a/dlls/win32u/message.c +++ b/dlls/win32u/message.c @@ -574,6 +574,15 @@ static BOOL unpack_message( HWND hwnd, UINT message, WPARAM *wparam, LPARAM *lpa if (*lparam) *lparam = (LPARAM)((DWORD *)*buffer + 1); } return TRUE; + case EM_GETRECT: + case LB_GETITEMRECT: + case CB_GETDROPPEDCONTROLRECT: + if (!get_buffer_space( buffer, sizeof(RECT), size )) return FALSE; + break; + case EM_SETRECT: + case EM_SETRECTNP: + minsize = sizeof(RECT); + break; case WM_WINE_SETWINDOWPOS: { WINDOWPOS wp; @@ -1380,6 +1389,13 @@ size_t user_message_size( UINT message, WPARAM wparam, LPARAM lparam, BOOL other case CB_GETEDITSEL: size = 2 * sizeof(DWORD); break; + case EM_GETRECT: + case LB_GETITEMRECT: + case CB_GETDROPPEDCONTROLRECT: + case EM_SETRECT: + case EM_SETRECTNP: + size = sizeof(RECT); + break; }
return size; @@ -1442,6 +1458,8 @@ void pack_user_message( void *buffer, size_t size, UINT message, case EM_GETSEL: case SBM_GETRANGE: case CB_GETEDITSEL: + case EM_GETRECT: + case CB_GETDROPPEDCONTROLRECT: return; }
@@ -1531,6 +1549,13 @@ static void copy_user_result( void *buffer, size_t size, LRESULT result, UINT me if (lparam) *(DWORD *)lparam = ptr[1]; break; } + case EM_GETRECT: + case EM_SETRECT: + case EM_SETRECTNP: + case LB_GETITEMRECT: + case CB_GETDROPPEDCONTROLRECT: + copy_size = sizeof(RECT); + break; default: return; } @@ -1558,9 +1583,6 @@ static void copy_reply( LRESULT result, HWND hwnd, UINT message, WPARAM wparam, case CB_GETCOMBOBOXINFO: copy_size = sizeof(COMBOBOXINFO); break; - case EM_GETRECT: - case LB_GETITEMRECT: - case CB_GETDROPPEDCONTROLRECT: case WM_SIZING: case WM_MOVING: copy_size = sizeof(RECT); diff --git a/dlls/win32u/tests/win32u.c b/dlls/win32u/tests/win32u.c index d2a298436d9..5ff755745f1 100644 --- a/dlls/win32u/tests/win32u.c +++ b/dlls/win32u/tests/win32u.c @@ -1685,16 +1685,28 @@ static void test_wndproc_hook(void) .check_size = sizeof(RECT), .todo = TRUE }, + { + "EM_GETRECT", EM_GETRECT, + .lparam = &rect_in, .lparam_size = sizeof(RECT), .change_lparam = &rect_out, + }, + { + "EM_SETRECT", EM_SETRECT, + .lparam = &rect_in, .lparam_size = sizeof(RECT), .change_lparam = &rect_out, + .check_size = sizeof(RECT), + }, + { + "EM_SETRECTNP", EM_SETRECTNP, + .lparam = &rect_in, .lparam_size = sizeof(RECT), .change_lparam = &rect_out, + .check_size = sizeof(RECT), + }, { "LB_GETITEMRECT", LB_GETITEMRECT, .lparam = &rect_in, .lparam_size = sizeof(RECT), .change_lparam = &rect_out, .check_size = sizeof(RECT), - .todo = TRUE }, { "CB_GETDROPPEDCONTROLRECT", CB_GETDROPPEDCONTROLRECT, .lparam = &rect_in, .lparam_size = sizeof(RECT), .change_lparam = &rect_out, - .todo = TRUE }, { "WM_GETTEXT", WM_GETTEXT, .wparam = 8, diff --git a/dlls/wow64win/user.c b/dlls/wow64win/user.c index 9685a51029d..37cb0caeae9 100644 --- a/dlls/wow64win/user.c +++ b/dlls/wow64win/user.c @@ -838,6 +838,11 @@ static size_t packed_result_32to64( UINT message, WPARAM wparam, const void *par case EM_GETSEL: case SBM_GETRANGE: case CB_GETEDITSEL: + case EM_SETRECT: + case EM_GETRECT: + case EM_SETRECTNP: + case LB_GETITEMRECT: + case CB_GETDROPPEDCONTROLRECT: break;
default:
From: Jacek Caban jacek@codeweavers.com
--- dlls/user32/winproc.c | 11 ++--------- dlls/win32u/message.c | 26 ++++++++++++++++++++------ dlls/win32u/tests/win32u.c | 18 ++++++++++++++++++ dlls/wow64win/user.c | 1 + 4 files changed, 41 insertions(+), 15 deletions(-)
diff --git a/dlls/user32/winproc.c b/dlls/user32/winproc.c index 5d0e4eb5205..202c955e152 100644 --- a/dlls/user32/winproc.c +++ b/dlls/user32/winproc.c @@ -874,16 +874,8 @@ BOOL unpack_message( HWND hwnd, UINT message, WPARAM *wparam, LPARAM *lparam, case CB_GETDROPPEDCONTROLRECT: case EM_SETRECT: case EM_SETRECTNP: - break; case EM_GETLINE: - { - WORD len; - if (size < sizeof(WORD)) return FALSE; - len = *(WORD *)*buffer; - if (!get_buffer_space( buffer, (len + 1) * sizeof(WCHAR), size )) return FALSE; - *lparam = (LPARAM)*buffer + sizeof(WORD); /* don't erase WORD at start of buffer */ - return TRUE; - } + break; case EM_SETTABSTOPS: case LB_SETTABSTOPS: if (!*wparam) return TRUE; @@ -1090,6 +1082,7 @@ BOOL WINAPI User32CallWindowProc( struct win_proc_params *params, ULONG size ) case CB_GETDROPPEDCONTROLRECT: case EM_SETRECT: case EM_SETRECTNP: + case EM_GETLINE: { LRESULT *result_ptr = (LRESULT *)buffer - 1; *result_ptr = result; diff --git a/dlls/win32u/message.c b/dlls/win32u/message.c index cb6dac39bb6..d37b05ca1eb 100644 --- a/dlls/win32u/message.c +++ b/dlls/win32u/message.c @@ -583,6 +583,17 @@ static BOOL unpack_message( HWND hwnd, UINT message, WPARAM *wparam, LPARAM *lpa case EM_SETRECTNP: minsize = sizeof(RECT); break; + case EM_GETLINE: + { + WORD *len_ptr, len; + if (size < sizeof(WORD)) return FALSE; + len = *(WORD *)*buffer; + if (!get_buffer_space( buffer, (len + 1) * sizeof(WCHAR), size )) return FALSE; + len_ptr = *buffer; + len_ptr[0] = len_ptr[1] = len; + *lparam = (LPARAM)(len_ptr + 1); + return TRUE; + } case WM_WINE_SETWINDOWPOS: { WINDOWPOS wp; @@ -1396,6 +1407,9 @@ size_t user_message_size( UINT message, WPARAM wparam, LPARAM lparam, BOOL other case EM_SETRECTNP: size = sizeof(RECT); break; + case EM_GETLINE: + size = max( *(WORD *)lparam * char_size( ansi ), sizeof(WORD) ); + break; }
return size; @@ -1461,6 +1475,9 @@ void pack_user_message( void *buffer, size_t size, UINT message, case EM_GETRECT: case CB_GETDROPPEDCONTROLRECT: return; + case EM_GETLINE: + size = sizeof(WORD); + break; }
if (size) memcpy( buffer, lparam_ptr, size ); @@ -1556,6 +1573,9 @@ static void copy_user_result( void *buffer, size_t size, LRESULT result, UINT me case CB_GETDROPPEDCONTROLRECT: copy_size = sizeof(RECT); break; + case EM_GETLINE: + copy_size = string_size( buffer, ansi ); + break; default: return; } @@ -1587,12 +1607,6 @@ static void copy_reply( LRESULT result, HWND hwnd, UINT message, WPARAM wparam, case WM_MOVING: copy_size = sizeof(RECT); break; - case EM_GETLINE: - { - WORD *ptr = (WORD *)lparam; - copy_size = ptr[-1] * sizeof(WCHAR); - break; - } case LB_GETSELITEMS: copy_size = wparam * sizeof(UINT); break; diff --git a/dlls/win32u/tests/win32u.c b/dlls/win32u/tests/win32u.c index 5ff755745f1..4d88eeaee8b 100644 --- a/dlls/win32u/tests/win32u.c +++ b/dlls/win32u/tests/win32u.c @@ -1413,6 +1413,14 @@ static void check_params( const struct lparam_hook_test *test, UINT message, ok( wparam, "wparam = 0\n" ); break;
+ case EM_GETLINE: + if (!is_ret) + { + WCHAR *buf = (WCHAR *)lparam; + ok(buf[0] == 8, "buf[0] = %x\n", buf[0]); + } + break; + default: if (test->check_size) { const void *expected = is_ret && test->change_lparam ? test->change_lparam : test->lparam; @@ -1867,6 +1875,16 @@ static void test_wndproc_hook(void) .lparam_size = sizeof(DWORD), .lparam = &dw_in, .change_lparam = &dw_out, .check_size = sizeof(DWORD), }, + { + "EM_GETLINE", EM_GETLINE, .msg_result = 5, + .lparam = L"\x8""2345678", .lparam_size = sizeof(strbufW), .change_lparam = L"abc\0defg", + .check_size = sizeof(WCHAR), .check_lparam = L"abc\0""5678", + }, + { + "EM_GETLINE-2", EM_GETLINE, .msg_result = 1, + .lparam = L"\x8""2345678", .lparam_size = sizeof(strbufW), .change_lparam = L"abc\0defg", + .check_size = sizeof(WCHAR), .check_lparam = L"abc\0""5678", + }, /* 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 37cb0caeae9..14b76649709 100644 --- a/dlls/wow64win/user.c +++ b/dlls/wow64win/user.c @@ -843,6 +843,7 @@ static size_t packed_result_32to64( UINT message, WPARAM wparam, const void *par case EM_SETRECTNP: case LB_GETITEMRECT: case CB_GETDROPPEDCONTROLRECT: + case EM_GETLINE: break;
default:
This merge request was approved by Huw Davies.