2

我正在尝试在 C++ 64 位应用程序中获取模块的大小,代码如下所示。

MODULEENTRY32 me32; 
memset( &me32, 0x0, sizeof( MODULEENTRY32 ) );

DWORD base = (DWORD)me32.modBaseAddr;
DWORD moduleSize= (DWORD)me32.modBaseSize ;

我用 32 位成功测试了这个,但在 64 上没有运气。由于它是 64 位,我认为 DWORD 可能不足以存储诸如整个模块大小之类的值。

进一步阅读后,我发现 uintptr_t 更适合如此高的值,但由于 me32.modBaseSize 返回 DWORD,我认为它不适用于 x64。

我可以使用什么替代方法来获取 modBaseSize,是否有此函数的 x64 版本或返回此信息的其他方式?

4

1 回答 1

2

将 modBaseAddr 转换为 (DWORD) 是不正确的。它被声明为 BYTE*,指针值在 64 位模式下为 8 个字节。请确保将代码构建为 x64,以便在 64 位操作系统上为该字段获取有意义的值。

是的,作为 DWORD 的 modBaseSize 告诉您模块永远不能大于 4 GB。即使是 64 位代码。从可执行文件格式也可以看出,IMAGE_OPTIONAL_HEADER64.SizeOfImage 字段也仍然是一个 DWORD。

于 2013-09-14T12:33:41.503 回答