Leer en inglés

Compartir a través de


Función KeReleaseSemaphore (wdm.h)

El KeReleaseSemaphore rutina libera el objeto de semáforo especificado.

Sintaxis

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

Parámetros

[in, out] Semaphore

Puntero a un objeto de semáforo inicializado para el que el autor de la llamada proporciona el almacenamiento.

[in] Increment

Especifica el incremento de prioridad que se va a aplicar si liberar el semáforo hace que se cumpla una espera.

[in] Adjustment

Especifica un valor que se va a agregar al recuento de semáforos actual. Este valor debe ser positivo.

[in] Wait

Especifica si la llamada a KeReleaseSemaphore debe ir seguida inmediatamente de una llamada a una de las rutinas de KeWaitXxx. Si TRUE, la llamada KeReleaseSemaphore debe ir seguida de una llamada a KeWaitForMultipleObjects, KeWaitForMutexObject, o KeWaitForSingleObject. Para obtener más información, vea la siguiente sección Comentarios.

Valor devuelto

Si el valor devuelto es cero, el estado anterior del objeto de semáforo no está señalado.

Observaciones

KeReleaseSemaphore proporciona un aumento de prioridad en tiempo de ejecución para subprocesos en espera. Si esta llamada establece el semáforo en el estado señalado, el recuento de semáforos se aumenta mediante el valor especificado. El autor de la llamada también puede especificar si llamará a una de las rutinas de KeWaitXxx tan pronto como KeReleaseSemaphore devuelve el control.

Liberar un objeto de semáforo hace que el recuento de semáforos aumente por el valor del parámetro Adjustment. Si el valor resultante es mayor que el límite del objeto de semáforo, no se ajusta el recuento y se genera una excepción, STATUS_SEMAPHORE_LIMIT_EXCEEDED.

Aumentar el recuento de objetos de semáforo hace que el semáforo alcance un estado señalado y se intente satisfacer tantas esperas como sea posible en el objeto de semáforo.

La rutina KeReleaseSemaphore podría elevar temporalmente el IRQL. Si el parámetro wait es FALSE, la rutina, antes de que devuelva, restaura irQL al valor original que tenía al principio de la llamada.

Si Wait = TRUE, la rutina devuelve sin reducir IRQL. En este caso, la llamada KeReleaseSemaphore debe ir seguida inmediatamente de una llamada KeWaitXxx. Al establecer Wait = TRUE, el autor de la llamada puede impedir que se produzca un cambio de contexto innecesario entre la llamada de KeReleaseSemaphore y la llamada KeWaitXxx. La rutina KeWaitXxx, antes de que devuelva, restaura el IRQL a su valor original al principio de la llamada KeReleaseSemapho re. Aunque IRQL deshabilita los modificadores de contexto entre las dos llamadas, estas llamadas no se pueden usar de forma confiable como el inicio y el final de una operación atómica. Por ejemplo, entre estas dos llamadas, un subproceso que se ejecuta al mismo tiempo en otro procesador podría cambiar el estado del objeto semáforo o del destino de la espera.

Advertencia

Una rutina de controlador paginable o subproceso paginable que se ejecuta en IRQL = PASSIVE_LEVEL nunca debe llamar a KeReleaseSemaphore con el parámetro wait establecido en TRUE. Esta llamada provoca un error de página grave si la función de llamada se pagina entre las llamadas a KeReleaseSemaphore y KeWaitXxx.

Para obtener más información sobre los objetos de semáforo, vea Objetos de semáforo.

Los autores de llamadas de KeReleaseSemaphore deben ejecutarse en IRQL <= DISPATCH_LEVEL siempre que Wait esté establecido en FALSE. De lo contrario, el autor de la llamada debe ejecutarse en IRQL = PASSIVE_LEVEL.

Requisitos

Requisito Valor
cliente mínimo admitido Disponible a partir de Windows 2000.
de la plataforma de destino de Universal
encabezado de wdm.h (include Wdm.h, Ntddk.h, Ntifs.h)
biblioteca de NtosKrnl.lib
DLL de NtosKrnl.exe
irQL Consulte la sección Comentarios.
reglas de cumplimiento de DDI HwStorPortProhibitedDIs(storport)

Consulte también

KeInitializeSemaphore

keReadStateSemaphore

keWaitForMultipleObjects

KeWaitForSingleObject