다음을 통해 공유


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를 호출해야 합니다. 자세한 내용은 아래 설명 부분을 참조하십시오.

반환 값

반환 값이 0이면 세마포 개체의 이전 상태는 신호를 받지 않습니다.

설명

KeReleaseSemaphore 는 대기 스레드에 대한 런타임 우선 순위 향상을 제공합니다. 이 호출이 세마포를 신호 상태로 설정하면 세마포 수가 지정된 값으로 보강됩니다. 호출자는 KeReleaseSemaphore가 컨트롤을 반환하는 즉시 KeWaitXxx 루틴 중 하나를 호출할지 여부를 지정할 수도 있습니다.

세마포 개체를 해제하면 세마포 수가 Adjustment 매개 변수 값으로 보강됩니다. 결과 값이 세마포 개체의 제한보다 크면 개수가 조정되지 않고 예외(STATUS_SEMAPHORE_LIMIT_EXCEEDED)가 발생합니다.

세마포 개체 수를 보강하면 세마포가 신호 상태를 달성하게 되며, 세마포 개체에서 가능한 한 많은 대기 시간을 충족하려고 시도합니다.

KeReleaseSemaphore 루틴은 일시적으로 IRQL을 발생할 수 있습니다. Wait 매개 변수가 FALSE이면 반환되기 전에 루틴은 호출을 시작할 때 가지고 있던 원래 값으로 IRQL을 복원합니다.

WAIT = TRUE이면 IRQL을 낮추지 않고 루틴이 반환됩니다. 이 경우 KeReleaseSemaphore 호출 바로 뒤에 KeWaitXxx 호출이 와야 합니다. 대기 = TRUE를 설정하면 호출자는 KeReleaseSemaphore 호출과 KeWaitXxx 호출 간에 불필요한 컨텍스트 전환이 발생하지 않도록 방지할 수 있습니다. KeWaitXxx 루틴은 반환되기 전에 KeReleaseSemaphore 호출을 시작할 때 IRQL을 원래 값으로 복원합니다. IRQL은 두 호출 간의 컨텍스트 전환을 사용하지 않도록 설정하지만 이러한 호출은 원자성 작업의 시작과 끝으로 안정적으로 사용할 수 없습니다. 예를 들어 이러한 두 호출 사이에 다른 프로세서에서 동시에 실행되는 스레드는 세마포 개체 또는 대기 대상의 상태를 변경할 수 있습니다.

경고

IRQL = PASSIVE_LEVEL 실행되는 페이지 가능한 스레드 또는 페이즈 가능 드라이버 루틴은 Wait 매개 변수가 TRUE로 설정된 KeReleaseSemaphore를 호출해서는 안 됩니다. 이러한 호출은 KeReleaseSemaphoreKeWaitXxx 호출 간에 호출 함수가 페이징되는 경우 심각한 페이지 오류를 발생합니다.

세마포 개체에 대한 자세한 내용은 세마포 개체를 참조하세요.

WaitFALSE로 설정된 경우 KeReleaseSemaphore의 호출자는 IRQL <= DISPATCH_LEVEL 실행되어야 합니다. 그렇지 않으면 호출자가 IRQL = PASSIVE_LEVEL 실행 중이어야 합니다.

요구 사항

요구 사항
지원되는 최소 클라이언트 Windows 2000부터 사용할 수 있습니다.
대상 플랫폼 유니버설
헤더 wdm.h(Wdm.h, Ntddk.h, Ntifs.h 포함)
라이브러리 NtosKrnl.lib
DLL NtosKrnl.exe
IRQL 설명 섹션을 참조하십시오.
DDI 규정 준수 규칙 HwStorPortProhibitedDDIs(storport)

추가 정보

KeInitializeSemaphore

KeReadStateSemaphore

KeWaitForMultipleObjects

KeWaitForSingleObject