Instructions pour l’écriture de routines DPC

Gardez à l’esprit les points suivants lors de l’écriture d’une routine DpcForIsr ou CustomDpc :

  • Une routine DpcForIsr ou CustomDpc doit synchroniser son accès à un appareil physique, ainsi qu’à toutes les informations ou ressources d’état partagées que le pilote gère, avec les autres routines du pilote qui accèdent aux mêmes emplacements de périphérique ou de mémoire.

    Si une routine DpcForIsr ou CustomDpc partage l’appareil ou l’état avec un ISR, elle doit appeler KeSynchronizeExecution, en fournissant l’adresse d’une routine SynchCritSection fournie par le pilote qui programme l’appareil ou accède à l’état partagé. Pour plus d’informations, consultez Utilisation des sections critiques.

    Si une routine DpcForIsr ou CustomDpc partage l’état ou les ressources, telles qu’une file d’attente verrouillée ou un objet de minuteur, avec des routines autres qu’un ISR, elle doit protéger l’état partagé ou les ressources avec un verrou de rotation exécutif initialisé par le pilote. Pour plus d’informations, consultez Verrous tournants.

  • Les routines DpcForIsr et CustomDpc s’exécutent sur IRQL = DISPATCH_LEVEL, ce qui limite l’ensemble des routines de support qu’elles peuvent appeler.

    Par exemple, les routines DpcForIsr et CustomDpc ne peuvent ni accéder ni allouer de mémoire paginable, et elles ne peuvent pas attendre que les objets de répartiteur du noyau soient définis à l’état signalé. En revanche, ils peuvent acquérir et libérer un verrou de rotation exécutif d’un pilote avec KeAcquireSpinLockAtDpcLevel et KeReleaseSpinLockFromDpcLevel, qui s’exécutent plus rapidement que KeAcquireSpinLock et KeReleaseSpinLock.

    Bien qu’une routine DPC ne puisse pas effectuer d’appels bloquants, elle peut mettre en file d’attente un élément de travail à exécuter dans un thread de travail système qui s’exécute à IRQL égal à PASSIVE_LEVEL. L’élément de travail peut effectuer des appels bloquants qui attendent des objets répartiteurs. Pour mettre en file d’attente un élément de travail, une routine DpcForIsr appelle généralement une routine telle que IoQueueWorkItem, et une routine CustomDpc appelle généralement la routine ExQueueWorkItem .

  • Les routines DpcForIsr et CustomDpc sont généralement responsables du démarrage de l’opération d’E/S suivante sur l’appareil.

    Pour les pilotes de périphériques physiques de niveau inférieur qui utilisent des E/S directes, cette responsabilité peut inclure l’utilisation d’une routine SynchCritSection pour programmer l’appareil afin de transférer plus de données afin de satisfaire l’IRP actuelle avant que le pilote appelle IoStartNextPacket.

  • Les routines DpcForIsr et CustomDpc ne doivent s’exécuter que pendant de brèves périodes et doivent déléguer autant de traitement que possible aux threads de travail.

    Alors qu’une routine DPC s’exécute sur un processeur, tous les threads ne peuvent pas s’exécuter sur le même processeur. Les autres routines DPC mises en file d’attente et prêtes à être exécutées peuvent être bloquées jusqu’à ce que la routine DPC actuelle soit terminée. Pour éviter de dégrader la réactivité du système, une routine DPC classique ne doit pas s’exécuter pendant plus de 100 microsecondes chaque fois qu’elle est appelée. Si une tâche nécessite plus de 100 microsecondes et doit s’exécuter à IRQL égal à DISPATCH_LEVEL, la routine DPC doit se terminer après 100 microsecondes et planifier une ou plusieurs routines CustomTimerDpc pour terminer la tâche ultérieurement. Pour plus d’informations sur les routines CustomTimerDpc , consultez Objets de minuteur et DPC.

    Une routine DPC doit effectuer uniquement les tâches qui doivent s’exécuter à DISPATCH_LEVEL, puis déléguer tout travail restant lié aux interruptions aux threads qui s’exécutent à IRQL = PASSIVE_LEVEL. Par exemple, une routine DPC peut mettre en file d’attente un élément de travail à exécuter dans un thread de travail système.

    Les routines DPC qui appellent la routine KeStallExecutionProcessor pour retarder l’exécution ne doivent pas spécifier des délais de plus de 100 microsecondes.

    Utilisez les outils d’analyse des performances du WDK pour évaluer les temps d’exécution des routines DPC. Pour obtenir un exemple qui utilise l’outil Tracelog pour surveiller les temps d’exécution DPC, consultez Exemple 15 : Mesure du temps DPC/ISR.

  • Si le pilote utilise DMA et que sa routine AdapterControl retourne KeepObject ou DeallocateObjectKeepRegisters (conservant ainsi le canal du contrôleur DMA système ou l’adaptateur de bus-master pour des opérations de transfert supplémentaires), la routine DpcForIsr ou CustomDpc est responsable de la publication de l’objet adaptateur ou des registres de carte avec FreeAdapterChannel ou FreeMapRegisters avant qu’il termine l’IRP actuel et retourne le contrôle.

  • Si un pilote de périphérique physique de niveau inférieur configure un objet contrôleur pour synchroniser les opérations d’E/S via le contrôleur avec des appareils attachés, sa routine DpcForIsr ou CustomDpc est chargée de libérer l’objet contrôleur à l’aide d’IoFreeController avant qu’il termine l’IRP actuel et retourne le contrôle.

  • Les routines DpcForIsr et CustomDpc sont généralement responsables de la journalisation des erreurs d’appareil qui se sont produites pendant le traitement d’une requête donnée, de réessayer la requête actuelle si nécessaire et possible, et de définir le bloc d’E/S status et d’appeler IoCompleteRequest pour l’IRP actuel.

  • Si le pilote et le périphérique prennent en charge les opérations d’E/S qui se chevauchent, le pilote doit suivre les règles de gestion des opérations d’E/S qui se chevauchent.

  • La routine DpcForIsr ou CustomDpc d’un pilote effectue généralement le traitement des E/S uniquement pour un sous-ensemble des codes de contrôle d’E/S publics que le pilote doit prendre en charge. En particulier, la routine DPC termine les opérations pour les demandes de contrôle d’appareil avec les caractéristiques suivantes :

    • Demandes qui modifient l’état de l’appareil physique

    • Demandes qui nécessitent le retour d’informations intrinsèquement volatiles sur l’appareil physique