From: Catalin Patulea Subject: [PATCH 2/2] kernel32: Handle win32 hresult in FormatMessage. Message-Id: <1413824759-789-2-git-send-email-catalinp@google.com> Date: Mon, 20 Oct 2014 13:05:59 -0400 Signed-off-by: Catalin Patulea --- dlls/kernel32/format_msg.c | 26 ++++++++++++++++++-------- 1 file changed, 18 insertions(+), 8 deletions(-) diff --git a/dlls/kernel32/format_msg.c b/dlls/kernel32/format_msg.c index aee7d7a..f9a04f7 100644 --- a/dlls/kernel32/format_msg.c +++ b/dlls/kernel32/format_msg.c @@ -104,6 +104,22 @@ 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 +508,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 +605,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 -- 2.1.0.rc2.206.gedb03e5