Set di regole IRQL (WDM)

Usare queste regole per verificare che il driver effettui chiamate DDI nel runtime di integrazione richiesto.

Un driver che non segue le regole IRQL può causare gravi problemi durante l'operazione che possono causare condizioni di deadlock o arresti anomali del computer.

Contenuto della sezione

Argomento Descrizione

ForwardedAtBadIrql

La regola ForwardedAtBadIrql specifica che il driver deve chiamare IoCallDriver e PoCallDriver in IRQL<DISPATCH_LEVEL a meno che il codice della funzione principale IRP non venga inoltrato è uno dei seguenti:

ForwardedAtBadIrqlAllocate

La regola ForwardedAtBadIrqlAllocate specifica che il driver deve chiamare IoCallDriver e PoCallDriver in IRQL<DISPATCH_LEVEL, a meno che il codice della funzione principale IRP non venga inoltrato è uno dei seguenti:

ForwardedAtBadIrqlFsdAsync

La regola ForwardedAtBadIrqlFsdAsync specifica che il driver chiama IoCallDriver e PoCallDriver in IRQL<DISPATCH_LEVEL, a meno che il codice della funzione principale IRP non venga inoltrato è uno dei seguenti:

ForwardedAtBadIrqlFsdSync

La regola ForwardedAtBadIrqlFsdSync specifica che il driver chiama IoCallDriver e PoCallDriver in IRQL<DISPATCH_LEVEL, a meno che il codice della funzione principale IRP non venga inoltrato è uno dei seguenti:

IrqlApcLte

La regola IrqlApcLte specifica che il driver chiama ObGetObjectSecurity e ObReleaseObjectSecurity solo quando viene eseguito in IRQL <= APC_LEVEL.

IrqlDispatch

La regola IrqlDispatch specifica che il driver chiama le DDI seguenti solo quando viene eseguito in IRQL = DISPATCH_LEVEL.

IrqlExAllocatePool

La regola IrqlExAllocatePool specifica che il driver chiama ExAllocatePoolWithTag e ExAllocatePoolWithTagPriority solo quando viene eseguito in IRQL<=DISPATCH_LEVEL.

IrqlExApcLte1

La regola IrqlExApcLte1 specifica che il driver chiama ExAcquireFastMutex e ExTryToAcquireFastMutex solo in IRQL <= APC_LEVEL.

IrqlExApcLte2

La regola IrqlExApcLte2 specifica che il driver chiama le routine seguenti solo in IRQL <= APC_LEVEL.

IrqlExApcLte3

La regola IrqlExApcLte3 specifica che il driver chiama le routine di supporto esecutivo seguenti solo in IRQL <= APC_LEVEL.

IrqlExApcLteInline

La regola IrqlExApcLteInline specifica che le DDI vengono chiamate solo a livelli IRQL appropriati

IrqlExFree1

La regola IrqlExFree1 specifica che ExFreePool e ExFreePoolWithTag vengono chiamati in IRQL corretto.

IrqlExFree2

La regola IrqlExFree2 specifica che ExFreePool e ExFreePoolWithTag vengono chiamati in IRQL corretto.

IrqlExFree3

La regola IrqlExFree3 specifica che ExFreePool e ExFreePoolWithTag vengono chiamati in IRQL corretto.

IrqlExPassive

La regola IrqlExPassive specifica che il driver chiama le routine di supporto esecutivo seguenti solo in IRQL = PASSIVE_LEVEL:

La regola IrqlExPassive specifica anche che il driver chiama ExRaiseStatus in IRQL <= APC_LEVEL

IrqlIoApcLte

La regola IrqlIoApcLte specifica che il driver chiama le routine di gestione I/O seguenti solo quando viene eseguito in IRQL <= APC_LEVEL:

IrqlIoDispatch

La regola IrqlIoDispatch specifica che il driver chiama le routine di I/O Manager seguenti solo quando viene eseguito in IRQL <= DISPATCH_LEVEL: IoGetDeviceToVerify, IoSetDeviceToVerify.

IrqlIoPassive1

La regola IrqlIoPassive1 specifica che il driver chiama le routine seguenti solo quando viene eseguito in IRQL = PASSIVE_LEVEL:

IrqlIoPassive2

La regola IrqlIoPassive2 specifica che il driver chiama le routine di I/O Manager seguenti solo in IRQL = PASSIVE_LEVEL:

IrqlIoPassive3

La regola IrqlIoPassive3 specifica che il driver chiama le routine seguenti solo quando viene eseguito in IRQL = PASSIVE_LEVEL:

IrqlIoPassive4

La regola IrqlIoPassive4 specifica che il driver chiama le routine seguenti solo quando viene eseguito in IRQL = PASSIVE_LEVEL:

