在Windows下dynamic加载的库的地址范围

我有一个工作程序,加载LoadLibrary插件。

新的要求:在代码的某一点,我给了一个指针,我需要testing这个指针是指向代码还是插件的静态数据。

 bool is_pointer_into_plugin(void *p, HMODULE h); 

等价地,我需要检索指针指向的插件(如果有的话)。 我还需要知道指针是指向主程序的代码还是静态数据(最好是区分只读区域和读写区域)。

 HMODULE plugin_containing_pointer(void *p); 

等同地,我需要能够检索插件映射的范围(地址和大小)。 我也需要这个主要程序的信息。

我如何实现is_pointer_into_plugin ,或者plugin_containing_pointer ,或者其他什么东西?

如有必要,我可以更改对LoadLibrary的调用。 查找应该尽可能快,加载时间代码不需要很快。 在单独的进程中运行插件并通过共享内存进行通信不是一种select。 该程序必须运行在Windows XP和以上(和Linux,但这是另一个问题 )。

我需要的信息或多或less是Sysinternals公用事业listdlls报告的,所以我试图找出它是如何实现的。 我看到了使用NtQueryInformationProcess来检索链接到LDR_DATA_TABLE_ENTRYPEB结构的LDR_DATA_TABLE_ENTRY 。 看起来很有希望,但是:

  • 我可以看到一个DllBase ,看起来它可能是每个DLL的起始地址(是吗?),但没有大小。
  • NtQueryInformationProcess的文档将NtQueryInformationProcess标记为不可移植的,但是并不表示我正在尝试做什么。
  • 在我的系统中, PEB中唯一的字段是BeingDebuggedSessionId ,加上一些Reserved N字节数组 – 不是一个好兆头。

我如何枚举插件的地址范围,或testing一个指针是否在一个插件,或确定一个指针指向哪个插件?

Solutions Collecting From Web of "在Windows下dynamic加载的库的地址范围"

带有GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS标志的GetmoduleeHandleEx将告诉你指针指向哪个模块。 从那里你可以学习模块头来找出哪个部分。 但整个演习闻起来很有趣。 你为什么关心一个指针指向哪个插件?