Да навсегдна не надо - надо его иметь только на время работы своего драйвера, в идеале только на те модификации, что сделал свой дров
Во-первых, в легальном продукте это не подходит ибо дырку сделаешь в безопасности, сам же понимаешь. Во-вторых, не факт, что твой метод отключения таймера будет работать всегда, ибо в очередном обновлении MS может реализовать некоторые алгоритмы/механизмы по-другому.
Хочу поделиться результатами своих исследований. Делал так как описывал в блоге х64: мониторинг на LoadImageNotifyRoutine, внедрение APC в юзермод и завершением процесса. Внедрить APC не получалось непосредственно из LoadImageNotifyRoutine - зависало на методе MmMapLockedPagesSpecifyCache при маппинге кода APC в виртуальное пространство целевого процесса. После вынесения в отдельный поток все заработало. И еще, уже в юзермоде вызов NtTerminateThread все равно иногда выдавал месаджбокс с ошибкой. Использование метода TerminateProcess() из kernel32.dll полностью решило эту проблему. Спасибо х64 и всем принимавшим участие.
Можно было сделать через выделение виртуальной памяти, аттач к процессу и т.д. Хорошее, годное замечание, хотя думаю ExitThread() было бы вполне достаточно.
Практические упражнения по теме показывают, что в после ExitThread() в памяти остается "мертвый" процесс с одним потоком, который нужно дополнительно убивать. TerminateProcess() как я писал раньше тоже не лучшее решение, так как на 101 раз все же вылетает сообщение о том, что что-то не склеилось. Зато ExitProcess() работает по-тихому .
Я не был бы так категоричен. Мы ж не знаем, что за код у автора, и мы не знаем, создают ли статически связанные dlls потоки. В общем, я к тому, что при определённых обстоятельствах при неправильном использовании описанных в блоге способах такая ситуация вполне возможна. Например, для способа "Завершение процесса после инициализации 2" я совершенно точно могу написать код, который будет воспроизводить подобную ситуацию для калькулятора (calc.exe), для предыдущего способа тоже, скорее всего, что-нибудь придумал бы...
x64 У "мёртвого" процесса нет потоков. Также поток не может вызвать функу юзермодную если адресного пространства нет к примеру. Или поток не может исполняться вне контекста процесса. В той цитате смысла нет.
Проблема в терминологии, полагаю. Очевидно же, что под "мёртвым процессом" автор имел в виду не настоящий мёртвый процесс, а процесс, никак не проявляющий свою активность чисто внешне. Вот именно такого эффекта добиться довольно просто. Обсасывать тут как бы и нечего даже.