首页 > 系统相关 >24.1 SetUnhandledExceptionFilter未处理异常--《Windows核心编程》

24.1 SetUnhandledExceptionFilter未处理异常--《Windows核心编程》

时间:2022-11-25 16:47:16浏览次数:58  
标签:EXCEPTION excp 处理 Windows 24.1 SetUnhandledExceptionFilter CONTINUE 异常

对于未处理异常,例如异常过滤返回EXCEPTION_CONTINUE_SEARCH,向上搜索,但无法搜索到处理部分,产生未处理异常。Windows提供了 SetUnhandledExceptionFilter 函数,给我们处理异常的最后机会,否则 Windows 会正式认为这个异常没有得到处理。

默认情况下,如果没有设置 SetUnhandledExceptionFilter 函数,对于未处理异常,会调用操作系统的默认异常处理代码 UnhandledExceptionHandler

通常应该在进程初始化阶段调用这个函数,一旦调用,进程中所有线程的未抛出异常都会导致 SetUnhandledExceptionFilter 参数所指定的的异常过滤函数的执行。

// 负责处理未处理异常
// 进程初始化时,设置处理未处理异常过滤函数
PTOP_LEVEL_EXCEPTION_FILTER SetUnhandledExceptionFilter(
PTOP_LEVEL_EXCEPTION_FILTER pTopLevelExceptionFilter
);

参数是一个异常过虑函数,原型必须与下面类似

// 返回值和结果
// EXCEPTION_EXECUTE_HANDLER 进程终止
// EXCEPTION_CONTINUE_EXECUTION 从抛出异常处再执行
// EXCEPTION_CONTINUE_SEARCH 不处理
LONG WINAPI TopLevelUnhandledExceptionFilter(
PEXCEPTION_POINTERS pExceptionInfo
);

C/C++运行函数安装的默认的全局异常过滤程序: __CxxUnhandledExceptionFilter,用 NULL 调用 SetUnhandledExceptionFilter 将全局未处理异常过滤程序设回 UnhandledExceptionFilter

#include <windows.h>   
#include <stdio.h>

long   __stdcall   callback(_EXCEPTION_POINTERS*   excp)
{
	MessageBox(0, "Error", "error", MB_OK);

	printf("Error   address   %x\n", excp->ExceptionRecord->ExceptionAddress);
	printf("CPU   register:\n");
	printf("eax   %x   ebx   %x   ecx   %x   edx   %x\n", excp->ContextRecord->Eax,
		excp->ContextRecord->Ebx, excp->ContextRecord->Ecx,
		excp->ContextRecord->Edx);

	return   EXCEPTION_EXECUTE_HANDLER;	// 进程终止
}

int   main(int   argc, char*   argv[])
{
	PTOP_LEVEL_EXCEPTION_FILTER pException = SetUnhandledExceptionFilter(callback);
	_asm   int   3   // 只是为了让程序崩溃
	return   0;
}

 



我们都知道,每个线程的执行都是从 NTDLL.dll 中的函数 BaseThreadStart 开始的:

VOID BaseThreadStart(
	PTHREAD_START_ROUTINE pfnStartAddr,
	PVOID pvParam
)
{
	__try
	{
		ExitThread((pfnStartAddr)(pvParam));
	}
	__except (UnhandledExceptionFilter(GetExceptionInformation()))
	{
		ExitProcess(GetExceptionCode());
	}
}

// 上述UnhandledExceptionFilter的返回值和结果
// EXCEPTION_EXECUTE_HANDLER 执行ExitProcess,进程退出
// EXCEPTION_CONTINUE_EXECUTION 从抛出异常处再次执行
// EXCEPTION_CONTINUE_SEARCH 未处理异常

// 上述UnhandledExceptionFilter的返回值和结果
// EXCEPTION_EXECUTE_HANDLER 执行ExitProcess,进程退出
// EXCEPTION_CONTINUE_EXECUTION 从抛出异常处再次执行
// EXCEPTION_CONTINUE_SEARCH 未处理异常

如果我们的线程抛出一个异常,并且所有安装的异常过滤程序都返回 EXCEPTION_CONTINUE_SEARCH,系统提供的一个特殊函数 UnhandledExceptionFilter 将会被调用。


本书讨论的是用户态的开发。对内核态线程抛出未处理异常,在蓝屏前,系统让相关设备驱动调用 CrashDmp.sys在页文件中建立 Crash Dump,再停止所有操作。重启后,会查看页文件是否包含了一个 Crash Dump,如果有表示数据得到了存储 ,系统让WerFault运行,产生错误报告,并发送给Microsoft服务器。

 

标签:EXCEPTION,excp,处理,Windows,24.1,SetUnhandledExceptionFilter,CONTINUE,异常
From: https://www.cnblogs.com/renleiguanchashi/p/16925599.html

相关文章

  • 24.3 向量化异常VEH--《Windows核心编程》
    Windows提供了向量化异常处理(vectoredexcepationhanding,VEH)机制。程序可以注册一个函数,每当异常发送或者一个未处理异常脱离标准SEH的控制时,这个函数就会被调用。PVO......
  • ThinkSystem DS系列存储FC端口连接Windows主机基本配置
    知识点分析:本文以ThinkSystemDS4200存储通过FC端口连接到WindowsServer2016操作系统主机为例,介绍ThinkSystemDS系列存储首次部署的基本配置操作,包括: 登陆DS存储......
  • ThinkSystem DS系列存储iSCSI端口连接Windows主机基本配置
    知识点分析:本文以ThinkSystemDS4200存储通过iSCSI端口连接到WindowsServer2016操作系统主机为例,介绍ThinkSystemDS系列存储首次部署的基本配置操作,包括: 登陆DS存储......
  • WINDOWS下对NIGNX日志文件进行限制
    首先接到这个任务,发现nginx的日志限制更多的都是在Linux下做的,找了半天,也没找到能直接通过nginx.conf更改体现到日志限制上的。最后决定直接通过bat脚本,来对nginx......
  • Windows端口占用、解除
    第一步:打开命令行(win+r->cmd)在命令行执行:netstat-ano|findstr"端口号"  第二步:命令行执行:tasklist|findstr"PID号"  第三步:可在任务管理器中终止进程,也......
  • Windows删除U盘无效分区
    原因因多次制作U盘系统(群晖、U盘启动盘),导致在PM和Windows中的磁盘管理器中无法删除分区,误以为U盘已经坏掉。途径网络上搜索多种方法,经测试一种方法可用。CMD模式DiskPa......
  • windows上安装mysql-5.6.44-winx64
     配置MySQL配置文件my.ini。datadir一般和安装目录是分开存放的[mysqld]#设置3306端口port=3306#设置mysql的安装目录---这里输入你安装的文件路径----basedir=......
  • WindowsServer域的安装与卸载
    搭建域服务器1.安装域控打开服务器管理器,点击右上角的管理,选择添加角色和功能一直点击下一步,直到选择服务器角色处,勾选ActiveDirectory域服务器一直下一步......
  • 在windows系统中搭建python编程环境
    Python环境可以安装在很多不同的系统中,我们python自学网主要考虑到绝大多数学员都是用的是Windows系统,所以就以Windows系统来给大家演示一下python安装的方法,后面也会更新......
  • Windows server 2008 R2 多用户远程桌面配置详解(超过两个用户)
    这篇文章主要介绍了Windowsserver2008R2多用户远程桌面配置详解(超过两个用户),需要的朋友可以参考下 注意:一下是针对win2008 serverr2的操作1、创建三个本地......