[WinDBG 技巧] 列舉所有Handle(控制代碼)以及檢視Handle 資訊
WinDBG的 !handle 命令可以讓你方便除錯控制代碼(handle)。
檢視程序內所有控制代碼, 輸入命令列
0:014> !handle
Handle 4
Type Directory
Handle 8
Type Process
Handle c
Type Key
Handle 10
Type Mutant
Handle 14
Type ALPC Port
Handle 18
Type Key
Handle 1c
Type Event
Handle 20
Type Key
... (省略)
Handle 7e0
Type Mutant
392 Handles
Type Count
None 17
Event 134
Section 47
File 35
Directory 3
Mutant 34
WindowStation 2
Semaphore 24
Key 47
Token 1
Process 3
Thread 27
Desktop 1
IoCompletion 4
Timer 5
Job 1
KeyedEvent 1
TpWorkerFactory 6
從WinDBG輸出結果我們可以看到所有控制代碼的型別和值,以及統計資訊(一共392個handle,其中有35個檔案控制代碼,47個登錄檔控制代碼 .... )。
如果想檢視某個控制代碼的詳細資訊, 可以用命令:
0:014> !handle 0x5c8 f
Handle 5c8
Type Key
Attributes 0
GrantedAccess 0x20019:
ReadControl
QueryValue,EnumSubKey,Notify
HandleCount 2
PointerCount 3
Name /REGISTRY/USER/S-1-5-21-2127521184-1604012920-1887927527-2966534/Software/Microsoft/Windows/CurrentVersion/Explorer/FileExts
Object Specific Information
Key last write time: 16:52:14. 5/20/2009
Key name FileExts
0x5c8 是控制代碼的值, 引數f 表示顯示全部資訊。 我們可以看到控制代碼0x5c8 是登錄檔控制代碼,路徑為/REGISTRY/USER/S-1-5-21-2127521184-1604012920-1887927527-2966534/Software/Microsoft/Windows/CurrentVersion/Explorer/FileExts。
值得一提的是,WinDBG 還提供了!htrace 命令,可以很方便來用檢查控制代碼洩露(Handle Leak), 下次再寫篇blog 專門介紹 !htrace 。