Compartir a través de


Conjunto de reglas IRQL (WDM)

Use estas reglas para comprobar que el controlador realiza llamadas DDI en el IRQL necesario.

Un controlador que no sigue las reglas IRQL puede causar problemas graves durante la operación que pueden provocar problemas de interbloqueo o bloqueos de equipo.

En esta sección

Tema Descripción

ForwardedAtBadIrql

La regla ForwardedAtBadIrql especifica que el controlador debe llamar a IoCallDriver y PoCallDriver en IRQL<DISPATCH_LEVEL a menos que el código de función principal de IRP que se reenvíe sea uno de los siguientes:

ForwardedAtBadIrqlAllocate

La regla ForwardedAtBadIrqlAllocate especifica que el controlador debe llamar a IoCallDriver y PoCallDriver en IRQL<DISPATCH_LEVEL, a menos que el código de función principal de IRP que se reenvíe sea uno de los siguientes:

ForwardedAtBadIrqlFsdAsync

La regla ForwardedAtBadIrqlFsdAsync especifica que el controlador llama a IoCallDriver y PoCallDriver en IRQL<DISPATCH_LEVEL, a menos que el código de función principal de IRP reenviado sea uno de los siguientes:

ForwardedAtBadIrqlFsdSync

La regla ForwardedAtBadIrqlAllocate especifica que el controlador llama a IoCallDriver y PoCallDriver en IRQL<DISPATCH_LEVEL, a menos que el código de función principal de IRP que se reenvíe sea uno de los siguientes:

IrqlApcLte

La regla IrqlApcLte especifica que el controlador llama a ObGetObjectSecurity y ObReleaseObjectSecurity solo cuando se ejecuta en IRQL <= APC_LEVEL.

IrqlDispatch

La regla IrqlDispatch especifica que el controlador llama a las siguientes DDI solo cuando se ejecuta en IRQL = DISPATCH_LEVEL.

IrqlExAllocatePool

La regla IrqlExAllocatePool especifica que el controlador llama a ExAllocatePoolWithTag y ExAllocatePoolWithTagPriority solo cuando se ejecuta en IRQL<=DISPATCH_LEVEL.

IrqlExApcLte1

La regla IrqlExApcLte1 especifica que el controlador llama a ExAcquireFastMutex y ExTryToAcquireFastMutex solo en IRQL <= APC_LEVEL.

IrqlExApcLte2

La regla IrqlExApcLte2 especifica que el controlador llama a las siguientes rutinas solo en IRQL <= APC_LEVEL.

IrqlExApcLte3

La regla IrqlExApcLte3 especifica que el controlador solo llama a las siguientes rutinas de soporte ejecutivo cuando el IRQL es igual a APC_LEVEL.

IrqlExApcLteInline

La regla IrqlExApcLteInline especifica que las DDI solo se llaman en niveles IRQL adecuados.

IrqlExFree1

La regla IrqlExFree1 especifica que se llama a ExFreePool y ExFreePoolWithTag en el IRQL adecuado.

IrqlExFree2

La regla IrqlExFree2 especifica que ExFreePool y ExFreePoolWithTag se llaman en el IRQL adecuado.

IrqlExFree3

La regla IrqlExFree3 especifica que se llama a ExFreePool y ExFreePoolWithTag en el IRQL adecuado.

IrqlExPassive

La regla IrqlExPassive especifica que el controlador llama a las siguientes rutinas de soporte ejecutivo solo en IRQL = PASSIVE_LEVEL:

La regla IrqlExPassive también especifica que el controlador llama a ExRaiseStatus en IRQL <= APC_LEVEL

IrqlIoApcLte

La regla IrqlIoApcLte especifica que el controlador llama a las siguientes rutinas del administrador de E/S solo cuando se ejecuta en IRQL <= APC_LEVEL:

IrqlIoDispatch

La regla IrqlIoDispatch especifica que el controlador llama a las siguientes rutinas del Administrador de E/S solo cuando se ejecuta en IRQL <= DISPATCH_LEVEL: IoGetDeviceToVerify, IoSetDeviceToVerify.

IrqlIoPassive1

La regla IrqlIoPassive1 especifica que el controlador llama a las siguientes rutinas solo cuando se ejecuta en IRQL = PASSIVE_LEVEL:

IrqlIoPassive2

La regla IrqlIoPassive2 especifica que el controlador llama a las siguientes rutinas del Administrador de E/S solo en IRQL = PASSIVE_LEVEL:

IrqlIoPassive3

La regla IrqlIoPassive3 especifica que el controlador llama a las siguientes rutinas solo cuando se ejecuta en IRQL = PASSIVE_LEVEL:

IrqlIoPassive4

La regla IrqlIoPassive4 especifica que el controlador llama a las siguientes rutinas solo cuando se ejecuta en IRQL = PASSIVE_LEVEL:

IrqlIoPassive5

