Funzione ExAcquireSharedWaitForExclusive (wdm.h)

La routine ExAcquireSharedWaitForExclusive acquisisce la risorsa specificata per l'accesso condiviso se è possibile concedere l'accesso condiviso e non sono presenti waiter esclusivi.

Sintassi

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

Parametri

[in, out] Resource

Puntatore alla risorsa da acquisire per l'accesso condiviso.

[in] Wait

Specifica il comportamento della routine ogni volta che la risorsa non può essere acquisita immediatamente. Se TRUE, il chiamante viene inserito in uno stato di attesa fino a quando la risorsa non può essere acquisita. Se FALSE, la routine restituisce immediatamente, indipendentemente dal fatto che la risorsa possa essere acquisita.

Valore restituito

ExAcquireSharedWaitForExclusive restituisce TRUE se l'accesso richiesto viene concesso o un proprietario esclusivo rilascia la risorsa. Questa routine restituisce FALSE se l'input Wait è FALSE e non è possibile concedere immediatamente l'accesso condiviso.

Commenti

La maggior parte dei driver deve usare ExAcquireResourceSharedLite anziché ExAcquireSharedWaitForExclusive.

Il chiamante può rilasciare la risorsa chiamando ExReleaseResourceLite o ExReleaseResourceForThreadLite.

Se non è possibile concedere immediatamente l'accesso condiviso, il chiamante può attendere l'acquisizione e il rilascio della proprietà esclusiva della risorsa da parte di altri thread.

Il fatto che il chiamante abbia accesso condiviso alla risorsa specificata dipende dal seguente:

  • Se la risorsa non è attualmente attivata, l'accesso condiviso viene concesso immediatamente al thread corrente.
  • Se il chiamante ha già accesso esclusivo alla risorsa, al thread corrente viene concesso lo stesso tipo di accesso in modo ricorsivo.
  • Se la risorsa è attualmente di proprietà condivisa e non sono presenti tentativi in sospeso di acquisire l'accesso esclusivo, l'accesso condiviso viene concesso immediatamente al chiamante.
  • Se la risorsa è attualmente di proprietà come condivisa, ma si verifica un tentativo in sospeso di acquisire l'accesso esclusivo, il chiamante viene inserito in uno stato di attesa (Wait impostato su TRUE) oppure ExAcquireSharedWaitForExclusive restituisce FALSE.

    Quando il thread corrente attende di acquisire la risorsa fino al rilascio di una proprietà esclusiva in sospeso, ExAcquireSharedWaitForExclusive restituisce TRUE quando al thread corrente viene concesso l'accesso condiviso alla risorsa e riprende l'esecuzione.

Il comportamento di ExAcquireSharedWaitForExclusive è identico a quello di ExAcquireResourceSharedLite , a meno che il thread chiamante non sia già proprietario della risorsa come condiviso e che siano presenti waiter esclusivi. In tal caso, ExAcquireSharedWaitForExclusive consente ai camerieri esclusivi di acquisire la proprietà esclusiva della risorsa.

Se il chiamante specifica TRUE per il parametro Wait , il chiamante si blocca finché un altro thread non libera la risorsa per conto del chiamante, usando ExReleaseResourceForThread. Gli autori di driver devono prestare attenzione a garantire che un altro thread rilasci effettivamente la risorsa; in caso contrario, il chiamante è deadlock. ExAcquireResourceSharedLite non dispone di questa proprietà, pertanto i driver devono usare tale routine a meno che non richiedano il comportamento specifico di ExAcquireSharedWaitForExclusive.

Il recapito APC del kernel normale deve essere disabilitato prima di chiamare questa routine. Disabilitare il normale recapito APC del kernel chiamando KeEnterCriticalRegion. Il recapito deve rimanere disabilitato fino al rilascio della risorsa, a quel punto può essere riabilitabile chiamando KeLeaveCriticalRegion. Per altre informazioni, vedere Disabilitazione delle SCHEDE APN.

Requisiti

Requisito Valore
Client minimo supportato Disponibile a partire da Windows 2000.
Piattaforma di destinazione Universale
Intestazione wdm.h (include Wdm.h, Ntddk.h, Ntifs.h)
Libreria NtosKrnl.lib
DLL NtosKrnl.exe
IRQL <= APC_LEVEL
Regole di conformità DDI HwStorPortProhibitedDDDIs(storport), IrqlExApcLte3(wdm), SpNoWait(storport), WithinCriticalRegion(storport), WithinCriticalRegion(storport), WithinCriticalRegion(wdm)

Vedi anche

ExAcquireResourceSharedLite

ExAcquireSharedStarveExclusive

ExConvertExclusiveToSharedLite

ExGetExclusiveWaiterCount

ExIsResourceAcquiredExclusiveLite

ExIsResourceAcquiredSharedLite

ExReleaseResourceForThread