!list

!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 "Commands"
指定要执行的命令。 这可以是调试器命令的任意组合。 必须用引号引起来。 如果指定了多个命令,请用分号分隔它们,并将 !list 参数的整个集合用引号括起来,并在这些外引号内的每个引号前使用转义符(\)。 如果省略 Commands,则默认值为 dp(显示内存)

-a "Arguments"
指定要传递到 Commands 参数的参数。 该值必须用引号引起来。 Arguments 可以是通常允许遵循此命令的任何有效参数字符串,但 Arguments 不能包含引号。 如果 Commands 中包含伪寄存器 $extret,则可以省略 -a "Arguments" 参数。

Options 可以是以下任意数量的选项:

-e
回显要为每个元素执行的命令。

-mMax
指定要为其执行命令的最大元素数。

StartAddress
指定第一个数据结构的地址。 这是结构顶部的地址,不一定是链接字段的地址。

-h
在“调试器命令”窗口中显示此扩展的一些简短帮助文本。

DLL

Ext.dll

注解

!list 扩展将浏览链接列表,并为每个列表元素发出指定的命令一次。

伪寄存器 $extret 设置为每个列表元素的列表条目地址的值。 对于每个元素,将执行命令字符串 Commands。 此命令字符串可以使用 $extret 语法引用此伪寄存器。 如果未出现在命令字符串中,则在执行之前,列表条目地址的值将追加到命令字符串的末尾。 如果需要指定该值在命令中的出现位置,则必须显式指定此伪寄存器。

此命令序列将一直运行,直到列表以 null 指针终止,或者通过循环回到第一个元素而终止。 如果列表循环回到后面的元素,则此命令不会停止。 但是,可以随时通过在 KD 和 CDB 中使用 CTRL+C 或在 WinDbg 中使用 Debug | Break 后 CTRL+BREAK 来停止此命令。

每次执行命令时,如果使用的命令具有可选的地址参数,则当前结构的地址将用作默认地址

以下是如何在用户模式下使用此命令的两个示例。 请注意:内核模式也可以使用,但要遵循不同的语法。

举一个简单的例子,假设有一个结构,其类型名称为 MYTYPE,并且在其 .links.Flink 字段和 .links.Blink 字段中有链接。 有一个从 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