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/CMakeL…
==============================================================================
--- 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/window…
==============================================================================
--- 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/window…
==============================================================================
--- 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(a)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