检测3gb Switch是否以编程方式打开或关闭

时间:2010-02-18 21:12:47

标签: c winapi

我一直在尝试通过调用GetSystemInfo()并检查SYSTEM_INFO结构上的lpMaximumApplicationAddress来确定我的程序运行的系统上是否打开或关闭3GB开关。

没有运气。我想我做错了。

如何在C中检查Windows上的3GB开关是否打开? 代码表示赞赏。

感谢

3 个答案:

答案 0 :(得分:3)

你的程序是IMAGE_FILE_LARGE_ADDRESS_AWARE吗?

http://www.microsoft.com/whdc/system/platform/server/PAE/PAEmem.mspx

  

可以使用3 GB地址空间的可执行文件需要在其图像标头中设置IMAGE_FILE_LARGE_ADDRESS_AWARE位。如果您是可执行文件的开发人员,则可以指定链接器标志(/ LARGEADDRESSAWARE)。

答案 1 :(得分:3)

假设您的程序编译为大地址识别,您只需致电GlobalMemoryStatusEx并检查ullTotalVirtual字段即可。如果它大于2GB,并且您在32位系统上运行,则必须打开3GB标志。

我实际上不知道如何'正确'判断Windows本机是32位还是64位,但如果你有32位进程,你可以调用IsWow64Process来查看你是否运行64位-bit OS。

这一切似乎有点间接,我知道:)。

答案 2 :(得分:2)

FWIW,我已经能够使用以下代码进行检测(找到here):

if (!isWow64())
{
  BOOL b3GBSwitch = FALSE;
  SYSTEM_INFO siSysInfo;
  GetSystemInfo(&siSysInfo);
  b3GBSwitch = ((DWORD)siSysInfo.lpMaximumApplicationAddress & 0x80000000) != 0;
  printf("3GB Switch Enabled: %d\n", b3GBSwitch );
}

代码在 LARGEADDRESSAWARE的过程中执行。

到目前为止,我已经能够在Xp x86,Vista x86和Seven x64上进行测试。