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.
From: Jacek Caban jacek@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 ); }
From: Jacek Caban jacek@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 );
From: Jacek Caban jacek@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;
From: Jacek Caban jacek@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; }
From: Jacek Caban jacek@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]; };
This merge request was approved by Huw Davies.