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 ルーチンの 1 つを呼び出すかどうかを指定します。 TRUE の場合、KeReleaseSemaphore 呼び出しの後に KeWaitForMultipleObjectsKeWaitForMutexObject、または KeWaitForSingleObject を呼び出す必要があります。 詳細については、「解説」を参照してください。

戻り値

戻り値が 0 の場合、セマフォ オブジェクトの以前の状態は通知されません。

注釈

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 では 2 つの呼び出し間のコンテキスト切り替えを無効にしますが、これらの呼び出しをアトミック操作の開始と終了として確実に使用することはできません。 たとえば、これら 2 つの呼び出しの間に、別のプロセッサで同時に実行されているスレッドは、セマフォ オブジェクトまたは待機のターゲットの状態を変更する可能性があります。

警告

IRQL = PASSIVE_LEVELで実行されるページング可能なスレッドまたはページング可能なドライバー ルーチンは、Wait パラメーターを TRUE に設定して KeReleaseSemaphore を呼び出さないでください。 このような呼び出しでは、呼び出し元の関数が KeReleaseSemaphoreKeWaitXxx の呼び出しの間にページングされた場合、致命的なページ エラーが発生します。

セマフォ オブジェクトの詳細については、「 Semaphore オブジェクト」を参照してください。

WaitFALSE に設定されている場合、KeReleaseSemaphore の呼び出し元は IRQL <= DISPATCH_LEVELで実行されている必要があります。 それ以外の場合、呼び出し元は IRQL = PASSIVE_LEVELで実行されている必要があります。

要件

要件
サポートされている最小のクライアント Windows 2000 以降で使用できます。
対象プラットフォーム ユニバーサル
Header wdm.h (Wdm.h、Ntddk.h、Ntifs.h を含む)
Library NtosKrnl.lib
[DLL] NtosKrnl.exe
IRQL 「解説」を参照してください。
DDI コンプライアンス規則 HwStorPortProhibitedDDIs(storport)

こちらもご覧ください

KeInitializeSemaphore

KeReadStateSemaphore

KeWaitForMultipleObjects

KeWaitForSingleObject