Freigeben über


REQUEST_POWER_COMPLETE Rückruffunktion (wdm.h)

Die PowerCompletion Rückrufroutine schließt die Verarbeitung eines Energie-IRP ab.

Syntax

REQUEST_POWER_COMPLETE RequestPowerComplete;

void RequestPowerComplete(
  [in]           PDEVICE_OBJECT DeviceObject,
  [in]           UCHAR MinorFunction,
  [in]           POWER_STATE PowerState,
  [in, optional] PVOID Context,
  [in]           PIO_STATUS_BLOCK IoStatus
)
{...}

Parameter

[in] DeviceObject

Ein Zeiger auf das Ziel DEVICE_OBJECT für den abgeschlossenen Leistungs-IRP.

[in] MinorFunction

Gibt den Hilfsfunktionscode im Power-IRP an. Weitere Informationen finden Sie in der Liste der unterstützten IRP_MN_XXX- Codes im Abschnitt "Hinweise".

[in] PowerState

Gibt den oder Systemstromzustand an, der an die PoRequestPowerIrp Routine übergeben wurde.

[in, optional] Context

Ein Zeiger auf den Kontext, der an PoRequestPowerIrpübergeben wurde.

[in] IoStatus

Ein Zeiger auf die IO_STATUS_BLOCK Struktur für das fertige IRP.

Rückgabewert

Nichts

Bemerkungen

Ein Treiber, der einen Strom-IRP sendet, muss möglicherweise zusätzliche Aufgaben ausführen, nachdem alle anderen Treiber das IRP abgeschlossen haben. Wenn ja, sollte der sendende Treiber eine PowerCompletion- Rückrufroutine während des Aufrufs an die PoRequestPowerIrp Routine registrieren, die das IRP zuweist.

Die PowerCompletion Callbackroutine eines Treibers wird nur für IRP_MJ_POWER IRPs verwendet, die kleinere IRP-Codes von IRP_MN_SET_POWER, IRP_MN_QUERY_POWERund IRP_MN_WAIT_WAKEaufweisen. Weitere Informationen finden Sie unter Senden von IRP_MN_QUERY_POWER oder IRP_MN_SET_POWER für Geräte-Power States und Wait/Wake Callback Routines.

Der E/A-Manager ruft die PowerCompletion Routine des sendenden Treibers nur auf, nachdem der E/A-Manager alle IoCompletion- Routinen aufgerufen hat, die von anderen Treibern festgelegt wurden, während sie den IRP-Wert im Stapel übergeben haben. Die PowerCompletion Routine führt alle zusätzlichen Aufgaben aus, die der Absender des IRP erfordert, nachdem alle anderen Treiber das IRP abgeschlossen haben. Die PowerCompletion Routine sollte das IRP nicht freigeben – das macht der Power Manager.

Die PowerCompletion Routine wird bei IRQL = PASSIVE_LEVEL oder IRQL = DISPATCH_LEVEL aufgerufen.

Beispiele

Um eine PowerCompletion- Rückrufroutine zu definieren, müssen Sie zuerst eine Funktionsdeklaration bereitstellen, die den Typ der von Ihnen definierten Rückrufroutine identifiziert. Windows stellt eine Reihe von Rückruffunktionstypen für Treiber bereit. Durch das Deklarieren einer Funktion mithilfe der Rückruffunktionstypen können Codeanalyse für Treiber, statische Treiberüberprüfung (SDV) und andere Überprüfungstools Fehler finden, und es ist eine Anforderung zum Schreiben von Treibern für das Windows-Betriebssystem.

Wenn Sie beispielsweise eine PowerCompletion- Rückrufroutine definieren möchten, die MyPowerCompletionbenannt ist, verwenden Sie den REQUEST_POWER_COMPLETE Typ wie in diesem Codebeispiel gezeigt:

REQUEST_POWER_COMPLETE MyPowerCompletion;

Implementieren Sie dann Ihre Rückrufroutine wie folgt:

_Use_decl_annotations_
VOID
  MyPowerCompletion(
    PDEVICE_OBJECT DeviceObject,
    UCHAR MinorFunction,
    POWER_STATE PowerState,
    PVOID Context,
    PIO_STATUS_BLOCK IoStatus
    )
  {
      // Function body
  }

Der REQUEST_POWER_COMPLETE Funktionstyp wird in der Wdm.h-Headerdatei definiert. Um Fehler genauer zu identifizieren, wenn Sie die Codeanalysetools ausführen, müssen Sie der Funktionsdefinition die _Use_decl_annotations_ Anmerkung hinzufügen. Die _Use_decl_annotations_ Anmerkung stellt sicher, dass die Anmerkungen, die auf den Funktionstyp REQUEST_POWER_COMPLETE in der Headerdatei angewendet werden, verwendet werden. Weitere Informationen zu den Anforderungen für Funktionsdeklarationen finden Sie unter Deklarieren von Funktionen mithilfe von Funktionsrollentypen für WDM-Treiber. Informationen zu _Use_decl_annotations_finden Sie unter Annotating Function Behavior.

Anforderungen

Anforderung Wert
Zielplattform- Desktop
Header- wdm.h (include Wdm.h, Ntddk.h, Ntifs.h)
IRQL- Wird bei IRQL-<= DISPATCH_LEVEL aufgerufen (siehe Abschnitt "Hinweise").

Siehe auch

DEVICE_OBJECT

IO_STATUS_BLOCK

IRP_MJ_POWER

IRP_MN_QUERY_POWER

IRP_MN_SET_POWER

IRP_MN_WAIT_WAKE

IoCompletion-

PoRequestPowerIrp