Freigeben über


DispatchPower Routinen

Die DispatchPower-Routine eines Treibers unterstützt die Energieverwaltung, indem IRPs für den IRP_MJ_POWER E/A-Funktionscode verarbeitet werden. Dem IRP_MJ_POWER-Funktionscode sind mehrere kleinere E/A-Funktionscodes für die Energieverwaltung zugeordnet. Der Power-Manager verwendet diese Hilfsfunktionscodes, um Treiber zum Ändern von Energiezuständen zu leiten, auf Systemaktivierungsereignisse zu warten und darauf zu reagieren sowie Treiber über ihre Geräte abzufragen.

Jede DispatchPower-Routine des Fahrers führt die folgenden Aufgaben aus:

  • Bearbeiten Sie das IRP, wenn möglich.

  • Übergeben Sie das IRP an den nächsten unteren Treiber im Gerätestapel mithilfe von PoCallDriver.

  • Führen Sie bei einem Bus-Treiber die angeforderte Energieoperation auf dem Gerät aus, und schließen Sie das IRP ab.

Alle Treiber für ein Gerät müssen die Möglichkeit haben, Energie-IRPs für das Gerät zu verarbeiten, außer in einigen Fällen, in denen ein Funktions- oder Filtertreiber das IRP ablehnen darf. Die meisten Funktions- und Filtertreiber führen entweder eine Verarbeitung durch oder legen eine IoCompletion-Routine für jeden Leistungs-IRP fest und übergeben dann das IRP an den nächsten niedrigeren Treiber, ohne ihn abzuschließen. Schließlich erreicht das IRP den Bustreiber, der den Energiezustand des Geräts bei Bedarf physisch ändert und das IRP abschließt.

Nach Abschluss des IRP ruft der E/A-Manager alle IoCompletion-Routinen auf, die von Treibern festgelegt wurden, da die IRP den Gerätestapel nach unten bewegt hat. Ob ein Treiber eine Abschlussroutine festlegen muss, hängt vom Typ des IRP und den individuellen Anforderungen des Treibers ab.

Power IRPs, die ein Gerät einschalten, müssen zuerst vom niedrigsten Treiber im Gerätestapel (dem zugrunde liegenden Bustreiber) und dann von jedem aufeinander folgenden Treiber auf dem Stapel verarbeitet werden. Energie-IRPs, die ein Gerät herunterfahren, müssen zuerst vom Treiber am Anfang des Gerätestapels behandelt werden und dann von jedem aufeinanderfolgenden Treiber, der den Stapel hinuntergeht.

Spezielle Handhabung für Wechselgeräte

In ihren DispatchPower-Routinen sollten Treiber von Wechselgeräten überprüfen, ob das Gerät noch vorhanden ist. Wenn das Gerät entfernt wurde, sollte der Treiber das IRP nicht an den nächsten unteren Treiber übergeben. Stattdessen sollte der Treiber folgendes ausführen:

  • Rufen Sie PoStartNextPowerIrp auf, um mit der Verarbeitung des nächsten Energie-IRP zu beginnen.

  • Legen Sie Irp-IoStatus.Status> auf STATUS_DELETE_PENDING fest.

  • Rufen Sie IoCompleteRequest auf, um IO_NO_INCREMENT anzugeben, um das IRP abzuschließen.

  • Gibt STATUS_DELETE_PENDING zurück.