- 注册
- 2004-12-09
- 帖子
- 1,009
- 反馈评分
- 0
- 点数
- 61
- 性别
- 男
操作系统:Windows XP
问题类型:启动故障
1. 故障现象
爱机本来蛮好在认真工作,但是我不慎误按reset键,正做没理会处,却陡然发现Windows XP自动打开了一个类似高级启动菜单的东东,要我选择正常启动、还是安全模式或者其他选项。
其实这种现象已经出现N次了,但是平时一直都是忙不迭地按回车,但是今天鬼使神差──咦,这Windows凭什么知道启动失败,竟然如此“通人性”地亮出菜单,主动征求我的意见?
2. 原因分析
于是到微软站点上一通狂搜,总算在Windows XP Professional Resource Kit上找到答案,原来Windows XP在启动时,会到%systemroot%\bootstat.dat文件里读取启动状态信息,如果发现上次启动失败,就会自动显示启动恢复菜单。需要指出的是,同样是出错时的系统消息,indows XP确实比Windows 98要友好得多,Windows 98时期经常说的一句话是“内存不足”、“一般保护性错误”,端的是态度恶劣、毫无回旋余地,而Windows XP则非常礼貌,它的口头禅是“我们对给您造成的不便表示抱歉………”,参见附图。
3. 深入分析
扯远了……打住……既然知道了原理,当然要看看这bootstat.dat到底葫芦里卖什么药。不过要了解启动失败时bootstat.dat文件里的内容,就不能继续启动到正常模式(否则该文件内容将被改写)。为了确保bootstat.dat文件维持启动失败的状态信息,这里执行以下步骤:
(1) 在出现自动启动恢复菜单时,直接Power Off。
(2)用Windows XP安装光盘引导系统,出现安装欢迎屏幕时,按F8进入故障恢复控制台。
(3)登录到故障恢复控制台后,用copy命令将该bootstat.dat文件复制到C盘根目录下,并改名为bootstat_failure.dat。
完成以后,运行exit重启系统,并正常启动到Windows,这时候%systemroot%\bootstat.dat文件应该发生了变化,以反应正常启动状态,再将其复制到C盘根目录下,并改名为bootstat_success.dat。
接下来就要比较这两个文件到底发生了什么变化,我们可以执行以下步骤:
(1)用winhex等十六位编辑器打开这两个文件。
(2)实验发现只有第1行的第10列有所不同,如下所示:
bootstat_success.dat: 0C 00 00 00 01 00 00 00 01 1E 01 00 00 00 00 00
bootstat_failure.dat: 0C 00 00 00 01 00 00 00 01 1E 00 00 00 00 00 00
(3)可以看到,当系统启动失败时,会自动将bootstat.dat文件第1行的第10列的偏移量的值从“01”改为“00”,这样Windows XP就会自动打开启动选项菜单,以帮助我们选择合适的维护选
项。
4. 实验论证
为了确认这个原理,我在一台Windows XP虚拟机里进行以下两个实验:
(1)第一次实验将bootstat.dat文件第1行的第10列从01修改为00,然后重新启动。
实验结果:系统正常启动,并没有出现预期的自动启动恢复菜单。
原因分析:通过KB309481可以得知,原来系统启动时,ntldr会将顺利启动状态标志位(应该是01)写入bootstat.dat文件,所以假冒的bootstat.dat文件无法逃过Windows的火眼金睛,导致实验失败。
(2)第二次实验将bootstat.dat文件第1行的第10列的偏移量从“01”修改为“00”,将属性修改为“只读”(防止ntldr改写),然后重新启动。
实验结果:重启后,出现了预期的自动启动恢复菜单。
原因分析:ntldr无法改写bootstat.dat文件,所以只能眼睁睁地受欺骗。
5. 实验小结
从实验中得知,Windows XP是通过修改bootstat.dat文件里的标志位,来通知系统是否上次启动是否成功,以确认是否加载自动启动菜单。
问题类型:启动故障
1. 故障现象
爱机本来蛮好在认真工作,但是我不慎误按reset键,正做没理会处,却陡然发现Windows XP自动打开了一个类似高级启动菜单的东东,要我选择正常启动、还是安全模式或者其他选项。
其实这种现象已经出现N次了,但是平时一直都是忙不迭地按回车,但是今天鬼使神差──咦,这Windows凭什么知道启动失败,竟然如此“通人性”地亮出菜单,主动征求我的意见?
2. 原因分析
于是到微软站点上一通狂搜,总算在Windows XP Professional Resource Kit上找到答案,原来Windows XP在启动时,会到%systemroot%\bootstat.dat文件里读取启动状态信息,如果发现上次启动失败,就会自动显示启动恢复菜单。需要指出的是,同样是出错时的系统消息,indows XP确实比Windows 98要友好得多,Windows 98时期经常说的一句话是“内存不足”、“一般保护性错误”,端的是态度恶劣、毫无回旋余地,而Windows XP则非常礼貌,它的口头禅是“我们对给您造成的不便表示抱歉………”,参见附图。
3. 深入分析
扯远了……打住……既然知道了原理,当然要看看这bootstat.dat到底葫芦里卖什么药。不过要了解启动失败时bootstat.dat文件里的内容,就不能继续启动到正常模式(否则该文件内容将被改写)。为了确保bootstat.dat文件维持启动失败的状态信息,这里执行以下步骤:
(1) 在出现自动启动恢复菜单时,直接Power Off。
(2)用Windows XP安装光盘引导系统,出现安装欢迎屏幕时,按F8进入故障恢复控制台。
(3)登录到故障恢复控制台后,用copy命令将该bootstat.dat文件复制到C盘根目录下,并改名为bootstat_failure.dat。
完成以后,运行exit重启系统,并正常启动到Windows,这时候%systemroot%\bootstat.dat文件应该发生了变化,以反应正常启动状态,再将其复制到C盘根目录下,并改名为bootstat_success.dat。
接下来就要比较这两个文件到底发生了什么变化,我们可以执行以下步骤:
(1)用winhex等十六位编辑器打开这两个文件。
(2)实验发现只有第1行的第10列有所不同,如下所示:
bootstat_success.dat: 0C 00 00 00 01 00 00 00 01 1E 01 00 00 00 00 00
bootstat_failure.dat: 0C 00 00 00 01 00 00 00 01 1E 00 00 00 00 00 00
(3)可以看到,当系统启动失败时,会自动将bootstat.dat文件第1行的第10列的偏移量的值从“01”改为“00”,这样Windows XP就会自动打开启动选项菜单,以帮助我们选择合适的维护选
项。
4. 实验论证
为了确认这个原理,我在一台Windows XP虚拟机里进行以下两个实验:
(1)第一次实验将bootstat.dat文件第1行的第10列从01修改为00,然后重新启动。
实验结果:系统正常启动,并没有出现预期的自动启动恢复菜单。
原因分析:通过KB309481可以得知,原来系统启动时,ntldr会将顺利启动状态标志位(应该是01)写入bootstat.dat文件,所以假冒的bootstat.dat文件无法逃过Windows的火眼金睛,导致实验失败。
(2)第二次实验将bootstat.dat文件第1行的第10列的偏移量从“01”修改为“00”,将属性修改为“只读”(防止ntldr改写),然后重新启动。
实验结果:重启后,出现了预期的自动启动恢复菜单。
原因分析:ntldr无法改写bootstat.dat文件,所以只能眼睁睁地受欺骗。
5. 实验小结
从实验中得知,Windows XP是通过修改bootstat.dat文件里的标志位,来通知系统是否上次启动是否成功,以确认是否加载自动启动菜单。