异常处理 VEH

不算新的东西,也都不小了,

 

VEH的结构处理,平行于SEH,但是略有区别,

 

相关函数有四个

 1 PVOID WINAPI AddVectoredExceptionHandler(
 2   _In_ ULONG                       FirstHandler,
 3   _In_ PVECTORED_EXCEPTION_HANDLER VectoredHandler
 4 );
 5 
 6 ULONG WINAPI RemoveVectoredExceptionHandler(
 7   _In_ PVOID Handler
 8 );
 9 
10 PVOID WINAPI AddVectoredContinueHandler(
11   _In_ ULONG                       FirstHandler,
12   _In_ PVECTORED_EXCEPTION_HANDLER VectoredHandler
13 );
14 
15 ULONG WINAPI RemoveVectoredContinueHandler(
16   _In_ PVOID Handler
17 );

 

第一个函数

1 PVOID WINAPI AddVectoredExceptionHandler(
2   _In_ ULONG                       FirstHandler,
3   _In_ PVECTORED_EXCEPTION_HANDLER VectoredHandler
4 );

用来向VEH链注册一个异常处理函数,

参数1的意思是,是否插入到VEH链首部,

  如果参数1为非0,则此注册的函数会在出现异常之后优先被触发(仅仅是优先,是否First还要看是否有其他人也注册了函数)

  如果参数1为0,则此注册寒暑会在出现异常之后滞后被触发(理由同上)

参数2是一个要注册的异常处理回调函数

 

第二个函数

1 ULONG WINAPI RemoveVectoredExceptionHandler(
2   _In_ PVOID Handler
3 );

从VEH链移除一个异常处理函数

参数是用前一个函数注册之后返回的指针

 

第三个函数

1 PVOID WINAPI AddVectoredContinueHandler(
2   _In_ ULONG                       FirstHandler,
3   _In_ PVECTORED_EXCEPTION_HANDLER VectoredHandler
4 );

与第一个函数类似,但有细微区别

 

第四个函数

1 ULONG WINAPI RemoveVectoredContinueHandler(
2   _In_ PVOID Handler
3 );

与第二个函数类似,但有细微区别

 

 

四个函数,

第一个函数和第二个函数可以分为一组,

第三个函数和第四个函数可以分为一组,

两组函数有细微区别,

区别就是:

  第一组函数注册、移除的VEH异常处理回调函数,会在SEH链里面的异常处理函数执行之前执行

  第二组函数注册、移除的VEH异常处理回调函数,会在SEH链里面的异常处理函数执后执行

 

 

 

 

对于VEH的使用,微软给了一段DEMO

https://msdn.microsoft.com/en-us/library/ms681411(v=vs.85).aspx

 

转载于:https://www.cnblogs.com/suanguade/p/6674232.html

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个使用VEH机制来拦截并接管MessageBox函数的异常的示例代码: ```c++ #include <Windows.h> // Vectored Exception Handler函数 LONG WINAPI VehHandler(PEXCEPTION_POINTERS pExceptionInfo) { // 判断异常类型为访问冲突异常 if (pExceptionInfo->ExceptionRecord->ExceptionCode == EXCEPTION_ACCESS_VIOLATION) { // 恢复异常现场,使程序继续执行 pExceptionInfo->ContextRecord->Eip += 2; // 跳过引发异常的指令,使其继续执行 // 弹出自定义的消息框 MessageBox(NULL, "Exception occurred!", "Custom Exception", MB_OK | MB_ICONERROR); // 返回处理结果,终止异常处理链 return EXCEPTION_EXECUTE_HANDLER; } // 返回继续搜索异常处理链 return EXCEPTION_CONTINUE_SEARCH; } int main() { // 注册Vectored Exception Handler PVOID pHandler = AddVectoredExceptionHandler(1, VehHandler); if (pHandler == NULL) { // 处理注册失败情况 // ... return 1; } // 触发访问冲突异常 int* p = nullptr; *p = 42; // 移除Vectored Exception Handler RemoveVectoredExceptionHandler(pHandler); return 0; } ``` 在上述代码中,我们定义了一个VEH处理函数`VehHandler`,它会在异常发生时被调用。在`VehHandler`中,我们首先判断异常类型是否为访问冲突异常(EXCEPTION_ACCESS_VIOLATION),如果是,则进行自定义的异常处理逻辑。在本例中,我们跳过引发异常的指令(使程序继续执行),然后弹出一个自定义的消息框来通知异常发生。最后,我们返回`EXCEPTION_EXECUTE_HANDLER`来终止异常处理链。 在`main`函数中,我们首先注册VEH处理函数,然后触发一个访问冲突异常(通过对空指针进行解引用)。当异常发生时,VEH处理函数将被调用,执行我们定义的异常处理逻辑。最后,我们移除VEH处理函数并结束程序。 请注意,上述代码只是一个简单示例,实际使用VEH机制需要根据具体需求进行详细的异常处理和错误处理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值