GetSystemInfo()返回最大应用程序地址的不同值

时间:2016-09-13 16:07:45

标签: c# winapi

我想在C#中调用Windows {GetSystemInfo() API函数,以便检索maximumApplicationAddressminimumApplicationAddress来扫描计算机的内存。

我写了一个输出这些值的简单程序:

SYSTEM_INFO sys_info = new SYSTEM_INFO();
GetSystemInfo(out sys_info);
Console.WriteLine("Min Address: {0:X}", sys_info.minimumApplicationAddress.ToUInt64());
Console.WriteLine("Max Address: {0:X}", sys_info.maximumApplicationAddress.ToUInt64());

当我运行此程序时,通过调试器(使用“开始”按钮),它显示:

Min Address: 10000
Max Address: 7FFEFFFF

但是当我构建它并运行可执行文件时,它会显示:

Min Address: 10000
Max Address: FFFEFFFF

Max Addresses之间的区别对我来说有点奇怪。你能解释一下原因吗?

2 个答案:

答案 0 :(得分:4)

这是 与您无关的实施细节。您看到FFFEFFFF是因为您在64位操作系统上运行,并且您的EXE项目的平台目标设置为AnyCPU并且"首选32位"选项已勾选。 .NET项目的默认设置。 AnyCPU选项获取可执行文件头集中的/ LARGEADDRESSAWARE选项位,告诉操作系统在64位操作系统上提供4 GB的地址空间。你总是在32位操作系统上获得7FFEFFFF。

将平台目标设置为x86以查看差异。项目>属性>构建选项卡。

如果您希望Debug构建生成相同的值,则需要使用Project>属性>调试>取消"启用Visual Studio托管过程"选项。托管过程是另一个EXE,yourproject.vshost.exe。它没有设置选项位,可以说是一个错误。但很可能是一个棘手问题的便捷捷径。

您可以通过Dumpbin.exe /标头查看两者之间的区别。报告为"应用程序可以处理大型(> 2GB)地址"。

答案 1 :(得分:0)

要检查应用程序的地址空间,最好使用VirtualQueryVirtualQueryEx Windows API函数,而不是逐页扫描内存(或64KB区域除64KB区域)。 Ex变体允许您检查与您的进程不同的进程的地址空间。

您的原始问题已在上述评论中得到解答。