名称和说明 © Microsoft Corporation,摘自 Windows SDK 的头文件以及以 CC BY 4.0 许可发布的 Microsoft Learn 文档。Microsoft 提供翻译的说明会以中文显示。Microsoft Learn 中的系统错误代码
常见错误
Windows Update、安装和文件
无法打开或意外关闭的程序
蓝屏(错误检查)
工作原理
Windows 用四个不同系列的编号报告错误。Win32 代码(如 5 或 1603)是 GetLastError 返回的值。HRESULT(如 0x80070005)用于 COM、Windows Update 和安装程序。NTSTATUS(如 0xC0000005)来自内核,在程序关闭时出现。错误检查代码(如 0xD1)是蓝屏的代码。该工具同时在这四个系列中搜索,并显示 Microsoft 在 Windows SDK 中发布的名称和文本。
许多 HRESULT 内部包含 Win32 代码或 NTSTATUS。当值带有 FACILITY_WIN32(如 0x80070005)时,该工具还会显示其中包含的 Win32 代码及其说明,而这段说明才真正解释了错误。此外,它还会拆分值的各个位:严重性、指明由哪个组件产生的 facility,以及该 facility 内的代码。
示例
0x80070005FACILITY_WIN32 (7) · 5 → ERROR_ACCESS_DENIED以 0x8007 开头的 HRESULT 在最后四位中包装了一个 Win32 代码:0x0005 即 5,表示访问被拒绝。-10737418190xC0000005 · STATUS_ACCESS_VIOLATION事件查看器和进程退出代码通常把该值显示为带符号的十进制数。它就是表示访问冲突的同一个 NTSTATUS。16030x80070643 · ERROR_INSTALL_FAILUREWindows Installer 在安装失败时以 1603 结束,而 Windows Update 把同一错误报告为 HRESULT 0x80070643。使用场景
- 在寻找解决办法之前,先弄清 Windows Update、Microsoft Store 或安装程序错误的含义。
- 把进程的退出代码或事件查看器中显示的值转换为常量名称。
- 根据停止代码识别蓝屏的错误检查代码。
- 在针对 Windows API 编程时,查找 ERROR_ACCESS_DENIED 或 E_INVALIDARG 等常量的值。
- 查看已被翻译的错误的英文原文,以便在论坛和文档中搜索。
常见问题
为什么同一个数字会显示为两个不同的错误?
每个系列各自为代码编号。0x7B 既是 Win32 错误 123(文件名不正确),也是蓝屏的错误检查代码 INACCESSIBLE_BOOT_DEVICE。具体是哪个要看上下文:如果来自蓝屏,就是错误检查代码;如果由程序或命令返回,就是 Win32。
如何把 Win32 代码转换为 HRESULT?
使用 HRESULT_FROM_WIN32 宏:取十六进制的代码,在前面加上 0x8007,这会把错误位置 1,并把 facility 设为 7(WIN32)。5 变成 0x80070005,1603(即 0x643)变成 0x80070643。要还原,取最后四位即可。
为什么会出现负数?
错误类的 HRESULT 和 NTSTATUS 最高位为 1,因此以带符号整数显示时是负数。-2147024891 就是 0x80070005,-1073741819 就是 0xC0000005。该工具两种形式都支持。
为什么有些说明是英文的?
已翻译的说明来自 Microsoft 在 Microsoft Learn 中为 Win32 代码发布的内容。HRESULT、NTSTATUS 以及 Learn 尚未翻译成中文的 Win32 代码的文本,会按 Windows SDK 中的原样以英文显示。
如果找不到代码怎么办?
程序可以定义自己的代码,尤其是 C 位为 1 或使用非 Windows facility 的代码,这些不会出现在 SDK 中。此时可以查看工具显示的 facility,了解是哪个组件产生了错误,然后在该产品的文档中查找此代码。