Partager via


Gestion des Power-Up IRPs d’appareil

Les IIP de mise sous tension de l’appareil spécifient IRP_MN_SET_POWER et un état d’alimentation de l’appareil qui nécessite plus d’alimentation que l’état d’alimentation actuel de l’appareil. En règle générale, une IRP de mise sous tension spécifie l’état de fonctionnement de l’appareil PowerDeviceD0.

Les demandes de mise sous tension d’un appareil doivent d’abord être gérées par le pilote de bus sous-jacent de l’appareil, puis par chaque pilote successif qui remonte la pile.

La figure suivante montre les étapes nécessaires à la gestion d’un IRP de mise sous tension.

diagramme illustrant la gestion d’une demande de mise sous tension d’appareil.

Lors de la gestion d’une demande de mise sous tension IRP_MN_SET_POWER, un pilote de fonction ou de filtre doit :

  • Appelez IoAcquireRemoveLock pour vous assurer que le pilote ne reçoit pas de demande de IRP_MN_REMOVE_DEVICE lors de la gestion de l’IRP de mise sous tension.

    Si IoAcquireRemoveLock retourne un status d’échec, 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 le status d’échec. Dans Windows Server 2003, Windows XP et Windows 2000, le pilote doit appeler IoCompleteRequest pour terminer l’IRP, puis appeler PoStartNextPowerIrp pour démarrer l’IRP d’alimentation suivant, puis retourner le status d’échec.

  • Appelez IoMarkIrpPending pour marquer l’IRP en attente.

  • Appelez IoCopyCurrentIrpStackLocationToNext pour définir l’emplacement de la pile IRP. Un pilote ne doit pas appeler IoSkipCurrentIrpStackLocation s’il définit une routine IoCompletion .

  • Appelez IoSetCompletionRoutine pour définir une routine IoCompletion de mise sous tension .

    Lors de la gestion d’un IRP de mise sous tension d’un appareil, le pilote doit définir une routine IoCompletion pour restaurer le contexte, libérer le verrou de suppression et effectuer d’autres tâches requises une fois l’IRP terminée et l’appareil allumé. Le pilote ne doit pas restaurer le contexte avant la fin de l’IRP. Pour plus d’informations, consultez Routines IoCompletion pour les irps d’alimentation des appareils.

  • Appelez IoCallDriver (dans Windows 7 et Windows Vista) ou PoCallDriver (Windows Server 2003, Windows XP et Windows 2000) pour passer l’IRP au pilote inférieur suivant. L’IRP doit se déplacer jusqu’au pilote de bus jusqu’à la pile des appareils. Seul le pilote de bus est autorisé à effectuer l’IRP.

  • Retournez STATUS_PENDING.

Lorsque le pilote de bus reçoit l’IRP, il doit d’abord case activée pour s’assurer que l’appareil est toujours présent et qu’il n’a pas été supprimé ou remplacé pendant le sommeil. Si l’appareil n’est plus présent, le pilote de bus doit appeler IoInvalidateDeviceRelations sur l’appareil parent pour avertir le gestionnaire de Plug-and-Play que l’appareil a disparu. Dans ce cas, le pilote de bus peut faire échouer l’IRP de mise sous tension de l’appareil.

Si l’appareil est toujours présent, le pilote de bus effectue ensuite les tâches requises pour rétablir l’état de fonctionnement de l’appareil, appelle PoSetPowerState pour informer le gestionnaire d’alimentation du nouvel état d’alimentation de l’appareil et termine l’IRP (IoCompleteRequest). Si les pilotes ont mis en file d’attente les E/S pendant que l’appareil était en veille, ou si l’appareil a besoin d’une alimentation d’appel, le pilote de bus applique l’alimentation à l’appareil. Sinon, le pilote de bus applique l’alimentation dès qu’il doit communiquer avec l’appareil.

Pour obtenir la liste des meilleures pratiques permettant d’obtenir des temps de démarrage rapides à partir des états de mise hors tension, de secours et de mise en veille prolongée, consultez Amélioration des performances de démarrage du système.