我正在将现有的win32应用程序移植到x64。 在其中一个模块中,我看到一个基于固定的地址作为“ lpBaseAddress”参数传递给MapViewOfFileEx()。传递的值为0x20000000。
在其中一项移植指南中,我读到在移植到x64时,我们应远离此类“魔术数字”。 但是,使用基地址0x20000000的代码是旧代码,并从许多其他模块中调用以进行共享内存分配。因此,在移植到x64时,我犹豫是否要更改此地址的值。
我想知道移植到x64的代码在相同的基址下是否可以正常工作?
作为旁注,我还看到了当前的(x86)代码链接,即使用/ base选项值0x1C000000(即-base:0x1C000000)调用链接器。
这与我们可以从MapViewOfFileEx()请求的基址的有效值有任何关系吗?
任何见解/想法将不胜感激。
修改: 为了澄清,此问题本身与任何地址无关。我想知道的是,传递给MapViewOfFileEx()的32位常量地址在移植到x64平台时是否可以重用。对链接器选项“ base”的引用是询问链接时指定为基地址的地址是否与我们传递给MapViewOfFileEx()的地址lpBaseAddress有任何关系。
答案 0 :(得分:2)
这是一个毫无疑问的问题。真正的问题是为什么必须将文件映射到该地址,而且我很难过,因为将“传统”代码更改为更灵活是完全不可能的。
使用特定的基址呼叫MapViewOfFileEx
确实非常危险。 从不保证Windows能够满足该请求,因为即使该地址只有百分之一(这是最严重的错误,不是吗?), >将已被占用。 ASLR就是一个很好的例子,或者Windows可能已经将堆放在那里了。
所以,tl; dr:不要那样做。只是不要。寻找另一种方法。