Поделиться через


Функция CreateRemoteThread (processthreadsapi.h)

Создает поток, который выполняется в виртуальном адресном пространстве другого процесса.

Используйте функцию CreateRemoteThreadEx , чтобы создать поток, который выполняется в виртуальном адресном пространстве другого процесса и при необходимости указать расширенные атрибуты.

Синтаксис

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

Параметры

[in] hProcess

Дескриптор процесса, в котором создается поток. Дескриптор должен иметь права доступа PROCESS_CREATE_THREAD, PROCESS_QUERY_INFORMATION, PROCESS_VM_OPERATION, PROCESS_VM_WRITE и PROCESS_VM_READ и может завершиться ошибкой без этих прав на определенных платформах. Дополнительные сведения см. в разделе Управление правами на доступ и безопасность процесса.

[in] lpThreadAttributes

Указатель на структуру SECURITY_ATTRIBUTES , которая задает дескриптор безопасности для нового потока и определяет, могут ли дочерние процессы наследовать возвращенный дескриптор. Если lpThreadAttributes имеет значение NULL, поток получает дескриптор безопасности по умолчанию и дескриптор не может быть унаследован. Списки управления доступом (ACL) в дескрипторе безопасности по умолчанию для потока поступают из основного маркера создателя.

Windows XP: Списки управления доступом в дескрипторе безопасности по умолчанию для потока поступают из основного маркера или маркера олицетворения создателя. Это поведение изменилось в Windows XP с пакетом обновления 2 (SP2) и Windows Server 2003.

[in] dwStackSize

Начальный размер стека в байтах. Система округляет это значение до ближайшей страницы. Если этот параметр равен 0 (нулю), новый поток использует размер по умолчанию для исполняемого файла. Дополнительные сведения см. в разделе Размер стека потоков.

[in] lpStartAddress

Указатель на определяемую приложением функцию типа LPTHREAD_START_ROUTINE для выполнения потоком и представляет начальный адрес потока в удаленном процессе. Функция должна существовать в удаленном процессе. Дополнительные сведения см. в разделе ThreadProc.

[in] lpParameter

Указатель на переменную, передаваемую в функцию потока.

[in] dwCreationFlags

Флаги, управляющие созданием потока.

Значение Значение
0
Поток запускается сразу после создания.
CREATE_SUSPENDED
0x00000004
Поток создается в приостановленном состоянии и не выполняется до вызова функции ResumeThread .
STACK_SIZE_PARAM_IS_A_RESERVATION
0x00010000
Параметр dwStackSize указывает начальный размер резерва стека. Если этот флаг не указан, dwStackSize указывает размер фиксации.

[out] lpThreadId

Указатель на переменную, которая получает идентификатор потока.

Если этот параметр имеет значение NULL, идентификатор потока не возвращается.

Возвращаемое значение

Если функция выполняется успешно, возвращаемое значение является дескриптором для нового потока.

Если функция завершается сбоем, возвращается значение NULL. Дополнительные сведения об ошибке можно получить, вызвав GetLastError.

Обратите внимание, что CreateRemoteThread может завершиться успешно, даже если lpStartAddress указывает на данные, код или недоступен. Если начальный адрес недействителен при выполнении потока, возникает исключение и поток завершается. Завершение потока из-за недопустимого начального адреса обрабатывается как выход из процесса потока. Это поведение аналогично асинхронной природе CreateProcess, где процесс создается, даже если он ссылается на недопустимые или отсутствующие библиотеки динамической компоновки (DLL).

Комментарии

Функция CreateRemoteThread приводит к запуску нового потока выполнения в адресном пространстве указанного процесса. Поток имеет доступ ко всем объектам, которые открывает процесс.

До Windows 8 службы терминалов изолируют каждый сеанс терминала по умолчанию. Поэтому createRemoteThread завершается сбоем, если целевой процесс находится в сеансе, отличном от вызывающего процесса.

Новый дескриптор потока создается с полным доступом к новому потоку. Если дескриптор безопасности не указан, дескриптор может использоваться в любой функции, требующей дескриптора объекта потока. При указании дескриптора безопасности перед предоставлением доступа выполняется проверка доступа ко всем последующим использованию дескриптора. Если проверка доступа запрещает доступ, запрашивающий процесс не может использовать дескриптор для получения доступа к потоку.

Если поток создается в состоянии запуска (то есть, если флаг CREATE_SUSPENDED не используется), поток может начать выполнение до возврата CreateThread и, в частности, до того, как вызывающий объект получит дескриптор и идентификатор созданного потока.

Поток создается с приоритетом потока THREAD_PRIORITY_NORMAL. Используйте функции GetThreadPriority и SetThreadPriority , чтобы получить и задать значение приоритета потока.

Когда поток завершается, объект потока достигает состояния сигнала, которое удовлетворяет потокам, ожидающим объекта.

Объект потока остается в системе до тех пор, пока поток не завершит работу и все его дескрипторы не будут закрыты посредством вызова CloseHandle.

Функции ExitProcess, ExitThread, CreateThread, CreateRemoteThread и процесс, который запускается (в результате вызова CreateProcess ), сериализуются друг между другом в рамках процесса. Только одно из этих событий происходит в адресном пространстве одновременно. Это означает, что удерживают следующие ограничения:

  • Во время запуска процесса и процедур инициализации DLL можно создавать новые потоки, но они не начинают выполнение, пока не будет выполнена инициализация DLL для процесса.
  • В процедуре инициализации или отсоединения DLL одновременно может находиться только один поток в процессе.
  • ExitProcess возвращается после того, как все потоки завершат инициализацию dll или отсоединяют подпрограммы.
Обычно эта функция используется для внедрения потока в процесс, который выполняет отладку для создания прерывания. Однако такое использование не рекомендуется, так как дополнительный поток сбивает с толку пользователя, отлаживающего приложение, и у этого метода есть несколько побочных эффектов:
  • Он преобразует однопоточные приложения в многопоточные приложения.
  • Он изменяет схему времени и памяти процесса.
  • Это приводит к вызову точки входа каждой библиотеки DLL в процессе.
Еще одним распространенным способом использования этой функции является внедрение потока в процесс для запроса кучи или других сведений о процессе. Это может вызвать те же побочные эффекты, которые упоминались в предыдущем абзаце. Кроме того, приложение может взаимоблокироваться, если поток пытается получить владение блокировками, которые использует другой поток.

Требования

Требование Значение
Минимальная версия клиента Windows XP [только классические приложения]
Минимальная версия сервера Windows Server 2003 [только классические приложения]
Целевая платформа Windows
Header processthreadsapi.h (включая Windows.h в Windows Server 2003, Windows Vista, Windows 7, Windows Server 2008 Windows Server 2008 R2)
Библиотека Kernel32.lib
DLL Kernel32.dll

См. также

CloseHandle

CreateProcess

CreateRemoteThreadEx

CreateThread

ExitProcess

ExitThread

GetThreadPriority

Функции процессов и потоков

ResumeThread

SECURITY_ATTRIBUTES

SetThreadPriority

ThreadProc

Потоки