Création d’un objet d’interruption

Un pilote WDF (Windows Driver Frameworks) qui gère les interruptions matérielles d’un appareil doit créer un objet d’interruption d’infrastructure pour chaque interruption que chaque appareil peut prendre en charge. Dans les versions de framework 1.11 et ultérieures exécutées sur Windows 8 ou versions ultérieures du système d’exploitation, les pilotes kmDF (Kernel-Mode Driver Framework) et UMDF (User-Mode Driver Framework) peuvent créer des objets d’interruption nécessitant une gestion passive. Toutefois, à moins que vous n’écriviez un pilote pour une plateforme Système sur puce (SoC), votre pilote doit utiliser des objets d’interruption DIRQL.

Un pilote crée généralement des objets d’interruption de framework dans sa fonction de rappel EvtDriverDeviceAdd . Un pilote peut également créer des objets d’interruption à partir de sa fonction de rappel EvtDevicePrepareHardware .

L’infrastructure appelle la fonction de rappel EvtDriverDeviceAdd du pilote avant que le gestionnaire Plug-and-Play (PnP) ait affecté des ressources système, telles que des vecteurs d’interruption, à l’appareil. Une fois que le gestionnaire PnP a affecté des ressources, l’infrastructure stocke les ressources d’interruption dans l’objet d’interruption de l’appareil. (Les pilotes qui ne prennent pas en charge Plug-and-Play ne peuvent pas utiliser d’objets d’interruption.)

Pour créer un objet d’interruption de framework, votre pilote doit initialiser une structure WDF_INTERRUPT_CONFIG et la transmettre à la méthode WdfInterruptCreate .

UMDF prend en charge les types d’interruptions suivants :

  • Déclenché par niveau (partagé ou exclusif)
  • Déclenchée en périphérie (exclusif uniquement)
  • MSI (exclusif par définition)

Note UMDF ne prend pas en charge les interruptions déclenchées en périphérie partagées .

À compter d’UMDF version 2.15, UMDF prend en charge les interruptions pour les appareils simples, tels que les boutons-pousseurs matériels, généralement soutenus par des broches GPIO, que vous ne pouvez pas activer ou désactiver explicitement à l’aide de registres matériels. Pour prendre en charge ces appareils, un pilote UMDF doit utiliser des interruptions déclenchées par le bord exclusives.

À compter de KMDF version 1.15, KMDF prend également en charge les interruptions pour ces appareils, sans la solution de contournement décrite dans Gestion des interruptions Active-Both.

Dans WDF_INTERRUPT_CONFIG également, votre pilote fournit des pointeurs vers les fonctions de rappel d’événements fournies par le pilote suivantes :

EvtInterruptEnable
Active une interruption matérielle.

EvtInterruptDisable
Désactive une interruption matérielle.

EvtInterruptIsr
Routine de service d’interruption (ISR) pour l’interruption.

EvtInterruptDpc
Appel de procédure différée (DPC) pour l’interruption.

EvtInterruptWorkItem
Élément de travail pour une interruption de niveau passif.

Pour les pilotes utilisant le framework version 1.11 ou ultérieure sur Windows 8 ou versions ultérieures du système d’exploitation, le pilote peut définir explicitement le parent d’un objet d’interruption de framework (DIRQL ou passif) sur un objet de périphérique d’infrastructure ou un objet de file d’attente d’infrastructure. Si le pilote spécifie un parent, le pilote doit définir le membre AutomaticSerialization de la structure WDF_INTERRUPT_CONFIG de l’objet d’interruption sur TRUE. (Rappelez-vous que si AutomaticSerialization a la valeur TRUE, l’infrastructure synchronise l’exécution de la fonction de rappel EvtInterruptDpc ou EvtInterruptWorkItem de l’objet d’interruption avec les fonctions de rappel d’autres objets qui se trouvent sous l’objet parent de l’interruption.)

Par exemple, un pilote peut spécifier une file d’attente comme parent d’une interruption pour synchroniser les rappels de la file d’attente avec le rappel EvtInterruptDpc ou EvtInterruptWorkItem de l’interruption. Dans cette configuration, l’infrastructure supprime l’objet file d’attente lorsqu’il supprime l’objet d’appareil.

Après avoir appelé WdfInterruptCreate, le pilote peut éventuellement appeler WdfInterruptSetPolicy ou WdfInterruptSetExtendedPolicy pour spécifier des paramètres d’interruption supplémentaires. En règle générale, le pilote appelle ces méthodes à partir de sa fonction de rappel EvtDriverDeviceAdd .

L’infrastructure supprime automatiquement l’interruption avant de supprimer le parent de l’interruption. Si vous le souhaitez, un pilote peut appeler WdfObjectDelete pour supprimer l’interruption à un moment antérieur.

Prise en charge des interruptions signalées par message

Les interruptions signalées par message (MSI) sont prises en charge à partir de Windows Vista. Pour permettre au système d’exploitation de prendre en charge les IMS pour votre appareil, le fichier INF de votre pilote doit définir certaines valeurs dans le Registre. Pour plus d’informations sur la définition de ces valeurs, consultez Activation Message-Signaled interruptions dans le Registre.

Votre pilote doit créer un objet d’interruption d’infrastructure pour chaque vecteur d’interruption ou message MSI que l’appareil peut prendre en charge. Si le gestionnaire PnP n’accorde pas à l’appareil toutes les ressources d’interruption que l’appareil peut prendre en charge, les objets d’interruption supplémentaires ne seront pas utilisés et leurs fonctions de rappel ne seront pas appelées.

Dans Windows 7, le système d’exploitation ne prend pas en charge les demandes de ressources pour plus de 910 messages d’interruption par fonction d’appareil. Dans Windows 8, le système d’exploitation ne prend pas en charge les demandes de ressources pour plus de 2 048 interruptions par fonction d’appareil.

Si le pilote de périphérique dépasse cette limite, le démarrage de l’appareil peut échouer. Pour fonctionner sur un ordinateur qui contient de nombreux processeurs logiques, le pilote ne doit pas demander plus d’une interruption par processeur.

Un pilote doit tolérer, sans défaillance, le rééquilibrage du système des ressources d’interruption dans lequel le gestionnaire PnP affecte à l’appareil tout ensemble de ressources d’interruption de remplacement à partir de la liste des exigences de ressources. Par exemple, l’appareil peut se voir attribuer un nombre d’interruptions de message inférieur à celui demandé par le pilote. Dans le pire des cas, le pilote doit être prêt à utiliser l’appareil avec une seule interruption de ligne.