IoCreateNotificationEvent 函数 (wdm.h)

IoCreateNotificationEvent 例程创建或打开一个命名通知事件,用于通知一个或多个执行线程已发生事件。

语法

PKEVENT IoCreateNotificationEvent(
  [in]  PUNICODE_STRING EventName,
  [out] PHANDLE         EventHandle
);

参数

[in] EventName

指向缓冲区的指针,该缓冲区包含以 null 结尾的 Unicode 字符串,该字符串为事件命名。

[out] EventHandle

指向要在其中返回事件对象的内核句柄的位置的指针。

返回值

IoCreateNotificationEvent 返回指向创建或打开的事件对象的指针;如果无法创建或打开事件对象,则返回 NULL

注解

如果事件对象尚不存在, IoCreateNotificationEvent 将创建并打开它,并将其状态设置为 Signaled。

如果事件对象已存在, IoCreateNotificationEvent 将打开事件对象。

通知事件和同步事件都用于协调执行。 但是,当同步事件自行重置时,通知事件将保持“已信号”状态,直到驱动程序调用 KeClearEventKeResetEvent

若要对通知事件进行同步,请执行以下操作:

  1. 使用 IoCreateNotificationEvent 打开通知事件。 使用 EventName 字符串标识事件。
  2. 使用 IoCreateNotificationEvent 返回的 PKEVENT 调用 KeWaitForSingleObject,等待事件发出信号。 多个执行线程可以等待给定的通知事件。 若要轮询而不是停止,请将 KeWaitForSingleObject超时值指定为零。
  3. 不再需要访问事件时,使用 ZwClose 关闭通知事件的句柄。

有两种用于共享事件对象的main方法:

  • 用户模式应用程序创建事件对象,并通过向驱动程序发送 IOCTL 将对象的句柄传递给驱动程序。 驱动程序必须在创建事件对象的进程的上下文中处理 IOCTL,并且必须通过调用 ObReferenceObjectByHandle 来验证句柄。 建议使用此方法在用户模式和内核模式之间共享事件对象。

  • 驱动程序在全局 \BaseNamedObjects 对象目录中创建命名事件对象。 若要从用户模式访问内核模式事件,请使用名称 Global\\Xxx。 请注意,安全设置可能会阻止应用程序打开事件。 在 \\BaseNamedObjects Microsoft Win32 子系统初始化之前不会创建对象目录,因此在启动时加载的驱动程序无法在其 DriverEntry 例程的\\BaseNamedObjects目录中创建事件对象。

有关事件的详细信息,请参阅 事件对象

要求

要求
最低受支持的客户端 从 Windows 2000 开始可用。
目标平台 通用
标头 wdm.h(包括 Wdm.h、Ntddk.h、Ntifs.h)
Library NtosKrnl.lib
DLL NtosKrnl.exe
IRQL PASSIVE_LEVEL
DDI 符合性规则 HwStorPortProhibitedDDI (storport) IrqlIoPassive4 (wdm)

另请参阅

IoCreateSynchronizationEvent

KeClearEvent

KeResetEvent

KeSetEvent

KeWaitForSingleObject

RtlInitUnicodeString

ZwClose