我想我已经对此进行了相当彻底的研究,但我还没有找到可接受的答案。首先是大纲:Windows 8.1、Visual Studio 2013。不过,我认为这些并不重要。
问题如下。我正在编写的应用程序使用了 A.dll。我们使用在 HKEY_CLASSES_ROOT\Directory\shellex\ContextMenuHandlers 下安装了上下文菜单处理程序控件的第三方供应商产品(备份程序,但这并不重要)。假设此路径为 c:\Program Files\Vendor\control.dll。
现在,问题是当我的程序打开一个文件选择器对话框时(它是一个使用 QFileDialog 然后使用标准 Windows 的 Qt 程序),加载该控件以提供上下文相关的右键单击功能。此控件依赖于不同版本的“A.dll”,当加载 control.dll 时,我的程序立即崩溃。
我不需要这个额外的功能。我想做的是阻止这个特定的 dll (control.dll) 在我的进程中加载。在面向对象的世界中,我会简单地重载 LoadLibrary(),检查这个特定的 DLL,然后调用标准的 DLL。然而这似乎并不可行。
有没有简单的方法来做到这一点?
谢谢! 丹
最佳答案
要防止加载 vendor.dll
,您可以在以下 Win32API 函数 LoadLibrary
和 LoadLibraryEx
上使用 Hook ,它们负责动态加载加载 DLL,也用于加载 shell 扩展。该钩子(Hook)实际上是 LoadLibrary
函数代码处的汇编代码,它重定向(跳转)到您自己定义的函数。在此函数中,您可以拦截对正在加载的 vendor.dll 的任何调用,并只返回 0,这表示无法加载该库。
一些示例代码如何使用 MinHook library 来处理它:
HMODULE WINAPI LoadLibraryA_check(_In_ LPCTSTR lpFileName)
{
if (isInWhiteList(lpFileName))
return loadLibraryA_Original(lpFileName);
else
{
// Pretend that the module was not found by returning
// 126 (0x7E): "The specified module could not be found."
SetLastError(ERROR_MOD_NOT_FOUND);
return NULL;
}
}
bool installWhitelistFilter()
{
// Initialize MinHook.
if (MH_Initialize() != MH_OK)
return false;
if (MH_CreateHook(&LoadLibraryA, &LoadLibraryA_check,
reinterpret_cast<LPVOID*>(&loadLibraryA_Original)) != MH_OK)
return false;
if (MH_EnableHook(&LoadLibraryA) != MH_OK)
return false;
// same for LoadLibraryW, LoadLibraryExW, LoadLibraryExA
return true;
}
关于c++ - 如何防止特定的 DLL 加载到我的进程中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32770778/