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 매개 변수는 스택의 초기 예약 크기를 지정합니다. 이 플래그를 지정하지 않으면 dwStackSize 는 커밋 크기를 지정합니다. |
[in, optional] lpAttributeList
새 스레드에 대한 추가 매개 변수를 포함하는 특성 목록입니다. 이 목록은 InitializeProcThreadAttributeList 함수에 의해 만들어집니다.
[out, optional] lpThreadId
스레드 식별자를 수신하는 변수에 대한 포인터입니다.
이 매개 변수가 NULL이면 스레드 식별자가 반환되지 않습니다.
반환 값
함수가 성공하면 반환 값은 새 스레드에 대한 핸들입니다.
함수가 실패하면 반환 값은 NULL입니다. 확장 오류 정보를 가져오려면 GetLastError를 호출합니다.
설명
CreateRemoteThreadEx 함수를 사용하면 지정된 프로세스의 주소 공간에서 새 실행 스레드가 시작됩니다. 스레드는 프로세스가 열리는 모든 개체에 액세스할 수 있습니다. lpAttribute 매개 변수를 사용하여 새 스레드에 대한 프로세서 그룹 선호도와 같은 확장 특성을 지정할 수 있습니다. lpAttribute가 NULL인 경우 함수의 동작은 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 7 [데스크톱 앱만 해당] |
지원되는 최소 서버 | Windows Server 2008 R2 [데스크톱 앱만 해당] |
대상 플랫폼 | Windows |
헤더 | processthreadsapi.h(Windows Server 2008 Windows Server 2008 R2에 Windows.h 포함) |
라이브러리 | Kernel32.lib |
DLL | Kernel32.dll |