winsxs探索之组件的本质:文件与注册表

是谁在解析应用程序的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"

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值