如何使应用程序大地址感知?

Sum*_*uma 15 c++ winapi visual-studio

我目前正在制作我们的应用程序大地址识别.经验表明,这样做有一些意想不到的陷阱.我创建这篇文章来制作一个需要采取的完整步骤列表.

AMD大地址识别指南中列出的开发注意事项提供了一个很好的起点,但绝不是完整的:

以下注意事项将有助于确保代码可以处理大于2GB的地址:

  • 避免使用带符号的指针算法(即比较和添加)
  • 指针使用所有32位.不要将Bit31用于其他方面.
  • 一些dll将在2GB边界下加载.在这种情况下,VirtualAlloc()不能分配连续的内存.
  • 尽可能使用GlobalMemoryStatusEx()(首选)或GlobalMemoryStatus()来检索内存大小.

因此,问题是:在制作C++ Win32本机应用程序大地址感知时需要完成哪些事情的完整列表?

Sum*_*uma 24

  • (显而易见)在项目属性中选择大于2千兆字节(/ LARGEADDRESSAWARE)的支持地址:链接器/系统/启用大地址
  • 检查所有指针减法并验证结果是否存储在可能包含可能差异的类型中,或者用比较或其他结构替换它们 - 请参阅检测指针算术,因为LARGEADDRESSAWARE).注意:指针比较应该没问题,与AMD建议相反,没有理由说它应该导致4 GB问题
  • 确保你没有假设指针有Bit31为零,不要尝试使用Bit31为别的东西.
  • 用GetCursorInfo替换所有GetCursorPos调用 - 请参阅GetCursorPos失败并显示大地址
  • 对于PVOID64的所有赋值使用PtrToPtr64,例如在使用ReadFileScatter时,请参阅ReadFileScatter备注部分