Tho*_*ler 5 c++ windows 64-bit application-verifier
同事将 32 位 C++ 应用程序转换为 64 位。出于测试目的,现在的想法是指示堆管理器仅返回 64 位范围内的地址。
\n\n在网上搜索解决方案似乎并没有给出非常可靠的结果:
\n\nMSDN 论坛VirtualAlloc()建议在 CRT 初始化之前使用。但是,我不明白为什么不应该返回指向高地址的指针,而将底部 4 GB 留空。
Raymond Chen 表示,Windows 7 有一个名为 的开关Allocation\xc2\xadPreference ,可以设置为MEM_TOP_DOWN。然而,这适用于整个系统,因此需要重新启动,这很不方便。(MSDN 上也有描述)。
我在应用程序验证器中进行了深入研究,并在堆条目的属性中发现了一些有趣的选项:
\n\n\n\n如您所见,我修改了SizeStart和SizeEnd以及AddrStart和AddrEnd。
\n\n很遗憾,
\n\n虽然地址高于输入的值,但堆的大小并未更改:
\n\nTermination on corruption : ENABLED\n Heap Flags Reserv Commit Virt Free List UCR Virt Lock Fast \n (k) (k) (k) (k) length blocks cont. heap \n-------------------------------------------------------------------------------------\n000001e0aa590000 00000002 2040 1528 2040 3 1 2 0 0 \n000001e0aa440000 00001002 1080 248 1080 2 2 2 0 0 \n000001e0aa410000 00008000 64 4 64 2 1 1 0 0 \n000001e0aa520000 00001002 1080 104 1080 1 2 2 0 0 \n000001e0af2f0000 00001002 60 60 60 6 1 1 0 0 \n-------------------------------------------------------------------------------------\nRun Code Online (Sandbox Code Playgroud)\n\n这些应用程序验证器设置仍然有效吗?如何成功应用它们?
\n正如 @HansPassant 在评论中提到的,Windows 8 分配的内存超过 4 GB 限制。这是因为 64 位应用程序/HIGHENTROPYVA默认使用标志进行编译,如Raymond Chen 的“旧的新事物”博客文章中所述。
对于 Windows 7,其想法是使用VirtualQuery()、检查MEM_FREE并分配所有这些区域,VirtualAlloc()您可以在其中传递要分配的地址。
| 归档时间: |
|
| 查看次数: |
311 次 |
| 最近记录: |