System32 - это имя папки, содержащей важные файлы операционной системы.
Ранние версии 64-битной Windows XP запускали только 64-битные приложения. Это имело смысл:
- вы запускаете 16-битные приложения в 16-битной Windows
- вы запускаете 32-битные приложения в 32-битной Windows
- вы запускаете 64-битные приложения в 64-битной Windows
И ранние версии 64-битной Windows XP были 64-битными и поддерживали только запуск 64-битных приложений.
И так как все имена папок остаются прежними, вы можете просто перекомпилировать ваше приложение как 64-битное (и не нужно менять что-либо остальное - включая ваши случайно жестко заданные пути), и оно будет просто работа.
Эмуляция 32-битной ОС в 64-битной Windows
Очень быстро стало очевидно, что только запуск 64-битных приложений в 64-битной Windows помешает некоторым людям перейти на 64-битную Windows. Поэтому был создан слой эмуляции, позволяющий запускать 32-разрядные приложения в 64-разрядной операционной системе.
Он назывался WOW64: Windows
on
Windows64
:
- Этот уровень эмуляции имитирует архитектуру x86, виртуализирует ЦП, файловую систему, реестр, переменные среды, функции системной информации и все такое.
- Если 32-разрядная программа пытается просмотреть систему, она увидит 32-разрядную систему.
- Например, если программа вызывает функцию GetSystemInfo, чтобы увидеть, какой процессор работает, ей будет сказано, что он работает на 32-разрядном процессоре с 32-разрядным адресным пространством в мире с 32-разрядным небо и 32-битные птицы в 32-битных деревьях.
- И в этом смысл эмуляции: чтобы 32-битная программа была довольна, имитируя 32-битную среду выполнения.
Проблема в том, где эти 32-разрядные приложения должны хранить все свои 32-разрядные файлы, настраивать расположение своих 32-разрядных библиотек DLL и загружать файлы поддержки 32-разрядной операционной системы?
Мы уже знаем, где нативные приложения хранят свои вещи.
| Native Application |
|---------------------|
| C:\Windows\System32 |
| C:\Program Files |
| HKCU\Software |
Это все правильно и правильно; если вы просто перекомпилируете свое 32-битное приложение как 64-битное: все работает. Все эти места по-прежнему правильны.
32-бит в 64-битном мире
Но теперь, так как мы собираемся отклониться назад для размещения не 64-битных приложений, нам нужно найти место для них, чтобы иметь свои старые 32-битные файлы ОС и хранить свои 32-битные данные, и имеют свои 32-битные программы с 32-битными общими компонентами:
| Native Application | Emulated 32-bit |
|---------------------|---------------------------|
| C:\Windows\System32 | C:\Windows\SysWOW64 |
| C:\Program Files | C:\Program Files (x86) |
| HKCU\Software | HKCU\Software\Wow6432Node |
Проблема в том, что:
- если 64-битная программа запрашивает
C:\Windows\System32
, это чертовски хорошо получить 64-битные файлы
- если 32-битная программа запрашивает
C:\Windows\System32
, это чертовски хорошо получить 32-битные файлы
Это означает, что если 32-разрядный процесс запрашивает о некоторых из этих расположений файлов, Windows должна прозрачно перенаправить вызов в 32-разрядные папки и ключи реестра.
Если 32-разрядная программа, которая считает запущенной в старой 32-разрядной операционной системе, запрашивает 32-разрядное расположение, ей необходимо указать «реальное» расположение:
| Native Application | Emulated 32-bit asks for | Is actually given |
|---------------------|---------------------------|---------------------------|
| C:\Windows\System32 | C:\Windows\System32 | C:\Windows\SysWOW64 |
| C:\Program Files | C:\Program Files | C:\Program Files (x86) |
| HKCU\Software | HKCU\Software | HKCU\Software\Wow6432Node |
Если вы не хотите, чтобы ваше 32-битное приложение подвергалось всем этим эмуляциям и громогласным действиям, тогда решение очевидно:
- создать 64-битное приложение для 64-битной операционной системы
Прекратите создавать 32-битное приложение, а затем пожалуйтесь, когда уровень эмуляции заставляет вас пройти через эмуляцию. Ваша заявка - странный чудак; исправить это.