IRP_MN_SET_POWER

Dieser IRP benachrichtigt einen Treiber über eine Änderung des Systemstromzustands oder legt den Geräteleistungszustand für ein Gerät fest.

Hauptcode

IRP_MJ_POWER

Sendebedingungen

Diese IRP kann entweder vom Systemenergie-Manager oder vom Besitzer der Geräteenergierichtlinie gesendet werden.

Der Power Manager sendet diese IRP, um Treiber über eine Änderung des Systemstromzustands zu benachrichtigen. Wenn ein Treiber sein Gerät für die Leerlauferkennung registriert hat, sendet der Power Manager diese IRP, um den Energiezustand eines im Leerlauf befindlichen Geräts zu ändern.

Ein Treiber, der eine Energierichtlinie besitzt, sendet diese IRP, um den Gerätestromzustand für sein Gerät festzulegen. Ein Treiber muss PoRequestPowerIrp aufrufen, um diese IRP zu senden.

Der Energie-Manager sendet diese IRP bei IRQL = PASSIVE_LEVEL an Gerätestapel, die das DO_POWER_PAGABLE-Flag in der PDO festlegen. Treiber in solchen Stapeln können auf ausgelagerten Code oder Daten tippen, um die Anforderung abzuschließen.

Der Energie-Manager kann die IRP bei IRQL = DISPATCH_LEVEL senden, wenn das DO_POWER_INRUSH-Flag festgelegt ist. Solche Treiber können weder direkt noch indirekt auf ausgelagerten Code oder Daten zugreifen.

Eingabeparameter

Das Parameters.Power.Type-Element gibt den Typ des festzulegenden Energiezustands an, entweder SystemPowerState oder DevicePowerState.

Der Parameter.Power.State-Member gibt den Energiestatus selbst wie folgt an:

Das Parameters.Power.ShutdownType-Element gibt zusätzliche Informationen zum angeforderten Übergang an. Die möglichen Werte für diesen Member sind POWER_ACTION Enumerationswerte. Weitere Informationen finden Sie unter System power actions.

Ab Windows Vista ist der Parameter.Power.SystemPowerStateContext-Member eine schreibgeschützte, teilweise undurchsichtige SYSTEM_POWER_STATE_CONTEXT-Struktur , die Informationen zu den vorherigen Systemleistungszuständen eines Computers enthält. Wenn Parameters.Power.TypeSystemPowerState und Parameters.Power.State Power.StatePowerSystemWorking ist, geben zwei Flagbits in dieser Struktur an, ob ein schneller Start oder ein Aufwachen aus dem Ruhezustand dazu geführt hat, dass der Computer in den Systemzustand S0 (Working) wechselt. Weitere Informationen finden Sie unter Unterscheiden des schnellen Startvorgangs von "Wake-from-Hibernation".

Die folgende Tabelle zeigt den Inhalt von IRP_MN_SET_POWER. Parameters.Power. {Zustand| ShutdownType} und die Bitfelder CurrentSystemState, TargetSystemState und EffectiveSystemState in der SYSTEM_POWER_STATE_CONTEXT-Struktur für jeden Systemstromübergang. Jede Zeile stellt eine IRP_MN_SET_POWER dar.

Übergang State Herunterfahren des Typs Aktuelles SystemState ZielsystemState Effektives SystemState Kommentare
Schlafen... S3 Standby S0 S3 S3
... Aufwachen S0 Standby S3 S0 S0
Hybrid sleep to... S4 Ruhezustand S0 S3 S4 Ruhezustand mit Ruhezustandsdatei (Fast S4)
... Aufwachen S0 Standby S3 S0 S0
... Wake/PwrLost S0 Standby S4 S0 S0
Ruhezustand, um... S4 Ruhezustand S0 S4 S4
... Aufwachen S0 Standby S4 S0 S0
Hybrid shutdown to... S4 Ruhezustand S0 S5 S4 Apps geschlossen, Benutzer abgemeldet wie heruntergefahren (Hiber Boot)
... Schneller Start S0 Standby S4 S0 S0
Herunterfahren nach... S5 Herunterfahren/Zurücksetzen/Aus S0 S5 S5
... Systemstart Kein S-IRP für den Start

Ausgabeparameter

Parameters.Power.SystemContext ist für die Systemverwendung reserviert.

E/A-Statusblock

Ein Treiber legt Irp-IoStatus.Status> auf STATUS_SUCCESS fest, um anzugeben, dass das Gerät den angeforderten Zustand erreicht hat.

Ein Treiber darf eine Anforderung zum Festlegen des Systemleistungszustands nicht fehlschlagen.

Funktions- und Filtertreiber, die sich über einem Bustreiber befinden, dürfen keine Anforderung zum Festlegen eines Gerätestromzustands fehlschlagen. Der Bustreiber kann eine Geräteeinschaltanforderung fehlschlagen, wenn das Gerät entfernt wird oder gerade entfernt wird.

Vorgang

