Здравствуйте! Возник такой вопрос, можно ли отследить из драйвера завершение работы системы, ведь при этом DriverUnload не вызывается?
Нужно зарегистрироваться IoRegisterShutdownNotification. При завершении системы получишь IRP_MJ_SHUTDOWN. Естественно нужно предусмотреть обработчик MajorFunction[IRP_MJ_SHUTDOWN]
Вот я сделал так, но обработчки заработал (поставил бесконечный цикл) только когда, когда уже все программы выклчились и горел экран приветствия (Завершение работы). А как можно определить момент выключения чуть раньше, чтобы можно было отправить юзермодному приложению что работа завершается. (приложение не имеет граф. окон) поэтому стандарные способы не работают (через сообщения WM_SHUTDOWN или как-то так) Интересно...
test555 Пускай юзермодное приложение создаст себе невидимое окно и ловит сообщения WM_QUERYENDSESSION, WM_ENDSESSION
Partner, в этом то и фишка. Что если создается окно, то утилита типа AZV находит скрытый процесс. (программа не хакерская, просто необходимо чтобы она была невидимой). Можно конечно перехватить кое какую функцию... Так - ясно. Мне просто было интересно, можно ли в ядре отследить это. Видимо нельзя.. Спасибо за ответ
test555 отселдить посылку вышеупомянутых сообщений какомунить окну? я хотя не совсм в курсях как это делаеться, но мочемуто мне кажеться что жо возможно ) Покапай NtUserWaitMessage, не уверен сам не копал.. но поназванию то что надо )
Partner, АВЗ находит скрытые процессы путем перечисления окон в системе, потом опрашивает систему "чье это окно". Я проверял. В статье МС-РЕМА про обнаружение скрытых процессов этот способ описан. Чтобы защититься от такого способа обнаружения необходимо перехватывать функцию NTUSERQUERYWINDOW... Для этого вроде надо искать адрес теневой KeServiceDescriptorTableShadow. У меня ничего не получалось (искать надо в контексте ГУИ процесса). Решено было отказаться от окон в программе. Вроде так.
Partner, да, мой процесс скрытым должен быть.. ОФФ ТОП: есть ли IRP запрос наподобии IRP_MJ_SHUTDOWN, но который вызается при переходе в спящий режим? Похоже что нет..
А почему бы не перехватить WM_QUERYENDSESSION для любого другого существующего окна? Например, окна эксплорера. Например, SysListView32 ("FolderView") ?