cc682/NetRoc
http://netroc682.spaces.live.com/
!processfields
!processfields 扩展命令显示执行进程块(EPROCESS)中字段的名字和偏移。
语法
!processfields
DLL
Windows NT 4.0
|
Kdextx86.dll
|
Windows 2000
|
Kdextx86.dll
|
Windows XP和之后
|
不可用(查看注释)
|
注释
该扩展命令在Windows XP和之后的系统中都不可用。可以直接使用 dt (Display Type) 命令显示EPROCESS结构:
kd> dt nt!_EPROCESS
下面是!processfields 在Windows 2000系统中的示例:
kd> !processfields
EPROCESS structure offsets:
Pcb: 0x0
ExitStatus: 0x6c
LockEvent: 0x70
LockCount: 0x80
CreateTime: 0x88
ExitTime: 0x90
LockOwner: 0x98
UniqueProcessId: 0x9c
ActiveProcessLinks: 0xa0
QuotaPeakPoolUsage[0]: 0xa8
QuotaPoolUsage[0]: 0xb0
PagefileUsage: 0xb8
CommitCharge: 0xbc
PeakPagefileUsage: 0xc0
PeakVirtualSize: 0xc4
VirtualSize: 0xc8
Vm: 0xd0
DebugPort: 0x120
ExceptionPort: 0x124
ObjectTable: 0x128
Token: 0x12c
WorkingSetLock: 0x130
WorkingSetPage: 0x150
ProcessOutswapEnabled: 0x154
ProcessOutswapped: 0x155
AddressSpaceInitialized: 0x156
AddressSpaceDeleted: 0x157
AddressCreationLock: 0x158
ForkInProgress: 0x17c
VmOperation: 0x180
VmOperationEvent: 0x184
PageDirectoryPte: 0x1f0
LastFaultCount: 0x18c
VadRoot: 0x194
VadHint: 0x198
CloneRoot: 0x19c
NumberOfPrivatePages: 0x1a0
NumberOfLockedPages: 0x1a4
ForkWasSuccessful: 0x182
ExitProcessCalled: 0x1aa
CreateProcessReported: 0x1ab
SectionHandle: 0x1ac
Peb: 0x1b0
SectionBaseAddress: 0x1b4
QuotaBlock: 0x1b8
LastThreadExitStatus: 0x1bc
WorkingSetWatch: 0x1c0
InheritedFromUniqueProcessId: 0x1c8
GrantedAccess: 0x1cc
DefaultHardErrorProcessing 0x1d0
LdtInformation: 0x1d4
VadFreeHint: 0x1d8
VdmObjects: 0x1dc
DeviceMap: 0x1e0
ImageFileName[0]: 0x1fc
VmTrimFaultValue: 0x20c
Win32Process: 0x214
Win32WindowStation: 0x1c4
附加信息
关于EPROCESS块的信息,查看Mark Russinovich 和David Solomon 编写的Microsoft Windows Internals。
!psp
!psp 扩展用于显示指定地址处的处理器状态参数寄存器(processor state parameter (PSP) register)。
该命令仅在Itanium目标机上支持。
语法
!psp Address [DisplayLevel]
参数
Address
指定要显示的PSP寄存器的16进制地址。
DisplayLevel
可以是下面这些选项中任意一个:
0
仅显示PSP字段的值。这是默认情况。
1
显示非保留和非忽略的PSP字段的详细信息。
2
显示所有PSP字段的详细信息,包括被忽略或保留的那些。
DLL
Windows NT 4.0
|
不可用
|
Windows 2000
|
不可用
|
Windows XP和之后
|
Kdexts.dll
|
!pte
!pte 扩展显示指定地址的页表项(page table entry (PTE))和页目录项(page directory entry (PDE))。
语法
Windows NT 4.0 和Windows 2000的语法
!pte VirtualAddress
!pte PTE
!pte LiteralAddress 1
!pte StartAddress EndAddress
Windows XP和之后的语法
!pte VirtualAddress
!pte PTE
!pte LiteralAddress 1
参数
VirtualAddress
指定需要查看页表的虚拟地址。
PTE
指定实际的PTE的地址。
LiteralAddress 1
指定实际的PTE或PDE的地址。
StartAddress
(仅x86 或x64 目标机;仅 Windows NT 4.0 和Windows 2000) 指定某个范围的开始的虚拟地址。该范围内的所有页表都会被显示出来。
EndAddress
(仅x86 或x64 目标机; 仅Windows NT 4.0 和Windows 2000) 指定某个范围的结束的虚拟地址。该范围内的所有页表都会被显示出来。
DLL
Windows NT 4.0
|
Kdextx86.dll
|
Windows 2000
|
Kdextx86.dll
|
Windows XP和之后
|
Kdexts.dll
|
注释
如果指定了一个参数,并且该参数是一个用于保存页表的内存区域中的地址,那么调试器将它当作一个PTE参数。该参数被当作要查看的PTE的实际地址,调试器会显示该PTE以及相应的PDE。
如果指定的参数不在这个范围内,调试器把它当作VirtualAddress。会显示用于映射这个地址的PTE和PDE。
如果指定了两个参数,并且第二个参数是1 (或者更小的数字),调试器将第一个参数当作LiteralAddress。这个地址会被当作PTE或者PDE的实际地址,并且显示相应的数据(可能是错误的)。
(仅x86 或x64目标机) 如果提供了两个参数,并且第二个参数比第一个大,调试器将它们当作StartAddress 和EndAddress。命令会显示指定的内存范围中每个页面的PTE。
使用!sysptes扩展命令查看所有系统PTE的列表。
下面是x86目标机上的示例:
kd> !pte 801544f4
801544F4 - PDE at C0300800 PTE at C0200550
contains 0003B163 contains 00154121
pfn 3b G-DA--KWV pfn 154 G--A--KRV
输出的第一行会再次显示被查看的虚拟地址。然后是包含该地址内存映射(virtual-physical mapping)信息的PDE和PTE的虚拟地址。
第二行是PDE和PTE的实际内容。
第三行是对这些内容的分析,将它们分解成页面帧序号(PFN)和状态位(status bits)。
查看 !pfn扩展命令或者 将虚拟地址转换成物理地址小节来获得如何理解和使用PFN的信息。
在x86和x64目标机上,PDE和PTE的状态位在下表中列出。!pte 的显示会用大写字母或者虚线来表示这些位,并且还添加其他信息。
位
|
设置时的显示
|
清除时的显示
|
意义
|
0x200
|
C
|
-
|
写时复制(Copy on write)
|
0x100
|
G
|
-
|
全局页面(Global)
|
0x80
|
L
|
-
|
大页面(Large page)。只有PDE有,PTE中没有。
|
0x40
|
D
|
-
|
脏页面(Dirty)
|
0x20
|
A
|
-
|
已访问(Accessed)
|
0x10
|
N
|
-
|
禁止缓存(Cache disabled)
|
0x8
|
T
|
-
|
通写(Write-through)
|
0x4
|
U
|
K
|
所有者(用户模式或内核模式)。
|
0x2
|
W
|
R
|
可写或者只读。只有在多处理器计算机和任何运行Windows Vista和之后系统的机器上有。
|
0x1
|
V
|
|
有效位(Valid)
|
|
E
|
-
|
可执行页面。对于包括很多x86系统在内的不支持硬件执行/非执行标志位的平台,总是显示E。
|
在Itanium目标机上,PDE和PTE的状态位和PPE中有少许不同。Itanium PPE位有下面这些:
设置时的显示
|
清除时的显示
|
意义
|
V
|
|
有效位(Valid)
|
U
|
K
|
所有者(用户模式或内核模式)。
|
D
|
-
|
脏页面(Dirty)
|
A
|
-
|
已访问(Accessed)
|
W
|
R
|
可写或者只读。只有在多处理器计算机和任何运行Windows Vista和之后系统的机器上有。
|
E
|
-
|
执行(Execute)
|
C
|
-
|
写时复制(Copy on write)
|
附加信息
关于页表、页目录和这些状态位的说明,查看Mark Russinovich 和David Solomon 编写的Microsoft Windows Internals。
!pte2va
!pte2va 扩展命令显示指定的页表项(PTE)对应的虚拟地址。
语法
!pte2va Address
Address
指定PTE。
DLL
Windows NT 4.0
|
不可用
|
Windows 2000
|
不可用
|
Windows XP和之后
|
Kdexts.dll
|
注释
要查看指定的PTE的内容,使用!pte命令。
下面是!pte2va 扩展的输出示例:
kd> !pte2va 9230
000800000248c000
附加信息
关于页表和PTE的信息,查看Mark Russinovich 和David Solomon 编写的Microsoft Windows Internals。
!ptov
!ptov扩展显示给定进程的整个物理地址到虚拟地址的映射(physical-to-virtual map)。
语法
!ptov PFN
参数
PFN
指定进程的页目录基址(directory base)的页面帧序号(PFN)。这和去掉最后三个16进制数字的页目录基地址相同 (即右移12位)。
DLL
Windows NT 4.0
|
Kdextx86.dll
|
Windows 2000
|
Kdextx86.dll
|
Windows XP和之后
|
Kdexts.dll
|
注释
下面是一个示例。首先使用!process扩展来获得需要的进程的页目录基址:
kd> !process 0 0
**** NT ACTIVE PROCESS DUMP ****
....
PROCESS ff779190 SessionId: 0 Cid: 04fc Peb: 7ffdf000 ParentCid: 0394
DirBase: 098fd000 ObjectTable: e1646b30 TableSize: 8.
Image: MyApp.exe
这里的页目录基址是0x098FD000。去掉末尾的三个0,结果为0x098FD。这就是页目录基址的页面帧序号(PFN)。
将这个数字传递给!ptov:
kd> !ptov 98fd
7119000 10000
a21a000 20000
6133000 12e000
9de9000 12f000
2b0c000 130000
87cd000 131000
aaf6000 140000
... ...
左边一列的数字是映射到该进程的每个内存页面的物理地址。右边一列是它们映射到的虚拟地址。
全部的输出会非常长。
附加信息
相关主题,查看!vtop、 !vpdd、以及 将虚拟地址转换成物理地址。关于页表和页目录的信息,查看Mark Russinovich 和David Solomon 编写的Microsoft Windows Internals。