Вызов эту функции после начала выполнения функции main
покажет, что к моменту выполнения функции main в списке обработчиков уже
зарегистрированы два обработчика. Текущий обработчик, как было показано раньше, установлен библиотекой Runtime. А вот последний установлен системой.
Exception Registration chain:
Current SEH record: 0x12FFB0
Prev SEH Record: 0x12FFE0
Handler: 0x41123A
Current SEH record: 0x12FFE0
Prev SEH Record: 0xFFFFFFFF
Handler: 0x77E94809
Как вы, наверное, уже догадались, создавать свой
обработчик и располагать его за системным нет никакого смысла, поскольку
исключение будет обработано в runtime-библиотеке, и приложение будет завершено.
Тогда я попытался создать свой обработчик и расположил информацию о нем перед
обработчиком runtime-библиотеки, выделив для него место в динамической памяти, но увы, мое приложение просто было выгружено из памяти после возникновения
исключения, а вставленный обработчик не был выполнен. Как оказалось, так делать
нельзя потому, что все записи списка обработчиков исключений должны лежать в
стеке, причем каждая следующая запись должна быть расположена выше предыдущей.
Итак, нельзя расположить информацию об обработчике
перед информацией о runtime-обработчике. Но никто не мешает переписать значение
поля hander обработчика runtime-библиотеки, установив его так, чтобы он
указывал на нашу функцию. Код, который реализует это, приведен ниже.
void zHookUpSEHChain(SEHHandler handler)
{
_EXCEPTION_REGISTRATION *
pVCExcRec;
__asm mov eax, FS:[0]
__asm mov [pVCExcRec], EAX
// Перебираем блоки в связанном списке. 0xFFFFFFFF означает конец
списка.
while (0xFFFFFFFF != (unsigned)(UINT_PTR)pVCExcRec)
Рекомендуем скачать другие рефераты по теме: онегин сочинение, реферат підприємство.