Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
Lorsqu’un pilote demande un IRP d’attente/veille, il doit spécifier une routine de rappel afin qu’il puisse renvoyer l’appareil à l’état de travail (D0) lorsque l’événement de mise en éveil se produit. Une fois que l'événement de réveil se produit et que tous les pilotes ont terminé l'IRP, le système appelle la routine de rappel transmise à PoRequestPowerIrp.
Étant donné que cette routine de rappel est définie pour le compte du pilote à l'origine de l'IRP, et non pour un pilote qui gère l'IRP, il ne doit pas appeler PoStartNextPowerIrp ; ce sont uniquement les routines IoCompletion définies par les pilotes qui passent l'IRP dans la pile qui doivent démarrer le prochain IRP d'alimentation. N’oubliez pas que le responsable de la politique envoie non seulement l’IRP, mais le gère également. Par conséquent, il peut définir une routine IoCompletion lorsqu’il transmet l’IRP dans la pile, en plus de définir une routine de rappel lorsqu’il demande l’IRP d’attente/réveil.
La routine de rappel a les responsabilités suivantes :
Si le pilote contrôle plusieurs appareils, déterminez quels appareils signalent le réveil.
Service de l’événement qui a provoqué le signal de mise en éveil.
Définissez l’appareil qui a signalé le réveil dans l’état D0 en appelant PoRequestPowerIrp pour envoyer une requête PowerDeviceD0 . Le pilote doit également appeler PoSetPowerState pour informer le gestionnaire d’alimentation du nouvel état d’alimentation de l’appareil. Pour plus d'informations, consultez Envoi de IRP_MN_QUERY_POWER ou IRP_MN_SET_POWER pour l'état d'alimentation du périphérique.
Si le pilote définit une routine Cancel pour l’IRP, appelez IoSetCancelRoutine pour réinitialiser la routine Cancel sur NULL.
Si le pilote possède une stratégie d’alimentation pour plusieurs appareils, décrémentez son nombre de références d’attente/de veille. Si le nombre est différent de zéro, indiquant qu'un autre appareil avait précédemment envoyé un IRP d'attente/de veille, demandez un autre IRP d'attente/de veille (PoRequestPowerIrp) pour le PDO.
Par exemple, un appareil PCI peut avoir activé l'attente/sortie de veille pour un modem et pour une carte d’interface réseau (NIC). Si la carte réseau réveille le système (par conséquent, terminant l’IRP), le FDO PCI doit envoyer un autre IRP d’attente/veille à lui-même afin que le modem puisse toujours se réveiller.
Étant donné que le pilote qui a demandé l'IRP d'attente/éveil contrôle la stratégie d'alimentation de sa pile d'appareils, il est responsable de ramener son appareil à l'état de fonctionnement lorsque l'IRP est terminé. Bien que les pilotes inférieurs aient déjà appliqué physiquement la puissance à l’appareil, le propriétaire de la stratégie doit appeler PoRequestPowerIrp pour envoyer une demande IRP_MN_SET_POWER pour l’état d’alimentation D0 de l’appareil. Une fois que tous les pilotes de la pile d’appareils ont géré cette IRP d’alimentation, l’appareil est retourné à l’état de fonctionnement.