Compartir a través de


Función ExAcquireSharedWaitForExclusive (wdm.h)

La rutina ExAcquireSharedWaitForExclusive adquiere el recurso dado para el acceso compartido si se puede conceder acceso compartido y no hay ningún waiter 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 TRUE, el autor de la llamada se coloca en un estado de espera hasta que se pueda adquirir el recurso. Si 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 el de espera de entrada es FALSE y no se puede conceder acceso compartido inmediatamente.

Observaciones

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 depende de lo siguiente:

  • Si el recurso no está registrado actualmente, el acceso compartido se concede 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 recursivamente.
  • 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 liberar 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 de llamada ya sea propietario del recurso como compartido y hay esperas exclusivas. En ese caso, exAcquireSharedWaitForExclusive permite que los waiters exclusivos adquieran 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 libere 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 llamando a KeLeaveCriticalRegion. Para obtener más información, consulte Deshabilitación de las API.

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 <= APC_LEVEL
reglas de cumplimiento de DDI HwStorPortProhibitedDIs(storport), IrqlExApcLte3(wdm), SpNoWait(storport), WithinCriticalRegion(storport), WithinCriticalRegion(storport), WithinCriticalRegion(wdm)

Consulte también

ExAcquireResourceSharedLite

exAcquireSharedStarveExclusive

exConvertExclusiveToSharedLite

ExGetExclusiveWaiterCount

ExIsResourceAcquiredExclusiveLite

ExIsResourceAcquiredSharedLite

ExReleaseResourceForThread