IRP_MN_SET_POWER

Cette IRP avertit un pilote d’une modification de l’état d’alimentation du système ou définit l’état d’alimentation d’un appareil.

Code majeur

IRP_MJ_POWER

Date d’envoi

Le gestionnaire d’alimentation système ou le propriétaire d’une stratégie d’alimentation de l’appareil peut envoyer cette IRP.

Le gestionnaire d’alimentation envoie cette IRP pour informer les pilotes d’une modification de l’état d’alimentation du système. Si un pilote a inscrit son appareil pour la détection d’inactivité, le gestionnaire d’alimentation envoie cette IRP pour modifier l’état d’alimentation d’un appareil inactif.

Un pilote propriétaire de la stratégie d’alimentation envoie cette IRP pour définir l’état d’alimentation de son appareil. Un pilote doit appeler PoRequestPowerIrp pour envoyer cette IRP.

Le gestionnaire d’alimentation envoie cette IRP à IRQL = PASSIVE_LEVEL aux piles d’appareils qui définissent l’indicateur de DO_POWER_PAGABLE dans l’AOP. Les pilotes de ces piles peuvent toucher du code paginé ou des données pour terminer la demande.

Le gestionnaire d’alimentation peut envoyer l’IRP à IRQL = DISPATCH_LEVEL si l’indicateur DO_POWER_INRUSH est défini. Ces pilotes ne peuvent pas accéder directement ou indirectement à un code paginé ou à des données.

Paramètres d’entrée

Le membre Parameters.Power.Type spécifie le type d’état d’alimentation défini, SystemPowerState ou DevicePowerState.

Le membre Parameters.Power.State spécifie l’état d’alimentation lui-même, comme suit :

  • Si Parameters.Power.Type est SystemPowerState, la valeur est un énumérateur du type SYSTEM_POWER_STATE .

  • Si Parameters.Power.Type est DevicePowerState, la valeur est un énumérateur du type DEVICE_POWER_STATE .

Le membre Parameters.Power.ShutdownType spécifie des informations supplémentaires sur la transition demandée. Les valeurs possibles pour ce membre sont POWER_ACTION valeurs d’énumération . Pour plus d’informations, consultez System Power Actions.

À compter de Windows Vista, le membre Parameters.Power.SystemPowerStateContext est une structure de SYSTEM_POWER_STATE_CONTEXT en lecture seule partiellement opaque qui contient des informations sur les états d’alimentation système précédents d’un ordinateur. Si Parameters.Power.Type est SystemPowerState et Parameters.Power.State est PowerSystemWorking, deux bits d’indicateur dans cette structure indiquent si un démarrage rapide ou une mise en veille prolongée a provoqué l’entrée de l’ordinateur dans l’état système S0 (fonctionnement). Pour plus d’informations, consultez Distinction du démarrage rapide de la mise en veille prolongée.

Le tableau suivant présente le contenu de IRP_MN_SET_POWER. Parameters.Power. {State| ShutdownType} et les champs bits CurrentSystemState, TargetSystemState et EffectiveSystemState dans la structure SYSTEM_POWER_STATE_CONTEXT pour chaque transition d’alimentation du système. Chaque ligne représente une IRP_MN_SET_POWER.

Transition State Type d’arrêt SystemState actuel SystemState cible Effective SystemState Commentaires
Veillez à... S3 Veille S0 S3 S3
... Réveiller S0 Veille S3 S0 S0
Veille hybride à... S4 Mise en veille prolongée S0 S3 S4 Mise en veille avec le fichier de mise en veille prolongée (Fast S4)
... Réveiller S0 Veille S3 S0 S0
... Wake/PwrLost S0 Veille S4 S0 S0
Mettre en veille prolongée... S4 Mise en veille prolongée S0 S4 S4
... Réveiller S0 Veille S4 S0 S0
Arrêt hybride vers... S4 Mise en veille prolongée S0 S5 S4 Applications fermées, l’utilisateur s’est déconnecté comme s’il s’arrêtait (démarrage en veille prolongée)
... Démarrage rapide S0 Veille S4 S0 S0
Arrêt sur... S5 Shutdown/Reset/Off S0 S5 S5
... Démarrage du système Pas de S-IRP pour le démarrage

Paramètres de sortie

Parameters.Power.SystemContext est réservé à l’utilisation du système.

Bloc d’état E/S

Un pilote définit Irp-IoStatus.Status> sur STATUS_SUCCESS pour indiquer que l’appareil a entré l’état demandé.

Un pilote ne doit pas faire échouer une demande de définition de l’état d’alimentation du système.

Les pilotes de fonction et de filtre situés au-dessus d’un pilote de bus ne doivent pas échouer une demande de définition de l’état d’alimentation d’un appareil. Le pilote de bus peut échouer une demande de mise sous tension de l’appareil si l’appareil est supprimé ou en cours de suppression.

