Windows Kernel-Mode 進程和線程管理員
程式是目前在 Windows 中執行的軟體程式。 每個進程都有一個標識碼,一個識別它的數位。 線程是物件,可識別程序執行中的哪個部分。 每個線程都有一個標識碼,一個識別它的數位。
進程可能有多個線程。 線程的目的是要配置處理器時間。 在具有一個處理器的計算機上,可以配置多個線程,但一次只能執行一個線程。 每個線程只會執行一小段時間,然後執行會傳遞至下一個線程,讓使用者錯覺一次發生一個以上的事情。 在具有多個處理器的計算機上,可以進行真正的多線程處理。 如果應用程式有多個線程,線程可以在不同的處理器上同時執行。
Windows 核心模式進程和線程管理員會處理進程中所有線程的執行。 無論您有一個處理器或更多處理器,都必須在驅動程式程式設計中非常小心,以確保進程的所有線程都經過設計,以便無論線程處理的順序為何,您的驅動程式都會正常運作。
如果來自不同進程的線程嘗試同時使用相同的資源,可能會發生問題。 Windows 提供數種避免此問題的技術。 確保來自不同進程的線程不會碰到相同資源的技術稱為 同步處理。 如需同步處理的詳細資訊,請參閱 同步處理技術。
提供進程和線程管理員直接介面的例程通常前面會加上字母 「Ps」;例如 ,PsCreateSystemThread。 如需核心 DIS 的清單,請參閱 Windows 核心。
實作進程和線程相關回呼函式的最佳做法
這組指導方針適用於下列回呼例程:
PCREATE_PROCESS_NOTIFY_ROUTINE
PCREATE_PROCESS_NOTIFY_ROUTINE_EX
- 讓例程保持簡短且簡單。
- 請勿呼叫使用者模式服務來驗證進程、線程或映像。
- 請勿進行登錄呼叫。
- 請勿進行封鎖和/或進程間通訊 (IPC) 函式呼叫。
- 請勿與其他線程同步,因為它可能會導致重新進入死結。
- 使用 系統工作執行緒 將工作排入佇列,尤其是涉及以下工作的任務:
- 慢速 API 或呼叫其他程序的 API。
- 任何可能會中斷核心服務中線程的封鎖行為。
- 如果您使用系統工作執行緒,請不要等待工作完成。 這樣做會違背將工作排入佇列以異步方式完成的目的。
- 請考慮核心模式堆疊使用的最佳實踐。 如需範例,請參閱如何讓驅動程式無法耗盡核心模式堆棧?和主要驅動程式概念和秘訣。
子系統進程
從 Windows 10 開始,Windows 子系統 Linux 版 (WSL) 可讓使用者與其他 Windows 應用程式一起在 Windows 上執行原生 Linux ELF64 二進制檔。 如需執行二進位檔所需的 WSL 架構和使用者模式和核心模式元件的相關信息,請參閱 適用於 Linux 的 Windows 子系統 部落格上的文章。
其中一個元件是 一個子系統進程 ,裝載未修改的使用者模式Linux二進位檔,例如 /bin/bash。 子系統進程不包含與 Win32 進程相關聯的數據結構,例如進程環境區塊 (PEB) 和線程環境區塊 (TEB)。 針對子系統進程,系統會將系統呼叫和使用者模式例外狀況分派至配對的驅動程式。
以下是 進程和線程管理員例程 的變更,以支援子系統進程:
- WSL 類型是由 SUBSYSTEM_INFORMATION_TYPE 列舉中的 SubsystemInformationTypeWSL 值表示。 驅動程式可以呼叫 NtQueryInformationProcess 和 NtQueryInformationThread 來判斷基礎子系統。 這些呼叫會傳回 SubsystemInformationTypeWSL(WSL)。
- 其他核心模式驅動程式可以透過 PsSetCreateProcessNotifyRoutineEx2 呼叫註冊其回呼例程,以取得子系統進程建立/刪除的相關通知。 若要取得線程建立/刪除的相關通知,驅動程式可以呼叫 PsSetCreateThreadNotifyRoutineEx,並將 PsCreateThreadNotifySubsystems 指定為通知的類型。
- PS_CREATE_NOTIFY_INFO 結構已擴充為包含IsSubsystemProcess成員,指出 Win32 以外的子系統。 FileObject、ImageFileName、CommandLine 等其他成員會指出子系統程式的其他資訊。 如需這些成員行為的相關信息,請參閱 SUBSYSTEM_INFORMATION_TYPE。