Process Monitor与免注册COM:运行时未访问manifest文件原因查询
免注册COM场景下未观测到manifest文件访问的核心原因如下:
- manifest读取发生在进程启动阶段,而非
CoCreateInstance调用阶段
Windows PE加载器会在程序代码执行(包括main函数)之前就完成manifest的解析工作:
- 若使用外部manifest,加载器在进程初始化阶段就会发起
CreateFile读取对应manifest文件,你在CoCreateInstance调用前后过滤事件自然捕获不到,该操作发生在你业务代码运行之前 - 若使用嵌入manifest,manifest直接存储在exe的资源段中,不需要额外的磁盘文件访问,自然不会出现带manifest后缀的
CreateFile事件
- 外部manifest命名或优先级不符合要求
- 外部manifest必须严格和可执行文件同名,格式为
[你的程序名].exe.manifest,任何拼写错误都会导致加载器直接跳过外部manifest - 如果你用Visual Studio等IDE编译,默认配置会自动向exe嵌入默认manifest,Windows默认优先使用嵌入的manifest,外部manifest会被完全忽略,自然不会产生外部文件访问记录
排查建议
- 调整procmon的监控时机:在启动测试程序之前就开启procmon,过滤进程名而非PID,即可捕获到进程启动阶段的manifest读取操作
- 确认manifest中正确添加了免注册COM对应的
assemblyIdentity、file、comClass节点,否则就算manifest被正常加载,COM运行时还是会走注册表检索逻辑,出现你观测到的RegOpenKey返回NAME NOT FOUND的情况
内容的提问来源于stack exchange,提问作者manuell
相关产品推荐
相关产品推荐

