PortCls 专用 PEP 上下文共享

从 Windows 8 开始,微型端口驱动程序可以使用 IPortClsRuntimePower(新接口)与 Windows Power Engine 插件 (PEP) 进行专用上下文共享。

音频端口类驱动程序 (PortCls) 已更新,以在 WaveRT 端口上公开新接口 IPortClsRuntimePower。 为了使微型端口驱动程序将专用电源控件发送到操作系统的 PEP,微型端口驱动器首先必须获得对其相关端口的 IPortClsRuntimePower 接口的访问权限。 然后,微型端口驱动程序注册一个回调,该回调将在适当的时间调用,从而允许微型端口驱动器发送专用电源控件。

访问 IPortClsRuntimePower

微型端口驱动程序通过以下事件序列获取对其端口的 IPortClsRuntimePower 的访问权限:

  1. 微型端口驱动程序调用 PcNewPort,并提供 IID_IPortWaveRT 作为 REFID。

  2. PcNewPort 创建 IPortWaveRT 类型的端口接口 (Pport)。

  3. 然后,微型端口驱动程序在新创建的 IPortWaveRT 端口接口中调用 QueryInterface,并将 IID_IPortClsRuntimePower 指定为接口 GUID。

  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 时执行。

除了回调中提供的上下文指针之外,其他参数的定义与运行时电源框架的 PowerControlCallback 的定义相同。 此外,微型端口的回调类型必须为 PCPFNRUNTIME_POWER_CONTROL_CALLBACK,如 Portcls.h 头文件中的以下代码片段中所定义。

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 方法相同。