控制執行緒和進程
如需偵錯工具引擎中線程和進程的概觀,請參閱 執行緒和進程。
事件發生時,事件執行緒和事件進程會設定為執行緒和處理 (作業系統或發生事件的虛擬) 。 您可以分別使用 GetEventThread 和 GetEventProcess找到它們。
隱含執行緒和進程
在核心模式偵錯中,偵錯工具引擎會使用 隱含進程 來判斷執行虛擬到實體位址轉譯時要使用的虛擬位址空間,例如,在 VirtualToPhysical 和 ReadVirtual方法中。 事件發生時,隱含進程會設定為目前的進程。
您可以使用 SetImplicitProcessDataOffset來變更隱含進程。 若要判斷隱含進程,請使用 GetImplicitProcessDataOffset。
注意 在即時核心偵錯會話期間設定 中斷點 時,偵錯工具引擎會將中斷點的虛擬位址傳遞至目標,而目標會設定中斷點。 在此情況下,只會在處理中斷點時使用目標的進程內容;隱含進程的值無關。
在核心模式偵錯中,偵錯工具引擎會使用 隱含執行緒 來判斷某些目標的 暫存器。 這包括處理器堆疊 (請參閱 GetStackOffset) 、畫面位移 (請參閱 GetFrameOffset) ,以及指令位移 (請參閱 GetInstructionOffset) 。 事件發生時,隱含執行緒會設定為目前的執行緒。
可以使用 SetImplicitThreadDataOffset來變更隱含執行緒。 若要判斷隱含執行緒,請使用 GetImplicitThreadDataOffset。
並非所有暫存器都是由隱含執行緒決定。 當隱含執行緒變更時,某些暫存器會維持不變。
警告 隱含進程和隱含執行緒是獨立的。 如果隱含執行緒不屬於隱含進程,則隱含執行緒的使用者和會話狀態將會位於錯誤的虛擬位址空間中,而且嘗試存取這項資訊會導致錯誤或提供不正確的結果。 存取核心記憶體時不會發生此問題,因為核心記憶體位址在所有虛擬位址空間中都是固定的。 因此,在核心記憶體中之隱含執行緒的資訊可能會與隱含進程無關存取。
執行緒
偵錯工具引擎會使用 引擎執行緒識別碼 來識別每個作業系統執行緒和目標的每個虛擬執行緒。
當目標停止時,每個執行緒也會有相對於其所屬進程的索引。 對於任何進程,進程中第一個執行緒的索引為零,而最後一個執行緒的索引則是進程中的執行緒數目減一。 您可以使用 GetNumberThreads找到目前進程中的執行緒數目。 您可以使用 GetTotalNumberThreads找到目前目標中所有進程的執行緒總數。
您可以使用 GetThreadIdsByIndex,從其索引找到目前進程中一或多個執行緒的引擎執行緒識別碼和系統執行緒識別碼。
引擎會維護有關每個執行緒的數項資訊。 此資訊可能會針對目前的執行緒進行查詢,並可用來尋找執行緒的引擎執行緒識別碼。
僅) (使用者模式偵錯的系統執行緒識別碼
您可以使用 GetCurrentThreadSystemId找到目前線程的系統執行緒識別碼。 針對指定的系統執行緒識別碼,可以使用 GetThreadIdBySystemId找到對應的引擎執行緒識別碼。
執行緒環境區塊 (TEB)
您可以使用 GetCurrentThreadTeb找到目前線程的 TEB 位址。 針對指定的 TEB 位址,可以使用 GetThreadIdByTeb找到對應的引擎執行緒識別碼。 在核心模式偵錯中, (虛擬) 執行緒的 TEB 是發生最後一個事件時,在對應處理器上執行的系統執行緒 TEB。
資料位移
在使用者模式偵錯中, (系統) 執行緒的資料位移是該執行緒的 TEB 位置。 在核心模式中,偵錯 (虛擬) 執行緒的資料位移是發生最後一個事件時,在對應處理器上執行的系統執行緒 KTHREAD 結構。 您可以使用 GetCurrentThreadDataOffset找到目前線程的資料位移。 針對指定的資料位移,可以使用 GetThreadIdByDataOffset找到對應的引擎執行緒識別碼。
系統控制碼
您可以使用 GetCurrentThreadHandle找到目前線程的系統控制碼。 針對指定的系統控制碼,可以使用 GetThreadIdByHandle找到對應的引擎執行緒識別碼。 在核心模式偵錯中,會為每個 (虛擬) 進程建立人工控制碼。 此控制碼只能與偵錯工具引擎 API 查詢搭配使用。
過程
偵錯工具引擎會使用 引擎進程 識別碼來識別每個作業系統進程和目標的每個虛擬進程。
當目標停止時,每個進程都有相對於目標的索引。 目標中第一個進程的索引為零,而最後一個進程的索引則是目標中的進程數目減一。 您可以使用 GetNumberProcesses找到目前目標中的進程數目。
您可以使用 GetProcessIdsByIndex,從其索引中找到目前目標中一或多個執行緒的引擎進程識別碼和系統進程識別碼。
引擎會維護有關每個進程的資訊片段。 此資訊可能會針對目前的進程進行查詢,並可用來尋找進程的引擎進程識別碼。
僅) (使用者模式偵錯的系統進程識別碼
您可以使用 GetCurrentProcessSystemId找到目前進程的系統進程識別碼。 針對指定的系統進程識別碼,可以使用 GetProcessIdBySystemId找到對應的引擎進程識別碼。
進程環境區塊 (PEB)
您可以使用 GetCurrentProcessPeb找到目前進程的 PEB 位址。 針對指定的 PEB 位址,可以使用 GetProcessIdByPeb找到對應的引擎進程識別碼。 在核心模式偵錯中, (虛擬) 進程的 PEB 是發生最後一個事件時執行之系統進程的 PEB。
資料位移
在使用者模式偵錯中, (系統) 進程的資料位移是該程式 PEB 的位置。 在核心模式偵錯中, (虛擬) 進程的資料位移是發生最後一個事件時執行之系統進程的 KPROCESS 結構。 您可以使用 GetCurrentProcessDataOffset找到目前進程的資料位移。 針對指定的資料位移,可以使用 GetProcessIdByDataOffset找到對應的引擎進程識別碼。
系統控制碼
您可以使用 GetCurrentProcessHandle找到目前進程的系統控制碼。 針對指定的系統控制碼,可以使用 GetProcessIdByHandle找到對應的引擎進程識別碼。 在核心模式偵錯中,會為 (虛擬) 進程建立人工控制碼。 此控制碼只能與偵錯工具引擎查詢搭配使用。
事件
在即時使用者模式偵錯中,每當在目標中建立或結束執行緒時,就會產生 create-thread 和 exit-thread 偵錯事件。 這些事件會導致呼叫 IDebugEventCallbacks::CreateThread 和 IDebugEventCallbacks::ExitThread 回呼 方法。
在即時使用者模式偵錯中,每當在目標中建立或結束進程時,就會產生 create-process 和 exit-process 偵錯事件。 這些事件會導致呼叫 IDebugEventCallbacks::CreateProcess 和 IDebugEventCallbacks::ExitProcess 回呼方法。
如需事件的詳細資訊,請參閱 監視事件。
其他資訊
如需執行緒和進程的詳細資訊,包括 TEB、KTHREAD、PEB 和 KPROCESS 結構,請參閱 Microsoft Windows Internals by David 一文和 Mark Russinovich。