Windows 11이 64비트 파일은 System32에, 32비트 파일은 SysWOW64에 저장하는 이유

MS는 Windows 11의 32비트 버전을 제공하지 않지만, 운영 체제는 여전히 수십 년 동안 축적된 32비트 애플리케이션을 지원해야 합니다. 이를 위해 두 개의 시스템 디렉터리를 사용합니다. 네이티브 64비트 파일용 System32와 32비트 파일용 SysWOW64입니다. 32비트 애플리케이션이 System32에 액세스하려고 하면 WOW64 파일 시스템 리디렉터가 자동으로 SysWOW64로 연결합니다.
Windows 11 26H2가 실행되는 PC에서는 두 디렉터리 모두 kernel32.dll이라는 파일을 포함합니다. 하나는 64비트 애플리케이션용이고 다른 하나는 32비트 소프트웨어용이므로 파일 크기가 서로 다릅니다.

Apple처럼 MS도 32비트 소프트웨어 지원을 종료할 수 있다면 Windows에는 더 이상 이러한 호환성 아키텍처가 필요하지 않을 수 있습니다. 그러나 기존 32비트 애플리케이션이 매우 많아 이러한 전환은 훨씬 더 어렵습니다.
System32에 64비트 파일이 포함된 이유
16비트 Windows 시대에는 시스템 파일이 C:\Windows\System에 저장되었습니다. 32비트 Windows가 등장하면서 MS는 32비트 파일용 C:\Windows\System32를 도입했으며, 이것이 해당 디렉터리 이름의 유래입니다.
64비트 Windows가 개발될 무렵에는 많은 애플리케이션이 GetSystemDirectory 함수를 통해 경로를 가져오는 대신 System32 경로를 하드코딩하고 있었습니다. MS의 베테랑 개발자 Raymond Chen은 이러한 애플리케이션을 64비트 프로그램으로 다시 컴파일한 후에도 계속 System32를 찾았지만, 이제는 그 위치에 64비트 파일이 있을 것으로 예상하게 됐다고 설명했습니다.
배치 파일도 비슷한 호환성 문제를 일으켰습니다. System32에 32비트 도구가 계속 저장됐다면 System32\reg.exe를 실행하는 스크립트는 예상되는 64비트 레지스트리 뷰가 아니라 32비트 레지스트리 뷰를 수정했을 것입니다.
이에 따라 MS는 System32에 운영 체제의 네이티브 아키텍처와 일치하는 파일을 저장하기로 결정했습니다. MS의 파일 시스템 리디렉터 문서에는 64비트 Windows에서 %windir%\System32 디렉터리가 64비트 애플리케이션용으로 예약된다고 명시돼 있습니다.
MS가 64비트 버전을 만들 때도 대부분의 DLL 이름은 변경되지 않았습니다. 그 결과 이전 MS-DOS 명명 규칙을 따르는 kernel32.dll은 두 위치 모두에서 kernel32.dll이라는 이름을 사용합니다. 따라서 32비트 버전을 위한 별도의 디렉터리가 필요했습니다.
Chen은 이제 System32의 “32”가 폴더 내용을 정확히 설명하는 표현이 아니라 단순히 이름의 일부일 뿐이라고 언급했습니다. 그는 이상적으로 설계했다면 실행되는 프로그램에 적합한 파일을 제공한다는 의미에서 폴더 이름을 SysExec으로 지었을 수도 있다고 제안했습니다.
WOW64는 “64비트 Windows에서 실행되는 32비트 Windows(Windows 32-bit on Windows 64-bit)”를 의미합니다. 이는 32비트 애플리케이션을 위한 MS의 호환성 계층입니다. SysWOW64의 “64”는 해당 디렉터리에 32비트 파일이 들어 있음에도 호스트 운영 체제를 가리킵니다. 아이러니하게도 64비트 애플리케이션은 이름에 “64”가 포함된 시스템 폴더를 사용하지 않습니다.
Windows 11이 32비트 애플리케이션을 SysWOW64로 리디렉션하는 방식
32비트 프로세스는 실행을 위해 64비트 DLL을 로드할 수 없으며, 64비트 프로세스도 32비트 DLL을 로드할 수 없습니다. 리디렉션이 없다면 System32에서 kernel32.dll을 요청하는 32비트 애플리케이션은 호환되지 않는 파일을 받게 됩니다.
x64 Windows에서는 32비트 애플리케이션이 보호된 System32 경로를 요청할 때마다 WOW64가 관련 파일 시스템 요청을 투명하게 리디렉션합니다. 일반적으로 애플리케이션은 경로가 변경됐다는 사실을 인식하지 못합니다.
C:\Windows\SysWOW64\cmd.exe에서 32비트 명령 프롬프트를 열면 이러한 동작을 확인할 수 있습니다. 해당 창에서 echo %PROCESSOR_ARCHITECTURE%를 실행하면 x86이 반환되지만, 표준 64비트 명령 프롬프트에서는 AMD64가 표시됩니다. 두 창에서 dir C:\Windows\System32\kernel32.dll을 실행하면 같은 경로를 입력했는데도 서로 다른 파일 크기가 표시됩니다. 이는 32비트 프로세스가 SysWOW64에 있는 파일로 리디렉션되기 때문입니다.


