Определить, включен ли 3gb Switch программно или выключен - PullRequest
4 голосов
/ 19 февраля 2010

Я пытался определить, включен или выключен переключатель 3 ГБ в системе, в которой выполняется моя программа, вызвав GetSystemInfo () и проверив lpMaximumApplicationAddress в структуре SYSTEM_INFO.

Не повезло. Я думаю, что я делаю что-то не так.

Как проверить, включен ли переключатель 3GB в Windows в C? Код приветствуется.

спасибо

Ответы [ 3 ]

3 голосов
/ 19 февраля 2010

Если ваша программа скомпилирована с учетом больших адресов, вы можете просто позвонить GlobalMemoryStatusEx и проверить поле ullTotalVirtual. Если его размер превышает 2 ГБ, а вы работаете в 32-разрядной системе, флаг 3 ГБ должен быть включен.

На самом деле я понятия не имею, как «правильно» определить, является ли Windows изначально 32- или 64-битной, но если у вас 32-битный процесс, вы можете вызвать IsWow64Process, чтобы проверить работает на 64-битной ОС.

Это все кажется немного косвенным, я знаю:)

3 голосов
/ 19 февраля 2010

Является ли ваша программа IMAGE_FILE_LARGE_ADDRESS_AWARE?

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

Исполняемые файлы, которые могут использовать адресное пространство размером 3 ГБ, должны иметь бит IMAGE_FILE_LARGE_ADDRESS_AWARE, установленный в заголовке их изображения. Если вы являетесь разработчиком исполняемого файла, вы можете указать флаг компоновщика (/LARGEADDRESSAWARE).

2 голосов
/ 16 сентября 2011

FWIW, я смог выполнить обнаружение, используя следующий код (найден здесь ):

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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...