Папка System32 в 64-битной системе - PullRequest
8 голосов
/ 06 декабря 2009

У меня есть cmd-файл, который работает в 32-битной системе Vista.

Я заметил, что в коде есть ссылки на папку драйвера system32.

Мне интересно, может ли код потенциально работать в 64-битной системе Windows 7. Так что я думаю, мой вопрос Содержит ли 64-битная система папку system32?

Буду очень благодарен за любые ответы.

Ответы [ 4 ]

13 голосов
/ 06 декабря 2009

Папка System32 в 64-битной Windows на самом деле содержит 64-битные файлы, и 32-битные программы, работающие под WOW64, обычно ищут в System32 32-битные библиотеки DLL и т. Д., Которые они могут вызвать - но они будут вместо этого найдите 64-битные. Поэтому ОС перенаправляет все запросы 32-разрядных приложений на папку System32 в папку SysWOW64, которая содержит 32-разрядные системные файлы.

7 голосов
/ 06 декабря 2009

В Windows есть технология WoW 64 (64-разрядная версия Windows-on-Windows), которая позволяет 32-разрядным приложениям (даже скомпилированным, написанным на C / C ++ и т. Д.) Работать в 64-разрядной версии Windows.

В дополнение к папке System32, в 64-битной установке Windows есть папка SysWow64, в которой есть 32-битные версии файлов, которые вы найдете в System32.

Для ясности, ссылки на System32 перенаправляются при запуске из 32-разрядного процесса (если процесс не отключает это перенаправление, что возможно). В результате, если у вас есть файл .CMD, который ссылается на System32, он фактически будет считываться из каталога SysWow64.

1 голос
/ 23 мая 2018

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-битное приложение, а затем пожалуйтесь, когда уровень эмуляции заставляет вас пройти через эмуляцию. Ваша заявка - странный чудак; исправить это.

0 голосов
/ 06 декабря 2009

В 64-битной Windows 7 есть папка System32.

Однако, будет ли ваш файл работать, это более сложная проблема.Он может и полностью зависит от того, на что он опирается;если он неверно полагается на драйверы, он потерпит неудачу, так как 32-разрядные драйверы просто не работают в 64-разрядных системах.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...