Power IRPs für das System
Ein Systemleistungs-IRP gibt haupt-IRP-Code IRP_MJ_POWER, einen der unten aufgeführten Nebenleistungs-IRP-Codes und den Wert SystemPowerState im Power.Type-Member des IRP-Stapels an. Nur der Energiemanager kann eine solche IRP senden; Ein Treiber kann keine Systemleistungs-IRP senden.
Der Energie-Manager sendet aus einem der folgenden Gründe eine Systemleistungs-IRP:
So ändern Sie den Systemstromzustand als Reaktion auf ein Leerlauftimeout, eine Änderung der Systemaktivität, eine Benutzeranforderung oder einen ablaufenden Akku (IRP_MN_SET_POWER)
So fragen Sie Geräte ab, um zu bestimmen, ob das System in den Standbymodus wechseln kann (IRP_MN_QUERY_POWER)
So bestätigen Sie den aktuellen Systemleistungszustand nach einer Abfrage (IRP_MN_SET_POWER)
Der Power Manager sendet IRP_MN_QUERY_POWER - und IRP_MN_SET_POWER-Anforderungen im Namen des Systems. Ein Treiber kann bei einer IRP_MN_QUERY_POWER-Anforderung fehlschlagen, aber IRP_MN_SET_POWER nicht.
Wenn Sie beispielsweise den Systemenergiezustand ändern möchten, sendet der Energie-Manager eine Systemleistungs-IRP an den obersten Treiber im Stapel an jeden Geräteknoten der Gerätestruktur. Die folgende Abbildung zeigt, wie Treiber innerhalb eines einzelnen Gerätestapels mit einer Systemleistungs-IRP umgehen.
Wie in der vorherigen Abbildung gezeigt:
Der Energie-Manager ruft den E/A-Manager auf, um eine Systemleistungs-IRP an jeden Blattknoten in der Gerätestruktur zu senden.
Treiber verarbeiten das IRP nach Möglichkeit, legen bei Bedarf IoCompletion-Routinen fest und rufen IoCallDriver (Windows 7 und Windows Vista) oder PoCallDriver (Windows Server 2003, Windows XP und Windows 2000) auf, um den IRP nach unten im Stapel weiterzuleiten. Wenn der IRP eines Treibers fehlschlägt, erfolgt dies sofort durch den Treiber und schließt die IRP ab. Treiber können IRP_MN_QUERY_POWER IRPs fehlschlagen, dürfen aber nicht IRP_MN_SET_POWER IRPs fehlschlagen, die den Energiezustand des Systems festlegen.
Wenn der Treiber, der die Energierichtlinie für das Gerät besitzt, die IRP empfängt, legt dieser Treiber eine IoCompletion-Routine für das System-IRP fest und leitet dann den IRP weiter.
Alle anderen Treiber im Stapel verarbeiten nach Möglichkeit die IRP, legen bei Bedarf IoCompletion-Routinen fest und leiten den IRP wie in Schritt 2 an den nächstniedrigen Treiber weiter.
Schließlich empfängt und schließt der Bustreiber die System-IRP ab.
Der E/A-Manager ruft alle IoCompletion-Routinen auf, die als Treiber festgelegt wurden, die die System-IRP über den Gerätestapel übergeben haben.
In seiner IoCompletion-Routine ruft der Besitzer der Geräteenergierichtlinie PoRequestPowerIrp auf, um eine IRP für die Geräteleistung zu senden, und gibt einen Gerätestromzustand an, der für den Systemenergiezustand im System-IRP gültig ist. Der Treiber legt eine Rückrufroutine fest, die aufgerufen werden soll, wenn die Geräteleistungs-IRP abgeschlossen ist.
Falls erforderlich, konsultiert der Treiber das DeviceState-Element in seiner zwischengespeicherten Kopie der DEVICE_CAPABILITIES-Struktur (siehe Reporting Device Power Capabilities), um zu bestimmen, welche Geräteleistungszustände dem Systemleistungszustand im IRP entsprechen.
Nachdem die Geräte-IRP abgeschlossen ist und alle IRP-Vervollständigungsroutinen für Geräte ausgeführt wurden, wird die Rückrufroutine des Besitzers der Energierichtlinie aufgerufen. In der Rückrufroutine kopiert der Treiber seine zurückgegebenen status in die System-IRP. In Windows Server 2003, Windows XP und Windows 2000 ruft der Rückruf PoStartNextPowerIrp auf, um die nächste Energie-IRP zu starten. In Windows 7 und Windows Vista ist der Aufruf von PoStartNextPowerIrp jedoch nicht erforderlich, und ein solcher Aufruf führt keinen Energieverwaltungsvorgang aus. Schließlich ruft der Rückruf IoCompleteRequest auf, um die System-IRP abzuschließen.
Weitere Informationen finden Sie unter Behandeln von Systemstromzustandsanforderungen.
Da einige Geräte beim Einschalten einen Stromeinstrom benötigen, werden systeminterne Einschaltleistungs-IRPs synchron und seriell im gesamten System verarbeitet. Nur ein solcher IRP kann gleichzeitig aktiv sein. Weitere Informationen finden Sie unter Calling IoCallDriver vs. Calling PoCallDriver.For further information, see Calling IoCallDriver vs. Calling PoCallDriver.