cc682/NetRoc
http://netroc682.spaces.live.com/
!evlog
!evlog 扩展命令用于显示、修改或者备份事件日志(event log)。
语法
!evlog addsource [-d] [-s Source] [-t Type] [-f MsgFile]
!evlog backup [-d] [-l EventLog] [-f BackupFile]
!evlog clear [-!] [-d] [-l EventLog] [-f BackupFile]
!evlog info
!evlog option [-d] [-!] [-n Count] [ -l EventLog [ -+ | -r RecordBound ]] [-o Order] [-w Width]
!evlog read [-d] [-l EventLog] [-s Source] [-e ID] [-c Category] [-t Type] [-n Count] [-r Record]
!evlog report [-s Source] [-e ID] [-c Category] [-t Type] Message
!evlog [Option] -?
参数
addsource
将一个事件源(event source)加入到注册表中。默认情况下,只会添加来自DebuggerExtensions 的事件(用于支持!evlog report)。
backup
对指定的事件日志创建一个备份,并且写入到文件中。
clear
清除指定的事件日志,并且选择性的创建一个文件用于保存它的旧内容。
info
显示事件日志的摘要信息。
option
设置默认的搜索选项。这些选项用于之后的!evlog read 命令。
read
显示记录到指定的事件日志中的事件清单。输出的详细程度 — 例如要显示的记录条数和排序方式 — 可以通过!evlog read 的参数或者之前使用!evlog option 来控制。
report
将某个事件记录写入应用程序事件日志(application event log)中。
-d
指定要使用的所有默认值。-d 选项仅在省略了其他所有参数时需要使用。但是,和!evlog option 一起使用时可以用来显示已存在的默认设置。
-!
和!evlog option一起使用来重置为默认选项。和!evlog clear一起使用 阻止创建备份文件。
Source
指定事件源。默认值为DebuggerExtensions。
Type
指定成功类型(success type)。可能的Type值有 1 (Error)、 2 (Warning)、 4 (Information)、 8 (Audit_Success)、或者16 (Audit_Failure)。值为0表示成功。对于 !evlog read 和!evlog report,默认是成功Success (0)。对于!evlog addsource,可以结合使用这些位,并且默认设置了所有位(31)。
MsgFile
指定消息文件的路径和文件名。如果省略路径,则使用当前Uext.dll所在目录。
EventLog
对于!evlog read、!evlog backup、和!evlog clear,EventLog 指定要读取哪个事件日志。可能的值有Application、System、和Security。默认为Application。
对于!evlog option, EventLog 指定要设置最大数量(maximum count)的事件日志。可能的值有All、Application、System和 Security。默认为All。
BackupFile
指定备份文件的路径和文件名。默认位置是当前目录。默认文件名是EventLog_backup.evt,EventLog 是在该命令中使用的事件日志。如果文件已经存在,命令会终止执行。
Count
指定要获取的记录的最大数量。默认为20。
-+
指定用后面的!evlog read命令获取的最大记录数量作为当前最大记录数量。(换句话说,只要前面没有进行过搜索就不会显示出记录来。)
RecordBound
指定之后的!evlog read 命令能获取的最大记录数量。如果指定0,则不会有限制 — 这是默认。
Record
如果没有包含-n Count,-r Record 用于指定要获取的记录条数。如果包含了-n Count,Record用于指定显示从第几条记录开始。
Order
指定搜索顺序,可以是Forwards 或Backwards。默认为Forwards。反向搜索会从最近一次记录到事件日志中的记录开始,并且反方向进行搜索直到找到匹配项。
Width
指定数据显示的宽度,以字符为单位。这是在Data部分的显示宽度。默认为8个字符。
ID
指定事件之前要显示的前缀。可以使用的值有 0 (no prefix)、 1000 (Information)、2000 (Success)、 3000 (Warning)、和 4000 (Error)。默认为0。
Category
指定事件种类。可使用的值有0 (no category)、 1 (Devices)、 2 (Disk)、 3 (Printers)、 4 (Services)、 5 (Shell)、6 (System_Event)和 7 (Network)。默认为0。
Message
指定要添加到事件描述中的文本消息。
Option
指定要显示某个!evlog 选项的帮助文本。
-?
在调试器命令窗口中显示该扩展命令的简短帮助。
DLL
Windows NT 4.0
|
Uext.dll
|
Windows 2000
|
Uext.dll
|
Windows XP和之后
|
Uext.dll
|
!evlog 扩展只能在活动调试时使用。
注释
使用!evlog addsource 在注册表中添加了事件源之后,可以使用!dreg命令来查看它的值。例如:
0:000> !dreg hklm\system\currentcontrolset\services\eventlog\Application\<source>!*
!evlog option 命令用于为!evlog read 设置新的默认值。这可以避免在重复使用!evlog read 时每次都需要输入所有参数。使用-+参数或者-r Records 参数可以为搜索进行限制,在搜索了指定数量的记录之后终止命令。如果仅对某个事件之后的记录感兴趣,那么这种限制是很有用的。
使用!evlog report前,应该用!evlog addsource 来在注册表中配置事件源。这种配置之后,事件查看器就可以识别各种事件ID了。
下面是!evlog info 扩展命令的示例:
0:000> !evlog info -?
--------------------------------
Application Event Log:
# Records : 4362
Oldest Record # : 1
Newest Record # : 4362
Event Log Full : false
--------------------------------
System Event Log:
# Records : 2296
Oldest Record # : 1
Newest Record # : 2296
Event Log Full : false
--------------------------------
Security Event Log:
# Records : 54544
Oldest Record # : 1
Newest Record # : 54544
Event Log Full : false
--------------------------------
0:000> !evlog option -n 4
Default EvLog Option Settings:
--------------------------------
Max Records Returned: 4
Search Order: Backwards
Data Display Width: 8
--------------------------------
Bounding Record Numbers:
Application Event Log: 0
System Event Log: 0
Security Event Log: 0
--------------------------------
0:000> !evlog read -l application
-------------- 01 --------------
Record #: 4364
Event Type: Error (1)
Event Source: Userenv
Event Category: None (0)
Event ID: 1000 (0xC00003E8)
Date: 06/06/2002
Time: 18:03:17
Description: (1 strings)
The Group Policy client-side extension Security was passed flags (17) and returned a failure status code of (87).
-------------- 02 --------------
Record #: 4363
Event Type: Warning (2)
Event Source: SceCli
Event Category: None (0)
Event ID: 1202 (0x800004B2)
Date: 06/06/2002
Time: 18:03:17
Description: (1 strings)
0x57 : The parameter is incorrect.
Please look for more details in TroubleShooting section in Security Help.
-------------- 03 --------------
Record #: 4362
Event Type: Error (1)
Event Source: Userenv
Event Category: None (0)
Event ID: 1000 (0xC00003E8)
Date: 06/06/2002
Time: 16:04:08
Description: (1 strings)
The Group Policy client-side extension Security was passed flags (17) and returned a failure status code of (87).
-------------- 04 --------------
Record #: 4361
Event Type: Warning (2)
Event Source: SceCli
Event Category: None (0)
Event ID: 1202 (0x800004B2)
Date: 06/06/2002
Time: 16:04:08
Description: (1 strings)
0x57 : The parameter is incorrect.
Please look for more details in TroubleShooting section in Security Help.
WARNING: Max record count (4) exceeded, increase record count to view more
!findstack
!findstack 扩展命令用于在所有调用堆栈中定位包含指定符号或模块的位置。
语法
!findstack Symbol [DisplayLevel]
!findstack -?
参数
Symbol
指定符号或者模块。
DisplayLevel
指定显示中要包含的内容。可以是下面这些值中的一个,默认值是1。
0
仅显示每个包含Symbol的线程的ID。
1
显示包含Symbol的每个线程的ID和frame。
2
显示每个包含Symbol的线程的整个调用堆栈。
-?
在调试器命令窗口中显示该扩展命令的简单帮助。
DLL
Windows NT 4.0
|
Uext.dll
|
Windows 2000
|
Uext.dll
|
Windows XP和之后
|
Uext.dll
|
注释
内核模式下的!stacks命令可以显示所有线程的调用堆栈和状态摘要信息。
下面是该扩展命令输出的示例:
0:023> !uext.findstack wininet
Thread 009, 2 frame(s) match
* 06 03eaffac 771d9263 wininet!ICAsyncThread::SelectThread+0x22a
* 07 03eaffb4 7c80b50b wininet!ICAsyncThread::SelectThreadWrapper+0xd
Thread 011, 2 frame(s) match
* 04 03f6ffb0 771cda1d wininet!AUTO_PROXY_DLLS::DoThreadProcessing+0xa1
* 05 03f6ffb4 7c80b50b wininet!AutoProxyThreadFunc+0xb
Thread 020, 6 frame(s) match
* 18 090dfde8 771db73a wininet!CheckForNoNetOverride+0x9c
* 19 090dfe18 771c5e4d wininet!InternetAutodialIfNotLocalHost+0x220
* 20 090dfe8c 771c5d6a wininet!ParseUrlForHttp_Fsm+0x135
* 21 090dfe98 771bcb2c wininet!CFsm_ParseUrlForHttp::RunSM+0x2b
* 22 090dfeb0 771d734a wininet!CFsm::Run+0x39
* 23 090dfee0 77f6ad84 wininet!CFsm::RunWorkItem+0x79
Thread 023, 9 frame(s) match
* 16 0bd4fe00 771bd256 wininet!ICSocket::Connect_Start+0x17e
* 17 0bd4fe0c 771bcb2c wininet!CFsm_SocketConnect::RunSM+0x42
* 18 0bd4fe24 771bcada wininet!CFsm::Run+0x39
* 19 0bd4fe3c 771bd22b wininet!DoFsm+0x25
* 20 0bd4fe4c 771bd706 wininet!ICSocket::Connect+0x32
* 21 0bd4fe8c 771bd4cb wininet!HTTP_REQUEST_HANDLE_OBJECT::OpenConnection_Fsm+0x391
* 22 0bd4fe98 771bcb2c wininet!CFsm_OpenConnection::RunSM+0x33
* 23 0bd4feb0 771d734a wininet!CFsm::Run+0x39
* 24 0bd4fee0 77f6ad84 wininet!CFsm::RunWorkItem+0x79
0:023> !uext.findstack wininet!CFsm::Run 0
Thread 020, 2 frame(s) match
Thread 023, 3 frame(s) match
0:023> !uext.findstack wininet!CFsm 0
Thread 020, 3 frame(s) match
Thread 023, 5 frame(s) match
附加信息
关于堆栈回溯和显示调用堆栈的其他方式的信息,查看查看调用堆栈和k, kb, kd, kp, kP, kv (Display Stack Backtrace) 命令。
!gatom
!gatom 扩展用于显示全局atom表(global atom table)。
语法
!gatom
DLL
Windows NT 4.0
|
Ntsdexts.dll
|
Windows 2000
|
Ntsdexts.dll
|
Windows XP和之后
|
Ntsdexts.dll
|
附加信息
关于全局atom表的信息,查看Microsoft Windows SDK文档。
!igrep
!igrep 扩展命令在反汇编中搜索指定的模板。
语法
!igrep [Pattern [StartAddress]]
参数
Pattern
指定要搜索的模板。如果省略,则使用前一次的Pattern。
StartAddress
指定开始搜索的16进制地址。如果省略,则使用当前程序计数器。
DLL
Windows NT 4.0
|
Ntsdexts.dll
|
Windows 2000
|
Ntsdexts.dll
|
Windows XP和之后
|
不可用
|
!locks (!ntsdexts.locks)
Ntsdexts.dll中的!locks 扩展命令显示当前进程关联的临界区(critical section)的清单。
该扩展命令不要和!kdext*.locks 命令混淆。
语法
!locks [Options]
参数
Options
指定要显示的信息数量。可以是下面这些选项的任意组合:
-v
显示所有临界区,包括当前没有被持有的那些。
-o
(Windows XP和之后) 仅显示孤立的信息(orphaned information)(没有指向合法的临界区的指针)。
DLL
Windows NT 4.0
|
Ntsdexts.dll
|
Windows 2000
|
Ntsdexts.dll
|
Windows XP和之后
|
Ntsdexts.dll
|
注释
该扩展命令会显示所有通过调用RtlInitializeCriticalSection 初始化的临界区。如果没有临界区,那么不会产生输出。
示例如下:
0:000> !locks
CritSec w3svc!g_pWamDictator+a0 at 68C2C298
LockCount 0
RecursionCount 1
OwningThread d1
EntryCount 1
ContentionCount 0
*** Locked
CritSec SMTPSVC+66a30 at 67906A30
LockCount 0
RecursionCount 1
OwningThread d0
EntryCount 1
ContentionCount 0
*** Locked
附加信息
关于可以显示临界区信息的其他命令和扩展命令,查看显示临界区。关于临界区的信息,查看Microsoft Windows SDK文档、Windows Driver Kit (WDK)文档,以及Mark Russinovich 和David Solomon 编写的Microsoft Windows Internals。
!runaway
!runaway扩展命令显示每个线程消费的时间。
语法
!runaway [Flags]
参数
Flags
指定要显示哪些信息。Flags 可以是下面这些位的任意组合。默认值为0x1:
Bit 0 (0x1)
让调试器显示每个线程消耗的用户模式时间(user time)。
Bit 1 (0x2)
显示每个线程消耗的内核时间(kernel time)。
Bit 2 (0x4)
显示每个线程从创建开始经历了多少时间。
DLL
Windows NT 4.0
|
Uext.dll
|
Windows 2000
|
Uext.dll Ntsdexts.dll
|
Windows XP和之后
|
Uext.dll Ntsdexts.dll
|
!runaway 扩展命令只能在活动调试时,或者调试通过.dump /mt 或.dump /ma创建的dump文件时使用。
注释
该扩展命令可以用来快速找出哪些线程循环失去控制消耗了太多CPU时间。
输出中以调试器的内部线程号和16进制线程ID来标识每个线程。还会显示调试器ID。
下面是示例:
0:001> !runaway 7
User Mode Time
Thread Time
0:55c 0:00:00.0093
1:1a4 0:00:00.0000
Kernel Mode Time
Thread Time
0:55c 0:00:00.0140
1:1a4 0:00:00.0000
Elapsed Time
Thread Time
0:55c 0:00:43.0533
1:1a4 0:00:25.0876
附加信息
关于用户模式下线程的信息,查看控制进程和线程。关于对进程和线程进行分析的信息,查看Mark Russinovich 和David Solomon 编写的Microsoft Windows Internals。
!threadtoken
!threadtoken 扩展命令显示当前线程的模拟状态(impersonation state)。
语法
!threadtoken
DLL
Windows NT 4.0
|
不可用
|
Windows 2000
|
Ntsdexts.dll
|
Windows XP和之后
|
不可用
|
注释
!threadtoken 扩展命令在Windows XP和之后版本中已经废除。使用!token 来替代。
如果当前线程处于模拟状态下(impersonating),那么会显示它使用的令牌(token)。
否则,会出现"Thread is not impersonating"信息。并且显示进程的令牌。
令牌的显示的格式和使用!handle 来显示令牌句柄时一样。
下面是示例:
0:000> ~
. 0 id: 1d0.55c Suspend: 1 Teb 7ffde000 Unfrozen
# 1 id: 1d0.1a4 Suspend: 1 Teb 7ffdd000 Unfrozen
0:000> !threadtoken
***Thread is not impersonating, using process token***
Auth Id 0 : 0x1c93d
Type Primary
Imp Level Anonymous
Token Id 0 : 0x5e8c19
Mod Id 0 : 0x5e8c12
Dyn Chg 0x1f4
Dyn Avail 0x1a4
Groups 26
Privs 17
User S-1-5-21-2127521184-1604012920-1887927527-74790
Groups 26
S-1-5-21-2127521184-1604012920-1887927527-513
S-1-1-0
S-1-5-32-544
S-1-5-32-545
S-1-5-21-2127521184-1604012920-1887927527-277551
S-1-5-21-2127521184-1604012920-1887927527-211604
S-1-5-21-2127521184-1604012920-1887927527-10546
S-1-5-21-2127521184-1604012920-1887927527-246657
S-1-5-21-2127521184-1604012920-1887927527-277552
S-1-5-21-2127521184-1604012920-1887927527-416040
S-1-5-21-2127521184-1604012920-1887927527-96548
S-1-5-21-2127521184-1604012920-1887927527-262644
S-1-5-21-2127521184-1604012920-1887927527-155802
S-1-5-21-2127521184-1604012920-1887927527-158763
S-1-5-21-2127521184-1604012920-1887927527-279132
S-1-5-21-2127521184-1604012920-1887927527-443952
S-1-5-21-2127521184-1604012920-1887927527-175772
S-1-5-21-2127521184-1604012920-1887927527-388472
S-1-5-21-2127521184-1604012920-1887927527-443950
S-1-5-21-2127521184-1604012920-1887927527-266975
S-1-5-21-2127521184-1604012920-1887927527-158181
S-1-5-21-2127521184-1604012920-1887927527-279435
S-1-5-5-0-116804
S-1-2-0
S-1-5-4
S-1-5-11
Privileges 17
SeUndockPrivilege ( Enabled Default )
SeTakeOwnershipPrivilege ( )
SeShutdownPrivilege ( )
SeDebugPrivilege ( )
SeIncreaseBasePriorityPrivilege ( )
SeAuditPrivilege ( )
SeSyncAgentPrivilege ( )
SeLoadDriverPrivilege ( )
SeSystemEnvironmentPrivilege ( Enabled )
SeRemoteShutdownPrivilege ( )
SeProfileSingleProcessPrivilege ( )
SeCreatePagefilePrivilege ( )
SeCreatePermanentPrivilege ( )
SeSystemProfilePrivilege ( Enabled )
SeBackupPrivilege ( )
SeMachineAccountPrivilege ( )
SeEnableDelegationPrivilege ( Enabled )
附加信息
关于线程和模拟的信息,查看线程和模拟(impersonation)的信息,查看Microsoft Windows SDK 文档,以及Mark Russinovich 和David Solomon 编写的Microsoft Windows Internals。
!uniqstack
!uniqstack 扩展命令显示当前进程中所有线程的调用堆栈,除开重复的那些。
语法
!uniqstack [ b | v | p ] [ n ]
参数
b
显示中包含传递给每个函数的前3个参数。
v
显示帧指针省略信息(frame pointer omission (FPO) information)。在x86处理器上,还会显示调用约定的信息。
p
显示调用堆栈中每个函数的完整参数。会列出每个参数的数据类型、名字和值。需要完整符号信息。
n
显示帧序号(frame number)。
DLL
Windows NT 4.0
|
Uext.dll
|
Windows 2000
|
Uext.dll
|
Windows XP和之后
|
Uext.dll
|
注释
除了不显示重复的调用堆栈之外,该命令和k, kb, kd, kp, kP, kv (Display Stack Backtrace) 命令类似。
例如:
0:000> !uniqstack
Processing 14 threads, please wait
. 0 Id: f0f0f0f0.15c Suspend: 1 Teb: 00000000`7fff8000 Unfrozen
Priority: 0
Child-SP Child-BSP RetAddr Call Site
00000000`0006e5e0 00000000`00070420 00000000`6b009840 wow64!Wow64NotifyDebugger+0x40 [d:\xpclient\base\wow64\wow64\wow64.c @ 581]
00000000`0006e600 00000000`000703d0 00000000`6b03db00 wow64!Wow64KiRaiseException+0x1a0 [d:\xpclient\base\wow64\wow64\wow64.c @ 649]
00000000`0006e950 00000000`000703b0 00000000`6b008520 wow64!whNtRaiseException+0x40
00000000`0006e950 00000000`00070368 00000000`6b1845e0 wow64!Wow64SystemService+0x220 [d:\xpclient\base\wow64\wow64\wow64.c @ 1100]
00000000`0006e9b0 00000000`00070310 00000000`6b009980 wow64cpu!CpuSimulate+0x3a0 [d:\xpclient\base\wow64\cpu\ia64\cpu\cpumain.c @ 730]
00000000`0006e9d0 00000000`000702d0 00000000`6b009ff0 wow64!RunCpuSimulation+0x60 [d:\xpclient\base\wow64\wow64\wow64.c @ 1168]
00000000`0006e9e0 00000000`00070248 00000000`77ea4a10 wow64!Wow64LdrpInitialize+0x5d0 [d:\xpclient\base\wow64\wow64\wow64.c @ 248]
00000000`0006f290 00000000`000700e0 00000000`77ea5d60 ntdll!LdrpInitializeProcess+0x2150 [d:\xpclient\base\ntdll\ldrinit.c @ 1817]
00000000`0006f4c0 00000000`00070028 00000000`77ed6000 ntdll!LdrpInitialize+0x560 [d:\xpclient\base\ntdll\ldrinit.c @ 553]
00000000`0006f550 00000000`00070000 00000000`77ed9000 ntdll!LdrInitializeThunk+0x20 [D:\xpclient\base\ntdll\daytona\..\ia64\ldrthunk.s @ 80]
00000000`0006f550 00000000`00070000 00000000`77ca78a0 ntdll!KiUserApcDispatch+0x50 [D:\xpclient\base\ntos\rtl\user\..\ia64\trampoln.s @ 203]
00000000`0006fff0 00000000`00070000 00000000`00000000 0x77ca78a0
. 1 Id: f0f0f0f0.718 Suspend: 1 Teb: 00000000`7fff4000 Unfrozen
Priority: 0
Child-SP Child-BSP RetAddr Call Site
00000000`0043eb50 00000000`00440250 00000000`6b008520 wow64!whNtDelayExecution+0x150 [d:\xpclient\base\wow64\whnt32\obj\ia64\whnt32.c @ 24541]
00000000`0043eb80 00000000`00440208 00000000`6b1845e0 wow64!Wow64SystemService+0x220 [d:\xpclient\base\wow64\wow64\wow64.c @ 1100]
00000000`0043ebe0 00000000`004401a8 00000000`6b009980 wow64cpu!CpuSimulate+0x3a0 [d:\xpclient\base\wow64\cpu\ia64\cpu\cpumain.c @ 730]
00000000`0043ec00 00000000`00440168 00000000`6b009ff0 wow64!RunCpuSimulation+0x60 [d:\xpclient\base\wow64\wow64\wow64.c @ 1168]
00000000`0043ec10 00000000`004400e0 00000000`77ea5f50 wow64!Wow64LdrpInitialize+0x5d0 [d:\xpclient\base\wow64\wow64\wow64.c @ 248]
00000000`0043f4c0 00000000`00440028 00000000`77ed6000 ntdll!LdrpInitialize+0x750 [d:\xpclient\base\ntdll\ldrinit.c @ 626]
00000000`0043f550 00000000`00440000 00000000`77ed9000 ntdll!LdrInitializeThunk+0x20 [D:\xpclient\base\ntdll\daytona\..\ia64\ldrthunk.s @ 80]
00000000`0043f550 00000000`00440000 00000000`7de05690 ntdll!KiUserApcDispatch+0x50 [D:\xpclient\base\ntos\rtl\user\..\ia64\trampoln.s @ 203]
00000000`0043fff0 00000000`00440000 00000000`00000000 kernel32!MulDiv+0x110 [D:\xpclient\base\win32\client\i386\critsect.asm @ 550]
. 13 Id: f0f0f0f0.494 Suspend: 1 Teb: 00000000`7ef98000 Unfrozen
Priority: 0
Child-SP Child-BSP RetAddr Call Site
00000000`00feffe0 00000000`00ff0040 00000000`77e94f30 ntdll!DbgBreakPoint+0x10 [D:\xpclient\base\ntos\rtl\user\..\ia64\debugstb.s @ 66]
00000000`00feffe0 00000000`00ff0040 00000000`00000000 ntdll!DbgUiRemoteBreakin+0x90 [d:\xpclient\base\ntdll\dlluistb.c @ 269]
Total threads: 14
Duplicate callstacks: 11 (windbg thread #s follow):
2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12
附加信息
关于堆栈回溯的更多信息和其它显示调用堆栈的方法,查看查看调用堆栈。
!vadump
!vadump 扩展命令显示所有的虚拟内存区域以及它们对应的保护信息。
语法
!vadump [-v]
参数
-v
显示中还包含每个原始分配区域(original allocation region)的信息。由于每个区域中的不同地址在分配之后可能改变成了自己的保护属性(例如使用VirtualProtect),所以大区域的原始保护属性可能和内部的子区域不一样。
DLL
Windows NT 4.0
|
Uext.dll
|
Windows 2000
|
Uext.dll
|
Windows XP和之后
|
Uext.dll
|
注释
下面是示例:
0:000> !vadump
BaseAddress: 00000000
RegionSize: 00010000
State: 00010000 MEM_FREE
Protect: 00000001 PAGE_NOACCESS
BaseAddress: 00010000
RegionSize: 00001000
State: 00001000 MEM_COMMIT
Protect: 00000004 PAGE_READWRITE
Type: 00020000 MEM_PRIVATE
.........
输出重,State 行显示从BaseAddress 开始的内存范围的状态。可能的状态值有MEM_COMMIT、MEM_FREE和MEM_RESERVE。
Protect 行显示内存区域的保护状态。可能的值有PAGE_NOACCESS、PAGE_READONLY、PAGE_READWRITE、PAGE_EXECUTE、PAGE_EXECUTE_READ、PAGE_EXECUTE_READWRITE、PAGE_WRITECOPY、PAGE_EXECUTE_WRITECOPY和PAGE_GUARD。
Type 行显示内存种类。可能的值有MEM_IMAGE、MEM_MAPPED和MEM_PRIVATE。
下面是使用-v参数的示例:
0:000> !vadump -v
BaseAddress: 00000000
AllocationBase: 00000000
RegionSize: 00010000
State: 00010000 MEM_FREE
Protect: 00000001 PAGE_NOACCESS
BaseAddress: 00010000
AllocationBase: 00010000
AllocationProtect: 00000004 PAGE_READWRITE
RegionSize: 00001000
State: 00001000 MEM_COMMIT
Protect: 00000004 PAGE_READWRITE
Type: 00020000 MEM_PRIVATE
.........
使用-v时,AllocationProtect行显示整个区域被创建时的默认保护属性。Protect行显示指定地址处实际的保护属性。
附加信息
要查看单个虚拟地址的内存保护信息,可以使用!vprot。关于内存保护的信息,查看Mark Russinovich 和David Solomon 编写的Microsoft Windows Internals。
!vprot
!vprot 扩展命令显示虚拟内存保护信息。
语法
!vprot [Address]
参数
Address
指定要查看内存保护状态的16进制地址。
DLL
Windows NT 4.0
|
Uext.dll
|
Windows 2000
|
Uext.dll Ntsdexts.dll
|
Windows XP和之后
|
Uext.dll
|
注释
!vprot 扩展命令可以用于活动调试和dump文件调试。
下面是示例:
0:000> !vprot 30c191c
BaseAddress: 030c1000
AllocationBase: 030c0000
AllocationProtect: 00000080 PAGE_EXECUTE_WRITECOPY
RegionSize: 00011000
State: 00001000 MEM_COMMIT
Protect: 00000010 PAGE_EXECUTE
Type: 01000000 MEM_IMAGE
输出中, AllocationProtect 行显示整个区域被创建时设置的默认保护属性。注意该区域中各个单独的地址可能在之后更改了保护属性(例如调用了VirtualProtect)。Protect行显示指定地址处实际的保护属性。保护属性的值有PAGE_NOACCESS、PAGE_READONLY、PAGE_READWRITE、PAGE_EXECUTE、 PAGE_EXECUTE_READ、PAGE_EXECUTE_READWRITE、PAGE_WRITECOPY、PAGE_EXECUTE_WRITECOPY和 PAGE_GUARD。
State行对应传递给 !vprot 的虚拟地址。可能的状态有MEM_COMMIT、MEM_FREE、和MEM_RESERVE。
Type行显示内存类型。可能的值有MEM_IMAGE、MEM_MAPPED和 MEM_PRIVATE。
附加信息
要查看目标进程拥有的所有内存区域的保护信息,可以使用!vadump。关于内存保护的信息,查看Mark Russinovich 和David Solomon 编写的Microsoft Windows Internals。