[PATCHv2 2/2] kernel32: Handle win32 hresult in FormatMessage.
Catalin Patulea
catalinp at google.com
Mon Oct 20 16:55:46 CDT 2014
Signed-off-by: Catalin Patulea <catalinp at google.com>
---
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. */
--
2.1.0.rc2.206.gedb03e5
More information about the wine-patches
mailing list