Compartilhar via


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
0
O thread é executado imediatamente após a criação.
CREATE_SUSPENDED
0x00000004
O thread é criado em um estado suspenso e não é executado até que a função ResumeThread seja chamada.
STACK_SIZE_PARAM_IS_A_RESERVATION
0x00010000
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.
Um uso comum dessa função é injetar um thread em um processo que está sendo depurado para emitir uma interrupção. No entanto, esse uso não é recomendado, pois o thread extra é confuso para a pessoa que depura o aplicativo e há vários efeitos colaterais para usar essa técnica:
  • 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.
Outro uso comum dessa função é injetar um thread em um processo para consultar o heap ou outras informações de processo. Isso pode causar os mesmos efeitos colaterais mencionados no parágrafo anterior. Além disso, o aplicativo poderá ficar em deadlock se o thread tentar obter a propriedade de bloqueios que outro thread está usando.

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

CloseHandle

CreateProcess

CreateRemoteThreadEx

CreateThread

exitprocess

ExitThread

GetThreadPriority

Funções de processo e thread

ResumeThread

SECURITY_ATTRIBUTES

SetThreadPriority

threadproc

Threads