Funzione NdisAcquireRWLockWrite (ndis.h)

La funzione NdisAcquireRWLockWrite ottiene un blocco di scrittura usato dal chiamante per l'accesso in scrittura alle risorse condivise tra thread driver.

Sintassi

void NdisAcquireRWLockWrite(
  [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 scrittura o in lettura 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 eseguito per ottenere il blocco dallo stesso thread del driver non ISR.

[in] Flags

Valore 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 sull'invio del rilevamento IRQL, vedere Dispatch IRQL Tracking.For more information about dispatch IRQL tracking, see Dispatch IRQL Tracking.For more information about dispatch IRQL tracking, see 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 ancora più efficiente il blocco causando l'omissione di un controllo per l'IRQL corrente. Se irQL corrente è sconosciuto, non testare l'IRQL corrente con KeGetCurrentIrql esclusivamente per determinare se impostare questo flag, in quanto è più efficiente consentire alla funzione NdisAcquireRWlockWrite di testare il irQL stesso.
 

Valore restituito

nessuno

Osservazioni

I driver NDIS chiamano la funzione NdisAcquireRWLockWrite per modificare le 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 NdisAcquireRWlockWrite . Il driver deve fornire un handle a NdisAllocateRWLock per l'archiviazione residente per i blocchi usati.

Dopo che il driver chiama NdisAllocateRWLock, può chiamare NdisAcquireRWLockWrite o NdisAcquireRWLockRead per ottenere l'accesso in scrittura o in lettura alla risorsa. Solo un 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 scrittura NDIS_RW_LOCK_EX può essere acquisito in modo ricorsivo sullo stesso processore. Per ogni chiamata a NdisAcquireRWLockWrite, deve essere presente una chiamata corrispondente a NdisReleaseRWLock. Il blocco viene rilasciato solo dopo l'ultima chiamata a NdisReleaseRWLock.

Un thread driver non deve mai contenere un blocco di scrittura per più di pochi microsecondi. Il blocco di scrittura per un lungo periodo di tempo degrada sia le prestazioni del sistema operativo che del driver.

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

NdisAcquireRWLockWrite genera IRQL per DISPATCH_LEVEL ottenendo un blocco spin.

Requisiti

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

Vedi anche

LOCK_STATE_EX

MiniportDisableInterruptEx

MiniportInterrupt

MiniportSynchronizeInterrupt

NDIS_RW_LOCK_EX

NdisAcquireRWLockRead

NdisAllocateRWLock

NdisMSynchronizeWithInterruptEx

NdisReleaseRWLock