Partager via


DispatchPower Routines

La routine DispatchPower d’un pilote prend en charge la gestion de l’alimentation en gérant les irps pour le code de la fonction d’E /S IRP_MJ_POWER. Le code de la fonction IRP_MJ_POWER est associé à plusieurs codes de fonction d’E/S secondaires pour la gestion de l’alimentation. Le gestionnaire d’alimentation utilise ces codes de fonction secondaires pour diriger les pilotes vers le changement d’état d’alimentation, pour attendre et répondre aux événements de mise en éveil du système, et pour interroger les pilotes sur leurs appareils.

La routine DispatchPower de chaque pilote effectue les tâches suivantes :

  • Gérez l’IRP si possible.

  • Passez l’IRP au pilote inférieur suivant dans la pile de périphériques, à l’aide de PoCallDriver.

  • S’il s’agit d’un pilote de bus, effectuez l’opération d’alimentation demandée sur l’appareil et terminez l’IRP.

Tous les pilotes d’un appareil doivent avoir la possibilité de gérer les IRP d’alimentation pour l’appareil, sauf dans quelques cas où un pilote de fonction ou de filtre est autorisé à faire échouer l’IRP. La plupart des pilotes de fonction et de filtre effectuent un traitement ou définissent une routine IoCompletion pour chaque IRP d’alimentation, puis passent l’IRP au pilote inférieur suivant sans le terminer. Finalement, l’IRP atteint le pilote de bus, qui modifie physiquement l’état d’alimentation de l’appareil si nécessaire et termine l’IRP.

Une fois l’IRP terminée, le gestionnaire d’E/S appelle toutes les routines IoCompletion définies par les pilotes lorsque l’IRP a été parcouru dans la pile des appareils. Le fait qu’un pilote doit définir une routine d’achèvement dépend du type d’IRP et des exigences individuelles du pilote.

Les irps d’alimentation qui alimentent un appareil doivent d’abord être gérés par le pilote le plus bas de la pile de périphériques (le pilote de bus sous-jacent), puis par chaque pilote successif dans la pile. Les irps d’alimentation qui embrasent un appareil doivent d’abord être gérés par le pilote en haut de la pile de périphériques, puis par chaque pilote successif qui descend de la pile.

Gestion spéciale des appareils amovibles

Dans leurs routines DispatchPower, les pilotes des périphériques amovibles doivent case activée pour voir si l’appareil est toujours présent. Si l’appareil a été supprimé, le pilote ne doit pas passer l’IRP au pilote inférieur suivant. Au lieu de cela, le pilote doit effectuer les opérations suivantes :

  • Appelez PoStartNextPowerIrp pour commencer à traiter le IRP d’alimentation suivant.

  • Définissez Irp-IoStatus.Status> sur STATUS_DELETE_PENDING.

  • Appelez IoCompleteRequest, en spécifiant IO_NO_INCREMENT, pour terminer l’IRP.

  • Retourne STATUS_DELETE_PENDING.