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 |
---|---|
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: |
|
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: |
|
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: |
|
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: |
|
La regla IrqlApcLte especifica que el controlador llama a ObGetObjectSecurity y ObReleaseObjectSecurity solo cuando se ejecuta en IRQL <= APC_LEVEL. |
|
La regla IrqlDispatch especifica que el controlador llama a los siguientes DDIs solo cuando se ejecuta en IRQL = DISPATCH_LEVEL. |
|
La regla IrqlExAllocatePool especifica que el controlador llama a ExAllocatePoolWithTag y ExAllocatePoolWithTagPriority solo cuando se ejecuta en IRQL<=DISPATCH_LEVEL. |
|
La regla IrqlExApcLte1 especifica que el controlador llama a ExAcquireFastMutex y ExTryToAcquireFastMutex solo en IRQL <= APC_LEVEL. |
|
La regla IrqlExApcLte2 especifica que el controlador llama a las siguientes rutinas solo en IRQL <= APC_LEVEL. |
|
La regla IrqlExApcLte3 especifica que el controlador llama a las siguientes rutinas de soporte técnico ejecutivo solo en IRQL <= APC_LEVEL. |
|
La regla IrqlExApcLteInline especifica que solo se llama a los identificadores de dominio en los niveles irQL adecuados. |
|
La regla IrqlExFree1 especifica que se llama a ExFreePool y ExFreePoolWithTag en el IRQL adecuado. |
|
La regla IrqlExFree2 especifica que se llama a ExFreePool y ExFreePoolWithTag en irQL adecuado. |
|
La regla IrqlExFree3 especifica que se llama a ExFreePool y ExFreePoolWithTag en irQL adecuado. |
|
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 |
|
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: |
|
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. |
|
La regla IrqlIoPassive1 especifica que el controlador llama a las siguientes rutinas solo cuando se ejecuta en IRQL = PASSIVE_LEVEL: |
|
La regla IrqlIoPassive2 especifica que el controlador llama a las siguientes rutinas del Administrador de E/S solo en IRQL = PASSIVE_LEVEL: |
|
La regla IrqlIoPassive3 especifica que el controlador llama a las siguientes rutinas solo cuando se ejecuta en IRQL = PASSIVE_LEVEL: |
|
La regla IrqlIoPassive4 especifica que el controlador llama a las siguientes rutinas solo cuando se ejecuta en IRQL = PASSIVE_LEVEL: |
|
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. |
|
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. |
|
La regla IrqlKeApcLte1 especifica que el controlador llama a las siguientes rutinas de kernel solo cuando se ejecuta en IRQL <= APC_LEVEL: |
|
La regla IrqlKeApcLte2 especifica que el controlador llama a las siguientes rutinas de kernel solo cuando se ejecuta en IRQL <= APC_LEVEL: |
|
La regla IrqlKeDispatchLte especifica que el controlador llama a las siguientes rutinas de kernel solo cuando se ejecuta en IRQL <= DISPATCH_LEVEL: |
|
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. |
|
La regla IrqlKeRaiseLower2 especifica que los controladores usan KeLowerIrql para restaurar el IRQL original generado por una llamada anterior a KeRaiseIrql o KeRaiseIrqlToDpcLevel. |
|
La regla IrqlKeReleaseSpinLock especifica que el controlador llama a KeReleaseSpinLock solo cuando se ejecuta en IRQL = DISPATCH_LEVEL. |
|
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. |
|
La regla IrqlKeWaitForMutexObject especifica el controlador para llamar a la rutina KeWaitForMutexObject en el IRQL adecuado según el valor del parámetro Timeout : |
|
La regla IrqlKeWaitForMultipleObjects especifica que los autores de llamadas de la rutina KeWaitForMultipleObjects deben ejecutarse en irQL adecuado según el parámetro Timeout . |
|
La regla IrqlMmApcLte especifica que el controlador llama a las siguientes rutinas del administrador de memoria solo cuando se ejecuta en IRQL <= APC_LEVEL: |
|
La regla IrqlMmDispatch especifica que el controlador llama a MmFreeContiguousMemory solo cuando se ejecuta en IRQL <= DISPATCH_LEVEL. |
|
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. |
|
La regla IrqlObPassive especifica que el controlador llama a ObReferenceObjectByHandle solo cuando se ejecuta en IRQL = PASSIVE_LEVEL. |
|
La regla IrqlPsPassive especifica que el controlador llama a las siguientes rutinas de estructura de procesos solo cuando se ejecuta en IRQL = PASSIVE_LEVEL: |
|
La regla IrqlReturn especifica que las rutinas de envío del controlador devuelven en el mismo IRQL en el que se llamó. |
|
La regla IrqlRtlPassive especifica que el controlador llama a RtlDeleteRegistryValue solo cuando se ejecuta en IRQL = PASSIVE_LEVEL. |
|
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
Seleccione el proyecto de controlador (.vcxProj) en Microsoft Visual Studio. En el menú Controlador , haga clic en Iniciar comprobador de controladores estáticos....
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).