Crear un objeto de interrupción
Un controlador de Windows Driver Frameworks (WDF) que controla las interrupciones de hardware de un dispositivo debe crear un objeto de interrupción de marco para cada interrupción que cada dispositivo pueda admitir. En las versiones 1.11 del marco y versiones posteriores que se ejecutan en Windows 8 o versiones posteriores del sistema operativo, los controladores de Kernel-Mode Driver Framework (KMDF) y User-Mode Driver Framework (UMDF) pueden crear objetos de interrupción que requieran control de nivel pasivo. A menos que escriba un controlador para un sistema en una plataforma de chip (SoC), sin embargo, el controlador debe usar objetos de interrupción DIRQL.
Normalmente, un controlador crea objetos de interrupción del marco en su función de devolución de llamada EvtDriverDeviceAdd . Un controlador también puede crear objetos de interrupción a partir de su función de devolución de llamada EvtDevicePrepareHardware .
El marco llama a la función de devolución de llamada EvtDriverDeviceAdd del controlador antes de que el administrador de Plug and Play (PnP) haya asignado recursos del sistema, como vectores de interrupción, al dispositivo. Después de que el administrador de PnP asigne recursos, el marco almacena los recursos de interrupción en el objeto de interrupción del dispositivo. (Los controladores que no admiten Plug and Play no pueden usar objetos de interrupción).
Para crear un objeto de interrupción del marco, el controlador debe inicializar una estructura de WDF_INTERRUPT_CONFIG y pasarla al método WdfInterruptCreate .
UMDF admite los siguientes tipos de interrupciones:
- Desencadenado por el nivel (compartido o exclusivo)
- Desencadenado por Edge (solo exclusivo)
- MSI (exclusivo por definición)
Nota UMDF no admite interrupciones desencadenadas por el borde compartido .
A partir de la versión 2.15 de UMDF, UMDF admite interrupciones para dispositivos simples como botones de inserción de hardware, normalmente respaldados por patillas GPIO, que no se pueden habilitar o deshabilitar explícitamente mediante registros de hardware. Para admitir estos dispositivos, un controlador UMDF debe usar interrupciones exclusivas desencadenadas por el perímetro.
A partir de la versión 1.15 de KMDF, KMDF también admite interrupciones para dichos dispositivos, sin la solución alternativa descrita en Control de Active-Both interrupciones.
Además, en WDF_INTERRUPT_CONFIG, el controlador proporciona punteros a las siguientes funciones de devolución de llamada de eventos proporcionadas por el controlador:
EvtInterruptEnable
Habilita una interrupción de hardware.
EvtInterruptDisable
Deshabilita una interrupción de hardware.
EvtInterruptIsr
Rutina de servicio de interrupción (ISR) para la interrupción.
EvtInterruptDpc
Llamada a procedimiento diferido (DPC) para la interrupción.
EvtInterruptWorkItem
Elemento de trabajo para una interrupción de nivel pasivo.
Para los controladores que usan la versión 1.11 del marco o posterior en Windows 8 o versiones posteriores del sistema operativo, el controlador puede establecer explícitamente el elemento primario de un objeto de interrupción de marco (DIRQL o pasivo) en un objeto de dispositivo de marco o en un objeto de cola de marco. Si el controlador especifica un elemento primario, el controlador debe establecer el miembro AutomaticSerialization de la estructura WDF_INTERRUPT_CONFIG del objeto de interrupción en TRUE. (Recuerde que si AutomaticSerialization es TRUE, el marco sincroniza la ejecución de la función de devolución de llamada EvtInterruptDpc o EvtInterruptWorkItem del objeto de interrupción con funciones de devolución de llamada de otros objetos que están debajo del objeto primario de la interrupción).
Por ejemplo, un controlador podría especificar una cola como elemento primario de una interrupción para sincronizar las devoluciones de llamada de la cola con la devolución de llamada EvtInterruptDpc o EvtInterruptWorkItem de la interrupción. En esta configuración, el marco elimina el objeto queue cuando elimina el objeto de dispositivo.
Después de llamar a WdfInterruptCreate, el controlador puede llamar opcionalmente a WdfInterruptSetPolicy o WdfInterruptSetExtendedPolicy para especificar parámetros de interrupción adicionales. Normalmente, el controlador llama a estos métodos desde su función de devolución de llamada EvtDriverDeviceAdd .
El marco elimina automáticamente la interrupción antes de eliminar el elemento primario de la interrupción. Opcionalmente, un controlador puede llamar a WdfObjectDelete para eliminar la interrupción en un momento anterior.
Compatibilidad con interrupciones señaladas por mensajes
Las interrupciones señaladas por mensajes (MSA) se admiten a partir de Windows Vista. Para permitir que el sistema operativo admita MSIs para el dispositivo, el archivo INF del controlador debe establecer algunos valores en el registro. Para obtener información sobre cómo establecer estos valores, consulte Habilitación de Message-Signaled interrupciones en el Registro.
El controlador debe crear un objeto de interrupción del marco para cada vector de interrupción o mensaje MSI que el dispositivo pueda admitir. Si el administrador de PnP no concede al dispositivo todos los recursos de interrupción que el dispositivo puede admitir, no se usarán los objetos de interrupción adicionales y no se llamará a sus funciones de devolución de llamada.
En Windows 7, el sistema operativo no admite solicitudes de recursos para más de 910 mensajes de interrupción por función del dispositivo. En Windows 8, el sistema operativo no admite solicitudes de recursos para más de 2048 interrupciones por función del dispositivo.
Si el controlador de dispositivo supera este límite, es posible que el dispositivo no se inicie. Para funcionar en un equipo que contenga muchos procesadores lógicos, el controlador no debe solicitar más de una interrupción por procesador.
Un controlador debe tolerar, sin errores, el reequilibrio del sistema de los recursos de interrupción en los que el administrador de PnP asigna al dispositivo cualquier conjunto de recursos de interrupción alternativos de la lista de requisitos de recursos. Por ejemplo, el dispositivo podría tener asignado un número menor de interrupciones de mensaje que el controlador solicitado. En el peor de los casos, el controlador debe estar preparado para operar el dispositivo con una sola interrupción basada en línea.