Реферат: Централизованная обработка исключений
}
00411E3B mov ecx,dword ptr [ebp-10h]
00411E3E mov dword ptr fs:[0],ecx
00411E45 pop edi
00411E46 pop esi
00411E47 pop ebx
00411E48 mov esp,ebp
00411E4A pop ebp
00411E4B ret
Теперь давайте посмотрим, что делает этот ассемблерный код. В начале функции создается фрейм стека. В этом нет ничего необычного – такой код есть в большинстве функций, но вот несколько следующих инструкций показались мне очень интересными:
00411DE3 push 0FFFFFFFFh 00411DE5 push 424140h 00411DEA push offset @ILT+390(__except_handler3) (41118Bh) 00411DEF mov eax,dword ptr fs:[00000000h] 00411DF5 push eax 00411DF6 mov dword ptr fs:[0],esp |
Вначале в стек кладется -1 (как оказалось впоследствии, просто резервируется место в стеке), а затем в стек записывается адрес статической переменной и адрес обработчика исключения. Если присмотреться к последним трем инструкциям, то можно увидеть, что из памяти по адресу fs:[0] считывается какое-то число, и кладется в стек, а на его место заносится текущий указатель стека. В принципе ничего подозрительного тут нет, но если расположить эти три инструкции последовательно несколько раз, то станет заметно, что они формируют связанный список, причем первый элемент этого списка всегда указывает на предыдущий элемент. На выходе из функции находится код, который восстанавливает предыдущее значение переменной по адресу fs:[0] :
00411E3B mov ecx,dword ptr [ebp-10h] 00411E3E mov dword ptr fs:[0],ecx |
Таким образом, если функция имеет в себе конструкцию __try … __except, то компилятор создает в стеке запись о новом обработчике исключений и помещает информацию о ней в список обработчиков. Придя к такому выводу, я начал искать хоть какую-то информацию об обработчиках исключений и нашел публикацию, написанную Matt Pietrek-ом 7 летназад (A Crash Course on the Depths of Win32 Structured Exception Handling). В этой статье описана структура SEH, и подтверждаются выводы, сделанные путем анализа кода приведенной выше функции. Изучив эту статью и проверив написанное в ней, я обнаружил, что с тех пор в области обработки исключений практически ничего не изменилось.
Из статьи следует, что по адресу fs:[0], находится начало связанного списка зарегистрированных обработчиков исключения, элементами которого являются структуры типа _EXCEPTION_REGISTRATION, расположенные в стеке.
struct _EXCEPTION_REGISTRATION { // указательнаследующуюзапись _EXCEPTION_REGISTRATION *prev; // обработчик исключения, созданный Runtime библиотекой SEHHandler handler; // указатель на структуру, описывающий блок __try…__except PSCOPETABLE scopetable; К-во Просмотров: 276
Бесплатно скачать Реферат: Централизованная обработка исключений
|