IoCreateNotificationEvent 函数 (wdm.h)

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

语法

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

参数

[in] EventName

指向包含命名事件的 null 终止 Unicode 字符串的缓冲区的指针。

[out] EventHandle

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

返回值

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

言论

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

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

通知事件和同步事件都用于协调执行。 但是,当同步事件重置自身时,在驱动程序 调用 KeClearEventKeResetEvent之前,通知事件将保持信号状态。

若要同步通知事件,

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

共享事件对象有两种主要方法:

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

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

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

要求

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

另请参阅

IoCreateSynchronizationEvent

KeClearEvent

KeResetEvent

KeSetEvent

KeWaitForSingleObject

RtlInitUnicodeString

ZwClose