Partilhar via


Chamando rotinas de suporte que usam bloqueios de rotação

Chamar KeAcquireSpinLock ou KeAcquireInStackQueuedSpinLock define o IRQL no processador atual como DISPATCH_LEVEL até que uma chamada correspondente para KeReleaseSpinLock ou KeReleaseInStackQueuedSpinLock restaure o IRQL anterior. Portanto, os drivers devem estar sendo executados em IRQL <= DISPATCH_LEVEL quando chamam KeAcquireSpinLock ou KeAcquireInStackQueuedSpinLock.

Os chamadores de KeAcquireSpinLockAtDpcLevel, KeAcquireInStackQueuedSpinLockAtDpcLevel, KeReleaseInStackQueuedSpinLockFromDpcLevel e KeReleaseSpinLockFromDpcLevel são executados mais rapidamente porque já estão em execução no IRQL = DISPATCH_LEVEL portanto, essas rotinas de suporte não precisam redefinir IRQL no processador atual. Portanto, é um erro fatal na maioria das plataformas Windows chamar KeAcquireSpinLockAtDpcLevel ou KeAcquireInStackQueuedSpinLockAtDpcLevel durante a execução no IRQL menor que DISPATCH_LEVEL. Também é um erro liberar um bloqueio de rotação adquirido com KeAcquireSpinLock chamando KeReleaseSpinLockFromDpcLevel porque o IRQL original do chamador não foi restaurado.

Rotinas que mantêm um bloqueio de rotação executivo, como o Xxx ExInterlocked, geralmente são executadas em IRQL = DISPATCH_LEVEL até liberarem o bloqueio de rotação e retornarem o controle ao chamador. No entanto, é possível que a rotina InterruptService de um driver e as rotinas SynchCritSection (que são executadas em DIRQL) chamem determinadas rotinas Xxx ExInterlocked, como as rotinas da ListaXxxExInterlocked, desde que o bloqueio de rotação passado para a rotina seja usado exclusivamente pelas rotinas ISR e SynchCritSection.

Cada rotina que contém um bloqueio de rotação de interrupção é executada no DIRQL de um conjunto associado de objetos de interrupção. Portanto, um driver não deve chamar KeAcquireSpinLock e KeReleaseSpinLock nem qualquer outra rotina que use um bloqueio de rotação executivo de suas rotinas ISR ou SynchCritSection . Essa chamada é um erro que pode causar um deadlock do sistema, exigindo que o usuário reinicie seu computador. Observe que, se a rotina ISR ou SynchCritSection de um driver chamar uma rotina de ListaXxxExInterlocked , o driver não poderá reutilizar o bloqueio de rotação que ele passa para as rotinas da ListaXxxExInterlocked em chamadas para as rotinas de suporte KeXxxSpinLock ou KeXxxSpinLockXxxDpcLevel .

Se um driver tiver um ISR multivetor ou mais de um ISR, suas rotinas poderão chamar KeSynchronizeExecution durante a execução em qualquer IRQL até o valor SynchronizeIrql especificado para os objetos de interrupção associados quando eles estavam conectados.