[1] Windows 错误处理

1. 关于windows系统函数的返回值错误处理

  • VOID:这个函数不可能失败
  • BOOL:如果函数调用失败,返回值为0,即为FALSE,否则为非0值,即为TRUE
  • HANDLE:如果函数失败,返回NULL,否则HANDLE将标识一个可以操控的对象

    某些函数会返回为INVALID_HANDLE_VALUE的一个句柄值,被定义为-1 可以通过函数文档来查询
  • PVOID:函数调用失败返回NULL,否则返回一个数据块的内存地址
  • LONG/DWORD:一般为返回计数的函数。正常情况下返回一个LONG/DWORD,如果函数出于某种原因不能对我们想要计数的东西计数,通常会返回0或-1

2. GetLastError 函数

​ 返回由上一个函数调用设置的线程的32位错误代码

DWORD GetLastError(VOID);

1)注意:

Windows函数失败后应调用GetLastError函数(因为如果调用另一个Windows函数此值可能被改写);成功调用的Windows函数可能用ERROR_SUCCESS改写此值

2)实现(源码)

DWORD
WINAPI
GetLastError(VOID)
{
/* Return the current value */
return NtCurrentTeb()->LastErrorValue;
}
// 通过得到当前Teb结构,返回Teb中的LastErrorValue值得到错误码

3)错误码与查找程序

  1. 定义位置:WinError.h

  2. 形式

    // MessageId: ERROR_INVALID_FUNCTION	消息ID(一个可在源代码中使用的宏,用于与GetLastError的返回值进行比较)
    //
    // MessageText: 消息文本(描述错误的英文文本)
    //
    // Incorrect function. 一个编号(应该避免使用此编号,尽量使用消息ID)
    //
    #define ERROR_INVALID_FUNCTION 1L // dderror
  3. 查找方式:

    1)手动头文件:写ERROR_INVALID_FUNCTION,然后F12

    2)VS->工具->错误查找

    3)自己写一个错误程序来查找错误码(error show)

    https://github.com/SomaFon/ErrorShow

3. SetLastError函数

​ 设置线程的上一个错误代码,然后令自己的函数返回 FALSE,INVALID_HANDLE_VALUE、NULL 或者其他合适的值

VOID SetLastError (DWORD dwErrCode);

1)注意

​ 如果WinError.h中的任何一个代码都不能准确反映一个错误,就可以创建自己的代码

2)错误代码(一个32位数)

31-30 29 28 27-16 15-0
内容 严重性 Microsoft/客户 保留 Facility代码 异常代码
含义 0=成功 1=信息 2=警告 3=错误 0=Microsoft定义的代码 1=客户定义的代码 必须为0 前256个值由Microsoft保留 Microsoft/客户定义的代码

4. SetErrorMode 函数

​ 每个进程都关联了一组标志,这些标志的作用是让系统知道进程如何响应严重错误,包括磁盘介质错误、未处理的异常、文件查找错误以及数据对齐错误等。调用SetErrorMode函数来告诉系统如何处理这些错误

​ 控制 Windows 是否处理 指定类型的严重错误或使调用应用程序来处理它们

1)原型

UINT SetErrorMode(UINT fuErrorMode) ;

2)参数

参数值 含义
0 使用系统默认的,既显示所有错误的对话框
SEM_FAILCRITICALERRORS 0x0001 系统不显示严重错误处理程序(critical-error-handler)消息框,并将错误返回主调进程
SEM_NOALIGNMENTFAULTEXCEPT 0x0004 系统自动修复内存对齐错误,并使应用程序看不到这些错误。此标志对x86/x64处理器无效
SEM_NOGPFAULTERRORBOX 0x0002 系统不显示常规保护错误(general-protection-fault)消息框。此标志只应该由调试程序设置;该调试程序用一个异常处理程序来自行处理常规保护(general protection,GP)错误
SEM_NOOPENFILEERRORBOX 0x8000 系统查找文件失败时,不显示消息框

3)返回值

​ 错误的模式位标志先前的状态。

注意

默认情况下,子进程会继承父进程的错误模式标志。

​ 换言之,如果一个进程已经打开了SEM_NOGPFAULTERRORBOX标志,并生成了一个子进程,则子进程也会打开这个标志。但是子进程自己并不知道,而且在编写它时,或许根本没有考虑到要处理GP错误。如果一个GP错误发生在子进程的一个线程中,则子进程可能在不通知用户的情况下终止。

​ 父进程可以阻止子进程继承其错误模式,方法是在调用CreateProcess时指定CREATE_DEFAULT_ERROR_MODE标志

