Partager via


Envoi d’un appareil Set-Power IRP en réponse à un IRP Set-Power système

Le propriétaire de la stratégie d’alimentation de l’appareil doit effectuer les étapes suivantes pour répondre à un IRP de set-power du système :

  1. Appelez IoAcquireRemoveLock, en passant l’IRP actuel comme paramètre Tag, pour vous assurer que le pilote ne reçoit pas de Plug-and-Play IRP_MN_REMOVE_DEVICE requête lors de la gestion de l’IRP d’alimentation.

    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 la demande, puis retourner l’échec status. Dans Windows Server 2003, Windows XP et Windows 2000, le pilote doit d’abord appeler PoStartNextPowerIrp, appeler IoCompleteRequest pour terminer l’IRP, puis retourner le status d’échec.

  2. Configurez l’emplacement de la pile IRP pour le pilote inférieur suivant en appelant IoCopyCurrentIrpStackLocationToNext.

  3. Définissez une routine IoCompletion dans l’IRP set-power système.

  4. Appelez IoMarkIrpPending pour marquer l’IRP set-power du système comme étant en attente.

  5. Appelez IoCallDriver (à partir de Windows Vista) ou PoCallDriver (dans Windows Server 2003, Windows XP et Windows 2000) pour passer l’IRP set-power système au pilote inférieur suivant.

  6. Retourne STATUS_PENDING à partir de sa routine DispatchPower .

Dans la routine IoCompletion (consultez l’étape 3 de la liste précédente), le propriétaire de la stratégie d’alimentation de l’appareil envoie un IRP d’alimentation d’appareil comme suit :

  1. Inspectez l’IRP de l’alimentation du système pour obtenir l’état d’alimentation du système demandé. Choisissez un état d’alimentation de l’appareil approprié pour cet état d’alimentation du système. Pour plus d’informations, consultez Détermination de l’état d’alimentation correct de l’appareil.

  2. Appelez PoRequestPowerIrp pour envoyer un IRP_MN_SET_POWER pour l’état d’alimentation de l’appareil déterminé à l’étape 1. Le propriétaire de la stratégie d’alimentation doit envoyer la demande set-power de l’appareil même si l’appareil est déjà dans cet état.

  3. Spécifiez une routine de rappel de fin d’alimentation (CompletionFunction) dans l’appel à PoRequestPowerIrp et transmettez l’IRP d’alimentation du système dans la mémoire tampon de contexte .

  4. Retournez STATUS_MORE_PROCESSING_REQUIRED à partir de la routine IoCompletion , afin que le pilote puisse terminer le traitement de l’IRP de l’alimentation du système dans la routine de rappel de fin d’alimentation.

N’oubliez pas que le propriétaire de la stratégie d’alimentation de l’appareil envoie non seulement l’IRP set-power de l’appareil, mais doit également gérer cette IRP pendant qu’il traverse la pile de l’appareil. Par conséquent, un propriétaire de stratégie d’alimentation de l’appareil peut avoir non seulement une routine de rappel de fin d’alimentation associée à l’IRP set-power de l’appareil et une routine IoCompletion pour l’IRP set-power du système, mais également une routine IoCompletion pour l’IRP set-power de l’appareil. Pour plus d’informations, consultez Gestion des IRP_MN_SET_POWER pour les états d’alimentation des appareils.

Une fois que le gestionnaire d’E/S a appelé toutes les routines IoCompletion qui ont été définies lorsque l’IRP de l’appareil a été parcourue dans la pile de l’appareil, le gestionnaire d’E/S appelle la routine de rappel de fin d’alimentation. À ce stade, tous les pilotes de la pile ont terminé l’IRP set-power de l’appareil et la transition d’alimentation de l’appareil est terminée.

La routine de rappel de fin d’alimentation doit effectuer les opérations suivantes :

  1. Appelez PoStartNextPowerIrp pour démarrer la prochaine IRP d’alimentation. (Windows Server 2003, Windows XP et Windows 2000 uniquement.)

  2. Effectuez l’IRP set-power du système (IoCompleteRequest) avec le status retourné pour l’IRP set-power de l’appareil.

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

  4. Retourne le status avec lequel les IRP set-power se sont terminés.