cc682/NetRoc
http://netroc682.spaces.live.com/
!qlocks
!qlocks 扩展用于显示所有排队的自旋锁(queued spin lock)的状态。
语法
!qlocks
DLL
Windows NT 4.0
|
不可用
|
Windows 2000
|
Kdextx86.dll
|
Windows XP和之后
|
Kdexts.dll
|
注释
该命令仅在多处理器系统上有用。
下面是一个示例:
0: kd> !qlocks
Key: O = Owner, 1-n = Wait order, blank = not owned/waiting, C = Corrupt
Processor Number
Lock Name 0 1 2 3
KE - Dispatcher
KE - Unused Spare
MM - PFN
MM - System Space
CC - Vacb
CC - Master
EX - NonPagedPool
IO - Cancel
EX - WorkQueue
IO - Vpb
IO - Database
IO - Completion
NTFS - Struct
AFD - WorkQueue
CC - Bcb
MM - MM NonPagedPool
附加信息
关于自旋锁的信息,查看Windows Driver Kit (WDK) 文档,以及Mark Russinovich 和David Solomon 编写的Microsoft Windows Internals。
!ready
!ready 扩展命令显示系统中READY状态的所有线程的摘要信息。
语法
!ready [Flags]
参数
Flags
指定显示的级别。Flags 可以是下面这些位的任意组合。如果Flags 为0,则只显示很少的信息。默认值是0x6。
Bit 1 (0x2)
使得显示中包括线程的等待状态。
Bit 2 (0x4)
如果包含这个位,但是不包含Bit 1(0x2),则不会起作用。如果和Bit 1一起,则显示线程的调用堆栈。
Bit 3 (0x8)
(Windows XP和之后) 使得显示出来的每个函数包含返回地址、堆栈指针、以及bsp寄存器(Itanium系统)的值。不显示函数的参数。
Bit 4 (0x10)
(Windows XP和之后) 显示的每个函数只包括它的返回地址,不显示参数和堆栈指针。
DLL
Windows NT 4.0
|
Kdextx86.dll
|
Windows 2000
|
Kdextx86.dll
|
Windows XP和之后
|
Kdexts.dll
|
注释
除了只显示就绪的线程之外,该命令的输出和!thread类似,并且输出按照优先权从高到低排序。
附加信息
关于线程调度和READY状态的信息,查看Mark Russinovich 和David Solomon 编写的Microsoft Windows Internals。
!reg
!reg 扩展命令用于显示和搜索注册表数据。
语法
!reg kcb Address
!reg knode Address
!reg kbody Address
!reg kvalue Address
!reg valuelist HiveAddress KeyNodeAddress
!reg subkeylist HiveAddress KeyNodeAddress
!reg cellindex HiveAddress Index
!reg baseblock HiveAddress
!reg seccache HiveAddress
!reg hashindex HashKey
!reg openkeys {HiveAddress|0}
!reg findkcb Path
!reg hivelist
!reg viewlist HiveAddress
!reg freebins HiveAddress
!reg freecells BinAddress
!reg dirtyvector HiveAddress
!reg freehints HiveAddress
!reg dumppool [s|r]
参数
kcb Address
显示某个registry key control block。Address 指定key control block的地址。
knode Address
显示一个registry key node structure。 Address 指定这个key node的地址。
kbody Address
显示一个registry key body (KBODY) 结构。Address 指定这个key body的地址。(Registry key body是和句柄关联的实际对象。)
kvalue Address
显示某个registry key value结构。Address 指定值的地址。
valuelist HiveAddress KeyNodeAddress
显示指定的key node中value的列表。HiveAddress 指定hive的地址。KeyNodeAddress 指定key node的地址。
subkeylist HiveAddress KeyNodeAddress
显示指定的key node的subkey列表。HiveAddress 指定hive的地址。KeyNodeAddress 指定key node的地址。
cellindex HiveAddress Index
显示hive中某个cell的虚拟地址。HiveAddress 指定hive的地址。Index指定cell的序号。
baseblock HiveAddress
显示某个hive的base block (也称为hive header)。HiveAddress指定hive的地址。
seccache HiveAddress
显示某个hive的security cache。HiveAddress指定hive的地址。
hashindex HashKey
计算某个hash key的hash index entry。HashKey用于指定这个key。
openkeys { HiveAddress | 0 }
显示某个hive中所有打开的key。HiveAddress 指定hive的地址。如果使用0,则显示整个registry hash table;该table包含注册表中所有已打开的key。
findkcb Path
显示某个注册表路径对应的registry key control block。Path 指定完整的key路径,这个路径必须在hash table中存在。
hivelist
显示系统中所有hive的列表,以及每个hive相关的详细信息。
viewlist HiveAddress
显示某个hive的所有pinned and mapped view,以及每个view的详细信息。HiveAddress 指定hive的地址。
freebins HiveAddress
显示某个hive的所有free bin,以及每个bin的详细信息。HiveAddress 用于指定hive的地址。
freecells BinAddress
遍历一个bin并且显示它里面所有的cell。BinAddress指定bin的地址。
dirtyvector HiveAddress
显示某个hive的dirty vector。HiveAddress指定hive的地址。
freehints HiveAddress
显示空闲的hint。HiveAddress指定hive的地址。
dumppool [ s | r ]
显示注册表分配的分页池(registry-allocated paged pool)。如果指定了s,则注册表页面列表(registry page list)会保存到一个临时文件中。如果指定r ,则从先前保存的临时文件恢复注册表页面列表。
DLL
Windows NT 4.0
|
不可用
|
Windows 2000
|
不可用
|
Windows XP和之后
|
Kdexts.dll
|
注释
使用!dreg扩展命令来显示格式化后的注册表键信息。
下面是一些示例:
kd> !reg hivelist
-------------------------------------------------------------------------------------------------------------
| HiveAddr |Stable Length|Stable Map|Volatile Length|Volatile Map|MappedViews|PinnedViews|U(Cnt)| BaseBlock | FileName
-------------------------------------------------------------------------------------------------------------
| e16e7428 | 2000 | e16e7484 | 0 | 00000000 | 1 | 0 | 0| e101f000 | \Microsoft\Windows\UsrClass.dat
| e1705a78 | 77000 | e1705ad4 | 1000 | e1705bb0 | 30 | 0 | 0| e101c000 | ttings\Administrator\ntuser.dat
| e13d4b88 | 814000 | e146a000 | 1000 | e13d4cc0 | 255 | 0 | 0| e1460000 | emRoot\System32\Config\SOFTWARE
| e13ad008 | 23000 | e13ad064 | 1000 | e13ad140 | 9 | 0 | 0| e145e000 | temRoot\System32\Config\DEFAULT
| e13b3b88 | a000 | e13b3be4 | 1000 | e13b3cc0 | 3 | 0 | 0| e145d000 | emRoot\System32\Config\SECURITY
| e142d008 | 5000 | e142d064 | 0 | 00000000 | 2 | 0 | 0| e145f000 | <UNKNOWN>
| e11e3628 | 4000 | e11e3684 | 3000 | e11e3760 | 0 | 0 | 0| e11e4000 | <NONAME>
| e10168a8 | 1c1000 | e1016904 | 15000 | e10169e0 | 66 | 0 | 0| e1017000 | SYSTEM
| e10072c8 | 1000 | e1007324 | 0 | 00000000 | 0 | 0 | 0| e1010000 | <NONAME>
-------------------------------------------------------------------------------------------------------------
kd> !reg hashindex e16e7428
CmpCacheTable = e100a000
Hash Index[e16e7428] : 5ac
Hash Entry[e16e7428] : e100b6b0
kd> !reg openkeys e16e7428
Index 68: 7bab7683 kcb=e13314f8 cell=00000740 f=00200004 \REGISTRY\USER\S-1-5-21-1715567821-413027322-527237240-500_Classes\CLSID
Index 7a1: 48a30288 kcb=e13a3738 cell=00000020 f=002c0004 \REGISTRY\USER\S-1-5-21-1715567821-413027322-527237240-500_Classes
附加信息
关于注册表和它的组件的信息,查看Mark Russinovich 和David Solomon 编写的Microsoft Windows Internals。
!regkcb
!regkcb 扩展显示registry key control block。
语法
Windows NT 4.0的语法
!regkcb
Windows 2000的语法
!regkcb Address
参数
Address
指定key control block的地址。
DLL
Windows NT 4.0
|
Kdextx86.dll
|
Windows 2000
|
Kdextx86.dll
|
Windows XP和之后
|
不可用
|
注释
在Windows NT 4.0中,会显示所有未交付的registry key control blocks。在Windows 2000中,会显示某个指定的registry key control block。
Windows XP和之后版本Windows中,应该使用!reg 扩展命令来替代。
每个注册表键都有一个包含它的许可权(permission)这样的属性的control block。
下面是Windows NT 4.0中的命令示例:
kd> !regkcb
1 - \REGISTRY\MACHINE\HARDWARE\DESCRIPTION\SYSTEM
1 - \REGISTRY\MACHINE\HARDWARE\DESCRIPTION\SYSTEM\MultifunctionAdapter\0
1 - \REGISTRY\MACHINE\HARDWARE\DESCRIPTION\SYSTEM\MultifunctionAdapter\1
1 - \REGISTRY\Machine\System\ControlSet001\Control\Class
1 - \REGISTRY\Machine\System\ControlSet001\Control\ServiceGroupOrder
1 - \REGISTRY\Machine\System\ControlSet001\Control\ProductOptions
1 - \REGISTRY\Machine\System\ControlSet001\Control\PriorityControl
3 - \REGISTRY\Machine\System\ControlSet001\ENUM
....
附加信息
关于注册表和它的组件的信息,查看Mark Russinovich 和David Solomon编写的 Microsoft Windows Internals。
!rellist
!rellist 扩展命令显示Plug and Play relation list。
语法
!rellist Address [Flags]
参数
Address
指定relation list 的地址。
Flags
指定显示中要包含哪些附加信息。可以是下面这些位的任意组合(默认值为0):
Bit 1 (0x2)
显示中包含CM_RESOURCE_LIST。如果可能的话也还会包含boot resources list。
Bit 2 (0x4)
显示中包含resource requirements list (IO_RESOURCE_LIST)。
Bit 3 (0x8)
显示中包含translated CM_RESOURCE_LIST。
DLL
Windows NT 4.0
|
不可用
|
Windows 2000
|
Kdextx86.dll
|
Windows XP和之后
|
Kdexts.dll
|
附加信息
查看 Plug and Play 调试获得该扩展命令的应用。关于这些列表结构的信息,查看Windows Driver Kit (WDK) 文档。
!running
!running 扩展命令显示目标机上所有处理器上正在运行的线程的列表。
语法
!running [-i] [-t]
参数
-i
显示中也包含空闲处理器(idle processor)。
-t
显示每个处理器上的调用堆栈。
DLL
Windows NT 4.0
|
不可用
|
Windows 2000
|
不可用
|
Windows XP和之后
|
Kdexts.dll
|
注释
不带参数时,!running 会显示所有活动处理器和空闲处理器的亲和性(affinity)。对于所有的活动处理器,还会显示处理器控制块(PRCB)的当前和下一线程字段,以及16个内置的排队自旋锁的状态。
下面是一个Itanium多处理器系统的示例:
0: kd> !running
System Processors 3 (affinity mask)
Idle Processors 0
Prcb Current Next
0 e0000000818f8000 e0000000818f9e50 e0000000866f12f0 ................
1 e000000086f16010 e00000008620ebe0 e000000086eddbc0 .O..............
每行末尾的16个字符是用来表示内置排队自旋锁的(PRCB 中的LockQueue)。点号( . )表示这个锁没有使用, O 表示这个锁被该处理器拥有, W 表示处理器排队在这个锁上。要查看自旋锁队列的更多信息,可以使用!qlocks。
下面的例子显示了活动和空闲处理器,以及它们的调用堆栈:
0: kd> !running -it
System Processors f (affinity mask)
Idle Processors f
All processors idle.
Prcb Current Next
0 ffdff120 805495a0 ................
ChildEBP RetAddr
8053e3f0 805329c2 nt!RtlpBreakWithStatusInstruction
8053e3f0 80533464 nt!_KeUpdateSystemTime+0x126
ffdff980 ffdff980 nt!KiIdleLoop+0x14
1 f87e0120 f87e2e60 ................
ChildEBP RetAddr
f87e0980 f87e0980 nt!KiIdleLoop+0x14
2 f87f0120 f87f2e60 ................
ChildEBP RetAddr
f87f0980 f87f0980 nt!KiIdleLoop+0x14
3 f8800120 f8802e60 ................
ChildEBP RetAddr
f8800980 f8800980 nt!KiIdleLoop+0x14
附加信息
关于调试多处理器计算机的信息,查看多处理器语法。
!scm
!scm 扩展显示指定的shared cache map。
语法
!scm Address
参数
Address
指定shared cache map的地址。
DLL
Windows NT 4.0
|
不可用
|
Windows 2000
|
Kdextx86.dll
|
Windows XP和之后
|
不可用
|
注释
在Windows XP和之后版本的Windows中,可以使用dt nt!_SHARED_CACHE_MAP Address 命令来替代!scm。
附加信息
关于缓存管理的信息,查看Microsoft Windows SDK 文档,以及Mark Russinovich 和David Solomon 编写的Microsoft Windows Internals。
关于缓存管理扩展命令的信息,查看!cchelp。
!search
!search 扩展命令在物理内存的页面中搜索匹配指定目标的指针大小的数据。
语法
Windows 2000的语法
!search Data [ Delta [ StartPFN [ EndPFN ]]]
!search -?
Windows XP和之后的语法
!search [-s] [-p] Data [ Delta [ StartPFN [ EndPFN ]]]
!search -?
参数
-s
(Windows XP和之后) 忽略搜索中遇到的符号校验错误。在遇到很多"incorrect symbols for kernel"错误时非常有用。
-p
(Windows XP和之后) 将Data 当作32位值,不进行任何符号扩展。
Data
指定要搜索的数据。Data 必须和目标系统上的指针大小(32位或64位)一样。和Data精确匹配的值总是会显示出来。其他匹配的值根据Delta的设置,可能也会显示出来,详细信息可以查看后面的注释节。
Delta
指定内存中的值和Data之间允许存在的误差。查看注释部分获得详细信息。
StartPFN
指定要搜索的范围开始位置的页面帧序号(PFN)。如果省略,则从物理页面的最低地址开始搜索。
EndPFN
指定搜索范围结束处的页面帧序号(PFN)。如果省略,则在物理页面的最高地址处结束搜索。
-?
在调试器命令窗口中显示该扩展命令的帮助。
DLL
Windows NT 4.0
|
不可用
|
Windows 2000
|
Kdextx86.dll
|
Windows XP和之后
|
Kdexts.dll
|
注释
如果指定了StartPFN 和EndPFN,它们会被当作要搜索的物理内存区域的开始和结束位置的页面帧序号。关于页面帧序号的说明,查看将虚拟地址转换成物理地址。如果省略StartPFN 和EndPFN ,则搜索所有物理内存。
在Windows 2000中,每个页面只会显示第一个匹配项,除非StartPFN和EndPFN相同。在Windows XP和之后,可以显示所有的匹配项。
!search 扩展会搜索指定的页面范围中所有内存,并且检查每个按ULONG_PTR 对齐的值。满足下面这些条件中至少一个的值会被显示出来:
- 精确匹配Data 的值。
- 如果Delta为0或省略: 和Data只有一个bit不同的数据。
- 如果Delta非0: 和Data相差最多为Delta的值。换句话说,即在范围[Data - Delta, Data + Delta]内。
- 如果Delta非0: 和上面的范围中(Data - Delta)小的那个数只相差一个bit的值。
大多数情况下,Data用来指定感兴趣的地址,但是允许指定任何ULONG_PTR 大小的数据。
由于调试器的搜索引擎的结构保存在目标机内存中,如果搜索所有内存(或者和这些结构有重合的区域),则会看到在这些结构保存的内存里面也找到了匹配。如果要消除这些匹配,可以搜索一个随机值,这样就能找出调试器的搜索结构保存的位置。
下面是一些例子。这个命令在PFN为0x237D 的内存中搜索0x80001230 到0x80001238之间的值:
kd> !search 80001234 4 237d 237d
下面的命令在PFN 0x2370 到0x237F的范围内搜索和0x0F100F0F相差不超过1 bit的值。精确匹配在下面用粗体标识,其他的有1个bit的差异:
kd> !search 0f100f0f 0 2370 237f
Searching PFNs in range 00002370 - 0000237F for [0F100F0F - 0F100F0F]
Pfn Offset Hit Va Pte
- - - - - - - - - - - - - - - - - - - - - - - - - - -
0000237B 00000368 0F000F0F 01003368 C0004014
0000237C 00000100 0F100F0F 01004100 C0004014
0000237D 000003A8 0F100F0F 010053A8 C0004014
0000237D 000003C8 0F100F8F 010053C8 C0004014
0000237D 000003E8 0F100F0F 010053E8 C0004014
0000237D 00000408 0F100F0F 01005408 C0004014
0000237D 00000428 0F100F8F 01005428 C0004014
Search done.
显示出来的列有这些: Pfn 是页面的页面帧序号(PFN);Offset 是在页面中的偏移;Hit 是在该地址的值;Va 是该物理地址映射到的虚拟地址(如果存在并且可以获得);Pte是页表项(PTE)。
要计算物理地址(疑为虚拟地址 — 译者),可以将PFN左移3个16进制数字(12 bit)然后加上偏移。例如,上表中最后以行的虚拟地址是0x0237D000 + 0x428 = 0x02347D428。
附加信息
更多显示和搜索物理内存的方法,查看读写内存。