NetRoc's Blog

N-Tech

 

WinDbg 文档翻译----85

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目标机) 如果提供了两个参数,并且第二个参数比第一个大,调试器将它们当作StartAddressEndAddress。命令会显示指定的内存范围中每个页面的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 阅读(544) 评论(0)  编辑 收藏 引用

只有注册用户登录后才能发表评论。

导航

统计

常用链接

留言簿(7)

随笔档案(99)

文章分类(35)

文章档案(32)

Friends

Mirror

搜索

最新评论

阅读排行榜

评论排行榜