Отправляет email-рассылки с помощью сервиса Sendsay

Программирование. Форум !!!

Global hook

Доброго времени суток, все!

Как на Delphi 7 поставить хук на системные события? Т.е. происходит
что-то в системе - я об этом узнаю первым. Интересуют прежде всего
системные ошибки. Заранее спасибо.

Ответить   NEON Tue, 1 Mar 2005 19:41:26 +0300 (#325362)

 

Ответы:

Hello, NEON!

Хуки здесь вряд ли помогут. Тебе интересуют, скорее всего,
необработанные исключения. Подробно об обработке структурных
исключений см. "Джеффри РИХТЕР.Windows для профессионалов:
создание эффективных Win32 приложений с учетом специфики
64-разрядной версии Windows" (была на http://anatolix.naumen.ru/)

Ну, а по хукам информации навалом - в том числе и для Delphi

Ответить   Hagen Fri, 4 Mar 2005 07:36:34 +0700 (#327401)

 

Доброго времени суток, Hagen.
Вы писали 4 марта 2005 г., 11:07:02
на тему "Global hook"

Так вот на эти исключения и надо поставить хук. Только как?

Ответить   NEON Sat, 5 Mar 2005 11:08:59 +0300 (#327982)

 

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, ведь перехват вызовов довольно широко
используется - стоит поискать/поспрашивать в сети.

Ответить   Hagen Tue, 8 Mar 2005 17:12:23 +0700 (#329465)

 

Тогда 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

Ответить   Шматко А.А. Wed, 9 Mar 2005 15:20:47 +0300 (#330140)