Partilhar via


Conjunto de regras de bloqueio (Storport)

Use essas regras para verificar se o driver gerencia corretamente os recursos compartilhados.

Nesta seção

Tópico Descrição

CancelSpinLock

A regra Regra CancelSpinLock (Storport) verifica se cada chamada para IoAcquireCancelSpinLock é seguida imediatamente por uma chamada para IoReleaseCancelSpinLock.

QueuedSpinLock

A regra QueuedSpinLock verifica se os bloqueios de rotação enfileirados na pilha adquiridos usando KeAcquireInStackQueuedSpinLock são lançados imediatamente usando KeReleaseInStackQueuedSpinLock. Além disso, no final de uma rotina de expedição ou cancelamento, o driver não deve manter nenhum bloqueio.

QueuedSpinLockRelease

Essa regra verifica se o driver não chama KeReleaseInStackQueuedSpinLock sem primeiro adquirir o bloqueio por meio de KeAcquireInStackQueuedSpinLock.

SpinLock

Essa regra verifica se uma chamada para KeAcquireSpinLock é seguida imediatamente por uma chamada para KeReleaseSpinlock. Se um driver chamar KeAcquireSpinLockRaiseToDpc ou KeAcquireSpinLock novamente antes de liberar o bloqueio, ele falhará na regra. Além disso, antes de sair da rotina de expedição ou cancelamento, o driver deve liberar o bloqueio de rotação.

SpinLockDpc

Essa regra verifica se uma chamada para KeAcquireSpinLockRaiseToDpc é seguida imediatamente por uma chamada para KeReleaseSpinlock. Se um driver chamar KeAcquireSpinLock ou KeAcquireSpinLockRaiseToDpc novamente antes de liberar o bloqueio, ele falhará na regra. Além disso, antes de sair da rotina de expedição ou cancelamento, o driver deve liberar o bloqueio de rotação.

SpinLockRelease

Essa regra verifica se o driver não tenta liberar um bloqueio via KeReleaseSpinLock sem primeiro adquiri-lo por meio de KeAquireSpinlock ou KeAcquireSpinLockRaiseToDpc. A regra é aprovada quando o bloqueio de rotação adquirido é liberado.

SpinLockSafe

Essa regra verifica se as rotinas IoStartNextPacket e IoCompleteRequest não são chamadas enquanto mantém um bloqueio de rotação. A regra controla o número de bloqueios de rotação mantidos a qualquer momento e, se esse número não for 0 quando uma das rotinas for chamada, o driver falhará na regra.

StorPortMSILock

Os drivers de miniport são necessários para adquirir o bloqueio de rotação msi para uma mensagem se, e somente se, o membro InterruptSynchronizationMode da estrutura PORT_CONFIGURATION_INFORMATION (Storport) estiver definido como InterruptSynchronizePerMessage. Essa regra verifica se as chamadas para StorPortAcquireMSISpinLock só serão feitas se o modo de sincronização for InterruptSynchronizePerMessage.

StorPortSpinLock

Essa regra verifica se os bloqueios adquiridos por meio de StorPortAcquireSpinLock são liberados imediatamente por meio de StorPortReleaseSpinLock. O driver de miniporta falhará na regra se tentar adquirir um bloqueio que já havia adquirido ou se tentar liberar um bloqueio que não havia adquirido. Além disso, no final da rotina de expedição ou cancelamento, o driver não deve manter nenhum bloqueio de rotação.

StorPortSpinLock3

A regra StorPortSpinLock3 verifica a hierarquia de aquisição de bloqueio descrita na documentação da rotina StorPortAcquireSpinLock .

StorPortSpinLock4

Essa regra é o equivalente de versão do StorPortSpinLock. É semelhante à regra SpinLockRelease .

Para selecionar o conjunto de regras de bloqueio

  1. Selecione seu projeto de driver (.vcxProj) no Microsoft Visual Studio. No menu Driver , clique em Iniciar Verificador de Driver Estático....

  2. Clique na guia Regras . Em Conjuntos de Regras, selecione Bloqueio.

    Para selecionar o conjunto de regras padrão em uma janela do prompt de comando do desenvolvedor do Visual Studio, especifique Locking.sdv com a opção /marcar. Por exemplo:

    msbuild /t:sdv /p:Inputs="/check:Locking.sdv" mydriver.VcxProj /p:Configuration="Win8 Release" /p:Platform=Win32
    

    Para obter mais informações, consulte Using Static Driver Verifier to Find Defects in Drivers and Static Driver Verifier commands (MSBuild).