Global hook

Доброго времени суток, все!
Как на Delphi 7 поставить хук на системные события? Т.е. происходит
что-то в системе - я об этом узнаю первым. Интересуют прежде всего
системные ошибки. Заранее спасибо.
← Март 2005 → | ||||||
1
|
||||||
7
|
11
|
12
|
||||
За последние 60 дней ни разу не выходила
Сайт листа:
http://codeguru.ru
Открыт:
21-09-2003
Пре-модерация: Нет
Адрес для писем в лист: comp.soft.prog.prog-list@subscribe.ru
Адрес
модератора: comp.soft.prog.prog-owner@subscribe.ru
Доброго времени суток, все!
Как на Delphi 7 поставить хук на системные события? Т.е. происходит
что-то в системе - я об этом узнаю первым. Интересуют прежде всего
системные ошибки. Заранее спасибо.
Доброго времени суток, Hagen.
Вы писали 4 марта 2005 г., 11:07:02
на тему "Global hook"
Так вот на эти исключения и надо поставить хук. Только как?
Hello, NEON!
Отвлекся на некоторое время от форума, sorry.
Чтобы не было недоразумений, сначала уточним терминологию.
Под hook в Windows подразумевается вполне определенная вещь.
Цитирую Microsoft Platform SDK (User Interface Services ->
Windows User Interface -> Windowing -> Hooks):
"A hook is a point in the system message-handling mechanism
where an application can install a subroutine to monitor
the message traffic in the system and process certain types of
messages before they reach the target window procedure."
Таким образом, hook - это не просто обобщённая ловушка,
а ловушка, предназначенная для перехвата определенных
сообщений перед тем как они попадут в оконную процедуру.
Можно ставить как локальные хуки, нацеленные на конкретную
оконную процедуру, так и глобальные.
Хукинг, конечно, достаточно мощная техника, но к перехвату
необработанных исключений (unhandled exceptions) имеет,
увы, отдаленное отношение.
В этом случае, скорее всего, прийдется осуществить перехват
вызовов функции UnhandledExceptionFilter в kernel32.dll.
Существует различные способы сделать это (и один из них
использует глобальный хукинг, для того чтобы спроецировать
свою dll на все процессы, имеющие оконные процедуры), но ни один
не является универсальным и зависит от используемой ОС
(подробная информация о перехвате вызовов функций в dll
есть в сети, но все что попадалось - с примерами на C или
Asm'е; если не пугает перспектива копаться в низкоуровневом
коде - могу кинуть ссылки).
Перехват unhandled exception в этом месте позволит произвести
регистрацию исключительного события в процессе уровня ring-3 перед
тем как система прибьет этот процесс или передаст его JIT-отладчику,
но если требуется более серьёзно вмешиваться в работу ОС -
прийдется всерьез подружиться с отладчиком уровня ядра.
Кроме того, если произойдет ошибка во время работы в ring-0,
управление никогда не будет передано обратно в ring-3,
система просто остановит свою работу, покажет BSOD и
сделает crash-dump (упрощенно, конечно).
Так ли уж необходимы все эти мучения?
P.S. Я вел к тому, что, может быть, есть готовые
разработки для Delphi, ведь перехват вызовов довольно широко
используется - стоит поискать/поспрашивать в сети.
Тогда SetUnhandledExceptionFilter() однозначно. Регистрирует твой обработчик
всех неперехваченных исключений для всех нитей (как уже имеющихся, так и
всех новых, если и когда они будут созданы) текущего процесса. Только надо
учесть, что под отладчиком всё равно он первый получит нотификацию. И это не
побороть, если только у самого отладчика нет каких-нибудь соответствующих
опций.
--
С уважением, boroda
mailto:boroden***@s*****.ru
Номер выпуска : 4129
Возраст листа : 535 (дней)
Количество подписчиков : 524
Адрес в архиве : http://subscribe.ru/archive/comp.soft.prog.prog/msg/330140
Получить правила : mailto:comp.soft.prog.prog-rules@subscribe.ru
Формат "дайджест" : mailto:comp.soft.prog.prog-digest@subscribe.ru
Формат "каждое письмо" : mailto:comp.soft.prog.prog-normal@subscribe.ru
Формат "читать с веба" : mailto:comp.soft.prog.prog-webonly@subscribe.ru
Hello, NEON!
Хуки здесь вряд ли помогут. Тебе интересуют, скорее всего,
необработанные исключения. Подробно об обработке структурных
исключений см. "Джеффри РИХТЕР.Windows для профессионалов:
создание эффективных Win32 приложений с учетом специфики
64-разрядной версии Windows" (была на http://anatolix.naumen.ru/)
Ну, а по хукам информации навалом - в том числе и для Delphi