Compartilhar via


Conjunto de regras IRQL (WDM)

Use essas regras para verificar se o driver faz chamadas DDI no IRQL necessário.

Um driver que não segue as regras do IRQL pode causar sérios problemas durante a operação que podem levar a condições de deadlock ou falhas no computador.

Nesta seção

Tópico Descrição

ForwardedAtBadIrql

A regra ForwardedAtBadIrql especifica que o driver deve chamar IoCallDriver e PoCallDriver no IRQL<DISPATCH_LEVEL a menos que o código de função principal do IRP que está sendo encaminhado seja um dos seguintes:

ForwardedAtBadIrqlAllocate

A regra ForwardedAtBadIrqlAllocate especifica que o driver deve chamar IoCallDriver e PoCallDriver em IRQL<DISPATCH_LEVEL, a menos que o código de função principal IRP que está sendo encaminhado seja um dos seguintes:

ForwardedAtBadIrqlFsdAsync

A regra ForwardedAtBadIrqlFsdAsync especifica que o driver chama IoCallDriver e PoCallDriver no IRQL<DISPATCH_LEVEL, a menos que o código de função principal irp que está sendo encaminhado seja um dos seguintes:

ForwardedAtBadIrqlFsdSync

A regra ForwardedAtBadIrqlFsdSync especifica que o driver chame IoCallDriver e PoCallDriver em IRQL<DISPATCH_LEVEL, a menos que o código de função principal irp que está sendo encaminhado seja um dos seguintes:

IrqlApcLte

A regra IrqlApcLte especifica que o driver chama ObGetObjectSecurity e ObReleaseObjectSecurity somente quando está sendo executado em IRQL <= APC_LEVEL.

IrqlDispatch

A regra IrqlDispatch especifica que o driver chama os DDIs a seguir somente quando está em execução em IRQL = DISPATCH_LEVEL.

IrqlExAllocatePool

A regra IrqlExAllocatePool especifica que o driver chama ExAllocatePoolWithTag e ExAllocatePoolWithTagPriority somente quando está sendo executado em IRQL<=DISPATCH_LEVEL.

IrqlExApcLte1

A regra IrqlExApcLte1 especifica que o driver chama ExAcquireFastMutex e ExTryToAcquireFastMutex apenas em IRQL <= APC_LEVEL.

IrqlExApcLte2

A regra IrqlExApcLte2 especifica que o driver chama as rotinas a seguir apenas em IRQL <= APC_LEVEL.

IrqlExApcLte3

A regra IrqlExApcLte3 especifica que o driver chama as seguintes rotinas de suporte executivo somente em IRQL <= APC_LEVEL.

IrqlExApcLteInline

A regra IrqlExApcLteInline especifica que os DDIs são chamados apenas em níveis IRQL adequados

IrqlExFree1

A regra IrqlExFree1 especifica que ExFreePool e ExFreePoolWithTag são chamados em IRQL adequado.

IrqlExFree2

A regra IrqlExFree2 especifica que ExFreePool e ExFreePoolWithTag são chamados em IRQL adequado.

IrqlExFree3

A regra IrqlExFree3 especifica que ExFreePool e ExFreePoolWithTag são chamados em IRQL adequado.

IrqlExPassive

A regra IrqlExPassive especifica que o driver chama as seguintes rotinas de suporte executivo somente em IRQL = PASSIVE_LEVEL:

A regra IrqlExPassive também especifica que o driver chama ExRaiseStatus em IRQL <= APC_LEVEL

IrqlIoApcLte

A regra IrqlIoApcLte especifica que o driver chama as seguintes rotinas de gerente de E/S somente quando está em execução em IRQL <= APC_LEVEL:

IrqlIoDispatch

A regra IrqlIoDispatch especifica que o driver chama as seguintes rotinas do Gerenciador de E/S somente quando está em execução em IRQL <= DISPATCH_LEVEL: IoGetDeviceToVerify, IoSetDeviceToVerify.

IrqlIoPassive1

A regra IrqlIoPassive1 especifica que o driver chama as seguintes rotinas somente quando está em execução em IRQL = PASSIVE_LEVEL:

IrqlIoPassive2

A regra IrqlIoPassive2 especifica que o driver chama as seguintes rotinas do Gerenciador de E/S somente em IRQL = PASSIVE_LEVEL:

IrqlIoPassive3

A regra IrqlIoPassive3 especifica que o driver chama as seguintes rotinas somente quando está em execução em IRQL = PASSIVE_LEVEL:

