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: 스레드에 대한 기본 보안 설명자의 ACL은 작성자의 기본 또는 가장 토큰에서 가져옵니다. 이 동작은 WINDOWS XP SP2 및 Windows Server 2003에서 변경되었습니다.
[in] dwStackSize
스택의 초기 크기(바이트)입니다. 시스템은 이 값을 가장 가까운 페이지로 반올림합니다. 이 매개 변수가 0인 경우 새 스레드는 실행 파일의 기본 크기를 사용합니다. 자세한 내용은 스레드 스택 크기를 참조하세요.
[in] lpStartAddress
스레드에서 실행할 LPTHREAD_START_ROUTINE 형식의 애플리케이션 정의 함수에 대한 포인터이며 원격 프로세스에서 스레드의 시작 주소를 나타냅니다. 함수는 원격 프로세스에 있어야 합니다. 자세한 내용은 ThreadProc을 참조하세요.
[in] lpParameter
스레드 함수에 전달할 변수에 대한 포인터입니다.
[in] dwCreationFlags
스레드 만들기를 제어하는 플래그입니다.
값 | 의미 |
---|---|
|
스레드는 만든 직후에 실행됩니다. |
|
스레드는 일시 중단된 상태로 만들어지고 ResumeThread 함수가 호출될 때까지 실행되지 않습니다. |
|
dwStackSize 매개 변수는 스택의 초기 예약 크기를 지정합니다. 이 플래그를 지정하지 않으면 dwStackSize 는 커밋 크기를 지정합니다. |
[out] lpThreadId
스레드 식별자를 수신하는 변수에 대한 포인터입니다.
이 매개 변수가 NULL이면 스레드 식별자가 반환되지 않습니다.
반환 값
함수가 성공하면 반환 값은 새 스레드에 대한 핸들입니다.
함수가 실패하면 반환 값은 NULL입니다. 확장 오류 정보를 가져오려면 GetLastError를 호출합니다.
lpStartAddress가 데이터, 코드를 가리키거나 액세스할 수 없는 경우에도 CreateRemoteThread가 성공할 수 있습니다. 스레드가 실행되면 시작 주소가 유효하지 않으면 예외가 발생하고 스레드가 종료됩니다. 잘못된 시작 주소로 인한 스레드 종료는 스레드 프로세스에 대한 오류 종료로 처리됩니다. 이 동작은 유효하지 않거나 누락된 DLL(동적 연결 라이브러리)을 참조하더라도 프로세스가 만들어지는 CreateProcess의 비동기 특성과 유사합니다.
설명
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 XP [데스크톱 앱만 해당] |
지원되는 최소 서버 | Windows Server 2003 [데스크톱 앱만 해당] |
대상 플랫폼 | Windows |
헤더 | processthreadsapi.h(Windows Server 2003, Windows Vista, Windows 7, Windows Server 2008 Windows Server 2008 R2에 Windows.h 포함) |
라이브러리 | Kernel32.lib |
DLL | Kernel32.dll |