Catalin Patulea : kernel32: Handle win32 hresult in FormatMessage.

Alexandre Julliard julliard at wine.codeweavers.com
Tue Oct 21 09:49:44 CDT 2014


Module: wine
Branch: master
Commit: a5005ed84a8b891b39731de3215e2eda8a1deb0a
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=a5005ed84a8b891b39731de3215e2eda8a1deb0a

Author: Catalin Patulea <catalinp at google.com>
Date:   Mon Oct 20 17:55:46 2014 -0400

kernel32: Handle win32 hresult in FormatMessage.

---

 dlls/kernel32/format_msg.c       | 28 ++++++++++++++++++++--------
 dlls/kernel32/tests/format_msg.c |  1 -
 2 files changed, 20 insertions(+), 9 deletions(-)

diff --git a/dlls/kernel32/format_msg.c b/dlls/kernel32/format_msg.c
index aee7d7a..cdbc944 100644
--- a/dlls/kernel32/format_msg.c
+++ b/dlls/kernel32/format_msg.c
@@ -104,6 +104,24 @@ static LPWSTR load_message( HMODULE module, UINT id, WORD lang )
     return buffer;
 }
 
+static LPWSTR search_message( DWORD flags, HMODULE module, UINT id, WORD lang )
+{
+    LPWSTR from = NULL;
+    if (flags & FORMAT_MESSAGE_FROM_HMODULE)
+        from = load_message( module, id, lang );
+    if (!from && (flags & FORMAT_MESSAGE_FROM_SYSTEM))
+    {
+        /* Fold win32 hresult to its embedded error code. */
+        if (HRESULT_SEVERITY(id) == SEVERITY_ERROR &&
+            HRESULT_FACILITY(id) == FACILITY_WIN32)
+        {
+            id = HRESULT_CODE(id);
+        }
+        from = load_message( kernel32_handle, id, lang );
+    }
+    return from;
+}
+
 /**********************************************************************
  *	get_arg    (internal)
  */
@@ -492,10 +510,7 @@ DWORD WINAPI FormatMessageA(
     }
     else if (dwFlags & (FORMAT_MESSAGE_FROM_HMODULE | FORMAT_MESSAGE_FROM_SYSTEM))
     {
-        if (dwFlags & FORMAT_MESSAGE_FROM_HMODULE)
-            from = load_message( (HMODULE)lpSource, dwMessageId, dwLanguageId );
-        if (!from && (dwFlags & FORMAT_MESSAGE_FROM_SYSTEM))
-            from = load_message( kernel32_handle, dwMessageId, dwLanguageId );
+        from = search_message( dwFlags, (HMODULE)lpSource, dwMessageId, dwLanguageId );
         if (!from) return 0;
     }
     else
@@ -592,10 +607,7 @@ DWORD WINAPI FormatMessageW(
     }
     else if (dwFlags & (FORMAT_MESSAGE_FROM_HMODULE | FORMAT_MESSAGE_FROM_SYSTEM))
     {
-        if (dwFlags & FORMAT_MESSAGE_FROM_HMODULE)
-            from = load_message( (HMODULE)lpSource, dwMessageId, dwLanguageId );
-        if (!from && (dwFlags & FORMAT_MESSAGE_FROM_SYSTEM))
-            from = load_message( kernel32_handle, dwMessageId, dwLanguageId );
+        from = search_message( dwFlags, (HMODULE)lpSource, dwMessageId, dwLanguageId );
         if (!from) return 0;
     }
     else
diff --git a/dlls/kernel32/tests/format_msg.c b/dlls/kernel32/tests/format_msg.c
index 3e8d96d..4a1ae7d 100644
--- a/dlls/kernel32/tests/format_msg.c
+++ b/dlls/kernel32/tests/format_msg.c
@@ -1555,7 +1555,6 @@ static void test_message_from_hmodule(void)
     /* Test HRESULT. It's not documented but in practice _com_error::ErrorMessage relies on this. */
     ret = FormatMessageA(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_FROM_HMODULE, h, 0x80070005 /* E_ACCESSDENIED */,
                          MAKELANGID(LANG_NEUTRAL, SUBLANG_NEUTRAL), out, sizeof(out)/sizeof(CHAR), NULL);
-    todo_wine
     ok(ret != 0, "FormatMessageA returned 0\n");
 
     /* Test a message string with an insertion without passing any variadic arguments. */




More information about the wine-cvs mailing list