Compartilhar via


Conjunto de regras IRQL (WDM)

Use essas regras para verificar se seu driver faz chamadas DDI no IRQL exigido.

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 no IRQL<DISPATCH_LEVEL, a menos que o código de função principal do 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 do IRP que está sendo encaminhado seja um dos seguintes:

ForwardedAtBadIrqlFsdSync

A regra ForwardedAtBadIrqlFsdSync especifica que o driver chama 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:

IrqlApcLte

A regra IrqlApcLte especifica que o driver chama ObGetObjectSecurity e ObReleaseObjectSecurity somente quando está em execução no IRQL <= APC_LEVEL.

IrqlDispatch

A regra IrqlDispatch especifica que o driver chama as 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 somente 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 rotinas de suporte executivo a seguir apenas 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 no IRQL adequado.

IrqlExFree3

A regra IrqlExFree3 especifica que ExFreePool e ExFreePoolWithTag são chamados no 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 gerenciador de E/S somente quando está em execução no IRQL <= APC_LEVEL:

IrqlIoDispatch

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

IrqlIoPassive1

A regra IrqlIoPassive1 especifica que o driver chama as seguintes rotinas somente quando está em execução no 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 é executado em IRQL = PASSIVE_LEVEL:

IrqlIoPassive4

A regra IrqlIoPassive4 especifica que o driver chama as seguintes rotinas somente quando está em execução no 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 no 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 no 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á sendo executado em IRQL <= APC_LEVEL:

IrqlKeDispatchLte

A regra IrqlKeDispatchLte especifica que o driver chama as seguintes rotinas de kernel somente quando está sendo executado 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 se encontra executando em um IRQL inferior ou igual ao valor do parâmetro NewIrql.
O driver chama KeLowerIrql somente após 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á sendo executado 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á em execução no 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á em execução no IRQL = PASSIVE_LEVEL ou no 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 rotinas específicas da Estrutura de Processo somente quando está em execução em IRQL = PASSIVE_LEVEL.

IrqlReturn

A regra IrqlReturn especifica que as rotinas de despacho 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 especificar o conjunto de regras padrão em uma janela de prompt de comando do desenvolvedor do Visual Studio, use Irql.sdv com a opção /check. 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).