<2024年4月>
31123456
78910111213
14151617181920
21222324252627
2829301234
567891011

文章分类

导航

订阅

从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个参数。

posted on 2007年12月29日 15:52 由 tudouni

# re: 从DUMP文件判断目标系统的CPU个数 @ 2008年1月5日 16:55

好文章,向 tudouni前辈 致意!


我估计除了 NuMeGa 的牛们 / TRW2000的刘涛涛前辈 / Syser的WuYanFeng前辈 / Undocumented Win2000 的SVEN B. SCHREIBER前辈 没多少人会对这方面进行深入挖掘


看了下2000的源码和WRK,只发现了 _DUMP_CONTROL_BLOCK 不知道和这个有没有什么关系?

typedef struct _DUMP_CONTROL_BLOCK {
UCHAR Type;
CHAR Flags;
USHORT Size;
>>> CCHAR NumberProcessors;
CHAR Reserved;
USHORT ProcessorArchitecture;
PDUMP_STACK_CONTEXT DumpStack;
PPHYSICAL_MEMORY_DESCRIPTOR MemoryDescriptor;
ULONG MemoryDescriptorLength;
PLARGE_INTEGER FileDescriptorArray;
ULONG FileDescriptorSize;
PULONG HeaderPage;
PFN_NUMBER HeaderPfn;
ULONG MajorVersion;
ULONG MinorVersion;
ULONG BuildNumber;
CHAR VersionUser[32];
ULONG HeaderSize; // Size of dump header includes summary dump.
LARGE_INTEGER DumpFileSize; // Size of dump file.
ULONG TriageDumpFlags; // Flags for triage dump.
PUCHAR TriageDumpBuffer; // Buffer for triage dump.
ULONG TriageDumpBufferSize; // Size of triage dump buffer.
} DUMP_CONTROL_BLOCK, *PDUMP_CONTROL_BLOCK;

WANGyu

# re: 从DUMP文件判断目标系统的CPU个数 @ 2008年1月13日 15:42

这篇文章描述的非常好。不过是俄文的:http://www.wasm.ru/article.php?article=dmp_format

Raymond

# re: 从DUMP文件判断目标系统的CPU个数 @ 2008年1月25日 15:34

用软件大概翻译了一下章节标题,这篇俄文的太强悍了,非常和谐!

而且代码也是非常值得一读!

WANGyu

# re: 从DUMP文件判断目标系统的CPU个数 @ 2013年7月15日 14:54

查看->进程和线程
如果是内核DUMP文件,显示的就是CPU的个数.

这个不也简单吗?

correy

Powered by Community Server Powered by CnForums.Net