Довга історія системних папок Microsoft Windows


З появою Win32 виник другий системний каталог, який отримав назву C:\Windows\System32. У ньому зберігалися 32-розрядні системні файли, а 16-розрядні залишилися в старому системному каталозі. Ра одним винятком - в Windows 95 і 32-розрядні, 16-розрядні системні файли «жили» в одному каталозі, що зберігали своє старе ім'я C:\Windows\System. Сказане далі ніякого відношення до Windows 95 мати не буде.

Пакетні файли виконували програми з каталогу C:\Windows\System32 , припускаючи, що розрядність програми відповідає розрядності операційної системи. Це було неявне припущення, але воно розумілось по самій природі відбувається. Якби каталог System32 містив тільки 32-розрядні програми, то пакетний файл, що запускає програму C:\Windows\System32\REG .EXE для модифікації параметрів реєстру, виконував би 32-розрядну версію REG.EXE, змінюючи таким чином 32-розрядну імітацію реєстру, а не реальну 64-розрядну версію. З іншими типами файлів зі сценаріями (наприклад, з REG-файлів) виникала б така ж проблема.

Є маса 32-розрядних програм, в яких в коді «зашито» звернення до каталогу System32, а не до функції GetSystemDirectory. Після перекомпіляції цих програм для 64-розрядної Windows вони все одно в пошуках 64-розрядних файлів будуть звертатися до каталогу System32. Шляхи, зазначені в конфігураційних файлах або системному реєстрі, повинні бути зрозумілими» як 32-, так і 64-розрядним процесів і при цьому посилатися на той чи інший каталог залежно від розрядності» викликаючої програми.

Справа ясна, що справа темна...

Щоб вибратися з цієї заплутаної ситуації, в команді розробників Windows вирішили, що у 64-розрядній системі каталог System32 буде містити 64-розрядні файли, а на 32-розрядний — 32-розрядні файли. Число «32» — всього лише частина імені і нічого не означає. Це схоже на «DVD» — це тільки ім'я та насправді нікого не цікавить, як воно розшифровується і розшифровується взагалі. А скільки великих компаній офіційно поміняли назву на послідовності символів, які раніше щось означали, але тепер втратили первісний зміст — HSBC, KFC, BP або KPMG.

Перенаправлення файлової системи для 32-розрядних процесів додає ще один рівень складності до цієї і так вже сильно заплутаній історії. Коли 32-розрядний процес звертається до каталогу C:\Windows\System32в 64-розрядній системі, він спрямовується в каталог C:\Windows\SysWOW64 , де власне і зберігаються 32-розрядні системні DLL-бібліотеки.

У підсумку System32 слід вважати трохи дивним маємо для каталогу, де зберігаються DLL-бібліотеки тієї ж розрядності, що та програма, яка звертається до цього каталогу. У більш ідеальному світі щось подібне назвали б, приміром, каталогом SysExec, тому що саме в такому каталозі розміщувалися б файли розрядності, відповідної середовищі виконання.

...але це не кінець історії!

Що, якщо треба звернутися до реального 64-розрядному системного каталогу з 32-розрядного процесу? Механізм перенаправлення у файловій системі звернення до каталогу C:\Windows\System32переадресует у каталог C:\Windows\SysWOW64 . Можна в програмі використовувати функції з незграбними назвами типу Wow64DisableWow64FsRedirection, але це відключить перенаправлення для всіх операцій, доки його знову не включать. Це створює незручності, коли треба зробити щось більш складне, ніж відкриття одного файлу. При виконанні складної операції це може призвести до звернення до багатьох файлів одночасно або створення робочих потоків.

На цьому наша екскурсія по каталогах, що містять слово «system», закінчується. Якщо ви все ще плутаєтеся, просто пам'ятайте, що функція каталогу рідко відповідає його імені.