Compartilhar via


Macro KeAcquireSpinLock (wdm.h)

A rotina KeAcquireSpinLock adquire um bloqueio de rotação para que o chamador possa sincronizar o acesso aos dados compartilhados de maneira segura para vários processadores gerando IRQL.

Sintaxe

void KeAcquireSpinLock(
   SpinLock,
   OldIrql
);

Parâmetros

SpinLock

Ponteiro para um KSPIN_LOCK bloqueio de rotação inicializado para o qual o chamador fornece o armazenamento.

OldIrql

Ponteiro para uma variável KIRQL que é definida como o IRQL atual quando essa chamada ocorre.

Retornar valor

Nenhum

Comentários

KeAcquireSpinLock primeiro redefine o IRQL para DISPATCH_LEVEL e, em seguida, adquire o bloqueio. O IRQL anterior é gravado em OldIrql depois que o bloqueio é adquirido.

O valor OldIrql deve ser especificado quando o bloqueio de rotação é liberado com KeReleaseSpinLock.

A maioria dos drivers usa uma variável local para armazenar o valor IRQL antigo. Um driver também pode usar um local de memória compartilhada, como uma variável global, mas o driver não deve usar o mesmo local para dois bloqueios diferentes. Caso contrário, uma condição de corrida pode ocorrer.

Os bloqueios de rotação podem causar sérios problemas se não forem usados criteriosamente. Em particular, nenhuma proteção contra deadlock é executada e a expedição é desabilitada enquanto o bloqueio de rotação é mantido. Portanto:

  • O código em uma região crítica protegida por um bloqueio de rotação não deve ser paginável nem fazer referências a dados pagináveis.
  • O código dentro de uma região crítica protegida por um bloqueio de rotação não pode chamar nenhuma função externa que possa acessar dados pagináveis ou gerar uma exceção, nem pode gerar exceções.
  • O chamador deve liberar o bloqueio de rotação com KeReleaseSpinLock o mais rápido possível.
A tentativa de adquirir um bloqueio de rotação recursivamente é garantida para causar um deadlock. Para obter mais informações sobre bloqueios de rotação, consulte Spin Locks.

Requisitos

Requisito Valor
Cliente mínimo com suporte Disponível a partir do Windows 2000.
Plataforma de Destino Universal
Cabeçalho wdm.h (include Wdm.h, Ntddk.h, Ntifs.h)
Biblioteca Hal.lib
IRQL <= DISPATCH_LEVEL
Regras de conformidade da DDI HwStorPortProhibitedDIs(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)

Confira também

KeAcquireInStackQueuedSpinLock

KeAcquireSpinLockAtDpcLevel

KeInitializeSpinLock

KeReleaseSpinLock