Partager via


Maintenance d’une interruption

Cette rubrique explique comment traiter une interruption DIRQL. Pour plus d’informations sur la maintenance d’une interruption de niveau passif, consultez Prise en charge des interruptions de niveau passif.

La maintenance d’une interruption se compose de deux et parfois de trois étapes :

  1. Enregistrement rapide d’informations volatiles (telles que le contenu de l’inscription) dans une routine de service d’interruption qui s’exécute à IRQL = DIRQL.

  2. Traitement des informations volatiles enregistrées dans un appel de procédure différée (DPC) qui s’exécute à IRQL = DISPATCH_LEVEL.

  3. Exécution d’un travail supplémentaire à IRQL = PASSIVE_LEVEL, si nécessaire.

Lorsqu’un appareil génère une interruption matérielle, l’infrastructure appelle la routine de service d’interruption (ISR) du pilote, que les pilotes basés sur l’infrastructure implémentent en tant que fonction de rappel EvtInterruptIsr .

La fonction de rappel EvtInterruptIsr , qui s’exécute au niveau du DIRQL de l’appareil, doit enregistrer rapidement les informations d’interruption, telles que le contenu de l’inscription, qui seront perdues si une autre interruption se produit.

En règle générale, la fonction de rappel EvtInterruptIsr planifie un appel de procédure différée (DPC) pour traiter les informations enregistrées ultérieurement à un IRQL inférieur (DISPATCH_LEVEL). Les pilotes basés sur l’infrastructure implémentent des routines DPC en tant que fonctions de rappel EvtInterruptDpc ou EvtDpcFunc .

La plupart des pilotes utilisent une seule fonction de rappel EvtInterruptDpc pour chaque type d’interruption. Pour planifier l’exécution d’une fonction de rappel EvtInterruptDpc , un pilote doit appeler WdfInterruptQueueDpcForIsr à partir de la fonction de rappel EvtInterruptIsr .

Si votre pilote crée plusieurs objets de file d’attente d’infrastructure pour chaque appareil, vous pouvez envisager d’utiliser un objet DPC distinct et une fonction de rappel EvtDpcFunc pour chaque file d’attente. Pour planifier l’exécution d’une fonction de rappel EvtDpcFunc , le pilote doit d’abord créer un ou plusieurs objets DPC en appelant WdfDpcCreate, généralement dans la fonction de rappel EvtDriverDeviceAdd du pilote. Ensuite, la fonction de rappel EvtInterruptIsr du pilote peut appeler WdfDpcEnqueue.

Les pilotes effectuent généralement des demandes d’E/S dans leurs fonctions de rappel EvtInterruptDpc ou EvtDpcFunc .

Parfois, un pilote doit effectuer des opérations de maintenance d’interruption à IRQL = PASSIVE_LEVEL. Dans ce cas, la fonction de rappel EvtInterruptDpc ou EvtDpcFunc du pilote, exécutée à l’adresse IRQL = DISPATCH_LEVEL, peut planifier l’exécution d’un ou de plusieurs éléments de travail d’infrastructure, qui s’exécutent à IRQL = PASSIVE_LEVEL.

Pour obtenir un exemple de pilote qui utilise des éléments de travail lors de la maintenance des interruptions de périphérique, consultez l’exemple de pilote PCIDRV .