Функция
CreateRemoteThreadФункция
CreateRemoteThread создает поток, который запускается в виртуальном адресном пространстве другого процесса.Синтаксис
HANDLE CreateRemoteThread(
); |
Параметры
hProcess
[in] Дескриптор процесса, в котором поток должен быть создан. Дескриптор должен иметь права доступа
PROCESS_CREATE_THREAD, PROCESS_QUERY_INFORMATION, PROCESS_VM_OPERATION, PROCESS_VM_WRITE и PROCESS_VM_READ. Для получения дополнительной информации, см. Защита процесса и права доступа.lpThreadAttributes
[in] Указатель на структуру
SECURITY_ATTRIBUTES, которая определяет дескриптор безопасности для нового потока и обуславливает, могут ли дочерние процессы наследовать возвращенный дескриптор. Если lpThreadAttributes имеет значение ПУСТО (NULL), поток получает заданный по умолчанию дескриптор безопасности, и он не может быть унаследован. Списки контроля доступа (ACL) в заданном по умолчанию дескрипторе безопасности для потока поступают из первичного маркера или маркера заимствования прав создателя.dwStackSize
[in] Начальный размер стека, в байтах. Система округляет это значение до самой близкой страницы. Если это значение нулевое, новый поток использует по умолчанию размер стека исполняемой программы. Дополнительную информацию см. в статье
Размер стека потока.
Обратите внимание! на то, что размер стека растет по мере необходимости. |
lpStartAddress
[in] Указатель на определяемую программой функцию типа
LPTHREAD_START_ROUTINE, код которой исполняется потоком и обозначает начальный адрес потока в удаленном процессе. Функция должна существовать в удаленном процессе. Для получения дополнительной информации о функции потока, см. ThreadProc.lpParameter
[in] Указатель на переменную, которая передается в функцию потока.
dwCreationFlags
[in] Флажки, которые управляют созданием потока. Если установлен флажок
CREATE_SUSPENDED, создается поток в состоянии ожидания и не запускается до тех пор, пока не будет вызвана функция ResumeThread,. Если это значение нулевое, поток запускается немедленно после создания.Windows XP: Если установлен флажок
STACK_SIZE_PARAM_IS_A_RESERVATION, параметр dwStackSize задает начальный резервный размер стека. Иначе, dwStackSize устанавливает фиксированный размер.lpThreadId
[out] Указывает на переменную, которая принимает идентификатор потока.
Если этот параметр имеет значение ПУСТО (NULL), идентификатор потока не возвращается.
Возвращаемые значения
Если функция завершается успешно, величина возвращаемого значения - дескриптор нового потока.
Если функция завершается ошибкой, величина возвращаемого значения - ПУСТО (NULL). Чтобы получить дополнительные данные об ошибках, вызовите
GetLastError.
Обратите внимание! на то, что функция CreateRemoteThread может завершаться успешно, даже если lpStartAddress указывает на данные, код, или не понятно куда. Если начальный адрес ошибочен, когда поток выполняется, происходит исключительная ситуация и завершение работы потока. Завершение работы потока в результате ошибочного начального адреса обрабатывается как выход из-за ошибки в процессе потока. Это поведение похоже на асинхронный характер функции CreateProcess, где процесс создается даже тогда, если он адресуется к ошибочным или отсутствующим динамически подключаемым библиотекам (DLL). |
Замечания
Функция CreateRemoteThread заставляет новый поток начать выполнение в адресном пространстве заданного процесса. Поток имеет доступ ко всем объектам, открытым процессом.
Дескриптор нового потока создается с полным доступом к новому потоку. Если дескриптор безопасности не дан, этот дескриптор может быть использован в любой функции, которая требует дескриптора объекта потока. Когда дескриптор безопасности предоставлен, проверка доступа выполняется для всех последующих использований дескриптора прежде, чем предоставляется этот доступ. Если проверка отказывает в доступе, запрашивающий процесс не может использовать дескриптор, чтобы получить доступ к потоку.
Поток создается с приоритетом
THREAD_PRIORITY_NORMAL. Используйте функции GetThreadPriority и SetThreadPriority, чтобы получать и устанавливать значение приоритета потока.Когда потока завершает работу, объект потока приобретает сигнальное состояние, удовлетворяя любые потоки, которые ждали объект.
Объекта потока остается в системе до тех пор, пока поток не закончит работу, а все его дескрипторы не будут закрыты через вызов функции
CloseHandle.Функции
ExitProcess, ExitThread, CreateThread, CreateRemoteThread и процесс, который запускается (как результат вызова CreateProcess) в пределах процесса переводятся между собой в последовательный режим. Одновременно в адресном пространстве может происходить только одно из этих событий. Это означает нижеследующие ограничения выполнения:Обслуживание терминала:
Обслуживание терминала изолирует каждый терминальный сеанс в соответствии с разработкой. Поэтому, CreateRemoteThread завершается ошибкой, если целевой процесс находится в другом сеансе, а не в сеансе вызывающего процесса.Смотри также
Краткий обзор Процессы и потоки, Функции, используемые процессами и потоками, CloseHandle, CreateProcess, CreateThread, ExitProcess, ExitThread, GetThreadPriority, ResumeThread, SECURITY_ATTRIBUTES, SetThreadPriority, ThreadProc
Размещение и совместимость CreateRemoteThread |
|
Windows. NET Server |
Да |
Windows XP |
Да |
Windows 2000 |
Да |
Windows NT |
Да версии 3.1 и выше |
Windows Me |
Нет |
Windows 98 |
Нет |
Windows 95 |
Нет |
Используемая библиотека |
Kernel32.lib |
Заголовочный файл |
|
- объявлено в |
Winbase.h |
- включено в |
Windows.h |
Unicode |
Нет |
Замечания по платформе |
Не имеется |