CreateRemoteThread-Funktion (processthreadsapi.h)

Erstellt einen Thread, der im virtuellen Adressraum eines anderen Prozesses ausgeführt wird.

Verwenden Sie die CreateRemoteThreadEx-Funktion , um einen Thread zu erstellen, der im virtuellen Adressraum eines anderen Prozesses ausgeführt wird, und optional erweiterte Attribute anzugeben.

Syntax

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

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 und kann auf bestimmten Plattformen ohne diese Rechte ausfallen. Weitere Informationen finden Sie unter Prozesssicherheit und Zugriffsrechte.

[in] 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 einen Standardsicherheitsdeskriptor, 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.

Windows XP: Die ACLs im Standardsicherheitsdeskriptor für einen Thread stammen aus dem primären Token oder dem Identitätswechseltoken des Erstellers. Dieses Verhalten hat sich mit Windows XP mit SP2 und Windows Server 2003 geändert.

[in] dwStackSize

Die anfängliche Größe des Stapels in Bytes. Das System rundet diesen Wert auf die nächste Seite. 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] lpParameter

Ein Zeiger auf eine Variable, die an die Threadfunktion übergeben werden soll.

[in] dwCreationFlags

Die Flags, die die Erstellung des Threads steuern.

Wert Bedeutung
0
Der Thread wird unmittelbar nach der Erstellung ausgeführt.
CREATE_SUSPENDED
0x00000004
Der Thread wird in einem angehaltenen Zustand erstellt und erst ausgeführt, wenn die ResumeThread-Funktion aufgerufen wird.
STACK_SIZE_PARAM_IS_A_RESERVATION
0x00010000
Der dwStackSize-Parameter gibt die anfängliche Reservegröße des Stapels an. Wenn dieses Flag nicht angegeben ist, gibt dwStackSize die Commitgröße an.

[out] 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.

Beachten Sie, dass CreateRemoteThread auch dann erfolgreich ausgeführt werden kann, wenn lpStartAddress auf Daten, Code verweist oder nicht zugänglich ist. Wenn die Startadresse ungültig ist, wenn der Thread ausgeführt wird, tritt eine Ausnahme auf, und der Thread wird beendet. Die Threadbeendigung aufgrund einer ungültigen Startadresse wird als Fehlerausgang für den Threadprozess behandelt. Dieses Verhalten ähnelt der asynchronen Natur von CreateProcess, bei der der Prozess auch dann erstellt wird, wenn er sich auf ungültige oder fehlende Dynamic Link Libraries (DLL) bezieht.

Hinweise

Die CreateRemoteThread-Funktion bewirkt, dass ein neuer Ausführungsthread im Adressraum des angegebenen Prozesses beginnt. Der Thread hat Zugriff auf alle Objekte, die der Prozess öffnet.

Vor der 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 der Threadpriorität THREAD_PRIORITY_NORMAL erstellt. Verwenden Sie die Funktionen GetThreadPriority und SetThreadPriority , um den Prioritätswert eines Threads abzurufen und festzulegen.

Wenn ein Thread beendet wird, erreicht das Threadobjekt einen signalierten Zustand, der die Threads erfüllt, die auf das Objekt warten.

Das Threadobjekt verbleibt im System, bis der Thread beendet wurde und alle Handles dafür 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 untereinander 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 gleichzeitig in einer DLL-Initialisierungs- oder Detachroutine enthalten sein.
  • ExitProcess gibt zurück, nachdem alle Threads ihre DLL-Initialisierungs- oder Trennroutinen abgeschlossen haben.
Eine häufige Verwendung dieser Funktion besteht darin, einen Thread in einen Prozess einzufügen, der gerade gedebuggt wird, um eine Unterbrechung zu geben. Diese Verwendung wird jedoch nicht empfohlen, da der zusätzliche Thread für die Person, die die Anwendung debuggen, verwirrend ist und die Verwendung dieser Technik mehrere Nebenwirkungen hat:
  • Singlethread-Anwendungen werden in Multithreadanwendungen konvertiert.
  • Dadurch wird das Timing und das Speicherlayout des Prozesses geändert.
  • Dies führt zu einem Aufruf des Einstiegspunkts jeder DLL im Prozess.
Eine weitere häufige Verwendung dieser Funktion besteht darin, einen Thread in einen Prozess einzufügen, um Heap- oder andere Prozessinformationen abzufragen. Dies kann zu den gleichen Nebenwirkungen führen, die im vorherigen Absatz erwähnt wurden. Außerdem kann die Anwendung einen Deadlock ausführen, wenn der Thread versucht, den Besitz von Sperren abzurufen, die von einem anderen Thread verwendet werden.

Anforderungen

Anforderung Wert
Unterstützte Mindestversion (Client) Windows XP [nur Desktop-Apps]
Unterstützte Mindestversion (Server) Windows Server 2003 [nur Desktop-Apps]
Zielplattform Windows
Kopfzeile processthreadsapi.h (enthalten Windows.h unter Windows Server 2003, Windows Vista, Windows 7, Windows Server 2008 Windows Server 2008 R2)
Bibliothek Kernel32.lib
DLL Kernel32.dll

Siehe auch

CloseHandle

CreateProcess

CreateRemoteThreadEx

CreateThread

ExitProcess

ExitThread

GetThreadPriority

Prozess- und Threadfunktionen

ResumeThread

SECURITY_ATTRIBUTES

SetThreadPriority

ThreadProc

Threads