Routines de rappel d’attente/éveil
Lorsqu’un pilote demande une IRP d’attente/veille, il doit spécifier une routine de rappel afin qu’il puisse retourner l’appareil à l’état opérationnel (D0) lorsque l’événement de mise en éveil se produit. Une fois que l’événement de mise en éveil se produit et que tous les pilotes ont terminé l’IRP, le système appelle la routine de rappel passée à 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, elle ne doit pas appeler PoStartNextPowerIrp ; seules les routines IoCompletion définies lorsque les pilotes passent l’IRP vers le bas de la pile doivent démarrer la prochaine IRP d’alimentation. Gardez à l’esprit que le propriétaire de la stratégie non seulement envoie l’IRP, mais qu’il le gère. 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/veille.
La routine de rappel a les responsabilités suivantes :
Si le pilote contrôle plusieurs appareils, déterminez lequel de ses appareils a signalé le réveil.
Service de l’événement qui a provoqué le signal de mise en éveil.
Définissez l’appareil qui a signalé la mise en éveil dans l’état D0 en appelant PoRequestPowerIrp pour envoyer une demande PowerDeviceD0 . Le pilote doit également appeler PoSetPowerState pour informer le gestionnaire de l’alimentation du nouvel état d’alimentation du périphérique. Pour plus d’informations, consultez Envoi de IRP_MN_QUERY_POWER ou IRP_MN_SET_POWER pour les états d’alimentation des appareils.
Si le pilote a défini une routine Cancel pour l’IRP, appelez IoSetCancelRoutine pour réinitialiser la routine Cancel sur NULL.
Si le pilote possède la stratégie d’alimentation pour plusieurs appareils, décrémentez son nombre de références d’attente/éveil. Si le nombre est différent de zéro, ce qui indique qu’un autre appareil a précédemment envoyé un IRP d’attente/éveil, demandez un autre IRP d’attente/éveil (PoRequestPowerIrp) pour son PDO.
Par exemple, un appareil PCI peut avoir activé l’attente/la sortie de veille pour un modem et une carte réseau. Si la carte réseau réveille le système (effectuant ainsi 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/veille contrôle la stratégie d’alimentation de sa pile de périphériques, il est chargé de retourner son appareil à l’état opérationnel une fois l’IRP terminée. Bien que les pilotes inférieurs aient déjà physiquement appliqué l’alimentation à l’appareil, le propriétaire de la stratégie doit appeler PoRequestPowerIrp pour envoyer une demande de IRP_MN_SET_POWER d’état d’alimentation de l’appareil D0. Ce n’est qu’une fois que tous les pilotes de la pile de périphériques ont géré cette IRP de mise sous tension que l’appareil sera retourné à l’état opérationnel.