Author: jgardou Date: Sun Aug 28 20:04:01 2016 New Revision: 72495
URL: http://svn.reactos.org/svn/reactos?rev=72495&view=rev Log: [WIN32SS/USER32] - Do not mask exceptions from WndProc. If this makes programs crash, fine, fix it, but DON'T HIDE BUGS. - Use a wrappper (like wine does) to handle procs with bad calling conventions ROSTESTS-155 : Please retest, user32 got in the way and masked the exception handler the wine test installed
Added: trunk/reactos/win32ss/user/user32/windows/wndproc_fixup.S (with props) Modified: trunk/reactos/win32ss/user/user32/CMakeLists.txt trunk/reactos/win32ss/user/user32/windows/message.c
Modified: trunk/reactos/win32ss/user/user32/CMakeLists.txt URL: http://svn.reactos.org/svn/reactos/trunk/reactos/win32ss/user/user32/CMakeLi... ============================================================================== --- trunk/reactos/win32ss/user/user32/CMakeLists.txt [iso-8859-1] (original) +++ trunk/reactos/win32ss/user/user32/CMakeLists.txt [iso-8859-1] Sun Aug 28 20:04:01 2016 @@ -64,8 +64,16 @@ ${CMAKE_CURRENT_BINARY_DIR}/user32_stubs.c include/user32.h)
+if(ARCH STREQUAL "i386") + list(APPEND ASM_SOURCE + windows/wndproc_fixup.S) +endif() + +add_asm_files(user32_asm ${ASM_SOURCE}) + add_library(user32 SHARED ${SOURCE} + ${user32_asm} user32.rc ${CMAKE_CURRENT_BINARY_DIR}/user32.def)
Modified: trunk/reactos/win32ss/user/user32/windows/message.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/win32ss/user/user32/windows... ============================================================================== --- trunk/reactos/win32ss/user/user32/windows/message.c [iso-8859-1] (original) +++ trunk/reactos/win32ss/user/user32/windows/message.c [iso-8859-1] Sun Aug 28 20:04:01 2016 @@ -12,6 +12,22 @@
#include <wine/debug.h> WINE_DEFAULT_DEBUG_CHANNEL(user32); + + +#ifdef __i386__ +/* For bad applications which provide bad (non stdcall) WndProc */ +extern +__cdecl +LRESULT +CALL_EXTERN_WNDPROC( + WNDPROC WndProc, + HWND hWnd, + UINT Msg, + WPARAM wParam, + LPARAM lParam); +#else +# define CALL_EXTERN_WNDPROC(proc, h, m, w, l) proc(h, m, w, l) +#endif
/* From wine: */ /* flag for messages that contain pointers */ @@ -1448,15 +1464,7 @@
if (PreResult) goto Exit;
- _SEH2_TRY // wine does this. - { - Result = WndProc(AnsiMsg.hwnd, AnsiMsg.message, AnsiMsg.wParam, AnsiMsg.lParam); - } - _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) - { - ERR("Exception when calling Ansi WndProc %p Msg %d pti %p Wndpti %p\n",WndProc,Msg,GetW32ThreadInfo(),pWnd->head.pti); - } - _SEH2_END; + Result = CALL_EXTERN_WNDPROC(WndProc, AnsiMsg.hwnd, AnsiMsg.message, AnsiMsg.wParam, AnsiMsg.lParam);
if (Hook && MsgOverride) { @@ -1497,15 +1505,7 @@
if (PreResult) goto Exit;
- _SEH2_TRY - { - Result = WndProc(hWnd, Msg, wParam, lParam); - } - _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) - { - ERR("Exception when calling unicode WndProc %p Msg %d pti %p Wndpti %p\n",WndProc, Msg,GetW32ThreadInfo(),pWnd->head.pti); - } - _SEH2_END; + Result = CALL_EXTERN_WNDPROC(WndProc, hWnd, Msg, wParam, lParam);
if (Hook && MsgOverride) { @@ -1585,15 +1585,7 @@
if (PreResult) goto Exit;
- _SEH2_TRY - { - Result = WndProc(hWnd, Msg, wParam, lParam); - } - _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) - { - ERR("Exception when calling Ansi WndProc %p Msg %d pti %p Wndpti %p\n",WndProc,Msg,GetW32ThreadInfo(),pWnd->head.pti); - } - _SEH2_END; + Result = CALL_EXTERN_WNDPROC(WndProc, hWnd, Msg, wParam, lParam);
if (Hook && MsgOverride) { @@ -1641,16 +1633,7 @@
if (PreResult) goto Exit;
- _SEH2_TRY - { - Result = WndProc(UnicodeMsg.hwnd, UnicodeMsg.message, - UnicodeMsg.wParam, UnicodeMsg.lParam); - } - _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) - { - ERR("Exception when calling unicode WndProc %p Msg %d pti %p Wndpti %p\n",WndProc, Msg,GetW32ThreadInfo(),pWnd->head.pti); - } - _SEH2_END; + Result = CALL_EXTERN_WNDPROC(WndProc, UnicodeMsg.hwnd, UnicodeMsg.message, UnicodeMsg.wParam, UnicodeMsg.lParam);
if (Hook && MsgOverride) {
Added: trunk/reactos/win32ss/user/user32/windows/wndproc_fixup.S URL: http://svn.reactos.org/svn/reactos/trunk/reactos/win32ss/user/user32/windows... ============================================================================== --- trunk/reactos/win32ss/user/user32/windows/wndproc_fixup.S (added) +++ trunk/reactos/win32ss/user/user32/windows/wndproc_fixup.S [iso-8859-1] Sun Aug 28 20:04:01 2016 @@ -0,0 +1,56 @@ +/* + * COPYRIGHT: See COPYING in the top level directory + * PROJECT: ReactOS user32.dll + * FILE: win32ss/user/user32/windows/wndproc_fixup.S + * PURPOSE: Messages + * PROGRAMMER: Jérôme Gardou jerome.gardou@reactos.org + * LICENCE : LGPL, copyright Alexandre Julliard + */ + +#include <asm.inc> +#include <ks386.inc> + +/* Some applications provide invalid callbacks which don't follow the stdcall convention */ + +.code + +/* + * __cdecl + * LRESULT + * CALL_EXTERN_WNDPROC( + * WNDPROC WndProc, + * HWND hWnd, + * UINT Msg, + * WPARAM wParam, + * LPARAM lParam); + */ +PUBLIC _CALL_EXTERN_WNDPROC +FUNC _CALL_EXTERN_WNDPROC + FPO 0, 0, 0, 0, 0, FRAME_FPO + + push ebp + mov ebp, esp + + push edi + push esi + push ebp + + sub esp, 12 + + push dword ptr [ebp + 24] + push dword ptr [ebp + 20] + push dword ptr [ebp + 16] + push dword ptr [ebp + 12] + mov eax, dword ptr [ebp + 8] + + call eax + + lea esp, dword ptr [ebp - 12] + pop ebx + pop esi + pop edi + + leave + ret + +ENDFUNC
Propchange: trunk/reactos/win32ss/user/user32/windows/wndproc_fixup.S ------------------------------------------------------------------------------ svn:eol-style = native