IrqlIoPassive4

A regra IrqlIoPassive4 especifica que o driver chama as seguintes rotinas somente quando está sendo executado em IRQL = PASSIVE_LEVEL:

IrqlIoPassive5

A regra IrqlIoPassive5 especifica que o driver chama rotinas específicas do Gerenciador de E/S somente quando está em execução em IRQL = PASSIVE_LEVEL.

IrqlIoRtlZwPassive

A regra IrqlIoRtlZwPassive especifica que o driver chama rotinas específicas do Gerenciador de E/S somente quando está em execução em IRQL = PASSIVE_LEVEL.

IrqlKeApcLte1

A regra IrqlKeApcLte1 especifica que o driver chama as seguintes rotinas de kernel somente quando está em execução em IRQL <= APC_LEVEL:

IrqlKeApcLte2

A regra IrqlKeApcLte2 especifica que o driver chama as seguintes rotinas de kernel somente quando está em execução em IRQL <= APC_LEVEL:

IrqlKeDispatchLte

A regra IrqlKeDispatchLte especifica que o driver chama as seguintes rotinas de kernel somente quando está em execução em IRQL <= DISPATCH_LEVEL:

IrqlKeRaiseLower

A regra IrqlKeRaiseLower especifica que o driver faz o seguinte ao gerar e reduzir o IRQL:

Quando o driver chama KeRaiseIrql, ele está em execução em um IRQL que é menor ou igual ao valor do parâmetro NewIrql .
O driver chama KeLowerIrql somente depois de chamar KeRaiseIrql ou KeRaiseIrqlToDpcLevel.

IrqlKeRaiseLower2

A regra IrqlKeRaiseLower2 especifica que os drivers usam KeLowerIrql para restaurar o IRQL original gerado por uma chamada anterior para KeRaiseIrql ou KeRaiseIrqlToDpcLevel.

IrqlKeReleaseSpinLock

A regra IrqlKeReleaseSpinLock especifica que o driver chama KeReleaseSpinLock somente quando está em execução em IRQL = DISPATCH_LEVEL.

IrqlKeSetEvent

A regra IrqlKeSetEvent especifica que a rotina KeSetEvent só é chamada em IRQL <= DISPATCH_LEVEL quando Wait é definido como FALSE e em IRQL <= APC_LEVEL quando Wait é definido como TRUE.

IrqlKeWaitForMutexObject

A regra IrqlKeWaitForMutexObject especifica o driver para chamar a rotina KeWaitForMutexObject no IRQL adequado com base no valor do parâmetro Timeout :

IrqlKeWaitForMultipleObjects

A regra IrqlKeWaitForMultipleObjects especifica que os chamadores da rotina KeWaitForMultipleObjects devem estar em execução no IRQL adequado com base no parâmetro Timeout .

IrqlMmApcLte

A regra IrqlMmApcLte especifica que o driver chama as seguintes rotinas do gerenciador de memória somente quando está sendo executado em IRQL <= APC_LEVEL:

IrqlMmDispatch

A regra IrqlMmDispatch especifica que o driver chama MmFreeContiguousMemory somente quando está sendo executado em IRQL <= DISPATCH_LEVEL.

IrqlNtifsApcPassive

A regra IIrqlNtifsApcPassive especifica que o driver chama os DDIs listados na regra somente quando está executando em IRQL = PASSIVE_LEVEL ou em IRQL <= APC_LEVEL.

IrqlObPassive

A regra IrqlObPassive especifica que o driver chama ObReferenceObjectByHandle somente quando está sendo executado em IRQL = PASSIVE_LEVEL.

IrqlPsPassive

A regra IrqlPsPassive especifica que o driver chama as seguintes rotinas de Estrutura de Processo somente quando está em execução em IRQL = PASSIVE_LEVEL:

IrqlReturn

A regra IrqlReturn especifica que as rotinas de expedição do driver retornam no mesmo IRQL no qual foram chamadas.

IrqlRtlPassive

A regra IrqlRtlPassive especifica que o driver chama RtlDeleteRegistryValue somente quando está em execução em IRQL = PASSIVE_LEVEL.

IrqlZwPassive

A regra IrqlZwPassive especifica que o driver chama ZwClose somente quando está sendo executado em IRQL = PASSIVE_LEVEL.

Para selecionar o conjunto de regras Irql

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

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

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

    Para obter mais informações, consulte Usando o Verificador de Driver Estático para localizar defeitos em drivers e comandos do Verificador de Driver Estático (MSBuild).