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_WRITEPROCESS_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

스레드 만들기를 제어하는 플래그입니다.

의미
0
스레드는 만든 직후에 실행됩니다.
CREATE_SUSPENDED
0x00000004
스레드는 일시 중단된 상태로 만들어지고 ResumeThread 함수가 호출될 때까지 실행되지 않습니다.
STACK_SIZE_PARAM_IS_A_RESERVATION
0x00010000
dwStackSize 매개 변수는 스택의 초기 예약 크기를 지정합니다. 이 플래그를 지정하지 않으면 dwStackSize 는 커밋 크기를 지정합니다.

[out] lpThreadId

스레드 식별자를 수신하는 변수에 대한 포인터입니다.

이 매개 변수가 NULL이면 스레드 식별자가 반환되지 않습니다.

반환 값

함수가 성공하면 반환 값은 새 스레드에 대한 핸들입니다.

함수가 실패하면 반환 값은 NULL입니다. 확장 오류 정보를 가져오려면 GetLastError를 호출합니다.

lpStartAddress가 데이터, 코드를 가리키거나 액세스할 수 없는 경우에도 CreateRemoteThread가 성공할 수 있습니다. 스레드가 실행되면 시작 주소가 유효하지 않으면 예외가 발생하고 스레드가 종료됩니다. 잘못된 시작 주소로 인한 스레드 종료는 스레드 프로세스에 대한 오류 종료로 처리됩니다. 이 동작은 유효하지 않거나 누락된 DLL(동적 연결 라이브러리)을 참조하더라도 프로세스가 만들어지는 CreateProcess의 비동기 특성과 유사합니다.

설명

CreateRemoteThread 함수를 사용하면 지정된 프로세스의 주소 공간에서 새 실행 스레드가 시작됩니다. 스레드는 프로세스가 열리는 모든 개체에 액세스할 수 있습니다.

Windows 8 전에 터미널 서비스는 각 터미널 세션을 의도적으로 격리합니다. 따라서 대상 프로세스가 호출 프로세스와 다른 세션에 있는 경우 CreateRemoteThread 가 실패합니다.

새 스레드 핸들은 새 스레드에 대한 모든 권한으로 만들어집니다. 보안 설명자가 제공되지 않으면 스레드 개체 핸들이 필요한 모든 함수에서 핸들을 사용할 수 있습니다. 보안 설명자가 제공되면 액세스 권한이 부여되기 전에 핸들의 모든 후속 사용에 대해 액세스 검사 수행됩니다. 액세스 검사 액세스를 거부하는 경우 요청 프로세스는 핸들을 사용하여 스레드에 대한 액세스 권한을 얻을 수 없습니다.

스레드가 실행 가능한 상태로 만들어진 경우(즉, CREATE_SUSPENDED 플래그를 사용하지 않는 경우) 스레드는 CreateThread 가 반환되기 전에, 특히 호출자가 생성된 스레드의 핸들과 식별자를 받기 전에 실행을 시작할 수 있습니다.

스레드는 THREAD_PRIORITY_NORMAL 스레드 우선 순위로 만들어집니다. GetThreadPrioritySetThreadPriority 함수를 사용하여 스레드의 우선 순위 값을 가져와서 설정합니다.

스레드가 종료되면 스레드 개체는 신호 상태가 되며, 이 상태는 개체를 기다리는 스레드를 충족합니다.

스레드 개체는 스레드가 종료되고 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

참고 항목

CloseHandle

CreateProcess

CreateRemoteThreadEx

CreateThread

ExitProcess

ExitThread

GetThreadPriority

프로세스 및 스레드 함수

ResumeThread

SECURITY_ATTRIBUTES

SetThreadPriority

ThreadProc

스레드