From: Detlef Riekenberg Subject: [PATCH 1/2] msvcr90: Implement _set_abort_behavior Message-Id: <1294409473-3456-1-git-send-email-wine.dev@web.de> Date: Fri, 7 Jan 2011 15:11:12 +0100 This let radiotracker go a step forward -- By by ... Detlef --- dlls/msvcr100/msvcr100.spec | 2 +- dlls/msvcr80/msvcr80.spec | 2 +- dlls/msvcr90/msvcr90.spec | 2 +- dlls/msvcrt/exit.c | 31 +++++++++++++++++++++++++++---- include/msvcrt/stdlib.h | 3 +++ 5 files changed, 33 insertions(+), 7 deletions(-) diff --git a/dlls/msvcr100/msvcr100.spec b/dlls/msvcr100/msvcr100.spec index 0d1ffa1..1e898df 100644 --- a/dlls/msvcr100/msvcr100.spec +++ b/dlls/msvcr100/msvcr100.spec @@ -1068,7 +1068,7 @@ @ stub _seh_longjmp_unwind4 @ stdcall -i386 _seh_longjmp_unwind(ptr) msvcrt._seh_longjmp_unwind @ cdecl _set_SSE2_enable(long) msvcrt._set_SSE2_enable -@ stub _set_abort_behavior +@ cdecl _set_abort_behavior(long long) msvcrt._set_abort_behavior @ stub _set_controlfp @ cdecl _set_doserrno(long) msvcrt._set_doserrno @ cdecl _set_errno(long) msvcrt._set_errno diff --git a/dlls/msvcr80/msvcr80.spec b/dlls/msvcr80/msvcr80.spec index 63d8f14..d530f78 100644 --- a/dlls/msvcr80/msvcr80.spec +++ b/dlls/msvcr80/msvcr80.spec @@ -920,7 +920,7 @@ @ stub _seh_longjmp_unwind4 @ stdcall -i386 _seh_longjmp_unwind(ptr) msvcrt._seh_longjmp_unwind @ cdecl _set_SSE2_enable(long) msvcrt._set_SSE2_enable -@ stub _set_abort_behavior +@ cdecl _set_abort_behavior(long long) msvcrt._set_abort_behavior @ stub _set_amblksiz @ stub _set_controlfp @ cdecl _set_doserrno(long) msvcrt._set_doserrno diff --git a/dlls/msvcr90/msvcr90.spec b/dlls/msvcr90/msvcr90.spec index 3e8f0bf..c1d400a 100644 --- a/dlls/msvcr90/msvcr90.spec +++ b/dlls/msvcr90/msvcr90.spec @@ -906,7 +906,7 @@ @ stub _seh_longjmp_unwind4 @ stdcall -i386 _seh_longjmp_unwind(ptr) msvcrt._seh_longjmp_unwind @ cdecl _set_SSE2_enable(long) msvcrt._set_SSE2_enable -@ stub _set_abort_behavior +@ cdecl _set_abort_behavior(long long) msvcrt._set_abort_behavior @ stub _set_amblksiz @ stub _set_controlfp @ cdecl _set_doserrno(long) msvcrt._set_doserrno diff --git a/dlls/msvcrt/exit.c b/dlls/msvcrt/exit.c index 80749fc..15927e7 100644 --- a/dlls/msvcrt/exit.c +++ b/dlls/msvcrt/exit.c @@ -36,6 +36,11 @@ static MSVCRT_purecall_handler purecall_handler = NULL; static const char szMsgBoxTitle[] = "Wine C++ Runtime Library"; +#ifndef _WRITE_ABORT_MSG +#define _WRITE_ABORT_MSG 1 +#define _CALL_REPORTFAULT 2 +#endif +static unsigned int abort_behavior = _WRITE_ABORT_MSG | _CALL_REPORTFAULT; extern int MSVCRT_app_type; extern char *MSVCRT__pgmptr; @@ -150,17 +155,35 @@ void CDECL _amsg_exit(int errnum) void CDECL MSVCRT_abort(void) { TRACE("()\n"); - if (MSVCRT_app_type == 2) + if (abort_behavior & _WRITE_ABORT_MSG) { - DoMessageBox("Runtime error!", "abnormal program termination"); + if (MSVCRT_app_type == 2) + { + DoMessageBox("Runtime error!", "abnormal program termination"); + } + else + _cputs("\nabnormal program termination\n"); } - else - _cputs("\nabnormal program termination\n"); + + if (abort_behavior & _CALL_REPORTFAULT) + TRACE("_CALL_REPORTFAULT not supported\n"); + MSVCRT_raise(MSVCRT_SIGABRT); /* in case raise() returns */ MSVCRT__exit(3); } +/* _set_abort_behavior - not exported in native msvcrt */ +unsigned int CDECL _set_abort_behavior(unsigned int newflag, unsigned int mask) +{ + unsigned int old = abort_behavior; + + TRACE("(0x%x, 0x%x)\n", newflag, mask); + + abort_behavior = (old ^ (old & mask)) | (newflag & mask); + return old; +} + /********************************************************************* * _assert (MSVCRT.@) */ diff --git a/include/msvcrt/stdlib.h b/include/msvcrt/stdlib.h index 49783c0..e384eb0 100644 --- a/include/msvcrt/stdlib.h +++ b/include/msvcrt/stdlib.h @@ -73,6 +73,8 @@ typedef struct _ldiv_t { #define _OUT_TO_MSGBOX 2 #define _REPORT_ERRMODE 3 +#define _WRITE_ABORT_MSG 1 +#define _CALL_REPORTFAULT 2 #ifdef __cplusplus extern "C" { @@ -160,6 +162,7 @@ int __cdecl _putenv(const char*); unsigned int __cdecl _rotl(unsigned int,int); unsigned int __cdecl _rotr(unsigned int,int); void __cdecl _searchenv(const char*,const char*,char*); +unsigned int __cdecl _set_abort_behavior(unsigned int, unsigned int); int __cdecl _set_error_mode(int); void __cdecl _seterrormode(int); void __cdecl _sleep(__msvcrt_ulong); -- 1.7.1