IoCreateSystemThread 함수(wdm.h)
IoCreateSystemThread 루틴은 커널 모드에서 실행되는 시스템 스레드를 만들고 스레드에 대한 핸들을 제공합니다.
통사론
NTSTATUS IoCreateSystemThread(
[in, out] PVOID IoObject,
[out] PHANDLE ThreadHandle,
[in] ULONG DesiredAccess,
[in, optional] POBJECT_ATTRIBUTES ObjectAttributes,
[in, optional] HANDLE ProcessHandle,
[out, optional] PCLIENT_ID ClientId,
[in] PKSTART_ROUTINE StartRoutine,
[in, optional] PVOID StartContext
);
매개 변수
[in, out] IoObject
만든 스레드와 연결할 DEVICE_OBJECT 또는 DRIVER_OBJECT 대한 포인터입니다. IoCreateSystemThread 이 개체에 대해 계산된 참조를 사용합니다. I/O 관리자는 나중에 스레드가 종료될 때 이 참조를 해제합니다. 자세한 내용은 비고를 참조하세요.
[out] ThreadHandle
루틴이 만든 스레드에 대한 커널 핸들을 쓰는 변수에 대한 포인터입니다. 핸들이 더 이상 필요하지 않은 경우 드라이버는 ZwClose 루틴을 호출하여 핸들을 닫아야 합니다.
[in] DesiredAccess
호출자가 만든 스레드에 대해 요청하는 액세스 유형을 나타내는 ACCESS_MASK 값입니다.
[in, optional] ObjectAttributes
스레드 개체의 특성을 지정하는 OBJECT_ATTRIBUTES 구조체에 대한 포인터입니다. OBJ_PERMANENT, OBJ_EXCLUSIVE 및 OBJ_OPENIF 특성은 스레드 개체에 유효한 특성이 아닙니다. 호출자가 시스템 프로세스 컨텍스트에서 실행되고 있지 않으면 OBJECT_ATTRIBUTES 구조에서 OBJ_KERNEL_HANDLE 특성을 설정해야 합니다.
[in, optional] ProcessHandle
생성된 스레드가 실행할 주소 공간이 있는 프로세스에 대한 열린 핸들입니다. 호출자의 스레드는 이 프로세스에 대한 PROCESS_CREATE_THREAD 액세스 권한이 있어야 합니다. 이 매개 변수가 NULL 경우 스레드는 초기 시스템 프로세스에서 만들어집니다. 이 매개 변수는 드라이버에서 만든 스레드에 대해 NULL 합니다. Wdm.h 헤더 파일에 정의된 NtCurrentProcess 매크로를 사용하여 현재 프로세스를 지정합니다.
[out, optional] ClientId
루틴이 만든 스레드에 대한 클라이언트 식별자를 쓰는 구조체에 대한 포인터입니다. 이 매개 변수는 드라이버에서 만든 스레드에 대해 NULL 합니다.
[in] StartRoutine
만든 스레드의 진입점인 ThreadStart 루틴에 대한 포인터입니다.
[in, optional] StartContext
만든 스레드가 실행되기 시작할 때 StartContext 매개 변수로 ThreadStart 루틴으로 전달되는 컨텍스트 포인터입니다.
반환 값
IoCreateSystemThread 새 스레드가 성공적으로 만들어진 경우 STATUS_SUCCESS 반환합니다. 가능한 반환 값에는 다음과 같은 오류 상태 코드가 포함됩니다.
반환 코드 | 묘사 |
---|---|
STATUS_INVALID_HANDLE | ProcessHandle 올바른 프로세스 핸들이 아닙니다. |
STATUS_PROCESS_IS_TERMINATING | ProcessHandle 지정한 프로세스가 종료됩니다. |
STATUS_INSUFFICIENT_RESOURCES | 요청된 작업을 수행할 수 있는 시스템 리소스가 부족합니다. |
발언
Windows 8부터 드라이버는 IoCreateSystemThread 호출하여 디바이스 전용 스레드를 만들 수 있습니다. 이 루틴은 TEB(스레드 환경 블록) 또는 사용자 모드 컨텍스트가 없고 커널 모드에서만 실행되는 새 시스템 스레드를 만듭니다.
일반적으로 드라이버는 디바이스를 시작할 때 또는 드라이버의 디스패치Xxx 루틴이 I/O 요청을 수신하기 시작할 때 IoCreateSystemThread 호출합니다. 예를 들어 드라이버는 DispatchXxx 루틴이 비동기 디바이스 제어 요청을 수신할 때 이 루틴을 호출하여 스레드를 만들 수 있습니다.
ProcessHandle 매개 변수가 NULL 경우 생성된 스레드는 시스템 프로세스와 연결됩니다. 이러한 스레드는 시스템이 종료되거나 스레드가 종료될 때까지 계속 실행됩니다.
시스템 프로세스 이외의 프로세스 컨텍스트에서 실행되는 드라이버 루틴은 IoCreateSystemThreadObjectAttributes 매개 변수에 대한 OBJ_KERNEL_HANDLE 특성을 설정해야 합니다. 이 특성은 IoCreateSystemThread 반환된 핸들을 커널 모드에서 실행되는 프로세스로 제한합니다. 그렇지 않으면 드라이버가 실행 중인 컨텍스트의 프로세스에서 스레드 핸들에 액세스할 수 있습니다. 드라이버는 다음 코드 예제와 같이 InitializeObjectAttributes 매크로를 호출하여 개체 특성에 OBJ_KERNEL_HANDLE 특성을 설정할 수 있습니다.
OBJECT_ATTRIBUTES ObjectAttributes;
InitializeObjectAttributes(&ObjectAttributes, NULL, OBJ_KERNEL_HANDLE, NULL, NULL);
IoCreateSystemThreadPsCreateSystemThread 루틴과 유사하지만 호출자의 드라이버 개체 또는 디바이스 개체에 대한 포인터인 IoObject 추가 매개 변수가 있습니다. IoCreateSystemThread 이 매개 변수를 사용하여 만든 스레드가 있는 동안 드라이버가 언로드할 수 없도록 합니다. 이 스레드에서 실행할 StartRoutine 예약하기 전에 IoCreateSystemThreadIoObject 개체에 대한 계산된 참조를 사용합니다. I/O 관리자는 만든 스레드가 종료된 후 이 참조를 해제합니다. 따라서 이 개체는 생성된 스레드의 수명 동안 유지됩니다.
PsCreateSystemThread 루틴에서 만든 시스템 스레드와 달리, IoCreateSystemThread 만든 스레드는 PsTerminateSystemThread 루틴을 호출하여 자체 종료하지 않습니다. 대신 I/O 관리자는 스레드가 종료될 때 생성된 스레드를 대신하여 PsTerminateSystemThread 호출합니다.
요구 사항
요구 | 값 |
---|---|
지원되는 최소 클라이언트 | Windows 8부터 사용할 수 있습니다. |
대상 플랫폼 | 보편적 |
헤더 | wdm.h(Wdm.h, Ntddk.h, Ntifs.h 포함) |
라이브러리 | NtosKrnl.lib |
DLL | NtosKrnl.exe |
IRQL | PASSIVE_LEVEL |