Condividi tramite


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.
Il tentativo di acquisire un blocco spin in modo ricorsivo è garantito che causi un deadlock. Per altre informazioni sui blocchi di selezione, vedere Spin Locks.

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)

Vedere anche

KeAcquireInStackQueuedSpinLock

KeAcquireSpinLockAtDpcLevel

KeInitializeSpinLock

KeReleaseSpinLock