Partager via


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.

Voir aussi

Utilisation des descripteurs de ressources d’interruption

IO_INTERRUPT_MESSAGE_INFO

IoConnectInterruptEx

IoDisconnectInterruptEx