Module: wine Branch: master Commit: 0be20785312676065afd462852d2411b1891a73b URL: https://gitlab.winehq.org/wine/wine/-/commit/0be20785312676065afd462852d2411...
Author: Jacek Caban jacek@codeweavers.com Date: Tue Jul 18 00:28:55 2023 +0200
win32u: Use user message packing for WM_DRAWITEM.
---
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 );