суббота, 16 мая 2009 г.

Почему я не могу перехватить TerminateProcess?

Это перевод Why can't you trap TerminateProcess? Автор: Реймонд Чен.

Если пользовать запускает менеджер задач и щёлкает по кнопке "Снять Задачу", то Windows сначала попробует закрыть вас мягко: отправляя сообщения WM_CLOSE для GUI-программы или событие CTRL_CLOSE_EVENT для консольных программ. Но у вас нет аналогичного способа отреагировать на TerminateProcess. Почему нет?

TerminateProcess - это низко-уровневая процедура убийства процесса. Она пропускает вызовы DLL_PROCESS_DETACH и вообще любой ваш код в процессе. Как только вы вызвали функцию TerminateProcess - в процессе больше не исполняется никакой код режима пользователя. Всё, процесс ушёл, его больше нет.

Если бы вы могли бы перехватить TerminateProcess, тогда вы просто бы подлили масла в огонь борьбы пользователей и программ. Предположим, что вы смогли перехватить эту функцию. Тогда, чтобы сделать свою программу неубиваемой, вы могли бы просто зависнуть в своём обработчике TerminateProcess!

А тогда люди начнут спрашивать "способ убить процесс, который не хочет убиваться по TerminateProcess" - и мы снова возвращаемся к тому же, откуда начали.

Завтра: рассказ о процессах, которые остаются висеть в диспетчере задач, хотя вы убили их. Они действительно мертвы, но просто не уходят.

Комментариев нет:

Отправить комментарий

Можно использовать некоторые HTML-теги, например:

<b>Жирный</b>
<i>Курсив</i>
<a href="http://www.example.com/">Ссылка</a>

Вам необязательно регистрироваться для комментирования - для этого просто выберите из списка "Анонимный" (для анонимного комментария) или "Имя/URL" (для указания вашего имени и ссылки на сайт). Все прочие варианты потребуют от вас входа в вашу учётку (поддерживается OpenID).

Пожалуйста, по возможности используйте "Имя/URL" вместо "Анонимный". URL можно просто не указывать.

Ваше сообщение может быть помечено как спам спам-фильтром - не волнуйтесь, оно появится после проверки администратором.