Partilhar 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 forma segura em 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.

Valor de retorno

Nenhum

Observações

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 de forma criteriosa. Em particular, nenhuma proteção de deadlock é executada e a expedição é desabilitada enquanto o bloqueio de rotação é mantido. Por conseguinte:

  • O código dentro de 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
da Plataforma de Destino Universal
cabeçalho wdm.h (include Wdm.h, Ntddk.h, Ntifs.h)
Biblioteca Hal.lib
IRQL <= DISPATCH_LEVEL
regras de conformidade de 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)

Consulte também

KeAcquireInStackQueuedSpinLock

KeAcquireSpinLockAtDpcLevel

KeInitializeSpinLock

KeReleaseSpinLock

Bloqueios de rotação