Невозможно отучить людей изучать самые ненужные предметы.
Введение в CSS
Преимущества стилей
Добавления стилей
Типы носителей
Базовый синтаксис
Значения стилевых свойств
Селекторы тегов
Классы
CSS3
Надо знать обо всем понемножку, но все о немногом.
Идентификаторы
Контекстные селекторы
Соседние селекторы
Дочерние селекторы
Селекторы атрибутов
Универсальный селектор
Псевдоклассы
Псевдоэлементы
Кто умеет, тот делает. Кто не умеет, тот учит. Кто не умеет учить - становится деканом. (Т. Мартин)
Группирование
Наследование
Каскадирование
Валидация
Идентификаторы и классы
Написание эффективного кода
Вёрстка
Изображения
Текст
Цвет
Линии и рамки
Углы
Списки
Ссылки
Дизайны сайтов
Формы
Таблицы
CSS3
HTML5
Блог для вебмастеров
Новости мира Интернет
Сайтостроение
Ремонт и советы
Все новости
Справочник от А до Я
HTML, CSS, JavaScript
Афоризмы о учёбе
Статьи об афоризмах
Все Афоризмы
Помогли мы вам |
PVOID AddVectoredExceptionHandler(
ULONG FirstHandler,
PVECTORED_EXCEPTION_HANDLER VectoredHandler)
FirstHandler
— вызывать обработчик раньше всех ранее зарегистрированных обработчиков (значение CALL_FIRST
) или после всех (значение CALL_LAST
);VectoredHandler
— адрес функции обработчика. Эта функция должна возвращать EXCEPTION_CONTINUE_EXECUTION
. Обработчики далее не выполняются, обработка средствами SEH не производится, управление передается в ту точку программы, из которой было вызвано исключение или EXCEPTION_CONTINUE_SEARCH
(выполняется следующий векторный обработчик, а если таких нет, то разворачивается SEH).Зарегистрируем обработчик и проверим работу VEH. Исключением пока будет стандартный Null-Pointer
. То есть обращение к указателю, который имеет значение nullptr
.
#include <iostream>
#include <windows.h>
#include <errhandlingapi.h>
LONG WINAPI MyVectoredExceptionHandler(PEXCEPTION_POINTERS exceptionInfo)
{
std::cout << "Exception occurred!" << std::endl;
std::cout << "Exception Code: " << exceptionInfo->ExceptionRecord->ExceptionCode << std::endl;
std::cout << "Exception Address: " << exceptionInfo->ExceptionRecord->ExceptionAddress << std::endl;
return EXCEPTION_CONTINUE_SEARCH;
}
int main()
{
if (AddVectoredExceptionHandler(1, MyVectoredExceptionHandler) == nullptr)
{
std::cout << "Failed to add the exception handler!" << std::endl;
return 1;
}
int* p = nullptr;
*p = 42; // Исключение возникает тут
return 0;
}
Обработка исключения с помощью VEHВидим, что обработчик успешно срабатывает и вызывается, затем возвращает EXCEPTION_CONTINUE_SEARCH
. Это, в свою очередь, дергает SEH, SEH в программе нет, поэтому Visual Studio включается и выдает нам исключение. Если будем возвращать EXCEPTION_CONTINUE_EXECTION
, то получим бесконечный вызов обработчика, так как каждый раз будет срабатывать строка *p
.
Точно такое же исключение будет срабатывать и при хардверных бряках.
Наконец, последний тип обработчиков — Unhandled Exception Filter. Он редко когда используется, но изначально задумывался как обработчик для исключений, которые вообще никто не обрабатывает. Ни VEH (если отсутствует или вернул EXCEPTION_CONTINUE_SEARCH
), ни SEH (если тоже отсутствует или указано EXCEPTION_CONTINUE_SEARCH
). Устанавливаются такие обработчики через функцию SetUnhandledExceptionFilter().
LPTOP_LEVEL_EXCEPTION_FILTER SetUnhandledExceptionFilter(
[in] LPTOP_LEVEL_EXCEPTION_FILTER lpTopLevelExceptionFilter
);
Функция принимает один‑единственный параметр — адрес функции‑обработчика, которая должна вызываться при возникновении необработанного исключения. С помощью UEF также ловятся исключения, возникающие при бряках.
Возьмем прошлый код и переделаем его под UEF.
#include <iostream>
#include <windows.h>
LONG WINAPI MyUnhandledExceptionHandler(PEXCEPTION_POINTERS exceptionInfo)
{
std::cout << "Unhandled exception occurred!" << std::endl;
std::cout << "Exception Code: " << exceptionInfo->ExceptionRecord->ExceptionCode << std::endl;
std::cout << "Exception Address: " << exceptionInfo->ExceptionRecord->ExceptionAddress << std::endl;
return EXCEPTION_CONTINUE_SEARCH;
}
int main()
{
if (SetUnhandledExceptionFilter(MyUnhandledExceptionHandler) == nullptr)
{
std::cout << "Failed to set the unhandled exception filter!" << std::endl;
return 1;
}
int* p = nullptr;
*p = 42;
return 0;
}
Обрати внимание, что если ты запустишь этот код в Visual Studio, то она выдаст ошибку до UEF.
Это связано с тем, что исключение в данном случае обрабатывает Visual Studio. Если же файл будет запущен за пределами IDE, то мы получим успешный вызов обработчика.
|
|