Opération

Le gestionnaire d’alimentation ou un pilote peut demander une IRP_MN_SET_POWER IRP. Le gestionnaire d’alimentation envoie cette IRP pour l’une des raisons suivantes :

  • Pour avertir les pilotes d’une modification de l’état d’alimentation du système

  • Pour modifier l’état d’alimentation d’un appareil pour lequel le gestionnaire d’alimentation effectue la détection inactif

  • Pour réaffirmer l’état actuel du système après l’échec d’un pilote , une IRP_MN_QUERY_POWER demande d’état d’alimentation du système. Pour plus d’informations, consultez IRP_MN_QUERY_POWER.

Un pilote propriétaire de la stratégie d’alimentation de l’appareil envoie IRP_MN_SET_POWER pour modifier l’état d’alimentation de son appareil.

À un moment donné, le système n’autorise qu’un seul de ces IRP à être actif pour chaque objet d’appareil.

Chaque pilote doit passer chaque IRP d’alimentation au pilote inférieur suivant en appelant IoCallDriver (à partir de Windows Vista) ou PoCallDriver (Windows Server 2003, Windows XP et Windows 2000). L’interface PoCallDriver est similaire à celle d’IoCallDriver, sauf que le sous-système de gestion de l’alimentation peut retarder l’IRP avant de le transmettre au pilote suivant. Par exemple, des retards peuvent se produire sur une demande PowerDeviceD0 si l’appareil nécessite un courant d’appel et doit donc être mis sous tension en série avec un autre appareil de ce type.

Une fois qu’un pilote reçoit une demande de IRP_MN_SET_POWER sur Windows Server 2003, Windows XP ou Windows 2000, un pilote doit appeler PoStartNextPowerIrp, comme décrit dans Appel de PoStartNextPowerIrp. À compter de Windows Vista, l’appel de PoStartNextPowerIrp n’est pas obligatoire et un tel appel n’effectue aucune opération de gestion de l’alimentation.

IRP_MN_SET_POWER pour les états d’alimentation du système

Seul le gestionnaire d’alimentation système peut envoyer un IRP set-power.

Un pilote ne doit pas faire échouer une demande de définition de l’état d’alimentation du système.

Dans la mesure du possible, le gestionnaire d’alimentation envoie IRP_MN_QUERY_POWER avant d’envoyer IRP_MN_SET_POWER pour demander un état de mise en veille du système. Toutefois, dans certaines conditions (par exemple, l’utilisateur appuyant sur le bouton Mettre hors tension ou une batterie arrivant à expiration), le gestionnaire d’alimentation peut émettre des IRP_MN_SET_POWER sans interroger d’abord. Le gestionnaire d’alimentation interroge uniquement les états de veille ; il n’interroge jamais avant la mise sous tension.

La demande IRP_MN_SET_POWER est envoyée au pilote supérieur de la pile d’appareils pour un appareil. Le pilote supérieur passe l’IRP au pilote inférieur suivant, et ainsi de suite jusqu’à ce que l’IRP atteigne le pilote de bus, qui doit terminer l’IRP.

Un pilote de filtre n’a généralement pas besoin d’agir sur un IRP de set-power du système, sauf pour le transmettre.

Toutefois, le propriétaire de la stratégie d’alimentation de l’appareil définit une routine IoCompletion avant de transmettre l’IRP. Dans la routine IoCompletion , il envoie une demande de IRP_MN_SET_POWER pour un IRP d’alimentation de l’appareil. Pour plus d’informations, consultez Gestion d’un système Set-Power IRP dans un propriétaire de stratégie d’alimentation des appareils.

Une IRP de set-power système informe les pilotes qu’une modification de l’état d’alimentation du système est imminente et que les pilotes doivent s’y préparer. Toutefois, un pilote ne doit pas modifier l’état d’alimentation de son appareil tant qu’il n’a pas reçu un IRP_MN_SET_POWER pour un état d’alimentation de l’appareil .

La valeur de Parameters.Power.ShutdownType fournit des informations supplémentaires sur les actions en attente. Lorsque l’IRP spécifie PowerSystemShutdown (S5), un pilote peut déterminer si le système est réinitialisé (PowerActionShutdownReset) ou s’il s’éteint indéfiniment pour redémarrer ultérieurement (PowerActionShutdownOff). Pour les pilotes de la plupart des appareils, la différence est peu importante. Toutefois, pour certains appareils, tels que les périphériques de streaming vidéo, un pilote peut mettre hors tension l’appareil afin d’arrêter les E/S lorsque le système est réinitialisé.

Sur Windows 2000 et versions ultérieures du système d’exploitation, la valeur dans ShutdownType peut également être PowerActionShutdown. Dans ce cas, le pilote ne peut pas dire quel type d’arrêt est demandé et doit donc procéder comme pour une réinitialisation.

