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)或用户模式上下文,并且仅在内核模式下运行。
通常,驱动程序在启动设备时或驱动程序的 DispatchXxx 例程开始接收 I/O 请求时,IoCreateSystemThread 调用。 例如,当 DispatchXxx 例程收到异步设备控制请求时,驱动程序可能会调用此例程来创建线程。
如果 ProcessHandle 参数 NULL,则创建的线程与系统进程相关联。 此类线程将继续运行,直到系统关闭或线程退出。
在系统进程以外的进程上下文中运行的驱动程序例程必须为 IoCreateSystemThread的 ObjectAttributes 参数设置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 在此线程中运行之前,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 |