당시 MS Visual Studio 팀의 일원이었던 Matt Pietrek조차 이러한 동작을 경험했습니다. 그는 2006년 MSDN Magazine 기사에서 32비트 명령 프롬프트를 통해 두 디렉터리의 kernel32.dll을 나열했을 때 결과가 동일하게 나타나 처음에는 당황했다고 설명했습니다.
WOW64의 기능은 파일 시스템 리디렉션에만 국한되지 않습니다. 레지스트리 리디렉터를 통해 32비트 애플리케이션에 HKEY_LOCAL_MACHINE\Software\Wow6432Node 아래의 별도 레지스트리 뷰를 제공합니다. 또한 해당 애플리케이션의 %ProgramFiles% 환경 변수를 Program Files (x86)으로 설정합니다.

MS는 사용자 계정 컨트롤과 관련된 특이한 예외 사항도 언급합니다. 리디렉션된 파일을 열 때 UAC 프롬프트가 표시되면 리디렉션이 발생하지 않고 Windows가 대신 64비트 버전을 실행합니다. 따라서 개발자는 필요한 경우 SysWOW64 경로를 명시하거나 32비트 애플리케이션을 관리자 권한으로 실행해야 합니다.
가상 Sysnative 디렉터리 사용하기
Sysnative는 32비트 애플리케이션에서만 사용할 수 있는 가상 디렉터리입니다. 이 디렉터리는 C:\Windows 아래에 실제로 존재하지 않으며 64비트 애플리케이션에서는 액세스할 수 없습니다. 64비트 파일 탐색기의 주소 표시줄에 C:\Windows\Sysnative를 입력하면 오류가 발생하지만, 32비트 명령 프롬프트에서는 dir C:\Windows\Sysnative\cmd.exe가 정상적으로 작동합니다.

개발자는 Wow64DisableWow64FsRedirection 함수를 호출해 리디렉션을 비활성화할 수 있지만, 이렇게 하면 현재 스레드의 모든 파일 작업에 영향을 줍니다. MS는 파일 시스템 리디렉션을 비활성화하면 DLL 로드에 실패할 수 있다고 경고합니다.
Chen은 Sysnative를 “국소적인 문제에 대한 국소적인 해결책”이라고 설명했습니다. 그는 이전에도 개발자들에게 에뮬레이터의 동작을 억지로 우회하지 말라고 조언했으며, 네이티브 64비트 작업이 필요한 경우 32비트 설치 프로그램이 64비트 설치 프로그램을 실행하도록 권장했습니다. 많은 호환성 문제는 32비트 애플리케이션이 64비트 프로세스처럼 동작하려고 할 때 발생합니다.
6개의 System32 폴더는 WOW64 리디렉션에서 제외
MS는 32비트 애플리케이션이 리디렉션 없이 액세스할 수 있는 6개의 System32 하위 디렉터리를 명시하고 있습니다. 예외 목록은 시간이 지나면서 변경돼 왔습니다. 예를 들어 driverstore는 Windows Vista, Windows XP, Windows Server 2003 및 Windows Server 2008에서 리디렉션됐습니다.
MS는 각각의 예외가 지정된 이유를 설명하지 않습니다. 그러나 이들 디렉터리 중 일부에는 drivers\etc 아래의 hosts 파일처럼 32비트와 64비트 애플리케이션이 모두 일관되게 액세스해야 하는 공유 데이터가 포함돼 있습니다.
Arm용 Windows 11에서 SysArm32 제거 중
Snapdragon X 노트북과 같은 Arm 기반 컴퓨터에서도 32비트 x86 애플리케이션은 SysWOW64를 사용합니다. 과거에는 32비트 Arm 애플리케이션이 SysArm32라는 세 번째 디렉터리로 리디렉션됐습니다.
MS의 구현 문서에 따르면 Arm64 시스템에서 WOW64는 xtajit.dll이라는 에뮬레이터를 통해 x86 코드를 변환합니다. 이에 비해 x64 프로세서는 32비트 코드를 네이티브로 실행하며, Wow64Cpu.dll이 실행 모드 간 전환을 관리합니다.
MS의 Arm 개발자 문서에는 이제 Arm PC가 더 이상 32비트 Arm 애플리케이션을 지원하지 않는다고 명시돼 있습니다. 이전에 SysArm32 디렉터리에 저장됐던 시스템 바이너리도 제거되고 있습니다. 32비트와 64비트 형식의 표준 x86 애플리케이션은 지난해 AVX 및 AVX2 지원이 추가된 Prism 에뮬레이션을 통해 계속 실행됩니다.
더 명확한 이름보다 호환성을 우선
MS는 20년 전에 System32의 이름을 바꿀 수도 있었지만, 그렇게 했다면 기존의 많은 애플리케이션이 작동하지 않았을 것입니다. 대신 기존 디렉터리 이름을 유지한 채 리디렉터, 가상 별칭, 예외 규칙을 구축했습니다. 이는 오래된 소프트웨어를 위해 Windows 95 힙 관리자 같은 요소를 보존한 것과 동일한 호환성 중심 접근 방식입니다.
모든 애플리케이션이 64비트 Windows로의 전환 과정에서 살아남은 것은 아니며, 3D Pinball이 대표적인 사례입니다. SysExec 같은 이름이 더 명확했겠지만, 오래된 디렉터리 이름은 광범위한 애플리케이션 및 설치 프로그램 오류보다 피해가 적습니다.

