c++ - Process Monitor and Registry Free COM:为什么无法访问“清单”?
问题描述
我尝试在不接触注册表的情况下进行 COM。我从一个非常简单的 C++“客户端”开始,尝试CoCreateInstance
使用随机的任意 UUID。
#include <stdio.h>
#include <Windows.h>
int main() {
HRESULT hr = CoInitializeEx(nullptr, COINIT_MULTITHREADED | COINIT_DISABLE_OLE1DDE);
if (FAILED(hr)) {
return 0;
} // endif
const IID SomeClass = { 42, 65535, 42, { 'H', 'e', 'l', 'l', 'o', ' ', 'S', 'O'} };
const IID SomeInterface;
memset((void*)&SomeInterface, (char)rand(), sizeof(SomeInterface));
void * pInterface;
hr = CoCreateInstance(SomeClass, nullptr, CLSCTX_INPROC_SERVER, SomeInterface, &pInterface );
if (FAILED(hr)) {
printf("'CoCreateInstance' failed with error 0x%X", hr);
} // endif
CoUninitialize();
return 0;
}
可以想象,程序的输出是:
“CoCreateInstance”失败,错误为 0x80040154
(0x80040154 是臭名昭著的“找不到类”)
有人告诉我,在这种情况下,Windows 会在图像目录中搜索一个或多个“清单”文件。
到目前为止,我很难创建这样的文件,所以作为最后的手段,我画了procmon.exe
.
我设法获得了一个与上述程序的执行相对应的 CSV 文本文件,使用的过滤器排除了与进程名称无关的任何事件。
然后我使用记事本++,发现了一些与RegOpenKey
我的虚拟“类”相关的事件,所有事件都以“未找到名称”结尾
然后我搜索CreateFile
带有一些“清单”文件扩展名的事件,但没有找到!
问题:为什么无法访问某些清单文件?
解决方案
这是正常的。我认为在注册表中找不到类后,我的进程将尝试从磁盘读取一些清单。Windows 确实尝试过,因为我最终发现使用进程监视器,但不是在我的进程中!
关于图像目录中“清单”的各种CreateFile
和朋友的电话发生在csrss.exe
......
谜团已揭开。
推荐阅读
- java - java.lang.IncompatibleClassChangeError:Primitives 没有实现请求的接口 org.apache.beam.vendor.grpc.v1p21p0.com.google.protobuf
- javascript - 在 html datalist 中加载本地 xml 文件
- google-cloud-platform - 面临创建存储桶的问题
- xml - 带有 MS Edge Beta (v91) 的 Selenium 不会在没有提示的情况下下载 XML 文件(这种类型的文件可能会损坏您的设备)
- ssl - 使用 arm64 程序集的 HTTPs POST 请求
- python - Python 代码在客户端启动之前不会执行,即使 print() 正在正确执行
- javascript - 如何在 jquery 中单击获取动态元素的值
- shapefile - 如何修复错误原因:java.lang.OutOfMemoryError:geoserver 中的 Java 堆空间
- wordpress - 更改或重定向默认 WPML 语言的 Wordpress URL 代码
- java - 将 Lambda 用作 AWS Lex 的代码挂钩时出错