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。
posted on 2008-07-30 14:59
NetRoc/cc682 阅读(137)
评论(0) 编辑 收藏 引用