共用方式為


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。 可能的傳回值包括下列錯誤狀態代碼。

傳回碼 Description
STATUS_INVALID_HANDLE ProcessHandle 不是有效的進程句柄。
STATUS_PROCESS_IS_TERMINATING ProcessHandle 指定的進程正在終止。
STATUS_INSUFFICIENT_RESOURCES 系統資源不足,無法執行要求的作業。

備註

從 Windows 8 開始,驅動程式可以呼叫IoCreateSystemThread來建立裝置專用線程。 此例程會建立新的系統線程,該線程沒有線程環境區塊 (TEB) 或使用者模式內容,而且只會在核心模式中執行。

一般而言,驅動程式會在啟動裝置時呼叫 IoCreateSystemThread ,或驅動程式的 DispatchXxx例程開始接收I/O要求時呼叫。 例如,當 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 開始提供。
目標平台 Universal
標頭 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