Condividi tramite


Funzione NdisAcquireRWLockRead (ndis.h)

La funzione NdisAcquireRWLockRead ottiene un blocco di lettura usato dal chiamante per l'accesso in lettura alle risorse condivise tra i thread del driver.

Sintassi

void NdisAcquireRWLockRead(
  [in]  PNDIS_RW_LOCK_EX Lock,
  [out] PLOCK_STATE_EX   LockState,
  [in]  UCHAR            Flags
);

Parametri

[in] Lock

Puntatore a una variabile NDIS_RW_LOCK_EX opaca che rappresenta un blocco. Il chiamante può usare questo blocco per ottenere l'accesso in lettura o scrittura alle risorse condivise tra thread driver non ISR.

[out] LockState

Puntatore a una variabile LOCK_STATE_EX opaca che tiene traccia dello stato del blocco. Questa variabile esiste nell'intervallo tra i tempi in cui il chiamante ottiene e rilascia il blocco. Il chiamante deve usare una variabile di tipo diversa LOCK_STATE_EX per ogni tentativo di ottenere il blocco dallo stesso thread del driver non ISR.

[in] Flags

Valore di ULONG che contiene flag di blocco. Impostare questo parametro su NDIS_RWL_AT_DISPATCH_LEVEL se il runtime di integrazione corrente del chiamante è DISPATCH_LEVEL. In caso contrario, impostare questo parametro su zero. Per altre informazioni sul rilevamento IRQL dispatch, vedere Dispatch IRQL Tracking.

Nota Se il chiamante sa che il runtime di integrazione corrente è DISPATCH_LEVEL, impostare questo parametro su NDIS_RWL_AT_DISPATCH_LEVEL. Questo flag rende il blocco ancora più efficiente causando l'omissione di un controllo per l'IRQL corrente. Se irQL corrente è sconosciuto, non testare il runtime di integrazione corrente con KeGetCurrentIrql esclusivamente per determinare se impostare questo flag, perché è più efficiente consentire alla funzione NdisAcquireRWLockRead di testare il runtime di integrazione stesso.
 

Valore restituito

Nessuno

Osservazioni

I driver NDIS chiamano la funzione NdisAcquireRWLockRead per ottenere l'accesso in sola lettura alle risorse condivise tra thread driver.

Il driver deve allocare una variabile di tipo NDIS_RW_LOCK_EX con la funzione NdisAllocateRWLock prima che il driver chiami la funzione NdisAcquireRWLockRead.

Dopo che il driver chiama NdisAllocateRWLock, può chiamare NdisAcquireRWLockWrite o NdisAcquireRWLockRead per ottenere l'accesso in scrittura o in lettura alla risorsa. Un solo thread driver non ISR alla volta può ottenere l'accesso in scrittura alla risorsa. Quando un thread non ISR ha accesso in scrittura, tutti gli accessi in lettura e scrittura da altri thread non ISR devono attendere fino a quando il titolare dell'accesso in scrittura rilascia il blocco. Tuttavia, se un thread non ISR ha accesso in lettura, altri thread non ISR possono ottenere simultaneamente l'accesso in lettura.

Il blocco NDIS_RW_LOCK_EX non supporta l'innalzamento di livello dalla lettura alla scrittura. Dopo che un processore ha acquisito un NDIS_RW_LOCK_EX per l'accesso in lettura (chiamando NdisAcquireRWLockRead), lo stesso processore non deve tentare di acquisire l'accesso in scrittura (chiamando NdisAcquireRWLockWrite) fino al rilascio dell'accesso in lettura precedente.

Un blocco di lettura NDIS_RW_LOCK_EX può essere acquisito in modo ricorsivo sullo stesso processore. Per ogni chiamata a NdisAcquireRWLockRead, deve essere presente una chiamata corrispondente a NdisReleaseRWLock. Il blocco viene rilasciato solo dopo l'ultima chiamata a NdisReleaseRWLock.

Il driver non può usare un blocco per proteggere le risorse dall'accesso in lettura o scrittura condiviso dalle altre funzioni con il MiniportInterrupt o funzione miniportDisableInterruptEx o entrambi. Al contrario, il driver deve chiamare NdisMSynchronizeWithInterruptEx in modo che MiniportSynchronizeInterrupt funzione accede a tali risorse condivise allo stesso DIRQL che MiniportInterrupt o funzioni MiniportDisableInterruptEx o entrambe.

NdisAcquireRWLockRead genera sempre IRQL su IRQL = DISPATCH_LEVEL.

Fabbisogno

Requisito Valore
client minimo supportato Supportato in NDIS 6.20 e versioni successive.
piattaforma di destinazione Universale
intestazione ndis.h (include Ndis.h)
libreria Ndis.lib
IRQL <= DISPATCH_LEVEL

Vedere anche

LOCK_STATE_EX

miniportDisableInterruptEx

miniportInterrupt

MiniportSynchronizeInterrupt

NDIS_RW_LOCK_EX

NdisAcquireRWLockWrite

NdisAllocateRWLock

NdisMSynchronizeWithInterruptEx

NdisReleaseRWLock