Windows 核心编程笔记 [1] Windows 错误处理的更多相关文章

  1. Windows核心编程笔记之错误处理

    0x01 GetLastError() 函数用于获取上一个操作的错误代码 #include <Windows.h> #include <iostream> using name ...

  2. Windows核心编程笔记之处理字符串

    0x01 ANSI 和宽字符定义 // ANSI 字符定义 CHAR varChar_1 = 'a'; // #typedef char CHAR CHAR varChar_2[] = "A ...

  3. Windows核心编程笔记之作业

    创建作业,并加以限制 HANDLE WINAPI CreateJob() { BOOL IsInJob = FALSE; DWORD ErrorCode = NULL; // 不能将已经在作业中的进程 ...

  4. Windows核心编程笔记之进程

    改变进程基址,获取进程基址 #include <Windows.h> #include <iostream> #include <strsafe.h> #inclu ...

  5. Windows核心编程笔记之内核对象

    0x01 子进程继承父进程内核对象句柄 父进程 #include <Windows.h> #include <iostream> #include <strsafe.h& ...

  6. 《Windows核心编程》读书笔记 上

    [C++]<Windows核心编程>读书笔记 这篇笔记是我在读<Windows核心编程>第5版时做的记录和总结(部分章节是第4版的书),没有摘抄原句,包含了很多我个人的思考和对 ...

  7. C++Windows核心编程读书笔记

    转自:http://www.makaidong.com/%E5%8D%9A%E5%AE%A2%E5%9B%AD%E6%96%87/71405.shtml "C++Windows核心编程读书笔 ...

  8. 【转】《windows核心编程》读书笔记

    这篇笔记是我在读<Windows核心编程>第5版时做的记录和总结(部分章节是第4版的书),没有摘抄原句,包含了很多我个人的思考和对实现的推断,因此不少条款和Windows实际机制可能有出入 ...

  9. 《Windows核心编程》第一讲 对程序错误的处理

    一个Windows函数通常都有一个有意义的返回值类型,它标志着这个函数的运行状态,即函数运行成功与否.windows常用的函数类型如下图: 从系统内部来讲,当一个Windows函数检测到一个错误时,它 ...

  10. Windows核心编程第一章.错误处理

    Windows核心编程第一章,错误处理. 一丶错误处理 1.核心编程学习总结 不管是做逆向,开始做开发.在Windows下.你都需要看一下核心编程这本书.这本书确实写得很好.所以自己在学习这本书的同时 ...

随机推荐

  1. MongoDB 客户端工具,Studio3T 无法启动

    阿里云 MongoDB 创建库添加用户并授权 MongoDB 客户端工具,Studio3T 无法启动,原因可能是因为本地的 java 版本导致 C:\Users\cj218>java -vers ...

  2. & 0xFF 作用 取低8位

    & 0xFF 取低8位 @Test void byteTest() { byte hex1 = (byte) 127; byte hex2 = (byte) 383; byte hex3 = ...

  3. Spring Boot Admin 配置应用

    Spring Boot Admin 监控SpringBoot 服务的运行情况 https://codecentric.github.io/spring-boot-admin/2.3.0/#spring ...

  4. 解读IDC《中国视频云市场跟踪》最新报告,视频云将趋向何方?

    国际权威咨询公司IDC发布<中国视频云市场跟踪(2021 H2)>报告,阿里云连续四年稳居中国视频云整体市场份额第一,整体市场份额占比达26.9%. 时至2021,中国视频云的数字背后 近 ...

  5. #2089: 不要62 (数位dp模板题,附带详细解释)

    题目链接 题意:问区间[n,m]中,不含数字4,也不含数字串"62"的所有数的个数. 思路:可以转化成求区间[0,x] 第一次接触数位dp,参考了这几篇博客. 不要62(数位dp) ...

  6. CodeForces -337A:Puzzles(水)

    The end of the school year is near and Ms. Manana, the teacher, will soon have to say goodbye to a y ...

  7. Python | 解放双手,用Python实现自动发送邮件

    解放双手,用Python实现自动发送邮件 使用Python实现自动化邮件发送,可以让你摆脱繁琐的重复性业务,节省非常多的时间. Python有两个内置库:smtplib和email,能够实现邮件功能, ...

  8. 神秘又强大的@SpringBootApplication注解

    一.前言 大部分的配置都可以用Java类+注解来代替,而在SpringBoot项目中见的最多的莫过于@SpringBootApplication注解了,它在每个SpringBoot的启动类上都有标注. ...

  9. vue 3版本如何下载静态文件

    1.现将静态文件放到 public 目录下的static文件夹 2.<a href="/static/test.zip"  target="_blank" ...

  10. [Qt开发/毕业设计/求职项目]局域网环境下远程文件发送部署系统-服务端、客户端双端的讲解

    写在前面 本文旨在做一个简单的代码讲解,我会给出源码,然后整个代码的讲解都在源码的基础上进行. 代码可能会随着更新而进行修改,但是整体框架变化不会太大. 整个文章内容不会太多,算是我自己的一个复盘,整 ...