Виртуализация файловой системы и реестра

В этой статье рассмотрим виртуализацию файловой системы и реестра (Virtualize file and registry). Посмотрим на практике, как это всё работает.

Теория

При выполнении приложения оно может запускаться под разными пользователями, поэтому данные приложения для конкретного пользователя хранятся в каталоге пользователя: C:\Users\<username>\AppData, а настройки в пользовательском разделе реестра HKEY_CURRENT_USER\Software. Существуют приложения, которые хотят вместо этих мест хранить свои данные в каталоге C:\Program Files или в разделах реестра, которые для них недоступны. Это устаревшие приложения и Windows тут идет на хитрость.

Устаревшее приложение пытается записать что нибудь в C:\Program Files, при этом у приложения нет доступа на запись в этот каталог. Система это замечает и перенаправляет запись в C:\Users\<username>\AppData. Если приложение пытается что-то считать из C:\Program Files, то система вначале перенаправляет считывание в C:\Users\<username>\AppData, а если в этом каталоге нет нужной информации, то разрешает считать данные из C:\Program Files. По этому же алгоритму работа ведется и с реестром. Это называется виртуализацией файловой системы и реестра.

Такая виртуализация работает если приложение:

  • Не является 64-разрядным. Считается что 64-разрядное приложение не может быть устаревшим, и должно быть написано в соответствии с современными стандартами.
  • Не работает с административными правами. Так как в противном случае у приложения будет возможность писать и каталог и в реестр.
  • Не является службой.

Статус виртуализации процесса можно посмотреть в «Диспетчере задач»:

Если статус «Отключено», то виртуализацию можно включить, нажав правой кнопкой мыши по процессу.

Практика

Откройте командную строку без повышения привилегий и перейдите в каталог c:\windows:

cd c:\windows

Включите виртуализацию для этого процесса (cmd.exe):

Создайте файл из командной строки:

echo hello-1 test.txt

Прочитайте этот файл:

type test.txt
hello-1

Отключите виртуализацию для этого процесса в диспетчере задач, а затем попытайтесь опять прочитать этот файл из командной строки:

type test.txt
Не удается найти указанный файл.
  • На этот раз файл не будет найден.

Теперь посмотрим куда на самом деле сохранился этот файл:

type C:\Users\<username>\AppData\Local\VirtualStore\Windows\test.txt
hello-1

Или можно заменить C:\Users\<username>\AppData\Local\ переменной %LOCALAPPDATA%:

type %LOCALAPPDATA%\VirtualStore\Windows\test.txt
hello-1

Если понравилась статья, подпишись на мой канал в  VK  или  Telegram .