KeSetEvent 函数 (wdm.h)
如果事件尚未发出信号,则 KeSetEvent 例程将事件对象设置为信号状态,并返回事件对象的上一状态。
语法
LONG KeSetEvent(
[in, out] PRKEVENT Event,
[in] KPRIORITY Increment,
[in] BOOLEAN Wait
);
参数
[in, out] Event
指向调用方为其提供存储的已初始化事件对象的指针。
[in] Increment
指定在设置事件导致等待得到满足时要应用的优先级增量。
[in] Wait
指定是否立即调用 KeSetEvent,然后调用一个 KeWaitXxx 例程。 如果 TRUE,则 KeSetEvent 调用后,必须调用 KeWaitForMultipleObjects、KeWaitForMutexObject或 KeWaitForSingleObject。 有关详细信息,请参阅以下“备注”部分。
返回值
如果发出事件对象的上一状态信号,则返回非零值。
言论
调用 KeSetEvent 会导致事件达到信号状态。 如果事件是通知事件,则系统会尝试满足事件对象上尽可能多的等待。 直到调用 KeClearEvent 或 KeResetEvent 清除事件,才会发出信号。 如果事件是同步事件,系统会在系统自动清除事件之前满足一次等待。
KeSetEvent 例程可能会暂时引发 IRQL。 如果 Wait 参数 FALSE,则例程在返回之前,将 IRQL 还原到调用开始时的原始值。
如果 等待 = TRUE,则例程返回而不降低 IRQL。 在本例中,KeSetEvent 调用必须紧跟 KeWaitXxx 调用。 通过设置 Wait = TRUE,调用方可以防止在 KeSetEvent 调用与 KeWaitXxx 调用之间发生不必要的上下文切换。 KeWaitXxx 例程在返回之前,将 IRQL 还原到 KeSetEvent 调用开始时的原始值。 尽管 IRQL 禁用两个调用之间的上下文切换,但这些调用不能可靠地用作原子作的开始和结束。 例如,在这两个调用之间,在另一个处理器上同时运行的线程可能会更改事件对象的状态或等待目标。
在 IRQL = PASSIVE_LEVEL 上运行的可分页线程或可分页驱动程序例程绝不应调用 KeSetEvent,Wait 参数设置为 TRUE。 如果调用方碰巧在调用 KeSetEvent 和 KeWaitXxx之间分页,则此类调用会导致页面错误。
有关事件对象的详细信息,请参阅 事件对象。
如果 Wait 设置为 FALSE,则调用方可以在 IRQL <= DISPATCH_LEVEL 上运行。 否则,KeSetEvent 的调用方必须在 IRQL <= APC_LEVEL 和非比特线程上下文中运行。
要求
要求 | 价值 |
---|---|
最低支持的客户端 | 从 Windows 2000 开始可用。 |
目标平台 | 普遍 |
标头 | wdm.h (包括 Wdm.h、Ntddk.h、Ntifs.h) |
库 | NtosKrnl.lib |
DLL | NtosKrnl.exe |
IRQL | 请参阅“备注”部分。 |
DDI 符合性规则 | CompletionEventChecking(wdm)、DoubleKeSetEvent(storport)、HwStorPortProhibitedDDIs(storport)、IoAllocateIrpSignalEventInCompletion(wdm)、ioBuildDeviceIoControlSetEvent(wdm), IoBuildFsdIrpSignalEventInCompletion(wdm), IrqlKeSetEvent(wdm), SignalEventInCompletion(wdm) |