Piotr Caban : msvcp90: Added set_new_handler implementation.

Alexandre Julliard julliard at winehq.org
Tue Sep 13 12:18:09 CDT 2011


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

Author: Piotr Caban <piotr at codeweavers.com>
Date:   Tue Sep 13 10:30:29 2011 +0200

msvcp90: Added set_new_handler implementation.

---

 dlls/msvcp90/misc.c         |   28 ++++++++++++++++++++++++++++
 dlls/msvcp90/msvcp90.h      |    1 +
 dlls/msvcp90/msvcp90.spec   |    4 ++--
 dlls/msvcp90/msvcp90_main.c |    4 ++++
 4 files changed, 35 insertions(+), 2 deletions(-)

diff --git a/dlls/msvcp90/misc.c b/dlls/msvcp90/misc.c
index 3a3cb9f..bb3b52b 100644
--- a/dlls/msvcp90/misc.c
+++ b/dlls/msvcp90/misc.c
@@ -25,6 +25,8 @@
 
 #include "windef.h"
 #include "winbase.h"
+#include "wine/debug.h"
+WINE_DEFAULT_DEBUG_CHANNEL(msvcp90);
 
 /* ??0_Mutex at std@@QAE at XZ */
 /* ??0_Mutex at std@@QEAA at XZ */
@@ -191,3 +193,29 @@ unsigned short __cdecl wctype(const char *property)
 
     return 0;
 }
+
+typedef void (__cdecl *MSVCP_new_handler_func)(void);
+static MSVCP_new_handler_func MSVCP_new_handler;
+static int __cdecl new_handler_wrapper(MSVCP_size_t unused)
+{
+    MSVCP_new_handler();
+    return 1;
+}
+
+/* ?set_new_handler at std@@YAP6AXXZP6AXXZ at Z */
+MSVCP_new_handler_func __cdecl set_new_handler(MSVCP_new_handler_func new_handler)
+{
+    MSVCP_new_handler_func old_handler = MSVCP_new_handler;
+
+    TRACE("%p\n", new_handler);
+
+    MSVCP_new_handler = new_handler;
+    MSVCRT_set_new_handler(new_handler ? new_handler_wrapper : NULL);
+    return old_handler;
+}
+
+/* ?set_new_handler at std@@YAP6AXXZH at Z */
+MSVCP_new_handler_func __cdecl set_new_handler_reset(int unused)
+{
+    return set_new_handler(NULL);
+}
diff --git a/dlls/msvcp90/msvcp90.h b/dlls/msvcp90/msvcp90.h
index 7c331b5..0639a67 100644
--- a/dlls/msvcp90/msvcp90.h
+++ b/dlls/msvcp90/msvcp90.h
@@ -29,6 +29,7 @@ void __cdecl _invalid_parameter(const wchar_t*, const wchar_t*,
 
 extern void* (__cdecl *MSVCRT_operator_new)(MSVCP_size_t);
 extern void (__cdecl *MSVCRT_operator_delete)(void*);
+extern void* (__cdecl *MSVCRT_set_new_handler)(void*);
 
 /* Copied from dlls/msvcrt/cpp.c */
 #ifdef __i386__  /* thiscall functions are i386-specific */
diff --git a/dlls/msvcp90/msvcp90.spec b/dlls/msvcp90/msvcp90.spec
index d5baaf4..1522e80 100644
--- a/dlls/msvcp90/msvcp90.spec
+++ b/dlls/msvcp90/msvcp90.spec
@@ -5310,8 +5310,8 @@
 @ stub -arch=win64 ?seekpos@?$basic_stringbuf at _WU?$char_traits at _W@std@@V?$allocator at _W@2@@std@@MEAA?AV?$fpos at H@2 at V32@H at Z
 @ stub -arch=win32 ?seekpos at strstreambuf@std@@MAE?AV?$fpos at H@2 at V32@H at Z
 @ stub -arch=win64 ?seekpos at strstreambuf@std@@MEAA?AV?$fpos at H@2 at V32@H at Z
-@ stub ?set_new_handler at std@@YAP6AXXZH at Z
-@ stub ?set_new_handler at std@@YAP6AXXZP6AXXZ at Z
+@ cdecl ?set_new_handler at std@@YAP6AXXZH at Z(long) set_new_handler_reset
+@ cdecl ?set_new_handler at std@@YAP6AXXZP6AXXZ at Z(ptr) set_new_handler
 @ stub ?setbase at std@@YA?AU?$_Smanip at H@1 at H@Z
 @ stub -arch=win32 ?setbuf@?$basic_filebuf at DU?$char_traits at D@std@@@std@@MAEPAV?$basic_streambuf at DU?$char_traits at D@std@@@2 at PADH@Z
 @ stub -arch=win64 ?setbuf@?$basic_filebuf at DU?$char_traits at D@std@@@std@@MEAAPEAV?$basic_streambuf at DU?$char_traits at D@std@@@2 at PEAD_J@Z
diff --git a/dlls/msvcp90/msvcp90_main.c b/dlls/msvcp90/msvcp90_main.c
index f9c508a..35fabfc 100644
--- a/dlls/msvcp90/msvcp90_main.c
+++ b/dlls/msvcp90/msvcp90_main.c
@@ -30,6 +30,8 @@ WINE_DEFAULT_DEBUG_CHANNEL(msvcp90);
 
 void* (__cdecl *MSVCRT_operator_new)(MSVCP_size_t);
 void (__cdecl *MSVCRT_operator_delete)(void*);
+void* (__cdecl *MSVCRT_set_new_handler)(void*);
+
 static void init_cxx_funcs(void)
 {
     HMODULE hmod = GetModuleHandleA("msvcrt.dll");
@@ -38,11 +40,13 @@ static void init_cxx_funcs(void)
     {
         MSVCRT_operator_new = (void*)GetProcAddress(hmod, "??2 at YAPEAX_K@Z");
         MSVCRT_operator_delete = (void*)GetProcAddress(hmod, "??3 at YAXPEAX@Z");
+        MSVCRT_set_new_handler = (void*)GetProcAddress(hmod, "?_set_new_handler@@YAP6AH_K at ZP6AH0@Z at Z");
     }
     else
     {
         MSVCRT_operator_new = (void*)GetProcAddress(hmod, "??2 at YAPAXI@Z");
         MSVCRT_operator_delete = (void*)GetProcAddress(hmod, "??3 at YAXPAX@Z");
+        MSVCRT_set_new_handler = (void*)GetProcAddress(hmod, "?_set_new_handler@@YAP6AHI at ZP6AHI@Z at Z");
     }
 }
 




More information about the wine-cvs mailing list