欢迎光临 Enjoy IT (ITECN.NET) 登录 | 注册 | 帮助

结束:关于 manifest 导致 Windows XP SP2 崩溃问题的跟踪说明

作者:张康宗(Smallfrogs, http://www.KZTechs.com)

难度:Level 200

这里是关于这个话题的第3篇文章了,今天我准备把这个话题彻底结束了。这是因为Microsoft终于发布了 Visual Studio 2005 SP1,我可以将这个问题的从头到尾的介绍一番了。

受这个问题影响的Microsoft产品有:

  • Visual Studio 2005 Team Foundation RTM
  • Visual Studio 2005 Team System Test Edition RTM
  • Visual Studio 2005 Team Edition for Software Architects RTM
  • Visual Studio 2005 Team Edition for Software Developers RTM
  • Visual Studio 2005 Team Edition for Software Testers RTM
  • Visual Studio 2005 Team Foundation Server RTM
  • Visual Studio 2005 Standard Edition RTM
  • Visual Studio 2005 Professional Edition RTM

故事回到半年前,我在Windows XP SP2下运行一个含有Windows Vista UAC manifest内容的程序时,系统突然蓝屏了。重启以后我发现这个蓝屏不是由于驱动程序造成的,而是由于CSRSS.EXE 崩溃导致的。关于这个问题的描述,请看我在7月份的文章:《BUG:在manifest里面加入Windows Vista UAC所用信息以后可能导致Windows XP SP2崩溃》

二个月前,Microsoft更新了KB 921337知识库文章,介绍了一下这个问题的具体成因是由于编译器造成的,并且说明这个问题将在 Visual Studio 2005 SP1里面得到解决。数天以前,Visual Studio 2005 SP1发布并修正了这个问题。

问题解决了,那么为什么会造成这个问题呢?

故障原因:

究其原因是由于Visual Studio 2005 RTM自带的一个组件mt.exe自作聪明的(或者就是这样设计的)在编译的时候修改了用户添加的UAC manifest内容,同时,由于Windows XP SP2的SXS.DLL模块在解析被Visual Studio 2005 RTM修改以后的UAC manifest时存在一个访问越界的BUG导致崩溃。由于这2个原因,最终导致了在manifest里面加入Windows Vista UAC所用信息以后可能导致Windows XP SP2崩溃的问题。

根据Microsoft UAC 开发文档,应用程序可以在manifest里面添加关于UAC的相关描述信息,如下所示:

<trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">

<security>

<requestedPrivileges>

<requestedExecutionLevel

level="highestAvailable"

uiAccess="false"

/>

</requestedPrivileges>

</security>

</trustInfo>

上述内容添加到manifest以后,将由mt.exe添加到PE文件里面,使用Visual Studio 2005 RTM编译以后生成的manifest内容如下(可以使用Resource Hacker查看EXE文件里面的manifest内容):

<ms_asmv3:trustInfo xmlns:ms_asmv3="urn:schemas-microsoft-com:asm.v3" xmlns="urn:schemas-microsoft-com:asm.v3">

<ms_asmv3:security xmlns:ms_asmv3="urn:schemas-microsoft-com:asm.v3">

<requestedPrivileges>

<requestedExecutionLevel level="highestAvailable" uiAccess="false">

</requestedExecutionLevel>

</requestedPrivileges>

</ms_asmv3:security>

</ms_asmv3:trustInfo>

遗憾的是,由于Visual Studio 2005自带的mt.exe的BUG,mt.exe在编译的时候将一个错误的标记附加给了上述内容,出现了2个schema:

<ms_asmv3:trustInfo xmlns:ms_asmv3="urn:schemas-microsoft-com:asm.v3" xmlns="urn:schemas-microsoft-com:asm.v3">

正是由于这2个schema的存在,最终导致了Windows XP SP2的SXS.DLL崩溃和Windows的蓝屏。

解决方法:

  1. 使用Microsoft Windows Vista SDK 里面的mt.exe替换 Visual Studio 2005 RTM 里面的mt.exe

 

  1. 安装Visual Studio 2005 SP1

操作方法:

从Microsoft下载Visual Studio 2005 SP1,安装即可。

 

无论使用上述那个方法,都可以解决由于manifest问题而导致的Windows XP SP2蓝屏现象。

最后,让我们看看使用新版本mt.exe以后编译UAC Manifest 产生的内容。使用Resource Hacker打开编译好以后的PE文件,然后选择24节点,查看内容可以发现使用新版本mt.exe以后编译UAC Manifest 产生的内容和当初在manifest里面添加的内容完全一致。新版本mt.exe再没有自作主张的修改manifest内容了。

<trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">

<security>

<requestedPrivileges>

<requestedExecutionLevel

level="highestAvailable"

uiAccess="false"

/>

</requestedPrivileges>

</security>

</trustInfo>

 

如果还有不明白的地方,欢迎和我联系。我的邮箱地址:smallfrogs#gmail.com(请把#替换为@)

 

Smallfrogs

http://www.KZTechs.com

2006/12/24

已发表 2006年12月24日 22:45 作者 smallfrogs
归档在:

评论通知

如果您想在帖子更新时接到邮件通知,请先登录。这里

订阅帖子评论使用 RSS

评论

2006年12月24日 22:57 by Smallfrogs' Technical BLOG

# 结束:关于 manifest 导致 Windows XP SP2 崩溃问题的跟踪说明

2008年1月7日 21:51 by esxpartner

# re: 结束:关于 manifest 导致 Windows XP SP2 崩溃问题的跟踪说明

说说您的看法?

(必填) 
必填 
(必填)