Función ExAcquireSharedWaitForExclusive (wdm.h)

La rutina ExAcquireSharedWaitForExclusive adquiere el recurso especificado para el acceso compartido si se puede conceder acceso compartido y no hay ningún waiters exclusivo.

Sintaxis

BOOLEAN ExAcquireSharedWaitForExclusive(
  [in, out] PERESOURCE Resource,
  [in]      BOOLEAN    Wait
);

Parámetros

[in, out] Resource

Puntero al recurso que se va a adquirir para el acceso compartido.

[in] Wait

Especifica el comportamiento de la rutina siempre que el recurso no se pueda adquirir inmediatamente. Si es TRUE, el autor de la llamada se coloca en un estado de espera hasta que se pueda adquirir el recurso. Si es FALSE, la rutina devuelve inmediatamente, independientemente de si se puede adquirir el recurso.

Valor devuelto

ExAcquireSharedWaitForExclusive devuelve TRUE si se concede el acceso solicitado o un propietario exclusivo libera el recurso. Esta rutina devuelve FALSE si la espera de entrada es FALSE y no se puede conceder acceso compartido inmediatamente.

Comentarios

La mayoría de los controladores deben usar ExAcquireResourceSharedLite en lugar de ExAcquireSharedWaitForExclusive.

El autor de la llamada puede liberar el recurso llamando a ExReleaseResourceLite o ExReleaseResourceForThreadLite.

Si no se puede conceder acceso compartido inmediatamente, el autor de la llamada puede esperar a que otros subprocesos adquieran y liberen la propiedad exclusiva del recurso.

Si el autor de la llamada tiene acceso compartido al recurso determinado o cuándo depende de lo siguiente:

  • Si el recurso no está propietario actualmente, se concede acceso compartido inmediatamente al subproceso actual.
  • Si el autor de la llamada ya tiene acceso exclusivo al recurso, al subproceso actual se le concede el mismo tipo de acceso de forma recursiva.
  • Si el recurso es propiedad actualmente como compartido y no hay intentos pendientes de adquirir acceso exclusivo, el acceso compartido se concede al autor de la llamada inmediatamente.
  • Si el recurso es propiedad actualmente como compartido, pero hay un intento pendiente de adquirir acceso exclusivo, el autor de la llamada se coloca en un estado de espera (Wait establecido en TRUE) o ExAcquireSharedWaitForExclusive devuelve FALSE.

    Cuando el subproceso actual espera a adquirir el recurso hasta después de que se haya liberado una propiedad exclusiva pendiente, ExAcquireSharedWaitForExclusive devuelve TRUE cuando se concede acceso compartido al subproceso actual al recurso y reanuda la ejecución.

El comportamiento de ExAcquireSharedWaitForExclusive es idéntico al de ExAcquireResourceSharedLite a menos que el subproceso que realiza la llamada ya sea propietario del recurso como compartido y hay waiters exclusivos. En ese caso, ExAcquireSharedWaitForExclusive permite a los camareros exclusivos adquirir la propiedad exclusiva del recurso.

Si el autor de la llamada especifica TRUE para el parámetro Wait , el autor de la llamada se bloquea hasta que otro subproceso libere el recurso en nombre del autor de la llamada mediante ExReleaseResourceForThread. Los escritores de controladores deben tener cuidado para asegurarse de que otro subproceso libera realmente el recurso; de lo contrario, el autor de la llamada está interbloqueado. ExAcquireResourceSharedLite no tiene esta propiedad, por lo que los controladores deben usar esa rutina a menos que requieran el comportamiento concreto de ExAcquireSharedWaitForExclusive.

La entrega normal de APC del kernel debe deshabilitarse antes de llamar a esta rutina. Deshabilite la entrega normal de APC del kernel llamando a KeEnterCriticalRegion. La entrega debe permanecer deshabilitada hasta que se libere el recurso, en cuyo momento se puede volver a habilitar mediante una llamada a KeLeaveCriticalRegion. Para obtener más información, vea Deshabilitar LAS API.

Requisitos

Requisito Value
Cliente mínimo compatible Disponible a partir de Windows 2000.
Plataforma de destino Universal
Encabezado wdm.h (incluya Wdm.h, Ntddk.h, Ntifs.h)
Library NtosKrnl.lib
Archivo DLL NtosKrnl.exe
IRQL <= APC_LEVEL
Reglas de cumplimiento de DDI HwStorPortProhibitedDDIs(storport), IrqlExApcLte3(wdm), SpNoWait(storport), WithinCriticalRegion(storport), WithinCriticalRegion(storport), WithinCriticalRegion(wdm)

Consulte también

ExAcquireResourceSharedLite

ExAcquireSharedStarveExclusive

ExConvertExclusiveToSharedLite

ExGetExclusiveWaiterCount

ExIsResourceAcquiredExclusiveLite

ExIsResourceAcquiredSharedLite

ExReleaseResourceForThread