Windows 核心编程笔记 [1] Windows 错误处理
[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)错误码与查找程序
定义位置:WinError.h
形式
// MessageId: ERROR_INVALID_FUNCTION 消息ID(一个可在源代码中使用的宏,用于与GetLastError的返回值进行比较)
//
// MessageText: 消息文本(描述错误的英文文本)
//
// Incorrect function. 一个编号(应该避免使用此编号,尽量使用消息ID)
//
#define ERROR_INVALID_FUNCTION 1L // dderror
查找方式:
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 错误处理的更多相关文章
- Windows核心编程笔记之错误处理
0x01 GetLastError() 函数用于获取上一个操作的错误代码 #include <Windows.h> #include <iostream> using name ...
- Windows核心编程笔记之处理字符串
0x01 ANSI 和宽字符定义 // ANSI 字符定义 CHAR varChar_1 = 'a'; // #typedef char CHAR CHAR varChar_2[] = "A ...
- Windows核心编程笔记之作业
创建作业,并加以限制 HANDLE WINAPI CreateJob() { BOOL IsInJob = FALSE; DWORD ErrorCode = NULL; // 不能将已经在作业中的进程 ...
- Windows核心编程笔记之进程
改变进程基址,获取进程基址 #include <Windows.h> #include <iostream> #include <strsafe.h> #inclu ...
- Windows核心编程笔记之内核对象
0x01 子进程继承父进程内核对象句柄 父进程 #include <Windows.h> #include <iostream> #include <strsafe.h& ...
- 《Windows核心编程》读书笔记 上
[C++]<Windows核心编程>读书笔记 这篇笔记是我在读<Windows核心编程>第5版时做的记录和总结(部分章节是第4版的书),没有摘抄原句,包含了很多我个人的思考和对 ...
- C++Windows核心编程读书笔记
转自:http://www.makaidong.com/%E5%8D%9A%E5%AE%A2%E5%9B%AD%E6%96%87/71405.shtml "C++Windows核心编程读书笔 ...
- 【转】《windows核心编程》读书笔记
这篇笔记是我在读<Windows核心编程>第5版时做的记录和总结(部分章节是第4版的书),没有摘抄原句,包含了很多我个人的思考和对实现的推断,因此不少条款和Windows实际机制可能有出入 ...
- 《Windows核心编程》第一讲 对程序错误的处理
一个Windows函数通常都有一个有意义的返回值类型,它标志着这个函数的运行状态,即函数运行成功与否.windows常用的函数类型如下图: 从系统内部来讲,当一个Windows函数检测到一个错误时,它 ...
- Windows核心编程第一章.错误处理
Windows核心编程第一章,错误处理. 一丶错误处理 1.核心编程学习总结 不管是做逆向,开始做开发.在Windows下.你都需要看一下核心编程这本书.这本书确实写得很好.所以自己在学习这本书的同时 ...
随机推荐
- 中企出海,用火山引擎DataTester开启增长第一步
更多技术交流.求职机会,欢迎关注字节跳动数据平台微信公众号,回复[1]进入官方交流群 今年 Google 宣布其提供的A/B测试工具 Optimize 将在2023年9月30号停止服务.在全球化浪 ...
- 火山引擎DataTester:三类AB实验,让企业营销拥有灵敏“网感”
更多技术交流.求职机会,欢迎关注字节跳动数据平台微信公众号,回复[1]进入官方交流群 作者:火山引擎AB测试 近日,火山引擎数智平台举办了"走进火山-全链路增长:数据飞轮转动消费新生力& ...
- 火山引擎云原生数据仓库 ByteHouse 技术白皮书 V1.0 (Ⅳ)
更多技术交流.求职机会,欢迎关注字节跳动数据平台微信公众号,回复[1]进入官方交流群 近日,<火山引擎云原生数据仓库 ByteHouse 技术白皮书>正式发布.白皮书简述了 ByteHou ...
- 阿里OSS文件访问变成下载
将 ECS 挂载 OSS 多Bucket ,进行文件存储后,发现PDF.图片在浏览器中访问URL,变成了下载,页不是预览. 1. 解决办法,文件类型 application/octet-stream ...
- 【Redis】面试题 GEO地理位置信息
目录 面试 1 http协议详情,http协议版本,http一些请求头 2 GET请求和POST请求的区别 3 如何实现服务器给客户端发送消息,websocket是什么? 4 悲观锁和乐观锁,如何实现 ...
- 【HZERO】值集翻译
值集翻译 值集管理: https://open.hand-china.com/document-center/doc/component/163/16090?doc_id=156008&doc ...
- Educational Codeforces Round 80 A - D题题解(又是卡很久的一场比赛)
第八场 CodeForces - 1288A. Deadline Example input 3 1 1 4 5 5 11 output YES YES NO Note In the first te ...
- 深度揭秘阿里云 Serverless Kubernetes
作者 | 陈晓宇(阿里云技术专家) 策划 | 褚杏娟 伴随着云原生的发展,从早先的单机版 Docker 到 Kubernetes 的编排领域的一统江湖,再到云上托管 Kubernetes,技术风雨变化 ...
- C语言常用字符串操作函数整理(详细全面)
目录 字符串相关 1.char *gets(char *s); #include<stdio.h> 2.char *fgets(char *s, intsize, FILE *stream ...
- docker 镜像管理之 overlay2 最佳实践
1. Docker 镜像 Docker 镜像是个只读的容器模板,它组成了 Docker 容器的静态文件系统运行环境 rootfs,是启动 Docker 容器的基础. Docker 镜像是容器的静态视角 ...