ExRegisterCallback 函数 (wdm.h)

ExRegisterCallback 例程向给定回调对象注册给定回调例程。

语法

PVOID ExRegisterCallback(
  [in, out]      PCALLBACK_OBJECT   CallbackObject,
  [in]           PCALLBACK_FUNCTION CallbackFunction,
  [in, optional] PVOID              CallbackContext
);

参数

[in, out] CallbackObject

指向从 ExCreateCallback 例程获取的回调对象的指针。

[in] CallbackFunction

指向驱动程序实现的回调例程的指针,该例程必须不可分页。 回调例程必须符合以下原型:

VOID
(*PCALLBACK_FUNCTION ) (
    IN PVOID CallbackContext,
    IN PVOID Argument1,
    IN PVOID Argument2
    );

回调例程参数如下所示:

CallbackContext

指向 ExRegisterCallbackCallbackContext 参数中指定的驱动程序提供的上下文区域的指针。

Argument1

指向回调对象定义的参数的指针。

Argument2

指向回调对象定义的参数的指针。

[in, optional] CallbackContext

指向每次调用回调例程时作为回调例程的上下文参数传递的数据项定义结构的指针。 上下文通常是调用方设备对象扩展的一部分。

返回值

ExRegisterCallback 返回指向回调注册句柄的指针,该句柄应被视为不透明且保留供系统使用。 如果 ExRegisterCallback 完成并出现错误,则此指针 NULL

言论

驱动程序调用 ExRegisterCallback,以向指定的回调对象注册回调例程。

如果对象只允许一个已注册的回调例程,并且已注册此类例程,ExRegisterCallback 返回 NULL

ExRegisterCallback 的调用方必须保存返回的指针,以便在调用 ExUnregisterCallback时使用。 从回调对象的已注册回调例程列表中删除回调例程时,需要指针。

Argument1Argument2 注册回调例程的含义取决于回调对象,并由创建它的组件定义。 下面是 系统定义的回调对象的参数:

\Callback\SetSystemTime

Argument1 (SetSystemTime)

  • 未使用。

Argument2 (SetSystemTime)

  • 未使用。

\Callback\PowerState**

Argument1 (PowerState)

  • 转换为 PVOID 类型的PO_CB_XXX常量值。

  • PO_CB_AC_STATUS - 指示系统已从 A/C 更改为电池电源,反之亦然。

  • PO_CB_LID_SWITCH_STATE - 指示盖子开关已更改状态。

  • PO_CB_PROCESSOR_POWER_POLICY - 指示系统处理器电源策略已更改。

  • PO_CB_SYSTEM_POWER_POLICY — 指示系统电源策略已更改。

  • PO_CB_SYSTEM_STATE_LOCK — 指示系统电源状态变化迫在眉睫。 分页路径中的驱动程序可以注册此回调来接收此类更改的早期警告,从而允许他们在电源状态更改之前将代码锁定在内存中。

Argument2 (PowerState)

TRUE 或转换为 PVOID 类型的 FALSE 的值 FALSE。

  • 如果PO_CB_AC_STATUS Argument1,则如果计算机当前正在使用 A/C 电源,则 Argument2为 TRUE,如果计算机在电池供电时 FALSE

  • 如果 Argument1 PO_CB_LID_SWITCH_STATE,则当盖子当前打开时,Argument2 为 true TRUE,如果盖子关闭,则 为 FALSE

  • 如果PO_CB_PROCESSOR_POWER_POLICY Argument1,则不使用 argument2

  • 如果PO_CB_SYSTEM_POWER_POLICY Argument1,则不使用 Argument2

  • 如果 PO_CB_SYSTEM_STATE_LOCK Argument1,则如果计算机即将退出系统电源状态 S0,则 Argument2 为 FALSE FALSE,如果计算机刚刚重新输入 S0,则为 true

\Callback\ProcessorAdd

Argument1 (ProcessorAdd)

  • 指向描述处理器更改通知事件的 KE_PROCESSOR_CHANGE_NOTIFY_CONTEXT 结构的指针。 此指针转换为 PVOID 类型。 回调例程不得修改此结构的内容。

Argument2 (ProcessorAdd)

指向包含 NTSTATUS 值的变量的指针。 此指针转换为 PVOID 类型。 在某些情况下,回调例程可以将错误状态值写入此变量,以指示不应添加新处理器的原因。 除非满足以下所有三个条件,否则设备驱动程序不得更改此变量的值:

  • 回调例程的处理过程中发生错误,该例程应阻止添加新处理器。

  • Argument1 指向的 KE_PROCESSOR_CHANGE_NOTIFY_CONTEXT 结构 状态 成员的值 KeProcessorAddStartNotify

  • Argument2 的 NSTATUS 变量 指向包含值STATUS_SUCCESS。 也就是说,回调例程不得覆盖以前由另一个回调通知客户端编写的错误状态值。

从 Windows Vista 开始,\Callback\ProcessorAdd 回调对象可用于动态跟踪处理器填充中的更改。 KeRegisterProcessorChangeCallback 例程提供了类似的信息,但另外还支持驱动程序可用于枚举初始多处理器系统配置中的处理器的KE_PROCESSOR_CHANGE_ADD_EXISTING标志。 对于在 Windows Server 2008 及更高版本的 Windows 中运行的驱动程序,请尽可能使用 KeRegisterProcessorChangeCallback 而不是 \Callback\ProcessorAdd 回调对象。

有关回调对象的详细信息,请参阅 回调对象

作系统在同一 IRQL 中调用注册的回调例程,在该 IRQL 中,创建回调的驱动程序将调用 ExNotifyCallback 例程。

要求

要求 价值
目标平台 普遍
标头 wdm.h (包括 Wdm.h、Ntddk.h、Ntifs.h)
NtosKrnl.lib
DLL NtosKrnl.exe
IRQL IRQL <= APC_LEVEL
DDI 符合性规则 HwStorPortProhibitedDIs(storport)IrqlExApcLte2(wdm)

另请参阅

ExCreateCallback

ExNotifyCallback

ExUnregisterCallback

KE_PROCESSOR_CHANGE_NOTIFY_CONTEXT

KeRegisterProcessorChangeCallback