Behandeln von IRP_MN_SET_POWER für Geräteleistungszustände
Ein Gerätesatz-IRP fordert eine Zustandsänderung für ein einzelnes Gerät an und wird an alle Treiber im Stapel für das Gerät gesendet. Ein solcher IRP gibt DevicePowerState im Power.Type-Member des E/A-Stapelspeicherorts an.
Treiber verarbeiten heruntergefahrene IRPs, während sie den Stapel hinunterfahren. Für Power-Up-IRPs legen Treiber IoCompletion-Routinen fest, während die IRPs den Stapel hinunterfahren, und behandeln dann die IRPs in den IoCompletion-Routinen , während die IRPs den Stapel zurückführen. Die Treiber in einem typischen Gerätestapel behandeln eine Gerätesatz-IRP wie folgt:
Die meisten Filtertreiber sollten einfach IoMarkIrpPending aufrufen, den IRP an den nächstniedrigen Treiber übergeben (siehe Übergeben von Power IRPs) und STATUS_PENDING aus der DispatchPower-Routine zurückgeben. Einige Filtertreiber müssen jedoch möglicherweise zuerst gerätespezifische Aufgaben ausführen, z. B. das Anstehen eingehender IRPs oder das Speichern des Gerätestromzustands.
Ein Funktionstreiber ruft IoMarkIrpPending auf, führt gerätespezifische Aufgaben aus (z. B. das Abschließen ausstehender E/A-Anforderungen, das Anstehen eingehender E/A-Anforderungen, das Speichern des Gerätekontexts oder das Ändern der Geräteleistung), legt bei Bedarf eine IoCompletion-Routine fest und übergibt die IRP des Geräts an den nächstniedrigen Treiber (siehe Übergeben von Power IRPs). Es gibt STATUS_PENDING aus seiner DispatchPower-Routine zurück.
Der Bustreiber ändert die Geräteleistung, wenn er dazu in der Lage ist, und ruft dann PoSetPowerState auf, um den Energiemanager über den neuen Gerätestromzustand zu benachrichtigen. Nur in Windows Server 2003, Windows XP und Windows 2000 muss der Treiber auch PoStartNextPowerIrp aufrufen, um den nächsten Energie-IRP zu starten, nachdem er den Energiezustand festgelegt hat. Der Treiber schließt dann die IRP ab und gibt IO_NO_INCREMENT an. Wenn der Treiber die IRP nicht sofort abschließen kann, ruft er IoMarkIrpPending auf, gibt STATUS_PENDING aus seiner DispatchPower-Routine zurück und schließt die IRP später ab.
Auch wenn sich das Zielgerät bereits im angeforderten Energiezustand befindet, muss jeder Funktions- oder Filtertreiber den IRP an den nächstniedrigen Treiber übergeben. Jede Set-Power-IRP muss den gesamten Weg über den Gerätestapel bis zum Bustreiber übertragen werden, der ihn abschließt.
Funktions- und Filtertreiber, die sich über einem Bustreiber befinden, dürfen keine Leistungs-IRP des Gerätesatzes ausfallen. Der Bustreiber kann ein Geräteeinschalt-IRP fehlschlagen, wenn das Gerät entfernt wird oder gerade entfernt wird.
Jeder Treiber (Funktion, Filter und Bustreiber) in einem Treiberstapel muss PoSetPowerState aufrufen, um den Power Manager über eine Änderung des Energiezustands des entsprechenden Geräteobjekts zu informieren.
Wie bei anderen Treiberaufgaben, die mit dem Ein- und Ausschalten des Geräts verbunden sind, muss der Aufruf von PoSetPowerState erfolgen, nachdem das Gerät eingeschaltet wird (wenn der neue Zustand D0 ist) oder bevor das Gerät ausgeschaltet wird (wenn der neue Zustand ein anderer Zustand ist).
Jeder Treiber sollte den Energiezustand seines Geräts nachverfolgen. Der Power Manager stellt diese Informationen nicht an Treiber bereit.
Bei der Behandlung einer IRP_MN_SET_POWER Anforderung für einen Gerätestromzustand sollte ein Treiber so schnell wie möglich von der DispatchPower-Routine zurückkehren. Ein Treiber darf in seiner DispatchPower-Routine nicht auf ein Kernelereignis warten, das durch Code signalisiert wird, der dieselbe IRP verarbeitet. Da Power IRPs im gesamten System synchronisiert werden, kann es zu einem Deadlock kommen.
Um ein höchstmaßes Maß an Systemleistung zu gewährleisten, insbesondere für Multimediaanwendungen, sollte ein Treiber zeitaufwendige Vorgänge auf einer Interrupt Request-Ebene (IRQL) ausführen, die PASSIVE_LEVEL entspricht. Um Vorgänge bei IRQL= PASSIVE_LEVEL auszuführen, kann ein Treiber einen dedizierten Thread oder einen Systemarbeitsthread verwenden. Richtlinien zum Optimieren der Treiberleistung für Multimediaplattformen finden Sie im Designhandbuch für Streamingmediengeräte.
Die genauen Schritte, die ein Treiber ausführen muss, um eine Energie-IRP zu verarbeiten, hängt davon ab, ob das Gerät hoch- oder heruntergefahren wird, wie in den folgenden Abschnitten beschrieben: