Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
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) |