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 還原至呼叫開始時的原始值。
如果 Wait = TRUE,則例程會傳回而不降低 IRQL。 在此情況下,KeReleaseSemaphore 呼叫必須緊接著 KeWaitXxx 呼叫。 藉由設定 Wait = TRUE,呼叫者可以防止在呼叫 KeReleaseSemaphore 呼叫與 KeWaitXxx 呼叫之間發生不必要的內容切換。 KeWaitXxx 例程傳回之前,會在 KeReleaseSemaphore 呼叫開始時,將 IRQL 還原為其原始值。 雖然 IRQL 會停用兩個呼叫之間的內容切換,但這些呼叫無法可靠地當做不可部分完成作業的開始和結尾使用。 例如,在這兩個呼叫之間,在另一個處理器上同時執行的線程可能會變更信號對象的狀態或等候目標。
警告
在 IRQL = PASSIVE_LEVEL 上執行的可分頁線程或可分頁驅動程式例程,絕不應呼叫 KeReleaseSemaphore,並將 Wait 參數設定為 TRUE。 如果呼叫函式碰巧在呼叫 KeReleaseSemaphore 和 KeWaitXxx之間分頁,則這類呼叫會造成嚴重頁面錯誤。
如需信號對象的詳細資訊,請參閱 Semaphore Objects。
KeReleaseSemaphore 的呼叫端必須在 IRQL <= DISPATCH_LEVEL 執行,前提是 Wait 設定為 false 。 否則,呼叫端必須在 IRQL = PASSIVE_LEVEL執行。
要求
要求 | 價值 |
---|---|
最低支援的用戶端 | 從 Windows 2000 開始提供。 |
目標平臺 | 普遍 |
標頭 | wdm.h (包括 Wdm.h、Ntddk.h、Ntifs.h) |
連結庫 | NtosKrnl.lib |
DLL | NtosKrnl.exe |
IRQL | 請參閱一節。 |
DDI 合規性規則 | HwStorPortProhibitedDIs(storport) |