Module: wine Branch: master Commit: a5005ed84a8b891b39731de3215e2eda8a1deb0a URL: http://source.winehq.org/git/wine.git/?a=commit;h=a5005ed84a8b891b39731de321...
Author: Catalin Patulea catalinp@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. */