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

use*_*180 2 c++ winapi

DWORD baseAddress = (DWORD) GetModuleHandle(NULL);
Run Code Online (Sandbox Code Playgroud)

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

究竟如何运作?从HMODULE到DWORD的转换如何工作?如果将其强制转换为void *而不是DWORD,是否可以使用?

Han*_*ant 5

这是Windows 32位和64位版本的实现细节。HMODULE早于此,在Windows的16位版本中,它们是真正的句柄。在win32中,这不再是必须的,加载模块的虚拟内存地址可以唯一地标识该模块。因此,最好使用VM地址,而无需将其保留在句柄表中。

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