PoFxActivateComponent-Funktion (wdm.h)

Die PoFxActivateComponent-Routine erhöht die Anzahl der Aktivierungsreferenzen für die angegebene Komponente.

Syntax

void PoFxActivateComponent(
  [in] POHANDLE Handle,
  [in] ULONG    Component,
  [in] ULONG    Flags
);

Parameter

[in] Handle

Ein Handle, das die Registrierung des Geräts mit dem Power Management Framework (PoFx) darstellt. Der Gerätetreiber hat dieses Handle zuvor von der PoFxRegisterDevice-Routine erhalten.

[in] Component

Der Index, der die Komponente identifiziert. Dieser Parameter ist ein Index in das Array Components in der PO_FX_DEVICE Struktur, die der Gerätetreiber zum Registrieren des Geräts bei PoFx verwendet hat. Wenn das Komponentenarray N-Elemente enthält, reichen die Komponentenindizes von 0 bis N–1.

[in] Flags

Die Flags für den Aktivierungsvorgang. Legen Sie diesen Member auf null oder auf eines der folgenden Flags PO_FX_FLAG_XXX-Bits fest:

Diese beiden Flagbits schließen sich gegenseitig aus. Weitere Informationen finden Sie in den Hinweisen.

Wert Bedeutung
PO_FX_FLAG_BLOCKING
0x1
Stellen Sie die Bedingungsänderung synchron fest. Wenn dieses Flag festgelegt ist, gibt die Routine, die die Bedingungsänderung anfordert, die Steuerung an den aufrufenden Treiber zurück, bis die Komponentenhardware den Übergang zur neuen Bedingung abgeschlossen hat. Dieses Flag kann nur verwendet werden, wenn der Aufrufer bei IRQL < DISPATCH_LEVEL ausgeführt wird.
PO_FX_FLAG_ASYNC_ONLY
0x2
Machen Sie die Bedingungsänderung vollständig asynchron. Wenn dieses Flag festgelegt ist, wird die Rückrufroutine des aufrufenden Treibers von einem anderen Thread als dem Thread aufgerufen, in dem die Routine aufgerufen wird, die die Bedingungsänderung anfordert. Daher gibt die Routine, die die Bedingungsänderung anfordet, immer asynchron zurück, ohne auf den Abschluss des Rückrufs zu warten.

Rückgabewert

Keine

Bemerkungen

Bevor ein Gerätetreiber auf eine Komponente in einem Gerät zugreifen kann, muss der Treiber zuerst PoFxActivateComponent aufrufen, um einen Aktivierungsverweis für die Komponente abzurufen. Wenn sich die Komponente noch nicht in der aktiven Bedingung befindet, initiiert dieser Aufruf einen Übergang von der Leerlaufbedingung zur aktiven Bedingung. Wenn dieser Übergang abgeschlossen ist, ruft PoFx die ComponentActiveConditionCallback-Routine des Treibers auf, um den Treiber zu benachrichtigen. Der Treiber kann nur dann auf die Hardwareregister in einer Komponente zugreifen, wenn sich die Komponente im aktiven Zustand befindet.

Wenn sich die Komponente bereits in der aktiven Bedingung befindet, wenn PoFxActivateComponent aufgerufen wird, ist kein Übergang erforderlich, und die ComponentActiveConditionCallback-Routine wird nicht aufgerufen.

Nachdem eine Komponente die aktive Bedingung eingegeben hat, bleibt sie in der aktiven Bedingung, solange der Treiber mindestens einen Aktivierungsverweis für die Komponente enthält. Um eine Aktivierungsreferenz freizugeben, ruft der Treiber die PoFxIdleComponent-Routine auf . Wenn der Treiber die letzte Aktivierungsreferenz für eine Komponente freigibt, initiiert PoFxIdleComponent einen Übergang von der aktiven Bedingung zur Leerlaufbedingung. Eine Komponente, die sich im Leerlauf befindet, kann möglicherweise in einen Fx-Zustand mit geringer Leistung wechseln.

