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 上執行原生 Linux ELF64 二進位檔,以及其他 Windows 應用程式。 如需執行二進位檔所需的 WSL 架構和使用者模式和核心模式元件的相關資訊,請參閱Windows 子系統 Linux 版部落格上的文章。
其中一個元件是裝載未修改使用者模式 Linux 二進位檔的 子系統程式 ,例如 /bin/bash。 子系統進程不包含與 Win32 進程相關聯的資料結構,例如進程環境區塊 (PEB) 和執行緒環境區塊 (TEB) 。 針對子系統程式,系統會將系統呼叫和使用者模式例外狀況分派給配對的驅動程式。
以下是 處理和執行緒管理員常式 的變更,以支援子系統進程:
- WSL 類型是以SUBSYSTEM_INFORMATION_TYPE列舉中的SubsystemInformationTypeWSL值表示。 驅動程式可以呼叫 NtQueryInformationProcess 和 NtQueryInformationThread 來判斷基礎子系統。 這些呼叫會傳回 適用于 WSL 的 SubsystemInformationTypeWSL 。
- 其他核心模式驅動程式可以透過 PsSetCreateProcessNotifyRoutineEx2 呼叫註冊其回呼常式,以取得子系統進程建立/刪除的通知。 若要取得執行緒建立/刪除的相關通知,驅動程式可以呼叫 PsSetCreateThreadNotifyRoutineEx,並將 PsCreateThreadNotifySubsystems 指定為通知的類型。
- PS_CREATE_NOTIFY_INFO結構已擴充為包含IsSubsystemProcess成員,指出 Win32 以外的子系統。 FileObject、ImageFileName、CommandLine等其他成員會指出子系統程式的其他資訊。 如需這些成員行為的相關資訊,請參閱 SUBSYSTEM_INFORMATION_TYPE。