[PATCH 1/1] Partially implement _set_abort_behavior
Nikolay Sivov
nsivov at codeweavers.com
Tue Jan 11 15:46:26 CST 2011
---
dlls/msvcr100/msvcr100.spec | 2 +-
dlls/msvcr80/msvcr80.spec | 2 +-
dlls/msvcr90/msvcr90.spec | 2 +-
dlls/msvcrt/exit.c | 32 ++++++++++++++++++++++++++++----
dlls/msvcrt/msvcrt.h | 6 ++++++
dlls/msvcrt/msvcrt.spec | 1 +
6 files changed, 38 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..86859e0 100644
--- a/dlls/msvcrt/exit.c
+++ b/dlls/msvcrt/exit.c
@@ -39,6 +39,8 @@ static const char szMsgBoxTitle[] = "Wine C++ Runtime Library";
extern int MSVCRT_app_type;
extern char *MSVCRT__pgmptr;
+static int MSVCRT_abort_behavior = MSVCRT__WRITE_ABORT_MSG | MSVCRT__WRITE_CALL_REPORTFAULT;
+
void (*CDECL _aexit_rtn)(int) = MSVCRT__exit;
/* INTERNAL: call atexit functions */
@@ -150,18 +152,40 @@ void CDECL _amsg_exit(int errnum)
void CDECL MSVCRT_abort(void)
{
TRACE("()\n");
- if (MSVCRT_app_type == 2)
+
+ if (MSVCRT_abort_behavior & MSVCRT__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");
MSVCRT_raise(MSVCRT_SIGABRT);
/* in case raise() returns */
MSVCRT__exit(3);
}
/*********************************************************************
+ * _set_abort_behavior (MSVCRT.@)
+ *
+ * Not exported by native msvcrt, added in msvcr80
+ */
+int CDECL MSVCRT__set_abort_behavior(int flags, int mask)
+{
+ int old = MSVCRT_abort_behavior;
+
+ TRACE("%x, %x\n", flags, mask);
+ if (mask & MSVCRT__WRITE_CALL_REPORTFAULT)
+ FIXME("_WRITE_CALL_REPORTFAULT unhandled\n");
+
+ if (mask)
+ MSVCRT_abort_behavior = (MSVCRT_abort_behavior & ~mask) | (flags & mask);
+ return old;
+}
+
+/*********************************************************************
* _assert (MSVCRT.@)
*/
void CDECL MSVCRT__assert(const char* str, const char* file, unsigned int line)
diff --git a/dlls/msvcrt/msvcrt.h b/dlls/msvcrt/msvcrt.h
index 4ca3e3e..cd3265d 100644
--- a/dlls/msvcrt/msvcrt.h
+++ b/dlls/msvcrt/msvcrt.h
@@ -732,6 +732,12 @@ typedef void (__cdecl *MSVCRT___sighandler_t)(int);
#define _MAX__TIME64_T (((MSVCRT___time64_t)0x00000007 << 32) | 0x93406FFF)
+/* _set_abort_behavior codes */
+#define MSVCRT__WRITE_ABORT_MSG 1
+#define MSVCRT__WRITE_CALL_REPORTFAULT 2
+
+int __cdecl MSVCRT__set_abort_behavior(int,int);
+
void __cdecl MSVCRT_free(void*);
void* __cdecl MSVCRT_malloc(MSVCRT_size_t);
void* __cdecl MSVCRT_calloc(MSVCRT_size_t,MSVCRT_size_t);
diff --git a/dlls/msvcrt/msvcrt.spec b/dlls/msvcrt/msvcrt.spec
index efec11f..11a3fde 100644
--- a/dlls/msvcrt/msvcrt.spec
+++ b/dlls/msvcrt/msvcrt.spec
@@ -850,6 +850,7 @@
@ cdecl _searchenv_s(str str ptr long)
# stub _seh_longjmp_unwind4
@ stdcall -i386 _seh_longjmp_unwind(ptr)
+@ cdecl _set_abort_behavior(long long) MSVCRT__set_abort_behavior
@ cdecl _set_SSE2_enable(long) MSVCRT__set_SSE2_enable
# stub _set_controlfp
@ cdecl _set_doserrno(long)
--
1.5.6.5
--------------070306030709020403040301--
More information about the wine-patches
mailing list