Funzione CreateRemoteThreadEx (processthreadsapi.h)
Crea un thread eseguito nello spazio indirizzi virtuale di un altro processo e, facoltativamente, specifica attributi estesi, ad esempio l'affinità del gruppo di processori.
Sintassi
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
);
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. In Windows 10 versione 1607 il codice deve ottenere questi diritti di accesso per il nuovo handle. Tuttavia, a partire da Windows 10 versione 1703, se il nuovo handle ha diritto a questi diritti di accesso, il sistema li ottiene automaticamente. Per altre informazioni, vedere Sicurezza dei processi e diritti di accesso.
[in, optional] 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 del creatore.
[in] dwStackSize
Dimensioni iniziali dello stack, in byte. Il sistema arrotonda questo valore alla pagina più vicina. Se questo parametro è 0 (zero), il nuovo thread usa le dimensioni predefinite per l'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, optional] lpParameter
Puntatore a una variabile a cui passare la funzione thread a cui punta lpStartAddress. Questo parametro può essere NULL.
[in] dwCreationFlags
Flag che controllano la creazione del thread.
Valore | Significato |
---|---|
|
Il thread viene eseguito immediatamente dopo la creazione. |
|
Il thread viene creato in uno stato sospeso e non viene eseguito fino a quando non viene chiamata la funzione ResumeThread . |
|
Il parametro dwStackSize specifica le dimensioni iniziali di riserva dello stack. Se questo flag non viene specificato, dwStackSize specifica le dimensioni del commit. |
[in, optional] lpAttributeList
Elenco di attributi che contiene parametri aggiuntivi per il nuovo thread. Questo elenco viene creato dalla funzione InitializeProcThreadAttributeList .
[out, optional] 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.
Commenti
La funzione CreateRemoteThreadEx fa sì che un nuovo thread di esecuzione inizi nello spazio indirizzi del processo specificato. Il thread ha accesso a tutti gli oggetti aperti dal processo. Il parametro lpAttribute può essere usato per specificare attributi estesi, ad esempio l'affinità del gruppo di processori per il nuovo thread. Se lpAttribute è NULL, il comportamento della funzione corrisponde a CreateRemoteThread.
Prima di Windows 8, Servizi terminal isola 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 chiamante.
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 di 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 eseguibile, ovvero se il flag di CREATE_SUSPENDED non viene usato, il thread può iniziare l'esecuzione 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à di thread di THREAD_PRIORITY_NORMAL. Per ottenere e impostare il valore di priorità di un thread, usare le funzioni GetThreadPriority e SetThreadPriority .
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 fino a quando il thread non viene terminato e tutti gli handle a esso 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 indirizzi alla volta. Ciò significa che sono presenti le restrizioni seguenti:
- Durante le routine di avvio del processo e di inizializzazione dll, è possibile creare nuovi thread, ma non iniziano l'esecuzione fino a quando non viene eseguita l'inizializzazione della DLL per il processo.
- Un solo thread in un processo può trovarsi in una routine di inizializzazione o scollegamento della DLL alla volta.
- ExitProcess viene restituito dopo che tutti i thread hanno completato l'inizializzazione della DLL o scollegare routine.
- Converte le applicazioni a thread singolo in applicazioni multithreading.
- Modifica l'intervallo e il layout della memoria del processo.
- Genera una chiamata al punto di ingresso di ogni DLL nel processo.
Requisiti
Requisito | Valore |
---|---|
Client minimo supportato | Windows 7 [solo app desktop] |
Server minimo supportato | Windows Server 2008 R2 [solo app desktop] |
Piattaforma di destinazione | Windows |
Intestazione | processthreadsapi.h (includere Windows.h in Windows Server 2008 Windows Server 2008 R2) |
Libreria | Kernel32.lib |
DLL | Kernel32.dll |