Module: wine Branch: master Commit: 870d35c68860c4d9728b805e684fbb44540c0363 URL: http://source.winehq.org/git/wine.git/?a=commit;h=870d35c68860c4d9728b805e68... Author: Piotr Caban <piotr(a)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(a)std@@QAE(a)XZ */ /* ??0_Mutex(a)std@@QEAA(a)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(a)std@@YAP6AXXZP6AXXZ(a)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(a)std@@YAP6AXXZH(a)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(a)_WU?$char_traits(a)_W@std@@V?$allocator(a)_W@2@@std@@MEAA?AV?$fpos(a)H@2(a)V32@H(a)Z @ stub -arch=win32 ?seekpos(a)strstreambuf@std@@MAE?AV?$fpos(a)H@2(a)V32@H(a)Z @ stub -arch=win64 ?seekpos(a)strstreambuf@std@@MEAA?AV?$fpos(a)H@2(a)V32@H(a)Z -@ stub ?set_new_handler(a)std@@YAP6AXXZH(a)Z -@ stub ?set_new_handler(a)std@@YAP6AXXZP6AXXZ(a)Z +@ cdecl ?set_new_handler(a)std@@YAP6AXXZH(a)Z(long) set_new_handler_reset +@ cdecl ?set_new_handler(a)std@@YAP6AXXZP6AXXZ(a)Z(ptr) set_new_handler @ stub ?setbase(a)std@@YA?AU?$_Smanip(a)H@1(a)H@Z @ stub -arch=win32 ?setbuf@?$basic_filebuf(a)DU?$char_traits(a)D@std@@@std@@MAEPAV?$basic_streambuf(a)DU?$char_traits(a)D@std@@@2(a)PADH@Z @ stub -arch=win64 ?setbuf@?$basic_filebuf(a)DU?$char_traits(a)D@std@@@std@@MEAAPEAV?$basic_streambuf(a)DU?$char_traits(a)D@std@@@2(a)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(a)YAPEAX_K@Z"); MSVCRT_operator_delete = (void*)GetProcAddress(hmod, "??3(a)YAXPEAX@Z"); + MSVCRT_set_new_handler = (void*)GetProcAddress(hmod, "?_set_new_handler@@YAP6AH_K(a)ZP6AH0@Z(a)Z"); } else { MSVCRT_operator_new = (void*)GetProcAddress(hmod, "??2(a)YAPAXI@Z"); MSVCRT_operator_delete = (void*)GetProcAddress(hmod, "??3(a)YAXPAX@Z"); + MSVCRT_set_new_handler = (void*)GetProcAddress(hmod, "?_set_new_handler@@YAP6AHI(a)ZP6AHI@Z(a)Z"); } }