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 。 使用 NtCurrentProcess 宏,定義於 Ntddk.h 中,以指定目前的進程。

[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

新建立的系統線程會在已停用 一般核心 APC 的重要區域中PASSIVE_LEVEL執行。

規格需求

需求
目標平台 Universal
標頭 wdm.h (包括 Wdm.h、Ntddk.h、Ntifs.h)
程式庫 NtosKrnl.lib
Dll NtosKrnl.exe
IRQL PASSIVE_LEVEL
DDI 合規性規則 HwStorPortProhibitedDIS (storport) IrqlPsPassive (wdm)

另請參閱

InitializeObjectAttributes

KeSetBasePriorityThread

KeSetPriorityThread

PsTerminateSystemThread

ThreadStart

ZwSetInformationThread