首页 > 解决方案 > MapViewOfFileEx():将应用程序移植到 x64 是否需要我们为参数 lpBaseAddress 指定不同的地址(64 位)?

问题描述

我正在将现有的 win32 应用程序移植到 x64。在其中一个模块中,我看到一个固定的地址作为“lpBaseAddress”参数传递给 MapViewOfFileEx()。传递的值是 0x20000000。

在其中一个移植指南中,我读到我们应该在移植到 x64 时远离这种“神奇数字”。但是,使用基地址 0x20000000 的代码是遗留代码,并且从许多其他模块中调用以进行共享内存分配。所以,我在移植到 x64 时犹豫是否要更改此地址的值。

我想知道移植到 x64 的代码是否适用于相同的基地址?

附带说明一下,我还看到了当前 (x86) 代码链接,即调用 /base 选项值为 0x1C000000 的链接器,即 -base:0x1C000000。

这与我们可以从 MapViewOfFileEx() 请求的基地址的有效值有什么关系吗?

任何见解/想法将不胜感激。

编辑:为了澄清,这个问题本身与任何地址都不相关。我想知道的是在移植到 x64 平台时是否可以重用传递给 MapViewOfFileEx() 的 32 位常量地址。对链接器选项“base”的引用是为了询问在链接时指定为基地址的地址是否与我们传递给 MapViewOfFileEx() 的地址 lpBaseAddress 有任何关系。

标签: winapivisual-c++64-bit

解决方案


这是一个不问的问题。真正的问题是为什么必须将文件映射到该地址,而且我很难相信将“旧”代码更改为更灵活是完全不可能的。

MapViewOfFileEx使用特定的基地址调用是非常非常危险的。从来没有任何保证 Windows 将能够满足该请求,因为即使它只是一百分之一(这是最糟糕的错误,不是吗?),该地址已经被占用。ASLR 就是一个很好的例子,或者 Windows 可能已经将堆放在那里,或者其他什么。

所以,tl;博士:不要那样做。只是不要。寻找另一种方式。


推荐阅读