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

新创建的系统线程的入口点。 此参数是指向 ThreadStart 例程的函数指针,该例程接收单个参数,该参数是调用方提供的 StartContext 参数值。

[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

新创建的系统线程在关键区域内PASSIVE_LEVEL运行,并禁用 了正常的内核 APC

要求

要求
目标平台 通用
标头 wdm.h(包括 Wdm.h、Ntddk.h、Ntifs.h)
Library NtosKrnl.lib
DLL NtosKrnl.exe
IRQL PASSIVE_LEVEL
DDI 符合性规则 HwStorPortProhibitedDDI (storport) IrqlPsPassive (wdm)

另请参阅

InitializeObjectAttributes

KeSetBasePriorityThread

KeSetPriorityThread

PsTerminateSystemThread

ThreadStart

ZwSetInformationThread