Дело о невидимых файлах.
Как вы думаете, какой сообщение выведет нижеследующая программа, в случае если её запустить на Windows Vista 64 с правами обычного пользователя, т.е. пользователя, у которого нет прав на запись в каталог “C:\Program Files”?
#include <memory.h>
#include <stdio.h>
int main(int argc, char* argv[])
{
FILE* f = NULL;
char cookie[] = { 'b', 'a', 'r', ' ' };
char data[sizeof(cookie)] = { 'f', 'o', 'o', ' ' };
f = fopen("C:\\\\Program Files\\\\foo.txt", "w");
if (f)
{
fwrite(cookie, sizeof(cookie), 1, f);
fclose(f);
}
f = fopen("C:\\\\Program Files\\\\foo.txt", "r");
if (f)
{
fread(data, sizeof(data), 1, f);
fclose(f);
}
if (0 == memcmp(data, cookie, sizeof(cookie)))
{
printf("Success!\\n");
}
else
{
printf("Something went wrong!\\n");
}
return 0;
}
Как это не странно ответ зависит от типа процессора, для которого скомпилирована программа. Если это 64-х битный процессор, то создание файла “C:\Program Files\foo.txt” завершиться неудачей из-за недостатка прав и программа выведет, как и положено, “Something went wrong!”. Однако если ту же программу скомпилировать как 32-х разрядное приложение, она напечатает “Success!”. Т.е. файл создастся, не смотря на то, что пользователь не имеет права создавать файлы в каталоге “C:\Program Files”! Как это возможно?
Ответ – Least-privilege User Account (LUA) Virtualization. Microsoft уже довольно долго пытается убедить пользователей не использовать учетную запись администратора для повседневной работы. Появление LUA в Vista тоже имеет к этому отношение. В частности LUA Virtualization решает проблему старых приложений, которые непременно хотят создавать файлы в системных каталогах.
С помощью отладчика можно посмотреть, что происходит при запуске программы на самом деле.
Если поставить точку останова сразу после создания файла, то в списке описателей в Process Explorer видно, что в реальности файл создается не в “C:\Program Files”, а в каталоге “C:\Users\<user name>\AppData\Local\VirtualStore\Program Files\foo.txt”.
Механизм LUA Virtualization просто перенаправляет файловые операции в пользовательский каталог, если обнаруживает, что программа пытается создать файл, либо открыть существующий файл на запись. Само собой каждый пользователь получит свой набор перенаправленных файлов.
Однако почему же 64-х битная версия не ведет себя подобным образом? Дело в том, что механизм LUA Virtualization нужен только для обеспечения совместимости со старыми приложениями. Все 64-х разрядные приложения по умолчанию считаются достаточно новыми, чтобы корректно работать с системными каталогами.
Полный список условий необходимых для включения LUA Virtualization достаточно обширен:
- Процесс должен быть запущен от имени интерактивного пользователя;
- Процесс должен быть 32-х битным;
- Манифест приложения не должен использовать директиву “requestedExecutionLevel”;
- Системный вызов, например NtWriteFile, должен исходить от потока, находящегося выполняющегося в пользовательском режиме. Кроме того, поток не должен имперсонировать другого пользователя;
- Виртуализируемый файл должен находиться в одном из системных каталогов. По-умолчанию этот список включает в себя: “%SystemRoot%”, “%ProgramFiles%” и “%ProgramData%”, исключая некоторые поддиректории;
- Многие расширения файлов, такие как “.exe”, “.dll”, “.sys” и т.д. входят в довольно обширный список невиртуализируемых расширений. Если файл имен расширение из этого списка, он не будет виртуализирован;
- Администратор должен иметь права на запись в файл, иначе файл также не будет виртуализирован.
Столь длинный список условий ещё раз говорит о том, что механизм LUA Virtualization предназначен только для обеспечения совместимости со старыми приложениями.
По аналогии с файловой системой виртуализируется системный реестр, вернее ветвь “HKEY_LOCAL_MACHINE\SOFTWARE”. Для каждого ключа можно установить флаг, контролирующий виртуализацию. Сам я этого не пробовал, однако утверждается, что это можно сделать с помощью команды “reg flags”.
Кроме того, появление LUA Virtualization затронуло Windows Explorer и Task Manager. Windows Explorer показывает линк “Compatibility Files”, если хотя бы один из файлов текущего каталога был виртуализирован для активного пользователя. Нажатие на этот линк открывает каталог, куда были помещены виртуализированные файлы из текущего каталога. Task Manager показывает статус процесса: “виртуализирован”/”не виртуализирован” (колонка “Virtualization” во вкладке “Processes”).
Ссылки по теме: Developer Best Practices and Guidelines for Applications in a Least Privileged Environment, LUA Virtualization.
Upd: поправил символы ‘<’ и ‘>’.
Извините, вопрос не по этой теме. Сейчас вспомнил думаю Вы можете пролить на это свет.
Я время от времени обслуживаю большое количество машин под управлением Windows XP и часто сталкиваюсь с тем, что следующие каталоги
# c:\WINDOWS\Downloaded Installations”
# “c:\WINDOWS\Installer”
# c:\WINDOWS\system32\dllcache
со временем могут занять большую часть системного диска - скажите мне что-нибудь хорошее, а то я по этому поводу даже не знаю что думать, просто не могу придумать оправдание их существованию.
Лучшим ответом на этот вопрос будет google.
“c:\WINDOWS\Downloaded Installations” - сюда, видимо, Windows Installer складывает скачанные .msi для устанавливаемых ActiveX и прочих on-demand компонентов. Не знаю можно ли их безопасно удалить?
“c:\WINDOWS\Installer” - имеет отношение к Add/Remove Programs. По-идее эти файлы используются для корректного удаления и восстановления установленных программ. Удалять нельзя.
“c:\WINDOWS\system32\dllcache” - это насколько я помню имеет отношение к механизму System File Protection механизм. В свое время были жаркие дискусии по этому поводу. Здесь google поможет наверняка. Можно удалить, но со временем эта папка восстановиться.
Google - это конечно хорошо, но когда вы говорите “видимо” и “По-идее” это верный знак того что видимо не все так видимо, простите за каламбур
“c:\WINDOWS\Installer” - если имеет отношения к Add/Remove Programs то весьма косвенное, и единственное применение этого каталога обнаруженное мной в следующем:
ярлычки на программы установленные Windows Installer’ом завянные на вызов конкретных exe файлов ссылаются не на иконки этих exe файлов, а на иконки просто копий тех же exe файлов (адрес см ниже) но с другим именем, которые конечно не могут работать отдельно от библиотек, которых нет рядом (откровенная профанация)
адрес
%SystemRoot%\Installer\{…CLSID…}\someproductname.exe
Очень странен сам способ хранения в каталогах файловой системы и без того неэффективной с длинными названиями соответствующими CLSID
Наверно такое трюкачество нужно, чтобы показать, что если вы удалите этот “очень важный” каталог, то у Вас … ОЙ пропадут иконки …
получается такой каталог “копий иконок” обычно мегабайт на 300
про c:\WINDOWS\system32\dllcache
для того чтобы убедиться, что каталог dllcache - это всего лишь никак не используемая свалка копий исполняемых модулей достаточно воспользоваться утилитой ProcessExplorer. В среднем это около пол гига украденных у пользователя.
Даже, если это был бы действительно кеш, любому маломальски опытному человеку понятно, что скорость доступа к файлам в каталоге такой длинны будем еще хуже чем к их оригиналам.
каталог “копий иконок” и мнимый dllcache в сумме обходятся пользователям обычно примерно в гигабайт украденного у них свободного места на жестком диске.
И это далеко не все методы отъема гигабайтов у населения, а всего лишь самые сомнительные из них
Жаль, что судиться с MS по этому поводу даже в американском суде бесполезно так как “AS IS”
“Юпитер, ты сердишься - значит, ты неправ”.
Я действительно не знаю всех деталей касательно использования этих каталогов. Я могу только предполагать зачем они нужны и как используются. Тем не менее, я думаю что вы делаете неверные выводы исходя из неверных предпосылок. Я постараюсь разобраться что к чему и оформлю ответ отдельным постом.
[...] Тут в комментариях зашла речь о роли каталога “%SystemRoot%system32dllcache” и причинах почему он занимает столько места. Отвечаю здесь, так как это может быть интересно многим. Для того чтобы убедиться, что каталог dllcache - это всего лишь никак не используемая свалка копий исполняемых модулей достаточно воспользоваться утилитой ProcessExplorer. В среднем это около пол гига украденных у пользователя. Даже, если это был бы действительно кеш, любому маломальски опытному человеку понятно, что скорость доступа к файлам в каталоге такой длинны будем еще хуже чем к их оригиналам. [...]
Кстати с виртуализацией реестра - ключи почему то сохраняются в HKEY ROOT, точнее не в сам ROOT а видимо всетаки в профиль пользователя, но при входе пользователя его виртуальные ключи можно найти именно HKEY ROOT
> ключи почему то сохраняются в HKEY ROOT, точнее не в сам ROOT а видимо всетаки в профиль пользователя
Я думаю они перенаправлются в “HKEY_CURRENT_USER\Software\Classes\VirtualStore” на самом деле. Просто все подключи из “Software\Classes” видны еще и в “HKEY_CLASSES_ROOT”. Я об этом как раз недавно писал: http://blog.not-a-kernel-guy.com/2006/12/25/120
Ага, понял, был невнимателен
санкс