Freigeben über


Verwenden von Power Manager-Routinen für die Leerlauferkennung

Der Energie-Manager bietet Unterstützung für die Leerlauferkennung über die Routinen PoRegisterDeviceForIdleDetection und PoSetDeviceBusy .

Um die Leerlauferkennung für sein Gerät zu aktivieren, ruft ein Besitzer der Geräteenergierichtlinie PoRegisterDeviceForIdleDetection auf und gibt Folgendes an:

  • Der Leerlauftimeoutwert, der angewendet werden soll, wenn das System die Leistung optimiert.

  • Der Leerlauftimeoutwert, der angewendet werden soll, wenn das System für die Erhaltung optimiert wird.

  • Der Gerätestromzustand, in den das Gerät im Leerlauf übergehen soll.

PoRegisterDeviceForIdleDetection gibt einen Zeiger auf einen Leerlaufzähler zurück, den der Treiber später verwendet, um die Leerlauferkennung zu deaktivieren. Aufrufer von PoRegisterDeviceForIdleDetection müssen im IRQL-DISPATCH_LEVEL < ausgeführt werden.

Ein Treiber kann sein Gerät jederzeit nach dem Starten des Geräts für die Erkennung im Leerlauf registrieren und ist bereit für die Verarbeitung von Energie-IRPs des Geräts. Beispielsweise kann ein Treiber die Leerlauferkennung als Teil seiner IoCompletion-Routine für ein PnP-Startgerät-IRP aktivieren.

Die Timeoutwerte für ein bestimmtes Gerät sollten proportional zur Einschaltwartezeit des Geräts und basierend auf dem beobachteten Geräteverhalten sein. Für Geräte bestimmter Typen kann ein Treiber Erhaltungs- und Leistungstimeoutwerte von -1 angeben, um die Standardmäßigen Energierichtlinientimeouts für die Geräteklasse zu verwenden. Weitere Informationen finden Sie in der gerätespezifischen Dokumentation.

Wenn das Gerät verwendet wird, muss der Treiber PoSetDeviceBusy aufrufen und dabei den von PoRegisterDeviceForIdleDetection zurückgegebenen Zeiger übergeben. PoSetDeviceBusy setzt den Leerlaufzähler zurück und startet so den Leerlauf-Countdown für das Gerät neu. Der Treiber sollte PoSetDeviceBusy bei jedem E/A-Vorgang aufrufen.

Um zu bestimmen, ob sich das Gerät im Leerlauf befindet, vergleicht der Energie-Manager den Wert des Leerlaufzählers mit dem vom Treiber angegebenen Leerlauftimeoutwert für die aktuelle Systemenergierichtlinie (entweder Erhaltung oder Leistung). Weitere Informationen zu Funktionen im Zusammenhang mit der Systemenergierichtlinie finden Sie in der Microsoft Windows SDK.

Wenn das Gerät den Timeoutwert erfüllt, sendet der Energie-Manager eine Gerätesatz-Leistungs-IRP und gibt den Geräteleistungszustand an, den der Treiber in seinem Aufruf an PoRegisterDeviceForIdleDetection übergeben hat. Der Energie-Manager sendet vor dem Senden der Set-Power-IRP keine Abfrage-IRP. Die Treiber im Stapel verarbeiten die Set-Power-IRP wie alle anderen; sie müssen es rechtzeitig abschließen, und sie können es nicht scheitern. (Siehe Behandeln von Geräte-Power-Down IRPs.)

Wenn der Treiber keine Leerlauferkennung mehr erfordert oder nicht bereit ist, heruntergefahrene Geräte-IRPs zu verarbeiten, sollte er PoRegisterDeviceForIdleDetection erneut aufrufen und für beide Timeoutwerte null übergeben. Wenn Sie die Timeouts auf 0 festlegen, wird die Leerlauferkennung sowohl für Energierichtlinien zur Erhaltung (Akku) als auch für die Leistung (AC) deaktiviert. Der Treiber kann die Leerlauferkennung schnell wieder aktivieren. Es ruft einfach PoRegisterDeviceForIdleDetection mit Timeoutwerten ungleich null auf. Nachdem der Treiber das Gerät registriert hat, kann er die Leerlauferkennung aktivieren und deaktivieren, indem er die Timeoutwerte ändert, auch wenn das Gerät ausgeschaltet und wieder aktiviert wurde.