다음을 통해 공유


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

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

의미
0
스레드는 만든 직후에 실행됩니다.
CREATE_SUSPENDED
0x00000004
스레드는 일시 중단된 상태로 만들어지고 ResumeThread 함수가 호출될 때까지 실행되지 않습니다.
STACK_SIZE_PARAM_IS_A_RESERVATION
0x00010000
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 스레드 우선 순위로 만들어집니다. 스레드의 우선 순위 값을 가져와서 설정하려면 GetThreadPrioritySetThreadPriority 함수를 사용합니다.

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

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

참고 항목

CreateRemoteThread