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_WRITEe PROCESS_VM_READ e pode falhar sem esses direitos em determinadas plataformas. Para obter mais informações, consulte Process Security and Access Rights.
[in] lpThreadAttributes
Um ponteiro para uma estrutura de 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 principal ou de representação do criador. Esse comportamento mudou com o Windows XP com SP2 e 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 de 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.
Valor de retorno
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 que lpStartAddress aponte 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. A terminação de thread devido a um endereço inicial inválido é tratada 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.
Observações
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 do 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, uma verificação de acesso é executada em todos os usos subsequentes do identificador antes que o acesso seja concedido. Se a verificação de acesso 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 de 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 dele 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 em um processo. Apenas um desses eventos ocorre em um espaço de endereço de cada 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 eles não iniciam a execução até que a inicialização de DLL seja feita para o processo.
- Apenas um thread em um processo pode estar em uma inicialização de DLL ou desanexar rotina de cada 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 multithreaded.
- 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 |
---|---|
de cliente com suporte mínimo | Windows XP [somente aplicativos da área de trabalho] |
servidor com suporte mínimo | Windows Server 2003 [somente aplicativos da área de trabalho] |
da 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 |
de DLL |
Kernel32.dll |
Consulte também
CreateRemoteThreadEx
GetThreadPriority