Contrôle de l’état d’une cible d’E/S générale
Vous pouvez visualiser les objets cibles d’E/S comme ayant deux portes : une entrée et une porte d’entrée. La porte d’accès sortante contrôle quand l’infrastructure remet une requête à l’objet d’appareil cible, tandis que le contrôle d’entrée lorsqu’une demande est autorisée à entrer la cible d’E/S.
L’infrastructure définit les états suivants pour les cibles d’E/S générales :
Commencé
Les deux portes de l’objet cible d’E/S sont ouvertes. Le pilote peut envoyer des demandes d’E/S à la file d’attente cible d’E/S, et l’infrastructure remet les requêtes au pilote approprié.
Arrêté
La porte d’entrée de la cible d’E/S est ouverte, mais la porte d’entrée est fermée. L’infrastructure cesse de remettre les requêtes au pilote approprié. Pour envoyer des demandes d’E/S à la cible d’E/S, le pilote doit définir WDF_REQUEST_SEND_OPTION_IGNORE_TARGET_STATE ou WDF_REQUEST_SEND_OPTION_SEND_AND_FORGET dans la structure WDF_REQUEST_SEND_OPTIONS de chaque requête.
Purgé
Les deux portes de l’objet cible d’E/S sont fermées. Le pilote ne peut pas envoyer de demandes d’E/S à la cible d’E/S, sauf s’il définit WDF_REQUEST_SEND_OPTION_IGNORE_TARGET_STATE ou WDF_REQUEST_SEND_OPTION_SEND_AND_FORGET. En outre, l’infrastructure annule les requêtes non traitées dans la file d’attente interne de l’objet cible d’E/S. Cet état est disponible à partir de KMDF version 1.11.
Fermé pour requête-suppression
Une cible d’E/S distante est temporairement fermée, car son appareil pourrait bientôt être supprimé.
Fermé
La cible d’E/S est fermée et ne peut pas être démarrée ou arrêtée.
Supprimé
L’appareil de la cible d’E/S a été supprimé.
L’énumération WDF_IO_TARGET_STATE définit les valeurs qui représentent ces états. Votre pilote peut appeler WdfIoTargetGetState pour obtenir l’état d’une cible d’E/S.
États cibles d’E/S locaux
L’infrastructure s’ouvre et démarre automatiquement les cibles d’E/S locales.
Si nécessaire, le pilote peut appeler WdfIoTargetStop pour arrêter temporairement une cible d’E/S locale et appeler WdfIoTargetStart pour la redémarrer. Par exemple, le pilote peut arrêter une cible d’E/S locale s’il détecte une condition d’erreur temporaire, puis redémarrer la cible d’E/S si la condition d’erreur est corrigée.
Dans KMDF version 1.11 et ultérieure, le pilote peut appeler WdfIoTargetPurge pour empêcher temporairement les demandes d’E/S d’être envoyées à une cible d’E/S locale et pour annuler les demandes non traitées dans la file d’attente de la cible. Par exemple, dans le cadre du nettoyage du handle de fichier, un pilote peut vider une cible d’E/S locale pour s’assurer que toutes les demandes envoyées au pilote sont annulées.
Si l’appareil d’une cible d’E/S locale est supprimé, l’infrastructure arrête et ferme automatiquement la cible d’E/S et annule toutes les demandes d’E/S qui se trouvent dans la file d’attente de la cible. L’infrastructure avertit le pilote que l’appareil n’est plus disponible en appelant des fonctions de rappel d’événement d’objet d’appareil. Pour plus d’informations sur ces fonctions de rappel, consultez Scénarios PnP et gestion de l’alimentation.
États cibles d’E/S distants
Les pilotes doivent appeler WdfIoTargetOpen pour ouvrir des cibles d’E/S distantes. Lorsqu’un pilote ouvre une cible d’E/S distante, l’infrastructure démarre automatiquement la cible d’E/S.
Si nécessaire, le pilote peut appeler WdfIoTargetStop pour arrêter temporairement une cible d’E/S distante et appeler WdfIoTargetStart pour le redémarrer.
Dans KMDF version 1.11 et ultérieures, le pilote peut appeler WdfIoTargetPurge pour empêcher temporairement les demandes d’E/S d’être envoyées à une cible d’E/S distante et pour annuler les demandes non traitées dans la file d’attente de la cible.
Si l’appareil d’une cible d’E/S distante est supprimé, l’infrastructure arrête et ferme automatiquement la cible d’E/S et annule toutes les demandes d’E/S qui se trouvent dans la file d’attente de la cible, sauf si le pilote enregistre les fonctions de rappel d’événements suivantes :
EvtIoTargetQueryRemove
Informe le pilote que l’appareil d’une cible d’E/S distante peut être supprimé. Votre pilote doit appeler WdfIoTargetCloseForQueryRemove si vous souhaitez que le pilote autorise la suppression de l’appareil.
EvtIoTargetRemoveComplete
Informe le pilote que l’appareil d’une cible d’E/S distante a été supprimé. Cette fonction de rappel doit appeler WdfIoTargetClose.
EvtIoTargetRemoveCanceled
Informe le pilote qu’une tentative de suppression de l’appareil d’une cible d’E/S distante a été annulée. Cette fonction de rappel doit appeler WdfIoTargetOpen, et le pilote appelle généralement WDF_IO_TARGET_OPEN_PARAMS_INIT_REOPEN pour initialiser sa fonction WDF_IO_TARGET_OPEN_PARAMS_INIT.
Si un pilote a terminé d’utiliser une cible d’E/S distante et n’utilisera plus la cible, et que la cible n’a pas d’objets de requête enfant qui sont toujours en attente, le pilote peut appeler WdfObjectDelete sans appeler d’abord WdfIoTargetClose. Si la cible a des objets de requête enfants qui sont toujours en attente, le pilote doit appeler WdfIoTargetClose pour pouvoir appeler WdfObjectDelete en toute sécurité.