Piotr Caban : msvcr90: Don't forward new and delete to msvcrt.
Alexandre Julliard
julliard at winehq.org
Wed Mar 27 15:40:07 CDT 2013
Module: wine
Branch: master
Commit: 1d02768f9453f0ef7010488a68828b873bfc2fab
URL: http://source.winehq.org/git/wine.git/?a=commit;h=1d02768f9453f0ef7010488a68828b873bfc2fab
Author: Piotr Caban <piotr at 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 at YAPEAX_K@Z");
+ MSVCRT_operator_delete = (void*)GetProcAddress(hmod, "??3 at YAXPEAX@Z");
+ }
+ else
+ {
+ MSVCRT_operator_new = (void*)GetProcAddress(hmod, "??2 at YAPAXI@Z");
+ MSVCRT_operator_delete = (void*)GetProcAddress(hmod, "??3 at 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 at 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 at 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 at std@@UEAA at XZ(ptr) msvcrt.??1exception@@UEAA at XZ
@ thiscall -arch=i386 ??1type_info@@UAE at XZ(ptr) msvcrt.??1type_info@@UAE at XZ
@ cdecl -arch=win64 ??1type_info@@UEAA at XZ(ptr) msvcrt.??1type_info@@UEAA at XZ
-@ cdecl -arch=win32 ??2 at YAPAXI@Z(long) msvcrt.??2 at YAPAXI@Z
-@ cdecl -arch=win64 ??2 at YAPEAX_K@Z(long) msvcrt.??2 at YAPEAX_K@Z
+@ cdecl -arch=win32 ??2 at YAPAXI@Z(long) MSVCR90_operator_new
+@ cdecl -arch=win64 ??2 at YAPEAX_K@Z(long) MSVCR90_operator_new
@ cdecl -arch=win32 ??2 at YAPAXIHPBDH@Z(long long str long) msvcrt.??2 at YAPAXIHPBDH@Z
@ cdecl -arch=win64 ??2 at YAPEAX_KHPEBDH@Z(long long str long) msvcrt.??2 at YAPEAX_KHPEBDH@Z
-@ cdecl -arch=win32 ??3 at YAXPAX@Z(ptr) msvcrt.??3 at YAXPAX@Z
-@ cdecl -arch=win64 ??3 at YAXPEAX@Z(ptr) msvcrt.??3 at YAXPEAX@Z
+@ cdecl -arch=win32 ??3 at YAXPAX@Z(ptr) MSVCR90_operator_delete
+@ cdecl -arch=win64 ??3 at YAXPEAX@Z(ptr) MSVCR90_operator_delete
@ thiscall -arch=i386 ??4__non_rtti_object at std@@QAEAAV01 at ABV01@@Z(ptr ptr) msvcrt.??4__non_rtti_object@@QAEAAV0 at ABV0@@Z
@ cdecl -arch=win64 ??4__non_rtti_object at std@@QEAAAEAV01 at AEBV01@@Z(ptr ptr) msvcrt.??4__non_rtti_object@@QEAAAEAV0 at AEBV0@@Z
@ thiscall -arch=i386 ??4bad_cast at std@@QAEAAV01 at ABV01@@Z(ptr ptr) msvcrt.??4bad_cast@@QAEAAV0 at ABV0@@Z
@@ -61,8 +61,8 @@
@ cdecl -arch=win64 ??_U at YAPEAX_K@Z(long) msvcrt.??_U at YAPEAX_K@Z
@ cdecl -arch=win32 ??_U at YAPAXIHPBDH@Z(long long str long) msvcrt.??_U at YAPAXIHPBDH@Z
@ cdecl -arch=win64 ??_U at YAPEAX_KHPEBDH@Z(long long str long) msvcrt.??_U at YAPEAX_KHPEBDH@Z
-@ cdecl -arch=win32 ??_V at YAXPAX@Z(ptr) msvcrt.??_V at YAXPAX@Z
-@ cdecl -arch=win64 ??_V at YAXPEAX@Z(ptr) msvcrt.??_V at YAXPEAX@Z
+@ cdecl -arch=win32 ??_V at YAXPAX@Z(ptr) MSVCR90_operator_delete
+@ cdecl -arch=win64 ??_V at YAXPEAX@Z(ptr) MSVCR90_operator_delete
@ stub -arch=win32 ?_Name_base at type_info@@CAPBDPBV1 at 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 at type_info@@CAPEBDPEBV1 at 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 at type_info@@CAPBDPBV1 at PAU__type_info_node@@@Z # private: static char const * __cdecl type_info::_Name_base_internal(class type_info const *,struct __type_info_node *)
More information about the wine-cvs
mailing list