summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--osdep/windows_utils.c24
-rw-r--r--osdep/windows_utils.h2
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