2016-08-05 13 views
0

Я изучаю образец кода Microsoft Toaster от WDK7, и я нахожу тонкую проблему.Как отличить devmgmt's Disable and Uninstall от моего кода драйвера Windows?

Теперь пытается скомпилированные драйвера (WDM busenum и WDM featured1) на Windows 7.

Как руководствоваться README, enum -p 1 добавляет тостер устройства, а затем, я открываю диспетчер устройств (devmgmt), найти устройство, Удалите.

Uninstall toaster device from devmgmt.msc

Это уничтожит тостера devnode (я считаю); мы видим, что узел ToasterDevice01 теперь исчезает из диспетчера устройств. !devnode 0 1 показывает, что тостер devnode все еще существует, с State = DeviceNodeUninitialized (0x301), Предыдущее состояние = DeviceNodeRemoved (0x312).

Затем я выполняю команду enum -p 1, пытаясь добавить устройство снова. Но я получил ошибку 0x57 (ERROR_INVALID_PARAMETER).

enum -p 1 , got 0x57 error

отлаживать исходный код и определить причину: buspdo.c не различает между операцией Отключить и Uninstall devmgmt в. Его код логика:

  • Если тостер получает сюрприз-удалены (enum -u 1), он вызывает Bus_DestroyPdo() которое правильное поведение.
  • Если тостер отключен от devmgmt, то не звоните Bus_DestroyPdo(), что также является правильным.

Проблема заключается в, когда конечный пользователь выполняет Удалить из devmgmt, то Отключить путь. Сейчас происходит что-то плохое: Windows удаляет тостер devnode, но драйвер шины тостера не уничтожает соответствующий PDO, поэтому, когда в следующий раз пользователь выполнит enum -p 1, драйвер шины тостера Bus_PlugInDevice() обвиняет, что устройство тостера с SerialNo == 1 уже существует и, следовательно, сбой запроса пользователя.

enter image description here

КСТАТИ: KMDF версия тостера в проявляет подобную проблему (только статическое перечисление версии пытались сегодня)

Теперь мой вопрос ясен: Как можно отличить от Disable и Uninstall, я буду делать это в драйвер шины или драйвер дочернего устройства? Ответ на версию KMDF также приветствуется.

+0

Действительно ли devnode разрушен? Я думаю, что он все еще может существовать, поскольку существует PDO (PDO содержит ссылку на соответствующий devnode).Образец ведет себя одинаково, когда вы отключите, а затем включите устройство через диспетчер устройств. –

+0

Пожалуйста, скажите мне способ (например, какую-нибудь полезную утилиту), которая может проверить, существует ли devnode, спасибо. –

+0

Я не знаю ни одного инструмента, способного это сделать. Вы можете использовать мой инструмент (https://github.com/MartinDrab/VrtuleTree/releases), чтобы проверить, присутствует ли PDO после удаления (https://github.com/MartinDrab/VrtuleTree/releases-File-> Create snapshot и ищите \ Driver \ <имя тостера>). Ядро, кажется, удаляет структуру devnode при удалении PDO. –

ответ

0

Теперь я могу сделать вывод. Наш клиентский драйвер НЕ может отличить Disable и Uninstall от Диспетчера устройств. Это дизайн Microsoft.

Чтобы сделать отличия, нам нужна помощь с прикладного уровня. Предоставьте CoInstaller для дочернего устройства и, когда CoInstaller получит уведомление DIF_REMOVE (это результат devmgmt, выполняющего удаление), отправьте пользовательский IOCTL (например, IOCTL_UNPLUG_MY_CHILD) в драйвер ядра, чтобы драйвер ядра отключил соответствующий дочерний элемент.

 Смежные вопросы

  • Нет связанных вопросов^_^