Freigeben über


CreateRemoteThreadEx-Funktion (processthreadsapi.h)

Erstellt einen Thread, der im virtuellen Adressbereich eines anderen Prozesses ausgeführt wird und optional erweiterte Attribute wie prozessorgruppenaffinität angibt.

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 PROCESS_CREATE_THREAD, PROCESS_QUERY_INFORMATION, PROCESS_VM_OPERATION, PROCESS_VM_WRITE und PROCESS_VM_READ Zugriffsrechte verfügen. In Windows 10, Version 1607, muss Ihr Code diese Zugriffsrechte für das neue Handle abrufen. Ab Windows 10, Version 1703, erhält das System jedoch, wenn das neue Handle anspruchsberechtigt ist, diese Zugriffsrechte für Sie. Weitere Informationen finden Sie unter Prozesssicherheits- und Zugriffsberechtigungen.

[in, optional] lpThreadAttributes

Ein Zeiger auf eine SECURITY_ATTRIBUTES-Struktur, die einen Sicherheitsdeskriptor für den neuen Thread angibt und bestimmt, ob untergeordnete Prozesse den zurückgegebenen Handle erben können. Wenn lpThreadAttributes NULL ist, ruft der Thread einen Standardsicherheitsdeskriptor ab, und der 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 Anfangsgröße des Stapels in Byte. 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, optional] lpParameter

Ein Zeiger auf eine Variable, die an die Threadfunktion übergeben werden soll, auf die durch lpStartAddressverwiesen wird. Dieser Parameter kann NULL sein.

[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 wird 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 Commit-Größe an.

[in, optional] lpAttributeList

Eine Attributliste, die zusätzliche Parameter für den neuen Thread enthält. Diese Liste wird von der funktion InitializeProcThreadAttributeList 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 die Funktion fehlschlägt, ist der Rückgabewert NULL. Rufen Sie GetLastErrorauf, um erweiterte Fehlerinformationen zu erhalten.

Bemerkungen

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 prozessorgruppenaffinität für den neuen Thread anzugeben. Wenn lpAttribute- NULL ist, entspricht das Verhalten der Funktion CreateRemoteThread-.

Vor Windows 8 isoliert Terminaldienste jede Terminalsitzung nach Design. Daher schlägt CreateRemoteThread- fehl, wenn sich der Zielprozess in einer anderen Sitzung befindet als der aufrufende Prozess.

Das neue Threadhandle wird mit vollständigem Zugriff auf den neuen Thread erstellt. Wenn kein Sicherheitsdeskriptor bereitgestellt wird, kann das Handle in jeder Funktion verwendet werden, für die ein Threadobjekthandle erforderlich ist. Wenn ein Sicherheitsdeskriptor bereitgestellt wird, wird eine Zugriffsüberprüfung für alle nachfolgenden Verwendungen des Handles ausgefü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 CREATE_SUSPENDED Flag nicht verwendet wird), kann der Thread ausgeführt werden, bevor CreateThread- zurückgegeben wird 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. Um den Prioritätswert eines Threads abzurufen und festzulegen, verwenden Sie die GetThreadPriority- und SetThreadPriority--Funktionen.

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

Das Threadobjekt verbleibt im System, bis der Thread beendet wurde, und alle Ziehpunkte werden über einen Aufruf von CloseHandlegeschlossen.

Die ExitProcess, ExitThread, CreateThread, CreateRemoteThread Funktionen und ein Prozess, der gestartet wird (als Ergebnis eines CreateProcess Aufrufs), werden innerhalb eines Prozesses zwischeneinander serialisiert. Nur eines dieser Ereignisse erfolgt jeweils in einem Adressraum. Dies bedeutet, dass die folgenden Einschränkungen gelten:

  • Während der Prozessstart- und DLL-Initialisierungsroutinen können neue Threads erstellt werden, aber sie beginnen erst mit der Ausführung der DLL-Initialisierung für den Prozess.
  • Nur ein Thread in einem Prozess kann sich gleichzeitig in einer DLL-Initialisierung oder einer Detachierungsroutine befindet.
  • ExitProcess- gibt zurück, nachdem alle Threads ihre DLL-Initialisierung abgeschlossen oder Routinen trennen.
Eine häufige Verwendung dieser Funktion besteht darin, einen Thread in einen Prozess einzufügen, der gedebuggt wird, um einen Umbruch auszulösen. Diese Verwendung wird jedoch nicht empfohlen, da der zusätzliche Thread für die Person, die die Anwendung debuggen, verwirrend ist, und es gibt mehrere Nebenwirkungen für die Verwendung dieser Technik:
  • Sie konvertiert Singlethread-Anwendungen in Multithread-Anwendungen.
  • Das Timing und das Speicherlayout des Prozesses werden geändert.
  • Es 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 zum Abfragen von Heap- oder anderen Prozessinformationen einzufügen. Dies kann zu den gleichen Nebenwirkungen führen, die im vorherigen Absatz erwähnt werden. Außerdem kann die Anwendung deadlocken, wenn der Thread versucht, den Besitz von Sperren abzurufen, die ein anderer Thread verwendet.

Anforderungen

Anforderung Wert
mindestens unterstützte Client- Windows 7 [nur Desktop-Apps]
mindestens unterstützte Server- Windows Server 2008 R2 [nur Desktop-Apps]
Zielplattform- Fenster
Header- processthreadsapi.h (enthalten Windows.h unter Windows Server 2008 Windows Server 2008 R2)
Library Kernel32.lib
DLL- Kernel32.dll

Siehe auch

CreateRemoteThread-