Есть драйвер фильтр мыши. IRP_MJ_READ он обрабатывает не посылая запроса mouclass. Есть другой поток, который переодически опрашивает mouclass. Драйвер и PnP работают как часы. Теперь проблема: Завершаю работу, ... но после того, как закриваются все приложения, завершение работы прекращается, мышь движется. Только если вытяну мышку, то винда выключиться. Мне кажется, что проблема в том, что мой поток продолжает опрашивать mouclass, если вытянуть мышку, то обработчик IRP_MN_SURPRISE_REMOVAL его завершает. Так как мне позволить винде выключиться, если при выключении: - запросов типа IRP_MN_STOP_DEVICE не поступает - mouclass потоку ничего нового не возвращает - Unload-routine не вызываеться - IRP_MJ_SHUTDOWN поступает только тогда, когда я вытяну мышку и винда продолжит завершаться, а до этого тишина. Спасибо Вам за попощь.
invoke ControlService,hService,SERVICE_CONTROL_STOP,addr _ss на сколько я понял из вопроса, скорее всего тебе именно это надо ...
Нет не то. Постараюсь кратко: Делаю "Пуск => Выключить компютер", Windows не хочет завершаться(вероятную причину я изложил выше). Вытаскиваю мышку => Посколько драйвер PnP, то он тихо останавливается => Windows выключаеться. Не буду же я перед каждим выключением вызывать ControlService, или доставать мышу. Нужно чтобы драйвер как-то сам среагировал на выключение. А никаких IRP_MN_STOP_DEVICE не поступает Возможно есть что-то чего я не знаю
Я бы попробовал порыть в двух направлениях: 1. mouclass является так называемым "power policy owner" для девайса "мышь". Он должен особым образом обработать IRP_MN_SET_POWER. Кажись, пока он его правильно не обработает диспетчер питания будет ждать. Т.к. твой фильтр сидит над mouclass, возможно он как-то нарушает его работу. 2. mouclass практически всегда имеет хотя бы один незавершенный IRP_MJ_READ, т.к. csrss постоянно его ими нагружает. Возможно, все незавершённые IRP должны быть завершены/отменены и твой фильтр как-то этому препятствует. Ясно одно - твой драйвер каким-то образом нарушает нормальную работу мышиного стека. Возьми исходники mouclass, понавтыкай DbgPrint'ов. Может что-то прояснится.
Нашел! CSRSS ждет от mouclass(точнее от моего фильтра) STATUS_PENDING и лишь потом завершаеться. И не важно обработается потом все-таки этот IRP или нет. В принципе в этом есть какая-то логика. Это мне удалось выяснить с помощю чуда под иминем SoftIce. Несколько манипуляций с памятью и кодом(забивать свои инструкции NOP-ами экстра-удобно). Спасибо за помощь. PS. Если посмотреть на MouseClassRead, то можна увидить, что если запрос корректный, то она поместит IRP в очередь незавершиных пакетов и вернет STATUS_PENDING, ... НО, если очередь необработаных пакетов пуста(а даные от мыши есть), то диспечер ввода-вывода все-же умудряется вернуть STATUS_SUCCESS.