VEH_Demo


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include<windows.h>

LONG _stdcall RegVeh(PEXCEPTION_POINTERS ExceptionInfo);//veh异常处理

int main()
{
PVOID handle = AddVectoredExceptionHandler(TRUE,RegVeh);
_asm
{
xor eax,eax
div eax//触发异常
}
MessageBox(NULL,L"succ",L"WIN 7",MB_ICONINFORMATION);
RemoveVectoredExceptionHandler(handle);
return 0;
}
LONG _stdcall RegVeh(PEXCEPTION_POINTERS ExceptionInfo)
{
PCONTEXT pContext = ExceptionInfo->ContextRecord;
pContext->Eip += 2;
return EXCEPTION_CONTINUE_EXECUTION;
}

VEH与SEH的异同

  • VEH优先级别高于SEH,调试器优先级别高于VEH
  • SEH的相关信息保存在栈中,VEH相关信息保存在独立的链表中(实际存储在ntdll中)
  • 作用范围不同。SEH机制基于线程、VEH在整个进程范围内都有效
  • SEH依赖栈展开,有2次被调用的机会。VEH不依赖栈,只有1次被调用的机会