Wenn Flags = PO_FX_FLAG_BLOCKING, ist der PoFxActivateComponent-Aufruf synchron. Wenn sich die Komponente bereits in der aktiven Bedingung befindet, erhöht der Aufruf die Anzahl der Aktivierungsreferenzen und gibt ohne Warten zurück. Andernfalls wartet PoFxActivateComponent auf die Rückgabe, bis die Komponente den Übergang zur aktiven Bedingung abgeschlossen hat. In diesem Fall ruft PoFxActivateComponent die ComponentIdleStateCallback-Routine des Treibers auf, um den Übergang zu F0 zu initiieren. Nachdem die Komponente in den F0-Zustand versetzt wurde, ruft PoFxActivateComponent die ComponentActiveConditionCallback-Routine des Treibers auf, um den Treiber darüber zu informieren, dass sich die Komponente in der aktiven Bedingung befindet. Diese Rückrufe erfolgen im selben Thread wie der Aufruf von PoFxActivateComponent, und PoFxActivateComponent gibt erst zurück, nachdem der ComponentActiveConditionCallback-Rückruf zurückgegeben wurde.

Wenn Flags = PO_FX_FLAG_ASYNC_ONLY, ist der PoFxActivateComponent-Aufruf asynchron. Wenn sich die Komponente bereits in der aktiven Bedingung befindet, erhöht der Aufruf die Anzahl der Aktivierungsreferenzen und gibt zurück. Andernfalls plant PoFxActivateComponent , dass die Rückrufe ComponentIdleStateCallback (falls erforderlich) und ComponentActiveConditionCallback in einem anderen Thread auftreten, und gibt dann zurück, ohne darauf zu warten, dass ein Rückruf erfolgt. Die Rückrufe können vor oder nach der Rückgabe von PoFxActivateComponent erfolgen. Der Treiber verwendet den ComponentActiveConditionCallback-Rückruf , um zu bestimmen, wann die Komponente den Übergang zur aktiven Bedingung abgeschlossen hat.

Der Treiber kann Flags = 0 festlegen, um anzugeben, dass es nicht wichtig ist, ob der PoFxActivateComponent-Aufruf synchron oder asynchron ist. In diesem Fall entscheidet PoFx, ob der Aufruf synchron oder asynchron ausgeführt werden soll.

Zwei oder mehr Codepfade im selben Treiber müssen möglicherweise gleichzeitig auf eine bestimmte Komponente zugreifen. Die Routinen PoFxActivateComponent und PoFxIdleComponent verwenden Aktivierungsreferenzzählungen, um es den verschiedenen Komponenten des Treibers zu ermöglichen, den Zugriff auf die Komponente unabhängig zu verwalten, ohne dass der Treiber den Zugriff auf die Komponente zentral verwalten muss.

PoFx verwaltet eine Aktivierungsverweisanzahl für jede Komponente in einem Gerät. Ein PoFxActivateComponent-Aufruf erhöht diese Anzahl um einen, und ein PoFxIdleComponent-Aufruf dekrementiert die Anzahl um eins. Wenn die Anzahl nichtzero ist, befindet sich die Komponente entweder in der aktiven Bedingung oder ist gerade dabei, zur aktiven Bedingung zu wechseln. Eine Komponente mit einer Anzahl von null befindet sich entweder im Leerlauf oder ist gerade dabei, zur Leerlaufbedingung zu wechseln.

Wenn ein PoFxActivateComponent-Aufruf bewirkt, dass die Anzahl der Aktivierungsverweise von 0 auf 1 inkrementiert wird, initiiert PoFxActivateComponent einen Übergang von der Leerlaufbedingung zur aktiven Bedingung. Wenn ein PoFxIdleComponent-Aufruf bewirkt, dass die Anzahl von 1 auf 0 verringert wird, initiiert PoFxIdleComponent einen Übergang von der aktiven Bedingung zur Leerlaufbedingung.

PoFx benachrichtigt den Treiber, wenn ein Übergang zwischen der aktiven Bedingung und der Leerlaufbedingung auftritt. Ein ComponentActiveConditionCallback-Rückruf benachrichtigt den Treiber über einen Übergang zur aktiven Bedingung, und ein ComponentIdleConditionCallback-Rückruf benachrichtigt den Treiber über einen Übergang zur Leerlaufbedingung. Wenn ein PoFxActivateComponent - oder PoFxIdleComponent-Aufruf die Anzahl der Aktivierungsreferenzen einfach erhöht oder dekrementiert, ohne einen solchen Übergang zu verursachen, erhält der Treiber keine Benachrichtigung.

Anforderungen

Anforderung Wert
Unterstützte Mindestversion (Client) Verfügbar ab Windows 8.
Zielplattform Universell
Header wdm.h
Bibliothek Ntoskrnl.lib
DLL Ntoskrnl.exe
IRQL <= DISPATCH_LEVEL

Weitere Informationen

ComponentActiveConditionCallback

ComponentIdleStateCallback

PO_FX_DEVICE

PoFxIdleComponent

PoFxRegisterDevice