Der Energie-Manager oder ein Treiber kann eine IRP_MN_SET_POWER IRP anfordern. Der Energie-Manager sendet diese IRP aus einem der folgenden Gründe:

  • So benachrichtigen Sie Treiber über eine Änderung des Systemstromzustands

  • So ändern Sie den Energiestatus eines Geräts, für das der Power Manager die Leerlauferkennung ausführt

  • Um den aktuellen Systemstatus zu bestätigen, nachdem ein Treiber eine IRP_MN_QUERY_POWER Anforderung für einen Systemleistungsstatus fehlschlägt. Weitere Informationen finden Sie unter IRP_MN_QUERY_POWER.

Ein Treiber, der die Geräteenergierichtlinie besitzt, sendet IRP_MN_SET_POWER , um den Energiezustand des Geräts zu ändern.

Zu einem bestimmten Zeitpunkt lässt das System nur eine solche IRP für jedes Geräteobjekt aktiv zu.

Jeder Treiber muss jeden Energie-IRP an den nächstniedrigen Treiber übergeben, indem er IoCallDriver (ab Windows Vista) oder PoCallDriver (Windows Server 2003, Windows XP und Windows 2000) aufruft. Die PoCallDriver-Schnittstelle ähnelt der von IoCallDriver, mit dem Unterschied, dass das Energieverwaltungssubsystem den IRP möglicherweise verzögert, bevor es an den nächsten Treiber weitergibt. Beispielsweise können Verzögerungen bei einer PowerDeviceD0-Anforderung auftreten, wenn das Gerät Einen Einschaltstrom benötigt und daher mit einem anderen gerät seriell eingeschaltet werden muss.

Nachdem ein Treiber eine IRP_MN_SET_POWER Anforderung unter Windows Server 2003, Windows XP oder Windows 2000 erhalten hat, muss ein Treiber PoStartNextPowerIrp aufrufen, wie unter Aufrufen von PoStartNextPowerIrp beschrieben. Ab Windows Vista ist das Aufrufen von PoStartNextPowerIrp nicht erforderlich, und ein solcher Aufruf führt keinen Energieverwaltungsvorgang aus.

IRP_MN_SET_POWER für Systemstromzustände

Nur der System-Power-Manager kann eine IRP für Den Systemsatz senden.

Ein Treiber darf eine Anforderung zum Festlegen des Systemleistungszustands nicht fehlschlagen.

Wann immer möglich sendet der Power Manager IRP_MN_QUERY_POWER , bevor er IRP_MN_SET_POWER sendet, um einen Systemmodus anzufordern. Unter bestimmten Bedingungen (z. B. wenn der Benutzer die Ausschalttaste drückt oder ein Akku ausläuft), gibt der Energiemanager möglicherweise IRP_MN_SET_POWER aus, ohne vorher abzufragen. Der Power Manager fragt nur nach Ruhezustand ab. Es wird nie vor dem Einschalten abfragen.

Die IRP_MN_SET_POWER Anforderung wird an den obersten Treiber im Gerätestapel für ein Gerät gesendet. Der obere Treiber übergibt den IRP bis zum nächstniedrständigen Treiber usw., bis der IRP den Bustreiber erreicht, der die IRP abschließen muss.

Ein Filtertreiber muss in der Regel nicht auf einen IRP mit Systemsatzleistung reagieren, außer ihn weiterzureichen.

Der Besitzer der Geräteenergierichtlinie legt jedoch eine IoCompletion-Routine fest, bevor er die IRP übergibt. In der IoCompletion-Routine sendet sie eine IRP_MN_SET_POWER Anforderung für eine Geräteleistungs-IRP. Weitere Informationen finden Sie unter Handling a System Set-Power IRP in a Device Power Policy Owner.For more information, see Handling a System Set-Power IRP in a Device Power Policy Owner.

Ein IRP für Systemsatzleistung informiert Treiber darüber, dass eine Änderung des Systemstromzustands unmittelbar bevorsteht und sich die Treiber darauf vorbereiten müssen. Ein Treiber sollte den Energiezustand seines Geräts jedoch erst ändern, wenn er eine IRP_MN_SET_POWER für einen Gerätestromzustand erhält.

Der Wert unter Parameters.Power.ShutdownType enthält zusätzliche Informationen zu den ausstehenden Aktionen. Wenn der IRP PowerSystemShutdown (S5) angibt, kann ein Treiber bestimmen, ob das System zurückgesetzt (PowerActionShutdownReset) oder unbegrenzt ausgeschaltet wird, um später neu zu starten (PowerActionShutdownOff). Für Treiber der meisten Geräte ist der Unterschied inkonsequent. Für bestimmte Geräte, z. B. Videostreaminggeräte, kann ein Treiber das Gerät jedoch ausschalten, um die E/A-Vorgänge zu beenden, wenn das System zurückgesetzt wird.

Unter Windows 2000 und höheren Versionen des Betriebssystems kann der Wert unter ShutdownType auch PowerActionShutdown sein. In diesem Fall kann der Treiber nicht sagen, welche Art des Herunterfahrens angefordert wird und sollte daher wie bei einem Zurücksetzen fortfahren.

Gerätestromzustände

Funktions- und Filtertreiber, die sich über einem Bustreiber befinden, dürfen keine Anforderung zum Festlegen eines Gerätestromzustands fehlschlagen. Der Bustreiber kann eine Geräteeinschaltanforderung fehlschlagen, wenn das Gerät entfernt wird oder gerade entfernt wird.

