PortCls プライベート PEP コンテキストの共有

Windows 8 以降、ミニポート ドライバーは、Windows Power Engine Plug-in (PEP) とのプライベート コンテキスト共有のため、新しいインターフェイスである IPortClsRuntimePower を使用できるようになりました。

オーディオ ポート クラス ドライバー (PortCls) が更新され、WaveRT ポート上で新しいインターフェイスである IPortClsRuntimePower が公開されました。 ミニポート ドライバーがプライベート電源制御をオペレーティング システムの PEP に送信するには、ミニポート ドライバーはまず、それに関連付けられているポートの IPortClsRuntimePower インターフェイスへのアクセスを取得する必要があります。 次に、ミニポート ドライバーは、適切なタイミングで呼び出されるコールバックを登録し、ミニポート ドライバーがプライベート電源制御を送信できるようにします。

IPortClsRuntimePower へのアクセス

ミニポート ドライバーは、次の一連のイベントを通じてそのポートの IPortClsRuntimePower にアクセスします:

  1. ミニポート ドライバーは PcNewPort を呼び出し、IID_IPortWaveRT を REFID として提供します。

  2. PcNewPort は、IPortWaveRT タイプのポート インターフェイス (Pport) を作成します。

  3. 次に、ミニポート ドライバーは、新しく作成された IPortWaveRT ポート インターフェイス内のQueryInterface を呼び出し、インターフェイス GUID として IID_IPortClsRuntimePower を指定します。

  4. IPortWaveRT ポート インターフェイスは、ミニポート ドライバーにその IPortClsRuntimePower インターフェイスへのポインターを提供します。

Portcls.h ヘッダー ファイルは、IPortClsRuntimePower の GUID を次のように定義します:

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

コールバックの登録

ミニポート ドライバーは、IPortClsRuntimePower::RegisterPowerControlCallback 方式を使用してコールバックを登録します。 この方式は、PEP がプライベート リクエストを開始するとき、またはミニポート ドライバー自体によって開始されるプライベート リクエストに応答して呼び出されます。 コールバック登録は通常、ドライバーが IRP_MN_START_DEVICE PNP Irp を処理している間に実行する必要があります。

コールバックで提供される Context ポインターの以外、他のパラメーターはランタイム電源フレームワークの PowerControlCallback の定義と同じように定義されます。 さらに、ミニポートのコールバックは、Portcls.h ヘッダー ファイルの次のスニペットで定義されるように、PCPFNRUNTIME_POWER_CONTROL_CALLBACK タイプである必要があります。

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
);

ドライバーが停止または削除された場合、それはIPortClsRuntimePower::UnregisterPowerControlCallback方式を使用して、登録されているコールバックの登録を解除する必要があります。

プライベート電源制御の送信

ミニポートが IPortClsRuntimePower インターフェイスへのアクセスを確立し、インターフェイスの RegisterPowerControlCallback 方式を使用してコールバックを登録した後、今プライベート電源制御を送信する準備が整いました。 コールバック方式が呼び出されると、ミニポート ドライバーは IPortClsRuntimePower::SendPowerControl 方式を使用してプライベート電源制御を Windows PEP に送信します。

DeviceObject パラメータを除いて、他のすべてのパラメーターは、ランタイム電源フレームワークの PoFxPowerControl 方式のパラメーターと同じように定義されます。