KMESSAGE_SERVICE_ROUTINE fonction de rappel (wdm.h)
Une routine InterruptMessageService service une interruption signalée par un message.
Syntaxe
KMESSAGE_SERVICE_ROUTINE KmessageServiceRoutine;
BOOLEAN KmessageServiceRoutine(
[in] _KINTERRUPT *Interrupt,
[in] PVOID ServiceContext,
ULONG MessageID
)
{...}
Paramètres
[in] Interrupt
Pointeur vers la structure KINTERRUPT pour l’interruption. Le pilote a reçu ce pointeur dans l’appel à la routine IoConnectInterruptEx qui a inscrit la routine InterruptMessageService du pilote.
[in] ServiceContext
Valeur ServiceContext que le pilote a transmise à IoConnectInterruptEx lors de l’inscription de la routine InterruptMessageService .
MessageID
ID de message pour l’interruption. Cette valeur est l’index de l’entrée de l’interruption dans le tableau de membres MessageInfo dans la structure IO_INTERRUPT_MESSAGE_INFO qui décrit les interruptions signalées par le message du pilote.
Valeur retournée
La routine InterruptMessageService retourne TRUE si l’interruption est gérée par la routine InterruptMessageService . Sinon, elle retourne FALSE.
Remarques
Les pilotes utilisent IoConnectInterruptEx pour inscrire une routine InterruptMessageService afin de gérer leurs interruptions signalées par les messages. Un pilote peut par la suite annuler l’inscription de la routine en appelant IoDisconnectInterruptEx. Les interruptions signalées par un message sont prises en charge à partir de Windows Vista.
Le système peut appeler une routine InterruptMessageService même si l’interruption de la routine n’a pas eu lieu. Par exemple, si une interruption signalée par un message est partagée, InterruptMessageService peut être appelé pour les interruptions appartenant à d’autres appareils. La routine doit case activée si la valeur du paramètre ServiceContext correspond à la valeur passée à IoConnectInterruptEx. Si la valeur correspond, InterruptMessageService gère l’interruption et retourne TRUE. Sinon, InterruptMessageService ne gère pas l’interruption et retourne FALSE.
Un pilote qui utilise MSI (PCI 2.2) doit examiner le paramètre MessageID pour faire la distinction entre les différents messages générés par l’appareil, car ils partagent tous la même ressource d’interruption (et donc le même rappel InterruptMessageService> ).
Notez que si le système reçoit plusieurs interruptions identiques sur un court intervalle de temps, il peut les combiner en un seul appel à InterruptMessageService. La routine doit être écrite pour gérer plusieurs interruptions identiques dans un seul appel.
Les interruptions signalées par un message sont similaires au comportement des interruptions déclenchées par la périphérie. L’appareil envoie une demande d’interruption, mais ne reçoit aucun accusé de réception matériel indiquant que la demande a été reçue.
Un service InterruptMessageService s’exécute à un IRQL supérieur ou égal à l’IRQL maximal de l’appareil (DIRQL) pour chaque interruption gérée par la routine.
Exemples
Pour définir une routine de rappel InterruptMessageService , vous devez d’abord fournir une déclaration de fonction qui identifie le type de routine de rappel que vous définissez. Windows fournit un ensemble de types de fonctions de rappel pour les pilotes. La déclaration d’une fonction à l’aide des types de fonction de rappel permet à l’analyse du code pour les pilotes, au vérificateur de pilotes statiques (SDV) et à d’autres outils de vérification de trouver des erreurs. Il s’agit d’une exigence pour l’écriture de pilotes pour le système d’exploitation Windows.
Par exemple, pour définir une routine de rappel InterruptMessageService nommée MyInterruptMessageService
, utilisez le type KMESSAGE_SERVICE_ROUTINE comme indiqué dans cet exemple de code :
KMESSAGE_SERVICE_ROUTINE MyInterruptMessageService;
Implémentez ensuite votre routine de rappel comme suit :
_Use_decl_annotations_
BOOLEAN
MyInterruptMessageService(
struct _KINTERRUPT *Interrupt,
PVOID ServiceContext,
ULONG MessageId
)
{
// Function body
}
Le type de fonction KMESSAGE_SERVICE_ROUTINE est défini dans le fichier d’en-tête Wdm.h. Pour identifier plus précisément les erreurs lors de l’exécution des outils d’analyse du code, veillez à ajouter l’annotation Use_decl_annotations
à votre définition de fonction. L’annotation Use_decl_annotations
garantit que les annotations appliquées au type de fonction KMESSAGE_SERVICE_ROUTINE dans le fichier d’en-tête sont utilisées. Pour plus d’informations sur la configuration requise pour les déclarations de fonction, consultez Déclaration de fonctions à l’aide de types de rôles de fonction pour les pilotes WDM. Pour plus d’informations sur Use_decl_annotations
, consultez Annotating Function Behavior.
Configuration requise
Condition requise | Valeur |
---|---|
Client minimal pris en charge | Consultez la section Notes. |
Plateforme cible | Desktop (Expérience utilisateur) |
En-tête | wdm.h (include Wdm.h, Ntddk.h, Ntifs.h) |
IRQL | Consultez la section Notes. |