从DUMP文件判断目标系统的CPU个数
OSR新闻组中有人询问如何知道一个DUMP文件对应的目标系统中有几个CPU。其实这有很多方法,聊举数例(:-))。
1)首先如果使用WinDBG打开DUMP文件,那么从WinDBG输出的概要信息中就可以判断出CPU的个数。举例来说,以下是打开一个来自双核CPU系统(Vista)的DUMP文件时WinDBG所显示的信息:
Windows Vista Kernel Version 6000 MP (2 procs) Free x86 compatible
Product: WinNt, suite: TerminalServer SingleUserTS
Built by: 6000.16386.x86fre.vista_rtm.061101-2205
Kernel base = 0x81800000 PsLoadedModuleList = 0x81911db0
Debug session time: Thu Sep 20 16:34:13.460 2007 (GMT+8)
System Uptime: 0 days 0:26:33.070
第一行是不是明明写着2 procs,即2个CPU。如果没有明确写几个CPU,那么便是单CPU。举例来说,以下是打开一个单CPU系统(XP)的DUMP时的显示:
Windows XP Kernel Version 2600 (Service Pack 2) UP Free x86 compatible
Product: WinNt, suite: TerminalServer SingleUserTS
Built by: 2600.xpsp_sp2_rtm.040803-2158
Kernel base = 0x804d7000 PsLoadedModuleList = 0x8055ab20
Debug session time: Tue Mar 28 06:33:16.703 2006 (GMT+8)
System Uptime: 0 days 0:02:37.265
2)使用!cpuid命令。比如以下是对以上两个文件的执行结果:
对于单CPU的DUMP:
kd> !cpuid
CP F/M/S Manufacturer MHz
0 15,2,9 GenuineIntel 2394
对于多CPU的DUMP:
0: kd> !cpuid
CP F/M/S Manufacturer MHz
0 6,15,6 GenuineIntel 2660
Unable to get information for processor 1
因为是MINI DUMP所以,第二个CPU的信息没有读到,但是足以证明有第二个CPU了。
3)从WinDBG的命令提示符也可以判断出是否是多CPU. 如果kd前不带任何数字,那么便是单CPU,如果是0: kd>的形式,那么便是多CPU。
4)如果是Complete Dump或者Kernel Dump,那么可以使用!pcr 命令或者!peb命令,这两个命令中都可以轻松判断出CPU个数。
5)如果你觉得前面说的方法都太平庸无奇,那么教你一招有点新意的。那就是根本不需要使用WinDBG,随意找一个可以打开二进制文件的,比如VC6或者xxEdit。然后观察第36个字节(0x24)开始的DWORD,就是目标系统的CPU个数。例如,下图是上面Vista的那个DUMP文件:
0x24偏移处是02 00 00 00,翻译成DWORD即2。
下图是XP系统的那个DUMP:
0x24偏移处是1,即单CPU。
推而广之,这种方法也可以看到DUMP的其它信息,比如:
0x10处是Kernel Base,即内核页目录基地址(CR3寄存器)的值。
0x14处是PsActiveProcessHead,即进程列表的表头。
0x18处的DWORD是PsLoadedModuleList。
0x28处的DWORD是蓝屏的停止码,上面的两个蓝屏停止码分别是0x101和0x1000008E。
0x2C开始的DWORD是蓝屏的第一个参数,蓝屏2的内容是C0000005,即访问违例。
0x30开始的DWORD是蓝屏的第二个参数,0x34处是第三个参数,0x38处是第4个参数。