CreateRemoteThreadEx-Funktion (processthreadsapi.h)
Erstellt einen Thread, der im virtuellen Adressraum eines anderen Prozesses ausgeführt wird, und gibt optional erweiterte Attribute an, z. B. Prozessorgruppenaffinität.
Syntax
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
);
Parameter
[in] hProcess
Ein Handle für den Prozess, in dem der Thread erstellt werden soll. Das Handle muss über die Zugriffsrechte PROCESS_CREATE_THREAD, PROCESS_QUERY_INFORMATION, PROCESS_VM_OPERATION, PROCESS_VM_WRITE und PROCESS_VM_READ verfügen. In Windows 10 Version 1607 muss Ihr Code diese Zugriffsrechte für das neue Handle erhalten. Ab Windows 10 Version 1703 erhält das System diese jedoch für Sie, wenn das neue Handle berechtigt ist. Weitere Informationen finden Sie unter Prozesssicherheit und Zugriffsrechte.
[in, optional] lpThreadAttributes
Ein Zeiger auf eine SECURITY_ATTRIBUTES-Struktur , die einen Sicherheitsdeskriptor für den neuen Thread angibt und bestimmt, ob untergeordnete Prozesse das zurückgegebene Handle erben können. Wenn lpThreadAttributes NULL ist, erhält der Thread eine Standardsicherheitsbeschreibung, und das Handle kann nicht geerbt werden. Die Zugriffssteuerungslisten (Access Control Lists, ACL) im Standardsicherheitsdeskriptor für einen Thread stammen aus dem primären Token des Erstellers.
[in] dwStackSize
Die anfängliche Größe des Stapels in Bytes. Das System rundet diesen Wert auf die nächstgelegene Seite ab. Wenn dieser Parameter 0 (null) ist, verwendet der neue Thread die Standardgröße für die ausführbare Datei. Weitere Informationen finden Sie unter Threadstapelgröße.
[in] lpStartAddress
Ein Zeiger auf die anwendungsdefinierte Funktion vom Typ LPTHREAD_START_ROUTINE , die vom Thread ausgeführt werden soll, und stellt die Startadresse des Threads im Remoteprozess dar. Die Funktion muss im Remoteprozess vorhanden sein. Weitere Informationen finden Sie unter ThreadProc.
[in, optional] lpParameter
Ein Zeiger auf eine Variable, die an die Threadfunktion übergeben werden soll, auf die von lpStartAddress verwiesen wird. Dieser Parameter kann NULL sein.
[in] dwCreationFlags
Die Flags, die die Erstellung des Threads steuern.
Wert | Bedeutung |
---|---|
|
Der Thread wird unmittelbar nach der Erstellung ausgeführt. |
|
Der Thread wird in einem angehaltenen Zustand erstellt und erst ausgeführt, wenn die ResumeThread-Funktion aufgerufen wird. |
|
Der dwStackSize-Parameter gibt die anfängliche Reservegröße des Stapels an. Wenn dieses Flag nicht angegeben ist, gibt dwStackSize die Commitgröße an. |
[in, optional] lpAttributeList
Eine Attributliste, die zusätzliche Parameter für den neuen Thread enthält. Diese Liste wird von der InitializeProcThreadAttributeList-Funktion erstellt.
[out, optional] lpThreadId
Ein Zeiger auf eine Variable, die den Threadbezeichner empfängt.
Wenn dieser Parameter NULL ist, wird der Threadbezeichner nicht zurückgegeben.
Rückgabewert
Wenn die Funktion erfolgreich ist, ist der Rückgabewert ein Handle für den neuen Thread.
Wenn bei der Funktion ein Fehler auftritt, ist der Rückgabewert NULL. Um erweiterte Fehlerinformationen zu erhalten, rufen Sie GetLastError auf.
Hinweise
Die CreateRemoteThreadEx-Funktion bewirkt, dass ein neuer Ausführungsthread im Adressraum des angegebenen Prozesses beginnt. Der Thread hat Zugriff auf alle Objekte, die der Prozess öffnet. Der lpAttribute-Parameter kann verwendet werden, um erweiterte Attribute wie die Prozessorgruppenaffinität für den neuen Thread anzugeben. Wenn lpAttribute NULL ist, ist das Verhalten der Funktion identisch mit CreateRemoteThread.
Vor dem Windows 8 isoliert Terminaldienste jede Terminalsitzung nach Dem Entwurf. Daher schlägt CreateRemoteThread fehl, wenn sich der Zielprozess in einer anderen Sitzung als der aufrufende Prozess befindet.
Das neue Threadhandle wird mit Vollzugriff auf den neuen Thread erstellt. Wenn kein Sicherheitsdeskriptor bereitgestellt wird, kann das Handle in jeder Funktion verwendet werden, die ein Threadobjekthandle erfordert. Wenn ein Sicherheitsdeskriptor bereitgestellt wird, wird eine Zugriffsüberprüfung für alle nachfolgenden Verwendungen des Handles durchgeführt, bevor der Zugriff gewährt wird. Wenn die Zugriffsüberprüfung den Zugriff verweigert, kann der anfordernde Prozess das Handle nicht verwenden, um Zugriff auf den Thread zu erhalten.
Wenn der Thread in einem ausführungsfähigen Zustand erstellt wird (d. h. wenn das flag CREATE_SUSPENDED nicht verwendet wird), kann der Thread mit der Ausführung beginnen, bevor CreateThread zurückgibt und insbesondere, bevor der Aufrufer das Handle und den Bezeichner des erstellten Threads empfängt.
Der Thread wird mit einer Threadpriorität von THREAD_PRIORITY_NORMAL erstellt. Verwenden Sie zum Abrufen und Festlegen des Prioritätswerts eines Threads die Funktionen GetThreadPriority und SetThreadPriority .
Wenn ein Thread beendet wird, erreicht das Threadobjekt einen Signalzustand, der die Threads erfüllt, die auf das Objekt warten.
Das Threadobjekt verbleibt im System, bis der Thread beendet wurde und alle Handles für ihn durch einen Aufruf von CloseHandle geschlossen werden.
Die Funktionen ExitProcess, ExitThread, CreateThread, CreateRemoteThread und ein Prozess, der (als Ergebnis eines CreateProcess-Aufrufs ) gestartet wird, werden innerhalb eines Prozesses serialisiert. Nur eines dieser Ereignisse tritt jeweils in einem Adressraum auf. Dies bedeutet, dass die folgenden Einschränkungen gelten:
- Während der Prozessstart- und DLL-Initialisierungsroutinen können neue Threads erstellt werden, sie beginnen jedoch erst mit der Ausführung, wenn die DLL-Initialisierung für den Prozess abgeschlossen ist.
- Nur ein Thread in einem Prozess kann sich in einer DLL-Initialisierung oder einer Detach-Routine gleichzeitig befinden.
- ExitProcess gibt zurück, nachdem alle Threads ihre DLL-Initialisierung abgeschlossen haben oder Routinen getrennt haben.
- Es konvertiert Singlethreadanwendungen in Multithreadanwendungen.
- Es ändert das Timing und das Speicherlayout des Prozesses.
- Dies führt zu einem Aufruf des Einstiegspunkts jeder DLL im Prozess.
Anforderungen
Anforderung | Wert |
---|---|
Unterstützte Mindestversion (Client) | Windows 7 [nur Desktop-Apps] |
Unterstützte Mindestversion (Server) | Windows Server 2008 R2 [nur Desktop-Apps] |
Zielplattform | Windows |
Kopfzeile | processthreadsapi.h (Einschließen von Windows.h unter Windows Server 2008 Windows Server 2008 R2) |
Bibliothek | Kernel32.lib |
DLL | Kernel32.dll |