为什么使用GetModuleHandle获取基址有效?

时间:2013-08-05 20:11:28

标签: c++ winapi

DWORD baseAddress = (DWORD) GetModuleHandle(NULL);

如果我将该代码放入DLL并将其注入进程,那似乎等于注入进程的基址。

这是如何工作的?从HMODULE到DWORD的演员如何运作?如果我将它转换为void *而不是DWORD,它会工作吗?

2 个答案:

答案 0 :(得分:4)

这是32位和64位版本Windows的实现细节。 HMODULE比那个旧,在16位版本的Windows中它们是真正的句柄。在win32中不再需要,模块加载的虚拟内存地址唯一标识模块。因此,最好使用VM地址,不需要将其保存在句柄表中。

这意味着您无法转换为DWORD,不足以在64位版本上存储虚拟内存地址。您需要使用DWORD_PTR。

答案 1 :(得分:2)

它的工作原理是因为Windows恰好使用基址作为识别句柄,因为在32位系统上,地址适合DWORD。由于Windows不需要这样做,所以你不应该依赖它。