C Обработка исключений - PullRequest
2 голосов
/ 08 июня 2011

Я хотел бы знать, как обрабатывать исключения в C, в частности EXCEPTION_GUARD_PAGE исключения.

Я попытаюсь объяснить ситуацию более кратко:

Я хотел бы пометить раздел / страницы как PAGE_GUARD, и всякий раз, когда программа выполняет их, я хотел бы выполнить несколько задач, я пытался вызвать исключение с классическим VirtualAlloc -> Write -> Exception попаданием, но я знаю, что поймать исключение в C

Буду признателен за помощь. Заранее спасибо.

1 Ответ

4 голосов
/ 08 июня 2011

В MSDN есть все, что вам нужно:

В данном конкретном случае вы хотите что-то в этом духе:

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

РЕДАКТИРОВАТЬ (в ответ на комментарий ОП):

Код выше ( MSDN *)1019 * снова полезен), но в этом случае есть более переносимое (не зависящее от расширений MSVC) и, возможно, менее уродливое решение: зарегистрируйте фильтр исключений верхнего уровня с помощью SetUnhandledExceptionFilter и позвольте ему справиться с ситуацией:

/* 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);
...