KMESSAGE_SERVICE_ROUTINE función de devolución de llamada (wdm.h)
Un InterruptMessageService servicios rutinarios una interrupción con 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 de InterruptMessageService del controlador.
[in] ServiceContext
Valor de ServiceContext que el controlador pasó a IoConnectInterruptEx cuando se registró la rutina de InterruptMessageService.
MessageID
Identificador del mensaje de la interrupción. Este valor es el índice de la entrada de la interrupción en la matriz miembro de MessageInfo de la estructura IO_INTERRUPT_MESSAGE_INFO que describe las interrupciones señaladas por mensaje del controlador.
Valor devuelto
La rutina de InterruptMessageService devuelve TRUE si la interrupción la controla la rutina de InterruptMessageService. De lo contrario, devuelve FALSE.
Observaciones
Los controladores usan IoConnectInterruptEx para registrar una rutina de InterruptMessageService para controlar sus interrupciones señaladas por mensajes. Un controlador puede anular posteriormente 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 de InterruptMessageService incluso cuando no se ha producido la interrupción de la rutina. Por ejemplo, si se comparte una interrupción de 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, el mismo InterruptMessageService> devolución de llamada).
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 el comportamiento de las interrupciones desencadenadas por el borde. El dispositivo envía una solicitud de interrupción, pero no recibe ninguna confirmación de hardware de que se recibió la solicitud.
Un InterruptMessageService se ejecuta en un IRQL mayor o igual que el valor máximo de IRQL (DIRQL) del dispositivo para cada interrupción de los identificadores de rutina.
Ejemplos
Para definir una rutina de devolución de llamada 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 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 InterruptMessageService denominada MyInterruptMessageService
, use el tipo KMESSAGE_SERVICE_ROUTINE tal 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 mayor precisión los errores al ejecutar las herramientas de análisis de código, asegúrese de agregar la anotación Use_decl_annotations
a la definición de función. La anotación Use_decl_annotations
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 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 | Valor |
---|---|
cliente mínimo admitido | Consulte la sección Comentarios. |
de la plataforma de destino de | Escritorio |
encabezado de | wdm.h (include Wdm.h, Ntddk.h, Ntifs.h) |
irQL | Consulte la sección Comentarios. |