【发布时间】:2019-07-05 15:54:50
【问题描述】:
我需要使用诸如GetModuleHandle 或GetModuleFileName 之类的Windows 函数来确定是否在执行我的代码的同一进程中加载了特定的dll。
我正在寻找的一个模块是 System.Windows.Forms.dll,但即使它在进程中加载...(在这里你可以使用 Process Explorer 看到它)
GetModuleHandle 还是找不到!
HMODULE modHandle = GetModuleHandle(L"System.Windows.Forms.dll");
GetLastError() 返回 ERROR_MOD_NOT_FOUND
如果函数成功,返回值是指定模块的句柄。 如果函数失败,返回值为NULL。
我认为这可能与 CLR 加载这些 dll 的方式有关。我在LoadLibraryEx 上看到一条注释,如果使用了 LOAD_LIBRARY_AS_DATAFILE 标志,那么:
如果使用此值,系统会将文件映射到调用 进程的虚拟地址空间,就好像它是一个数据文件一样。没有什么是 done 执行或准备执行映射文件。因此,你 不能调用 GetModuleFileName、GetModuleHandle 或 GetProcAddress 与此 DLL。
也许这是我的问题,但不管是什么原因 - 有没有人知道在使用本机/c++ 代码的进程中找到托管 DotNet dll 的方法?
谢谢!
编辑: 根据来自 Castorix 在 cmets 中的建议,我尝试使用 EnumProcessModules:
HMODULE modules[100];
void* hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, 0, GetCurrentProcessId());
if (hProcess)
{
DWORD bytesNeeded;
BOOL rc = EnumProcessModules(hProcess, modules, sizeof(modules), &bytesNeeded);
if (rc)
{
int count = (int)(bytesNeeded / sizeof(HMODULE));
for (int i = 0; i < count; i++)
{
wchar_t moduleName[260];
GetModuleFileName(modules[i], moduleName, 260);
}
}
}
CloseHandle(hProcess);
【问题讨论】:
-
向我们展示您的代码。
-
使用我的 DLL 注入器,我在目标进程中使用 EnumProcessModules (+ GetModuleInformation)
-
@JesperJuhl 'if (GetModuleHandle(L"System.Windows.Forms.dll") != 0) { ..." 但即使存在该 dll 也会返回 0
-
@PaulMacGuiheen 请不要在评论中发布代码。 编辑您的问题并在其中包含代码。 请将其设为minimal reproducible example。
-
@Castorix 我读到了这个函数,但是文档说它是用于其他进程的,而我对我的代码正在执行的同一个进程感兴趣