IoCreateSynchronizationEvent 函数 (wdm.h)

IoCreateSynchronizationEvent 例程创建或打开命名同步事件,以便在两个其他无关驱动程序之间序列化访问硬件。

语法

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

参数

[in] EventName

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

[out] EventHandle

指向返回事件对象的句柄的位置的指针。 在 Windows Server 2003 及更高版本的 Windows 中,返回的句柄是 内核句柄

返回值

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

言论

如果事件对象尚不存在,则会创建该事件对象。 IoCreateSynchronizationEvent 将新同步事件的状态设置为 Signaled。 如果事件对象已存在,则只需打开它。 使用同步事件调用的驱动程序对 KeWaitForSingleObject 此例程返回的 PKEVENT 指针。

当同步事件设置为 Signaled 状态时,将释放等待事件的单个执行线程,并且该事件会自动重置为 Not-Signaled 状态。

若要释放事件,驱动程序使用事件句柄调用 ZwClose

在用户模式和内核模式之间共享事件对象需要小心。 共享事件对象有两种主要方法:

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

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

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

要求

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

另请参阅

IoCreateNotificationEvent

KeWaitForSingleObject

RtlInitUnicodeString

ZwClose