同事将32位C++应用程序转换为64位。出于测试目的,现在的想法是指示堆管理器只返回64位范围内的地址。
在因特网上搜索解决方案似乎不能带来非常可靠的结果:
VirtualAlloc()。但是,我不明白为什么它不应该返回一个指向高地址的指针,剩下的4GB是空的。AllocationPreference可以设置为MEM_TOP_DOWN。然而,这适用于整个系统,因此需要重新启动,这是不方便的。(还描述了论MSDN)。我深入研究了应用程序验证器,并在堆条目的属性中发现了一些有趣的选项:

如您所见,我修改了SizeStart和SizeEnd,以及AddrStart和AddrEnd。
不幸的是,
虽然地址高于输入的值,但堆的大小没有改变:
Termination on corruption : ENABLED
Heap Flags Reserv Commit Virt Free List UCR Virt Lock Fast
(k) (k) (k) (k) length blocks cont. heap
-------------------------------------------------------------------------------------
000001e0aa590000 00000002 2040 1528 2040 3 1 2 0 0
000001e0aa440000 00001002 1080 248 1080 2 2 2 0 0
000001e0aa410000 00008000 64 4 64 2 1 1 0 0
000001e0aa520000 00001002 1080 104 1080 1 2 2 0 0
000001e0af2f0000 00001002 60 60 60 6 1 1 0 0
-------------------------------------------------------------------------------------这些应用程序验证器设置仍然有效吗?如何成功地应用它们?
发布于 2021-11-23 06:39:19
正如评论中提到的@HansPassant,Windows 8的分配超过了4GB的限制。这是因为在默认情况下,64位应用程序是使用/HIGHENTROPYVA标志编译的,正如陈雷蒙德的“新事物”博文中提到的那样。
对于Windows7,想法是使用VirtualQuery(),检查MEM_FREE,然后用VirtualAlloc()分配所有这些区域,在那里您可以传递要分配的地址。
https://stackoverflow.com/questions/58958744
复制相似问题