2017-02-28 75 views
0

我试图用Intel Pin来测试一个COM DLL。不幸的是,英特尔引脚设计用于独立processes,而不是DLL。拦截COM dllhost.exe调用

所以我的问题是 - 是否有可能影响COM用来启动inproc服务器主机(dllhost.exe)的命令行,以便我可以用dllhost.exe作为参数调用pin.exe?或者调用dllhost.exe硬编码到Windows中,这意味着我的想法是徒劳的?

+0

不是硬编码的,它在注册表中。您需要在CLSID注册表项中声明的AppId guid。然后在HKEY_LOCAL_MACHINE \ SOFTWARE \ WOW6432Node \ Classes \ AppID中查找它。 DllSurrogate值告诉它它需要被托管,当该值为空时,它将是dllhost.exe。您可以将其更改为其他可执行文件。不限于使用不同名称的dllhost.exe副本,无论您需要什么触发器。 –

回答

2

DLLHost.exe是DLL代理的一个示例,它允许您在单独的可执行文件中实例化DLL COM服务器。您可以使用DllSurrogateExecutable注册表项指定要使用的任意可执行文件,并且您可以实现自己的DLL代理可执行文件code,该代码可直接使用Pin。

当然,一个单独的问题是如何创建COM对象。只有当类注册的AppID指定它可以使用DLL替代品 COM对象的创建者指定CLSCTX_LOCAL_SERVER到CoCreateInstance等时,才使用DLL代理项。如果是这种情况,您可能需要修改调用者来更改上下文。

为了找出你的类在你的类下注册的AppID,可以使用OleView等工具,但是从注册表编辑器中执行并不困难。如果您获得CLSID GUID,请在HKEY_CLASSES_ROOT\CLSID\GUID下搜索。在那里你可能会发现一个AppID值。这是一个指向HKEY_CLASSES_ROOT\AppID\GUID2的GUID,它包含它是否被注册为DLL代理项以及可以放置DllSurrogateExecutable项的位置。

+0

不错的主意,谢谢。不幸的是写一个[自定义代理](https://msdn.microsoft.com/en-us/library/windows/desktop/ms682432(v = vs.85).aspx)似乎很复杂:)但肯定是可行的。 – rustyx