Следующая проблема - есть фильтр драйвер, цепляемый к стеку PS/2 с помощью IoAttachDeviceToDeviceStack. Все MJ функции просто вызывают следующий драйвер, т.е.: Код (Text): NTSTATUS pass_through(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp) { PDEVICE_EXTENSION KeyExtension = (PDEVICE_EXTENSION)DeviceObject->DeviceExtension; IoSkipCurrentIrpStackLocation(Irp); return IoCallDriver(TargetDevice, Irp); } Такой драйвер не дает системе нормально перезагружается. Система оснанвливается в "Windows is shutting down ...". Что интересно - это происходит только на ХР. Vista и Win7 перегружаются нормально.
Происходит очень стабильно: если установлен фильтр - система не перегружается. Еще нашел, что если функция IRP_MJ_POWER в фильтре установлена в NULL, система перегружается нормально, но иногда (редко) виден BSOD в процессе перезапуска. Минидампа нет Подсмотрел, в ДДК kbfiltr, что IRP_MJ_POWER перехватывается, и делает следующее: Код (Text): PoStartNextPowerIrp(Irp); IoSkipCurrentIrpStackLocation(Irp); return PoCallDriver(KeyExtension->TargetDevice, Irp); Попробовал сделать то-же самое. В отладчике вижу, что мой обработчик IRP_MJ_POWER, но система продолжает зависать
Нельзя так делать, в общем случае если фильтруешь физическое устройство (а клавиатура именно такое устройство и есть), то и все запросы, относящиеся непосредственно к железу, следует обрабатывать. К таким запросам относятся IRP_MJ_POWER, IRP_MJ_PNP и некоторые другие (кстати, что там у тебя с IRP_MJ_PNP?). IRP_MJ_SHUTDOWN тоже не помешает обрабатывать. Тут всё правильно, так и надо.