[PATCH 0/5] MR3284: win32u: Always use NtCallbackReturn to return result from client callbacks.
We needed an alternative mechanism for cases when we couldn't assume that we're running on Unix stack. It's no longer needed, so we can get rid of it now. -- https://gitlab.winehq.org/wine/wine/-/merge_requests/3284
From: Jacek Caban <jacek(a)codeweavers.com> --- dlls/user32/message.c | 6 ++---- dlls/user32/user_private.h | 2 +- dlls/user32/winproc.c | 30 +++++++++++++----------------- 3 files changed, 16 insertions(+), 22 deletions(-) diff --git a/dlls/user32/message.c b/dlls/user32/message.c index 33e81c76e4b..acab4117cf2 100644 --- a/dlls/user32/message.c +++ b/dlls/user32/message.c @@ -586,11 +586,10 @@ static LRESULT dispatch_send_message( struct win_proc_params *params, WPARAM wpa thread_info->recursion_count++; - params->result = &retval; thread_info->msg_source = msg_source_unavailable; SPY_EnterMessage( SPY_SENDMESSAGE, params->hwnd, params->msg, params->wparam, params->lparam ); - dispatch_win_proc_params( params ); + retval = dispatch_win_proc_params( params ); SPY_ExitMessage( SPY_RESULT_OK, params->hwnd, params->msg, retval, params->wparam, params->lparam ); thread_info->msg_source = prev_source; @@ -850,10 +849,9 @@ static LRESULT dispatch_message( const MSG *msg, BOOL ansi ) if (!NtUserMessageCall( msg->hwnd, msg->message, msg->wParam, msg->lParam, ¶ms, NtUserGetDispatchParams, ansi )) return 0; - params.result = &retval; SPY_EnterMessage( SPY_DISPATCHMESSAGE, msg->hwnd, msg->message, msg->wParam, msg->lParam ); - dispatch_win_proc_params( ¶ms ); + retval = dispatch_win_proc_params( ¶ms ); SPY_ExitMessage( SPY_RESULT_OK, msg->hwnd, msg->message, retval, msg->wParam, msg->lParam ); return retval; } diff --git a/dlls/user32/user_private.h b/dlls/user32/user_private.h index c3f877758c1..10f5d83b6f1 100644 --- a/dlls/user32/user_private.h +++ b/dlls/user32/user_private.h @@ -72,7 +72,7 @@ extern LRESULT WINPROC_CallProcAtoW( winproc_callback_t callback, HWND hwnd, UIN extern INT_PTR WINPROC_CallDlgProcA( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam ) DECLSPEC_HIDDEN; extern INT_PTR WINPROC_CallDlgProcW( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam ) DECLSPEC_HIDDEN; extern void winproc_init(void) DECLSPEC_HIDDEN; -extern void dispatch_win_proc_params( struct win_proc_params *params ) DECLSPEC_HIDDEN; +extern LRESULT dispatch_win_proc_params( struct win_proc_params *params ) DECLSPEC_HIDDEN; extern ATOM get_class_info( HINSTANCE instance, const WCHAR *name, WNDCLASSEXW *info, UNICODE_STRING *name_str, BOOL ansi ) DECLSPEC_HIDDEN; diff --git a/dlls/user32/winproc.c b/dlls/user32/winproc.c index 9fd35e1d24e..a72ba43ed92 100644 --- a/dlls/user32/winproc.c +++ b/dlls/user32/winproc.c @@ -712,36 +712,38 @@ static LRESULT WINPROC_CallProcWtoA( winproc_callback_t callback, HWND hwnd, UIN } -void dispatch_win_proc_params( struct win_proc_params *params ) +LRESULT dispatch_win_proc_params( struct win_proc_params *params ) { DPI_AWARENESS_CONTEXT context = SetThreadDpiAwarenessContext( params->dpi_awareness ); + LRESULT result = 0; if (!params->ansi) { if (params->procW == WINPROC_PROC16) WINPROC_CallProcWtoA( wow_handlers.call_window_proc, params->hwnd, params->msg, params->wparam, - params->lparam, params->result, params->func ); + params->lparam, &result, params->func ); else if (!params->ansi_dst) call_window_proc( params->hwnd, params->msg, params->wparam, params->lparam, - params->result, params->procW ); + &result, params->procW ); else WINPROC_CallProcWtoA( call_window_proc, params->hwnd, params->msg, params->wparam, - params->lparam, params->result, params->procA ); + params->lparam, &result, params->procA ); } else { if (params->procA == WINPROC_PROC16) wow_handlers.call_window_proc( params->hwnd, params->msg, params->wparam, params->lparam, - params->result, params->func ); + &result, params->func ); else if (!params->ansi_dst) WINPROC_CallProcAtoW( call_window_proc, params->hwnd, params->msg, params->wparam, - params->lparam, params->result, params->procW, params->mapping ); + params->lparam, &result, params->procW, params->mapping ); else call_window_proc( params->hwnd, params->msg, params->wparam, params->lparam, - params->result, params->procA ); + &result, params->procA ); } SetThreadDpiAwarenessContext( context ); + return result; } /* make sure that there is space for 'size' bytes in buffer, growing it if needed */ @@ -1201,7 +1203,7 @@ BOOL WINAPI User32CallWindowProc( struct win_proc_params *params, ULONG size ) ¶ms->lparam, &buffer, size )) return 0; - dispatch_win_proc_params( params ); + result = dispatch_win_proc_params( params ); NtUserMessageCall( params->hwnd, params->msg, params->wparam, params->lparam, (void *)result, NtUserWinProcResult, FALSE ); @@ -1210,7 +1212,7 @@ BOOL WINAPI User32CallWindowProc( struct win_proc_params *params, ULONG size ) } else { - dispatch_win_proc_params( params ); + result = dispatch_win_proc_params( params ); if (result_ptr) { *result_ptr = result; @@ -1254,14 +1256,11 @@ BOOL WINAPI User32CallSendAsyncCallback( const struct send_async_params *params, LRESULT WINAPI CallWindowProcA( WNDPROC func, HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam ) { struct win_proc_params params; - LRESULT result; params.func = func; - params.result = &result; if (!NtUserMessageCall( hwnd, msg, wParam, lParam, ¶ms, NtUserCallWindowProc, TRUE )) return 0; - dispatch_win_proc_params( ¶ms ); - return result; + return dispatch_win_proc_params( ¶ms ); } @@ -1273,14 +1272,11 @@ LRESULT WINAPI CallWindowProcA( WNDPROC func, HWND hwnd, UINT msg, WPARAM wParam LRESULT WINAPI CallWindowProcW( WNDPROC func, HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam ) { struct win_proc_params params; - LRESULT result; params.func = func; - params.result = &result; if (!NtUserMessageCall( hwnd, msg, wParam, lParam, ¶ms, NtUserCallWindowProc, FALSE )) return 0; - dispatch_win_proc_params( ¶ms ); - return result; + return dispatch_win_proc_params( ¶ms ); } -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/3284
From: Jacek Caban <jacek(a)codeweavers.com> --- dlls/win32u/message.c | 31 +++++++++++++++---------------- 1 file changed, 15 insertions(+), 16 deletions(-) diff --git a/dlls/win32u/message.c b/dlls/win32u/message.c index c3f8b65833e..091f5cadc34 100644 --- a/dlls/win32u/message.c +++ b/dlls/win32u/message.c @@ -225,8 +225,7 @@ static BOOL init_win_proc_params( struct win_proc_params *params, HWND hwnd, UIN } static BOOL init_window_call_params( struct win_proc_params *params, HWND hwnd, UINT msg, WPARAM wParam, - LPARAM lParam, LRESULT *result, BOOL ansi, - enum wm_char_mapping mapping ) + LPARAM lParam, BOOL ansi, enum wm_char_mapping mapping ) { BOOL is_dialog; WND *win; @@ -249,7 +248,7 @@ static BOOL init_window_call_params( struct win_proc_params *params, HWND hwnd, params->msg = msg; params->wparam = wParam; params->lparam = lParam; - params->result = result; + params->result = NULL; params->ansi = ansi; params->needs_unpack = FALSE; params->mapping = mapping; @@ -258,20 +257,22 @@ static BOOL init_window_call_params( struct win_proc_params *params, HWND hwnd, return TRUE; } -static BOOL dispatch_win_proc_params( struct win_proc_params *params, size_t size ) +static LRESULT dispatch_win_proc_params( struct win_proc_params *params, size_t size ) { struct ntuser_thread_info *thread_info = NtUserGetThreadInfo(); + LRESULT result = 0; void *ret_ptr; ULONG ret_len; - if (thread_info->recursion_count > MAX_WINPROC_RECURSION) return FALSE; + if (thread_info->recursion_count > MAX_WINPROC_RECURSION) return 0; thread_info->recursion_count++; + params->result = &result; KeUserModeCallback( NtUserCallWinProc, params, size, &ret_ptr, &ret_len ); - if (ret_len == sizeof(*params->result)) *params->result = *(LRESULT *)ret_ptr; + if (ret_len == sizeof(result)) result = *(LRESULT *)ret_ptr; thread_info->recursion_count--; - return TRUE; + return result; } /* add a data field to a packed message */ @@ -1394,7 +1395,7 @@ static LRESULT call_window_proc( HWND hwnd, UINT msg, WPARAM wparam, LPARAM lpar call_hooks( WH_CALLWNDPROC, HC_ACTION, same_thread, (LPARAM)&cwp, sizeof(cwp) ); if (size && !(params = malloc( sizeof(*params) + size ))) return 0; - if (!init_window_call_params( params, hwnd, msg, wparam, lparam, &result, !unicode, mapping )) + if (!init_window_call_params( params, hwnd, msg, wparam, lparam, !unicode, mapping )) { if (params != &p) free( params ); return 0; @@ -1406,7 +1407,7 @@ static LRESULT call_window_proc( HWND hwnd, UINT msg, WPARAM wparam, LPARAM lpar params->ansi = FALSE; if (size) memcpy( params + 1, buffer, size ); } - dispatch_win_proc_params( params, sizeof(*params) + size ); + result = dispatch_win_proc_params( params, sizeof(*params) + size ); if (params != &p) free( params ); /* and finally the WH_CALLWNDPROCRET hook */ @@ -2750,12 +2751,10 @@ LRESULT WINAPI NtUserDispatchMessage( const MSG *msg ) if (msg->lParam && msg->message == WM_TIMER) { params.func = (WNDPROC)msg->lParam; - params.result = &retval; /* FIXME */ if (!init_win_proc_params( ¶ms, msg->hwnd, msg->message, msg->wParam, NtGetTickCount(), FALSE )) return 0; - dispatch_win_proc_params( ¶ms, sizeof(params) ); - return retval; + return dispatch_win_proc_params( ¶ms, sizeof(params) ); } if (msg->message == WM_SYSTIMER) { @@ -2776,8 +2775,8 @@ LRESULT WINAPI NtUserDispatchMessage( const MSG *msg ) spy_enter_message( SPY_DISPATCHMESSAGE, msg->hwnd, msg->message, msg->wParam, msg->lParam ); if (init_window_call_params( ¶ms, msg->hwnd, msg->message, msg->wParam, msg->lParam, - &retval, FALSE, WMCHAR_MAP_DISPATCHMESSAGE )) - dispatch_win_proc_params( ¶ms, sizeof(params) ); + FALSE, WMCHAR_MAP_DISPATCHMESSAGE )) + retval = dispatch_win_proc_params( ¶ms, sizeof(params) ); else if (!is_window( msg->hwnd )) RtlSetLastWin32Error( ERROR_INVALID_WINDOW_HANDLE ); else RtlSetLastWin32Error( ERROR_MESSAGE_SYNC_ONLY ); @@ -3184,7 +3183,7 @@ static BOOL process_message( struct send_message_info *info, DWORD_PTR *res_ptr, /* if we're called from client side and need just a simple winproc call, * just fill dispatch params and let user32 do the rest */ return init_window_call_params( info->params, info->hwnd, info->msg, info->wparam, info->lparam, - NULL, ansi, info->wm_char ); + ansi, info->wm_char ); } thread_info->msg_source = msg_source_unavailable; @@ -3545,7 +3544,7 @@ LRESULT WINAPI NtUserMessageCall( HWND hwnd, UINT msg, WPARAM wparam, LPARAM lpa case NtUserGetDispatchParams: if (!hwnd) return FALSE; if (init_window_call_params( result_info, hwnd, msg, wparam, lparam, - NULL, ansi, WMCHAR_MAP_DISPATCHMESSAGE )) + ansi, WMCHAR_MAP_DISPATCHMESSAGE )) return TRUE; if (!is_window( hwnd )) RtlSetLastWin32Error( ERROR_INVALID_WINDOW_HANDLE ); else RtlSetLastWin32Error( ERROR_MESSAGE_SYNC_ONLY ); -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/3284
From: Jacek Caban <jacek(a)codeweavers.com> We may always use NtCallbackReturn now. --- dlls/user32/winproc.c | 11 ++--------- dlls/win32u/message.c | 2 -- dlls/wow64win/user.c | 24 ++++++------------------ include/ntuser.h | 1 - 4 files changed, 8 insertions(+), 30 deletions(-) diff --git a/dlls/user32/winproc.c b/dlls/user32/winproc.c index a72ba43ed92..36acd7b6382 100644 --- a/dlls/user32/winproc.c +++ b/dlls/user32/winproc.c @@ -1181,8 +1181,7 @@ static BOOL unpack_message( HWND hwnd, UINT message, WPARAM *wparam, LPARAM *lpa BOOL WINAPI User32CallWindowProc( struct win_proc_params *params, ULONG size ) { - LRESULT result, *result_ptr = params->result; - params->result = &result; + LRESULT result; if (params->needs_unpack) { @@ -1213,14 +1212,8 @@ BOOL WINAPI User32CallWindowProc( struct win_proc_params *params, ULONG size ) else { result = dispatch_win_proc_params( params ); - if (result_ptr) - { - *result_ptr = result; - return TRUE; - } - NtCallbackReturn( &result, sizeof(result), TRUE ); } - return TRUE; + return NtCallbackReturn( &result, sizeof(result), TRUE ); } BOOL WINAPI User32CallSendAsyncCallback( const struct send_async_params *params, ULONG size ) diff --git a/dlls/win32u/message.c b/dlls/win32u/message.c index 091f5cadc34..30b67e2c6af 100644 --- a/dlls/win32u/message.c +++ b/dlls/win32u/message.c @@ -248,7 +248,6 @@ static BOOL init_window_call_params( struct win_proc_params *params, HWND hwnd, params->msg = msg; params->wparam = wParam; params->lparam = lParam; - params->result = NULL; params->ansi = ansi; params->needs_unpack = FALSE; params->mapping = mapping; @@ -267,7 +266,6 @@ static LRESULT dispatch_win_proc_params( struct win_proc_params *params, size_t if (thread_info->recursion_count > MAX_WINPROC_RECURSION) return 0; thread_info->recursion_count++; - params->result = &result; KeUserModeCallback( NtUserCallWinProc, params, size, &ret_ptr, &ret_len ); if (ret_len == sizeof(result)) result = *(LRESULT *)ret_ptr; diff --git a/dlls/wow64win/user.c b/dlls/wow64win/user.c index 8e2853ca0b5..409dcefcda2 100644 --- a/dlls/wow64win/user.c +++ b/dlls/wow64win/user.c @@ -285,7 +285,6 @@ struct win_proc_params32 UINT msg; ULONG wparam; ULONG lparam; - ULONG result; BOOL ansi; BOOL ansi_dst; BOOL needs_unpack; @@ -376,15 +375,13 @@ static struct client_menu_name32 *client_menu_name_64to32( const struct client_m return name32; } -static void win_proc_params_64to32( const struct win_proc_params *src, struct win_proc_params32 *dst, - ULONG *result ) +static void win_proc_params_64to32( const struct win_proc_params *src, struct win_proc_params32 *dst ) { dst->func = PtrToUlong( src->func ); dst->hwnd = HandleToUlong( src->hwnd ); dst->msg = src->msg; dst->wparam = src->wparam; dst->lparam = src->lparam; - dst->result = PtrToUlong( result ); dst->ansi = src->ansi; dst->ansi_dst = src->ansi_dst; dst->needs_unpack = src->needs_unpack; @@ -543,8 +540,7 @@ static NTSTATUS WINAPI wow64_NtUserCallWinProc( void *arg, ULONG size ) { struct win_proc_params *params = arg; struct win_proc_params32 params32_buf, *params32 = ¶ms32_buf; - LONG result32 = 0; - LRESULT result; + LRESULT result = 0; void *ret_ptr; ULONG ret_len; NTSTATUS status; @@ -555,19 +551,13 @@ static NTSTATUS WINAPI wow64_NtUserCallWinProc( void *arg, ULONG size ) return 0; memcpy( params32 + 1, params + 1, size - sizeof(*params) ); } - win_proc_params_64to32( params, params32, NULL ); + win_proc_params_64to32( params, params32 ); status = Wow64KiUserCallbackDispatcher( NtUserCallWinProc, params32, size - sizeof(*params) + sizeof(*params32), &ret_ptr, &ret_len ); - if (ret_len == sizeof(result32)) result32 = *(LONG *)ret_ptr; - result = result32; - if (params->result) - { - *params->result = result; - return status; - } + if (ret_len == sizeof(LONG)) result = *(LONG *)ret_ptr; return NtCallbackReturn( &result, sizeof(result), status ); } @@ -3083,15 +3073,13 @@ NTSTATUS WINAPI wow64_NtUserMessageCall( UINT *args ) { struct win_proc_params32 *params32 = result_info; struct win_proc_params params; - ULONG *result32; - result32 = UlongToPtr( params32->result ); if (type == NtUserCallWindowProc) params.func = UlongToPtr( params32->func ); if (!NtUserMessageCall( hwnd, msg, wparam, lparam, ¶ms, type, ansi )) return FALSE; - win_proc_params_64to32( ¶ms, params32, result32 ); + win_proc_params_64to32( ¶ms, params32 ); return TRUE; } @@ -3106,7 +3094,7 @@ NTSTATUS WINAPI wow64_NtUserMessageCall( UINT *args ) params.hwnd = 0; ret = message_call_32to64( hwnd, msg, wparam, lparam, ¶ms, type, ansi ); - if (params.hwnd) win_proc_params_64to32( ¶ms, params32, NULL ); + if (params.hwnd) win_proc_params_64to32( ¶ms, params32 ); return ret; } diff --git a/include/ntuser.h b/include/ntuser.h index cc6126e53db..2f01f0eafb3 100644 --- a/include/ntuser.h +++ b/include/ntuser.h @@ -147,7 +147,6 @@ struct win_proc_params UINT msg; WPARAM wparam; LPARAM lparam; - LRESULT *result; BOOL ansi; BOOL ansi_dst; BOOL needs_unpack; -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/3284
From: Jacek Caban <jacek(a)codeweavers.com> --- dlls/win32u/message.c | 6 ------ 1 file changed, 6 deletions(-) diff --git a/dlls/win32u/message.c b/dlls/win32u/message.c index 30b67e2c6af..49ac4b2de94 100644 --- a/dlls/win32u/message.c +++ b/dlls/win32u/message.c @@ -54,7 +54,6 @@ struct received_message_info UINT type; MSG msg; UINT flags; /* InSendMessageEx return flags */ - LRESULT result; struct received_message_info *prev; }; @@ -1258,7 +1257,6 @@ static BOOL reply_winproc_result( LRESULT result, HWND hwnd, UINT message, WPARA if (info->type == MSG_CLIENT_MESSAGE) { copy_reply( result, hwnd, message, info->msg.wParam, info->msg.lParam, wparam, lparam ); - info->result = result; return TRUE; } @@ -2879,16 +2877,12 @@ static BOOL process_packed_message( struct send_message_info *info, LRESULT *res receive_info.msg.lParam = info->lparam; receive_info.flags = 0; receive_info.prev = thread_info->receive_info; - receive_info.result = 0; thread_info->receive_info = &receive_info; *res_ptr = call_window_proc( info->hwnd, info->msg, info->wparam, info->lparam, !ansi, TRUE, info->wm_char, TRUE, buffer, buffer_size ); if (thread_info->receive_info == &receive_info) - { thread_info->receive_info = receive_info.prev; - *res_ptr = receive_info.result; - } free( buffer ); return TRUE; } -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/3284
From: Jacek Caban <jacek(a)codeweavers.com> --- dlls/user32/user_main.c | 12 +++--------- dlls/win32u/font.c | 1 - dlls/wow64win/user.c | 6 ------ include/ntuser.h | 1 - 4 files changed, 3 insertions(+), 17 deletions(-) diff --git a/dlls/user32/user_main.c b/dlls/user32/user_main.c index 56d5849f469..ef2b94ba698 100644 --- a/dlls/user32/user_main.c +++ b/dlls/user32/user_main.c @@ -121,19 +121,13 @@ static NTSTATUS WINAPI User32DrawScrollBar( const struct draw_scroll_bar_params return 0; } -static NTSTATUS WINAPI User32DrawText( const struct draw_text_params *params, ULONG size ) +static NTSTATUS WINAPI User32DrawText( struct draw_text_params *params, ULONG size ) { - RECT rect = params->rect; int ret; size -= FIELD_OFFSET( struct draw_text_params, str ); - ret = DrawTextW( params->hdc, params->str, size / sizeof(WCHAR), &rect, params->flags ); - if (params->ret_rect) - { - *params->ret_rect = rect; - return ret; - } - return NtCallbackReturn( &rect, sizeof(rect), ret ); + ret = DrawTextW( params->hdc, params->str, size / sizeof(WCHAR), ¶ms->rect, params->flags ); + return NtCallbackReturn( ¶ms->rect, sizeof(params->rect), ret ); } static NTSTATUS WINAPI User32ImmProcessKey( const struct imm_process_key_params *params, ULONG size ) diff --git a/dlls/win32u/font.c b/dlls/win32u/font.c index c5f62e76f3a..4a341453012 100644 --- a/dlls/win32u/font.c +++ b/dlls/win32u/font.c @@ -7097,7 +7097,6 @@ INT WINAPI DECLSPEC_HIDDEN DrawTextW( HDC hdc, const WCHAR *str, INT count, RECT if (!(params = malloc( size ))) return 0; params->hdc = hdc; params->rect = *rect; - params->ret_rect = rect; params->flags = flags; if (count) memcpy( params->str, str, count * sizeof(WCHAR) ); ret = KeUserModeCallback( NtUserDrawText, params, size, &ret_ptr, &ret_len ); diff --git a/dlls/wow64win/user.c b/dlls/wow64win/user.c index 409dcefcda2..8a5455d2347 100644 --- a/dlls/wow64win/user.c +++ b/dlls/wow64win/user.c @@ -832,7 +832,6 @@ static NTSTATUS WINAPI wow64_NtUserDrawText( void *arg, ULONG size ) { struct draw_text_params *params = arg; struct draw_text_params32 *params32; - RECT *rect_ptr = params->ret_rect; ULONG ret_len; void *ret_ptr; NTSTATUS ret; @@ -846,11 +845,6 @@ static NTSTATUS WINAPI wow64_NtUserDrawText( void *arg, ULONG size ) ret = Wow64KiUserCallbackDispatcher( NtUserDrawText, params32, size - sizeof(*params) + sizeof(*params32), &ret_ptr, &ret_len ); - if (ret_len == sizeof(RECT) && rect_ptr) - { - *rect_ptr = *(const RECT *)ret_ptr; - return ret; - } return NtCallbackReturn( ret_ptr, ret_len, ret ); } diff --git a/include/ntuser.h b/include/ntuser.h index 2f01f0eafb3..195d4e1322a 100644 --- a/include/ntuser.h +++ b/include/ntuser.h @@ -188,7 +188,6 @@ struct draw_text_params HDC hdc; int count; RECT rect; - RECT *ret_rect; /* FIXME: Use NtCallbackReturn instead */ UINT flags; WCHAR str[1]; }; -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/3284
This merge request was approved by Huw Davies. -- https://gitlab.winehq.org/wine/wine/-/merge_requests/3284
participants (3)
-
Huw Davies (@huw) -
Jacek Caban -
Jacek Caban (@jacek)