diff options
-rw-r--r-- | osdep/windows_utils.c | 24 | ||||
-rw-r--r-- | osdep/windows_utils.h | 2 |
2 files changed, 23 insertions, 3 deletions
diff --git a/osdep/windows_utils.c b/osdep/windows_utils.c index 21ff40a89d..a1ea32191a 100644 --- a/osdep/windows_utils.c +++ b/osdep/windows_utils.c @@ -124,9 +124,29 @@ static char *hresult_to_str(const HRESULT hr) #undef E } +static char *fmtmsg_buf(char *buf, size_t buf_size, DWORD errorID) +{ + DWORD n = FormatMessageA(FORMAT_MESSAGE_FROM_SYSTEM | + FORMAT_MESSAGE_IGNORE_INSERTS, + NULL, errorID, 0, buf, buf_size, NULL); + if (!n && GetLastError() == ERROR_MORE_DATA) { + snprintf(buf, buf_size, + "<Insufficient buffer size (%zd) for error message>", + buf_size); + } else { + if (n > 0 && buf[n-1] == '\n') + buf[n-1] = '\0'; + if (n > 1 && buf[n-2] == '\r') + buf[n-2] = '\0'; + } + return buf; +} +#define fmtmsg(hr) fmtmsg_buf((char[243]){0}, 243, (hr)) + char *mp_HRESULT_to_str_buf(char *buf, size_t buf_size, HRESULT hr) { - snprintf(buf, buf_size, "%s (0x%"PRIx32")", - hresult_to_str(hr), (uint32_t) hr); + char* msg = fmtmsg(hr); + msg = msg[0] ? msg : hresult_to_str(hr); + snprintf(buf, buf_size, "%s (0x%"PRIx32")", msg, (uint32_t)hr); return buf; } diff --git a/osdep/windows_utils.h b/osdep/windows_utils.h index 851eb1b4e3..6c750ded2a 100644 --- a/osdep/windows_utils.h +++ b/osdep/windows_utils.h @@ -23,7 +23,7 @@ char *mp_GUID_to_str_buf(char *buf, size_t buf_size, const GUID *guid); #define mp_GUID_to_str(guid) mp_GUID_to_str_buf((char[40]){0}, 40, (guid)) char *mp_HRESULT_to_str_buf(char *buf, size_t buf_size, HRESULT hr); -#define mp_HRESULT_to_str(hr) mp_HRESULT_to_str_buf((char[60]){0}, 60, (hr)) +#define mp_HRESULT_to_str(hr) mp_HRESULT_to_str_buf((char[256]){0}, 256, (hr)) #define mp_LastError_to_str() mp_HRESULT_to_str(HRESULT_FROM_WIN32(GetLastError())) #endif |