【实用工具】Win32API错误码含义查询工具——Microsoft Error Lookup Tool

Win32 编程调试过程中,常常有分析 API 调用失败时返回码的需求。

我们经常使用 GetLastError() 函数获取最近一次的错误码,该函数返回的是一个 DWORD 值。

本文提到的工具/资源即可方便地将 Error_Code 转换为详细的错误描述信息。

正文

工具下载

可访问此链接进行下载:Microsoft 错误查找工具 或者 Microsoft Error Lookup Tool

备用下载: Err_6.4.5.7z

使用方式

下载后,得到一个文件名为 Err_6.4.5.exe 的程序。

该程序需要通过终端运行,否则一闪而过看不到输出结果。

使用格式为:

1
Err_6.4.5.exe <error code>

示例一:

1
2
3
4
5
6
7
8
9
10
11
12
C:\Tools>Err_6.4.5.exe c000021a
# for hex 0xc000021a / decimal -1073741286
STATUS_SYSTEM_PROCESS_TERMINATED ntstatus.h
# {Fatal System Error}​
# The %hs system process terminated unexpectedly with a
# status of 0x%08x (0x%08x 0x%08x).​
# The system has been shut down.​
# as an HRESULT: Severity: FAILURE (1), FACILITY_NULL (0x0), Code 0x21a
# for hex 0x21a / decimal 538​
ERROR_ABIOS_ERROR winerror.h
# An error occurred in the ABIOS subsystem.​
# 2 matches found for "c000021a"

示例二:

1
2
3
4
5
6
7
8
9
10
11
12
13
C:\Tools>Err_6.4.5.exe 7b
# for hex 0x7b / decimal 123
INACCESSIBLE_BOOT_DEVICE bugcodes.h
NMERR_SECURITY_BREACH_CAPTURE_DELETED  netmon.h
ERROR_INVALID_NAME winerror.h
# The filename, directory name, or volume label syntax is
# incorrect.​
# as an HRESULT: Severity: SUCCESS (0), FACILITY_NULL (0x0), Code 0x7b
# for hex 0x7b / decimal 123​
ERROR_INVALID_NAME winerror.h
# The filename, directory name, or volume label syntax is
# incorrect.​
# 4 matches found for "7b"

(以上示例均来自官方文档)

一些注意事项

值得注意的是,这个工具是“时效性”工具。

随着系统的更新,错误码的种类也在增加。

如果不及时更新工具,可能会出现查询不到错误码的情况。

附录

如果想直接在线查找错误代码,可以访问:Microsoft - 调试系统错误代码

当然,也可以使用 FormatMessage 将错误码自动进行格式化,从而输出。

这里放上一个示例代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
LPVOID lpMsgBuf;
FormatMessage(
FORMAT_MESSAGE_ALLOCATE_BUFFER |
FORMAT_MESSAGE_FROM_SYSTEM |
FORMATE_MESSAGE_IGNORE_INSERTS,
NULL,
GetLastError(),
MAKELANGID(LANG_NEUTRAL,SUBLANG_DEFAULT), //Default language
(LPTSTR) &lpMsgBuf,
0,
NULL
);

//Process any inserts in lpMsgBuf.
//......
//Display the string
MessageBox(NULL,(LPCTSTR)lpMsgBuf,"Error",MB_OK|MB_ICONINFORMATION);
// Free the buffer.
LocalFree(lpMsgBuf);