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_OBJECTDRIVER_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) 或用户模式上下文,并且仅在内核模式下运行。

通常,驱动程序在启动设备或驱动程序的 DispatchXxx 例程开始接收 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);

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)
Library NtosKrnl.lib
DLL NtosKrnl.exe
IRQL PASSIVE_LEVEL

另请参阅

ACCESS_MASK

DEVICE_OBJECT

DRIVER_OBJECT

InitializeObjectAttributes

OBJECT_ATTRIBUTES

PsCreateSystemThread

PsTerminateSystemThread

ThreadStart

ZwClose