2026-01-06 09:48:38 +08:00
|
|
|
#include "common/debug.h"
|
2026-04-05 19:32:33 +08:00
|
|
|
#include "common/windows/nt.h"
|
2025-03-16 10:38:04 +08:00
|
|
|
|
|
|
|
|
#include <windows.h>
|
|
|
|
|
|
2026-03-29 09:28:49 +08:00
|
|
|
const char* ffDebugWin32Error(DWORD errorCode) {
|
2026-04-05 19:32:33 +08:00
|
|
|
static char buffer[512];
|
2025-03-16 10:38:04 +08:00
|
|
|
|
2026-04-05 19:32:33 +08:00
|
|
|
wchar_t bufferW[256];
|
|
|
|
|
ULONG len = FormatMessageW(
|
2025-03-16 10:38:04 +08:00
|
|
|
FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
|
|
|
|
|
NULL,
|
|
|
|
|
(DWORD) errorCode,
|
2026-03-26 22:53:28 +08:00
|
|
|
0,
|
2026-04-05 19:32:33 +08:00
|
|
|
bufferW,
|
2026-04-21 18:14:57 +08:00
|
|
|
ARRAY_SIZE(bufferW),
|
2025-03-16 10:38:04 +08:00
|
|
|
NULL);
|
|
|
|
|
|
|
|
|
|
if (len == 0) {
|
|
|
|
|
snprintf(buffer, sizeof(buffer), "Unknown error code (%lu)", errorCode);
|
|
|
|
|
} else {
|
|
|
|
|
// Remove trailing newline
|
2026-04-05 19:32:33 +08:00
|
|
|
while (len > 0 && (bufferW[len - 1] == '\r' || bufferW[len - 1] == '\n')) {
|
|
|
|
|
--len;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (NT_SUCCESS(RtlUnicodeToUTF8N(buffer, sizeof(buffer), &len, bufferW, len * sizeof(wchar_t)))) {
|
|
|
|
|
snprintf(buffer + len, sizeof(buffer) - len, " (%lu)", errorCode);
|
|
|
|
|
} else {
|
|
|
|
|
snprintf(buffer, sizeof(buffer), "Unknown error (%lu)", errorCode);
|
2026-03-26 23:31:59 +08:00
|
|
|
}
|
2025-03-16 10:38:04 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return buffer;
|
|
|
|
|
}
|
2026-03-14 22:55:16 +08:00
|
|
|
|
2026-03-29 09:28:49 +08:00
|
|
|
const char* ffDebugNtStatus(NTSTATUS status) {
|
2026-03-14 22:55:16 +08:00
|
|
|
return ffDebugWin32Error(RtlNtStatusToDosError(status));
|
|
|
|
|
}
|
2026-03-27 20:14:47 +08:00
|
|
|
|
2026-03-29 09:28:49 +08:00
|
|
|
static inline DWORD HRESULTToWin32Error(HRESULT hr) {
|
|
|
|
|
if (SUCCEEDED(hr)) {
|
2026-03-27 20:14:47 +08:00
|
|
|
return ERROR_SUCCESS;
|
2026-03-29 09:28:49 +08:00
|
|
|
}
|
2026-03-27 20:14:47 +08:00
|
|
|
|
2026-03-29 09:28:49 +08:00
|
|
|
if (HRESULT_FACILITY(hr) == FACILITY_WIN32) {
|
2026-03-27 20:14:47 +08:00
|
|
|
return HRESULT_CODE(hr);
|
2026-03-29 09:28:49 +08:00
|
|
|
}
|
2026-03-27 20:14:47 +08:00
|
|
|
|
|
|
|
|
return ERROR_INTERNAL_ERROR;
|
|
|
|
|
}
|
|
|
|
|
|
2026-03-29 09:28:49 +08:00
|
|
|
const char* ffDebugHResult(HRESULT hr) {
|
2026-03-27 20:14:47 +08:00
|
|
|
return ffDebugWin32Error(HRESULTToWin32Error(hr));
|
|
|
|
|
}
|