Реферат: Централизованная обработка исключений

// Перебираем блоки в связанном списке. 0xFFFFFFFF означаетконецсписка.

printf("Exception Registration chain:\n");

while (0xFFFFFFFF != (unsigned)(UINT_PTR)pVCExcRec)

{

printf("\tCurrent SEH record: 0x%X\n\tPrev SEH Record: 0x%X\n\tHandler: 0x%X\n\n",

pVCExcRec,

pVCExcRec->prev,

pVCExcRec->hander);

pVCExcRec = (_EXCEPTION_REGISTRATION *)(pVCExcRec->prev);

}

}

Вызов эту функции после начала выполнения функции 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)

{

К-во Просмотров: 277
Бесплатно скачать Реферат: Централизованная обработка исключений