Почему Windows 11 держит 64-битные файлы в System32, а 32-битные в SysWOW64

Коротко о главном

В Windows 11 26H2 есть две папки, которые выглядят так, будто Microsoft перепутала их местами:

  • C:\Windows\System32 хранит 64-битные системные файлы.
  • C:\Windows\SysWOW64 хранит 32-битные системные файлы.

Название System32 содержит «32», но папка предназначена для 64-битных файлов. Название SysWOW64 содержит «64», но внутри лежат 32-битные файлы. kernel32.dll есть в обеих папках, но это разные файлы разного размера: один собран для 64-битных процессов, другой для 32-битных.

Это не ошибка и не опечатка. Причина историческая совместимость. Microsoft сохранила имя System32, потому что тысячи программ, скриптов и установщиков жёстко прописали этот путь. А для 32-битных приложений добавила WOW64 слой совместимости, который незаметно перенаправляет их в SysWOW64.

Рэймонд Чен объяснял, что «32» в System32 давно стало историческим названием, как бренд, который уже не описывает продукт, но остаётся из-за привычки. Если бы Windows можно было спроектировать заново, папку, вероятно, назвали бы иначе например, SysExec. Но менять имя, на которое завязаны десятилетия кода, слишком рискованно.

Откуда взялись названия: короткая история

Чтобы понять путаницу, нужно вернуться к тому, как развивались папки Windows.

16-битная эпоха. Системные файлы лежали в C:\Windows\System.

32-битная эпоха. Microsoft добавила новую папку C:\Windows\System32 для 32-битных системных файлов. Тогда «32» имело прямой смысл: это была папка для 32-битной архитектуры.

64-битная эпоха. Здесь возникла проблема. Множество программ уже жёстко прописали путь System32 в коде, вместо того чтобы спрашивать у Windows правильный системный каталог через GetSystemDirectory. Если бы Microsoft переименовала папку или оставила в ней 32-битные файлы, часть 64-битных программ после перекомпиляции всё равно искала бы свои DLL в System32 и получала бы несовместимые 32-битные библиотеки.

Microsoft выбрала компромисс: System32 всегда содержит файлы, соответствующие архитектуре операционной системы. На 64-битной Windows это 64-битные файлы. А для 32-битных приложений создали отдельную папку SysWOW64 и добавили механизм, который перенаправляет туда 32-битные процессы, даже когда они просят System32.

Что означает WOW64 и почему «64» в названии

WOW64 расшифровывается как Windows 32-bit on Windows 64-bit «32-битная Windows на 64-битной Windows». Это слой совместимости, который позволяет 32-битным приложениям работать на 64-битной Windows.

Что означает «64» в SysWOW64. Это не «64-битные файлы». Это «папка WOW64», то есть папка, относящаяся к механизму запуска 32-битных приложений на 64-битной ОС. Число «64» описывает операционную систему, в которой работает механизм, а не разрядность файлов внутри.

Что означает «32» в System32. Это уже историческое название. Оно пришло из 32-битной эпохи и больше не описывает содержимое. На 64-битной Windows внутри лежат 64-битные файлы.

Как работает WOW64 redirector

32-битный процесс не может загрузить 64-битную DLL для выполнения, и наоборот. Если бы 32-битная программа загрузила kernel32.dll из 64-битной System32, она получила бы файл, который не может использовать.

Поэтому WOW64 применяет перенаправление файловой системы (file system redirection): когда 32-битный процесс обращается к System32, Windows в фоне подменяет путь на SysWOW64.

Что запрашивает 32-битное приложениеКуда его направляет 64-битная Windows
C:\Windows\System32C:\Windows\SysWOW64
C:\Windows\lastgood\system32C:\Windows\lastgood\SysWOW64
C:\Windows\regedit.exeC:\Windows\SysWOW64\regedit.exe

Приложение не знает об этом. С его точки зрения оно открыло System32 и нашло там файлы, которые может запустить.

Важное исключение: если открытие перенаправленного файла вызвало бы запрос UAC, Microsoft указывает, что перенаправление не происходит и запускается 64-битная версия. Поэтому разработчикам советуют либо явно использовать путь SysWOW64, либо запускать 32-битное приложение от имени администратора.

Как убедиться в перенаправлении самостоятельно

Это можно проверить за пару минут, если открыть два разных командных приглашения.

Шаг 1. Откройте 64-битную командную строку. Обычный cmd.exe из меню «Пуск» на 64-битной Windows будет 64-битным.

