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 仅打开事件对象。
通知事件和同步事件都用于协调执行。 但是,当同步事件重置自身时,在驱动程序 调用 KeClearEvent 或 KeResetEvent之前,通知事件将保持信号状态。
若要同步通知事件,
- 使用 IoCreateNotificationEvent打开通知事件。 使用 EventName 字符串标识事件。
- 等待事件通过调用 KeWaitForSingleObject,IoCreateNotificationEvent返回的 PKEVENT 来发出信号。 多个执行线程可以等待给定的通知事件。 若要轮询而不是停止,请将 超时 指定为零到 KeWaitForSingleObject。
- 当不再需要访问事件时,请关闭通知事件的句柄,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) |