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 tramite la generazione di IRQL.

Sintassi

void KeAcquireSpinLock(
   SpinLock,
   OldIrql
);

Parametri

SpinLock

Puntatore a un blocco di selezione 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 il runtime di integrazione 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 spin viene rilasciato con KeReleaseSpinLock.

La maggior parte dei driver usa una variabile locale per archiviare il valore IRQL precedente. Un driver può anche usare un percorso 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 giudizio. In particolare, non viene eseguita alcuna protezione deadlock e l'invio è disabilitato mentre viene mantenuto il blocco di rotazione. Di conseguenza:

  • Il codice all'interno di un'area critica protetta da un blocco di rotazione non deve essere paging né fare 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 possa accedere a dati visualizzabili o generare un'eccezione, né generare eccezioni.
  • Il chiamante deve rilasciare il blocco spin con KeReleaseSpinLock il più rapidamente possibile.
È garantito che il tentativo di acquisire un blocco spin in modo ricorsivo causi un deadlock. Per altre informazioni sui blocchi di rotazione, vedere Blocchi di rotazione.

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 Hal.lib
IRQL <= DISPATCH_LEVEL
Regole di conformità DDI HwStorPortProhibitedDDDIs(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)

Vedi anche

KeAcquireInStackQueuedSpinLock

KeAcquireSpinLockAtDpcLevel

KeInitializeSpinLock

KeReleaseSpinLock