Я изучаю образец кода Microsoft Toaster от WDK7, и я нахожу тонкую проблему.Как отличить devmgmt's Disable and Uninstall от моего кода драйвера Windows?
Теперь пытается скомпилированные драйвера (WDM busenum и WDM featured1) на Windows 7.
Как руководствоваться README, enum -p 1
добавляет тостер устройства, а затем, я открываю диспетчер устройств (devmgmt), найти устройство, Удалите.
Это уничтожит тостера devnode (я считаю);
мы видим, что узел ToasterDevice01 теперь исчезает из диспетчера устройств. !devnode 0 1
показывает, что тостер devnode все еще существует, с State = DeviceNodeUninitialized (0x301), Предыдущее состояние = DeviceNodeRemoved (0x312).
Затем я выполняю команду enum -p 1
, пытаясь добавить устройство снова. Но я получил ошибку 0x57 (ERROR_INVALID_PARAMETER).
отлаживать исходный код и определить причину: buspdo.c
не различает между операцией Отключить и Uninstall devmgmt в. Его код логика:
- Если тостер получает сюрприз-удалены (
enum -u 1
), он вызываетBus_DestroyPdo()
которое правильное поведение. - Если тостер отключен от devmgmt, то не звоните
Bus_DestroyPdo()
, что также является правильным.
Проблема заключается в, когда конечный пользователь выполняет Удалить из devmgmt, то Отключить путь. Сейчас происходит что-то плохое: Windows удаляет тостер devnode, но драйвер шины тостера не уничтожает соответствующий PDO, поэтому, когда в следующий раз пользователь выполнит enum -p 1
, драйвер шины тостера Bus_PlugInDevice()
обвиняет, что устройство тостера с SerialNo == 1 уже существует и, следовательно, сбой запроса пользователя.
КСТАТИ: KMDF версия тостера в проявляет подобную проблему (только статическое перечисление версии пытались сегодня)
Теперь мой вопрос ясен: Как можно отличить от Disable и Uninstall, я буду делать это в драйвер шины или драйвер дочернего устройства? Ответ на версию KMDF также приветствуется.
Действительно ли devnode разрушен? Я думаю, что он все еще может существовать, поскольку существует PDO (PDO содержит ссылку на соответствующий devnode).Образец ведет себя одинаково, когда вы отключите, а затем включите устройство через диспетчер устройств. –
Пожалуйста, скажите мне способ (например, какую-нибудь полезную утилиту), которая может проверить, существует ли devnode, спасибо. –
Я не знаю ни одного инструмента, способного это сделать. Вы можете использовать мой инструмент (https://github.com/MartinDrab/VrtuleTree/releases), чтобы проверить, присутствует ли PDO после удаления (https://github.com/MartinDrab/VrtuleTree/releases-File-> Create snapshot и ищите \ Driver \ <имя тостера>). Ядро, кажется, удаляет структуру devnode при удалении PDO. –