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

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

При обращении 32\-разрядного приложения, запущенного в 64\-разрядной версии Windows, к системным переменным среды %ProgramFiles% или %commonprogramfiles%, подсистема [WoW64](https://pvs-studio.ru/ru/blog/terms/0056/) производит замещение значений данных переменных на значения переменных %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, [советует](https://blog.not-a-kernel-guy.com/2009/04/03/482/) применять данную пару функций только для оборачивания вызова функции CreateFile\.

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

MSDN Library\. [Registry redirector](https://msdn.microsoft.com/en-us/library/aa384232(VS.85).aspx)\.