Partager via


Gestion d’un IRP Query-Power système dans un filtre ou un pilote de fonction

Un pilote de filtre ou de fonction (qui n’est pas le propriétaire de la stratégie d’alimentation d’un appareil) doit passer un IRP d’alimentation de requête système au pilote inférieur suivant, en procédant comme suit :

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

  2. Déterminez si la requête doit échouer. Pour obtenir des instructions, consultez Échec d’un système Query-Power IRP dans un pilote de filtre ou de fonction et terminer le traitement comme décrit dans cette section.

  3. Appelez PoStartNextPowerIrp. (Windows Server 2003, Windows XP et Windows 2000 uniquement)

  4. Définissez l’emplacement de la pile IRP (IoSkipCurrentIrpStackLocation ou IoCopyCurrentIrpStackLocationToNext). Le pilote peut définir une routine IoCompletion dans l’IRP, mais cela est rarement nécessaire.

  5. Appelez IoCallDriver (dans Windows 7 et Windows Vista) ou PoCallDriver (dans Windows Server 2003, Windows XP et Windows 2000) pour passer l’IRP au pilote inférieur suivant.

  6. Appelez IoReleaseRemoveLock. Toutefois, si le pilote a défini une routine IoCompletion pour l’IRP, effectuez cet appel à partir de la routine IoCompletion à la place.

  7. Retourne STATUS_PENDING de sa routine DispatchPower .