IRP_MN_WAIT_WAKE
Dieses IRP ermöglicht es einem Treiber, ein Ruhesystem zu wecken oder ein Gerät im Ruhezustand zu wecken.
Hauptcode
Sendebedingungen
Ein Treiber, der die Energierichtlinie besitzt, zielt auf dieses IRP auf seine PDO ab, damit sein Gerät als Reaktion auf ein externes Ereignis wie z. B. einen eingehenden Telefonanruf aktiviert werden kann. Ein Treiber muss PoRequestPowerIrp aufrufen, um diese IRP zu senden.
In der Regel sollte ein Treiber diese IRP senden, sobald er feststellt, dass sein Gerät für die Aktivierung aktiviert werden soll. Daher senden Treiber für die meisten dieser Geräte diese IRP nach dem Einschalten ihrer Geräte und vor abschluss der IRP_MN_START_DEVICE Anforderung.
Ein Treiber kann den IRP jedoch jederzeit senden, wenn sich das Gerät im Betriebszustand (PowerDeviceD0) befindet. Der Gerätestapel darf sich nicht im Übergang befinden. Das heißt, ein Treiber sollte keine IRP_MN_WAIT_WAKE senden, während ein anderer Energie-IRP in seinem Gerätestapel aktiv ist.
Ein Warte-/Aktivierungs-IRP ändert den Energiezustand des Geräts oder des Systems nicht. Es ermöglicht einfach ein Aktivierungssignal vom Gerät. Wenn das Aktivierungssignal eingeht, muss der Richtlinienbesitzer PoRequestPowerIrp aufrufen, um ein set-power-IRP zu senden, um sein Gerät an D0 zurückzugeben.
Der Treiber muss unter IRQL = PASSIVE_LEVEL ausgeführt werden, um diesen IRP senden zu können. Der IRP kann jedoch unter IRQL = DISPATCH_LEVEL abgeschlossen werden.
Eingabeparameter
Parameters.WaitWake.PowerState enthält den niedrigsten (am wenigsten betriebenen) Systemleistungszustand, aus dem das Gerät das System wecken darf.
Ausgabeparameter
Keine.
E/A-Statusblock
Ein Treiber legt Irp-IoStatus.Status> auf eine der folgenden Optionen fest:
STATUS_PENDING
Der Treiber hat die IRP empfangen und wartet darauf, dass das Gerät die Aktivierung signalisiert.
STATUS_INVALID_DEVICE_STATE
Das Gerät befindet sich in einem weniger aktiven Zustand als der in der DEVICE_CAPABILITIES-Struktur für das Gerät angegebene DeviceWake-Zustand, oder das Gerät kann das System nicht aus dem systemwake-Zustand wecken, der in der IRP übergeben wurde.
STATUS_NOT_SUPPORTED
Das Gerät unterstützt keine Aktivierung.
STATUS_DEVICE_BUSY
Eine IRP_MN_WAIT_WAKE Anforderung ist bereits ausstehend und muss abgeschlossen oder abgebrochen werden, bevor eine weitere IRP_MN_WAIT_WAKE-Anforderung ausgestellt werden kann.
STATUS_SUCCESS
Das Gerät hat ein Aktivierungsereignis signalisiert.
STATUS_CANCELLED
Die IRP wurde abgebrochen.
Wenn ein Treiber bei diesem IRP fehlschlagen muss, schließt er das IRP sofort ab und übergibt den IRP nicht an den nächstniedrigen Treiber.
Vorgang
Ein Treiber sendet IRP_MN_WAIT_WAKE aus zwei Gründen:
Damit das Gerät ein Ruhesystem als Reaktion auf ein externes Aktivierungssignal wecken kann.
Damit das Gerät als Reaktion auf ein externes Aktivierungssignal aus dem Ruhezustand des Geräts aktiviert werden kann.
Der IRP muss den Gerätestapel an den Bustreiber für das Gerät übergeben werden, das IoMarkIrpPending aufruft und STATUS_PENDING aus seiner DispatchPower-Routine zurückgibt. Der IRP bleibt ausstehend, bis ein Aktivierungssignal auftritt oder bis der Treiber, der das IRP gesendet hat, es abbricht.
Nur ein Warte-/Aktivierungs-IRP kann zu einem bestimmten Zeitpunkt für eine PDO ausstehend gehalten werden. Wenn ein Treiber bereits einen Warte-/Aktivierungs-IRP für eine PDO enthält, muss er bei allen zusätzlichen IRPs mit STATUS_DEVICE_BUSY fehlschlagen. Für einen Treiber, der mehr als ein untergeordnetes PDO auflistet, kann für jede solche PDO ein Warte-/Aktivierungs-IRP ausstehen.
Jeder Treiber legt eine IoCompletion-Routine fest, während der IRP den Gerätestapel hinunter bewegt. Wenn das Gerät ein Aktivierungsereignis signalisiert, verwendet der Bustreiber das Aktivierungssignal und schließt die IRP ab und gibt STATUS_SUCCESS zurück. Der E/A-Manager ruft dann die IoCompletion-Routine des nächsthöheren Treibers und damit den Gerätestapel auf.
Wenn ein Treiber einen Warte-/Aktivierungs-IRP sendet, sollte er eine Rückrufroutine im PoRequestPowerIrp-Aufruf angeben. In der Rückrufroutine verwendet der Treiber in der Regel das Gerät. Beispielsweise muss der Besitzer der Energierichtlinie für das Gerät PoRequestPowerIrp aufrufen, um eine IRP_MN_SET_POWER für den Gerätestatus D0 zu senden.
Ein Treiber, der als Bustreiber für ein Gerät fungiert, und der Richtlinienbesitzer für ein übergeordnetes Gerät fordert eine IRP_MN_WAIT_WAKE IRP für den Gerätestapel des übergeordneten Geräts an, wenn er eine IRP_MN_WAIT_WAKE-Anforderung von einem untergeordneten PDO empfängt. Wenn der Treiber mehr als ein untergeordnetes PDO auflistet, sollte er nur einen Warte-/Aktivierungs-IRP für den Gerätestapel des übergeordneten Elements anfordern, unabhängig davon, wie viele untergeordnete PDOs Warte-/Aktivierungsanforderungen senden. Stattdessen sollte ein solcher Treiber eine interne Anzahl von Warte-/Aktivierungs-IRPs beibehalten, wobei die Anzahl jedes Mal erhöht wird, wenn er eine Anforderung empfängt, und die Anzahl bei jedem Abschluss einer Anforderung verringert wird. Wenn die Anzahl ungleich null ist, nachdem er eine Warte-/Aktivierungs-IRP abgeschlossen hat, sollte der Treiber eine weitere Warte-/Aktivierungs-IRP an seinen Gerätestapel senden, um sich selbst für das Reaktivieren zu "reaktivieren". Weitere Informationen finden Sie unter Grundlegendes zum Pfad von Warte-/Aktivierungs-IRPs durch eine Gerätestruktur.
Um eine IRP_MN_WAIT_WAKE abzubrechen, ruft ein Treiber IoCancelIrp auf. Nur der Treiber, der aus dem IRP stammt, kann ihn abbrechen. Ein Treiber bricht eine ausstehende IRP_MN_WAIT_WAKE ab, wenn eine der folgenden Aktionen auftritt:
Der Treiber empfängt eine PnP-IRP, die das Gerät beendet oder entfernt.
Das System wird in den Standbymodus versetzt, und das Aktivierungssignal des Geräts darf es nicht wecken.
Anforderungen
Header |
Wdm.h (einschließen Wdm.h, Ntddk.h oder Ntifs.h) |