cc682/NetRoc
http://netroc682.spaces.live.com/
内核模式扩展
本参考节主要描述主要在内核模式调试时使用的扩展命令。
调试器会自动加载这些扩展命令的适当版本。如果没有自己加载不同的版本,则不需要了解究竟使用的是哪个DLL版本。查看使用调试器扩展命令获得默认的模块搜索顺序的说明。查看 加载调试器扩展DLL获得如何加载扩展模块的说明。
每条扩展命令的参考中都列出了引出该命令的DLL。使用下面的规则来确定扩展DLL是从哪个目录加载的:
- 如果目标机运行在x86处理器的Windows NT 4.0 发行版上,则使用的是nt4fre\Kdextx86.dll。
- 如果目标机运行在x86处理器平台的Windows NT 4.0 调试版上,使用的是nt4chk\Kdextx86.dll。
- 如果目标机运行在Windows 2000的发行版上,则使用w2kfre\Kdextx86.dll。
- 如果目标机运行于Windows 2000调试版,则使用w2kchk\Kdextx86.dll。
- 如果目标机运行于Windows XP和之后的版本上,则使用winxp\Kdexts.dll。
另外,winext\kext.dll 中的内核模式扩展命令是不针对于特定操作系统的。
!ahcache
!ahcache 扩展显示应用程序兼容性缓存(application compatibility cache)。
语法
!ahcache [Flags]
参数
Flags
指定输出中要包含的信息。可以是下面这些位的任意组合(默认值为0):
Bit 0 (0x1)
显示RTL_GENERIC_TABLE 列表,而不是LRU列表。
Bit 4 (0x10)
详细输出:包含所有条目的详细信息,而不仅仅是名字。
DLL
Windows NT 4.0
|
不可用
|
Windows 2000
|
不可用
|
Windows XP 和之后
|
Kdexts.dll
|
!alignmentfaults
!alignmentfaults 扩展显示位置(location)和映像(image)的所有当前类型对齐错误(type alignment faults),以发生频率排序。
语法
!alignmentfaults
DLL
Windows NT 4.0
|
不可用
|
Windows 2000
|
不可用
|
Windows XP 和之后
|
Kdexts.dll
|
注释
仅在调试版系统中可用。
附加信息
关于对齐错误的更多信息,查看Microsoft Windows SDK文档。
!analyzebugcheck
!analyzebugcheck 扩展命令已经废除,使用!analyze来替代。
!apc
!apc 扩展格式化并显示一个或多个异步过程调用(APC)的内容。
语法
!apc
!apc proc Process
!apc thre Thread
!apc KAPC
参数
Process
指定要显示的APC所在进程的地址。
Thread
指定要显示的APC所在线程的地址。
KAPC
指定要显示的内核APC的地址。
DLL
Windows NT 4.0
|
不可用
|
Windows 2000
|
不可用
|
Windows XP 和之后
|
Kdexts.dll
|
注释
不带参数时,!apc显示所有APC。
下面是一个示例:
kd> !apc
*** Enumerating APCs in all processes
Process e0000000858ba8b0 System
Process e0000165fff86040 smss.exe
Process e0000165fff8c040 csrss.exe
Process e0000165fff4e1d0 winlogon.exe
Process e0000165fff101d0 services.exe
Process e0000165fffa81d0 lsass.exe
Process e0000165fff201d0 svchost.exe
Process e0000165fff8e040 svchost.exe
Process e0000165fff3e040 svchost.exe
Process e0000165fff6e040 svchost.exe
Process e0000165fff24040 spoolsv.exe
Process e000000085666640 wmiprvse.exe
Process e00000008501e520 wmiprvse.exe
Process e0000000856db480 explorer.exe
Process e0000165fff206a0 ctfmon.exe
Process e0000000850009d0 ctfmon.exe
Process e0000165fff51600 conime.exe
Process e000000085496340 taskmgr.exe
Process e000000085489c30 userinit.exe
附加信息
关于APC的信息,查看Windows Driver Kit (WDK) 文档,以及Mark Russinovich 和David Solomon 编写的Microsoft Windows Internals。
!apicerr
!apicerr 扩展显示本地的高级可编程中断控制器(Advanced Programmable Interrupt Controller (APIC))错误日志。
语法
!apicerr [Format]
参数
Format
指定显示错误日志内容的顺序。可以是下面这些值的任意一个:
0x0
按照发生次序显示。
0x1
按照不同处理器显示错误日志。
DLL
Windows NT 4.0
|
不可用
|
Windows 2000
|
不可用
|
Windows XP 和之后
|
Kdexts.dll
|
该扩展命令只能针对基于x86或x64的目标机使用。
附加信息
关于APIC的信息,查看Mark Russinovich 和David Solomon 所著的Microsoft Windows Internals。
!arbinst
!arbinst 扩展显示指定的arbiter的信息。
语法
!arbinst Address [Flags]
参数
Address
指定要显示的arbiter的16进制地址。
Flags
指定对每个arbiter要显示多少信息。目前唯一的标志是0x100。如果设置了它,则会显示别名(alias)。
DLL
Windows NT 4.0
|
不可用
|
Windows 2000
|
不可用
|
Windows XP 和之后
|
Kdexts.dll
|
注释
对于指定的arbiter,!arbinst 会显示系统资源每个已分配的范围,一些可选标志、附加到该范围的PDO(即该范围的所有者)、以及该所有者得服务名(如果已知的话)。
下面是一个示例:
kd> !arbinst e0000106002ee8e8
Port Arbiter "PCI I/O Port (b=02)" at e0000106002ee8e8
Allocated ranges:
0000000000000000 - 0000000000001fff 00000000 <Not on bus>
0000000000002000 - 00000000000020ff P e0000000858bea20 (ql1280)
0000000000003000 - ffffffffffffffff 00000000 <Not on bus>
Possible allocation:
< none >
kd> !arbinst e0000106002ec458
Memory Arbiter "PCI Memory (b=02)" at e0000106002ec458
Allocated ranges:
0000000000000000 - 00000000ebffffff 00000000 <Not on bus>
00000000effdef00 - 00000000effdefff B e0000000858be560
00000000effdf000 - 00000000effdffff e0000000858bea20 (ql1280)
00000000f0000000 - ffffffffffffffff 00000000 <Not on bus>
Possible allocation:
< none >
附加信息
参见!arbiter扩展。
!arbiter
!arbiter 扩展显示当前的system resource arbiter和arbitrated range。
语法
!arbiter [Flags]
参数
Flags
指定要显示哪种类型的arbiter。如果省略,则显示所有arbiter。这些位可以自由组合。
Bit 0 (0x1)
I/O arbiters.
Bit 1 (0x2)
Memory arbiters.
Bit 2 (0x4)
IRQ arbiters.
Bit 3 (0x8)
DMA arbiters.
Bit 4 (0x10)
Bus number arbiters.
DLL
Windows NT 4.0
|
不可用
|
Windows 2000
|
Kdextx86.dll
|
Windows XP 和之后
|
Kdexts.dll
|
注释
对每个arbiter,!arbiter会显示系统资源每个已分配的范围,一些可选标志、附加到该范围的PDO(即该范围的所有者)、以及该所有者得服务名(如果已知的话)。
标志的意义如下:
标志
|
意义
|
S
|
区域被共享
|
C
|
区域有冲突(conflict)
|
B
|
区域是boot-allocated的
|
D
|
区域是driver-exclusive的
|
A
|
区域别名(alias)
|
P
|
Range positive decode
|
下面是一个例子:
kd> !arbiter 4
DEVNODE 80e203b8 (HTREE\ROOT\0)
Interrupt Arbiter "" at 80167140
Allocated ranges:
0000000000000000 - 0000000000000000 B 80e1d3d8
0000000000000001 - 0000000000000001 B 80e1d3d8
.....
00000000000001a2 - 00000000000001a2
00000000000001a2 - 00000000000001a2 CB 80e1d3d8
00000000000001a2 - 00000000000001a2 CB 80e52538 (Serial)
00000000000001a3 - 00000000000001a3 80e52778 (i8042prt)
00000000000001b3 - 00000000000001b3 80e1b618 (i8042prt)
Possible allocation:
< none >
这个例子中, 倒数第二行显示了资源范围(只由0x1A3组成)、0x80E52778的PDO、服务为i8042prt.sys 。这一行没有列出标志。
现在可以对PDO地址使用 !devobj 来找到设备扩展(device extension)和设备节点(device node)的地址:
kd> !devobj 80e52778
Device object (80e52778) is for:
00000034 \Driver\PnpManager DriverObject 80e20610
Current Irp 00000000 RefCount 1 Type 00000004 Flags 00001040
DevExt 80e52830 DevObjExt 80e52838 DevNode 80e52628
ExtensionFlags (0000000000)
AttachedDevice (Upper) 80d78b28 \Driver\i8042prt
Device queue is not busy.
附加信息
查看Plug and Play 调试获得该扩展命令的应用。
!ate
!ate 扩展显示指定地址处的预备页表(alternate page table entry (ATE))。
语法
!ate Address
参数
Address
指定要显示的ATE。
DLL
Windows NT 4.0
|
不可用
|
Windows 2000
|
不可用
|
Windows XP 和之后
|
Kdexts.dll
|
注释
该扩展仅在Itanium计算机上可用。
ATE 的状态标志在下表中列出。!ate 的显示以大写字母或者虚线来表示这些位,并且还添加其他附加的信息。
位设置时的显示
|
位清除时的显示
|
含义
|
V
|
-
|
提交
|
G
|
-
|
未访问过
|
E
|
-
|
执行
|
W
|
R
|
可写或者只读
|
L
|
-
|
已锁定。该ATE已被锁定,因此在包含该ATE的页面上的任何错误都会重试直到错误被修正。这在多处理器系统上可能发生。
|
Z
|
-
|
填充为0。
|
N
|
-
|
没有访问(No access)。
|
C
|
-
|
写时复制(Copy on Write)
|
I
|
-
|
间接PTE(PTE indirect),该ATE间接引用另外的物理页面。包含该ATE的页面可能有两个不一样的ATE属性(ATE attributes)。
|
P
|
-
|
保留。
|
附加信息
关于页表和页目录的信息,查看Mark Russinovich 和David Solomon 编著的Microsoft Windows Internals。
!bcb
!bcb 扩展显示指定的缓冲区控制块(buffer control block)。
语法
!bcb Address
参数
Address
指定缓冲区控制块的地址。
DLL
Windows NT 4.0
|
不可用
|
Windows 2000
|
Kdextx86.dll
|
Windows XP 和之后
|
不可用(查看注释节)
|
注释
该扩展仅在Windows 2000上可用。在Windows XP或之后的系统中,使用dt nt!_BCB Address 命令来直接显示缓冲区控制块。
附加信息
关于缓存管理的信息,查看Microsoft Windows SDK 文档,以及Mark Russinovich 和David Solomon 编著的Microsoft Windows Internals。
关于缓存管理得其他扩展命令的信息,使用!cchelp命令。
!blockeddrv
!blockeddrv 扩展显示目标机上的blocked drivers列表。
语法
!blockeddrv
DLL
Windows NT 4.0
|
不可用
|
Windows 2000
|
不可用
|
Windows XP 和之后
|
Kdexts.dll
|
注释
下面是一个示例:
kd> !blockeddrv
Driver: Status GUID
afd.sys 0: {00000008-0206-0001-0000-000030C964E1}
agp440.sys 0: {0000005C-175A-E12D-5000-010020885580}
atapi.sys 0: {0000005C-B04A-E12E-5600-000020885580}
audstub.sys 0: {0000005C-B04A-E12E-5600-000020885580}
Beep.SYS 0: {0000005C-B04A-E12E-5600-000020885580}
Cdfs.SYS 0: {00000008-0206-0001-0000-000008F036E1}
.....
!bpid
!bpid 扩展要求目标机上的某个进程中断到调试器中,或者要求用户模式调试器附加到目标机上的某个进程上。
语法
!bpid [Options] PID
参数
Option
控制该命令的其他行为。
Option 的合法值有下面这些。
-a
|
将一个新的用户模式调试器附加到PID指定的进程上。该用户模式调试器在目标机上运行。
|
-s
|
在WinLogon进程中添加一个在PID指定的用户模式进程中断前立即触发的断点。这使得在尝试操作之前有一次机会来验证该请求。
|
-w
|
将请求保存在目标机的内存中。之后目标系统可以重复该请求,但是一般不需要这样。
|
PID
指定目标机上的进程ID。如果使用该命令来控制目标机上的用户模式调试器,则PID应该是目标进程的ID,而不是用户模式调试器的ID。(由于进程ID一般以10进制列出来,所以可能需要在前面加上0n前缀来转换成16进制格式。)
DLL
Windows NT 4.0
|
不可用
|
Windows 2000
|
不可用
|
Windows XP 和之后
|
Kdexts.dll
|
该扩展命令仅在x86、x64和Itanium目标机上支持。
注释
该命令在将用户模式调试器的输入输出重定向到内核调试器时特别有用。它使得用户模式目标程序中断到用户模式调试器中,并且从内核调试器请求输入。查看从内核调试器控制用户模式调试器获得详细信息。
如果在其他情况下使用该命令,用户模式进程会调用DbgBreakPoint。这一般会直接中断到内核调试器中。
-s 选项使得指定进程的断点触发之前先在WinLogon中触发一个断点。如果想在WinLogon的进程上下文中进行一些调试操作时有用。g (Go)命令可以转移到第二个断点。
有些情况该扩展会失败:
- 缺乏资源。!bpid 扩展会在目标进程中注入一个线程,所以系统必须有足够资源来创建它。使用-a 选项需要更多的系统资源,因为!bpid -a 必须在目标机上运行一个完整的调试器实例。
- 加载器锁(loader lock)已经被持有了。!bpid 和!bpid -a 都需要在目标进程运行一个线程才能让它中断到调试器中。如果另一个线程已经持有了加载器锁,!bpid 线程就不能运行,并且不会造成中断到调试器中。因此,如果 !bpid 在目标进程拥有足够的用户模式内存时失败,则可能是加载器锁已经被持有了。
- 缺少权限。!bpid 扩展命令的操作需要有足够的权限使得WinLogon创建远线程,以及附加一个调试器到指定进程上。
- 访问不到ntsd.exe。如果在一般的已知路径中未找到ntsd.exe,!bpid不能成功的设置适当的PID。注意在Windows Vista中默认不包含ntsd.exe。
!btb
!btb 扩展显示Itanium处理器、分支跟踪缓存(branch traces buffer (BTB))配置、以及当前处理器上的跟踪寄存器(trace registers)。
语法
!btb
DLL
Windows NT 4.0
|
不可用
|
Windows 2000
|
不可用
|
Windows XP 和之后
|
Kdexts.dll
|
该扩展命令只能在Itanium目标机上使用。
!bth
]!bth 扩展显示指定处理器上的Itanium分支跟踪记录。
语法
!bth [Processor]
参数
Processor
指定处理器。如果省略Processo,则显示所有处理器上的分支跟踪记录(branch trace history)。
DLL
Windows NT 4.0
|
不可用
|
Windows 2000
|
不可用
|
Windows XP 和之后
|
Kdexts.dll
|
该扩展命令只能在Itanium目标机上使用。
!bugdump
!bugdump 扩展命令格式化并显示在bug check回调缓冲区(bug check callback buffers)中的信息。
语法
!bugdump [Component]
参数
Component
指定要查看回调数据的组件。如果省略,则显示所有的bug check回调数据。
DLL
Windows NT 4.0
|
Kdextx86.dll
|
Windows 2000
|
Kdextx86.dll
|
Windows XP 和之后
|
Kdexts.dll
|
注释
该扩展仅在发生了bug check之后,或者调试内核模式dump文件时使用。
Component 参数对应KeRegisterBugCheckCallback 使用的最后一个参数。
小内存转储中不包含回调数据的缓冲区。这些缓冲区仅在内核内存转储和完整内存转储中存在。但是,在Windows XP SP1、Windows Server 2003和之后版本的Windows中,dump文件是在驱动的BugCheckCallback 被调用之前创建的,所以这些缓冲区中不会包含由这些函数写入的数据。
如果对崩溃的系统进行活动调试,则存在所有的回调数据。
附加信息
更多信息,查看读取Bug Check回调数据。
!bushnd
!bushnd 扩展显示HAL BUS_HANDLER结构。
语法
!bushnd [Address]
参数
Address
指定HAL BUS_HANDLER 结构的16进制地址。如果省略,!bushnd 显示总线的列表以及handler 的基地址。
DLL
Windows NT 4.0
|
Kdextx86.dll
|
Windows 2000
|
Kdextx86.dll
|
Windows XP 和之后
|
Kdexts.dll
|