Partager via


Processus en mode noyau Windows et gestionnaire de threads

Le processus en mode noyau windows fourni par le système et le gestionnaire de threads contrôlent la façon dont les processus et les threads s’exécutent dans le système d’exploitation Windows. Comprendre ce gestionnaire est essentiel pour les développeurs de pilotes en mode noyau qui doivent créer des threads, surveiller la création de processus ou synchroniser l’accès aux ressources partagées.

L’exemple de pilote ObCallback montre comment utiliser les routines de notification de processus et de thread dans un pilote en mode noyau.

Vue d’ensemble des processus et des threads

Un processus est un programme logiciel qui s’exécute actuellement dans Windows et identifié par un ID de processus unique (PID). Au sein de chaque processus, un ou plusieurs threads représentent les unités d’exécution réelles qui exécutent le code du programme. Chaque thread a également un ID de thread unique (TID) dans son processus.

Les threads activent le multitâche en partageant le temps processeur. Sur une machine à processeur unique, plusieurs threads peuvent être alloués, mais un seul s’exécute à la fois. Le processeur bascule rapidement entre les threads, ce qui crée l’illusion de l’exécution simultanée. Sur les systèmes multiprocesseurs, une véritable exécution parallèle se produit lorsque les threads s’exécutent simultanément sur différents processeurs.

Le processus en mode noyau Windows et le gestionnaire de threads gèrent l’exécution de tous les threads d’un processus. Que vous ayez un processeur ou plus, vous devez prendre soin de la programmation de pilotes pour vous assurer que tous les threads de votre processus sont conçus afin que, quel que soit l’ordre que les threads sont gérés, votre pilote fonctionne correctement.

Si des threads provenant de différents processus tentent d’utiliser la même ressource en même temps, des problèmes peuvent se produire. Windows fournit plusieurs techniques pour éviter ce problème. La technique de s’assurer que les threads provenant de différents processus ne touchent pas la même ressource est appelée synchronisation. Pour plus d’informations sur la synchronisation, consultez Techniques de synchronisation.

Les routines qui fournissent une interface directe au processus et au gestionnaire de threads sont généralement précédées des lettres « Ps » ; par exemple, PsCreateSystemThread. Pour obtenir la liste des DDIS du noyau, consultez le noyau Windows.

Cet ensemble de directives s’applique à ces routines de rappel :

Utilisez ces bonnes pratiques :

  • Gardez les routines courtes et simples.
  • N’effectuez pas d’appels dans un service en mode utilisateur pour valider le processus, le thread ou l’image.
  • N’effectuez pas d’appels de registre.
  • N’effectuez pas d’appels de fonction de communication interprocessus (IPC) bloquants et/ou de communication entre processus.
  • Ne synchronisez pas avec d’autres threads, car cela peut entraîner des interblocages de réentrance.
  • Utilisez des threads de travail système pour mettre en file d’attente le travail, surtout pour les tâches impliquant :
    • API lentes ou API qui appellent d’autres processus.
    • Tout comportement bloquant qui peut interrompre les threads dans les services principaux.
  • Si vous utilisez des threads de travail du système, n'attendez pas que le travail soit terminé. Cela permet de mettre en file d’attente le travail de manière asynchrone.
  • Tenez compte des meilleures pratiques pour l’utilisation de la pile en mode noyau. Pour obtenir des exemples, consultez Comment empêcher mon pilote de manquer de pile en mode noyau ? et Principes et conseils clés pour les pilotes.

Processus du sous-système

À compter de Windows 10, le sous-système Windows pour Linux (WSL) permet à un utilisateur d’exécuter des fichiers binaires Linux ELF64 natifs sur Windows, ainsi que d’autres applications Windows. Pour plus d’informations sur l’architecture WSL et les composants en mode utilisateur et en mode noyau requis pour exécuter les fichiers binaires, consultez les billets sur le blog du sous-système Windows pour Linux .

L’un des composants est un processus de sous-système qui héberge le binaire Linux en mode utilisateur non modifié, tel que /bin/bash. Les processus du sous-système ne contiennent pas de structures de données associées à des processus Win32, tels que le bloc d’environnement de processus (PEB) et le bloc d’environnement thread (TEB). Pour un processus de sous-système, les appels système et les exceptions en mode utilisateur sont distribués à un pilote jumelé.

Voici les modifications apportées aux routines de processus et de gestionnaire de threads afin de prendre en charge les processus du sous-système :

  • Le type WSL est indiqué par la valeur SubsystemInformationTypeWSL dans l’énumération SUBSYSTEM_INFORMATION_TYPE . Les pilotes peuvent appeler NtQueryInformationProcess et NtQueryInformationThread pour déterminer le sous-système sous-jacent. Ces appels retournent SubsystemInformationTypeWSL pour WSL.

  • D’autres pilotes en mode noyau peuvent être avertis de la création/suppression du processus du sous-système en inscrivant leur routine de rappel via l’appel PsSetCreateProcessNotifyRoutineEx2 . Pour obtenir des notifications sur la création/suppression de threads, les pilotes peuvent appeler PsSetCreateThreadNotifyRoutineEx et spécifier PsCreateThreadNotifySubsystems comme type de notification.

  • La structure PS_CREATE_NOTIFY_INFO a été étendue pour inclure un membre IsSubsystemProcess qui indique un sous-système autre que Win32. D’autres membres tels que FileObject, ImageFileName, CommandLine indiquent des informations supplémentaires sur le processus du sous-système. Pour plus d’informations sur le comportement de ces membres, consultez SUBSYSTEM_INFORMATION_TYPE.