2017-01-11 3 views
1

Je développe un pilote de filtre sous Windows. Le pilote est sensible au PnP pour recevoir des notifications de périphériques et il crée également un périphérique de contrôle pour communiquer avec un service utilisateur associé via des IOCTL. Pour autant que je sache, la durée de vie du pilote est contrôlée par PnP-manager. Le pilote est déchargé après le traitement de la notification de périphérique suivante étant donné qu'à ce moment-là aucun objet de périphérique n'appartient au pilote.Comment arrêter un pilote de filtre Plug-and-Play à la demande?

Ce que je dois faire est d'arrêter le conducteur sur demande, pas quand le périphérique suivant arrive/part. Jusqu'à présent, je ne pense pas que ce soit la façon dont il est censé fonctionner, d'autre part, je ne vois aucune logique qui interdit le déchargement des pilotes de filtre à la demande. J'ai recherché l'envoi de contrôle STOP et je ne vois pas comment cela peut être géré dans un pilote PnP (ne fonctionne que pour les pilotes hérités). À l'heure actuelle, je pense à ajouter un gestionnaire IOCTL spécial, qui fermerait tous les objets de l'appareil. Mais ce n'est pas suffisant, la durée de vie du pilote est gérée par PnP-manager, je dois donc attirer l'attention du manager sur mon chauffeur. Toute aide est appréciée!

Si vous vous demandez, j'ai besoin que le pilote soit stoppable pour que la désinstallation ne nécessite pas de redémarrage.

Répondre

0

WDM Le pilote de filtre attache toujours son propre périphérique à la pile de périphériques. après cela, un autre périphérique peut vous connecter à cette pile - il sera donc connecté à votre appareil. après ce pilote ne peut déjà pas être déchargé du tout. Le pilote ne peut être déchargé que s'il n'y a plus de références DRIVER_OBJECT pour cela, vous devez vous détacher de la pile de l'appareil et détruire tous vos codes DEVICE_OBJECTs. un seul moyen correct pour le pilote de filtre WDM faire cela - quand vous gérez IRP_MN_REMOVE_DEVICE - lire Removing a Device in a Filter Driver ou comme alternative vous pouvez enregistrer FAST_IO_DISPATCH avec FastIoDetachDevice dans le pilote - comme le résultat FastIoDetachDevice sera appelé quand sera appelé IoDeleteDevice pour DeviceObject auquel vous avez joint (ceci est également pendant le processus IRP_MN_REMOVE_DEVICE). à ce moment, vous devez appeler IoDetachDevice et IoDeleteDevice - seulement après cela, votre pilote peut être déchargé et PnP-manager automatiquement faire si plus de DeviceObjects ou d'autres références à votre pilote.

donc une seule option pour décharger le pilote WDM - détruire complètement device stack - toutes les piles ne peuvent pas être arrêtées à l'exécution. mais certains peuvent - par appel CM_Request_Device_Eject - prépare une instance de périphérique local pour une suppression en toute sécurité, si le périphérique est amovible. Si l'appareil peut être physiquement éjecté, ce sera le cas.