Partilhar via


Função KeReleaseSemaphore (wdm.h)

A rotina KeReleaseSemaphore libera o objeto semáforo especificado.

Sintaxe

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

Parâmetros

[in, out] Semaphore

Um ponteiro para um objeto de semáforo inicializado para o qual o chamador fornece o armazenamento.

[in] Increment

Especifica o incremento de prioridade a ser aplicado se a liberação do semáforo fizer com que uma espera seja atendida.

[in] Adjustment

Especifica um valor a ser adicionado à contagem de semáforos atual. Esse valor deve ser positivo.

[in] Wait

Especifica se a chamada para KeReleaseSemaphore deve ser seguida imediatamente por uma chamada para uma das rotinas de KeWaitXxx. Se TRUE, a chamada KeReleaseSemaphore deverá ser seguida por uma chamada para KeWaitForMultipleObjects, KeWaitForMutexObjectou KeWaitForSingleObject. Para obter mais informações, consulte a seção Comentários a seguir.

Valor de retorno

Se o valor retornado for zero, o estado anterior do objeto semáforo não será sinalizado.

Observações

KeReleaseSemaphore fornece um aumento de prioridade em tempo de execução para threads de espera. Se essa chamada definir o semáforo como o estado sinalizado, a contagem de semáforos será aumentada pelo valor especificado. O chamador também pode especificar se chamará uma das rotinas KeWaitXxx assim que KeReleaseSemaphore retornar o controle.

A liberação de um objeto semáforo faz com que a contagem de semáforos seja aumentada pelo valor do parâmetro Adjustment. Se o valor resultante for maior que o limite do objeto semáforo, a contagem não será ajustada e uma exceção, STATUS_SEMAPHORE_LIMIT_EXCEEDED, será gerada.

Aumentar a contagem de objetos semáforo faz com que o semáforo atinja um estado sinalizado e uma tentativa é feita para satisfazer o máximo de esperas possível no objeto semáforo.

A rotina de KeReleaseSemaphore pode aumentar temporariamente o IRQL. Se o parâmetro Wait for false, a rotina, antes de retornar, restaurará o IRQL para o valor original que ele tinha no início da chamada.

Se Wait = VERDADEIRO, a rotina retornará sem reduzir o IRQL. Nesse caso, a chamada KeReleaseSemaphore deve ser imediatamente seguida por uma chamada KeWaitxxx. Ao configurar Wait = TRUE, o chamador pode impedir que uma opção de contexto desnecessária ocorra entre a chamada KeReleaseSemaphore e a chamada KeWaitXxx. O kewaitrotina de Xxx, antes de retornar, restaura o IRQL para seu valor original no início da chamada KeReleaseSemaphore. Embora o IRQL desabilite as opções de contexto entre as duas chamadas, essas chamadas não podem ser usadas de forma confiável como o início e o fim de uma operação atômica. Por exemplo, entre essas duas chamadas, um thread que está em execução ao mesmo tempo em outro processador pode alterar o estado do objeto semáforo ou do destino da espera.

Aviso

Um thread paginável ou uma rotina de driver paginável que é executado em IRQL = PASSIVE_LEVEL nunca deve chamar KeReleaseSemaphore com o parâmetro Wait definido como TRUE. Essa chamada causará uma falha fatal na página se a função de chamada estiver entre as chamadas para KeReleaseSemaphore e KeWaitXxx.

Para obter mais informações sobre objetos semáforos, consulte Objetos semáforos.

Os chamadores de KeReleaseSemaphore devem estar em execução no IRQL <= DISPATCH_LEVEL desde que Wait esteja definido como FALSE. Caso contrário, o chamador deve estar em execução em IRQL = PASSIVE_LEVEL.

Requisitos

Requisito Valor
de cliente com suporte mínimo Disponível a partir do Windows 2000.
da Plataforma de Destino Universal
cabeçalho wdm.h (include Wdm.h, Ntddk.h, Ntifs.h)
biblioteca NtosKrnl.lib
de DLL NtosKrnl.exe
IRQL Consulte a seção Comentários.
regras de conformidade de DDI HwStorPortProhibitedDIs(storport)

Consulte também

KeInitializeSemaphore

KeReadStateSemaphore

KeWaitForMultipleObjects

KeWaitForSingleObject