Macro KeAcquireSpinLock (wdm.h)
La routine KeAcquireSpinLock acquisisce un blocco spin in modo che il chiamante possa sincronizzare l'accesso ai dati condivisi in modo sicuro generando IRQL.
Sintassi
void KeAcquireSpinLock(
SpinLock,
OldIrql
);
Parametri
SpinLock
Puntatore a un blocco di spin KSPIN_LOCK inizializzato per il quale il chiamante fornisce l'archiviazione.
OldIrql
Puntatore a una variabile KIRQL impostata sull'IRQL corrente quando si verifica questa chiamata.
Valore restituito
Nessuno
Osservazioni
KeAcquireSpinLock reimposta prima irQL su DISPATCH_LEVEL e quindi acquisisce il blocco. Il runtime di integrazione precedente viene scritto in OldIrql dopo l'acquisizione del blocco.
Il valore OldIrql deve essere specificato quando il blocco di selezione viene rilasciato con KeReleaseSpinLock.
La maggior parte dei driver usa una variabile locale per archiviare il valore IRQL precedente. Un driver può anche usare una posizione di memoria condivisa, ad esempio una variabile globale, ma il driver non deve usare la stessa posizione per due blocchi diversi. In caso contrario, può verificarsi una race condition.
I blocchi di rotazione possono causare gravi problemi se non usati in modo succoso. In particolare, non viene eseguita alcuna protezione deadlock e l'invio è disabilitato mentre si tiene il blocco di selezione. Pertanto:
- Il codice all'interno di un'area critica sorvegliata da un blocco di selezione non deve né essere visualizzabile né creare riferimenti a dati di paging.
- Il codice all'interno di un'area critica sorvegliata da un blocco spin non può chiamare alcuna funzione esterna che potrebbe accedere a dati visualizzabili o generare un'eccezione, né generare eccezioni.
- Il chiamante deve rilasciare il blocco spin con KeReleaseSpinLock il più rapidamente possibile.
Fabbisogno
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 | Hal.lib |
IRQL | <= DISPATCH_LEVEL |
regole di conformità DDI | HwStorPortProhibitedDDIs(storport), IrqlKeDispatchLte(wdm), MarkingQueuedIrps(wdm), ReqSendWhileSpinlock(kmdf), Spinlock(kmdf), Spinlock(kmdf), SpinLock(storport), SpinLock(storport), SpinLock(wdm), SpinlockDpc(kmdf), SpinlockDpc(kmdf), SpinLockDpc(storport), SpinLockDpc(storport), SpinLockDpc(wdm), SpinlockRelease(kmdf), SpinlockRelease(kmdf), SpinLockRelease(storport), SpinLockRelease(storport), SpinlockRelease(wdm), SpinLockSafe(storport), SpinLockSafe(storport), SpinLockSafe(wdm) |