Processus Kernel-Mode Windows et Gestionnaire de threads
Un processus est un logiciel en cours d’exécution dans Windows. Chaque processus a un ID, un nombre qui l’identifie. Un thread est un objet qui identifie la partie du programme en cours d’exécution. Chaque thread a un ID, un nombre qui l’identifie.
Un processus peut avoir plusieurs threads. L’objectif d’un thread est d’allouer du temps processeur. Sur une machine avec un seul processeur, plusieurs threads peuvent être alloués, mais un seul thread peut s’exécuter à la fois. Chaque thread n’exécute qu’une courte durée, puis l’exécution est transmise au thread suivant, donnant à l’utilisateur l’illusion que plusieurs choses se produisent à la fois. Sur une machine avec plusieurs processeurs, un véritable multithreading peut avoir lieu. Si une application a plusieurs threads, les threads peuvent s’exécuter 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 dans un processus. Que vous disposiez d’un ou de plusieurs processeurs, la programmation du pilote doit faire attention pour s’assurer que tous les threads de votre processus sont conçus de sorte que, quel que soit l’ordre dans lequel les threads sont gérés, votre pilote fonctionne correctement.
Si des threads de processus différents 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 consistant à s’assurer que les threads 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 Noyau Windows.
Meilleures pratiques pour l’implémentation des fonctions de rappel liées aux processus et aux threads
Cet ensemble d’instructions s’applique à ces routines de rappel :
PCREATE_PROCESS_NOTIFY_ROUTINE
PCREATE_PROCESS_NOTIFY_ROUTINE_EX
- 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 au Registre.
- N’effectuez pas d’appels de fonction de blocage et/ou de communication interprocesseur (IPC).
- 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, en particulier le travail impliquant :
- DES API lentes qui appellent un autre processus.
- Tout comportement de blocage susceptible d’interrompre des threads dans les services de base.
- Si vous utilisez des threads de travail système, n’attendez pas que le travail soit terminé. Cela va à l’encontre de l’objectif de mettre en file d’attente le travail à terminer de manière asynchrone.
- Tenez compte des bonnes pratiques pour l’utilisation de la pile en mode noyau. Pour obtenir des exemples, consultez Comment faire empêcher mon pilote de manquer de pile en mode noyau ? et Concepts et conseils du pilote clé.
Processus de sous-système
À partir de Windows 10, le Sous-système Windows pour Linux (WSL) permet à un utilisateur d’exécuter des binaires Linux ELF64 natifs sur Windows, en même temps 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 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 de sous-système ne contiennent pas de structures de données associées à des processus Win32, telles que le bloc d’environnement de processus (PEB) et le bloc d’environnement de 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 process et Thread Manager afin de prendre en charge les processus de 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 renvoient SubsystemInformationTypeWSL pour WSL.
- D’autres pilotes en mode noyau peuvent être avertis de la création/suppression du processus de sous-système en inscrivant leur routine de rappel via l’appel PsSetCreateProcessNotifyRoutineEx2 . Pour recevoir 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 et 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.