Почему происходит замещение значения переменной среды %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.
MSDN Library. Registry redirector.