Partager via


Power IRPs pour le système

Un IRP d’alimentation système 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 SystemPowerState dans le membre Power.Type de la pile IRP. Seul le gestionnaire d’alimentation peut envoyer un tel IRP ; un pilote ne peut pas envoyer un IRP d’alimentation système.

Le gestionnaire d’alimentation envoie un IRP d’alimentation système pour l’une des raisons suivantes :

  • Pour modifier l’état d’alimentation du système en réponse à un délai d’inactivité, à une modification de l’activité du système, à une demande de l’utilisateur ou à une batterie arrivant à expiration (IRP_MN_SET_POWER)

  • Pour interroger les appareils afin de déterminer si le système peut être en veille (IRP_MN_QUERY_POWER)

  • Pour réaffirmer l’état d’alimentation actuel du système après une requête (IRP_MN_SET_POWER)

Le gestionnaire d’alimentation envoie IRP_MN_QUERY_POWER et IRP_MN_SET_POWER demandes pour le compte du système. Un pilote peut échouer à une demande de IRP_MN_QUERY_POWER , mais ne peut pas échouer IRP_MN_SET_POWER.

Par exemple, pour modifier l’état d’alimentation du système, le gestionnaire d’alimentation envoie un IRP d’alimentation système au pilote supérieur de la pile à chaque nœud de périphérique de l’arborescence de périphériques. La figure suivante montre comment les pilotes d’une seule pile de périphériques gèrent une IRP d’alimentation système.

diagramme illustrant le chemin d’un irp d’alimentation système.

Comme le montre la figure précédente :

  1. Le gestionnaire d’alimentation appelle le gestionnaire d’E/S pour envoyer un IRP d’alimentation système à chaque nœud feuille de l’arborescence de l’appareil.

  2. Les pilotes gèrent l’IRP si possible, définissent des routines IoCompletion si nécessaire et appellent IoCallDriver (Windows 7 et Windows Vista) ou PoCallDriver (Windows Server 2003, Windows XP et Windows 2000) pour transférer l’IRP dans la pile. Si un pilote doit échouer à l’IRP, il le fait immédiatement et termine l’IRP. Les pilotes peuvent échouer IRP_MN_QUERY_POWER irps, mais ne doivent pas échouer IRP_MN_SET_POWER irps qui définissent l’état d’alimentation du système.

  3. Lorsque le pilote propriétaire de la stratégie d’alimentation pour l’appareil reçoit l’IRP, ce pilote définit une routine IoCompletion pour l’IRP système, puis transfère l’IRP.

  4. Tous les autres pilotes de la pile gèrent l’IRP si possible, définissez des routines IoCompletion si nécessaire et transférez l’IRP au pilote inférieur suivant, comme à l’étape 2.

  5. Finalement, le pilote de bus reçoit et termine le IRP système.

  6. Le gestionnaire d’E/S appelle toutes les routines IoCompletion qui ont été définies en tant que pilotes ont passé l’IRP système vers le bas de la pile des appareils.

  7. Dans sa routine IoCompletion , le propriétaire de la stratégie d’alimentation de l’appareil appelle PoRequestPowerIrp pour envoyer un IRP d’alimentation de l’appareil, en spécifiant un état d’alimentation de l’appareil valide pour l’état d’alimentation du système dans l’IRP système. Le pilote définit une routine de rappel à appeler lorsque l’IRP d’alimentation du périphérique se termine.

    Si nécessaire, le pilote consulte le membre DeviceState dans sa copie mise en cache de la structure DEVICE_CAPABILITIES (voir Reporting Device Power Capabilities) pour déterminer quels états d’alimentation des appareils correspondent à l’état d’alimentation du système dans l’IRP.

  8. Une fois que l’IRP de l’appareil est terminé et que toutes les routines d’achèvement IRP d’appareil ont été exécutées, la routine de rappel du propriétaire de la stratégie d’alimentation est appelée. Dans la routine de rappel, le pilote copie ses status retournées dans l’IRP système. Dans Windows Server 2003, Windows XP et Windows 2000, le rappel appelle PoStartNextPowerIrp pour démarrer l’IRP d’alimentation suivante. Toutefois, dans Windows 7 et Windows Vista, l’appel de PoStartNextPowerIrp n’est pas obligatoire et un tel appel n’effectue aucune opération de gestion de l’alimentation. Enfin, le rappel appelle IoCompleteRequest pour terminer l’IRP système.

Pour plus d’informations, consultez Gestion des demandes d’état d’alimentation du système.

Étant donné que certains appareils nécessitent une prise de courant lorsqu’ils sont mis sous tension, les IRP d’alimentation entrantes du système sont gérées de manière synchrone et en série dans tout le système. Un seul de ces IRP peut être actif à la fois. Pour plus d’informations, consultez Appel d’IoCallDriver et Appel de PoCallDriver.