Функция CreateRemoteThread


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

Синтаксис

HANDLE CreateRemoteThread(

HANDLE hProcess,                         // дескриптор процесса
LPSECURITY_ATTRIBUTES
lpThreadAttributes,// дескриптор защиты (SD)
SIZE_T
dwStackSize,                      // размер начального стека
LPTHREAD_START_ROUTINE
lpStartAddress,   // функция потока
LPVOID
lpParameter,                      // аргументы потока
DWORD
dwCreationFlags,                   // параметры создания
LPDWORD
lpThreadId                       // идентификатор потока

); 

Параметры

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

Нет

Замечания по платформе

Не имеется

 

Назад в оглавление
На главную страницу
На оглавление справки

Hosted by uCoz