3种错误类型

windows 中有常见的错误返回值,不同的格式类型是不同的,之间可以相互转换,今天介绍下下面3种的返回值的格式,另外提供给大家查找错误码的方法。

HRESULTs,Win32 error code,NTSTATUS

1、HRESULT

HRESULT编号空间具有以下内部结构

表格1

0

1

2

3

4

5

6

7

8

9

1
0

1

2

3

4

5

6

7

8

9

2
0

1

2

3

4

5

6

7

8

9

3
0

1

S

R

C

N

X

Facility

Code

S(1位):严重性。如果设置,表示失败结果。如果清除,则表示成功。

R(1位):保留。如果N位清零,则该位必须设置为0。如果N位被置位,则该位由NTSTATUS编号空间定义。 NTSTATUS 和  HRESULT 的转换映射。

C(1位):客户。该位指定值是客户定义的还是Microsoft定义的。该位设置为客户定义的值,清除为Microsoft定义的值。

N(1位):如果置,则表明该错误代码是一个NTSTATUS值(如第2.3节中所述),但该位置1。

X(1位): 保留。应该设为0。

Facility(11位):错误来源。具体可以参考下面链接。

Code(2个字节):错误代码。

格式介绍

https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-erref/0642cb2f-2075-4469-918c-4441e69c548a

HRESULT value

https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-erref/705fb797-2175-4a90-b5a3-3918024b10b8

2、Win32 error code

所有Win32错误代码都必须在0x0000到0xFFFF范围内

错误代码可以查看链接:

https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-erref/18d8fbe8-a967-4f1c-ae50-99ca8e491d2d

WIN32错误代码可以转换成HRESULT

使用模式0x8007XXXX将Win32错误代码转换为HRESULT,其中XXXX是Win32十六进制值0x0000XXXX的前两个字节。

#define FACILITY_WIN32 0x0007#define __HRESULT_FROM_WIN32(x)((HRESULT)(x)<= 0?((HRESULT)(x)):((HRESULT)(((x)&0x0000FFFF)|(FACILITY_WIN32 << 16)| 0x80000000)))

示例: ERROR_ 

0x00000004  ERROR_TOO_MANY_OPEN_FILES

系统无法打开文件。

3、 NTSTATUS

内部格式如下:

表格1

0

1

2

3

4

5

6

7

8

9

1
0

1

2

3

4

5

6

7

8

9

2
0

1

2

3

4

5

6

7

8

9

3
0

1

Sev

C

N

Facility

Code

Sev(2位):严重性。严重等级代码如下。

价值

意义

STATUS_SEVERITY_SUCCESS

0x0

成功

STATUS_SEVERITY_INFORMATIONAL

0x1

信息性

STATUS_SEVERITY_WARNING

0x2

警告

STATUS_SEVERITY_ERROR

0x3

错误

C(1位):客户。这指定值是客户定义的还是Microsoft定义的。此位设置为客户定义的值,清除为Microsoft定义的值。<3>

N(1位):保留。必须将其设置为0,以便可以通过设置该位将NTSTATUS值映射到等效的HRESULT值

Facility(12位):一个值,与C位一起指示用于“代码” 字段的编号空间。

Code(2个字节):错误代码的其余部分。供应商应按其指定的含义重用下表中的值,或使用C位置1定义自己的值。C位清零时选择任何其他值都可能会导致将来发生冲突。

NTSTATUS值

https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-erref/596a1078-e883-4972-9bbc-49e60bebca55

示例:STATUS_* 开始

0xC0000409  STATUS_STACK_BUFFER_OVERRUN

系统在此应用程序中检测到基于堆栈的缓冲区溢出。此超限可能会允许恶意用户控制此应用程序。

查看错误码的方式

1、使用error lookup tool 工具

下载链接:https://download.microsoft.com/download/4/3/2/432140e8-fb6c-4145-8192-25242838c542/Err_6.4.5/Err_6.4.5.exe

