Héritage
Un processus enfant peut hériter de plusieurs propriétés et ressources de son processus parent. Vous pouvez également empêcher un processus enfant d’hériter des propriétés de son processus parent. Les éléments suivants peuvent être hérités :
- Handles ouverts retournés par la fonction CreateFile . Cela comprend les descripteurs des fichiers, les mémoires tampons d’entrée de la console, les mémoires tampons d’écran de la console, les canaux nommés, les périphériques de communication série et les mailslots.
- Handles ouverts pour traiter, thread, mutex, événement, sémaphore, canal nommé, canal anonyme et objets de mappage de fichiers. Celles-ci sont retournées par les fonctions CreateProcess, CreateThread, CreateMutex, CreateEvent, CreateSemaphore,, CreateNamedPipe, CreatePipeet CreateFileMapping , respectivement.
- Variables d'environnement.
- Le répertoire actif.
- La console, sauf si le processus est détaché ou si une nouvelle console est créée. Un processus de console enfant peut également hériter des handles standard du parent, ainsi qu’un accès à la mémoire tampon d’entrée et à la mémoire tampon d’écran active.
- Le mode d’erreur, tel que défini par la fonction SetErrorMode .
- Masque d’affinité du processeur.
- Association avec un travail.
Le processus enfant n’hérite pas des éléments suivants :
- Classe de priorité.
- Handles retournés par LocalAlloc, GlobalAlloc, HeapCreateet HeapAlloc.
- Les Pseudo-Handles, comme dans les descripteurs retournés par la fonction GetCurrentProcess ou GetCurrentThread . Ces handles ne sont valides que pour le processus appelant.
- Descripteurs de module DLL retournés par la fonction LoadLibrary .
- Des handles GDI ou utilisateur, tels que HBITMAP ou HMENU.
Hériter des handles
Un processus enfant peut hériter de certains des handles de son parent, mais ne pas en hériter d’autres. Pour faire en sorte qu’un handle soit hérité, vous devez effectuer deux opérations :
- Spécifie que le handle doit être hérité lorsque vous créez, ouvrez ou dupliquez le handle. Les fonctions de création utilisent généralement le membre bInheritHandle d’une structure d' _ attributs de sécurité à cet effet. DuplicateHandle utilise le paramètre bInheritHandles .
- Spécifiez que les handles pouvant être hérités doivent être hérités en définissant le paramètre bInheritHandles sur true lors de l’appel de la fonction CreateProcess . En outre, pour hériter des handles d’entrée standard, de sortie standard et d’erreur standard, le membre dwFlags de la structure STARTUPINFO doit inclure STARTF _ USESTDHANDLES.
Pour spécifier une liste des descripteurs qui doivent être hérités par un processus enfant spécifique, appelez la fonction UpdateProcThreadAttribute avec l’indicateur PROC_THREAD_ATTRIBUTE_HANDLE_LIST .
Un handle hérité fait référence au même objet dans le processus enfant que dans le processus parent. Elle a également la même valeur et les mêmes privilèges d’accès. Par conséquent, lorsqu’un processus modifie l’état de l’objet, la modification affecte les deux processus. Pour utiliser un handle, le processus enfant doit récupérer la valeur du handle et « connaître » l’objet auquel il fait référence. En règle générale, le processus parent communique ces informations au processus enfant par le biais de sa ligne de commande, d’un bloc d’environnement ou d’une certaine forme de communication entre processus.
Utilisez la fonction SetHandleInformation pour contrôler si un handle existant peut ou non être hérité.
Héritage de variables d’environnement
Par défaut, un processus enfant hérite des variables d’environnement de son processus parent. Toutefois, CreateProcess permet au processus parent de spécifier un autre bloc de variables d’environnement. Pour plus d’informations, consultez variables d’environnement.
Héritage du répertoire actif
La fonction GetCurrentDirectory récupère le répertoire actif du processus appelant. Par défaut, un processus enfant hérite le répertoire actuel de son processus parent. Toutefois, CreateProcess permet au processus parent de spécifier un répertoire actif différent pour le processus enfant. Pour modifier le répertoire actif du processus appelant, utilisez la fonction SetCurrentDirectory .