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