Partager via


Power IRPs pour les appareils individuels

Un IRP d’alimentation d’appareil spécifie le code IRP principal IRP_MJ_POWER, l’un des codes IRP d’alimentation secondaires répertoriés ci-dessous et la valeur DevicePowerState dans le membre Power.Type .

IRP_MN_QUERY_POWER

IRP_MN_SET_POWER

IRP_MN_WAIT_WAKE

IRP_MN_POWER_SEQUENCE

Tous les pilotes d’une pile de périphériques reçoivent ces irps ; normalement, seul le gestionnaire de stratégie d’alimentation de l’appareil peut envoyer ces IRP. Toutefois, le gestionnaire d’alimentation peut envoyer un IRP d’alimentation d’un appareil lors de la détection d’inactivité pour le compte d’un appareil, comme expliqué dans Utilisation des routines Power Manager pour la détection d’inactivité.

Un pilote envoie un IRP d’alimentation de périphérique pour l’une des raisons suivantes :

  • Pour interroger ou modifier l’état d’alimentation de l’appareil en réponse à un IRP d’alimentation du système

  • Pour mettre l’appareil en veille afin de conserver l’alimentation

  • Pour retourner l’appareil à l’état de fonctionnement une fois qu’il a été en veille

  • Pour permettre à l’appareil de se réveiller en réponse à un signal externe

  • Pour obtenir une valeur de séquence d’alimentation lors de la mise sous tension d’un appareil

La figure suivante montre la séquence d’étapes qui se produisent pour envoyer, transférer et terminer un IRP d’alimentation d’appareil.

diagramme illustrant le chemin d’accès d’un irp d’alimentation d’appareil.

Comme l’illustre la figure précédente, un IRP d’alimentation d’appareil est envoyé, transféré et terminé dans les étapes suivantes :

  1. Le propriétaire de la stratégie d’alimentation de l’appareil appelle PoRequestPowerIrp pour allouer un IRP d’alimentation de l’appareil, en spécifiant l’ADO cible de l’IRP et une routine de rappel à appeler une fois l’IRP terminée.

  2. Le gestionnaire d’alimentation alloue un IRP d’alimentation de périphérique et l’envoie au pilote supérieur de la pile de périphériques pour l’AOP cible.

  3. Le pilote effectue les actions suivantes :

    • Définit une routine IoCompletion si nécessaire.

    • Appelle PoStartNextPowerIrp (Windows Server 2003, Windows XP et Windows 2000) si aucune routine d’achèvement n’est utilisée. À compter de Windows Vista, cet appel n’est pas obligatoire et un tel appel n’effectue aucune opération de gestion de l’alimentation.

    • Appelle IoCallDriver (Windows 7 et Windows Vista) ou appelle PoCallDriver (Windows Server 2003, Windows XP et Windows 2000) pour passer l’IRP au pilote inférieur suivant.

    Chaque pilote de la pile effectue cette opération jusqu’à ce que l’IRP atteigne le pilote de bus. Si un pilote doit échouer à l’IRP, il doit le faire immédiatement et appeler IoCompleteRequest.

  4. Le pilote de bus, qui gère l’AOP de l’appareil, effectue l’action demandée, puis appelle IoCompleteRequest pour terminer l’IRP. Un pilote de bus peut faire échouer une IRP de mise sous tension d’un appareil si un appareil est supprimé ou en cours de suppression.

  5. Le gestionnaire d’E/S appelle les routines IoCompletion qui ont été définies par les pilotes quand ils ont passé l’IRP dans la pile. Une fois toutes les routines IoCompletion appelées, la routine de rappel est exécutée.

Pour plus d’informations sur les irps d’alimentation des appareils, consultez Gestion de l’alimentation pour les appareils individuels et Prise en charge des appareils dotés de fonctionnalités Wake-Up. Pour plus d’informations sur l’IRP de la séquence d’alimentation, consultez IRP_MN_POWER_SEQUENCE.