2、windbg !err <code> 查看错误信息

有些错误没有显示成功~

3、可以在线查找

https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-erref/1bc92ddf-b79e-413c-bbaa-99a5281a6c90

4、代码查看

使用FormatMessage 格式化错误信息

https://docs.microsoft.com/en-us/windows/win32/api/winbase/nf-winbase-formatmessage

#include <windows.h>
#include <strsafe.h>void ErrorExit(LPTSTR lpszFunction)
{ // Retrieve the system error message for the last-error codeLPVOID lpMsgBuf;LPVOID lpDisplayBuf;DWORD dw = GetLastError(); FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM |FORMAT_MESSAGE_IGNORE_INSERTS,NULL,dw,MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),(LPTSTR) &lpMsgBuf,0, NULL );// Display the error message and exit the processlpDisplayBuf = (LPVOID)LocalAlloc(LMEM_ZEROINIT, (lstrlen((LPCTSTR)lpMsgBuf) + lstrlen((LPCTSTR)lpszFunction) + 40) * sizeof(TCHAR)); StringCchPrintf((LPTSTR)lpDisplayBuf, LocalSize(lpDisplayBuf) / sizeof(TCHAR),TEXT("%s failed with error %d: %s"), lpszFunction, dw, lpMsgBuf); MessageBox(NULL, (LPCTSTR)lpDisplayBuf, TEXT("Error"), MB_OK); LocalFree(lpMsgBuf);LocalFree(lpDisplayBuf);ExitProcess(dw);
}void main()
{// Generate an errorif(!GetProcessId(NULL))ErrorExit(TEXT("GetProcessId"));
}

其他用于错误处理的函数

功能 描述
Beep 在扬声器上产生简单的音调。
CaptureStackbackTrace 通过在堆栈上走动并记录每一帧的信息来捕获堆栈跟踪。
FatalAppExit 显示消息框,并在关闭消息框时终止应用程序。
FlashWindow 闪烁指定的窗口一次。
FlashWindowEx 闪烁指定的窗口。
FormatMessage 格式化消息字符串。
GetErrorMode 检索当前进程的错误模式。
GetLastError 检索调用线程的最后一个错误代码值。
GetThreadErrorMode 检索调用线程的错误模式。
MessageBeep 播放波形声音。
RtlLookupFunctionEntry 在活动功能表中搜索对应于指定PC值的条目。
RtlNtStatusToDosError 检索与指定的NT错误代码相对应的系统错误代码。
RtlPcToFileHeader 检索包含指定PC值的图像的基地址。
RtlUnwind 启动过程调用帧的展开。
RtlUnwind2 启动过程调用帧的展开。
RtlUnwindEx 启动过程调用帧的展开。
RtlVirtualUnwind 检索指定函数上下文之前的函数的调用上下文。
SetErrorMode 控制系统是否将处理指定类型的严重错误,或进程是否将处理它们。
SetLastError 设置调用线程的最后错误代码。
SetLastErrorEx 设置调用线程的最后错误代码。
SetThreadErrorMode 控制系统是处理指定类型的严重错误还是调用线程将处理它们。

