24.3 向量化异常VEH--《Windows核心编程》
Windows 提供了向量化异常处理(vectored excepation handing,VEH)机制。程序可以注册一个函数,每当异常发送或者一个未处理异常脱离标准SEH的控制时,这个函数就会被调用。
PVOID AddVectoredExceptionHanler(
ULONG bFirstInTheList,
PVECTORED_EXCEPTION_HANDLER pfnHandler);
- pfnHandler 是指向量化异常处理程序的指针,必须有以下签名:
LONG WINAPI ExceptionHandler(struct _EXCEPTION_POINTERS* pExceptionInfo);
向量化异常处理程序返回值:
(1)一旦某个向量化异常处理函数能纠正问题,就应该马上返回 EXCEPTION_CONTINUE_EXECUTION,让其抛出异常的指令再次执行,且 SEH 过滤程序不会有处理异常的机会。
(2)如果不能纠正问题,应该返回 EXCEPTION_CONTINUE_SEARCH,让列表中其他处理函数有机会去处理异常。
(3)VEH过滤函数绝对不能返回 EXCEPTION_EXECUTE_HANDLER
- bFirstInTheList如果传0,那么通过 pfnHandler 传递的异常处理程序就会添加到列表的尾部,否则添加到头部。发生异常的时候,在执行 SEH 过滤程序之前,将按列表顺序逐个调用函数。
可以通过 RemoveVectoredExceptionHandler 删除之前安装的 VEH 异常处理函数
ULONG RemoveVectoredExceptionHandler(PVOID pHandler);
pHandler 就是之前安装的函数句柄,AddVectoredExceptionHanler的返回值。
除了能在 SEH 之前处理异常,VEH 还能让我们能在未处理异常发生时得到通知。
PVOID AddVectoredContinueHanler(
ULONG bFirstInTheList,
PVECTORED_EXCEPTION_HANDLER pfnHandler);
需要特别说明的时,这些继续处理程序的执行是在 EXCEPTION_CONTINUE_SEARCH 之后才开始的。
其他参数和返回值同 AddVectoredExceptionHanler 函数
可以通过 RemoveVectoredContinueHandler 删除之前安装的 VEH 继续处理函数,参数同RemoveVectoredExceptionHandler。