Partilhar via


Função ExAcquireSharedWaitForExclusive (wdm.h)

A rotina de ExAcquireSharedWaitForExclusive adquire o recurso determinado para acesso compartilhado se o acesso compartilhado puder ser concedido e não houver garçons exclusivos.

Sintaxe

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

Parâmetros

[in, out] Resource

Um ponteiro para o recurso a ser adquirido para acesso compartilhado.

[in] Wait

Especifica o comportamento da rotina sempre que o recurso não pode ser adquirido imediatamente. Se VERDADEIRO, o chamador será colocado em um estado de espera até que o recurso possa ser adquirido. Se FALSE, a rotina retornará imediatamente, independentemente de o recurso poder ser adquirido.

Valor de retorno

ExAcquireSharedWaitForExclusive retorna VERDADEIRO se o acesso solicitado for concedido ou um proprietário exclusivo liberar o recurso. Essa rotina retornará FALSE se a de espera de de entrada for FALSE e o acesso compartilhado não puder ser concedido imediatamente.

Observações

A maioria dos drivers deve usar ExAcquireResourceSharedLite em vez de ExAcquireSharedWaitForExclusive.

O chamador pode liberar o recurso chamando ExReleaseResourceLite ou ExReleaseResourceForThreadLite.

Se o acesso compartilhado não puder ser concedido imediatamente, o chamador poderá aguardar que outros threads adquiram e liberem a propriedade exclusiva do recurso.

Se ou quando o chamador recebe acesso compartilhado ao recurso especificado depende do seguinte:

  • Se o recurso não for sem proprietário no momento, o acesso compartilhado será concedido imediatamente ao thread atual.
  • Se o chamador já tiver acesso exclusivo ao recurso, o thread atual receberá o mesmo tipo de acesso recursivamente.
  • Se o recurso for atualmente de propriedade como compartilhado e não houver nenhuma tentativa pendente de adquirir acesso exclusivo, o acesso compartilhado será concedido ao chamador imediatamente.
  • Se o recurso for atualmente de propriedade compartilhada, mas houver uma tentativa pendente de adquirir acesso exclusivo, o chamador será colocado em um estado de espera (Wait definido como TRUE) ou ExAcquireSharedWaitForExclusive retornará FALSE.

    Quando o thread atual aguarda para adquirir o recurso até que uma propriedade exclusiva pendente tenha sido lançada, ExAcquireSharedWaitForExclusive retorna VERDADEIRO quando o thread atual recebe acesso compartilhado ao recurso e retoma a execução.

O comportamento de ExAcquireSharedWaitForExclusive é idêntico ao de ExAcquireResourceSharedLite, a menos que o thread de chamada já possua o recurso como compartilhado e haja garçons exclusivos. Nesse caso, ExAcquireSharedWaitForExclusive permite que os garçons exclusivos adquiram a propriedade exclusiva do recurso.

Se o chamador especificar TRUE para o parâmetro Wait, o chamador bloqueará até que outro thread libere o recurso em nome do chamador, usando ExReleaseResourceForThread. Os gravadores de driver devem ter cuidado para garantir que outro thread realmente libere o recurso; caso contrário, o chamador está em deadlock. ExAcquireResourceSharedLite não tem essa propriedade, portanto, os drivers devem usar essa rotina, a menos que exijam o comportamento específico de ExAcquireSharedWaitForExclusive.

A entrega normal de APC do kernel deve ser desabilitada antes de chamar essa rotina. Desabilite a entrega normal do APC do kernel chamando KeEnterCriticalRegion. A entrega deve permanecer desabilitada até que o recurso seja liberado, momento em que ele pode ser reenabled chamando KeLeaveCriticalRegion. Para obter mais informações, consulte Desabilitando APCs.

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

Consulte também

ExAcquireResourceSharedLite

ExAcquireSharedStarveExclusive

ExConvertExclusiveToSharedLite

ExGetExclusiveWaiterCount

ExIsResourceAcquiredExclusiveLite

ExIsResourceAcquiredSharedLite

ExReleaseResourceForThread