Funzione CreateRemoteThread (processthreadsapi.h)

Crea un thread eseguito nello spazio indirizzi virtuale di un altro processo.

Usare la funzione CreateRemoteThreadEx per creare un thread in esecuzione nello spazio indirizzi virtuale di un altro processo e specificare facoltativamente attributi estesi.

Sintassi

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
);

Parametri

[in] hProcess

Handle per il processo in cui deve essere creato il thread. L'handle deve avere i diritti di accesso PROCESS_CREATE_THREAD, PROCESS_QUERY_INFORMATION, PROCESS_VM_OPERATION, PROCESS_VM_WRITE e PROCESS_VM_READ accesso e potrebbe non riuscire senza questi diritti in determinate piattaforme. Per altre informazioni, vedere Elaborare diritti di sicurezza e accesso.

[in] lpThreadAttributes

Puntatore a una struttura SECURITY_ATTRIBUTES che specifica un descrittore di sicurezza per il nuovo thread e determina se i processi figlio possono ereditare l'handle restituito. Se lpThreadAttributes è NULL, il thread ottiene un descrittore di sicurezza predefinito e l'handle non può essere ereditato. Gli elenchi di controllo di accesso (ACL) nel descrittore di sicurezza predefinito per un thread provengono dal token primario dell'autore.

Windows XP: Gli ACL nel descrittore di sicurezza predefinito per un thread provengono dal token primario o di rappresentazione del creatore. Questo comportamento è cambiato con Windows XP con SP2 e Windows Server 2003.

[in] dwStackSize

Dimensioni iniziali dello stack, in byte. Il sistema arrotonda questo valore nella pagina più vicina. Se questo parametro è 0 (zero), il nuovo thread usa le dimensioni predefinite per il file eseguibile. Per altre informazioni, vedere Dimensioni dello stack di thread.

[in] lpStartAddress

Puntatore alla funzione definita dall'applicazione di tipo LPTHREAD_START_ROUTINE da eseguire dal thread e rappresenta l'indirizzo iniziale del thread nel processo remoto. La funzione deve esistere nel processo remoto. Per altre informazioni, vedere ThreadProc.

[in] lpParameter

Puntatore a una variabile da passare alla funzione thread.

[in] dwCreationFlags

Flag che controllano la creazione del thread.

Valore Significato
0
Il thread viene eseguito immediatamente dopo la creazione.
CREATE_SUSPENDED
0x00000004
Il thread viene creato in uno stato sospeso e non viene eseguito finché non viene chiamata la funzione ResumeThread .
STACK_SIZE_PARAM_IS_A_RESERVATION
0x00010000
Il parametro dwStackSize specifica le dimensioni iniziali della riserva dello stack. Se questo flag non è specificato, dwStackSize specifica le dimensioni del commit.

[out] lpThreadId

Puntatore a una variabile che riceve l'identificatore del thread.

Se questo parametro è NULL, l'identificatore del thread non viene restituito.

Valore restituito

Se la funzione ha esito positivo, il valore restituito è un handle per il nuovo thread.

Se la funzione ha esito negativo, il valore restituito è NULL. Per informazioni dettagliate sull'errore, chiamare GetLastError.

Si noti che CreateRemoteThread può avere esito positivo anche se lpStartAddress punta ai dati, al codice o non è accessibile. Se l'indirizzo iniziale non è valido quando il thread viene eseguito, si verifica un'eccezione e il thread termina. La terminazione del thread a causa di un indirizzo di inizio non valido viene gestita come uscita di errore per il processo del thread. Questo comportamento è simile alla natura asincrona di CreateProcess, in cui il processo viene creato anche se si riferisce a librerie di collegamento dinamico non valide o mancanti (DLL).

Commenti

La funzione CreateRemoteThread causa l'avvio di un nuovo thread di esecuzione nello spazio indirizzi del processo specificato. Il thread ha accesso a tutti gli oggetti aperti dal processo.

