首页 > 技术文章 > 异常处理 VEH

suanguade 2017-04-06 16:46 原文

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

 

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

 

推荐阅读