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.
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) |