При перехвате API через правку SDT. Иногда при выгрузке драйвера возникает BSOD: DRIVER_UNLOADED_WITHOUT_CANCELLING_PENDING_OPERATIONS. Я так понимаю из-за того, что возможно не все потоки завершенны к данному времени. Чтобы избежать этой ошибки я использую RemoveLock'и. При выгрузке драйвера вызываю IoReleaseRemoveLockAndWait. Если на данный момент счетчик Lock'ов 0, то вылетает BSOD с BAD_POOL_CALL. Поэтому приходиться вызывать перед ним IoAcquireRemoveLock. Но мне кажется что это как то криво. В чём дело?
Несмотря на имя, RemoveLock не для защиты от выгрузки драйвера, а для предотвращения посылки драйвером IRP вниз по стеку. Если драйвер сам по себе, т.е. не садится в какой-то стек, как, видимо, и есть в данном случае, использование RemoveLock не имеет никакого смысла.
Four-F ну это есстественно =) Просто как мне показалось это наиболее простой способ проконтролировать выгрузку драйвера, чтобы не осталось никаких "worker thread". Буду благодарен если подскажешь более простой способ.
Я не спец в хуке SDT, и даже не интересующийся Просто указал на то, что RemoveLock на самом деле не то что кажется. А самый простой общий способ не дать выгрузить драйвер: pDriverObject->DriverUnload = NULL;
Ну это тоже понятно. Дело в том, что я как раз и хочу выгрузить драйвер =) Только без BSOD'a. Ну это и не надо =) Суть в том что к моменту выгрузки могут быть запущено несколько потоков, и мне надо дождаться их заверщения.
Всё равно штука это специфичная и мне всё равно нечего сказать умного IMHO, должно быть уже много чего понаклёпано/понаписано по этой теме - поищи готовое.
а что именно криво? вызывать IoReleaseRemoveLockAndWait или IoAcquireRemoveLock перед ним? если второе - то так просто сделано в микрософте. я обычно вызываю IoAcquireRemoveLock сразу после IoInitializeRemoveLock, чтобы потом не вспоминать ))
Обнаружил сходную проблему - поэтому поднял старую тему. В драйвере я тоже перехватываю несколько ф-ий через SSDT. Для предотвращения проблемы с выгруженными хуками решил поступить максимально просто: при выгрузке драйвера востанавливаю SSDT и ожидаю (KeDelayExecutionThread) несколько секунд. За это время все перехваченные функции должны завершиться. Неожиданно обнаружилось, что на машине с касперским такой драйвер бсодит с DRIVER_UNLOADED_WITHOUT_CANCELLING_PENDING_OPERATIONS ssdt (даже когда перед полной выгрузкой драйвера выжидаю 10 секунд), причем делает это весьма нерегулярно. Есть ли какое решеие подобной проблеме?