États d’alimentation de l’appareil

Les pilotes de fonction et de filtre situés au-dessus d’un pilote de bus ne doivent pas échouer une demande de définition de l’état d’alimentation d’un appareil. Le pilote de bus peut échouer une demande de mise sous tension de l’appareil si l’appareil est supprimé ou en cours de suppression.

Un pilote doit définir le périphérique dans l’état demandé avant de terminer l’IRP.

Lorsque l’IRP demande une transition vers un état d’alimentation inférieur, les pilotes doivent gérer l’IRP à mesure qu’il se déplace dans la pile d’appareils, en enregistrant tout contexte dont le pilote aura besoin pour restaurer l’appareil à l’état de fonctionnement. Une fois qu’un pilote de bus reçoit un IRP, le pilote :

  • Enregistre tout contexte dont le pilote aura besoin pour restaurer l’appareil à l’état de fonctionnement.

  • Définit l’appareil à l’état d’alimentation demandé.

  • Appelle PoSetPowerState pour avertir le gestionnaire d’alimentation.

  • Appelle PoStartNextPowerIrp pour démarrer l’IRP d’alimentation suivante (Windows Server 2003, Windows XP et Windows 2000 uniquement).

  • Termine l’IRP d’alimentation de l’appareil.

Le conducteur doit effectuer cette IRP en temps opportun. En général, les conducteurs doivent éviter tout délai qu’un utilisateur classique trouverait sensiblement lent. Par exemple, un pilote peut retarder un changement d’état système pour vider les données du disque ou du réseau en cache, mais il ne doit pas maintenir une connexion réseau vivante ou mettre en forme une bande. Pour plus d’informations, consultez Passer des IRPs d’alimentation.

Sur Windows 2000 et versions ultérieures du système d’exploitation, si l’IRP spécifie PowerDeviceD1, PowerDeviceD2 ou PowerDeviceD3, et qu’un IRP de set-power système est actif, la valeur sur Parameters.Power.ShutdownType fournit des informations sur l’IRP système.

Les pilotes des appareils sur le chemin de mise en veille prolongée doivent inspecter cette valeur. Si l’IRP demande PowerDeviceD3 et que ShutdownType est PowerActionHibernate, un tel pilote doit enregistrer tout contexte requis pour restaurer l’appareil, mais ne doit pas mettre hors tension l’appareil ; l’appareil entre dans l’état D3 lorsque la machine perd le courant.

Sur Windows 2000 et versions ultérieures du système d’exploitation, les pilotes ne doivent pas s’appuyer sur la valeur sur ShutdownType si l’état d’alimentation demandé est PowerDeviceD0.

Sur Windows 98/Me, si l’IRP demande un état d’alimentation de l’appareil, le Type d’arrêt est toujours PowerActionNone.

Le pilote qui détermine quand mettre hors tension un appareil varie en fonction de la classe d’appareil.

Le pilote qui détermine quand mettre sous tension un appareil est presque toujours un pilote qui accède aux registres d’appareil. Le pilote doit vérifier que l’appareil est à l’état D0 avant d’accéder aux registres matériels de l’appareil. Si l’appareil n’est pas à l’état D0, le pilote doit appeler PoRequestPowerIrp pour envoyer un IRP pour mettre l’appareil sous tension. Un pilote ne peut pas accéder à son appareil, sauf si celui-ci est à l’état D0.

Lorsqu’un pilote reçoit un IRP de puissance définie pour l’état d’appareil D0, il définit une routine IoCompletion et transmet l’IRP au pilote inférieur suivant.

Lorsque l’IRP atteint le pilote de bus, ce pilote applique (ou réinitialise) l’alimentation de l’appareil, appelle PoStartNextPowerIrp (Windows Server 2003, Windows XP et Windows 2000 uniquement) et appelle PoSetPowerState pour informer le gestionnaire d’alimentation du nouvel état d’alimentation de l’appareil.

Une fois que le pilote de bus a terminé l’IRP de mise sous tension, les pilotes de fonction et de filtre gèrent l’IRP dans leurs routines IoCompletion pendant qu’ils remontent la pile des appareils. Dans la routine IoCompletion , chaque pilote restaure ou réinitialise son contexte d’appareil et effectue toutes les autres tâches de démarrage requises.

Pour plus d’informations, consultez Gestion des IRP_MN_SET_POWER pour les états d’alimentation des appareils.

Spécifications

En-tête

Wdm.h (inclure Wdm.h, Ntddk.h ou Ntifs.h)

Voir aussi

DEVICE_POWER_STATE

IoCallDriver

IRP_MN_QUERY_POWER

IRP_MN_SET_POWER

PoCallDriver

PoStartNextPowerIrp

PoSetPowerState

PoRequestPowerIrp

SYSTEM_POWER_STATE

SYSTEM_POWER_STATE_CONTEXT