По какому принципу винда выгружает драйвера?

Тема в разделе "WASM.NT.KERNEL", создана пользователем vlaman, 21 мар 2007.

  1. vlaman

    vlaman New Member

    Публикаций:
    0
    Регистрация:
    6 ноя 2004
    Сообщения:
    49
    Хай всем

    Есть небольшой вопрос - по какому принципу винда выгружает драйвера? Например написал я драйвер, может ли винда его выгрузить если девайс, который он создал, никто не использует? Может ли она его выгрузить если я не указал UnloadHandler ? И ещё вижу иногда странные бсоды в одном драйвере в его DriverEntry вызваной из IopLoadUnloadDriver. Знаю что эта функция "перегружает" драйвер, но зачем? Может ли винда сама по себе такое делать (в смысле перегрузить драйвер)?

    Спасибо
     
  2. vlaman

    vlaman New Member

    Публикаций:
    0
    Регистрация:
    6 ноя 2004
    Сообщения:
    49
    ps. это всё я наблюдаю на xp sp2
     
  3. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Только по запросу остановки сервиса.
    DriverUnload может быть ты имел в виду? Нет, не сможет.
    IopLoadUnloadDriver - внутренняя функция винды, которая вызывается при запуске и остановке сервиса и она соответственно либо загружает либо выгружает драйвер. Ни о какой перезагрузке речи не идет, ты не правильно понял название.
     
  4. vlaman

    vlaman New Member

    Публикаций:
    0
    Регистрация:
    6 ноя 2004
    Сообщения:
    49
    Great спасибо! ну а можно ли завершить драйвер, если DriverUnload не указан, не стандартным путём?
     
  5. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Ну во-первых, если драйвер создал или занял какие-то ресурсы, их нужно освободить.
    Можно найти его DRIVER_OBJECT, записать в поле DriverUnload указатель на свою функцию и тогда выгрузка пройдет нормально, только если твоя DriverUnload правильно освободит всё то, что понасоздавал драйвер:
    Нужно освободить всю выделенную в пулах память (ExFreePool), нужно удалить все символические ссылки, созданные драйвером (IoDeleteSymbolicLink), нужно удалить все устройства, которые создал драйвер (IoDeleteDevice).. пожалуй, всё, для "обычного" драйвера.
    Учти, что если ты не удалишь девайс, то любое обращение к нему после выгрузки драйвера мгновенно уронит систему в синий экран. Поэтому нужно освободить ВСЕ, что драйвер создал/выделил.
    Обычно это процесс весьма трудоемкий, если драйвер писал не ты и ты не знаешь, что там происходит. Хотя, если требуется срочная выгрузка, можно обойтись IoDeleteSymbolicLink / IoDeleteDevice, только вот последствия предсказать трудно. Если система не рухнет, то нестабильная работа и тормоза весьма вероятны.

    Короче, если драйвер выгрузку не поддерживает, лучше насильно его не выгружать
     
  6. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    ЗЫ. Я не имел в виду PnP-драйвера, с ними ситуация немного другая.
     
  7. Error_Log

    Error_Log New Member

    Публикаций:
    0
    Регистрация:
    2 сен 2005
    Сообщения:
    18
    Адрес:
    Украина
    И еще: если драйвер расставлял на себя хуки, есть определенный, хоть и не большой риск, что система упадет после выгрузки драйвера, даже если все хуки снять. Один из потоков мог прервать свое исполнение внутри обработчика хука, расположенного в теле драйвера; соотв-нно если выгрузить драйвер, когда тот поток получит управление все упадет в голубой экран. Если есть большая необходимость выгружать его - нужно как минимум после снятия хуков выдержать какое-то время перед выгрузкой, но лучше вообще не выгружать.
     
  8. vlaman

    vlaman New Member

    Публикаций:
    0
    Регистрация:
    6 ноя 2004
    Сообщения:
    49
    ясно, всем спасибо ! :)
     
  9. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    Нормальный драйвера, если используют хуки, то юзают и объекты синхронизации(семафоры например), чтобы была возможность выгружатся.
     
  10. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    а вдруг мы выгружаем не "нормальный" драйвер?))
     
  11. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    Это уже пошла конкретика, надо знать, с какими драйверами работает топикстартер.
     
  12. Nouzui

    Nouzui New Member

    Публикаций:
    0
    Регистрация:
    17 ноя 2006
    Сообщения:
    856
    да как вообще его выгрузишь без DrriverUnload?
    убить из списков и MmUnmapViewInSystemSpace? или там вовсе не "View"?
     
  13. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    свою назначить.
     
  14. Nouzui

    Nouzui New Member

    Публикаций:
    0
    Регистрация:
    17 ноя 2006
    Сообщения:
    856
    блин..
     
  15. W4FhLF

    W4FhLF New Member

    Публикаций:
    0
    Регистрация:
    3 дек 2006
    Сообщения:
    1.050
    Nouzui

    Давно флудеров подобных тебе не наблюдал на этом форуме. По-моему ты путаешь форум с чатом или irc.
     
  16. Nouzui

    Nouzui New Member

    Публикаций:
    0
    Регистрация:
    17 ноя 2006
    Сообщения:
    856
    с аськой
     
  17. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    ну вот пускай он отпишется, что за зверя он собрался выгружать
     
  18. vlaman

    vlaman New Member

    Публикаций:
    0
    Регистрация:
    6 ноя 2004
    Сообщения:
    49
    драйвер не нормальный, скорей всего хучит какие-нить хандлеры и перехватывает системные сервисы. сервисы то легко восстановить, а вот остальное.
     
  19. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    vlaman
    IDA в руки.
     
  20. k3internal

    k3internal New Member

    Публикаций:
    0
    Регистрация:
    11 янв 2007
    Сообщения:
    607
    <драйвер не нормальный, скорей всего хучит какие-нить хандлеры и перехватывает системные сервисы. сервисы то легко восстановить, а вот остальное.
    >

    Хм, я бы пошел другим путём, чем пытался бы его выгрузить. Например, остановить все системные потоки данного драйвера если он их создал и восстановил перехваченные им функции. Если юзает таймера, то поискал бы в объекте драйвера apc объект и уничтожил или по таймерам прошёлся, убил их. Вычищать под ним память не стал бы, всё же меньше вероятность, что система далее рухнет.