Хай всем Есть небольшой вопрос - по какому принципу винда выгружает драйвера? Например написал я драйвер, может ли винда его выгрузить если девайс, который он создал, никто не использует? Может ли она его выгрузить если я не указал UnloadHandler ? И ещё вижу иногда странные бсоды в одном драйвере в его DriverEntry вызваной из IopLoadUnloadDriver. Знаю что эта функция "перегружает" драйвер, но зачем? Может ли винда сама по себе такое делать (в смысле перегрузить драйвер)? Спасибо
Только по запросу остановки сервиса. DriverUnload может быть ты имел в виду? Нет, не сможет. IopLoadUnloadDriver - внутренняя функция винды, которая вызывается при запуске и остановке сервиса и она соответственно либо загружает либо выгружает драйвер. Ни о какой перезагрузке речи не идет, ты не правильно понял название.
Ну во-первых, если драйвер создал или занял какие-то ресурсы, их нужно освободить. Можно найти его DRIVER_OBJECT, записать в поле DriverUnload указатель на свою функцию и тогда выгрузка пройдет нормально, только если твоя DriverUnload правильно освободит всё то, что понасоздавал драйвер: Нужно освободить всю выделенную в пулах память (ExFreePool), нужно удалить все символические ссылки, созданные драйвером (IoDeleteSymbolicLink), нужно удалить все устройства, которые создал драйвер (IoDeleteDevice).. пожалуй, всё, для "обычного" драйвера. Учти, что если ты не удалишь девайс, то любое обращение к нему после выгрузки драйвера мгновенно уронит систему в синий экран. Поэтому нужно освободить ВСЕ, что драйвер создал/выделил. Обычно это процесс весьма трудоемкий, если драйвер писал не ты и ты не знаешь, что там происходит. Хотя, если требуется срочная выгрузка, можно обойтись IoDeleteSymbolicLink / IoDeleteDevice, только вот последствия предсказать трудно. Если система не рухнет, то нестабильная работа и тормоза весьма вероятны. Короче, если драйвер выгрузку не поддерживает, лучше насильно его не выгружать
И еще: если драйвер расставлял на себя хуки, есть определенный, хоть и не большой риск, что система упадет после выгрузки драйвера, даже если все хуки снять. Один из потоков мог прервать свое исполнение внутри обработчика хука, расположенного в теле драйвера; соотв-нно если выгрузить драйвер, когда тот поток получит управление все упадет в голубой экран. Если есть большая необходимость выгружать его - нужно как минимум после снятия хуков выдержать какое-то время перед выгрузкой, но лучше вообще не выгружать.
Нормальный драйвера, если используют хуки, то юзают и объекты синхронизации(семафоры например), чтобы была возможность выгружатся.
да как вообще его выгрузишь без DrriverUnload? убить из списков и MmUnmapViewInSystemSpace? или там вовсе не "View"?
Nouzui Давно флудеров подобных тебе не наблюдал на этом форуме. По-моему ты путаешь форум с чатом или irc.
драйвер не нормальный, скорей всего хучит какие-нить хандлеры и перехватывает системные сервисы. сервисы то легко восстановить, а вот остальное.
<драйвер не нормальный, скорей всего хучит какие-нить хандлеры и перехватывает системные сервисы. сервисы то легко восстановить, а вот остальное. > Хм, я бы пошел другим путём, чем пытался бы его выгрузить. Например, остановить все системные потоки данного драйвера если он их создал и восстановил перехваченные им функции. Если юзает таймера, то поискал бы в объекте драйвера apc объект и уничтожил или по таймерам прошёлся, убил их. Вычищать под ним память не стал бы, всё же меньше вероятность, что система далее рухнет.