是谁在解析应用程序的manifest文件?它又是怎么去查找相关的组件的?
我觉得要搞清楚这个问题,才能彻底解决winsxs带来的问题。
仅仅依靠sxstrace给的那点提示是不够的,还需要了深入地了解发生在它背后的事情。
在Windows系统组件的本质其实就是文件和注册表。
所以通过监控应用程序启动过程中整个系统对注册表和文件系统的访问动作来寻找答案。
很快便发现了一个叫做csrss.exe的进程,访问了winsxs相关的目录和注册表。
并且这些访问与启动的应用程序manifest里描述的组件信息完全吻合。
这里以Debug版的demo程序为例,
csrss进程先后读取了以下内容:
注册表:
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\SideBySide\Winners\x86_policy.9.0.microsoft.vc90.debugcrt_1fc8b3b9a1e18e3b_none_3f3c83b270d599c8]
文件:
C:\Windows\winsxs\manifests\x86_policy.9.0.microsoft.vc90.debugcrt_1fc8b3b9a1e18e3b_9.0.21022.8_none_3c8576a8f974f0b8.cat
注册表:
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\SideBySide\Winners\x86_microsoft.vc90.debugcrt_1fc8b3b9a1e18e3b_none_eaaf859ba152a8ae]
文件夾:
C:\Windows\winsxs\x86_microsoft.vc90.debugcrt_1fc8b3b9a1e18e3b_9.0.21022.8_none_96748342450f6aa2\
有了这个信息,再来解决"应用程序配置不正确程序无法启动”的问题就变得清晰明了了。
当出现"应用程序配置不正确程序无法启动”的时候,我们只要监控csrss.exe进程访问了哪些注册表项和系统文件,
就可以顺藤摸瓜找到winsxs组件的安装方法了。
这样即使微软不提供Microsoft.VC++.Runtime的安装包程序,我们也可以手动找到这些dll文件,复制到winsxs对应的目录,然后写入正确的注册表项就完手动完成了。
这里贴上一个VC90.debugcrt的在winsxs目录的树形结构以作参考:
winsxs
├── manifests
│ ├── x86_microsoft.vc90.debugcrt_1fc8b3b9a1e18e3b_9.0.21022.8_none_96748342450f6aa2.cat
│ ├── x86_microsoft.vc90.debugcrt_1fc8b3b9a1e18e3b_9.0.21022.8_none_96748342450f6aa2.manifest
│ ├── x86_microsoft.vc90.debugmfc_1fc8b3b9a1e18e3b_9.0.21022.8_none_9b54853441e399d5.cat
│ ├── x86_microsoft.vc90.debugmfc_1fc8b3b9a1e18e3b_9.0.21022.8_none_9b54853441e399d5.manifest
│ ├── x86_microsoft.vc90.debugopenmp_1fc8b3b9a1e18e3b_9.0.21022.8_none_469e7800ca24708e.cat
│ ├── x86_microsoft.vc90.debugopenmp_1fc8b3b9a1e18e3b_9.0.21022.8_none_469e7800ca24708e.manifest
│ ├── x86_policy.9.0.microsoft.vc90.debugcrt_1fc8b3b9a1e18e3b_9.0.21022.8_none_3c8576a8f974f0b8.cat
│ ├── x86_policy.9.0.microsoft.vc90.debugcrt_1fc8b3b9a1e18e3b_9.0.21022.8_none_3c8576a8f974f0b8.manifest
│ ├── x86_policy.9.0.microsoft.vc90.debugmfc_1fc8b3b9a1e18e3b_9.0.21022.8_none_37ea0b5cfc57dfad.cat
│ ├── x86_policy.9.0.microsoft.vc90.debugmfc_1fc8b3b9a1e18e3b_9.0.21022.8_none_37ea0b5cfc57dfad.manifest
│ ├── x86_policy.9.0.microsoft.vc90.debugopenmp_1fc8b3b9a1e18e3b_9.0.21022.8_none_8b162516588f5ada.cat
│ └── x86_policy.9.0.microsoft.vc90.debugopenmp_1fc8b3b9a1e18e3b_9.0.21022.8_none_8b162516588f5ada.manifest
├── x86_microsoft.vc90.debugcrt_1fc8b3b9a1e18e3b_9.0.21022.8_none_96748342450f6aa2
│ ├── msvcm90d.dll
│ ├── msvcp90d.dll
│ └── msvcr90d.dll
├── x86_microsoft.vc90.debugmfc_1fc8b3b9a1e18e3b_9.0.21022.8_none_9b54853441e399d5
│ ├── mfc90d.dll
│ ├── mfc90ud.dll
│ ├── mfcm90d.dll
│ └── mfcm90ud.dll
└── x86_microsoft.vc90.debugopenmp_1fc8b3b9a1e18e3b_9.0.21022.8_none_469e7800ca24708e
└── vcomp90d.dll
除了文件以外,还有几项必须的注册表:
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\SideBySide\Winners\x86_microsoft.vc90.debugmfc_1fc8b3b9a1e18e3b_none_ea38e633a1acdc53]
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\SideBySide\Winners\x86_microsoft.vc90.debugmfc_1fc8b3b9a1e18e3b_none_ea38e633a1acdc53\9.0]
"9.0.21022.8"=hex:01
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\SideBySide\Winners\x86_microsoft.vc90.debugcrt_1fc8b3b9a1e18e3b_none_eaaf859ba152a8ae]
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\SideBySide\Winners\x86_microsoft.vc90.debugcrt_1fc8b3b9a1e18e3b_none_eaaf859ba152a8ae\9.0]
"9.0.21022.8"=hex:01
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\SideBySide\Winners\x86_policy.9.0.microsoft.vc90.debugmfc_1fc8b3b9a1e18e3b_none_3fad50d470837f3b]
@="9.0"
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\SideBySide\Winners\x86_policy.9.0.microsoft.vc90.debugmfc_1fc8b3b9a1e18e3b_none_3fad50d470837f3b\9.0]
"9.0.21022.8"=hex:01
@="9.0.21022.8"
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\SideBySide\Winners\x86_policy.9.0.microsoft.vc90.debugcrt_1fc8b3b9a1e18e3b_none_3f3c83b270d599c8]
@="9.0"
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\SideBySide\Winners\x86_policy.9.0.microsoft.vc90.debugcrt_1fc8b3b9a1e18e3b_none_3f3c83b270d599c8\9.0]
"9.0.21022.8"=hex:01
@="9.0.21022.8"