PortCls 专用 PEP 上下文共享
从 Windows 8 开始,微型端口驱动程序可以使用 IPortClsRuntimePower(新接口)与 Windows Power Engine 插件 (PEP) 进行专用上下文共享。
音频端口类驱动程序 (PortCls) 已更新,以在 WaveRT 端口上公开新接口 IPortClsRuntimePower。 为了使微型端口驱动程序将专用电源控件发送到操作系统的 PEP,微型端口驱动器首先必须获得对其相关端口的 IPortClsRuntimePower 接口的访问权限。 然后,微型端口驱动程序注册一个回调,该回调将在适当的时间调用,从而允许微型端口驱动器发送专用电源控件。
访问 IPortClsRuntimePower
微型端口驱动程序通过以下事件序列获取对其端口的 IPortClsRuntimePower 的访问权限:
微型端口驱动程序调用 PcNewPort,并提供 IID_IPortWaveRT 作为 REFID。
PcNewPort 创建 IPortWaveRT 类型的端口接口 (Pport)。
然后,微型端口驱动程序在新创建的 IPortWaveRT 端口接口中调用 QueryInterface,并将 IID_IPortClsRuntimePower 指定为接口 GUID。
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 方法相同。