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_POWERIRP_MN_QUERY_POWERIRP_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作系统编写驱动程序的要求。

例如,若要定义名为 MyPowerCompletionPowerCompletion 回调例程,请使用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 (请参阅“备注”部分)。

另请参阅

DEVICE_OBJECT

IO_STATUS_BLOCK

IRP_MJ_POWER

IRP_MN_QUERY_POWER

IRP_MN_SET_POWER

IRP_MN_WAIT_WAKE

IoCompletion

PoRequestPowerIrp