Каков источник данных для ProgramFiles, ProgramW6432Dir, ProgramFilesDir (x86), переменных среды CommonProgramFiles?

#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. Верно, но считывает ли этот процесс эти значения реестра в переменные среды?