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(스레드 환경 블록) 또는 사용자 모드 컨텍스트가 없고 커널 모드에서만 실행되는 새 시스템 스레드를 만듭니다.
일반적으로 드라이버는 디바이스를 시작할 때 또는 드라이버의Dispatch Xxx 루틴이 I/O 요청을 받기 시작할 때 IoCreateSystemThread를 호출합니다. 예를 들어 디스패치Xxx 루틴이 비동기 디바이스 제어 요청을 수신할 때 드라이버는 이 루틴을 호출하여 스레드를 만들 수 있습니다.
ProcessHandle 매개 변수가 NULL이면 생성된 스레드가 시스템 프로세스와 연결됩니다. 이러한 스레드는 시스템이 종료되거나 스레드가 종료될 때까지 계속 실행됩니다.
시스템 프로세스 이외의 프로세스 컨텍스트에서 실행되는 드라이버 루틴은 IoCreateSystemThread의 ObjectAttributes 매개 변수에 대한 OBJ_KERNEL_HANDLE 특성을 설정해야 합니다. 이 특성은 IoCreateSystemThread 에서 반환된 핸들의 사용을 커널 모드에서 실행되는 프로세스로 제한합니다. 그렇지 않으면 드라이버가 실행 중인 컨텍스트의 프로세스에서 스레드 핸들에 액세스할 수 있습니다. 드라이버는 다음 코드 예제와 같이 InitializeObjectAttributes 매크로를 호출하여 개체 특성에서 OBJ_KERNEL_HANDLE 특성을 설정할 수 있습니다.
OBJECT_ATTRIBUTES ObjectAttributes;
InitializeObjectAttributes(&ObjectAttributes, NULL, OBJ_KERNEL_HANDLE, NULL, NULL);
IoCreateSystemThread 는 PsCreateSystemThread 루틴과 비슷하지만 호출자의 드라이버 개체 또는 디바이스 개체에 대한 포인터인 추가 매개 변수 IoObject가 있습니다. IoCreateSystemThread 는 이 매개 변수를 사용하여 생성된 스레드가 있는 동안 드라이버가 언로드할 수 없도록 합니다. 이 스레드에서 실행되도록 StartRoutine 을 예약하기 전에 IoCreateSystemThread 는 IoObject 개체에 대해 계산된 참조를 사용합니다. 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 |