REQUEST_POWER_COMPLETE回调函数 (wdm.h)
PowerCompletion 回调例程完成对电源 IRP 的处理。
语法
REQUEST_POWER_COMPLETE RequestPowerComplete;
void RequestPowerComplete(
[in] PDEVICE_OBJECT DeviceObject,
[in] UCHAR MinorFunction,
[in] POWER_STATE PowerState,
[in, optional] PVOID Context,
[in] PIO_STATUS_BLOCK IoStatus
)
{...}
参数
[in] DeviceObject
指向已完成电源 IRP 的目标 DEVICE_OBJECT 的指针。
[in] MinorFunction
指定电源 IRP 中的次要函数代码。 有关详细信息,请参阅“备注”部分中支持的 IRP_MN_XXX 代码列表。
[in] PowerState
指定传递给 PoRequestPowerIrp 例程 或 系统电源状态 设备电源状态。
[in, optional] Context
指向传递给 PoRequestPowerIrp的上下文的指针。
[in] IoStatus
指向已完成 IRP 的 IO_STATUS_BLOCK 结构的指针。
返回值
没有
言论
在所有其他驱动程序完成 IRP 后,发送电源 IRP 的驱动程序可能需要执行其他任务。 如果是这样,发送驱动程序应在调用分配 IRP 的 PoRequestPowerIrp 例程期间注册 PowerCompletion 回调例程。
驱动程序的 PowerCompletion 回调例程仅用于具有 IRP_MN_SET_POWER、IRP_MN_QUERY_POWER和 IRP_MN_WAIT_WAKE次要 IRP 代码的 IRP_MJ_POWER IRP。 有关详细信息,请参阅 发送设备电源状态 和 等待/唤醒回调例程IRP_MN_QUERY_POWER或IRP_MN_SET_POWER。
I/O 管理器仅在 I/O 管理器调用发送驱动程序的 PowerCompletion 例程后,才会调用其他驱动程序在将 IRP 传递到堆栈时设置的所有 IoCompletion 例程。 PowerCompletion 例程执行 IRP 发送方完成 IRP 后所需的任何其他任务。 PowerCompletion 例程不应释放 IRP , Power Manager 会这样做。
在 IRQL = PASSIVE_LEVEL 或 IRQL = DISPATCH_LEVEL 调用 PowerCompletion 例程。
例子
若要定义 PowerCompletion 回调例程,必须先提供一个函数声明来标识要定义的回调例程的类型。 Windows 为驱动程序提供一组回调函数类型。 使用回调函数类型声明函数有助于 驱动程序代码分析、静态驱动程序验证程序(SDV)和其他验证工具查找错误,这是为 Windows作系统编写驱动程序的要求。
例如,若要定义名为 MyPowerCompletion
的 PowerCompletion 回调例程,请使用REQUEST_POWER_COMPLETE类型,如以下代码示例所示:
REQUEST_POWER_COMPLETE MyPowerCompletion;
然后,按如下所示实现回调例程:
_Use_decl_annotations_
VOID
MyPowerCompletion(
PDEVICE_OBJECT DeviceObject,
UCHAR MinorFunction,
POWER_STATE PowerState,
PVOID Context,
PIO_STATUS_BLOCK IoStatus
)
{
// Function body
}
REQUEST_POWER_COMPLETE函数类型在 Wdm.h 头文件中定义。 若要在运行代码分析工具时更准确地识别错误,请务必将 _Use_decl_annotations_
注释添加到函数定义。
_Use_decl_annotations_
批注可确保使用应用于头文件中REQUEST_POWER_COMPLETE函数类型的批注。 有关函数声明要求的详细信息,请参阅 使用 WDM 驱动程序的函数角色类型来声明函数。 有关 _Use_decl_annotations_
的信息,请参阅 批注函数行为。
要求
要求 | 价值 |
---|---|
目标平台 | 桌面 |
标头 | wdm.h (包括 Wdm.h、Ntddk.h、Ntifs.h) |
IRQL | 在 IRQL <调用 = DISPATCH_LEVEL (请参阅“备注”部分)。 |