Behandeln eines System Query-Power IRP in einem Besitzer der Geräteenergierichtlinie

Wenn ein Besitzer einer Geräteenergierichtlinie eine IRP_MN_QUERY_POWER für einen Systemstromzustand empfängt, antwortet er, indem er die Abfrage übergibt und in einer IoCompletion-Routine einen IRP_MN_QUERY_POWER für einen Gerätestromzustand sendet. Wenn alle Treiber im Stapel die Geräteabfrage abgeschlossen haben, schließt der Besitzer der Geräteenergierichtlinie die Systemabfrage ab.

Ein Besitzer einer Geräteenergierichtlinie sollte die folgenden Schritte in seiner DispatchPower-Routine ausführen, um auf eine Systemabfrage zu reagieren:

  1. Rufen Sie IoAcquireRemoveLock auf, und übergeben Sie dabei den aktuellen IRP, um sicherzustellen, dass der Treiber während der Behandlung der Leistungs-IRP keine PnP-IRP_MN_REMOVE_DEVICE-Anforderung empfängt.

    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 IRP abzuschließen und den Fehler status zurückzugeben. In Windows Server 2003, Windows XP und Windows 2000 sollte der Treiber PoStartNextPowerIrp aufrufen, IoCompleteRequest aufrufen, um die IRP abzuschließen, und den Fehler status zurückgeben.

  2. Stellen Sie sicher, dass der Treiber den abgefragten Systemstromzustand unterstützen kann, wie unter Fehler bei einem System Query-Power IRP in einem Filter oder Funktionstreiber beschrieben. Wenn nicht, schließen Sie die IRP mit einem Fehler status wie in diesem Abschnitt beschrieben ab.

    Ein Treiber darf jedoch keine Fehler bei einer Abfrage für S4 (PowerSystemHibernate) ausführen, wenn sein Gerät für die Aktivierung aktiviert ist, aber das System nicht aus dem Ruhezustand reaktiviert werden kann. In diesem Fall muss der Besitzer der Energierichtlinie für den Treiber (der die IRP_MN_WAIT_WAKE gesendet hat) die Warte-/Aktivierungs-IRP abbrechen und die Systemabfrage erfolgreich ausführen. Weitere Informationen finden Sie unter Abbrechen einer Warte-/Aktivierungs-IRP.

  3. Wenn der Treiber den abgefragten Systemstromzustand unterstützen kann, rufen Sie IoMarkIrpPending auf.

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

  5. Legen Sie eine IoCompletion-Routine im Power-IRP der Systemabfrage fest.

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

  7. Gibt STATUS_PENDING zurück.

Die IoCompletion-Routine sollte die folgenden Aktionen ausführen:

  1. Überprüfen Sie Irp-IoStatus.Status>, um sicherzustellen, dass niedrigere Treiber die IRP erfolgreich abgeschlossen haben. Wenn ein niedrigerer Treiber einen NTSTATUS-Wert ohne Erfolg angegeben hat, sollte die IoCompletion-Routine den NTSTATUS-Wert zurückgeben.

  2. Wenn niedrigere Treiber die IRP erfolgreich abgeschlossen haben, rufen Sie PoRequestPowerIrp auf, um eine Geräteabfrage-Energie-IRP für einen Gerätestromzustand zu senden, der für den abgefragten Systemstromzustand gültig ist. Überprüfen Sie bei Bedarf das DEVICE_STATE-Array in der DEVICE_CAPABILITIES-Struktur , um zu ermitteln, welche Geräteleistungszustände für den abgefragten Systemstromzustand gültig sind.

  3. Geben Sie eine Rückrufroutine (CompletionFunction-Parameter ) im Aufruf von PoRequestPowerIrp an, und übergeben Sie die System-IRP im Kontextbereich .

  4. Geben Sie STATUS_MORE_PROCESSING_REQUIRED zurück, damit der Treiber die Verarbeitung der Systemabfrage-IRP in der Rückrufroutine abschließen kann.

Nachdem die IRP abgeschlossen und alle während der IRP-Verarbeitung festgelegten IoCompletion-Routinen ausgeführt wurden, ruft der Power Manager über den E/A-Manager die Rückrufroutine des Power Policy Managers auf (den CompletionFunction-Parameter auf PoRequestPowerIrp). Die Rückrufroutine wiederum muss wie folgt vorgehen:

  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 für system query-power (aufrufen Sie IoCompleteRequest) mit der status ab, die für die IRP für die Geräteabfrageleistung zurückgegeben wird.

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

Denken Sie daran, dass der Besitzer der Geräteenergierichtlinie nicht nur die Geräteabfrage sendet, sondern sie auch auf dem Weg nach unten im Gerätestapel verarbeiten muss. Weitere Informationen finden Sie unter Handling IRP_MN_QUERY_POWER for Device Power States.For more information, see Handling IRP_MN_QUERY_POWER for Device Power States.