Коротко о главном
В 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\System32 | C:\Windows\SysWOW64 |
C:\Windows\lastgood\system32 | C:\Windows\lastgood\SysWOW64 |
C:\Windows\regedit.exe | C:\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.dll64-битным файлом. - В 32-битном окне архитектура будет x86, а
kernel32.dll32-битным файлом из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\catrootC:\Windows\System32\catroot2C:\Windows\System32\driverstoreC:\Windows\System32\drivers\etcC:\Windows\System32\logfilesC:\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-битные процессы перенаправляются незаметно.
Что важно запомнить:
-
System3264-битные файлы,SysWOW6432-битные. -
Sysnativeвиртуальный путь для 32-битных процессов к настоящей 64-битнойSystem32. - Шесть подпапок
System32не перенаправляются. - Скрипты и установщики могут незаметно работать как 32-битные и видеть не те файлы.
- Отключать перенаправление вручную опасно лучше использовать
Sysnativeили 64-битный процесс.
Если вы администратор и ваши скрипты ведут себя странно с файлами или реестром, первым делом проверьте разрядность процесса. Часто проблема не в правах и не в путях, а именно в WOW64 redirector.






