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 :
- Ouvrez les handles retournés par la fonction deCreateFile. Cela inclut des handles pour les fichiers, les mémoires tampons d’entrée de console, les mémoires tampons d’écran de console, les canaux nommés, les périphériques de communication série et les mailslots.
- Ouvrez des handles 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 CreateProcess, CreateThread, CreateMutex, CreateEvent, CreateSemaphore, CreateNamedPipe, CreatePipeet Fonctions CreateFileMapping, respectivement.
- Variables d’environnement.
- Répertoire actif.
- Console, sauf si le processus est détaché ou qu’une nouvelle console est créée. Un processus de console enfant peut également hériter des handles standard du parent, ainsi que l’accès à la mémoire tampon d’entrée et à la mémoire tampon d’écran active.
- 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 Priority.
- Handles retournés par LocalAlloc, GlobalAlloc, HeapCreateet HeapAlloc.
- Pseudo-handles, comme dans les handles retournés par la fonction GetCurrentProcess ou GetCurrentThread. Ces handles sont valides uniquement pour le processus appelant.
- Le module DLL gère les handles retournés par la fonctionLoadLibrary.
- GDI ou USER handles, tels que HBITMAP ou HMENU.
Héritage des handles
Un processus enfant peut hériter de certains des handles de son parent, mais pas hériter d’autres. Pour qu’un handle soit hérité, vous devez effectuer deux opérations :
- Spécifiez 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 SECURITY_ATTRIBUTES à cet effet. DuplicateHandle utilise le paramètre bInheritHandles.
- Spécifiez que les handles pouvant hériter 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, de sortie standard et d’erreur standard, les dwFlags membre de la structure STARTUPINFO doivent inclure STARTF_USESTDHANDLES.
Pour spécifier une liste des handles qui doivent être hérités par un processus enfant spécifique, appelez la fonction UpdateProcThreadAttribute avec l’indicateur de 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. Il 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 de 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, de son bloc d’environnement ou d’une forme quelconque de communication interprocesseur .
Utilisez la fonction SetHandleInformation pour contrôler si un handle existant est hérité ou non.
Héritage des variables d’environnement
Un processus enfant hérite des variables d’environnement de son processus parent par défaut. 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 actuel du processus appelant. Un processus enfant hérite du répertoire actuel de son processus parent par défaut. Toutefois, CreateProcess permet au processus parent de spécifier un autre répertoire actif pour le processus enfant. Pour modifier le répertoire actuel du processus appelant, utilisez la fonction SetCurrentDirectory.