KSERVICE_ROUTINE función de devolución de llamada (wdm.h)
La rutina InterruptService (ISR) atiende rápidamente una interrupción del dispositivo y programa el procesamiento posterior a la interrupción de los datos recibidos, si es necesario.
Sintaxis
KSERVICE_ROUTINE KserviceRoutine;
BOOLEAN KserviceRoutine(
[in] _KINTERRUPT *Interrupt,
[in] PVOID ServiceContext
)
{...}
Parámetros
[in] Interrupt
Puntero proporcionado por el autor de la llamada a la estructura KINTERRUPT para la interrupción.
[in] ServiceContext
Puntero proporcionado por el autor de la llamada a información de contexto, especificada en una llamada anterior a IoConnectInterrupt o IoConnectInterruptEx.
Valor devuelto
Si la rutina determina que la interrupción no procede de uno de los dispositivos del controlador, debe devolver FALSE. De lo contrario, la rutina debe atender la interrupción y devolver TRUE.
Comentarios
Para registrar un ISR para una afinidad de procesador y vector de interrupción específica, un controlador debe llamar a IoConnectInterrupt o IoConnectInterruptEx.
La rutina InterruptService (ISR) de un controlador se ejecuta en un contexto de interrupción, en algún DIRQL asignado por el sistema, según lo especificado por el parámetro SynchronizeIrql en IoConnectInterrupt. (Otros dispositivos, con valores DIRQL superiores, pueden interrumpir el ISR).
Antes de que el sistema llame a un ISR, adquiere el bloqueo de giro de la interrupción (el parámetro SpinLock a IoConnectInterrupt), por lo que el ISR no se puede ejecutar simultáneamente en otro procesador. Una vez devuelto el ISR, el sistema libera el bloqueo de número.
Un ISR debe determinar primero si la interrupción procede de uno de los dispositivos del controlador mediante el examen de la información de contexto proporcionada por Context. Si la interrupción no procede de uno de los dispositivos del controlador, la rutina debe devolver inmediatamente FALSE para que el administrador de E/S pueda llamar a otros controladores que tengan ISR registrados para el mismo procesador y vector de interrupción.
Para obtener más información sobre la implementación de ISR, vea Interrumpir rutinas de servicio.
Ejemplos
Para definir una rutina de devolución de llamada de InterruptService , primero debe proporcionar una declaración de función que identifique el tipo de rutina de devolución de llamada que está definiendo. Windows proporciona un conjunto de tipos de función de devolución de llamada para controladores. Declarar una función mediante los tipos de función de devolución de llamada ayuda a Análisis de código para controladores, Comprobador de controladores estáticos (SDV) y otras herramientas de comprobación encuentran errores y es un requisito para escribir controladores para el sistema operativo Windows.
Por ejemplo, para definir una rutina de devolución de llamada interruptService denominada MyInterruptService
, use el tipo de KSERVICE_ROUTINE, como se muestra en este ejemplo de código:
KSERVICE_ROUTINE MyInterruptService;
A continuación, implemente la rutina de devolución de llamada de la siguiente manera:
_Use_decl_annotations_
BOOLEAN
MyInterruptService(
struct _KINTERRUPT *Interrupt,
PVOID ServiceContext
)
{
// Function body
}
El tipo de función KSERVICE_ROUTINE se define en el archivo de encabezado Wdm.h. Para identificar con más precisión los errores al ejecutar las herramientas de análisis de código, asegúrese de agregar la anotación a la _Use_decl_annotations_
definición de la función. La _Use_decl_annotations_
anotación garantiza que se usen las anotaciones que se aplican al tipo de función KSERVICE_ROUTINE en el archivo de encabezado. Para obtener más información sobre los requisitos de las declaraciones de función, vea Declarar funciones mediante tipos de rol de función para controladores WDM. Para obtener información sobre _Use_decl_annotations_
, vea Anotación del comportamiento de la función.
Requisitos
Requisito | Value |
---|---|
Plataforma de destino | Escritorio |
Encabezado | wdm.h (incluya Wdm.h, Ntddk.h, Ntifs.h) |
IRQL | Se llama en DIRQL (consulte la sección Comentarios). |