!清單
!list 延伸模組會針對連結清單中的每個元素重複執行指定的調試程式命令一次。
!list -t [Module!]Type.Field -x "Commands" [-a "Arguments"] [Options] StartAddress
!list " -t [Module!]Type.Field -x \"Commands\" [-a \"Arguments\"] [Options] StartAddress "
!list -h
參數
模組
選擇性參數,指定定義此結構的模組。 如果 Type 有可能符合不同模組中的有效符號,您應該包含 Module 來消除模棱兩可。
類型
指定數據結構的名稱。
田
指定包含清單連結的欄位。 這實際上可以是以句號分隔的字段序列(換句話說, Type.Field.Subfield.Subsubfield 等等)。
-x ”命令」
指定要執行的命令。 這可以是調試程式命令的任何組合。 它必須以引弧括住。 如果指定了多個命令,請以分號分隔它們、以引號括住 !list 自變數的整個集合,並在這些外部引號內的每個引號之前使用逸出字元 ( \ )。 如果省略命令,預設值為 dp (顯示記憶體)。
-a ”自變數」
指定要傳遞至 Commands 參數的自變數。 這必須以引弧括住。 自變數可以是通常允許遵循此命令的任何有效自變數字串,但 Arguments 不能包含引號。 如果命令中包含虛擬緩存器$extret,則可以省略 -a “Arguments” 參數。
選項 可以是下列任何數目的選項:
-e
回應針對每個專案執行的命令。
-m Max
指定要執行命令的元素數目上限。
StartAddress
指定第一個數據結構的位址。 這是結構頂端的位址,不一定是連結欄位的位址。
-h
在 [調試程式命令] 視窗中顯示此延伸模組的簡短說明文字。
DLL
Ext.dll
備註
!list 延伸模組會逐一查看連結清單,並針對每個清單元素發出一次指定的命令。
虛擬緩存 器$extret 會設定為每個清單項目的清單專案位址值。 針對每個元素,會執行命令字串 Commands 。 此命令字串可以使用 $extret 語法來參考這個虛擬緩存器。 如果此命令字串中未出現,執行之前,清單專案位址的值會附加至命令字串的結尾。 如果您需要指定此命令中應該顯示此值的位置,您必須明確指定這個虛擬緩存器。
此命令順序會執行,直到清單在 Null 指標中終止,或藉由迴圈回到第一個專案來終止為止。 如果清單迴圈回到稍後的專案,此命令將不會停止。 不過,您可以隨時在 KD 和 CDB 中使用 CTRL+C 或 偵錯來停止此命令 |在 WinDbg 中中斷 或 CTRL+BREAK。
每次執行命令時,如果使用的命令具有選擇性的地址參數,則目前結構的位址將會作為 預設位址 。
以下是如何在使用者模式中使用此命令的兩個範例。 請注意,您也可以使用核心模式,但遵循不同的語法。
簡單範例假設您有一個結構,其類型名稱為 MYTYPE,且其 .links 中有 連結。Flink 和 .links。閃爍 欄位。 您有連結清單,其開頭為 結構0x6BC000。 下列延伸模組命令會逐一查看清單,而且每個元素都會執行 dd L2 命令。 由於未將位址指定給 dd 命令,因此會將清單標頭的地址視為所需的位址。 這會導致每個結構中的前兩個 DWORD 顯示。
0:000> !list -t MYTYPE.links.Flink -x "dd" -a "L2" 0x6bc00
以更複雜的範例為例,請考慮使用 $extret 的情況。 它會遵循 RtlCriticalSectionList _LIST_ENTRY類型的清單。 針對每個元素,它會顯示前四個 DWORDS,然後顯示位於清單專案 Flink 元素前八個字節位移的_RTL_CRITICAL_SECTION_DEBUG結構。
0:000> !list "-t ntdll!_LIST_ENTRY.Flink -e -x \"dd @$extret l4; dt ntdll!_RTL_CRITICAL_SECTION_DEBUG @$extret-0x8\" ntdll!RtlCriticalSectionList"
dd @$extret l4; dt ntdll!_RTL_CRITICAL_SECTION_DEBUG @$extret-0x8
7c97c0c8 7c97c428 7c97c868 01010000 00000080
+0x000 Type : 1
+0x002 CreatorBackTraceIndex : 0
+0x004 CriticalSection : (null)
+0x008 ProcessLocksList : _LIST_ENTRY [ 0x7c97c428 - 0x7c97c868 ]
+0x010 EntryCount : 0x1010000
+0x014 ContentionCount : 0x80
+0x018 Spare : [2] 0x7c97c100
dd @$extret l4; dt ntdll!_RTL_CRITICAL_SECTION_DEBUG @$extret-0x8
7c97c428 7c97c448 7c97c0c8 00000000 00000000
+0x000 Type : 0
+0x002 CreatorBackTraceIndex : 0
+0x004 CriticalSection : 0x7c97c0a0
+0x008 ProcessLocksList : _LIST_ENTRY [ 0x7c97c448 - 0x7c97c0c8 ]
+0x010 EntryCount : 0
+0x014 ContentionCount : 0
+0x018 Spare : [2] 0