IoCompletion-Routinen für Geräte-Power IRPs

Nachdem der Bustreiber die IRP abgeschlossen hat, ruft der E/A-Manager die IoCompletion-Routinen auf, die von übergeordneten Treibern registriert wurden, während sie die IRP im Stapel übergeben haben.

Wenn ein Gerät in den D0-Zustand wechselt, sollte jeder seiner Treiber eine IoCompletion-Routine festlegen, die die meisten Aufgaben ausführt, die erforderlich sind, um es in den Arbeitszustand zurück zu versetzen. Treiber sollten eine IoCompletion-Routine für jeden Übergang zum D0-Zustand festlegen, unabhängig davon, ob das Gerät aus einem Ruhezustand zurückkehrt oder beim Systemstart D0 eingibt. Die folgende Abbildung zeigt die Aufgaben, die eine IoCompletion-Routine ausführen sollte.

Diagramm, das die Iocompletion-Routine für das Einschalten des Geräts veranschaulicht.

Diese Aufgaben sind:

  • Wiederherstellen des Gerätestromzustands oder Erneutes Initialisieren des Geräts nach Bedarf und Vorbereitung der Verarbeitung von E/A-Warteschlangen durch Treiber, während sich das Gerät nicht im Betriebszustand befand

  • Aufrufen von PoSetPowerState , um den Power-Manager zu benachrichtigen, dass sich das Gerät im D0-Energiezustand befindet.

  • Aufrufen von PoStartNextPowerIrp , um die nächste Energie-IRP zu erhalten, wenn der Treiber ursprünglich nicht die aktuelle Strom-IRP gesendet hat. (Nur Windows Server 2003, Windows XP und Windows 2000).

  • Freigeben von Arbeitsspeicher, der für den Gerätekontext zugewiesen ist.

  • Aufrufen von IoReleaseRemoveLock , um die Sperre freizusetzen, die der Treiber in seiner DispatchPower-Routine erworben hat, als er die IRP empfangen hat.

  • Gibt STATUS_SUCCESS zurück.

Der Bustreiber fährt das Gerät erst ein, wenn es oder höhere Treiber mit dem Gerät kommunizieren müssen.

Wenn das Gerät in einen Ruhezustand versetzt wird, sollte ein Treiber eine IoCompletion-Routine festlegen, die PoStartNextPowerIrp aufruft (nur Windows Server 2003, Windows XP und Windows 2000) und die Entfernungssperre aufgibt. Denken Sie daran, dass ein Treiber nicht auf sein Gerät zugreifen kann, während sich das Gerät im Ruhezustand befindet.