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/CMakeLists.txt?rev=72495&r1=72494&r2=72495&view=diff
==============================================================================
--- 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/message.c?rev=72495&r1=72494&r2=72495&view=diff
==============================================================================
--- 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/wndproc_fixup.S?rev=72495
==============================================================================
--- 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 [email protected]
+ * 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


Reply via email to