分析Vista系统和Win7系统的崩溃转储文件( 二 )


现在回到Dump文件如何被产生这个话题 。一旦转储功能被启用 , 操作系统会自动写一个以“Dump_开头的磁盘迷你端口驱动到启动分区 , 并校验与创建 Dump文件相关的所有组件 。包括:磁盘迷你端口驱动、写入Dump文件的I/O管理函数和启动分区的页面文件 。最终所得的校验结果会被保存起来 , 每当系统启动时KeBugCheck函数会重新进行校验并与之前的结果相比对 。如果校验结果不匹配 , 将不会有Dump文件被写入磁盘(因为有破坏磁盘数据的危险);如果检验结果匹配 , Dump信息会被写入已经被写到磁盘启动分区上的页面文件当中 。文件系统会被完全绕过 , 因为它也有可能是造成崩溃的原因之一 。当SMSS.EXE在启动过程中开启内存分页时 , 系统会仔细检查启动分区页面文件当中的信息 。如果有崩溃信息 , 这部分页面文件就会被保护起来 。如果启动过程中的所有或部分启动分区页面文件不可用 , 系统会提示虚拟内存过低(暂时) 。启动进程执行完成之后WINLOGON.EXE会调用SAVEDUMP.EXE进程从页面文件中抽出崩溃信息 , 并将Dump文件写到磁盘上 。
在Windows Server 2003上 , 某些过程可能会有不同 , 请参考KB886429 。当Server启动之后 , Windows会要求在启动分区上创建一个和物理内存相同大小的临时文件 。如果磁盘空间不足 , Dump还是会生成 , 不过会被系统缩减大小 。在创建Dump操作过程的初期 , 会话管理子系统(SMSS.EXE)就会介入验证内存Dump信息是否有效 。如果Dump信息有效 , SMSS.EXE会将Dump文件重命名为Dumpxxx.tmp , 进而存储Dumpxxx.tmp到启动分区并设置HKLMSystemCurrentControlSetControlCrashControlMachineCrash下的TempDestination和DumpFile值 。SAVEDUMP.EXE便会读取这2个值 , 并在判定文件的有效性之后将Dumpxxx.tmp保存成Memory.dmp 。

推荐阅读