Piotr Caban : msvcp140: Added _Winerror_message implementation.

Alexandre Julliard julliard at winehq.org
Sun Mar 3 13:21:28 CST 2019


Module: wine
Branch: oldstable
Commit: 63205ec85e983cfbbbbb818f0a7dead22e338dea
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=63205ec85e983cfbbbbb818f0a7dead22e338dea

Author: Piotr Caban <piotr at codeweavers.com>
Date:   Wed Oct  3 18:49:43 2018 +0200

msvcp140: Added _Winerror_message implementation.

Signed-off-by: Piotr Caban <piotr at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
(cherry picked from commit c69eba9278597935a3a3eb75071a40e7a63fd7aa)
Signed-off-by: Michael Stefaniuc <mstefani at winehq.org>

---

 dlls/msvcp140/msvcp140.spec    |  4 ++--
 dlls/msvcp140/tests/msvcp140.c | 23 +++++++++++++++++++++++
 dlls/msvcp90/misc.c            | 12 ++++++++++++
 3 files changed, 37 insertions(+), 2 deletions(-)

diff --git a/dlls/msvcp140/msvcp140.spec b/dlls/msvcp140/msvcp140.spec
index 473f466..66c23e6 100644
--- a/dlls/msvcp140/msvcp140.spec
+++ b/dlls/msvcp140/msvcp140.spec
@@ -1670,8 +1670,8 @@
 @ stub -arch=i386 ?_W_Gettnames at _Locinfo@std@@QBE?AV_Timevec at 2@XZ
 @ stub -arch=win64 ?_W_Gettnames at _Locinfo@std@@QEBA?AV_Timevec at 2@XZ
 @ stub ?_Winerror_map at std@@YAHH at Z
-@ stub -arch=win32 ?_Winerror_message at std@@YAKKPADK at Z
-@ stub -arch=win64 ?_Winerror_message at std@@YAKKPEADK at Z
+@ cdecl -arch=win32 ?_Winerror_message at std@@YAKKPADK at Z(long ptr long) _Winerror_message
+@ cdecl -arch=win64 ?_Winerror_message at std@@YAKKPEADK at Z(long ptr long) _Winerror_message
 @ stub ?_XGetLastError at std@@YAXXZ
 @ stub ?_XLgamma at std@@YAMM at Z
 @ stub ?_XLgamma at std@@YANN at Z
diff --git a/dlls/msvcp140/tests/msvcp140.c b/dlls/msvcp140/tests/msvcp140.c
index dcaa6d2..606fb83 100644
--- a/dlls/msvcp140/tests/msvcp140.c
+++ b/dlls/msvcp140/tests/msvcp140.c
@@ -191,6 +191,7 @@ static WCHAR* (__cdecl *p_Temp_get)(WCHAR *);
 static int (__cdecl *p_To_byte)(const WCHAR *src, char *dst);
 static int (__cdecl *p_To_wide)(const char *src, WCHAR *dst);
 static int (__cdecl *p_Unlink)(WCHAR const*);
+static ULONG (__cdecl *p__Winerror_message)(ULONG, char*, ULONG);
 
 static BOOLEAN (WINAPI *pCreateSymbolicLinkW)(const WCHAR *, const WCHAR *, DWORD);
 
@@ -227,6 +228,7 @@ static BOOL init(void)
         SET(p__Schedule_chore, "?_Schedule_chore at details@Concurrency@@YAHPEAU_Threadpool_chore at 12@@Z");
         SET(p__Reschedule_chore, "?_Reschedule_chore at details@Concurrency@@YAHPEBU_Threadpool_chore at 12@@Z");
         SET(p__Release_chore, "?_Release_chore at details@Concurrency@@YAXPEAU_Threadpool_chore at 12@@Z");
+        SET(p__Winerror_message, "?_Winerror_message at std@@YAKKPEADK at Z");
     } else {
 #ifdef __arm__
         SET(p_task_continuation_context_ctor, "??0task_continuation_context at Concurrency@@AAA at XZ");
@@ -256,6 +258,7 @@ static BOOL init(void)
         SET(p__Schedule_chore, "?_Schedule_chore at details@Concurrency@@YAHPAU_Threadpool_chore at 12@@Z");
         SET(p__Reschedule_chore, "?_Reschedule_chore at details@Concurrency@@YAHPBU_Threadpool_chore at 12@@Z");
         SET(p__Release_chore, "?_Release_chore at details@Concurrency@@YAXPAU_Threadpool_chore at 12@@Z");
+        SET(p__Winerror_message, "?_Winerror_message at std@@YAKKPADK at Z");
     }
 
     SET(p_Close_dir, "_Close_dir");
@@ -1282,6 +1285,25 @@ static void test_Last_write_time(void)
     ok(SetCurrentDirectoryW(origin_path), "SetCurrentDirectoryW to origin_path failed\n");
 }
 
+static void test__Winerror_message(void)
+{
+    char buf[256], buf_fm[256];
+    ULONG ret, ret_fm;
+
+    ret_fm = FormatMessageA(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
+            NULL, 0, 0, buf_fm, sizeof(buf_fm), NULL);
+
+    memset(buf, 'a', sizeof(buf));
+    ret = p__Winerror_message(0, buf, sizeof(buf));
+    ok(ret == ret_fm, "ret = %u, expected %u\n", ret, ret_fm);
+    ok(!strcmp(buf, buf_fm), "buf = %s, expected %s\n", buf, buf_fm);
+
+    memset(buf, 'a', sizeof(buf));
+    ret = p__Winerror_message(0, buf, 2);
+    ok(!ret, "ret = %u\n", ret);
+    ok(buf[0] == 'a', "buf = %s\n", buf);
+}
+
 START_TEST(msvcp140)
 {
     if(!init()) return;
@@ -1303,5 +1325,6 @@ START_TEST(msvcp140)
     test_Temp_get();
     test_Rename();
     test_Last_write_time();
+    test__Winerror_message();
     FreeLibrary(msvcp);
 }
diff --git a/dlls/msvcp90/misc.c b/dlls/msvcp90/misc.c
index f510a4a..7a682b6 100644
--- a/dlls/msvcp90/misc.c
+++ b/dlls/msvcp90/misc.c
@@ -2133,3 +2133,15 @@ const char* __cdecl _Syserror_map(int err)
     return NULL;
 }
 #endif
+
+#if _MSVCP_VER >= 140
+/* ?_Winerror_message at std@@YAKKPADK at Z */
+/* ?_Winerror_message at std@@YAKKPEADK at Z */
+ULONG __cdecl _Winerror_message(ULONG err, char *buf, ULONG size)
+{
+    TRACE("(%u %p %u)\n", err, buf, size);
+
+    return FormatMessageA(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
+            NULL, err, 0, buf, size, NULL);
+}
+#endif




More information about the wine-cvs mailing list