windows - 错误码相关推荐

  1. Windows错误码

    Windows错误码 简介 代码 简介 记录下windows的一些错误码,包括主要是文件操作错误码,系统错误的错误码在449以后,不在这里.以后有时间再整理,暂时放在这里了 代码 // // Mess ...

  2. Windows错误码2503和2502

    2503和2502错误码通常出现在Windows系统中,指的是安装或卸载程序时遇到的错误. 2503错误码表示在安装或卸载程序时发生了一些错误,可能是由于权限不足或某些文件被占用等原因导致的. 250 ...

  3. python windows错误码

    在用python删除文件的时候,一直报这个错误,查了 error5的错误是 拒绝访问 在用python删除文件的时候,一直报这个错误,查了 error5的错误是 拒绝访问.那么是删除权限不够?用管理员 ...

  4. Windows 错误码整理

    0x0000 操作成功完成. 1 0x0001 函数不正确. 2 0x0002 系统找不到指定的文件. 3 0x0003 系统找不到指定的路径. 4 0x0004 系统无法打开文件. 5 0x0005 ...

  5. Windows Sockets 错误码及出错原因

    From: http://blog.csdn.net/mjay1234/article/details/7684316 Windows Sockets在头文件winsock.h中定义了所有的错误码,它 ...

  6. Windows下错误码全解析

    windows系统下,调用函数出错时.可以调用GetLastError函数返回错误码.但是GetLastError函数返回值是DWORD类型,是一个整数.如果想要知道函数调用的真正错误原因,就需要对这 ...

  7. windows getLastError 错误码大全

    对于不想装msdn的朋友来说,这简直就是大大大大的福利啊! 0000 操作已成功完成. 0001 错误的函数. 0002 系统找不到指定的文件. 0003 系统找不到指定的路径. 0004 系统无法打 ...

  8. windows下查看错误码与错误信息

    在linux下#include<errno.h>后,错误码被直接写在errno这个全局变量中,错误信息可以通过perror(const char* __s)查看. 在Windows下需要# ...

  9. 亲测有效:局域网共享打印机出现,windows无法连接到打印机错误码0x0000011b

    问题描述: 想要局域网共享打印机,win10系统,网络已经设置完成,专用网络及公用网络设置的共享也开启,无密码共享.连接打印机所在电脑可以进入,也可以看到打印机及共享文件夹.但在具体连接时,出现&qu ...

最新文章

  1. Java实用教程笔记 类与对象
  2. 【Java Web开发指南】AjaxJson笔记
  3. 出席国际海水稻论坛-林裕豪:从玉农业谋定陆丰稻作改良
  4. mysql设置catalog_catalog恢复目录介绍和配置
  5. JAVA的内省机制(introspector)与反射机制(reflection)
  6. php ci session获取值,CI3.1 Session类取不到值的问题
  7. 用javascript实现动态增加DataGrid行
  8. python判断_轻松python文本专题-判断对象里面是否是类字符串(推荐使用isinstance(obj,str))...
  9. 图(网)的存储结构(数组存储表示即邻接矩阵、邻接表)
  10. 关于python多线程和定时器 看图不说话
  11. 如果一栋楼起火谁赔偿_太原一辆快递车起火!赶紧看看有你的包裹没?
  12. 11 Sping框架--AOP的相关概念及其应用
  13. ROS入门教程(一)
  14. 无损内嵌字幕到mkv文件
  15. VR火灾隐患排查,模拟多种火灾场景
  16. OSChina 周五乱弹 —— 是时候动手了
  17. 一个人一个微博、一个App一个故事:通过微博草根账号做英语学习App的“爱卡微口语”获晨脉创投天使投资
  18. 注册公司经营范围还不知道怎么写?看这一篇就够了!
  19. PCB板框的绘制——AD19
  20. 苹果开发者账号,年龄未满18周岁,怎么修改个人信息啊

热门文章

  1. CocoaChina大会见闻——cocos2d-x 3.0 新特性
  2. SQL注入原理及如何判断闭合符
  3. 中南财经政法大学计算机实践试题及答案,中南财经政法大学计算机2006-2007期末考试卷(A)答案...
  4. Latex部分斜体变直体
  5. 禁用或限制svchost会有哪些后果?
  6. matlab特效实现,matlab 使用 实现三维建模源码,效果非常好,可以用于 点云数据的 262万源代码下载- www.pudn.com...
  7. java8 - Optional容器
  8. 浅谈当今主流笔记本的cpu
  9. python boxplot significance_Boxplot的概念
  10. 读书笔记 -《Python 黑帽子》 ( 一 )