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。 使用 NtCurrentProcess 巨集,定義於 Wdm.h 頭檔中,以指定目前的進程。
[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) 或使用者模式內容的新系統線程,而且只會在核心模式中執行。
一般而言,驅動程式會在啟動裝置時或驅動程式 分派Xxx 例程開始接收 I/O 要求時,呼叫 IoCreateSystemThread。 例如,當 DispatchXxx 例程收到異步裝置控制要求時,驅動程式可能會呼叫此例程來建立線程。
如果 ProcessHandle 參數 NULL,則建立的線程會與系統進程相關聯。 這類線程會繼續執行,直到系統關閉或線程結束為止。
在系統進程以外的進程內容中執行的驅動程式例程,必須設定 ObjectAttributes 參數的 OBJ_KERNEL_HANDLE 屬性,IoCreateSystemThread。 這個屬性會限制使用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 開始提供。 |
目標平臺 | 普遍 |
標頭 | wdm.h (包括 Wdm.h、Ntddk.h、Ntifs.h) |
連結庫 | NtosKrnl.lib |
DLL | NtosKrnl.exe |
IRQL | PASSIVE_LEVEL |