Senden eines Geräte-Set-Power-IRP als Reaktion auf ein System Set-Power IRP

Der Besitzer der Geräteenergierichtlinie sollte die folgenden Schritte ausführen, um auf eine IRP für Systemsätze zu reagieren:

  1. Rufen Sie IoAcquireRemoveLock auf, und übergeben Sie den aktuellen IRP als Tag-Parameter, um sicherzustellen, dass der Treiber keine Plug & Play IRP_MN_REMOVE_DEVICE Anforderung empfängt, während er die Energie-IRP verarbeitet.

    Wenn IoAcquireRemoveLock einen Fehler status zurückgibt, sollte der Treiber die Verarbeitung des IRP nicht fortsetzen. Stattdessen sollte der Treiber ab Windows Vista IoCompleteRequest aufrufen, um die Anforderung abzuschließen und dann den Fehler status zurückzugeben. In Windows Server 2003, Windows XP und Windows 2000 sollte der Treiber zuerst PoStartNextPowerIrp aufrufen, IoCompleteRequest aufrufen, um die IRP abzuschließen, und dann den Fehler status zurückgeben.

  2. Richten Sie den IRP-Stapelspeicherort für den nächstniedrigen Treiber ein, indem Sie IoCopyCurrentIrpStackLocationToNext aufrufen.

  3. Legen Sie eine IoCompletion-Routine in der IRP des Systemsatzes fest.

  4. Rufen Sie IoMarkIrpPending auf, um die IRP für den Systemsatz als ausstehend zu markieren.

  5. Rufen Sie IoCallDriver (ab Windows Vista) oder PoCallDriver (in Windows Server 2003, Windows XP und Windows 2000) auf, um den IRP-Systemsatz an den nächstniedrigen Treiber zu übergeben.

  6. Gibt STATUS_PENDING aus der DispatchPower-Routine zurück.

In der IoCompletion-Routine (siehe Schritt 3 in der vorherigen Liste) sendet der Besitzer der Geräteenergierichtlinie eine Gerätesatz-Energie-IRP wie folgt:

  1. Überprüfen Sie die IRP des Systemsatzs, um den angeforderten Systemstromzustand zu erhalten. Wählen Sie einen geeigneten Gerätestromzustand für diesen Systemstromzustand aus. Weitere Informationen finden Sie unter Ermitteln des richtigen Gerätestromzustands.

  2. Rufen Sie PoRequestPowerIrp auf, um eine IRP_MN_SET_POWER für den in Schritt 1 ermittelten Geräteleistungszustand zu senden. Der Besitzer der Energierichtlinie muss die Gerätesatz-Energieanforderung senden, auch wenn sich das Gerät bereits in diesem Zustand befindet.

  3. Geben Sie eine Rückrufroutine für die Energievervollständigung (CompletionFunction) im Aufruf von PoRequestPowerIrp an, und übergeben Sie den IRP des Systemsatzs im Kontextpuffer .

  4. Geben Sie STATUS_MORE_PROCESSING_REQUIRED aus der IoCompletion-Routine zurück, damit der Treiber die Verarbeitung des Systemset-Power-IRP in der Rückrufroutine für die Energievervollständigung abschließen kann.

Denken Sie daran, dass der Besitzer der Geräteenergierichtlinie nicht nur die IRP des Gerätesatzes sendet, sondern auch diese IRP verarbeiten muss, während sie den Gerätestapel durchläuft. Folglich verfügt ein Besitzer der Geräteenergierichtlinie möglicherweise nicht nur über eine Rückrufroutine für die Energievervollständigung, die dem IRP des Gerätesets und einer IoCompletion-Routine für die IRP des Systemsatz-Energie zugeordnet ist, sondern auch über eine IoCompletion-Routine für die Gerätesatz-Energie-IRP. Weitere Informationen finden Sie unter Handling IRP_MN_SET_POWER for Device Power States.

Nachdem der E/A-Manager alle IoCompletion-Routinen aufruft, die festgelegt wurden, als die IRP des Gerätesatzes den Gerätestapel hinunter bewegt hat, ruft der E/A-Manager die Rückrufroutine für die Energievervollständigung auf. Zu diesem Zeitpunkt haben alle Treiber im Stapel die IRP des Gerätesatzes abgeschlossen, und der Gerätestromübergang ist abgeschlossen.

Die Rückrufroutine für die Energievervollständigung muss folgendes ausführen:

  1. Rufen Sie PoStartNextPowerIrp auf, um die nächste Energie-IRP zu starten. (Nur Windows Server 2003, Windows XP und Windows 2000.)

  2. Schließen Sie die IRP (IoCompleteRequest) des Systems set-power (IoCompleteRequest) mit der status ab, die für die Gerätesatzleistungs-IRP zurückgegeben wird.

  3. Rufen Sie IoReleaseRemoveLock auf, um die zuvor erworbene Sperre zu befreien.

  4. Gibt den status zurück, mit dem die IrPs für die Set-Power abgeschlossen wurden.