Завершение работы драйвера

Тема в разделе "WASM.WIN32", создана пользователем wish3, 15 май 2005.

  1. wish3

    wish3 New Member

    Публикаций:
    0
    Регистрация:
    31 янв 2005
    Сообщения:
    29
    Адрес:
    Ukraine
    Есть драйвер фильтр мыши. IRP_MJ_READ он обрабатывает не посылая запроса mouclass. Есть другой поток, который переодически опрашивает mouclass. Драйвер и PnP работают как часы. Теперь проблема:

    Завершаю работу, ... но после того, как закриваются все приложения, завершение работы прекращается, мышь движется.

    Только если вытяну мышку, то винда выключиться.

    Мне кажется, что проблема в том, что мой поток продолжает опрашивать mouclass, если вытянуть мышку, то обработчик IRP_MN_SURPRISE_REMOVAL его завершает.

    Так как мне позволить винде выключиться, если при выключении:

    - запросов типа IRP_MN_STOP_DEVICE не поступает

    - mouclass потоку ничего нового не возвращает

    - Unload-routine не вызываеться

    - IRP_MJ_SHUTDOWN поступает только тогда, когда я вытяну мышку и винда продолжит завершаться, а до этого тишина.

    Спасибо Вам за попощь.
     
  2. TermoSINteZ

    TermoSINteZ Синоби даоса Команда форума

    Публикаций:
    2
    Регистрация:
    11 июн 2004
    Сообщения:
    3.552
    Адрес:
    Russia
    invoke ControlService,hService,SERVICE_CONTROL_STOP,addr _ss



    на сколько я понял из вопроса, скорее всего тебе именно это надо ...
     
  3. wish3

    wish3 New Member

    Публикаций:
    0
    Регистрация:
    31 янв 2005
    Сообщения:
    29
    Адрес:
    Ukraine
    Нет не то.

    Постараюсь кратко:



    Делаю "Пуск => Выключить компютер", Windows не хочет завершаться(вероятную причину я изложил выше).



    Вытаскиваю мышку => Посколько драйвер PnP, то он тихо останавливается => Windows выключаеться.



    Не буду же я перед каждим выключением вызывать ControlService, или доставать мышу. Нужно чтобы драйвер как-то сам среагировал на выключение.

    А никаких IRP_MN_STOP_DEVICE не поступает :dntknw:

    Возможно есть что-то чего я не знаю
     
  4. Four-F

    Four-F New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2002
    Сообщения:
    1.237
    Я бы попробовал порыть в двух направлениях:



    1. mouclass является так называемым "power policy owner" для девайса "мышь". Он должен особым образом обработать IRP_MN_SET_POWER. Кажись, пока он его правильно не обработает диспетчер питания будет ждать. Т.к. твой фильтр сидит над mouclass, возможно он как-то нарушает его работу.



    2. mouclass практически всегда имеет хотя бы один незавершенный IRP_MJ_READ, т.к. csrss постоянно его ими нагружает. Возможно, все незавершённые IRP должны быть завершены/отменены и твой фильтр как-то этому препятствует.



    Ясно одно - твой драйвер каким-то образом нарушает нормальную работу мышиного стека. Возьми исходники mouclass, понавтыкай DbgPrint'ов. Может что-то прояснится.
     
  5. wish3

    wish3 New Member

    Публикаций:
    0
    Регистрация:
    31 янв 2005
    Сообщения:
    29
    Адрес:
    Ukraine
    Нашел!

    CSRSS ждет от mouclass(точнее от моего фильтра:)) STATUS_PENDING и лишь потом завершаеться. И не важно обработается потом все-таки этот IRP или нет. В принципе в этом есть какая-то логика.

    Это мне удалось выяснить с помощю чуда под иминем SoftIce.

    Несколько манипуляций с памятью и кодом(забивать свои инструкции NOP-ами экстра-удобно).

    Спасибо за помощь.

    PS. Если посмотреть на MouseClassRead, то можна увидить, что если запрос корректный, то она поместит IRP в очередь незавершиных пакетов и вернет STATUS_PENDING, ... НО, если очередь необработаных пакетов пуста(а даные от мыши есть), то диспечер ввода-вывода все-же умудряется вернуть STATUS_SUCCESS.