Partilhar via


Conjunto de regras IRQL (WDM)

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

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

Nesta secção

Tópico Descrição

EncaminhadoAtBadIrql

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

EncaminhadoAtBadIrqlAllocate

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

EncaminhadoAtBadIrqlFsdAsync

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

EncaminhadoAtBadIrqlFsdSync

A regra ForwardedAtBadIrqlFsdSync especifica que o driver chame IoCallDriver e PoCallDriver no IRQL<DISPATCH_LEVEL, a menos que o código da 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 seguintes DDIs apenas quando executado 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 seguintes rotinas somente 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 DDIs são chamadas apenas em níveis adequados de IRQL

IrqlExFree1

A regra IrqlExFree1 especifica que ExFreePool e ExFreePoolWithTag são chamados no 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á sendo executado em 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á sendo executado 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á sendo executado em IRQL = PASSIVE_LEVEL:

IrqlIoPassivo4

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á sendo executado em IRQL = PASSIVE_LEVEL.

IrqlIoRtlZwPassive

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

IrqlKeApcLte1

A regra IrqlKeApcLte1 especifica que o driver chama as seguintes rotinas do kernel somente quando está sendo executado em IRQL <= APC_LEVEL:

IrqlKeApcLte2

A regra IrqlKeApcLte2 especifica que o driver chama as seguintes rotinas do kernel somente quando está sendo executado em IRQL <= APC_LEVEL:

IrqlKeDispatchLte

A regra IrqlKeDispatchLte especifica que o driver chama as seguintes rotinas do kernel somente quando está sendo executado em IRQL <= DISPATCH_LEVEL:

IrqlKeRaiseLower

A regra IrqlKeRaiseLower especifica que o driver faz o seguinte ao aumentar e baixar o IRQL:

Quando o driver chama KeRaiseIrql, ele está a executar 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á sendo executado em IRQL = DISPATCH_LEVEL.

IrqlKeSetEvent

A regra IrqlKeSetEvent especifica que a rotina KeSetEvent só é chamada em IRQL <= DISPATCH_LEVEL quando Wait está definido como FALSE, e em IRQL <= APC_LEVEL quando Wait está 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 as DDIs listadas na regra somente quando está sendo executado 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 rotinas específicas da Estrutura de Processo somente quando está sendo executado em IRQL = PASSIVE_LEVEL.

IrqlReturn

A regra IrqlReturn especifica que as rotinas de despacho do motorista retornam no mesmo IRQL em que foram chamadas.

IrqlRtlPassive

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

IrqlZwPassive

A regra IrqlZwPassive especifica que o driver chama ZwClose somente quando ele 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 de prompt de comando do desenvolvedor do Visual Studio, especifique 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).