1

一个常用的方法 foo() 定义在两个 DLL 中 A.dll 和 B.dll。现在,当一个进程 proc.exe 加载两个 DLL 并同时从两个线程调用 foo() 方法时。有什么方法可以知道 foo() 在运行时是从哪个 DLL A.dll 或 B.dll 加载的。我需要此信息用于记录目的。我在互联网上找不到任何相关的东西。

GetModuleFileName()将返回进程名称 proc.exe 而不是 Dll 名称。

4

3 回答 3

3

假设您有函数的地址,您应该能够使用以下内容来确定模块的基地址。

HMODULE ModuleFromAddress(void *address)
{
  MEMORY_BASIC_INFORMATION mbi;
  if (VirtualQuery(address, &mbi, sizeof(mbi)) != 0)
    return (HMODULE)mbi.AllocationBase;
  return NULL;
}

然后将结果输入GetModuleFileName

于 2013-08-22T07:32:20.170 回答
1

调用堆栈(至少在 MS Visual Studio 中)是否准确地说明了这一点?(对不起,由于声誉限制,无法发表评论)

于 2013-08-22T06:58:22.153 回答
1

您可以找到 foo 所在的地址以及每个 dll 加载的地址范围。Foo 必须在 2 个地址范围之一中。要找出加载 dll 的位置,请检查Find the memory address of a loaded DLL in a process in C++。链接中提到的 MODULEINFO 结构提供了起始地址和大小。

于 2013-08-22T07:06:25.043 回答