Piotr Caban : msvcr90: Don't forward new and delete to msvcrt.
Module: wine Branch: master Commit: 1d02768f9453f0ef7010488a68828b873bfc2fab URL: http://source.winehq.org/git/wine.git/?a=commit;h=1d02768f9453f0ef7010488a68... Author: Piotr Caban <piotr(a)codeweavers.com> Date: Wed Mar 27 16:14:47 2013 +0100 msvcr90: Don't forward new and delete to msvcrt. --- dlls/msvcr90/msvcr90.c | 40 ++++++++++++++++++++++++++++++++++++++++ dlls/msvcr90/msvcr90.spec | 12 ++++++------ 2 files changed, 46 insertions(+), 6 deletions(-) diff --git a/dlls/msvcr90/msvcr90.c b/dlls/msvcr90/msvcr90.c index de6d86e..9b3d8c7 100644 --- a/dlls/msvcr90/msvcr90.c +++ b/dlls/msvcr90/msvcr90.c @@ -24,6 +24,25 @@ #include "windef.h" #include "winbase.h" +static void* (__cdecl *MSVCRT_operator_new)(size_t); +static void (__cdecl *MSVCRT_operator_delete)(void*); + +static void init_cxx_funcs(void) +{ + HMODULE hmod = GetModuleHandleA("msvcrt.dll"); + + if (sizeof(void *) > sizeof(int)) /* 64-bit has different names */ + { + MSVCRT_operator_new = (void*)GetProcAddress(hmod, "??2(a)YAPEAX_K@Z"); + MSVCRT_operator_delete = (void*)GetProcAddress(hmod, "??3(a)YAXPEAX@Z"); + } + else + { + MSVCRT_operator_new = (void*)GetProcAddress(hmod, "??2(a)YAPAXI@Z"); + MSVCRT_operator_delete = (void*)GetProcAddress(hmod, "??3(a)YAXPAX@Z"); + } +} + /********************************************************************* * DllMain (MSVCR90.@) */ @@ -33,6 +52,7 @@ BOOL WINAPI DllMain(HINSTANCE hdll, DWORD reason, LPVOID reserved) { case DLL_PROCESS_ATTACH: DisableThreadLibraryCalls(hdll); + init_cxx_funcs(); _set_printf_count_output(0); } return TRUE; @@ -59,3 +79,23 @@ void * CDECL MSVCR90_encode_pointer(void * ptr) { return EncodePointer(ptr); } + +/********************************************************************* + * ??2(a)YAPAXI@Z (MSVCR90.@) + * + * Naver LINE expects that this function is implemented inside msvcr90 + */ +void* CDECL MSVCR90_operator_new(size_t size) +{ + return MSVCRT_operator_new(size); +} + +/********************************************************************* + * ??3(a)YAXPAX@Z (MSVCR90.@) + * + * Naver LINE expects that this function is implemented inside msvcr90 + */ +void CDECL MSVCR90_operator_delete(void *ptr) +{ + return MSVCRT_operator_delete(ptr); +} diff --git a/dlls/msvcr90/msvcr90.spec b/dlls/msvcr90/msvcr90.spec index 0aa1ed4..c555c6e 100644 --- a/dlls/msvcr90/msvcr90.spec +++ b/dlls/msvcr90/msvcr90.spec @@ -30,12 +30,12 @@ @ cdecl -arch=win64 ??1exception(a)std@@UEAA(a)XZ(ptr) msvcrt.??1exception@@UEAA(a)XZ @ thiscall -arch=i386 ??1type_info@@UAE(a)XZ(ptr) msvcrt.??1type_info@@UAE(a)XZ @ cdecl -arch=win64 ??1type_info@@UEAA(a)XZ(ptr) msvcrt.??1type_info@@UEAA(a)XZ -@ cdecl -arch=win32 ??2(a)YAPAXI@Z(long) msvcrt.??2(a)YAPAXI@Z -@ cdecl -arch=win64 ??2(a)YAPEAX_K@Z(long) msvcrt.??2(a)YAPEAX_K@Z +@ cdecl -arch=win32 ??2(a)YAPAXI@Z(long) MSVCR90_operator_new +@ cdecl -arch=win64 ??2(a)YAPEAX_K@Z(long) MSVCR90_operator_new @ cdecl -arch=win32 ??2(a)YAPAXIHPBDH@Z(long long str long) msvcrt.??2(a)YAPAXIHPBDH@Z @ cdecl -arch=win64 ??2(a)YAPEAX_KHPEBDH@Z(long long str long) msvcrt.??2(a)YAPEAX_KHPEBDH@Z -@ cdecl -arch=win32 ??3(a)YAXPAX@Z(ptr) msvcrt.??3(a)YAXPAX@Z -@ cdecl -arch=win64 ??3(a)YAXPEAX@Z(ptr) msvcrt.??3(a)YAXPEAX@Z +@ cdecl -arch=win32 ??3(a)YAXPAX@Z(ptr) MSVCR90_operator_delete +@ cdecl -arch=win64 ??3(a)YAXPEAX@Z(ptr) MSVCR90_operator_delete @ thiscall -arch=i386 ??4__non_rtti_object(a)std@@QAEAAV01(a)ABV01@@Z(ptr ptr) msvcrt.??4__non_rtti_object@@QAEAAV0(a)ABV0@@Z @ cdecl -arch=win64 ??4__non_rtti_object(a)std@@QEAAAEAV01(a)AEBV01@@Z(ptr ptr) msvcrt.??4__non_rtti_object@@QEAAAEAV0(a)AEBV0@@Z @ thiscall -arch=i386 ??4bad_cast(a)std@@QAEAAV01(a)ABV01@@Z(ptr ptr) msvcrt.??4bad_cast@@QAEAAV0(a)ABV0@@Z @@ -61,8 +61,8 @@ @ cdecl -arch=win64 ??_U(a)YAPEAX_K@Z(long) msvcrt.??_U(a)YAPEAX_K@Z @ cdecl -arch=win32 ??_U(a)YAPAXIHPBDH@Z(long long str long) msvcrt.??_U(a)YAPAXIHPBDH@Z @ cdecl -arch=win64 ??_U(a)YAPEAX_KHPEBDH@Z(long long str long) msvcrt.??_U(a)YAPEAX_KHPEBDH@Z -@ cdecl -arch=win32 ??_V(a)YAXPAX@Z(ptr) msvcrt.??_V(a)YAXPAX@Z -@ cdecl -arch=win64 ??_V(a)YAXPEAX@Z(ptr) msvcrt.??_V(a)YAXPEAX@Z +@ cdecl -arch=win32 ??_V(a)YAXPAX@Z(ptr) MSVCR90_operator_delete +@ cdecl -arch=win64 ??_V(a)YAXPEAX@Z(ptr) MSVCR90_operator_delete @ stub -arch=win32 ?_Name_base(a)type_info@@CAPBDPBV1(a)PAU__type_info_node@@@Z # private: static char const * __cdecl type_info::_Name_base(class type_info const *,struct __type_info_node *) @ stub -arch=win64 ?_Name_base(a)type_info@@CAPEBDPEBV1(a)PEAU__type_info_node@@@Z # private: static char const * __ptr64 __cdecl type_info::_Name_base(class type_info const * __ptr64,struct __type_info_node * __ptr64) @ stub -arch=win32 ?_Name_base_internal(a)type_info@@CAPBDPBV1(a)PAU__type_info_node@@@Z # private: static char const * __cdecl type_info::_Name_base_internal(class type_info const *,struct __type_info_node *)
participants (1)
-
Alexandre Julliard