Partager via


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 1.11 et ultérieures de l’infrastructure exécutées sur Windows 8 ou versions ultérieures du système d’exploitation, les pilotes du Framework de Pilote en Mode Noyau (KMDF) et du Framework de Pilote en Mode Utilisateur (UMDF) peuvent créer des objets d’interruption nécessitant une gestion au niveau passif. Sauf si vous écrivez un pilote pour une plateforme System on a Chip (SoC), toutefois, votre pilote doit utiliser des objets d’interruption DIRQL.

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

Le framework appelle la fonction de rappel EvtDriverDeviceAdd du pilote avant que le gestionnaire Plug and Play (PnP) affecte des ressources système, telles que des vecteurs d’interruption, au dispositif. Une fois que le gestionnaire PnP affecte 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éclenchement par niveau (partagé ou exclusif)
  • Déclenché par front (seulement exclusif)
  • MSI (exclusif par définition)

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

À compter de UMDF version 2.15, UMDF prend en charge les interruptions pour les appareils simples tels que les boutons push 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 exclusives déclenchées par la périphérie.

À partir de la version 1.15 de KMDF, KMDF prend également en charge les interruptions pour de tels dispositifs, sans la solution de contournement décrite dans la section Gestion des interruptions Active-Both.

En outre, dans WDF_INTERRUPT_CONFIG, 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 la version 1.11 ou ultérieure du cadre sur Windows 8 ou les versions ultérieures du système d'exploitation, le pilote peut définir explicitement le parent d’un objet d'interruption du cadre (DIRQL ou passif) sur un objet de périphérique du cadre ou un objet de file d'attente du cadre. Si le pilote spécifie un parent, le pilote doit définir le membre AutomaticSerialization du 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 avec des fonctions de rappel provenant 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, le cadre supprime l’objet file d’attente lorsqu’il supprime l’objet de périphérique.

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 des messages

Windows Vista et versions ultérieures prennent en charge les interruptions signalées par les messages (MSIs). Pour permettre au système d’exploitation de prendre en charge les MSIs 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 des interruptions signalées par messages dans le Registre.

Votre pilote doit créer un objet d’interruption de framework pour chaque vecteur d’interruption ou message MSI pris en charge par l’appareil. Si le gestionnaire PnP n’accorde pas à l’appareil toutes les ressources d’interruption que l’appareil prend en charge, le pilote n’utilise pas les objets d’interruption supplémentaires et n’appelle pas ses fonctions de rappel.

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, l’appareil risque de ne pas démarrer. Pour fonctionner sur un ordinateur qui contient de nombreux processeurs logiques, le pilote ne doit pas demander plusieurs interruptions par processeur.

Un pilote doit tolérer, sans défaillance, le rééquilibrage système des ressources d’interruption dans lesquelles le gestionnaire PnP affecte à l’appareil n'importe quel ensemble de ressources d'interruption alternatives dans la liste des besoins en ressources. Par exemple, l'appareil pourrait se voir attribuer un nombre inférieur d'interruptions de message que celui que le pilote a demandé. Dans le pire des cas, le pilote doit être prêt à utiliser l’appareil avec une seule interruption basée sur la ligne.