Почему происходит замещение значения переменной среды ProgramFiles на ProgramFiles(x86) ?


Почему происходит замещение значения переменной среды %ProgramFiles% на %ProgramFiles(x86)% при доступе к ней из 32-разрядной программы, запущенной в 64-разрядной ОС?

При обращении 32-разрядного приложения, запущенного в 64-разрядной версии Windows, к системным переменным среды %ProgramFiles% или %commonprogramfiles%, подсистема WoW64 производит замещение значений данных переменных на значения переменных %ProgramFiles(x86)% и "%commonprogramfiles(x86)%. Так например %ProgramFiles% будет раскрыто как "C:\Program Files (x86)" при обращении из 32-битной программы.

Такое поведение связано с работой системы перенаправления реестра, которая обеспечивает обратную совместимость 32-битного ПО с 64-разрядными ОС. Для 32-битных программ создаётся видимость 32-битного окружения, даже несмотря на то, что данные, к которым они обращаются, находятся в другом месте.

Для предотвращения такого перенаправления в 32-битной программе необходимо использовать переменные среды %programfiles% или %COMMONPROGRAMFILES% (т.е. с обращённым регистром) или использовать флаг KEY_WOW64_64KEY при доступе к соответствующим узлам реестра.

Для полного отключения перенаправления файловой системы в заданном потоке существуют функции Wow64DisableWow64FsRedirection / Wow64RevertWow64FsRedirection, однако их использование в большинстве случаев создаёт проблемы с неявными вызовами и отложенной загрузкой библиотек. Разработчик очень редко полностью контролирует весь ввод-вывод на участке между Wow64DisableWow64FsRedirection и Wow64RevertWow64FsRedirection и если в тот момент, когда перенаправление отключено, произойдёт неявная загрузка кода, 32-битное приложение с большой вероятностью не сможет получить нужную версию библиотеки. Алексей Пахунов, один из разработчиков WoW64, советует применять данную пару функций только для оборачивания вызова функции CreateFile.

Библиографический список



Найдите ошибки в своем C, C++, C# и Java коде

Предлагаем попробовать проверить код вашего проекта с помощью анализатора кода PVS-Studio. Одна найденная в нём ошибка скажет вам о пользе методологии статического анализа кода больше, чем десяток статей.

goto PVS-Studio;



Найденные ошибки

Проверено проектов
344
Собрано ошибок
12 899

А ты совершаешь ошибки в коде?

Проверь с помощью
PVS-Studio

Статический анализ
кода для C, C++, C#
и Java

goto PVS-Studio;