Função CreateRemoteThreadEx (processthreadsapi.h)
Cria um thread que é executado no espaço de endereço virtual de outro processo e, opcionalmente, especifica atributos estendidos, como afinidade de grupo de processadores.
Sintaxe
HANDLE CreateRemoteThreadEx(
[in] HANDLE hProcess,
[in, optional] LPSECURITY_ATTRIBUTES lpThreadAttributes,
[in] SIZE_T dwStackSize,
[in] LPTHREAD_START_ROUTINE lpStartAddress,
[in, optional] LPVOID lpParameter,
[in] DWORD dwCreationFlags,
[in, optional] LPPROC_THREAD_ATTRIBUTE_LIST lpAttributeList,
[out, optional] 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. No Windows 10, versão 1607, seu código deve obter esses direitos de acesso para o novo identificador. No entanto, a partir do Windows 10, versão 1703, se o novo identificador tiver direito a esses direitos de acesso, o sistema os obterá para você. Para obter mais informações, consulte Process Security and Access Rights.
[in, optional] 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.
[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, optional] lpParameter
Um ponteiro para uma variável a ser passada para a função de thread apontada por lpStartAddress. Esse parâmetro pode ser NULL.
[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. |
[in, optional] lpAttributeList
Uma lista de atributos que contém parâmetros adicionais para o novo thread. Essa lista é criada pela função
[out, optional] 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.
Observações
A função CreateRemoteThreadEx 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. O parâmetro lpAttribute pode ser usado para especificar atributos estendidos, como afinidade de grupo de processadores para o novo thread. Se lpAttribute for NULL, o comportamento da função será o mesmo que CreateRemoteThread.
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. Para obter e definir o valor de prioridade de um thread, use as funções GetThreadPriority e SetThreadPriority.
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 7 [somente aplicativos da área de trabalho] |
servidor com suporte mínimo | Windows Server 2008 R2 [somente aplicativos da área de trabalho] |
da Plataforma de Destino |
Windows |
cabeçalho | processthreadsapi.h (inclua Windows.h no Windows Server 2008 Windows Server 2008 R2) |
biblioteca | Kernel32.lib |
de DLL |
Kernel32.dll |