Ein Treiber muss das Gerät in den angeforderten Zustand versetzen, bevor die IRP abgeschlossen wird.

Wenn das IRP einen Übergang zu einem niedrigeren Leistungszustand anfordert, müssen Treiber die IRP verarbeiten, während sie den Gerätestapel hinunter bewegt, wodurch der Kontext gespeichert wird, den der Treiber benötigt, um das Gerät in den Betriebszustand wiederherzustellen. Nachdem ein Bustreiber eine IRP erhalten hat, hat der Treiber Folgendes:

  • Speichert alle Kontexte, die der Treiber benötigt, um das Gerät in den Arbeitszustand wiederherzustellen.

  • Legt das Gerät auf den angeforderten Energiezustand fest.

  • Ruft PoSetPowerState auf, um den Power Manager zu benachrichtigen.

  • Ruft PoStartNextPowerIrp auf, um die nächste Energie-IRP zu starten (nur Windows Server 2003, Windows XP und Windows 2000).

  • Schließt die IRP für die Geräteleistung ab.

Der Treiber muss diese IRP rechtzeitig abschließen. Im Allgemeinen sollten Treiber jede Verzögerung vermeiden, die ein typischer Benutzer als spürbar langsam empfinden würde. Beispielsweise kann ein Treiber eine Systemzustandsänderung verzögern, um zwischengespeicherte Datenträger oder Netzwerkdaten zu leeren, sollte jedoch keine Netzwerkverbindung aufrecht erhalten oder ein Band formatieren. Weitere Informationen finden Sie unter Übergeben von Power IRPs.

Wenn der IRP unter Windows 2000 und höheren Versionen des Betriebssystems PowerDeviceD1, PowerDeviceD2 oder PowerDeviceD3 angibt und ein IRP für Systemsatzleistung aktiv ist, enthält der Wert unter Parameters.Power.ShutdownType Informationen zum System-IRP.

Treiber von Geräten im Ruhezustandspfad sollten diesen Wert überprüfen. Wenn der IRP PowerDeviceD3 und ShutdownTypePowerActionHibernate anfordert, sollte ein solcher Treiber alle zum Wiederherstellen des Geräts erforderlichen Kontext speichern, das Gerät jedoch nicht herunterfahren. das Gerät wird in den D3-Zustand versetzt, wenn der Computer an Strom verliert.

Unter Windows 2000 und höheren Versionen des Betriebssystems sollten Treiber nicht vom Wert unter ShutdownType abhängig sein, wenn der angeforderte Energiezustand PowerDeviceD0 ist.

Wenn der IRP unter Windows 98/Me einen Gerätestromzustand anfordert, lautet der ShutdownType immer PowerActionNone.

Der Treiber, der bestimmt, wann ein Gerät heruntergefahren werden soll, hängt von der Geräteklasse ab.

Der Treiber, der bestimmt, wann ein Gerät eingeschaltet werden soll, ist fast immer ein Treiber, der auf die Geräteregistrierungen zugreift. Der Treiber muss überprüfen, ob sich das Gerät im D0-Zustand befindet, bevor er auf die Hardwareregister des Geräts zugreift. Wenn sich das Gerät nicht im D0-Zustand befindet, muss der Treiber PoRequestPowerIrp aufrufen, um eine IRP zum Einschalten des Geräts zu senden. Ein Treiber kann nicht auf sein Gerät zugreifen, es sei denn, das Gerät befindet sich im D0-Zustand.

Wenn ein Treiber eine IRP für den Gerätestatus D0 empfängt, legt er eine IoCompletion-Routine fest und übergibt den IRP an den nächstniedrigen Treiber.

Wenn der IRP den Bustreiber erreicht, wendet dieser Treiber die Stromversorgung auf das Gerät an (oder setzt diese zurück), ruft PoStartNextPowerIrp (nur Windows Server 2003, Windows XP und Windows 2000) auf und ruft PoSetPowerState auf, um den Power Manager über den neuen Energiezustand des Geräts zu informieren.

Nachdem der Bustreiber die IRP zum Einschalten abgeschlossen hat, verarbeiten Funktions- und Filtertreiber die IRP in ihren IoCompletion-Routinen , während sie den Gerätestapel zurückfahren. In der IoCompletion-Routine stellt jeder Treiber seinen Gerätekontext wiederhergestellt oder neu initialisiert und führt alle anderen erforderlichen Startaufgaben aus.

Weitere Informationen finden Sie unter Behandeln von IRP_MN_SET_POWER für Gerätestromzustände.

Anforderungen

Header

Wdm.h (einschließlich Wdm.h, Ntddk.h oder Ntifs.h)

Weitere Informationen

DEVICE_POWER_STATE

IoCallDriver

IRP_MN_QUERY_POWER

IRP_MN_SET_POWER

PoCallDriver

PoStartNextPowerIrp

PoSetPowerState

PoRequestPowerIrp

SYSTEM_POWER_STATE

SYSTEM_POWER_STATE_CONTEXT