【问题标题】:GetSystemInfo() returns different values for max application addressGetSystemInfo() 为最大应用程序地址返回不同的值
【发布时间】:2017-01-21 07:42:32
【问题描述】:

我想在 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 之间的区别对我来说有点奇怪。你能解释一下原因吗?

【问题讨论】:

  • 第一个7FFEFFFF是2gb,第二个是4gb。根据this,它可能来自:“64 位操作系统上的 32 位:2 GB,除非设置为大地址空间感知,在这种情况下为 4 GB。” -- 所以也许调试器正在使用非大地址感知代码,但构建版本是?
  • 是的,你是对的。根据链接的问题,运行editbin /LARGEADDRESSAWARE:NO Program.exe 使构建的程序像调试器一样运行

标签: c# winapi


【解决方案1】:

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

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

如果您希望 Debug 构建生成相同的值,则需要使用 Project > Properties > Debugging > 取消选中“Enable the Visual Studio hosting process”选项。托管进程是另一个 EXE,yourproject.vshost.exe。可以说,它没有设置选项位是一个错误。但很可能是解决棘手问题的便捷捷径。

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 我将GetSystemInfo() 给出的值传递给VirtualQueryEx() 以查找分配给进程的页面
    • 根本不需要使用这些地址。只需将 NULL 地址传递给第一个 VirtualQueryEx 调用。你会得到一个MEMORY_BASIC_INFORMATION 结构,描述以该地址开头的区域。该结构还包括区域的大小,因此在您第二次调用VirtualQueryEx 时,您将NULL + RegionSize 作为地址值传递。等等。 MEMORY_BASIC_INFORMATION 还会通知您该区域内页面的状态(免费、保留、提交)、它们的保护(读取、写入、执行)等。
    猜你喜欢
    • 1970-01-01
    • 2011-09-09
    • 2018-10-30
    • 1970-01-01
    • 2021-12-28
    • 2021-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多