Prima di Windows 8, i servizi terminal isolano ogni sessione del terminale in base alla progettazione. Pertanto, CreateRemoteThread ha esito negativo se il processo di destinazione si trova in una sessione diversa rispetto al processo di chiamata.

Il nuovo handle di thread viene creato con accesso completo al nuovo thread. Se non viene fornito un descrittore di sicurezza, l'handle può essere usato in qualsiasi funzione che richiede un handle dell'oggetto thread. Quando viene fornito un descrittore di sicurezza, viene eseguito un controllo di accesso su tutti gli usi successivi dell'handle prima che venga concesso l'accesso. Se il controllo di accesso nega l'accesso, il processo di richiesta non può usare l'handle per ottenere l'accesso al thread.

Se il thread viene creato in uno stato runnable, ovvero se il flag di CREATE_SUSPENDED non viene usato, il thread può iniziare a eseguire prima che CreateThread restituisca e, in particolare, prima che il chiamante riceva l'handle e l'identificatore del thread creato.

Il thread viene creato con una priorità thread di THREAD_PRIORITY_NORMAL. Usare le funzioni GetThreadPriority e SetThreadPriority per ottenere e impostare il valore di priorità di un thread.

Quando un thread termina, l'oggetto thread ottiene uno stato segnalato, che soddisfa i thread in attesa dell'oggetto.

L'oggetto thread rimane nel sistema finché il thread non è terminato e tutti gli handle vengono chiusi tramite una chiamata a CloseHandle.

Le funzioni ExitProcess, ExitThread, CreateThread, CreateRemoteThread e un processo che viene avviato (come risultato di una chiamata CreateProcess) vengono serializzati tra loro all'interno di un processo. Solo uno di questi eventi si verifica in uno spazio di indirizzi alla volta. Ciò significa che le restrizioni seguenti contengono:

  • Durante l'avvio del processo e le routine di inizializzazione DLL, è possibile creare nuovi thread, ma non iniziano l'esecuzione fino a quando non viene eseguita l'inizializzazione DLL per il processo.
  • Un solo thread in un processo può trovarsi in una routine di inizializzazione o scollegamento della DLL alla volta.
  • ExitProcess restituisce dopo che tutti i thread hanno completato l'inizializzazione della DLL o scollegare le routine.
Un uso comune di questa funzione consiste nell'inserire un thread in un processo in cui viene eseguito il debug per generare un'interruzione. Tuttavia, questo uso non è consigliato, perché il thread aggiuntivo è confuso con la persona che esegue il debug dell'applicazione e ci sono diversi effetti collaterali per l'uso di questa tecnica:
  • Converte applicazioni a thread singolo in applicazioni multithreaded.
  • Modifica il layout di tempo e memoria del processo.
  • Genera una chiamata al punto di ingresso di ogni DLL nel processo.
Un altro uso comune di questa funzione consiste nell'inserire un thread in un processo per eseguire query su heap o altre informazioni sul processo. Ciò può causare gli stessi effetti collaterali menzionati nel paragrafo precedente. Inoltre, l'applicazione può eseguire il deadlock se il thread tenta di ottenere la proprietà dei blocchi usati da un altro thread.

Requisiti

Requisito Valore
Client minimo supportato Windows XP [solo app desktop]
Server minimo supportato Windows Server 2003 [solo app desktop]
Piattaforma di destinazione Windows
Intestazione processthreadsapi.h (includere Windows.h in Windows Server 2003, Windows Vista, Windows 7, Windows Server 2008 Windows Server 2008 R2)
Libreria Kernel32.lib
DLL Kernel32.dll

Vedere anche

Closehandle

CreateProcess

CreateRemoteThreadEx

CreateThread

ExitProcess

ExitThread

GetThreadPriority

Funzioni di processi e thread

ResumeThread

SECURITY_ATTRIBUTES

SetThreadPriority

Threadproc

Thread