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 调用后,必须调用 KeWaitForMultipleObjectsKeWaitForMutexObjectKeWaitForSingleObject。 有关详细信息,请参阅以下“备注”部分。

返回值

如果返回值为零,则信号灯对象的上一状态不发出信号。

言论

KeReleaseSemaphore 为等待线程提供运行时优先级提升。 如果此调用将信号灯设置为信号状态,信号灯计数将增加指定的值。 调用方还可以指定在 KeReleaseSemaphore 返回控件后,它是否会立即调用其中一个 KeWaitXxx 例程。

释放信号灯对象会导致信号量计数由 调整 参数的值增加。 如果生成的值大于信号量对象的限制,则不调整计数,并引发异常(STATUS_SEMAPHORE_LIMIT_EXCEEDED)。

增加信号量对象计数会导致信号灯达到信号状态,并尝试满足信号灯对象上尽可能多的等待。

KeReleaseSemaphore 例程可能会暂时引发 IRQL。 如果 Wait 参数 FALSE,则例程在返回之前,将 IRQL 还原到调用开始时的原始值。

如果 等待 = TRUE,则例程返回而不降低 IRQL。 在本例中,KeReleaseSemaphore 调用必须紧跟在 KeWaitXxx 调用之后。 通过设置 Wait = TRUE,调用方可以防止在 KeReleaseSemaphore 调用与 KeWaitXxx 调用之间发生不必要的上下文切换。 KeWaitXxx 例程在返回之前,将 IRQL 还原到 KeReleaseSemaphore 调用开始时的原始值。 尽管 IRQL 禁用两个调用之间的上下文切换,但这些调用不能可靠地用作原子作的开始和结束。 例如,在这两个调用之间,在另一个处理器上同时运行的线程可能会更改信号灯对象的状态或等待的目标。

警告

在 IRQL = PASSIVE_LEVEL 上运行的可分页线程或可分页驱动程序例程绝不应调用 KeReleaseSemaphoreWait 参数设置为 TRUE。 如果调用函数碰巧在调用 KeReleaseSemaphoreKeWaitXxx之间分页,则此类调用会导致页面错误。

有关信号灯对象的详细信息,请参阅 信号灯对象

如果 等待 设置为 FALSE,则 KeReleaseSemaphore 的调用方必须在 IRQL <= DISPATCH_LEVEL运行。 否则,调用方必须在 IRQL = PASSIVE_LEVEL上运行。

要求

要求 价值
最低支持的客户端 从 Windows 2000 开始可用。
目标平台 普遍
标头 wdm.h (包括 Wdm.h、Ntddk.h、Ntifs.h)
NtosKrnl.lib
DLL NtosKrnl.exe
IRQL 请参阅“备注”部分。
DDI 符合性规则 HwStorPortProhibitedDIS(storport)

另请参阅

KeInitializeSemaphore

KeReadStateSemaphore

KeWaitForMultipleObjects

KeWaitForSingleObject