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 el funcionamiento que pueden provocar condiciones de interbloqueo o bloqueos del 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 se reenvíe el código de función principal irP es 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 se reenvíe el código de función principal irP es 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 irP que se reenvía sea uno de los siguientes:

ForwardedAtBadIrqlFsdSync

La regla ForwardedAtBadIrqlFsdSync especifica que el controlador llama a IoCallDriver y PoCallDriver en irQL<DISPATCH_LEVEL, a menos que el código de función principal irP que se reenvía 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 los siguientes DDIs 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 llama a las siguientes rutinas de soporte técnico ejecutivo solo en IRQL <= APC_LEVEL.

IrqlExApcLteInline

La regla IrqlExApcLteInline especifica que solo se llama a los identificadores de dominio en los 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 se llama a ExFreePool y ExFreePoolWithTag en irQL adecuado.

IrqlExFree3

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

IrqlExPassive

La regla IrqlExPassive especifica que el controlador llama a las siguientes rutinas de soporte técnico 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 se establece 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 según el valor del parámetro Timeout :

IrqlKeWaitForMultipleObjects

La regla IrqlKeWaitForMultipleObjects especifica que los autores de llamadas de la rutina KeWaitForMultipleObjects deben ejecutarse en 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 siguientes rutinas de estructura de procesos solo cuando se ejecuta en IRQL = PASSIVE_LEVEL:

IrqlReturn

La regla IrqlReturn especifica que las rutinas de envío del controlador devuelven en el mismo IRQL en el que se llamó.

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 el conjunto de reglas predeterminado en una ventana del símbolo del sistema para desarrolladores 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 comprobadores de controladores estáticos (MSBuild).