#c #c #windows #winapi #windows-7-x64
#c #c #Windows #winapi #windows-7-x64
Вопрос:
Откуда берутся переменные среды ProgramFiles
, ProgramW6432Dir
, ProgramFilesDir (x86)
, CommonProgramFiles
и ProgramData
откуда берутся их данные?
Почему невозможно изменить значения этих переменных среды с помощью _putenv()
? Например:
_putenv( "ProgramFiles=D:\MyProgs" );
Комментарии:
1.
impossible to change the values
Как вы проверяете возвращаемое значение_putenv
, чтобы оценить, не произошел ли сбой вызова?
Ответ №1:
В 64-разрядной системе Windows чтение различных переменных среды и некоторых разделов реестра Windows перенаправляется в разные источники, в зависимости от того, является ли процесс, выполняющий чтение, 64-разрядным или 32-разрядным.
В таблице ниже перечислены эти источники данных:
X = HKLMSOFTWAREMicrosoftWindowsCurrentVersion
Y = HKLMSOFTWAREWow6432NodeMicrosoftWindowsCurrentVersion
Z = HKLMSOFTWAREMicrosoftWindows NTCurrentVersionProfileList
READING ENVIRONMENT VARIABLES: Source for 64-bit process Source for 32-bit process
-------------------------------|----------------------------------------|--------------------------------------------------------------
%ProgramFiles% : XProgramW6432Dir XProgramFilesDir (x86)
%ProgramFiles(x86)% : XProgramFilesDir (x86) XProgramFilesDir (x86)
%ProgramW6432% : XProgramW6432Dir XProgramW6432Dir
%CommonProgramFiles% : XCommonW6432Dir XCommonFilesDir (x86)
%CommonProgramFiles(x86)% : XCommonFilesDir (x86) XCommonFilesDir (x86)
%CommonProgramW6432% : XCommonW6432Dir XCommonW6432Dir
%ProgramData% : ZProgramData ZProgramData
READING REGISTRY VALUES: Source for 64-bit process Source for 32-bit process
-------------------------------|----------------------------------------|--------------------------------------------------------------
XProgramFilesDir : XProgramFilesDir YProgramFilesDir
XProgramFilesDir (x86) : XProgramFilesDir (x86) YProgramFilesDir (x86)
XProgramFilesPath : XProgramFilesPath = %ProgramFiles% YProgramFilesPath = %ProgramFiles(x86)%
XProgramW6432Dir : XProgramW6432Dir YProgramW6432Dir
XCommonFilesDir : XCommonFilesDir YCommonFilesDir
XCommonFilesDir (x86) : XCommonFilesDir (x86) YCommonFilesDir (x86)
XCommonW6432Dir : XCommonW6432Dir YCommonW6432Dir
Так, например, для 32-разрядного процесса источником данных для %ProgramFiles%
%ProgramFiles(x86)%
переменных среды и является значение реестра HKLMSOFTWAREMicrosoftWindowsCurrentVersionProgramFilesDir (x86)
.
Однако для 64-разрядного процесса источником данных для %ProgramFiles%
переменной среды является значение реестра HKLMSOFTWAREMicrosoftWindowsCurrentVersionProgramW6432Dir
… а источником данных для %ProgramFiles(x86)%
переменной среды является значение реестра HKLMSOFTWAREMicrosoftWindowsCurrentVersionProgramFilesDir (x86)
Большинство установок Windows по умолчанию помещают строку like C:Program Files (x86)
в значение реестра HKLMSOFTWAREMicrosoftWindowsCurrentVersionProgramFilesDir (x86)
, но это можно изменить (и другие тоже).
Ниже приведены типичные данные в этих переменных среды и значениях реестра:
READING ENVIRONMENT VARIABLES: Typical data for 64-bit process Typical data for 32-bit process
-------------------------------|----------------------------------------|-----------------------------------------------
%ProgramFiles% = C:Program Files C:Program Files (x86)
%ProgramFiles(x86)% = C:Program Files (x86) C:Program Files (x86)
%ProgramW6432% = C:Program Files C:Program Files
%CommonProgramFiles% = C:Program FilesCommon Files C:Program Files (x86)Common Files
%CommonProgramFiles(x86)% = C:Program Files (x86)Common Files C:Program Files (x86)Common Files
%CommonProgramW6432% = C:Program FilesCommon Files C:Program FilesCommon Files
%ProgramData% = C:ProgramData C:ProgramData
READING REGISTRY VALUES: Typical data for 64-bit process Typical data for 32-bit process
------------------------------|----------------------------------------|-----------------------------------------------
XProgramFilesDir = C:Program Files C:Program Files (x86)
XProgramFilesDir (x86) = C:Program Files (x86) C:Program Files (x86)
XProgramFilesPath = %ProgramFiles% => C:Program Files %ProgramFiles(x86)% => C:Program Files (x86)
XProgramW6432Dir = C:Program Files C:Program Files
XCommonFilesDir = C:Program FilesCommon Files C:Program Files (x86)Common Files
XCommonFilesDir (x86) = C:Program Files (x86)Common Files C:Program Files (x86)Common Files
XCommonW6432Dir = C:Program FilesCommon Files C:Program FilesCommon Files
X = HKLMSOFTWAREMicrosoftWindowsCurrentVersion
В конечном счете, все, что вводится в эти значения реестра Windows, будет считано проводником Windows в соответствующие переменные среды при входе в систему, а затем скопировано в любой дочерний процесс, который он впоследствии порождает. Дочерний процесс может изменять свои собственные переменные среды с помощью _putenv()
Значение реестра HKLMSOFTWAREMicrosoftWindowsCurrentVersionProgramFilesPath
особенно примечательно, потому что большинство установок Windows помещают %ProgramFiles%
в него строку для чтения 64-разрядными процессами. Эта строка ссылается на переменную среды %ProgramFiles%
, которая, в свою очередь, берет свои данные из значения реестра HKLMSOFTWAREMicrosoftWindowsCurrentVersionProgramW6432Dir
…если только какая-либо программа не изменит значение этой переменной среды априори.
Я написал небольшую утилиту, которая отображает эти переменные среды для 64-разрядных и 32-разрядных процессов. Вы можете скачать его здесь.
Включен исходный код для VisualStudio 2017, а скомпилированные 64-разрядные и 32-разрядные двоичные исполняемые файлы находятся в каталогах ..x64Release
и ..x86Release
, соответственно.
Комментарии:
1. Проводник Windows — это не первый процесс при входе в систему, но он быстро завершает работу.
2. Верно, но считывает ли этот процесс эти значения реестра в переменные среды?