manifest導致XPSP2崩潰問題跟蹤說明

字號:

我在Windows XP SP2下運行一個含有Windows Vista UAC manifest內容的程序時,系統(tǒng)突然藍屏了。重啟以后我發(fā)現(xiàn)這個藍屏不是由于驅動程序造成的,而是由于CSRSS.EXE 崩潰導致的。
    Microsoft更新了KB 921337知識庫文章,介紹了一下這個問題的具體成因是由于編譯器造成的,并且說明這個問題將在 Visual Studio 2005 SP1里面得到解決。數(shù)天以前,Visual Studio 2005 SP1發(fā)布并修正了這個問題。
    問題解決了,那么為什么會造成這個問題呢?
    故障原因:
    究其原因是由于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崩潰的問題。
    根據(jù)Microsoft UAC 開發(fā)文檔,應用程序可以在manifest里面添加關于UAC的相關描述信息,如下所示:  
    
    
    
        level="highestAvailable"
    uiAccess="false"
    />
    

    

    

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

    

    

    

    遺憾的是,由于Visual Studio 2005自帶的mt.exe的BUG,mt.exe在編譯的時候將一個錯誤的標記附加給了上述內容,出現(xiàn)了2個schema: 
        xmlns="urn:schemas-microsoft-com:asm.v3">
    正是由于這2個schema的存在,最終導致了Windows XP SP2的SXS.DLL崩潰和Windows的藍屏。