Шаг 2. Откройте 32-битную командную строку. Запустите C:\Windows\SysWOW64\cmd.exe.

Шаг 3. Выполните в каждом окне две команды:

echo %PROCESSOR_ARCHITECTURE%

dir C:\Windows\System32\kernel32.dll

Что вы увидите:

  • В 64-битном окне архитектура будет AMD64, а kernel32.dll 64-битным файлом.
  • В 32-битном окне архитектура будет x86, а kernel32.dll 32-битным файлом из SysWOW64, с другим размером.

Один и тот же путь, но два разных файла. Это ловит даже опытных разработчиков: если из 32-битного окна вывести список kernel32.dll в обеих папках, результаты могут выглядеть одинаково, и создаётся впечатление, что папки идентичны.

Sysnative: как 32-битное приложение попадает в настоящий System32

Иногда 32-битному процессу действительно нужны настоящие 64-битные файлы. Для этого Windows предоставляет Sysnative виртуальную папку, которая существует только для 32-битных процессов.

Что нужно знать о Sysnative:

  • Это не реальная папка. В C:\Windows вы её не найдёте.
  • 64-битные приложения не могут её использовать.
  • Из 32-битной командной строки команда dir C:\Windows\Sysnative\cmd.exe работает.
  • В адресной строке 64-битного Проводника C:\Windows\Sysnative не находится.

Зачем это нужно. Если 32-битный установщик должен запустить 64-битную версию системной утилиты, он может обратиться к ней через Sysnative. WOW64 распознаёт этот алиас и не перенаправляет доступ, поэтому процесс попадает в реальную 64-битную System32.

Альтернатива для разработчиков. Можно отключить перенаправление для потока функцией Wow64DisableWow64FsRedirection. Но Microsoft предупреждает: это влияет на каждую файловую операцию в потоке и может привести к сбоям загрузки DLL. Для большинства кода лучше не бороться с redirector, а либо использовать Sysnative, либо запускать 64-битный helper-процесс.

Шесть папок, которые не перенаправляются

WOW64 перенаправляет не всё. Microsoft перечисляет шесть подпапок System32, доступ к которым не перенаправляется в SysWOW64:

  • C:\Windows\System32\catroot
  • C:\Windows\System32\catroot2
  • C:\Windows\System32\driverstore
  • C:\Windows\System32\drivers\etc
  • C:\Windows\System32\logfiles
  • C:\Windows\System32\spool

Почему именно эти папки. Microsoft не объясняет причину исключений. Разумное объяснение: эти папки содержат общие данные, которые оба типа приложений должны видеть в одном экземпляре. Например, в drivers\etc лежит файл hosts и 32-битные, и 64-битные программы должны читать один и тот же файл, а не две его копии.

Список менялся со временем. driverstore всё ещё перенаправлялся в Windows XP, Windows Vista, Windows Server 2003 и Windows Server 2008. Позже его включили в список исключений.

Что это значит для администраторов и скриптов

Самая распространённая реальная проблема скрипт, который незаметно выполняется как 32-битный процесс. Его мог запустить 32-битный агент, старый установщик или инструмент, который стартует SysWOW64\WindowsPowerShell. В результате скрипт читает не то представление реестра и загружает 32-битные копии системных утилит.

Как проверить разрядность текущего процесса в PowerShell:

[Environment]::Is64BitProcess

[Environment]::Is64BitOperatingSystem

$env:PROCESSOR_ARCHITECTURE

$env:PROCESSOR_ARCHITEW6432

В 32-битном процессе на 64-битной Windows PROCESSOR_ARCHITECTURE показывает x86, а реальная архитектура лежит в PROCESSOR_ARCHITEW6432.

Как перезапустить скрипт в 64-битном PowerShell. Если скрипт должен работать в 64-битном хосте, его можно перезапустить через Sysnative:

$ps64 = "$env:windir\sysnative\WindowsPowerShell\v1.0\powershell.exe"

& $ps64 -NoProfile -ExecutionPolicy Bypass -File $PSCommandPath

Совет для Intune. При развёртывании PowerShell-скриптов через Intune проверьте настройку, которая запускает скрипт в 64-битном хосте PowerShell. Если её не включить, скрипт может выполняться как 32-битный процесс, а файловые и реестровые операции будут проходить через WOW64 без видимой ошибки.

Реестр и Program Files: перенаправление не только для файлов

