Как правильно подключить callback на подключение PNP устройства? В моем конкретном случае это синезубая клавиатура.
Думаю, стоит написать WDM-фильтр для класса клавиатур. В качестве колбека задействовать функцию AddDevice() своего драйвера - она вызывается по стеку аналогично пакетам запросов ввода/вывода (IRP), т.е. от верхних драйверов (например, фильтры) к нижнему (обычно это непосредственно физическое устройство).
К сожалению в WDM откровенно слаб (надеюсь в скором времени восполнить пробелы). Можно ли зарегитрировать свой драйвер на класс усторйств без прописывания его в UpperFilters в регистре? В прошлом несколько раз сталкивался с неприятной ситуацией, когда драйвер удален с диска, но зарегитрирован в UpperFilters. Хотелось бы сделать драйвер максимальным образом self-contained.
Скорее всего должно подойти, но делаю, что то типа: Код (Text): IoRegisterPlugPlayNotification( EventCategoryHardwareProfileChange, PNPNOTIFY_DEVICE_INTERFACE_INCLUDE_EXISTING_INTERFACES, (PVOID)&GUID_DEVINTERFACE_HID, // или GUID_DEVINTERFACE_KEYBOARD DriverObject, KeyboardClassPlugPlayNotification, NULL, &TargetNotifyHandle); Функция возвращает STATUS_SUCCESS, но когда включаю/выключаю USB клавиатуру, KeyboardClassPlugPlayNotification не вызывается.
Вообще-то это не совсем то, что тебе нужно. Для EventCategoryDeviceInterfaceChange там сказано: Т.е. если я всё правильно понял, то может получится такая ситуация, что интерфейс положим будет удалён, но девайс всё ещё будет присутствовать в системе. Я в эти тонкости не вникал, поэтому настоятельно советую поэкспериментировать с этим колбеком, а лучше всего сразу переписать под WDM-фильтр - это решение, во всяком случае, стабильно совершенно точно.
Дело в том, что есть необходимость оставить систему в работоспособном состоянии, даже если драйвер был физически удален. Несколько раз сталкивался с неприятной ситуацией когда остается регистрация в UpperFilters а драйвера нет.
Подобная проблема может возникнуть только для boot-фильтров. Клавиатуры это явно не тот случай, т.е. проблем как бы и не должно быть.
Может и не должно, но проблема есть. Попробуй добавить в HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Class\{4D36E96B-E325-11CE-BFC1-08002BE10318}\UpperFilters какой нибудь несуществующий драйвер. После рестарта первое-же нажатие на любую клавишу замораживает систему.
Мне лень. Возьми отладчик, посмотри где висит. В гуглогруппах можно поискать, на MSDN-овских форумах что-нибудь. Я вот сейчас мельком глянул, да, люди пишут, что драйвер физического девайса реально может не запуститься в случае ошибки фильтра. Но мне всё таки кажется, что здесь должно быть какое-то просто решение проблемы. В поиск!
не замораживает, просто клавиатура перестает работать. Был у меня такой драйверок, когда стирали этот ключ - помогала правка через удаленный реестр. Иногда, правда, помогало переподключение клавиатуры.