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
lpStartAddress가 데이터, 코드를 가리키거나 액세스할 수 없는 경우에도 CreateRemoteThread 성공할 있습니다. 스레드가 실행되면 시작 주소가 유효하지 않으면 예외가 발생하고 스레드가 종료됩니다. 잘못된 시작 주소로 인한 스레드 종료는 스레드 프로세스에 대한 오류 종료로 처리됩니다. 이 동작은 CreateProcess비동기 특성과 유사합니다. 여기서 프로세스는 유효하지 않거나 누락된 DLL(동적 연결 라이브러리)을 참조하더라도 만들어집니다.
발언
CreateRemoteThread 함수를 사용하면 지정된 프로세스의 주소 공간에서 새 실행 스레드가 시작됩니다. 스레드는 프로세스가 열리는 모든 개체에 액세스할 수 있습니다.
Windows 8 이전의 터미널 서비스는 각 터미널 세션을 설계에 따라 격리합니다. 따라서 대상 프로세스가 호출 프로세스와 다른 세션에 있는 경우 createRemoteThread
새 스레드 핸들은 새 스레드에 대한 모든 액세스 권한으로 만들어집니다. 보안 설명자가 제공되지 않으면 스레드 개체 핸들이 필요한 모든 함수에서 핸들을 사용할 수 있습니다. 보안 설명자가 제공되면 액세스 권한이 부여되기 전에 핸들의 모든 후속 사용에 대해 액세스 검사가 수행됩니다. 액세스 확인에서 액세스를 거부하는 경우 요청 프로세스는 핸들을 사용하여 스레드에 액세스할 수 없습니다.
스레드가 실행 가능한 상태로 만들어지는 경우(즉,
스레드는 스레드 우선 순위가 THREAD_PRIORITY_NORMAL. GetThreadPriority 및 SetThreadPriority 함수를 사용하여 스레드의 우선 순위 값을 가져와서 설정합니다.
스레드가 종료되면 스레드 개체는 개체를 기다리는 스레드를 충족하는 신호 상태가 됩니다.
스레드 개체는 스레드가 종료되고 CloseHandle호출을 통해 스레드 개체에 대한 모든 핸들이 닫히기 전까지 시스템에 남아 있습니다.
- 프로세스 시작 및 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 |
참고 항목
closeHandle
CreateProcess
CreateRemoteThreadEx
CreateThread
GetThreadPriority
프로세스 및 스레드 함수
setThreadPriority
ThreadProc