Função CreateRemoteThread (processthreadsapi.h)
Cria um thread que é executado no espaço de endereço virtual de outro processo.
Use a função CreateRemoteThreadEx para criar um thread executado no espaço de endereço virtual de outro processo e, opcionalmente, especificar atributos estendidos.
Sintaxe
HANDLE CreateRemoteThread(
[in] HANDLE hProcess,
[in] LPSECURITY_ATTRIBUTES lpThreadAttributes,
[in] SIZE_T dwStackSize,
[in] LPTHREAD_START_ROUTINE lpStartAddress,
[in] LPVOID lpParameter,
[in] DWORD dwCreationFlags,
[out] LPDWORD lpThreadId
);
Parâmetros
[in] hProcess
Um identificador para o processo no qual o thread deve ser criado. O identificador deve ter os direitos de acesso PROCESS_CREATE_THREAD, PROCESS_QUERY_INFORMATION, PROCESS_VM_OPERATION, PROCESS_VM_WRITE e PROCESS_VM_READ e pode falhar sem esses direitos em determinadas plataformas. Para obter mais informações, consulte Direitos de Acesso e Segurança do Processo.
[in] lpThreadAttributes
Um ponteiro para uma estrutura SECURITY_ATTRIBUTES que especifica um descritor de segurança para o novo thread e determina se os processos filho podem herdar o identificador retornado. Se lpThreadAttributes for NULL, o thread obterá um descritor de segurança padrão e o identificador não poderá ser herdado. As ACL (listas de controle de acesso) no descritor de segurança padrão para um thread vêm do token primário do criador.
Windows XP: As ACLs no descritor de segurança padrão para um thread vêm do token primário ou de representação do criador. Esse comportamento mudou com o Windows XP com O SP2 e o Windows Server 2003.
[in] dwStackSize
O tamanho inicial da pilha, em bytes. O sistema arredonda esse valor para a página mais próxima. Se esse parâmetro for 0 (zero), o novo thread usará o tamanho padrão para o executável. Para obter mais informações, consulte Tamanho da pilha de threads.
[in] lpStartAddress
Um ponteiro para a função definida pelo aplicativo do tipo LPTHREAD_START_ROUTINE a ser executada pelo thread e representa o endereço inicial do thread no processo remoto. A função deve existir no processo remoto. Para obter mais informações, consulte ThreadProc.
[in] lpParameter
Um ponteiro para uma variável a ser passada para a função thread.
[in] dwCreationFlags
Os sinalizadores que controlam a criação do thread.
Valor | Significado |
---|---|
|
O thread é executado imediatamente após a criação. |
|
O thread é criado em um estado suspenso e não é executado até que a função ResumeThread seja chamada. |
|
O parâmetro dwStackSize especifica o tamanho inicial da reserva da pilha. Se esse sinalizador não for especificado, dwStackSize especificará o tamanho da confirmação. |
[out] lpThreadId
Um ponteiro para uma variável que recebe o identificador de thread.
Se esse parâmetro for NULL, o identificador de thread não será retornado.
Retornar valor
Se a função for bem-sucedida, o valor retornado será um identificador para o novo thread.
Se a função falhar, o valor retornado será NULL. Para obter informações de erro estendidas, chame GetLastError.
Observe que CreateRemoteThread pode ter êxito mesmo se lpStartAddress apontar para dados, código ou não estiver acessível. Se o endereço inicial for inválido quando o thread for executado, ocorrerá uma exceção e o thread será encerrado. O término do thread devido a um endereço inicial inválido é tratado como uma saída de erro para o processo do thread. Esse comportamento é semelhante à natureza assíncrona de CreateProcess, em que o processo é criado mesmo que se refira a DLL (bibliotecas de vínculo dinâmico) inválidas ou ausentes.
Comentários
A função CreateRemoteThread faz com que um novo thread de execução comece no espaço de endereço do processo especificado. O thread tem acesso a todos os objetos que o processo abre.
Antes de Windows 8, os Serviços de Terminal isolam cada sessão de terminal por design. Portanto, CreateRemoteThread falhará se o processo de destino estiver em uma sessão diferente do processo de chamada.
O novo identificador de thread é criado com acesso total ao novo thread. Se um descritor de segurança não for fornecido, o identificador poderá ser usado em qualquer função que exija um identificador de objeto thread. Quando um descritor de segurança é fornecido, um marcar de acesso é executado em todos os usos subsequentes do identificador antes que o acesso seja concedido. Se o acesso marcar negar acesso, o processo de solicitação não poderá usar o identificador para obter acesso ao thread.
Se o thread for criado em um estado executável (ou seja, se o sinalizador CREATE_SUSPENDED não for usado), o thread poderá começar a ser executado antes de CreateThread retornar e, em particular, antes que o chamador receba o identificador e o identificador do thread criado.
O thread é criado com uma prioridade de thread de THREAD_PRIORITY_NORMAL. Use as funções GetThreadPriority e SetThreadPriority para obter e definir o valor de prioridade de um thread.
Quando um thread termina, o objeto thread atinge um estado sinalizado, que satisfaz os threads que estão aguardando o objeto.
O objeto thread permanece no sistema até que o thread seja encerrado e todos os identificadores para ele sejam fechados por meio de uma chamada para CloseHandle.
As funções ExitProcess, ExitThread, CreateThread, CreateRemoteThread e um processo que está sendo iniciado (como resultado de uma chamada CreateProcess ) são serializados entre si dentro de um processo. Apenas um desses eventos ocorre em um espaço de endereço por vez. Isso significa que as seguintes restrições são retenção:
- Durante as rotinas de inicialização e inicialização de DLL do processo, novos threads podem ser criados, mas não iniciam a execução até que a inicialização de DLL seja feita para o processo.
- Somente um thread em um processo pode estar em uma rotina de inicialização ou desanexação de DLL por vez.
- ExitProcess retorna depois que todos os threads tiverem concluído suas rotinas de inicialização ou desanexação de DLL.
- Ele converte aplicativos de thread único em aplicativos multithread.
- Ele altera o layout de tempo e memória do processo.
- Isso resulta em uma chamada para o ponto de entrada de cada DLL no processo.
Requisitos
Requisito | Valor |
---|---|
Cliente mínimo com suporte | Windows XP [somente aplicativos da área de trabalho] |
Servidor mínimo com suporte | Windows Server 2003 [somente aplicativos da área de trabalho] |
Plataforma de Destino | Windows |
Cabeçalho | processthreadsapi.h (inclua Windows.h no Windows Server 2003, Windows Vista, Windows 7, Windows Server 2008 Windows Server 2008 R2) |
Biblioteca | Kernel32.lib |
DLL | Kernel32.dll |