Herança
Um processo filho pode herdar várias propriedades e recursos de seu processo pai. Você também pode impedir que um processo filho herde propriedades de seu processo pai. O seguinte pode ser herdado:
- Abra os identificadores retornados pela função CreateFile . Isso inclui identificadores para arquivos, buffers de entrada do console, buffers de tela do console, pipes nomeados, dispositivos de comunicação serial e emailslots.
- Abra identificadores para processar, thread, mutex, evento, semáforo, pipe nomeado, pipe anônimo e objetos de mapeamento de arquivo. Eles são retornados pelas funções CreateProcess, CreateThread, CreateMutex, CreateEvent, CreateSemaphore, CreateNamedPipe, CreatePipe e CreateFileMapping , respectivamente.
- Variáveis de ambiente.
- O diretório atual.
- O console, a menos que o processo seja desanexado ou um novo console seja criado. Um processo de console filho também pode herdar os identificadores padrão do pai, bem como o acesso ao buffer de entrada e ao buffer de tela ativo.
- O modo de erro, conforme definido pela função SetErrorMode .
- A máscara de afinidade do processador.
- A associação com um trabalho.
O processo filho não herda o seguinte:
- Classe de prioridade.
- Identificadores retornados por LocalAlloc, GlobalAlloc, HeapCreate e HeapAlloc.
- Pseudo handles, como nos identificadores retornados pela função GetCurrentProcess ou GetCurrentThread . Esses identificadores são válidos apenas para o processo de chamada.
- Identificadores de módulo DLL retornados pela função LoadLibrary .
- Identificadores GDI ou USER, como HBITMAP ou HMENU.
Herdando identificadores
Um processo filho pode herdar alguns dos identificadores de seus pais, mas não herdar outros. Para fazer com que um identificador seja herdado, você deve fazer duas coisas:
- Especifique que o identificador deve ser herdado quando você criar, abrir ou duplicar o identificador. Normalmente, as funções de criação usam o membro bInheritHandle de uma estrutura SECURITY_ATTRIBUTES para essa finalidade. DuplicateHandle usa o parâmetro bInheritHandles .
- Especifique que os identificadores herdáveis devem ser herdados definindo o parâmetro bInheritHandles como TRUE ao chamar a função CreateProcess . Além disso, para herdar a entrada padrão, a saída padrão e os identificadores de erro padrão, o membro dwFlags da estrutura STARTUPINFO deve incluir STARTF_USESTDHANDLES.
Para especificar uma lista dos identificadores que devem ser herdados por um processo filho específico, chame a função UpdateProcThreadAttribute com o sinalizador PROC_THREAD_ATTRIBUTE_HANDLE_LIST .
Um identificador herdado refere-se ao mesmo objeto no processo filho como no processo pai. Ele também tem o mesmo valor e privilégios de acesso. Portanto, quando um processo altera o estado do objeto, a alteração afeta ambos os processos. Para usar um identificador, o processo filho deve recuperar o valor do identificador e "saber" o objeto ao qual ele se refere. Normalmente, o processo pai comunica essas informações ao processo filho por meio de sua linha de comando, bloco de ambiente ou alguma forma de comunicação entre processos.
Use a função SetHandleInformation para controlar se um identificador existente é herdável ou não.
Herdando variáveis de ambiente
Um processo filho herda as variáveis de ambiente de seu processo pai por padrão. No entanto, CreateProcess permite que o processo pai especifique um bloco diferente de variáveis de ambiente. Para obter mais informações, consulte Variáveis de ambiente.
Herdando o Diretório Atual
A função GetCurrentDirectory recupera o diretório atual do processo de chamada. Um processo filho herda o diretório atual de seu processo pai por padrão. No entanto, CreateProcess permite que o processo pai especifique um diretório atual diferente para o processo filho. Para alterar o diretório atual do processo de chamada, use a função SetCurrentDirectory .