IrqlIoPassive5

La regola IrqlIoPassive5 specifica che il driver chiama routine di I/O Manager specifiche solo quando viene eseguito in IRQL = PASSIVE_LEVEL.

IrqlIoRtlZwPassive

La regola IrqlIoRtlZwPassive specifica che il driver chiama routine di I/O Manager specifiche solo quando viene eseguito in IRQL = PASSIVE_LEVEL.

IrqlKeApcLte1

La regola IrqlKeApcLte1 specifica che il driver chiama le routine del kernel seguenti solo quando viene eseguito in IRQL <= APC_LEVEL:

IrqlKeApcLte2

La regola IrqlKeApcLte2 specifica che il driver chiama le routine del kernel seguenti solo quando viene eseguito in IRQL <= APC_LEVEL:

IrqlKeDispatchLte

La regola IrqlKeDispatchLte specifica che il driver chiama le routine del kernel seguenti solo quando viene eseguito in IRQL <= DISPATCH_LEVEL:

IrqlKeRaiseLower

La regola IrqlKeRaiseLower specifica che il driver esegue le operazioni seguenti durante la generazione e l'abbassamento di IRQL:

Quando il driver chiama KeRaiseIrql, viene eseguito in un IRQL inferiore o uguale al valore del parametro NewIrql .
Il driver chiama KeLowerIrql solo dopo aver chiamato KeRaiseIrql o KeRaiseIrqlToDpcLevel.

IrqlKeRaiseLower2

La regola IrqlKeRaiseLower2 specifica che i driver usano KeLowerIrql per ripristinare l'IRQL originale generato da una chiamata precedente a KeRaiseIrql o KeRaiseIrqlToDpcLevel.

IrqlKeReleaseSpinLock

La regola IrqlKeReleaseSpinLock specifica che il driver chiama KeReleaseSpinLock solo quando viene eseguito in IRQL = DISPATCH_LEVEL.

IrqlKeSetEvent

La regola IrqlKeSetEvent specifica che la routine KeSetEvent viene chiamata solo in IRQL <= DISPATCH_LEVEL quando Wait è impostato su FALSE e in IRQL <= APC_LEVEL quando Wait è impostato su TRUE.

IrqlKeWaitForMutexObject

La regola IrqlKeWaitForMutexObject specifica il driver per chiamare la routine KeWaitForMutexObject in base al valore del parametro Timeout :

IrqlKeWaitForMultipleObjects

La regola IrqlKeWaitForMultipleObjects specifica che i chiamanti della routine KeWaitForMultipleObjects devono essere eseguiti in base al parametro Timeout .

IrqlMmApcLte

La regola IrqlMmApcLte specifica che il driver chiama le routine di gestione memoria seguenti solo quando viene eseguito in IRQL <= APC_LEVEL:

IrqlMmDispatch

La regola IrqlMmDispatch specifica che il driver chiama MmFreeContiguousMemory solo quando viene eseguito in IRQL <= DISPATCH_LEVEL.

IrqlNtifsApcPassive

La regola IIrqlNtifsApcPassive specifica che il driver chiama le DDI elencate nella regola solo quando viene eseguito in IRQL = PASSIVE_LEVEL o in IRQL <= APC_LEVEL.

IrqlObPassive

La regola IrqlObPassive specifica che il driver chiama ObReferenceObjectByHandle solo quando viene eseguito in IRQL = PASSIVE_LEVEL.

IrqlPsPassive

La regola IrqlPsPassive specifica che il driver chiama le routine della struttura di processo seguenti solo quando viene eseguito in IRQL = PASSIVE_LEVEL:

IrqlReturn

La regola IrqlReturn specifica che le routine di invio del driver restituiscono allo stesso irQL in cui sono stati chiamati.

IrqlRtlPassive

La regola IrqlRtlPassive specifica che il driver chiama RtlDeleteRegistryValue solo quando viene eseguito in IRQL = PASSIVE_LEVEL.

IrqlZwPassive

La regola IrqlZwPassive specifica che il driver chiama ZwClose solo quando viene eseguito in IRQL = PASSIVE_LEVEL.

Per selezionare il set di regole Irql

  1. Selezionare il progetto driver (con estensione vcxProj) in Microsoft Visual Studio. Dal menu Driver fare clic su Avvia verifica driver statico....

  2. Fare clic sulla scheda Regole . In Set di regole selezionare Irql.

    Per selezionare il set di regole predefinito da una finestra del prompt dei comandi per sviluppatori di Visual Studio, specificare Irql.sdv con l'opzione /check . Ad esempio:

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

    Per altre informazioni, vedere Uso del verificatore driver statico per trovare i difetti nei comandi driver e verifica driver statici (MSBuild).