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