Partager via


IRP_MN_WAIT_WAKE

Cette IRP permet à un pilote de réveiller un système de veille ou de réveiller un appareil de veille.

Code majeur

IRP_MJ_POWER

Date d’envoi

Un pilote propriétaire de la stratégie d’alimentation cible cette IRP sur son PDO pour permettre à son appareil de se réveiller en réponse à un événement externe, tel qu’un appel téléphonique entrant. Un pilote doit appeler PoRequestPowerIrp pour envoyer cette IRP.

En règle générale, un pilote doit envoyer cette IRP dès qu’il détermine que son appareil doit être activé pour la mise en éveil. Par conséquent, les pilotes de la plupart de ces appareils envoient cette IRP après l’alimentation de leurs appareils et avant d’effectuer la demande de IRP_MN_START_DEVICE .

Toutefois, un pilote peut envoyer l’IRP chaque fois que l’appareil est en état de fonctionnement (PowerDeviceD0). La pile d’appareils ne doit pas être en transition ; autrement dit, un pilote ne doit pas envoyer de IRP_MN_WAIT_WAKE alors qu’un autre IRP d’alimentation est actif dans sa pile de périphériques.

Une IRP d’attente/sortie de veille ne modifie pas l’état d’alimentation de l’appareil ou du système. Il active simplement un signal de mise en éveil à partir de l’appareil. Lorsque le signal de mise en éveil arrive, le propriétaire de la stratégie doit appeler PoRequestPowerIrp pour envoyer un IRP à alimentation définie pour renvoyer son appareil à D0.

Le pilote doit s’exécuter sur IRQL = PASSIVE_LEVEL pour envoyer cette IRP. Toutefois, l’IRP peut être effectué à l’adresse IRQL = DISPATCH_LEVEL.

Paramètres d’entrée

Parameters.WaitWake.PowerState contient l’état d’alimentation du système le plus bas (le moins alimenté) à partir duquel l’appareil doit être autorisé à réveiller le système.

Paramètres de sortie

Aucun.

Bloc d’état E/S

Un pilote définit Irp-IoStatus.Status> sur l’une des valeurs suivantes :

STATUS_PENDING
Le pilote a reçu l’IRP et attend que l’appareil signale la mise en éveil.

STATUS_INVALID_DEVICE_STATE
L’appareil est dans un état moins alimenté que l’état DeviceWake spécifié dans la structure DEVICE_CAPABILITIES de l’appareil, ou l’appareil ne peut pas réveiller le système de l’état SystemWake passé dans l’IRP.

STATUS_NOT_SUPPORTED
L’appareil ne prend pas en charge la mise en éveil.

STATUS_DEVICE_BUSY
Une demande de IRP_MN_WAIT_WAKE est déjà en attente et doit être terminée ou annulée avant qu’une autre demande de IRP_MN_WAIT_WAKE puisse être émise.

STATUS_SUCCESS
L’appareil a signalé un événement de veille.

STATUS_CANCELLED
L’IRP a été annulé.

Si un pilote doit échouer à cette IRP, il termine immédiatement l’IRP et ne transmet pas l’IRP au pilote inférieur suivant.

Opération

Un pilote envoie IRP_MN_WAIT_WAKE pour l’une des deux raisons suivantes :

  1. Pour permettre à son appareil de réveiller un système en veille en réponse à un signal de réveil externe.

  2. Pour permettre à son appareil de se réveiller à partir d’un état de veille de l’appareil en réponse à un signal de réveil externe.

L’IRP doit être transmis au pilote de bus de l’appareil, qui appelle IoMarkIrpPending et retourne STATUS_PENDING à partir de sa routine DispatchPower . L’IRP reste en attente jusqu’à ce qu’un signal de sortie de veille se produise ou que le pilote qui a envoyé l’IRP l’annule.

Un seul IRP d’attente/éveil peut être maintenu en attente pour une AOP à un moment donné. Si un pilote détient déjà un IRP d’attente/veille pour un PDO, il doit échouer tout autre irps de ce type avec STATUS_DEVICE_BUSY. Un pilote qui énumère plusieurs PDO enfants peut avoir un IRP d’attente/éveil en attente pour chaque PDO de ce type.

Chaque pilote définit une routine IoCompletion lorsque l’IRP se déplace vers le bas de la pile des appareils. Lorsque l’appareil signale un événement de mise en éveil, le pilote de bus prend en compte le signal de mise en éveil et termine l’IRP, en retournant STATUS_SUCCESS. Le gestionnaire d’E/S appelle ensuite la routine IoCompletion du pilote supérieur suivant, et ainsi de suite dans la pile des appareils.

Lorsqu’un pilote envoie un IRP d’attente/éveil, il doit spécifier une routine de rappel dans l’appel PoRequestPowerIrp . Dans la routine de rappel, le pilote entretient généralement l’appareil. Par exemple, le propriétaire de la stratégie d’alimentation de l’appareil doit appeler PoRequestPowerIrp pour envoyer un IRP_MN_SET_POWER pour l’état de l’appareil D0.

Un pilote qui joue le rôle de pilote de bus pour un appareil et le propriétaire de la stratégie d’un appareil parent demande un IRP IRP_MN_WAIT_WAKE pour la pile d’appareils du parent lorsqu’il reçoit une demande de IRP_MN_WAIT_WAKE d’un PDO enfant. Si le pilote énumère plusieurs PDO enfants, il ne doit demander qu’un seul IRP d’attente/éveil pour la pile de périphériques du parent, quel que soit le nombre de PDO enfants qui envoient des demandes d’attente/éveil. Au lieu de cela, un tel pilote doit conserver un nombre interne d’irps d’attente/éveil, en incrémentant le nombre chaque fois qu’il reçoit une demande et en décrémentant le nombre chaque fois qu’il termine une demande. Si le nombre est différent de zéro après avoir effectué une IRP d’attente/veille, le pilote doit envoyer un autre IRP d’attente/éveil à sa pile de périphériques pour « se réarmer » pour le réveil. Pour plus d’informations, consultez Understanding the Path of Wait/Wake IRPs through a Device Tree.

Pour annuler une IRP_MN_WAIT_WAKE, un pilote appelle IoCancelIrp. Seul le pilote à l’origine de l’IRP peut l’annuler. Un pilote annule un IRP_MN_WAIT_WAKE en attente lorsque l’un des éléments suivants se produit :

  • Le pilote reçoit un IRP PnP qui arrête ou supprime l’appareil.

  • Le système va se mettre en veille et le signal de sortie de veille de l’appareil ne doit pas le réveiller.

Spécifications

En-tête

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

Voir aussi

PoRequestPowerIrp