La regla IrqlIoPassive5 especifica que el controlador llama a rutinas específicas del Administrador de E/S solo cuando se ejecuta en IRQL = PASSIVE_LEVEL.

IrqlIoRtlZwPassive

La regla IrqlIoRtlZwPassive especifica que el controlador llama a rutinas específicas del Administrador de E/S solo cuando se ejecuta en IRQL = PASSIVE_LEVEL.

IrqlKeApcLte1

La regla IrqlKeApcLte1 especifica que el controlador llama a las siguientes rutinas de kernel solo cuando se ejecuta en IRQL <= APC_LEVEL:

IrqlKeApcLte2

La regla IrqlKeApcLte2 especifica que el controlador llama a las siguientes rutinas de kernel solo cuando se ejecuta en IRQL <= APC_LEVEL:

IrqlKeDispatchLte

La regla IrqlKeDispatchLte especifica que el controlador llama a las siguientes rutinas de kernel solo cuando se ejecuta en IRQL <= DISPATCH_LEVEL:

IrqlKeRaiseLower

La regla IrqlKeRaiseLower especifica que el controlador hace lo siguiente al generar y reducir IRQL:

Cuando el controlador llama a KeRaiseIrql, se ejecuta en un IRQL que es menor o igual que el valor del parámetro NewIrql .
El controlador llama a KeLowerIrql solo después de llamar a KeRaiseIrql o KeRaiseIrqlToDpcLevel.

IrqlKeRaiseLower2

La regla IrqlKeRaiseLower2 especifica que los controladores usan KeLowerIrql para restaurar el IRQL original generado por una llamada anterior a KeRaiseIrql o KeRaiseIrqlToDpcLevel.

IrqlKeReleaseSpinLock

La regla IrqlKeReleaseSpinLock especifica que el controlador llama a KeReleaseSpinLock solo cuando se ejecuta en IRQL = DISPATCH_LEVEL.

IrqlKeSetEvent

La regla IrqlKeSetEvent especifica que solo se llama a la rutina KeSetEvent en IRQL <= DISPATCH_LEVEL cuando Wait está establecido en FALSE y en IRQL <= APC_LEVEL cuando Wait está establecido en TRUE.

IrqlKeWaitForMutexObject

La regla IrqlKeWaitForMutexObject especifica el controlador para llamar a la rutina KeWaitForMutexObject en el IRQL adecuado basado en el valor del parámetro Timeout :

IrqlKeWaitForMultipleObjects

La regla IrqlKeWaitForMultipleObjects especifica que los llamadores de la rutina KeWaitForMultipleObjects deben ejecutarse a un nivel IRQL adecuado según el parámetro Timeout.

IrqlMmApcLte

La regla IrqlMmApcLte especifica que el controlador llama a las siguientes rutinas del administrador de memoria solo cuando se ejecuta en IRQL <= APC_LEVEL:

IrqlMmDispatch

La regla IrqlMmDispatch especifica que el controlador llama a MmFreeContiguousMemory solo cuando se ejecuta en IRQL <= DISPATCH_LEVEL.

IrqlNtifsApcPassive

La regla IIrqlNtifsApcPassive especifica que el controlador llama a los DDIs enumerados en la regla solo cuando se ejecuta en IRQL = PASSIVE_LEVEL o en IRQL <= APC_LEVEL.

IrqlObPassive

La regla IrqlObPassive especifica que el controlador llama a ObReferenceObjectByHandle solo cuando se ejecuta en IRQL = PASSIVE_LEVEL.

IrqlPsPassive

La regla IrqlPsPassive especifica que el controlador llama a las rutinas de estructura de procesos específicas solo cuando se ejecuta en IRQL = PASSIVE_LEVEL.

IrqlReturn

La regla IrqlReturn especifica que las rutinas de distribución del controlador vuelven al mismo IRQL al que se llamaron.

IrqlRtlPassive

La regla IrqlRtlPassive especifica que el controlador llama a RtlDeleteRegistryValue solo cuando se ejecuta en IRQL = PASSIVE_LEVEL.

IrqlZwPassive

La regla IrqlZwPassive especifica que el controlador llama a ZwClose solo cuando se ejecuta en IRQL = PASSIVE_LEVEL.

Para seleccionar el conjunto de reglas irql

  1. Seleccione el proyecto de controlador (.vcxProj) en Microsoft Visual Studio. En el menú Controlador , haga clic en Iniciar comprobador de controladores estáticos....

  2. Haga clic en la pestaña Reglas . En Conjuntos de reglas, seleccione Irql.

    Para seleccionar las reglas predeterminadas en una ventana de comando de desarrollador de Visual Studio, especifique Irql.sdv con la opción /check. Por ejemplo:

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

    Para obtener más información, consulte Uso del comprobador de controladores estáticos para buscar defectos en controladores y comandos de comprobador de controladores estáticos (MSBuild).