Partager via


Routines de DispatchPower

La routine DispatchPower d’un pilote prend en charge la gestion de l’alimentation en traitant les IRPs pour le code de fonction IRP_MJ_POWER. Associés au code de fonction IRP_MJ_POWER, il existe plusieurs codes de fonction mineurs d’E/S pour la gestion de l’alimentation. Le gestionnaire d’alimentation utilise ces codes de fonction mineurs pour diriger les pilotes afin de modifier les états d’alimentation, d’attendre et de répondre aux événements de mise en éveil du système et d’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 d’appareils, à l’aide de PoCallDriver.

  • Si vous êtes un pilote de bus, effectuez l'opération de mise sous tension demandée sur l'appareil et complétez l'IRP.

Tous les pilotes d’un appareil doivent avoir la possibilité de gérer les IRPs d’alimentation de l’appareil, sauf dans quelques cas où un pilote de fonction ou de filtre est autorisé à rejeter 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é, le gestionnaire d’E/S appelle toutes les routines IoCompletion définies par les pilotes alors que l'IRP a parcouru la pile des appareils. Si un conducteur doit définir une routine d’achèvement dépend du type d’IRP et des exigences individuelles du conducteur.

Les requêtes de gestion d'alimentation qui allument un appareil doivent être d'abord traitées par le pilote le plus bas dans la pile d'appareils (le pilote de bus sous-jacent), puis par chaque pilote successif vers le haut de la pile. Les IRP d'alimentation qui mettent hors tension un appareil doivent d'abord être traités par le pilote en haut de la pile d'appareils, puis par chaque pilote successif descendant dans la pile.

Gestion spéciale des appareils amovibles

Dans leurs routines DispatchPower , les pilotes d’appareils amovibles doivent vérifier 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 l’IRP de puissance suivante.

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

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

  • Retournez STATUS_DELETE_PENDING.