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属性。 此属性将 IoCreateSystemTh read 返回的句柄的使用限制为内核模式下运行的进程。 否则,线程句柄可由运行驱动程序的上下文的进程访问。 驱动程序可以调用 InitializeObjectAttributes 宏来设置对象属性中的OBJ_KERNEL_HANDLE属性,如以下代码示例所示。

OBJECT_ATTRIBUTES ObjectAttributes;

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

IoCreateSystemThread 类似于 PsCreateSystemThread 例程,但还有一个附加参数,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

另请参阅

ACCESS_MASK

DEVICE_OBJECT

DRIVER_OBJECT

InitializeObjectAttributes

OBJECT_ATTRIBUTES

PsCreateSystemThread

PsTerminateSystemThread

ThreadStart

ZwClose