Фильтр драйвер PS/2 "застревает" при перезагрузке системы.

Тема в разделе "WASM.NT.KERNEL", создана пользователем katrus, 29 июн 2009.

  1. katrus

    katrus New Member

    Публикаций:
    0
    Регистрация:
    7 мар 2007
    Сообщения:
    612
    Следующая проблема - есть фильтр драйвер, цепляемый к стеку PS/2 с помощью IoAttachDeviceToDeviceStack. Все MJ функции просто вызывают следующий драйвер, т.е.:
    Код (Text):
    1. NTSTATUS pass_through(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
    2. {  
    3.     PDEVICE_EXTENSION KeyExtension = (PDEVICE_EXTENSION)DeviceObject->DeviceExtension;    
    4.     IoSkipCurrentIrpStackLocation(Irp);
    5.     return IoCallDriver(TargetDevice, Irp);
    6. }
    Такой драйвер не дает системе нормально перезагружается. Система оснанвливается в "Windows is shutting down ...". Что интересно - это происходит только на ХР. Vista и Win7 перегружаются нормально.
     
  2. x64

    x64 New Member

    Публикаций:
    0
    Регистрация:
    29 июл 2008
    Сообщения:
    1.370
    Адрес:
    Россия
    Уверен в этом? Ни с того ни с сего фильтр не может мешать системе, тем более если это пустой фильтр.
     
  3. katrus

    katrus New Member

    Публикаций:
    0
    Регистрация:
    7 мар 2007
    Сообщения:
    612
    Происходит очень стабильно: если установлен фильтр - система не перегружается. Еще нашел, что если функция IRP_MJ_POWER в фильтре установлена в NULL, система перегружается нормально, но иногда (редко) виден BSOD в процессе перезапуска. Минидампа нет

    Подсмотрел, в ДДК kbfiltr, что IRP_MJ_POWER перехватывается, и делает следующее:
    Код (Text):
    1. PoStartNextPowerIrp(Irp);
    2. IoSkipCurrentIrpStackLocation(Irp);
    3. return PoCallDriver(KeyExtension->TargetDevice, Irp);
    Попробовал сделать то-же самое. В отладчике вижу, что мой обработчик IRP_MJ_POWER, но система продолжает зависать
     
  4. x64

    x64 New Member

    Публикаций:
    0
    Регистрация:
    29 июл 2008
    Сообщения:
    1.370
    Адрес:
    Россия
    Нельзя так делать, в общем случае если фильтруешь физическое устройство (а клавиатура именно такое устройство и есть), то и все запросы, относящиеся непосредственно к железу, следует обрабатывать. К таким запросам относятся IRP_MJ_POWER, IRP_MJ_PNP и некоторые другие (кстати, что там у тебя с IRP_MJ_PNP?). IRP_MJ_SHUTDOWN тоже не помешает обрабатывать.

    Тут всё правильно, так и надо.