winapi - 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 有任何关系。
解决方案
这是一个不问的问题。真正的问题是为什么必须将文件映射到该地址,而且我很难相信将“旧”代码更改为更灵活是完全不可能的。
MapViewOfFileEx
使用特定的基地址调用是非常非常危险的。从来没有任何保证 Windows 将能够满足该请求,因为即使它只是一百分之一(这是最糟糕的错误,不是吗?),该地址将已经被占用。ASLR 就是一个很好的例子,或者 Windows 可能已经将堆放在那里,或者其他什么。
所以,tl;博士:不要那样做。只是不要。寻找另一种方式。
推荐阅读
- python - 如何在机器人框架中存储下拉列表和文本框的值
- python - 我的准确性没有改变和巨大的损失
- java - SQL - 如何返回数据列表
- ssl - 可以在 nginx 入口控制器中使用动态路由吗?
- python - 是否可以在 transform.compose 中使用非 pytoch 增强
- java - Firestore @DocumentId 不在文档中创建字段(Java)
- onclick - 如何使用预先确定的 onclick 事件自动生成一系列按钮?
- performance - 一些通用寄存器比其他寄存器快吗?
- reactjs - React-Bootstrap 进度条不会随着状态变化而更新
- javascript - 循环以减少 React 中的冗余