无法在注册表中找到classids和接口id

时间:2009-08-31 11:30:47

标签: com windbg

我正在尝试在windbg中调试一些exe。现在它调用了一些暴露DLLGetClassObject函数的第三方com dll。

DLLGetClassObject签名是

HRESULT __stdcall DllGetClassObject(
  __in   REFCLSID rclsid,
  __in   REFIID riid,
  __out  LPVOID *ppv
);

查看堆栈跟踪和参数我可以使用命令

找出类ID和接口ID
  

dt GUID [地址]

当我尝试在注册表中搜索这些guid时,我无法找到任何内容。

有什么问题吗?我应该能够在regsitry中看到com类和接口id。 有什么想法吗?

2 个答案:

答案 0 :(得分:1)

可能......如果你遵循callstack,任何COM运行时函数(DllGetClassObjectCoCreateInstance)调用CoGetClassObject

如果是这样,您的CLSID应该在HKEY_CLASSES_ROOT / CLSID下找到。接口不一定是注册的。

请注意,没有什么可以阻止应用加载DLL并手动调用DllGetClassObject,只要它知道要创建的对象的线程模型要求。

答案 1 :(得分:1)

我有另一个不相关的理论 - 你有第三方DLL的符号吗?

如果没有,调用到所述模块的callstack中的条目通常显示为模块中第一个导出的偏移+一些大偏移。

如果DllGetClassObject被选为模块的“基本导出”,并且.exe​​调用模块中托管的COM方法,则callstack将显示如下内容:

  DllGetClassObject + 0x112313
  UseThirdPartyCOMThing + 0x20

其中0x112313大于您期望DllGetClassObject的代码大小。

所以,它可能是一个红色的鲱鱼 - 你可能只是看到一个在你的可用符号中不匹配的偏移量调用DLL,调试器使用它可用的任何信息显示它。