Piotr Caban : msvcrt: Added _set_purecall_handler implementation.

Alexandre Julliard julliard at winehq.org
Wed Aug 25 12:35:06 CDT 2010


Module: wine
Branch: master
Commit: 898e17f2af8e447981ee041b446a2e854522e806
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=898e17f2af8e447981ee041b446a2e854522e806

Author: Piotr Caban <piotr at codeweavers.com>
Date:   Wed Aug 25 14:46:47 2010 +0200

msvcrt: Added _set_purecall_handler implementation.

---

 dlls/msvcr100/msvcr100.spec |    2 +-
 dlls/msvcr71/msvcr71.spec   |    2 +-
 dlls/msvcr80/msvcr80.spec   |    2 +-
 dlls/msvcr90/msvcr90.spec   |    2 +-
 dlls/msvcrt/exit.c          |   13 +++++++++++++
 dlls/msvcrt/msvcrt.h        |    1 +
 dlls/msvcrt/msvcrt.spec     |    1 +
 7 files changed, 19 insertions(+), 4 deletions(-)

diff --git a/dlls/msvcr100/msvcr100.spec b/dlls/msvcr100/msvcr100.spec
index 1cd1ada..771b2e0 100644
--- a/dlls/msvcr100/msvcr100.spec
+++ b/dlls/msvcr100/msvcr100.spec
@@ -1078,7 +1078,7 @@
 @ stub _set_malloc_crt_max_wait
 @ stub _set_output_format
 @ stub _set_printf_count_output
-@ stub _set_purecall_handler
+@ cdecl _set_purecall_handler(ptr) msvcrt._set_purecall_handler
 @ cdecl _seterrormode(long) msvcrt._seterrormode
 @ cdecl -arch=i386,x86_64 -norelay _setjmp(ptr) msvcrt._setjmp
 @ cdecl -arch=i386 -norelay _setjmp3(ptr long) msvcrt._setjmp3
diff --git a/dlls/msvcr71/msvcr71.spec b/dlls/msvcr71/msvcr71.spec
index d3da10e..2483d6b 100644
--- a/dlls/msvcr71/msvcr71.spec
+++ b/dlls/msvcr71/msvcr71.spec
@@ -510,7 +510,7 @@
 @ stdcall -i386 _seh_longjmp_unwind(ptr) msvcrt._seh_longjmp_unwind
 @ cdecl _set_SSE2_enable(long) msvcrt._set_SSE2_enable
 @ cdecl _set_error_mode(long) msvcrt._set_error_mode
-@ stub _set_purecall_handler
+@ cdecl _set_purecall_handler(ptr) msvcrt._set_purecall_handler
 @ cdecl _set_sbh_threshold(long) msvcrt._set_sbh_threshold
 @ stub _set_security_error_handler
 @ cdecl _seterrormode(long) msvcrt._seterrormode
diff --git a/dlls/msvcr80/msvcr80.spec b/dlls/msvcr80/msvcr80.spec
index 93c8047..02ba355 100644
--- a/dlls/msvcr80/msvcr80.spec
+++ b/dlls/msvcr80/msvcr80.spec
@@ -931,7 +931,7 @@
 @ stub _set_malloc_crt_max_wait
 @ stub _set_output_format
 @ stub _set_printf_count_output
-@ stub _set_purecall_handler
+@ cdecl _set_purecall_handler(ptr) msvcrt._set_purecall_handler
 @ cdecl _set_sbh_threshold(long) msvcrt._set_sbh_threshold
 @ cdecl _seterrormode(long) msvcrt._seterrormode
 @ cdecl -i386 -norelay _setjmp(ptr) msvcrt._setjmp
diff --git a/dlls/msvcr90/msvcr90.spec b/dlls/msvcr90/msvcr90.spec
index 5e32e32..a5c50b1 100644
--- a/dlls/msvcr90/msvcr90.spec
+++ b/dlls/msvcr90/msvcr90.spec
@@ -917,7 +917,7 @@
 @ stub _set_malloc_crt_max_wait
 @ stub _set_output_format
 @ stub _set_printf_count_output
-@ stub _set_purecall_handler
+@ cdecl _set_purecall_handler(ptr) msvcrt._set_purecall_handler
 @ cdecl _set_sbh_threshold(long) msvcrt._set_sbh_threshold
 @ cdecl _seterrormode(long) msvcrt._seterrormode
 @ cdecl -i386 -norelay _setjmp(ptr) msvcrt._setjmp
diff --git a/dlls/msvcrt/exit.c b/dlls/msvcrt/exit.c
index 27bb0d3..80749fc 100644
--- a/dlls/msvcrt/exit.c
+++ b/dlls/msvcrt/exit.c
@@ -32,6 +32,7 @@ WINE_DEFAULT_DEBUG_CHANNEL(msvcrt);
 static MSVCRT__onexit_t *MSVCRT_atexit_table = NULL;
 static int MSVCRT_atexit_table_size = 0;
 static int MSVCRT_atexit_registered = 0; /* Points to free slot */
+static MSVCRT_purecall_handler purecall_handler = NULL;
 
 static const char szMsgBoxTitle[] = "Wine C++ Runtime Library";
 
@@ -251,6 +252,15 @@ int CDECL MSVCRT_atexit(void (*func)(void))
   return MSVCRT__onexit((MSVCRT__onexit_t)func) == (MSVCRT__onexit_t)func ? 0 : -1;
 }
 
+/* _set_purecall_handler - not exported in native msvcrt */
+MSVCRT_purecall_handler CDECL _set_purecall_handler(MSVCRT_purecall_handler function)
+{
+    MSVCRT_purecall_handler ret = purecall_handler;
+
+    TRACE("(%p)\n", function);
+    purecall_handler = function;
+    return ret;
+}
 
 /*********************************************************************
  *		_purecall (MSVCRT.@)
@@ -258,5 +268,8 @@ int CDECL MSVCRT_atexit(void (*func)(void))
 void CDECL _purecall(void)
 {
   TRACE("(void)\n");
+
+  if(purecall_handler)
+      purecall_handler();
   _amsg_exit( 25 );
 }
diff --git a/dlls/msvcrt/msvcrt.h b/dlls/msvcrt/msvcrt.h
index f68790b..363223d 100644
--- a/dlls/msvcrt/msvcrt.h
+++ b/dlls/msvcrt/msvcrt.h
@@ -79,6 +79,7 @@ typedef void (*__cdecl MSVCRT__beginthread_start_routine_t)(void *);
 typedef unsigned int (__stdcall *MSVCRT__beginthreadex_start_routine_t)(void *);
 typedef int (*__cdecl MSVCRT__onexit_t)(void);
 typedef void (__cdecl *MSVCRT_invalid_parameter_handler)(const MSVCRT_wchar_t*, const MSVCRT_wchar_t*, const MSVCRT_wchar_t*, unsigned, MSVCRT_uintptr_t);
+typedef void (__cdecl *MSVCRT_purecall_handler)(void);
 
 typedef struct {long double x;} MSVCRT__LDOUBLE;
 
diff --git a/dlls/msvcrt/msvcrt.spec b/dlls/msvcrt/msvcrt.spec
index 31da01e..254f967 100644
--- a/dlls/msvcrt/msvcrt.spec
+++ b/dlls/msvcrt/msvcrt.spec
@@ -1475,3 +1475,4 @@
 @ cdecl _configthreadlocale(long)
 @ cdecl _wcstod_l(wstr ptr) MSVCRT__wcstod_l
 @ cdecl ___mb_cur_max_l_func(ptr)
+@ cdecl _set_purecall_handler(ptr)




More information about the wine-cvs mailing list