首页 > 解决方案 > 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带有一些“清单”文件扩展名的事件,但没有找到!

问题:为什么无法访问某些清单文件?

标签: c++comregistryprocmon

解决方案


这是正常的。我认为在注册表中找不到类后,我的进程将尝试从磁盘读取一些清单。Windows 确实尝试过,因为我最终发现使用进程监视器,但不是在我的进程中!

关于图像目录中“清单”的各种CreateFile和朋友的电话发生在csrss.exe......

谜团已揭开。


推荐阅读