IoCreateNotificationEvent
该例程创建或者打开一个命名的通知事件用于通知一个或多个线程一个事件已经发生.
PKEVENT
IoCreateNotificationEvent(
IN PUNICODE_STRING EventName, 指向一个以NULL结尾的UNICODE字符串,该字符串包含事件的名称
OUT PHANDLE EventHandle 指向一个地址,该地址存储了事件对象的句柄,
);
返回值:返回一个指针,指向创建或者打开的事件对象,如果失败,返回NULL
评注:
如果不存在,则创建并打开,并设置事件为有信号状态,如果已存在,则打开
当事件处于有信号状态时,它会一直保持,直到被明确的清除
通知事件,像同步事件一样,被用于同步,但是又不像同步事件,通知事件不是自动重置的
一旦通知事件处于有信号状态,会一直保持,直到被明确重设(通过调用
KeClearEvent or
KeResetEvent)
如何同步一个通知事件
1.用IoCreateNotificationEvent打开一个通知事件,并指明事件的名称。
2.调用KeWaitForSingleObject并传入PKEVENT(IoCreateNotificationEvent的返回值),等待事件有信号,多个线程可以等待一个事件。如果想以轮询方式等待(而不是静止),为KeWaitForSingleObject制定超时时间为0.
3.当不再需要该事件时,通过ZwClose关闭事件对象的句柄。
事件对象在用户层和内核层共享时,是大小写敏感的。主要有2种方法。
1.用户层程序创建一个事件对象,通过给内核层发送一个IOCTL码来传递事件对象的句柄。
驱动必须处理IOCTL在创建事件对象的进程的上下文中,并通过ObReferenceObjectByHandle验证句柄的有效性。推荐使用此方法。
2.驱动在\\BaseNamedObjects 对象目录创建一个命名的事件对象。你可以在应用层通过Xxx打开一个内核层的\\BaseNamedObjects\Xxx命名对象。注意,安全设定可能阻止应用程序打开事件。更多信息请参考OpenEvent Fails in a Non-Administrator Account KB article。
驱动必须处理IOCTL在创建事件对象的进程的上下文中,并通过ObReferenceObjectByHandle验证句柄的有效性。推荐使用此方法。
2.驱动在\\BaseNamedObjects 对象目录创建一个命名的事件对象。你可以在应用层通过Xxx打开一个内核层的\\BaseNamedObjects\Xxx命名对象。注意,安全设定可能阻止应用程序打开事件。更多信息请参考OpenEvent Fails in a Non-Administrator Account KB article。
\\BaseNamedObjects对象目录的创建在Win32 subsystem初始化之后,所以在启动时,加载的驱动不能在DriverEntry里创建一个事件对象在\\BaseNamedObjects对象目录。
如果觉得翻译的还过得去的话,请留言支持,这是对我最大的肯定。谢谢~