J'étudie le code d'exemple de Microsoft Toaster de WDK7, et je trouve un problème subtil.Comment faire pour distinguer devmgmt Disable et désinstaller à partir de mon code de pilote Windows?
maintenant essayer les pilotes compilés (WDM busenum et featured1 WDM) sur Windows 7.
Guidés par README, enum -p 1
ajoute un dispositif de grille-pain, puis, j'ouvre le gestionnaire de périphériques (de devmgmt), trouver le périphérique, Désinstallez il.
Cela va détruire le devnode grille-pain (je crois);
nous pouvons voir que le nœud ToasterDevice01 disparaît maintenant du Gestionnaire de périphériques. !devnode 0 1
montre que le devnode du toaster existe toujours, avec State = DeviceNodeUninitialized (0x301), Previous State = DeviceNodeRemoved (0x312).
Ensuite, j'exécute enum -p 1
en essayant d'ajouter à nouveau le périphérique. Mais j'ai l'erreur 0x57 (ERROR_INVALID_PARAMETER).
déboguer le code source et identifier la raison: buspdo.c
ne fait pas la distinction entre l'opération Désactiver et désinstallation de devmgmt. Sa logique de code est:
- Si un grille-pain devient surprise retirée (
enum -u 1
), il appelleBus_DestroyPdo()
qui est un comportement correct. - Si le grille-pain est désactivé par devmgmt, il le fait et non appel
Bus_DestroyPdo()
, ce qui est également correct.
Le problème est, quand un utilisateur final exécute désinstallation de devmgmt, il suit le chemin Disable. Quelque chose de mal arrive maintenant: Windows supprime le devnode grille-pain, mais le pilote du bus grille-pain ne détruit pas le PDO correspondant, donc, lorsque l'utilisateur suivant exécute enum -p 1
, le pilote du bus grille-pain Bus_PlugInDevice()
blâme que le périphérique grille-pain avec SerialNo == 1 existe déjà et donc Échec de la demande de l'utilisateur.
BTW: version KMDF Toaster présente des problèmes similaires (seule version statique énumération essayé aujourd'hui)
Maintenant, ma question est claire: Comment puis-je distinguer de désactiver et désinstaller, je dois faire en pilote de bus ou pilote de périphérique enfant? Réponse pour la version KMDF est également la bienvenue.
Le devnode est-il vraiment détruit? Je pense qu'il peut encore exister puisque le PDO existe (le PDO contient une référence à devnode coresponding).L'échantillon se comporte-t-il de la même manière lorsque vous le désactivez, puis activez le périphérique via le Gestionnaire de périphériques. –
S'il vous plaît dites-moi un moyen (comme un utilitaire d'achat d'actions) qui est en mesure de vérifier si un déviode existe, merci. –
Je ne connais aucun outil capable de faire cela. Vous pouvez utiliser mon outil (https://github.com/MartinDrab/VrtuleTree/releases) pour vérifier si le PDO est présent après la désinstallation (https://github.com/MartinDrab/VrtuleTree/releases - Fichier -> Créer un instantané) et cherchez le \ Driver \). Le noyau semble supprimer la structure devnode lors de la suppression du PDO. –