[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

svn path=/trunk/; revision=72495
This commit is contained in:
Jérôme Gardou
2016-08-28 20:04:01 +00:00
parent 665e8ea561
commit 097bbc5c95
3 changed files with 84 additions and 37 deletions
@@ -64,8 +64,16 @@ list(APPEND SOURCE
${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)
+20 -37
View File
@@ -13,6 +13,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 */
/* 32 messages per entry, messages 0..31 map to bits 0..31 */
@@ -1448,15 +1464,7 @@ IntCallWindowProcW(BOOL IsAnsiProc,
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 @@ IntCallWindowProcW(BOOL IsAnsiProc,
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 @@ IntCallWindowProcA(BOOL IsAnsiProc,
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 @@ IntCallWindowProcA(BOOL IsAnsiProc,
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)
{
@@ -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