Перенаправление системного пути

В 64-разрядной Windows есть два системных каталога: один содержит 64-разрядные DLL/EXE-файлы и называется "System32", а другой содержит 32-разрядные DLL/EXE-файлы и называется "SysWOW64".

Перенаправление системных путей применяется к значениям определённых параметров, принимающих пути — полный список см. в разделе "Разрядность записи". Пути, начинающиеся с {sys} (или другого значения, расширяющегося до x:\Windows\System32), при необходимости автоматически перезаписываются так, чтобы 64-разрядные записи получали доступ к 64-разрядному системному каталогу, а 32-разрядные записи — к 32-разрядному системному каталогу.

Например, на системе Windows 64-бит в данном случае:

[Files]
Source: "MyLibrary.dll"; DestDir: "{sys}"; Flags: 32bit

файл на самом деле устанавливается в SysWOW64 (32-бит), а не в System32 (64-бит). Но вот в таком случае:

[Files]
Source: "MyLibrary.dll"; DestDir: "{sys}"; Flags: 64bit

файл устанавливается в System32 (64-бит). Однако в фоновом режиме 32-разрядные установщики обращаются к этой папке под псевдонимом Sysnative (как показано в таблице ниже).

В системах под управлением 32-разрядной версии Windows перезапись не происходит. "SysWOW64" не существует, а псевдоним Sysnative не поддерживается.

В секции [Code] функцию ApplyPathRedirRules можно использовать для программного применения правил перенаправления к строкам, содержащим пути.

Перезапись путей выполняется по следующими правилами:

Разрядность записи[1] Разрядность целевого процесса[2] Производимая замена Объяснение
64-бит 32-бит System32Sysnative 32-разрядные процессы должны использовать псевдоним Sysnative, чтобы получить доступ к настоящему 64-разрядному каталогу System32.
32-бит 64-бит System32SysWOW64

64-разрядные процессы могут получить доступ к 32-разрядному системному каталогу только через SysWOW64.

Все подкаталоги также перенаправляются; исключений нет.

32-бит 32-бит System32SysWOW64
(за исключением особых случаев)

В 32-разрядных процессах функция перенаправления файловой системы WOW64 [внешняя ссылка] уже направляет каталог System32 в SysWOW64, но некоторые подкаталоги исключаются (один из примеров: System32\drivers\etc). Явное изменение System32SysWOW64 обходит эти исключения, сохраняя перенаправление в соответствии с правилом 64-разрядного целевого процесса, указанным выше.

В некоторых особых случаях это правило отключается, и вместо него выполняется подстановка SysWOW64System32. См. ниже описание этого правила.

64-бит 64-бит System32не изменяется Каталог System32 является корректным, если запись и целевой процесс являются 64-разрядными.
Любая 32-бит Только в особых случаях:
SysWOW64System32

Эти правила применяются только в особых случаях. Такими случаями являются:

  • установка значений в 32-разрядном ключе реестра SharedDLLs, поскольку SysWOW64 там не используется;
  • передача путей в 32-разрядную программу regsvr32.exe, поскольку DLL-библиотеки, как правило, регистрируются с путём System32;
  • при регистрации и отмене регистрации библиотек COM-объектов в 32-разрядном инсталляторе/деинсталляторе, поскольку библиотеки типов, как правило, регистрируются с путём System32;
  • при вызове функции ApplyPathRedirRules с параметром tp32BitPreferSystem32 для целевого процесса.
Любая 64-бит SysnativeSystem32

64-разрядные процессы не могут использовать псевдоним Sysnative; он доступен только в 32-разрядных процессах.

Хотя данное правило применяется как к 32-разрядным, так и к 64-разрядным записям, использование псевдонима Sysnative допустимо только в 32-разрядных записях.

[1] В функции ApplyPathRedirRules параметр Path64Bit определяет "разрядность записи".

[2] "Целевой процесс" — это процесс, который в конечном итоге будет обращаться к преобразованному пути. В большинстве случаев доступ к путям осуществляется самим инсталлятором или деинсталлятором, поэтому разрядность целевого процесса совпадает с разрядностью программы установки и программы удаления (задаётся директивой SetupArchitecture).