Mantenimiento de una interrupción
En este tema se describe cómo atender una interrupción DIRQL. Para obtener información sobre el mantenimiento de una interrupción de nivel pasivo, consulte Compatibilidad con interrupciones de nivel pasivo.
El mantenimiento de una interrupción consta de dos pasos y, a veces, tres:
Guardar rápidamente información volátil (como registrar contenido), en una rutina de servicio de interrupción que se ejecuta en IRQL = DIRQL.
Procesamiento de la información volátil guardada en una llamada de procedimiento diferido (DPC) que se ejecuta en IRQL = DISPATCH_LEVEL.
Realizar trabajo adicional en IRQL = PASSIVE_LEVEL, si es necesario.
Cuando un dispositivo genera una interrupción de hardware, el marco llama a la rutina de servicio de interrupción del controlador (ISR), que los controladores basados en el marco implementan como una función de devolución de llamada EvtInterruptIsr .
La función de devolución de llamada EvtInterruptIsr , que se ejecuta en el DIRQL del dispositivo, debe guardar rápidamente información de interrupción, como el contenido del registro, que se perderá si se produce otra interrupción.
Normalmente, la función de devolución de llamada EvtInterruptIsr programa una llamada de procedimiento diferida (DPC) para procesar la información guardada más adelante en un IRQL inferior (DISPATCH_LEVEL). Los controladores basados en marcos implementan rutinas DPC como funciones de devolución de llamada EvtInterruptDpc o EvtDpcFunc .
La mayoría de los controladores usan una única función de devolución de llamada EvtInterruptDpc para cada tipo de interrupción. Para programar la ejecución de una función de devolución de llamada EvtInterruptDpc , un controlador debe llamar a WdfInterruptQueueDpcForIsr desde la función de devolución de llamada EvtInterruptIsr .
Si el controlador crea varios objetos de cola de marco para cada dispositivo, puede considerar la posibilidad de usar un objeto DPC independiente y una función de devolución de llamada EvtDpcFunc para cada cola. Para programar la ejecución de una función de devolución de llamada EvtDpcFunc , el controlador primero debe crear uno o varios objetos DPC llamando a WdfDpcCreate, normalmente en la función de devolución de llamada EvtDriverDeviceAdd del controlador. A continuación, la función de devolución de llamada EvtInterruptIsr del controlador puede llamar a WdfDpcEnqueue.
Normalmente, los controladores completan las solicitudes de E/S en sus funciones de devolución de llamada EvtInterruptDpc o EvtDpcFunc .
A veces, un controlador debe realizar algunas operaciones de mantenimiento de interrupciones en IRQL = PASSIVE_LEVEL. En tales casos, la función de devolución de llamada EvtInterruptDpc o EvtDpcFunc del controlador, que se ejecuta en IRQL = DISPATCH_LEVEL, puede programar la ejecución de uno o varios elementos de trabajo del marco, que se ejecutan en IRQL = PASSIVE_LEVEL.
Para obtener un ejemplo de un controlador que usa elementos de trabajo durante las interrupciones del dispositivo, consulte el controlador de ejemplo PCIDRV .