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


Функция 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, CreateRemoteThreadThread функции и процесс, который запускается (в результате вызова CreateProcess) сериализуются между собой в процессе. В адресном пространстве одновременно происходит только одно из этих событий. Это означает, что удержание следующих ограничений:

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

Требования

Требование Ценность
минимальные поддерживаемые клиентские Windows XP [только классические приложения]
минимальный поддерживаемый сервер Windows Server 2003 [только классические приложения]
целевая платформа Виндоус
заголовка 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

потоки