Freigeben über


KeReleaseSemaphore-Funktion (wdm.h)

Die KeReleaseSemaphore Routine löst das angegebene Semaphorobjekt frei.

Syntax

LONG KeReleaseSemaphore(
  [in, out] PRKSEMAPHORE Semaphore,
  [in]      KPRIORITY    Increment,
  [in]      LONG         Adjustment,
  [in]      BOOLEAN      Wait
);

Parameter

[in, out] Semaphore

Ein Zeiger auf ein initialisiertes Semaphorobjekt, für das der Aufrufer den Speicher bereitstellt.

[in] Increment

Gibt die Prioritätsinkrementierung an, die angewendet werden soll, wenn das Freigeben des Semaphors bewirkt, dass eine Wartezeit erfüllt wird.

[in] Adjustment

Gibt einen Wert an, der der aktuellen Semaphoranzahl hinzugefügt werden soll. Dieser Wert muss positiv sein.

[in] Wait

Gibt an, ob dem Aufruf von KeReleaseSemaphore sofort ein Aufruf eines der KeWait-Xxx- Routinen folgen soll. Wenn TRUE-, muss dem KeReleaseSemaphore Aufruf ein Aufruf von KeWaitForMultipleObjects, KeWaitForMutexObjectoder KeWaitForSingleObjectfolgen. Weitere Informationen finden Sie im folgenden Abschnitt "Hinweise".

Rückgabewert

Wenn der Rückgabewert null ist, wird der vorherige Zustand des Semaphorobjekts nicht signalisiert.

Bemerkungen

KeReleaseSemaphor stellt eine Laufzeitprioritätsverstärkung für Wartethreads bereit. Wenn dieser Aufruf das Semaphor auf den signalisierten Zustand festlegt, wird die Semaphoranzahl um den angegebenen Wert erweitert. Der Aufrufer kann auch angeben, ob eine der KeWaitXxx Routinen aufgerufen wird, sobald KeReleaseSemaphore die Steuerung zurückgibt.

Durch das Freigeben eines Semaphorobjekts wird die Semaphoranzahl durch den Wert des Parameters Adjustment erweitert. Wenn der resultierende Wert größer als der Grenzwert des Semaphorobjekts ist, wird die Anzahl nicht angepasst, und eine Ausnahme, STATUS_SEMAPHORE_LIMIT_EXCEEDED, wird ausgelöst.

Das Erweitern der Semaphorobjektanzahl bewirkt, dass der Semaphor einen signalisierten Zustand erreicht, und es wird versucht, so viele Wartezeiten wie möglich auf dem Semaphorobjekt zu erfüllen.

Die KeReleaseSemaphor Routine kann die IRQL vorübergehend erhöhen. Wenn der parameter WaitFALSEist, stellt die Routine vor der Rückgabe die IRQL auf den ursprünglichen Wert zurück, den er am Anfang des Aufrufs hatte.

Wenn Wait = TRUE, gibt die Routine zurück, ohne die IRQL zu senken. In diesem Fall muss dem KeReleaseSemaphore Anruf sofort ein KeWaitXxx Anruf folgen. Durch Festlegen von Wait = TRUEkann der Aufrufer verhindern, dass ein unnötiger Kontextwechsel zwischen dem KeReleaseSemaphore Aufruf und dem KeWait-Xxx--Aufruf erfolgt. Die KeWaitXxx Routine stellt vor der Rückgabe den IRQL-Wert am Anfang des KeReleaseSemaphors Aufrufs wieder her. Obwohl die IRQL Kontextwechsel zwischen den beiden Aufrufen deaktiviert, können diese Aufrufe nicht zuverlässig als Start- und Ende eines atomischen Vorgangs verwendet werden. Beispielsweise kann zwischen diesen beiden Aufrufen ein Thread, der gleichzeitig auf einem anderen Prozessor ausgeführt wird, den Status des Semaphorobjekts oder des Ziels der Wartezeit ändern.

Warnung

Eine pageable Thread- oder pageable-Treiberroutine, die bei IRQL = PASSIVE_LEVEL ausgeführt wird, sollte niemals KeReleaseSemaphore- aufrufen, wobei der parameter Wait auf TRUEfestgelegt ist. Ein solcher Aufruf verursacht einen schwerwiegenden Seitenfehler, wenn die aufrufende Funktion zwischen den Aufrufen von KeReleaseSemaphore und KeWaitXxx-ausgelagert wird.

Weitere Informationen zu Semaphorobjekten finden Sie unter Semaphor-Objekte.

Anrufer von KeReleaseSemaphor müssen bei IRQL <= DISPATCH_LEVEL ausgeführt werden, vorausgesetzt, dass Wait auf FALSEfestgelegt ist. Andernfalls muss der Aufrufer unter IRQL = PASSIVE_LEVEL ausgeführt werden.

Anforderungen

Anforderung Wert
mindestens unterstützte Client- Ab Windows 2000 verfügbar.
Zielplattform- Universal
Header- wdm.h (include Wdm.h, Ntddk.h, Ntifs.h)
Library NtosKrnl.lib
DLL- NtosKrnl.exe
IRQL- Siehe Abschnitt "Hinweise".
DDI-Complianceregeln HwStorPortProhibitedDIs(storport)

Siehe auch

KeInitializeSemaphor

KeReadStateSemaphor

KeWaitForMultipleObjects

KeWaitForSingleObject