В этой статье рассмотрим виртуализацию файловой системы и реестра (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