2016-08-05 1 views
0

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.

Uninstall toaster device from devmgmt.msc

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).

enum -p 1 , got 0x57 error

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 appelle Bus_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.

enter image description here

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.

+0

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. –

+0

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. –

+0

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. –

Répondre

0

Maintenant, je peux faire une conclusion. Notre pilote client ne peut pas distinguer entre Désactiver et Désinstaller du Gestionnaire de périphériques. C'est le design de Microsoft. Pour faire la distinction, nous avons besoin de l'aide de la couche d'application. Fournissez un CoInstaller pour le périphérique enfant et, lorsque le CoInstaller reçoit une notification DIF_REMOVE (cela résulte de la désinstallation de devmgmt), envoyez un IOCTL personnalisé (par exemple IOCTL_UNPLUG_MY_CHILD) au pilote du noyau pour que le pilote du noyau débranche l'enfant correspondant.