Partager via


Gestion des Power-Down IRP des appareils

Un IRP d’arrêt de l’appareil spécifie le code de fonction secondaire IRP_MN_SET_POWER et un état d’alimentation de l’appareil (PowerDeviceD0, PowerDeviceD1, PowerDeviceD2 ou PowerDeviceD3) qui est moins alimenté ou égal à l’état d’alimentation actuel de l’appareil. Les pilotes doivent gérer l’IRP de mise hors tension lorsque l’IRP se déplace vers le bas de la pile des appareils. Les pilotes de niveau supérieur doivent gérer l’IRP avant les pilotes de niveau inférieur. Les pilotes qui n’ont aucune tâche spécifique au périphérique à effectuer doivent passer rapidement l’IRP au pilote inférieur suivant.

La figure suivante montre les étapes impliquées dans la gestion d’un tel IRP.

diagramme illustrant la gestion d’une demande d’arrêt d’appareil.

Si l’IRP spécifie PowerDeviceD3, le pilote de fonction doit généralement effectuer les tâches suivantes :

  • Appelez IoAcquireRemoveLock, en passant l’IRP actuel, pour vous assurer que le pilote ne reçoit pas de demande de IRP_MN_REMOVE_DEVICE PnP lors de la gestion de l’IRP d’alimentation.

    Si IoAcquireRemoveLock retourne un échec status, le pilote ne doit pas continuer à traiter l’IRP. Au lieu de cela, à compter de Windows Vista, le pilote doit appeler IoCompleteRequest pour terminer l’IRP, puis retourner l’échec status. Dans Windows Server 2003, Windows XP et Windows 2000, le pilote doit appeler IoCompleteRequest pour terminer l’IRP, puis appeler PoStartNextPowerIrp pour démarrer la prochaine IRP d’alimentation, puis retourner l’échec status.

  • Effectuez toutes les tâches spécifiques à l’appareil qui doivent être effectuées avant la suppression de l’alimentation de l’appareil, telles que la fermeture de l’appareil, l’achèvement ou le vidage des E/S en attente, la désactivation des interruptions, la mise en file d’attente des IRP entrantes suivantes et l’enregistrement du contexte de l’appareil à partir duquel restaurer ou réinitialiser l’appareil.

    Le pilote ne doit pas provoquer de retard long (par exemple, un délai qu’un utilisateur peut trouver déraisonnable pour ce type d’appareil) lors de la gestion de l’IRP.

    Le pilote doit mettre en file d’attente toutes les demandes d’E/S entrantes jusqu’à ce que l’appareil soit revenu à l’état opérationnel.

  • Éventuellement case activée la valeur dans Parameters.Power.ShutdownType. Si un IRP à alimentation définie du système est actif, shutdownType fournit des informations sur l’IRP système. Pour plus d’informations sur cette valeur, consultez System Power Actions.

    Les pilotes des périphériques sur le chemin de mise en veille prolongée doivent inspecter cette valeur. Si shutdownType est PowerActionHibernate, le pilote doit enregistrer tout contexte requis pour restaurer l’appareil, mais ne doit pas l’éteindre.

  • Modifiez l’état d’alimentation physique du périphérique si le pilote est en mesure de le faire et si la modification est appropriée.

  • Appelez PoSetPowerState pour informer le gestionnaire d’alimentation du nouvel état d’alimentation de l’appareil.

  • Appelez IoCopyCurrentIrpStackLocationToNext pour configurer l’emplacement de la pile pour le pilote inférieur suivant.

  • Définissez une routine IoCompletion qui appelle PoStartNextPowerIrp qui indique que le pilote est prêt à gérer la prochaine IRP d’alimentation. Cette étape n’est pas obligatoire dans Windows 7 et Windows Vista.

  • Appelez IoCallDriver (dans Windows 7 et Windows Vista) ou appelez PoCallDriver (dans Windows Server 2003, Windows XP et Windows 2000) pour passer l’IRP au pilote inférieur suivant. L’IRP doit être transmis jusqu’au conducteur de bus, qui termine le IRP.

  • Appelez IoReleaseRemoveLock pour libérer le verrou précédemment acquis.

  • Retourne STATUS_PENDING.

Les pilotes doivent enregistrer toutes les informations de contexte de périphérique et définir le nouvel état d’alimentation avant de transférer l’IRP. Les informations de contexte doivent contenir au minimum le nouvel état d’alimentation demandé. Il doit également inclure toutes les informations supplémentaires dont le pilote aura besoin lors de la mise sous tension. Une fois l’IRP terminée et l’appareil mis hors tension, le pilote ne peut plus accéder au périphérique et le contexte de l’appareil n’est plus disponible.

Chaque pilote doit passer l’IRP au pilote inférieur suivant. Lorsque l’IRP atteint le pilote de bus, celui-ci met hors tension le périphérique (s’il en est capable), appelle PoSetPowerState pour informer le gestionnaire d’alimentation et termine l’IRP.

Toutefois, si le pilote de bus prend en charge le périphérique de mise en veille prolongée, il doit case activée si la valeur de ShutdownType dans l’IRP est PowerSystemHibernate. Dans ce cas, le pilote de bus doit appeler PoSetPowerState pour signaler PowerDeviceD3, mais ne doit pas mettre l’appareil hors tension. L’appareil est hors tension une fois le fichier de mise en veille prolongée enregistré, ainsi que le reste du système.

Une fois tous ses appareils enfants hors tension, un pilote de bus peut également choisir d’arrêter son bus. Ce comportement dépend de l’appareil.

Si l’IRP spécifie un autre état (D0, D1 ou D2), les actions de pilote requises dépendent du périphérique. En règle générale, les appareils qui prennent en charge ces états peuvent rapidement revenir à l’état opérationnel lorsqu’une demande d’E/S arrive. Un pilote pour un tel appareil doit effectuer toutes les demandes d’E/S en attente, mettre en file d’attente les nouvelles demandes et enregistrer tout le contexte nécessaire avant de transférer l’IRP vers le pilote inférieur suivant. Lorsque l’IRP atteint le pilote de bus, il définit le matériel dans l’état demandé. Un pilote ne peut pas accéder au périphérique pendant qu’il est en veille.

Dans certains cas, un pilote de fonction ou de filtre peut recevoir un IRP d’alimentation du périphérique spécifiant PowerDeviceD0 lorsque l’appareil est déjà à l’état D0. Le pilote doit gérer cette IRP comme toute autre IRP définie : terminer les demandes d’E/S en attente, mettre en file d’attente les demandes d’E/S entrantes, définir une routine IoCompletion et passer l’IRP au pilote inférieur suivant. Toutefois, un pilote ne doit pas modifier les paramètres matériels de l’appareil. Lorsque le pilote de bus reçoit l’IRP, il doit simplement terminer l’IRP. Une fois l’IRP terminée, les pilotes de fonction et de filtre peuvent gérer toutes les demandes en file d’attente. La mise en file d’attente des E/S jusqu’à la fin de l’IRP élimine toute possibilité que les pilotes inférieurs tentent de modifier les registres de périphériques tandis qu’un pilote supérieur tente des E/S.