C异常处理

时间:2011-06-08 15:57:38

标签: c windows exception-handling internals

我想知道如何处理C中的异常,特别是EXCEPTION_GUARD_PAGE例外。

我将尝试更简要地解释一下情况:

我想将部分/网页部分标记为PAGE_GUARD,每当程序点击它们时,我想执行一些任务,我尝试使用经典的VirtualAlloc -> Write -> Exception点击来引发异常但是我知道在C

中捕获异常

我很感激帮助。 提前谢谢。

1 个答案:

答案 0 :(得分:4)

MSDN拥有您需要的一切:

在这种特殊情况下,你需要这样的东西:

__try
{
  /* Code that may cause exceptions... */
}
__except(GetExceptionCode() == EXCEPTION_GUARD_PAGE 
      ? EXCEPTION_EXECUTE_HANDLER
      : EXCEPTION_CONTINUE_SEARCH)
{
  /* Exception handling code... */
}

编辑(回应OP的评论):

上面的代码会这样做(MSDN再次有用),但在这种情况下,它更具可移植性(不依赖于MSVC的扩展)并且可以说是不那么难看的解决方案:使用{{3注册一个顶级异常过滤器并让它处理这种情况:

/* Our top-level exception filter. */
LONG WINAPI MyUnhandledExceptionFilter(EXCEPTION_POINTERS* exceptionInfo)
{
  DWORD exceptionCode = exceptionInfo->ExceptionRecord->ExceptionCode;
  if(exceptionCode == EXCEPTION_GUARD_PAGE)
  {
    /* Handle the situation somehow... */
    /* ...and resume the exception from the place the exception was thrown. */
    return EXCEPTION_CONTINUE_EXECUTION;
  }
  else
  {
    /* Unknown exception, let another exception filter worry about it. */
    return EXCEPTION_CONTINUE_SEARCH;
  }
}

/* Somewhere else in the code: */
SetUnhandledExceptionFilter(&MyUnhandledExceptionFilter);