Présentation des DPC threads

Les DPC threads sont disponibles dans Windows Vista et les versions ultérieures de Windows.

Un DPC threadé est un DPC que le système exécute à IRQL égal à PASSIVE_LEVEL. Les DPC threads sont activés par défaut, mais vous pouvez les désactiver en définissant la clé de Registre HKLM\System\CCS\Control\SessionManager\Kernel\ThreadDpcEnable sur zéro. Lorsque les DPC threads sont désactivés, ils s’exécutent en tant que DPC ordinaires.

Un DPC ordinaire préempte l’exécution de tous les threads et ne peut pas être préempté par un thread ou par un autre DPC. Si le système a un grand nombre de DPC ordinaires mis en file d’attente, ou si l’un de ces DPC s’exécute pendant une longue période, chaque thread reste en pause pendant une période arbitrairement longue. Ainsi, chaque DPC ordinaire augmente la latence du système, ce qui peut nuire aux performances des applications sensibles au temps, telles que la lecture audio ou vidéo.

À l’inverse, un DPC thread peut être préempté par un DPC ordinaire, mais pas par d’autres threads. Par conséquent, vous devez utiliser des DPC threads plutôt que des DPC ordinaires, sauf si un DPC particulier ne doit pas être préempté, même par un autre DPC.

Le système représente les PDC threadés (et les PDC ordinaires) en tant que structures KDPC . Pour initialiser une structure KDPC pour un DPC thread, appelez la routine KeInitializeThreadedDpc et passez-lui une routine CustomThreadedDpc qui effectue l’action de la DPC.

Étant donné qu’une routine CustomThreadedDpc peut s’exécuter à PASSIVE_LEVEL ou DISPATCH_LEVEL, vous devez vous assurer que votre routine CustomThreadedDpc se synchronise correctement aux deux IRQL. Pour plus d’informations sur la procédure à suivre, consultez Synchronisation et DPC threads.

En outre, vous devez vous assurer que votre routine CustomThreadedDpc respecte toutes les restrictions pour DISPATCH_LEVEL code. Si les DPC threads sont activés, ils s’exécutent sur IRQL = PASSIVE_LEVEL, mais sont toujours soumis aux mêmes restrictions que les DPC ordinaires. Tout le code qui s’exécute dans un DPC threadé, y compris toutes les fonctions appelées par la routine CustomThreadedDpc , doit être conforme aux restrictions de l’environnement DPC. Par exemple, le code ne doit pas bloquer sur les objets de synchronisation passive, tels que les objets KEVENT. De nombreuses piles d’appareils existantes, telles que la mise en réseau et l’USB, ne prennent pas en charge le traitement DPC threadé, et elles peuvent essayer de bloquer si elles détectent qu’elles sont appelées à PASSIVE_LEVEL. Pour des raisons similaires, l’infrastructure de pilote en mode noyau (KMDF) ne prend pas en charge le traitement DPC threadé, et les pilotes KMDF ne doivent pas essayer d’utiliser des contrôleurs DPC threads. Pour plus d’informations sur l’environnement DPC, consultez Écriture de routines DPC.

Pour ajouter un DPC thread à la file d’attente DPC, appelez KeInsertQueueDpc. Pour supprimer un DPC thread de la file d’attente avant son exécution, appelez KeRemoveQueueDpc.