Behandeln von Geräte-Power-Up IRPs

Geräteinbetriebs-IRPs geben IRP_MN_SET_POWER und einen Geräteleistungszustand an, der mehr Leistung als der aktuelle Gerätestromzustand erfordert. In der Regel gibt ein Power-Up-IRP den Gerätebetriebszustand PowerDeviceD0 an.

Anforderungen zum Einschalten eines Geräts müssen zuerst vom zugrunde liegenden Bustreiber für das Gerät und dann von jedem aufeinanderfolgenden Treiber verarbeitet werden, der den Stapel zurückgibt.

Die folgende Abbildung zeigt die Schritte für die Behandlung eines Power-up-IRP.

Diagramm zur Veranschaulichung der Behandlung einer Geräteinbetriebsanforderung.

Bei der Verarbeitung einer IRP_MN_SET_POWER Anforderung für das Einschalten muss ein Funktions- oder Filtertreiber:

  • Rufen Sie IoAcquireRemoveLock auf, um sicherzustellen, dass der Treiber während der Verarbeitung des Power-Up-IRP keine 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 dann den Fehler status zurückzugeben. In Windows Server 2003, Windows XP und Windows 2000 sollte der Treiber IoCompleteRequest aufrufen, um die IRP abzuschließen, dann PoStartNextPowerIrp aufrufen, um die nächste Energie-IRP zu starten, und dann den Fehler status zurückgeben.

  • Rufen Sie IoMarkIrpPending auf, um den IRP ausstehend zu markieren.

  • Rufen Sie IoCopyCurrentIrpStackLocationToNext auf, um den IRP-Stapelspeicherort festzulegen. Ein Treiber darf IoSkipCurrentIrpStackLocation nicht aufrufen, wenn er eine IoCompletion-Routine festlegt.

  • Rufen Sie IoSetCompletionRoutine auf, um eine Power-up-IoCompletion-Routine einzurichten.

    Bei der Behandlung einer Geräteeinschalt-IRP sollte der Treiber eine IoCompletion-Routine einrichten, um den Kontext wiederherzustellen, die Entfernungssperre freizugeben und andere erforderliche Aufgaben auszuführen, nachdem das IRP abgeschlossen und das Gerät eingeschaltet wurde. Der Treiber sollte den Kontext nicht wiederherstellen, bevor die IRP abgeschlossen ist. Weitere Informationen finden Sie unter IoCompletion-Routinen für Power IRPs für Geräte.

  • Rufen Sie IoCallDriver (in Windows 7 und Windows Vista) oder PoCallDriver (Windows Server 2003, Windows XP und Windows 2000) auf, um das IRP an den nächstniedrigen Treiber zu übergeben. Der IRP muss den gesamten Weg nach unten im Gerätestapel zum Bustreiber führen. Nur der Bustreiber darf die IRP abschließen.

  • Gibt STATUS_PENDING zurück.

Wenn der Bustreiber die IRP empfängt, sollte er zuerst überprüfen, ob das Gerät noch vorhanden ist und nicht entfernt oder ausgetauscht wurde, während er im Ruhezustand ist. Wenn das Gerät nicht mehr vorhanden ist, sollte der Bustreiber IoInvalidateDeviceRelations auf dem übergeordneten Gerät aufrufen, um den Plug & Play-Manager zu benachrichtigen, dass das Gerät nicht mehr vorhanden ist. In diesem Fall kann der Bustreiber die Geräteeinschalt-IRP nicht mehr ausführen.

Wenn das Gerät noch vorhanden ist, führt der Bustreiber die erforderlichen Aufgaben aus, um das Gerät in einen Betriebszustand zurückzusetzen, ruft PoSetPowerState auf, um den Energie-Manager über den neuen Gerätestromzustand zu informieren, und schließt die IRP (IoCompleteRequest) ab. Wenn Treiber E/A in die Warteschlange gestellt haben, während sich das Gerät im Ruhezustand befand, oder wenn das Gerät ein Einschaltgerät benötigt, wendet der Bustreiber Strom auf das Gerät an. Andernfalls wendet der Bustreiber Strom an, sobald er mit dem Gerät kommunizieren muss.

Eine Liste der bewährten Methoden zum Erzielen schneller Startzeiten durch Aus-, Standby- und Ruhezustandszustände finden Sie unter Verbessern der Systemstartleistung.