我有一个加载的插件与工作程序LoadLibrary
。
新要求:在代码中的某些时候,我给一个指针,而我需要测试是否该指针指向到代码或插件的静态数据。
bool is_pointer_into_plugin(void *p, HMODULE h);
同样地,我需要检索插件到其中的指针指向,如果有的话。 我还需要知道,如果指针指向到主程序中的代码或静态数据(理想情况下,只读和读写区域区分)。
HMODULE plugin_containing_pointer(void *p);
等同地,我需要能够检索在该插件被映射到的程度(地址和大小)。 我也需要这些信息的主要程序。
我如何能实现is_pointer_into_plugin
,或plugin_containing_pointer
,或等效的东西吗?
我可以调用更改为LoadLibrary
如果必要的。 查找应该相当快地,负载时间代码不需要要快。 运行在单独的进程的插件和通过共享存储器进行通信是不是一个选项。 该方案必须在Windows XP及以上运行(和Linux,但这是另外一个问题 )。
我需要的信息是多了还是少了什么Sysinternals的工具listdlls
报告,所以我试图找出它是如何实现的。 我看到了一个建议使用的NtQueryInformationProcess
检索PEB
结构链接到LDR_DATA_TABLE_ENTRY
。 看起来很有希望,但是:
- 我可以看到一个
DllBase
它看起来像它可能是每个DLL(是吗?)的起始地址,但没有大小。 - 的文档
NtQueryInformationProcess
将其标记为不可移植,但没有提出什么,我试图做一个选择。 - 在我的系统中,唯一的领域
PEB
是BeingDebugged
和SessionId
,再加上一些Reserved N
字节数组-不是一个好兆头。
我怎样才能枚举插件的地址范围,或测试指针是否是一个插件内,或确定哪些插件指针点进去?