Utilisation de Power-Managed files d’attente d’E/S

Lorsqu’un pilote crée une file d’attente d’E/S, il peut spécifier si la file d’attente est gérée par l’alimentation. Lorsque les demandes d’E/S sont disponibles dans une file d’attente gérée par l’alimentation, l’infrastructure remet les demandes au pilote uniquement si l’appareil est dans son état opérationnel (D0). L’infrastructure n’autorise pas l’appareil à quitter son état de fonctionnement tant que toutes les demandes d’E/S que le framework a remises de la file d’attente gérée par l’alimentation au pilote n’ont pas été terminées, annulées ou reportées.

Pour plus d’informations sur les files d’attente d’E/S gérées par l’alimentation, consultez Gestion de l’alimentation pour les files d’attente d’E/S.

Fonctions de rappel pour les files d’attente Power-Managed

Si votre pilote utilise des files d’attente d’E/S gérées par l’alimentation, il peut fournir deux fonctions de rappel supplémentaires :

EvtIoStop
La fonction de rappel EvtIoStop arrête le traitement d’une demande d’E/S spécifiée. Lorsque l’appareil quitte son état de fonctionnement (D0) ou est supprimé, le framework appelle la fonction de rappel EvtIoStop d’une file d’attente d’E/S une fois pour chaque demande d’E/S que le pilote n’a pas terminée, y compris les demandes que le pilote possède et celles qu’il a transférées à une cible d’E/S.

EvtIoResume
La fonction de rappel EvtIoResume reprend le traitement d’une demande d’E/S précédemment arrêtée. L’infrastructure appelle la fonction de rappel EvtIoResume d’une file d’attente d’E/S lorsqu’elle reprend la remise des demandes d’E/S au pilote à partir de la file d’attente, une fois que l’appareil est revenu à son état de fonctionnement.

Chaque fois que l’infrastructure appelle la fonction de rappel EvtIoStop d’un pilote, la fonction termine ou annule généralement la demande d’E/S, ou appelle WdfRequestStopAcknowledge pour renvoyer la propriété de la demande à l’infrastructure.

Bien que cela soit facultatif, vous devez généralement fournir une fonction de rappel EvtIoStop pour une file d’attente gérée par l’alimentation. En fournissant EvtIoStop, votre pilote peut vous aider à réduire le temps qui s’écoule avant que votre appareil, et éventuellement le système, passe à un état de faible consommation.

Si vous ne fournissez pas EvtIoStop pour une file d’attente gérée par l’alimentation, l’infrastructure attend que toutes les demandes remises de la file d’attente gérée par l’alimentation au pilote soient terminées avant de déplacer le périphérique (ou le système) vers un état d’alimentation inférieur ou de le supprimer. Potentiellement, cette inaction peut empêcher un système d’entrer dans son état de mise en veille prolongée ou d’un autre état de faible alimentation du système. Dans les cas extrêmes, le système peut se bloquer avec le code de vérification d’erreur 9F.

Si votre pilote ne transfère pas les demandes à une cible d’E/S et ne conserve pas les demandes pendant une durée indéterminée, vous pouvez omettre evtIoStop en toute sécurité pour une file d’attente gérée par l’alimentation.

Attente d’objets répartiteurs

En général, les pilotes doivent uniquement utiliser des objets de répartiteur comme mécanismes de synchronisation dans un contexte de thread nonarbitrary.

Étant donné que les gestionnaires de requêtes s’exécutent dans un contexte de thread arbitraire, un gestionnaire de requêtes pour une file d’attente gérée par l’alimentation ne doit pas attendre que les objets de répartiteur du noyau soient définis. Cela peut entraîner un blocage.

Pour plus d’informations sur le moment où un pilote peut attendre des objets de répartiteur et ce qu’il doit faire quand il ne le peut pas, consultez Présentation des objets de répartiteur de noyau.