Работа с RemoveLock.

Тема в разделе "WASM.WIN32", создана пользователем n0name, 2 дек 2006.

  1. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    При перехвате API через правку SDT. Иногда при выгрузке драйвера возникает BSOD: DRIVER_UNLOADED_WITHOUT_CANCELLING_PENDING_OPERATIONS. Я так понимаю из-за того, что возможно не все потоки завершенны к данному времени. Чтобы избежать этой ошибки я использую RemoveLock'и. При выгрузке драйвера вызываю IoReleaseRemoveLockAndWait. Если на данный момент счетчик Lock'ов 0, то вылетает BSOD с BAD_POOL_CALL. Поэтому приходиться вызывать перед ним IoAcquireRemoveLock. Но мне кажется что это как то криво. В чём дело?
     
  2. Four-F

    Four-F New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2002
    Сообщения:
    1.237
    Несмотря на имя, RemoveLock не для защиты от выгрузки драйвера, а для предотвращения посылки драйвером IRP вниз по стеку. Если драйвер сам по себе, т.е. не садится в какой-то стек, как, видимо, и есть в данном случае, использование RemoveLock не имеет никакого смысла.
     
  3. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    Four-F
    ну это есстественно =)
    Просто как мне показалось это наиболее простой способ проконтролировать выгрузку драйвера, чтобы не осталось никаких "worker thread". Буду благодарен если подскажешь более простой способ.
     
  4. Four-F

    Four-F New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2002
    Сообщения:
    1.237
    Я не спец в хуке SDT, и даже не интересующийся ;) Просто указал на то, что RemoveLock на самом деле не то что кажется. А самый простой общий способ не дать выгрузить драйвер:

    pDriverObject->DriverUnload = NULL;
     
  5. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    Ну это тоже понятно. Дело в том, что я как раз и хочу выгрузить драйвер =) Только без BSOD'a.
    Ну это и не надо =) Суть в том что к моменту выгрузки могут быть запущено несколько потоков, и мне надо дождаться их заверщения.
     
  6. Four-F

    Four-F New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2002
    Сообщения:
    1.237
    Всё равно штука это специфичная и мне всё равно нечего сказать умного ;)

    IMHO, должно быть уже много чего понаклёпано/понаписано по этой теме - поищи готовое.
     
  7. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    Ни у кого не нашёл, все надеются на лучшее =)
     
  8. Nouzui

    Nouzui New Member

    Публикаций:
    0
    Регистрация:
    17 ноя 2006
    Сообщения:
    856
    а что именно криво? вызывать IoReleaseRemoveLockAndWait или IoAcquireRemoveLock перед ним? если второе - то так просто сделано в микрософте. я обычно вызываю IoAcquireRemoveLock сразу после IoInitializeRemoveLock, чтобы потом не вспоминать ))
     
  9. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    хе. ну и ладно :-J
     
  10. katrus

    katrus New Member

    Публикаций:
    0
    Регистрация:
    7 мар 2007
    Сообщения:
    612
    Обнаружил сходную проблему - поэтому поднял старую тему.
    В драйвере я тоже перехватываю несколько ф-ий через SSDT. Для предотвращения проблемы с выгруженными хуками решил поступить максимально просто: при выгрузке драйвера востанавливаю SSDT и ожидаю (KeDelayExecutionThread) несколько секунд. За это время все перехваченные функции должны завершиться.

    Неожиданно обнаружилось, что на машине с касперским такой драйвер бсодит с DRIVER_UNLOADED_WITHOUT_CANCELLING_PENDING_OPERATIONS ssdt (даже когда перед полной выгрузкой драйвера выжидаю 10 секунд), причем делает это весьма нерегулярно.

    Есть ли какое решеие подобной проблеме?