Erbschaft
Ein untergeordneter Prozess kann mehrere Eigenschaften und Ressourcen vom übergeordneten Prozess erben. Sie können auch verhindern, dass ein untergeordneter Prozess Eigenschaften vom übergeordneten Prozess erbt. Folgendes kann geerbt werden:
- Öffnen Sie Handles, die von der CreateFile--Funktion zurückgegeben werden. Dazu gehören Handles für Dateien, Konsoleneingabepuffer, Konsolenbildschirmpuffer, benannte Rohre, serielle Kommunikationsgeräte und E-Maillots.
- Öffnen Sie Handles für Prozess-, Thread-, Mutex-, Ereignis-, Semaphor-, Named-Pipe-, Anonym-Pipe- und Dateizuordnungsobjekte. Diese werden von der CreateProcess, CreateThread, CreateMutex, CreateEvent, CreateSemaphore, CreateNamedPipe, CreatePipeund CreateFileMapping Funktionen zurückgegeben.
- Umgebungsvariablen.
- Das aktuelle Verzeichnis.
- Die Konsole, es sei denn, der Prozess wird getrennt oder eine neue Konsole erstellt. Ein untergeordneter Konsolenprozess kann auch die Standardhandles des übergeordneten Elements sowie den Zugriff auf den Eingabepuffer und den aktiven Bildschirmpuffer erben.
- Der Fehlermodus, wie durch die SetErrorMode--Funktion festgelegt.
- Die Prozessoraffinitätsmaske.
- Die Zuordnung mit einem Auftrag.
Der untergeordnete Prozess erbt nicht Folgendes:
- Priority-Klasse.
- Von LocalAlloc, GlobalAlloc, HeapCreateund HeapAlloczurückgegebene Handles.
- Pseudohandles, wie in den von der GetCurrentProcess oder GetCurrentThread-Funktion zurückgegebenen Handles. Diese Handles sind nur für den Aufrufvorgang gültig.
- DLL-Modulhandles, die von der LoadLibrary--Funktion zurückgegeben werden.
- GDI- oder USER-Handles, z. B. HBITMAP- oder HMENU-.
Vererbung von Handles
Ein untergeordneter Prozess kann einige der Handles des übergeordneten Elements erben, aber nicht andere. Damit ein Handle geerbt wird, müssen Sie zwei Dinge ausführen:
- Geben Sie an, dass das Handle beim Erstellen, Öffnen oder Duplizieren des Handles geerbt werden soll. Erstellungsfunktionen verwenden in der Regel das bInheritHandle Mitglied einer SECURITY_ATTRIBUTES Struktur zu diesem Zweck. DuplicateHandle verwendet den bInheritHandles Parameter.
- Geben Sie an, dass vererbbare Handles geerbt werden sollen, indem Sie den bInheritHandles-Parameter auf TRUE festlegen, wenn die CreateProcess--Funktion aufgerufen wird. Um die Standardeingabe, die Standardausgabe und die Standardfehlerhandles zu erben, muss das dwFlags-element der STARTUPINFO--Struktur STARTF_USESTDHANDLES enthalten.
Um eine Liste der Handles anzugeben, die von einem bestimmten untergeordneten Prozess geerbt werden sollen, rufen Sie die UpdateProcThreadAttribute--Funktion mit der PROC_THREAD_ATTRIBUTE_HANDLE_LIST-Kennzeichnung auf.
Ein geerbter Handle bezieht sich auf dasselbe Objekt im untergeordneten Prozess wie im übergeordneten Prozess. Sie verfügt auch über denselben Wert und dieselben Zugriffsrechte. Wenn ein Prozess den Status des Objekts ändert, wirkt sich die Änderung daher auf beide Prozesse aus. Um ein Handle zu verwenden, muss der untergeordnete Prozess den Handlewert abrufen und das Objekt kennen, auf das es verweist. In der Regel kommuniziert der übergeordnete Prozess diese Informationen über die Befehlszeile, den Umgebungsblock oder eine Form der Interprocess-Kommunikationan den untergeordneten Prozess.
Verwenden Sie die SetHandleInformation--Funktion, um zu steuern, ob ein vorhandenes Handle vererbbar ist oder nicht.
Erben von Umgebungsvariablen
Ein untergeordneter Prozess erbt standardmäßig die Umgebungsvariablen des übergeordneten Prozesses. CreateProcess- ermöglicht dem übergeordneten Prozess jedoch die Angabe eines anderen Umgebungsvariablenblocks. Weitere Informationen finden Sie unter Umgebungsvariablen.
Erben des aktuellen Verzeichnisses
Die GetCurrentDirectory--Funktion ruft das aktuelle Verzeichnis des aufrufenden Prozesses ab. Ein untergeordneter Prozess erbt standardmäßig das aktuelle Verzeichnis des übergeordneten Prozesses. CreateProcess- ermöglicht es dem übergeordneten Prozess jedoch, ein anderes aktuelles Verzeichnis für den untergeordneten Prozess anzugeben. Verwenden Sie zum Ändern des aktuellen Verzeichnisses des aufrufenden Prozesses die SetCurrentDirectory--Funktion.