WOW64 даёт 32-битным приложениям отдельное представление реестра под HKEY_LOCAL_MACHINE\Software\Wow6432Node. Кроме того, переменная %ProgramFiles% для них указывает на Program Files (x86).

Если скрипту нужно конкретное представление реестра, указывайте его явно:

reg query "HKLM\SOFTWARE\Contoso" /reg:64

reg query "HKLM\SOFTWARE\Contoso" /reg:32

В PowerShell:

$hklm64 = [Microsoft.Win32.RegistryKey]::OpenBaseKey('LocalMachine','Registry64')

$hklm32 = [Microsoft.Win32.RegistryKey]::OpenBaseKey('LocalMachine','Registry32')

Особенности ARM-устройств

На ARM-ПК, таких как ноутбуки на Snapdragon X, 32-битные x86-приложения тоже перенаправляются в SysWOW64. Раньше 32-битные ARM-приложения перенаправлялись в третью папку SysArm32. Сейчас Microsoft указывает, что ARM-ПК больше не поддерживают 32-битные ARM-приложения, а бинарники из SysArm32 удалены. Обычные x86-приложения и 32-битные, и 64-битные продолжают работать через эмуляцию Prism, которая в прошлом году получила поддержку AVX и AVX2.

Часто задаваемые вопросы

System32 действительно для 32-битных файлов?

Нет. На 64-битной Windows System32 содержит 64-битные файлы. Название «32» историческое, оно пришло из 32-битной эпохи и больше не описывает содержимое.

SysWOW64 действительно для 64-битных файлов?

Нет. SysWOW64 содержит 32-битные файлы. «64» в названии относится к 64-битной операционной системе, в которой работает механизм WOW64, а не к разрядности файлов.

Почему kernel32.dll есть в обеих папках?

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

Что такое Sysnative?

Это виртуальная папка, которая существует только для 32-битных процессов. Она позволяет 32-битному приложению обратиться к настоящей 64-битной System32 в обход перенаправления. В C:\Windows её нет, и 64-битные приложения её использовать не могут.

Какие папки не перенаправляются?

Шесть подпапок System32: catroot, catroot2, driverstore, drivers\etc, logfiles, spool. Microsoft не объясняет причину исключений, но, вероятно, дело в общих данных, которые оба типа приложений должны видеть в одном экземпляре.

Почему мой скрипт не видит файл, который есть в Проводнике?

Скорее всего, скрипт выполняется как 32-битный процесс и перенаправляется в SysWOW64. Проверьте [Environment]::Is64BitProcess и запустите скрипт в 64-битном PowerShell.

Можно ли отключить перенаправление?

Технически да, через Wow64DisableWow64FsRedirection. Но Microsoft предупреждает, что это влияет на все файловые операции в потоке и может сломать загрузку DLL. Для большинства задач лучше использовать Sysnative или 64-битный helper.

Что означает «WOW64»?

Windows 32-bit on Windows 64-bit механизм, позволяющий 32-битным приложениям работать на 64-битной Windows.

Это когда-нибудь переименуют?

Крайне маловероятно. System32 жёстко прописан в огромном количестве программ, скриптов и установщиков. Рэймонд Чен объяснял, что смена имени сломала бы совместимость. Microsoft предпочитает сохранять историческое имя и решать проблему через перенаправление.

Что в итоге

Путаница с System32 и SysWOW64 это не ошибка Microsoft, а следствие десятилетий совместимости. System32 сохранила историческое имя, но на 64-битной Windows содержит 64-битные файлы. SysWOW64 получила имя от механизма WOW64 и хранит 32-битные файлы, к которым 32-битные процессы перенаправляются незаметно.

Что важно запомнить:

  • System32 64-битные файлы, SysWOW64 32-битные.
  • Sysnative виртуальный путь для 32-битных процессов к настоящей 64-битной System32.
  • Шесть подпапок System32 не перенаправляются.
  • Скрипты и установщики могут незаметно работать как 32-битные и видеть не те файлы.
  • Отключать перенаправление вручную опасно лучше использовать Sysnative или 64-битный процесс.

Если вы администратор и ваши скрипты ведут себя странно с файлами или реестром, первым делом проверьте разрядность процесса. Часто проблема не в правах и не в путях, а именно в WOW64 redirector.

Читайте также на блоге andko.ru

0 0 голоса
Рейтинг статьи
Подписаться
Уведомить о
guest
0 комментариев
Популярные
Новые Старые

0
Оставьте комментарий! Напишите, что думаете по поводу статьи.x
Menu