KeReleaseSemaphore 函数 (wdm.h)
KeReleaseSemaphore 例程释放指定的信号灯对象。
语法
LONG KeReleaseSemaphore(
[in, out] PRKSEMAPHORE Semaphore,
[in] KPRIORITY Increment,
[in] LONG Adjustment,
[in] BOOLEAN Wait
);
参数
[in, out] Semaphore
指向调用方为其提供存储的初始化信号灯对象的指针。
[in] Increment
指定要在释放信号灯导致满足等待时应用的优先级增量。
[in] Adjustment
指定要添加到当前信号灯计数的值。 该值必须是正数。
[in] Wait
指定是否在调用 KeReleaseSemaphore 后立即调用 KeWaitXxx 例程之一。 如果 为 TRUE, 则 KeReleaseSemaphore 调用后必须调用 KeWaitForMultipleObjects、 KeWaitForMutexObject 或 KeWaitForSingleObject。 有关更多信息,请参见下面的“备注”部分。
返回值
如果返回值为零,则信号灯对象的先前状态不会发出信号。
注解
KeReleaseSemaphore 为等待线程提供运行时优先级提升。 如果此调用将信号灯设置为信号状态,则信号量计数将增加指定的值。 调用方还可以指定在 KeReleaseSemaphore 返回控件后是否立即调用 KeWaitXxx 例程之一。
释放信号灯对象会导致信号量计数由 Adjustment 参数的值增加。 如果生成的值大于信号量对象的限制,则不调整计数并引发异常(STATUS_SEMAPHORE_LIMIT_EXCEEDED)。
增加信号量对象计数会导致信号量达到信号状态,并尝试满足信号量对象上尽可能多的等待。
KeReleaseSemaphore 例程可能会暂时引发 IRQL。 如果 Wait 参数为 FALSE,则例程在返回之前,会将 IRQL 还原到调用开始时的原始值。
如果 等待 = TRUE,则例程返回而不降低 IRQL。 在这种情况下, KeReleaseSemaphore 调用必须紧跟 KeWaitXxx 调用。 通过设置 等待 = TRUE,调用方可以防止 KeReleaseSemaphore 调用和 KeWaitXxx 调用之间发生不必要的上下文切换。 KeWaitXxx 例程在返回之前,会在 KeReleaseSemaphore 调用开始时将 IRQL 还原为其原始值。 尽管 IRQL 禁用两个调用之间的上下文切换,但这些调用不能可靠地用作原子操作的开始和结束。 例如,在这两个调用之间,在另一个处理器上同时运行的线程可能会更改信号灯对象或等待目标的状态。
警告
在 IRQL = PASSIVE_LEVEL 运行的可分页线程或可分页驱动程序例程不应调用将 Wait 参数设置为 TRUE 的 KeReleaseSemaphore。 如果调用函数恰好在 对 KeReleaseSemaphore 和 KeWaitXxx 的调用之间分页,则此类调用会导致严重页面错误。
有关信号灯对象的详细信息,请参阅 信号灯对象。
KeReleaseSemaphore 的调用方必须在 IRQL <= DISPATCH_LEVEL运行,前提是 Wait 设置为 FALSE。 否则,调用方必须在 IRQL = PASSIVE_LEVEL 运行。
要求
要求 | 值 |
---|---|
最低受支持的客户端 | 从 Windows 2000 开始可用。 |
目标平台 | 通用 |
标头 | wdm.h(包括 Wdm.h、Ntddk.h、Ntifs.h) |
Library | NtosKrnl.lib |
DLL | NtosKrnl.exe |
IRQL | 请参见“备注”部分。 |
DDI 符合性规则 | HwStorPortProhibitedDDI (storport) |