PortCls Private PEP-Kontextfreigabe

Ab Windows 8 kann ein Miniporttreiber IPortClsRuntimePower, eine neue Schnittstelle, für die private Kontextfreigabe mit dem Windows Power Engine Plug-In (PEP) verwenden.

Der Audioportklassentreiber (PortCls) wurde aktualisiert, um die neue Schnittstelle IPortClsRuntimePower auf dem WaveRT-Port verfügbar zu machen. Damit ein Miniporttreiber private Stromversorgungssteuerungen an das PEP des Betriebssystems sendet, muss der Miniporttreiber zuerst Zugriff auf die IPortClsRuntimePower-Schnittstelle des zugehörigen Ports erhalten. Der Miniporttreiber registriert dann einen Rückruf, der zum entsprechenden Zeitpunkt aufgerufen wird, sodass der Miniporttreiber die privaten Energiesteuerungen senden kann.

Zugreifen auf IPortClsRuntimePower

Der Miniporttreiber erhält über die folgende Ereignissequenz Zugriff auf die IPortClsRuntimePower seines Ports:

  1. Der Miniporttreiber ruft PcNewPort auf und stellt IID_IPortWaveRT als REFID bereit.

  2. PcNewPort erstellt eine Portschnittstelle (Pport) vom Typ IPortWaveRT.

  3. Der Miniporttreiber ruft dann QueryInterface in der neu erstellten IPortWaveRT-Portschnittstelle auf und gibt IID_IPortClsRuntimePower als Schnittstellen-GUID an.

  4. Die IPortWaveRT-Portschnittstelle stellt dem Miniporttreiber einen Zeiger auf seine IPortClsRuntimePower-Schnittstelle bereit.

Die Portcls.h-Headerdatei definiert die GUID für IPortClsRuntimePower wie folgt:

// {E057C351-0430-4DBC-B172-C711D40A2373}
DEFINE_GUID(IID_IPortClsRuntimePower,
0xe057c351, 0x430, 0x4dbc, 0xb1, 0x72, 0xc7, 0x11, 0xd4, 0xa, 0x23, 0x73);

Registrieren eines Rückrufs

Der Miniporttreiber verwendet die IPortClsRuntimePower::RegisterPowerControlCallback-Methode , um einen Rückruf zu registrieren. Diese Methode wird aufgerufen, wenn pep eine private Anforderung initiiert oder als Antwort auf eine private Anforderung, die vom Miniporttreiber selbst initiiert wird. Die Rückrufregistrierung sollte in der Regel ausgeführt werden, während der Treiber die IRP_MN_START_DEVICE PNP-Irp verarbeitet.

Abgesehen von dem Kontextzeiger, der im Rückruf bereitgestellt wird, werden die anderen Parameter identisch mit den Definitionen für powerControlCallback des Runtime-PowerFrameworks definiert. Darüber hinaus muss der Rückruf des Miniports vom Typ PCPFNRUNTIME_POWER_CONTROL_CALLBACK sein, wie im folgenden Codeausschnitt aus der Headerdatei Portcls.h definiert.

typedef
NTSTATUS
_IRQL_requires_max_(DISPATCH_LEVEL)
(*PCPFNRUNTIME_POWER_CONTROL_CALLBACK)
(
    _In_        LPCGUID PowerControlCode,
    _In_opt_    PVOID   InBuffer,
    _In_        SIZE_T  InBufferSize,
    _Out_opt_   PVOID   OutBuffer,
    _In_        SIZE_T  OutBufferSize,
    _Out_opt_   PSIZE_T BytesReturned,
    _In_opt_    PVOID   Context
);

Wenn der Treiber beendet oder entfernt wird, muss er die IPortClsRuntimePower::UnregisterPowerControlCallback-Methode verwenden, um die Registrierung registrierter Rückrufe aufzuheben.

Senden privater Energiesteuerungen

Nachdem der Miniport den Zugriff auf eine IPortClsRuntimePower-Schnittstelle eingerichtet und die RegisterPowerControlCallback-Methode der Schnittstelle verwendet, um einen Rückruf zu registrieren, kann er jetzt private Energiesteuerungen senden. Wenn die Rückrufmethode aufgerufen wird, verwendet der Miniporttreiber die IPortClsRuntimePower::SendPowerControl-Methode , um die privaten Energiesteuerelemente an windows PEP zu senden.

Mit Ausnahme des DeviceObject-Parameters sind alle anderen Parameter identisch mit denen für die PoFxPowerControl-Methode des Laufzeit-Powerframeworks.