PsCreateSystemThread 함수(wdm.h)

PsCreateSystemThread 루틴은 커널 모드에서 실행되고 스레드에 대한 핸들을 반환하는 시스템 스레드를 만듭니다.

구문

NTSTATUS PsCreateSystemThread(
  [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
);

매개 변수

[out] ThreadHandle

핸들을 받을 변수를 가리킵니다. 핸들이 더 이상 사용되지 않는 경우 드라이버는 ZwClose 를 사용하여 핸들을 닫아야 합니다. 이 핸들은 Windows Vista 이상 버전의 Windows에 대한 커널 핸들입니다. 이전 버전의 Windows에서는 핸들이 커널 핸들이 아닐 수 있습니다.

[in] DesiredAccess

생성된 스레드에 대한 요청된 액세스 유형을 나타내는 ACCESS_MASK 값을 지정합니다.

[in, optional] ObjectAttributes

개체의 특성을 지정하는 구조를 가리킵니다. OBJ_PERMANENT, OBJ_EXCLUSIVE 및 OBJ_OPENIF 스레드 개체에 대한 유효한 특성이 아닙니다. Windows XP 이상 버전의 Windows에서 호출자가 시스템 프로세스 컨텍스트에서 실행되고 있지 않으면 ObjectAttributes에 대한 OBJ_KERNEL_HANDLE 특성을 설정해야 합니다. Microsoft Windows 2000 및 Windows 98/Me용 드라이버는 시스템 프로세스 컨텍스트에서 PsCreateSystemThread 만 호출해야 합니다. Windows Vista 이상 버전의 Windows에서는 핸들이 커널 핸들이 됩니다.

[in, optional] ProcessHandle

스레드를 실행할 주소 공간의 프로세스에 대한 열린 핸들을 지정합니다. 호출자의 스레드는 이 프로세스에 대한 PROCESS_CREATE_THREAD 액세스 권한이 있어야 합니다. 이 매개 변수를 제공하지 않으면 스레드가 초기 시스템 프로세스에서 만들어집니다. 드라이버에서 만든 스레드의 경우 이 값은 NULL 이어야 합니다. Ntddk.h에 정의된 NtCurrentProcess 매크로를 사용하여 현재 프로세스를 지정합니다.

[out, optional] ClientId

새 스레드의 클라이언트 식별자를 받는 구조를 가리킵니다. 드라이버에서 만든 스레드의 경우 이 값은 NULL 이어야 합니다.

[in] StartRoutine

새로 만든 시스템 스레드의 진입점입니다. 이 매개 변수는 호출자가 제공하는 StartContext 매개 변수 값인 단일 인수를 수신하는 ThreadStart 루틴에 대한 함수 포인터입니다.

[in, optional] StartContext

실행을 시작할 때 스레드에 전달되는 단일 인수를 제공합니다.

반환 값

스레드가 만들어진 경우 PsCreateSystemThread 는 STATUS_SUCCESS 반환합니다.

설명

디바이스 전용 스레드를 만드는 드라이버는 초기화할 때 또는 I/O 요청이 이러한 드라이버의 Dispatch 루틴에 들어오기 시작할 때 이 루틴을 호출합니다. 예를 들어 드라이버는 비동기 디바이스 제어 요청을 받을 때 이러한 스레드를 만들 수 있습니다.

PsCreateSystemThread 는 시스템 내에서 별도의 실행 스레드를 시작하는 커널 모드 스레드를 만듭니다. 이러한 시스템 스레드는 TEB 또는 사용자 모드 컨텍스트가 없으며 커널 모드에서만 실행됩니다.

입력 ProcessHandleNULL이면 생성된 스레드가 시스템 프로세스와 연결됩니다. 이러한 스레드는 시스템이 종료되거나 스레드가 PsTerminateSystemThread를 호출하여 자체 종료될 때까지 계속 실행됩니다.

시스템 프로세스 이외의 프로세스 컨텍스트에서 실행되는 드라이버 루틴은 PsCreateSystemThreadObjectAttributes 매개 변수에 대한 OBJ_KERNEL_HANDLE 특성을 설정해야 합니다. 이렇게 하면 PsCreateSystemThread 에서 반환된 핸들의 사용이 커널 모드에서 실행되는 프로세스로 제한됩니다. 그렇지 않으면 드라이버가 실행 중인 컨텍스트의 프로세스에서 스레드 핸들에 액세스할 수 있습니다. 드라이버는 다음과 같이 OBJ_KERNEL_HANDLE 특성을 설정할 수 있습니다.

InitializeObjectAttributes(&ObjectAttributes, NULL, OBJ_KERNEL_HANDLE, NULL, NULL);

StartContext 매개 변수에 대한 자세한 내용은 ThreadStart를 참조하세요.

새로 만든 시스템 스레드는 일반 커널 APC 가 사용하지 않도록 설정된 중요한 지역 내의 PASSIVE_LEVEL 실행됩니다.

요구 사항

요구 사항
대상 플랫폼 유니버설
헤더 wdm.h(Wdm.h, Ntddk.h, Ntifs.h 포함)
라이브러리 NtosKrnl.lib
DLL NtosKrnl.exe
IRQL PASSIVE_LEVEL
DDI 규정 준수 규칙 HwStorPortProhibitedDDIs(storport), IrqlPsPassive(wdm)

추가 정보

InitializeObjectAttributes

KeSetBasePriorityThread

KeSetPriorityThread

PsTerminateSystemThread

Threadstart

ZwSetInformationThread