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. 스레드의 우선 순위 값을 가져와서 설정하려면
스레드가 종료되면 스레드 개체는 개체를 기다리는 스레드를 충족하는 신호 상태가 됩니다.
스레드 개체는 스레드가 종료되고 CloseHandle호출을 통해 스레드 개체에 대한 모든 핸들이 닫히기 전까지 시스템에 남아 있습니다.
- 프로세스 시작 및 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