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 或用户模式上下文,并且仅在内核模式下运行。
如果输入 ProcessHandle 为 NULL,则创建的线程与系统进程相关联。 此类线程将继续运行,直到系统关闭或线程通过调用 PsTerminateSystemThread 终止自身。
在非系统进程上下文中运行的驱动程序例程必须为 PsCreateSystemThread 的 ObjectAttributes 参数设置 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) |