Partager via


Gestion des IRP_MN_SET_POWER pour les états d’alimentation des appareils

Un IRP défini sur l’alimentation d’un appareil demande un changement d’état pour un seul appareil et est envoyé à tous les pilotes de la pile de l’appareil. Un tel IRP spécifie DevicePowerState dans le membre Power.Type de l’emplacement de la pile d’E/S.

Les pilotes gèrent les IRP hors tension à mesure qu’ils descendent de la pile. Pour les irps de mise sous tension, les pilotes définissent des routines IoCompletion à mesure que les IRP descendent dans la pile, puis gèrent les IRP dans les routines IoCompletion lorsque les IRP remontent vers le haut de la pile. Les pilotes d’une pile de périphériques standard gèrent un IRP défini sur l’alimentation des appareils comme suit :

  • La plupart des pilotes de filtre doivent simplement appeler IoMarkIrpPending, passer l’IRP au pilote inférieur suivant (voir Passer des irps d’alimentation) et retourner STATUS_PENDING à partir de la routine DispatchPower . Toutefois, certains pilotes de filtre peuvent devoir d’abord effectuer des tâches spécifiques aux appareils, telles que la mise en file d’attente des IRP entrants ou l’enregistrement de l’état d’alimentation de l’appareil.

  • Un pilote de fonction appelle IoMarkIrpPending, effectue des tâches spécifiques à l’appareil (telles que l’exécution des demandes d’E/S en attente, la mise en file d’attente des demandes d’E/S entrantes, l’enregistrement du contexte de l’appareil ou la modification de l’alimentation de l’appareil), définit une routine IoCompletion si nécessaire et transmet l’IRP d’alimentation de l’appareil au pilote inférieur suivant (voir Passage de RUNTIME d’alimentation). Il retourne STATUS_PENDING de sa routine DispatchPower .

  • Le pilote de bus modifie l’alimentation du périphérique s’il est capable de le faire, puis appelle PoSetPowerState pour informer le gestionnaire d’alimentation du nouvel état d’alimentation de l’appareil. Dans Windows Server 2003, Windows XP et Windows 2000 uniquement, le pilote doit également appeler PoStartNextPowerIrp pour démarrer l’IRP d’alimentation suivant après avoir définit l’état d’alimentation. Le pilote termine ensuite l’IRP en spécifiant IO_NO_INCREMENT. Si le pilote ne peut pas terminer l’IRP immédiatement, il appelle IoMarkIrpPending, retourne STATUS_PENDING à partir de sa routine DispatchPower et termine l’IRP ultérieurement.

Même si l’appareil cible est déjà dans l’état d’alimentation demandé, chaque pilote de fonction ou de filtre doit passer l’IRP au pilote inférieur suivant. Chaque IRP à alimentation définie doit descendre de la pile des appareils jusqu’au pilote de bus, qui le termine.

Les pilotes de fonction et de filtre situés au-dessus d’un pilote de bus ne doivent pas faire échouer un IRP de définition d’alimentation de périphérique. Le pilote de bus peut faire échouer un IRP de mise sous tension d’un appareil si l’appareil est supprimé ou en cours de suppression.

Chaque pilote (fonction, filtre et pilote de bus) dans une pile de pilotes doit appeler PoSetPowerState pour informer le gestionnaire d’alimentation d’une modification de l’état d’alimentation de son objet de périphérique correspondant.

À l’instar des autres tâches de pilote associées à la mise sous tension et à la mise hors tension de l’appareil, l’appel à PoSetPowerState doit avoir lieu après l’activation de l’appareil (si le nouvel état est D0) ou avant l’arrêt de l’appareil (si le nouvel état est un autre état).

Chaque pilote doit suivre l’état d’alimentation de son appareil. Le gestionnaire d’alimentation ne fournit pas ces informations aux pilotes.

Lors de la gestion d’une IRP_MN_SET_POWER demande d’état d’alimentation d’un appareil, un pilote doit revenir de la routine DispatchPower aussi rapidement que possible. Un pilote ne doit pas attendre dans sa routine DispatchPower un événement de noyau signalé par le code qui gère le même IRP. Étant donné que les irps d’alimentation sont synchronisés dans tout le système, un interblocage peut se produire.

Pour garantir le niveau de performances système le plus élevé, en particulier pour les applications multimédias, un pilote doit effectuer des opérations chronophages à un niveau de demande d’interruption (IRQL) égal à PASSIVE_LEVEL. Pour effectuer des opérations sur IRQL= PASSIVE_LEVEL, un pilote peut utiliser un thread dédié ou un thread de travail système. Pour obtenir des instructions sur l’optimisation des performances des pilotes pour les plateformes multimédias, consultez le Guide de conception des périphériques multimédias de streaming.

Les étapes exactes qu’un pilote doit suivre pour gérer une IRP d’alimentation dépendent de la mise sous tension ou de l’arrêt de l’appareil, comme décrit dans les sections suivantes :

Gestion des Power-Down IRP des appareils

Gestion des Power-Up IRP des appareils