KMESSAGE_SERVICE_ROUTINE función de devolución de llamada (wdm.h)

Una rutina InterruptMessageService proporciona una interrupción señal de mensaje.

Sintaxis

KMESSAGE_SERVICE_ROUTINE KmessageServiceRoutine;

BOOLEAN KmessageServiceRoutine(
  [in] _KINTERRUPT *Interrupt,
  [in] PVOID ServiceContext,
       ULONG MessageID
)
{...}

Parámetros

[in] Interrupt

Puntero a la estructura KINTERRUPT para la interrupción. El controlador recibió este puntero en la llamada a la rutina IoConnectInterruptEx que registró la rutina InterruptMessageService del controlador.

[in] ServiceContext

Valor de ServiceContext que el controlador pasó a IoConnectInterruptEx cuando se registró la rutina InterruptMessageService .

MessageID

Identificador del mensaje para la interrupción. Este valor es el índice de la entrada de la interrupción en la matriz de miembros MessageInfo de la estructura IO_INTERRUPT_MESSAGE_INFO que describe las interrupciones señaladas por mensajes del controlador.

Valor devuelto

La rutina InterruptMessageService devuelve TRUE si la interrupción es una controlada por la rutina InterruptMessageService . De lo contrario, devuelve FALSE.

Comentarios

Los controladores usan IoConnectInterruptEx para registrar una rutina InterruptMessageService para controlar sus interrupciones señaladas por mensajes. Posteriormente, un controlador puede anular el registro de la rutina llamando a IoDisconnectInterruptEx. Las interrupciones señaladas por mensajes se admiten a partir de Windows Vista.

El sistema puede llamar a una rutina InterruptMessageService incluso cuando no se ha producido la interrupción de la rutina. Por ejemplo, si se comparte una interrupción señal de mensaje, se puede llamar a InterruptMessageService para las interrupciones que pertenecen a otros dispositivos. La rutina debe comprobar si el valor del parámetro ServiceContext coincide con el valor pasado a IoConnectInterruptEx. Si el valor coincide, InterruptMessageService controla la interrupción y devuelve TRUE. De lo contrario, InterruptMessageService no controla la interrupción y devuelve FALSE.

Un controlador que usa MSI (PCI 2.2) debe examinar el parámetro MessageID para distinguir entre los distintos mensajes generados por el dispositivo, ya que todos comparten el mismo recurso de interrupción (y, por tanto, la misma devolución de llamada de InterruptMessageService> ).

Tenga en cuenta que si el sistema recibe varias interrupciones idénticas durante un breve intervalo de tiempo, puede combinarlas en una sola llamada a InterruptMessageService. La rutina debe escribirse para controlar varias interrupciones idénticas dentro de una sola llamada.

Las interrupciones señaladas por mensajes son similares en comportamiento a las interrupciones desencadenadas por el borde. El dispositivo envía una solicitud de interrupción, pero no recibe ninguna confirmación de hardware que se recibió la solicitud.

Un Objeto InterruptMessageService se ejecuta en un IRQL mayor o igual que el valor máximo de IRQL del dispositivo (DIRQL) para cada interrupción de los identificadores de rutina.

Ejemplos

Para definir una rutina de devolución de llamada de InterruptMessageService , 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 Code Analysis for Drivers, Static Driver Verifier (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 de InterruptMessageService denominada MyInterruptMessageService, use el tipo de KMESSAGE_SERVICE_ROUTINE como se muestra en este ejemplo de código:

KMESSAGE_SERVICE_ROUTINE MyInterruptMessageService;

A continuación, implemente la rutina de devolución de llamada de la siguiente manera:

_Use_decl_annotations_
BOOLEAN
  MyInterruptMessageService(
    struct _KINTERRUPT  *Interrupt,
    PVOID  ServiceContext,
    ULONG  MessageId 
    )
  {
      // Function body
  }

El tipo de función KMESSAGE_SERVICE_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 KMESSAGE_SERVICE_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 roles de función para controladores WDM. Para obtener información sobre Use_decl_annotations, consulte Anotación del comportamiento de la función.

Requisitos

Requisito Value
Cliente mínimo compatible vea la sección Comentarios.
Plataforma de destino Escritorio
Encabezado wdm.h (incluya Wdm.h, Ntddk.h, Ntifs.h)
IRQL vea la sección Comentarios.

Consulte también

Uso de descriptores de recursos de interrupción

IO_INTERRUPT_MESSAGE_INFO

IoConnectInterruptEx

IoDisconnectInterruptEx