获取explorer.exe从启动时加载我的扩展

时间:2013-07-30 19:59:48

标签: c++ dll hook windows-shell shell-extensions

阻止XY Problem的上下文:(因为很可能是一个更简单的解决方案)

我的目标是在用户拖动文件时跟踪explorer.exe的文件移动(以及使用剪贴板剪切和复制内容)。我尝试使用Windows Shell扩展来解决这个问题,但是我实现的接口似乎从未触发过。我按照CodeProject的this指南进行了很好的工作。但是,当我实现IFileOperation接口时,explorer.exe在这些用户操作期间没有调用过任何函数(我是否应该将另一个地方添加到*.rgs文件中教程?像txtfile这样的IFileOperation接口的一些特定注册位置用于上下文菜单?)。

作为回应,编写了一个DLL文件,该文件使用ntdll.dllthis其他CodeProject教程挂钩mhook函数调用,所有这些都发生在DLLMain内。我没有使用教程中的AppInit注册表项,而是使用third party DLL injection program强制explorer.exe加载我的DLL。通过过滤NtReadFileNtWriteFileNtSetInformationFile来电,我可以区分移动和复制操作。它工作得很好!

问题:

代码注入很麻烦,所以我回去并将我的DLLMain与第一个指南合并,以便我的挂钩代码驻留在shell扩展中。当explorer.exe加载shell扩展时,我的挂钩代码也会被执行。好吧,explorer.exe很聪明,只能根据需要加载DLL。为了让我的钩子代码开始工作,我需要右键单击一个文本文件,以便调用原始指南的shell扩展代码,此时DLL似乎从那时起保持加载状态。

问题:

是否有一个我可以伪实现的shell扩展接口,以便explorer.exe在启动时加载我的shell扩展,并且永远不会卸载它?对我正在做的事情有更优雅的解决方案吗?

编辑:有一个类似的post涉及BHO,它在启动时同时加载explorer.exeiexplorer.exe。当我读到它时,我原以为它只是一个IE浏览器,但我错了。您可以编写一个额外的密钥(NoExplorer)来阻止explorer.exe加载它,但有没有类似的命令阻止IE加载它?我的所有搜索都在不断推出NoExplorer。

编辑:通过一些经验实验,ICopyHook接口尽可能接近持久的shell扩展。没有调用IFileOperation的原因是因为explorer.exe没有调用它,而是来自其他程序请求shell在该接口下执行特定操作。在任何情况下,我都实现了一个相当空的ICopyHook shell扩展,它似乎在启动后不久加载到explorer.exe,尽管它是非常不确定的。如果有人有更好的解决方案,请分享。

1 个答案:

答案 0 :(得分:1)

There is an additional key (NoExplorer) you can write to prevent explorer.exe from loading it, but is there a similar command to prevent IE from loading it?

当您的Internet扩展程序由Internet Explorer加载时,只需在DllMain DLL_PROCESS_ATTACH 中返回 FALSE