Функция CreateRemoteThreadEx (processthreadsapi.h)
Создает поток, который выполняется в виртуальном адресном пространстве другого процесса и при необходимости задает расширенные атрибуты, такие как сходство групп обработчиков.
Синтаксис
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
);
Параметры
[in] hProcess
Дескриптор процесса создания потока. Дескриптор должен иметь права доступа PROCESS_CREATE_THREAD, PROCESS_QUERY_INFORMATION, PROCESS_VM_OPERATION, PROCESS_VM_WRITE и PROCESS_VM_READ доступа. В Windows 10 версии 1607 код должен получить эти права доступа для нового дескриптора. Однако начиная с Windows 10 версии 1703, если новый дескриптор имеет право на эти права доступа, система получает их для вас. Дополнительные сведения см. в "Безопасность процессов и доступ".
[in, optional] lpThreadAttributes
Указатель на структуру SECURITY_ATTRIBUTES, которая задает дескриптор безопасности для нового потока и определяет, могут ли дочерние процессы наследовать возвращенный дескриптор. Если lpThreadAttributes имеет значение NULL, поток получает дескриптор безопасности по умолчанию и дескриптор безопасности нельзя наследовать. Списки управления доступом (ACL) в дескрипторе безопасности по умолчанию для потока приходят из основного маркера создателя.
[in] dwStackSize
Начальный размер стека в байтах. Система округляет это значение до ближайшей страницы. Если этот параметр равен 0 (ноль), новый поток использует размер по умолчанию для исполняемого файла. Дополнительные сведения см. в разделе Размер стека потоков.
[in] lpStartAddress
Указатель на определяемую приложением функцию типа LPTHREAD_START_ROUTINE выполнять потоком и представляет начальный адрес потока в удаленном процессе. Функция должна существовать в удаленном процессе. Дополнительные сведения см. в разделе ThreadProc.
[in, optional] lpParameter
Указатель на переменную, передаваемую в функцию потока, на которую указывает lpStartAddress. Этот параметр может иметь значение NULL.
[in] dwCreationFlags
Флаги, управляющие созданием потока.
Ценность | Значение |
---|---|
|
Поток выполняется сразу после создания. |
|
Поток создается в приостановленном состоянии и не запускается до вызова функции ResumeThread. |
|
Параметр dwStackSize |
[in, optional] lpAttributeList
Список атрибутов, содержащий дополнительные параметры для нового потока. Этот список создается функцией InitializeProcThreadAttributeList.
[out, optional] lpThreadId
Указатель на переменную, которая получает идентификатор потока.
Если этот параметр имеет значение NULL, идентификатор потока не возвращается.
Возвращаемое значение
Если функция завершается успешно, возвращаемое значение является дескриптором нового потока.
Если функция завершается ошибкой, возвращаемое значение равно NULL. Чтобы получить расширенные сведения об ошибке, вызовите GetLastError.
Замечания
Функция CreateRemoteThreadEx создает новый поток выполнения в адресном пространстве указанного процесса. Поток имеет доступ ко всем объектам, которые открывается процесс. Параметр
До Windows 8 службы терминалов изолируют каждый сеанс терминала путем проектирования. Поэтому CreateRemoteThread завершается ошибкой, если целевой процесс находится в другом сеансе, отличном от вызывающего процесса.
Новый дескриптор потока создается с полным доступом к новому потоку. Если дескриптор безопасности не указан, дескриптор может использоваться в любой функции, требующей дескриптора объекта потока. При предоставлении дескриптора безопасности проверка доступа выполняется во всех последующих случаях использования дескриптора перед предоставлением доступа. Если проверка доступа запрещает доступ, запрашивающий процесс не может использовать дескриптор для получения доступа к потоку.
Если поток создается в состоянии выполнения (т. е. если флаг CREATE_SUSPENDED не используется), поток может запуститься перед возвратом CreateThread и, в частности, прежде чем вызывающий объект получает дескриптор и идентификатор созданного потока.
Поток создается с приоритетом потока THREAD_PRIORITY_NORMAL. Чтобы получить и задать значение приоритета потока, используйте функции GetThreadPriority и SetThreadPriority.
Когда поток завершается, объект потока достигает сигнального состояния, которое удовлетворяет потокам, ожидающим объекта.
Объект потока остается в системе, пока поток не завершится, и все дескрипторы его закрываются через вызов CloseHandle.
ExitProcess, ExitThread, CreateThread, CreateRemoteThreadThread функции и процесс, который запускается (в результате вызова CreateProcess) сериализуются между собой в процессе. В адресном пространстве одновременно происходит только одно из этих событий. Это означает, что удержание следующих ограничений:
- Во время запуска процесса и подпрограмм инициализации DLL можно создать новые потоки, но они не начинают выполняться до тех пор, пока не будет выполнена инициализация БИБЛИОТЕК DLL для процесса.
- Только один поток в процессе может находиться в инициализации библиотеки DLL или отсоединить подпрограмму одновременно.
- exitProcess возвращается после завершения инициализации библиотеки DLL или отсоединения подпрограмм.
- Он преобразует однопоточные приложения в многопоточные приложения.
- Он изменяет структуру времени и памяти процесса.
- Это приводит к вызову точки входа каждой библиотеки DLL в процессе.
Требования
Требование | Ценность |
---|---|
минимальные поддерживаемые клиентские | Windows 7 [только классические приложения] |
минимальный поддерживаемый сервер | Windows Server 2008 R2 [только классические приложения] |
целевая платформа | Виндоус |
заголовка | processthreadsapi.h (включая Windows.h в Windows Server 2008 Windows Server 2008 R2) |
библиотеки |
Kernel32.lib |
DLL | Kernel32.dll |