Загадочный каталог “%SystemRoot%\Installer”

Продолжаем начатое ранее расследование. Зачем нужен каталог “%SystemRoot%\Installer”? Поверхностное гугление показало, что я далеко не первый, кто задает такой вопрос и не получает ответ. Пришлось выяснять самому.

В этом каталоге можно найти следующее:

  1. Некий “patch cache” (если судить по имени каталога “$PatchCache$”). Непонятно что это такое. В моем случае этом каталоге есть подкаталог “Managed”. Это может означать как то, что каталог имеет отношение к .NET так и то, что может существовать и другой подкаталог “Unmanaged”;

  2. Иконки, которые хранятся в произвольно именованных файлах в каталогах с именами вида “{CLSID}”. Часть иконок представлена .ico файлами, часть упакована в бинарные файлы в формате PE;

  3. Много .msi и .msp файлов с именами в виде шестнадцатеричных чисел;

  4. Несколько .tmp и других “случайных” файлов. Похоже, что этот каталог по совместительству может использоваться в качестве каталога временных файлов во время инсталляции.

Часть странностей с иконками можно объяснить статьей из MSDN Icon Table:

Icon files that are associated strictly with file extensions or CLSIDs can have any extension, such as .ico. However, Icon files that are associated with shortcuts must be in the EXE binary format and must be named such that their extension matches the extension of the target. The shortcut will not work if this rule is not followed. For example, if a shortcut is to point to a resource having the key file Red.bar, then the icon file must also have the extension .bar. Multiple icons can be stuffed into the same icon file as long as all of the target files have the same extension.

В случае если иконка используется для создания ярлыка, расширение файла с иконкой должно совпадать с расширением файла, на который указывает ярлык. Это ограничение связано с механизмом рекламы (Advertisement), используемом для реализации установки по требованию. Если расширения не будут совпадать, то для рекламируемого компонента будет показывается неверное контекстное меню (см. Validation ICE50).

Я попытался создать простую инсталляцию, чтобы посмотреть, как именно иконки попадают в каталог “%SystemRoot%\Installer”. Взяв за основу инсталляцию ShellLib, добавил создание ярлыка в меню Start:

<Product Name='ShellLib x64 1.0' … >
  …
  <Icon Id="appicon" SourceFile="appicon.ico"/>
  …
    <File Id='ShellLib64.DLL' …>
      <Shortcut 
        Id="Startmenu_ShellLib64.DLL" 
        Directory="ProgramMenuDir" 
        Name="ShellLib64.dll" 
        LongName="ShellLib64.dll" 
        WorkingDirectory='INSTALLDIR'
        Icon="appicon" 
      />            
    </File>
  …

После установки “appicon.ico” нашелся в каталоге “%APPDATA%\Microsoft\Installer{619B4162-1586-4FEE-B4BC-0A069B3CA9DA} ”. Из этого можно сделать выводы что:

В качестве файла иконки можно указать .exe, .dll или любой другой файл в PE формате:

<Icon Id="appicon" SourceFile="appicon.exe" />

В этом случае ссылка на иконку должна дополнительно включать индекс иконки:

<Shortcut … Icon="appicon" IconIndex=”1” />

Более того, в качестве файла иконки можно указать любой файл. Windows Installer просто копирует указанный файл в каталог “%SystemRoot%\Installer” без изменений. Это не означает, впрочем, что в качестве хранилища иконок нужно указывать .exe приложения. Обычно для этого используется специально созданный .exe. Чтобы убедиться в этом, достаточно сравнить файл приложения с файлом иконки. Вышеупомянутая статья Icon Table прямо указывает на это:

The icons for shortcuts, file extensions, and CLSIDs must be stored in files that are separate from the target file itself. This is required because the installer should copy only the small icon files to the user’s machine when advertising the resource. A developer of an installation package therefore needs to author separate files containing only the icons. These icon files are then stored as binary data in the Icon table.

Теперь попробуем разобраться с .msi файлами с именами в виде шестнадцатеричных чисел. Первое наблюдение – новый .msi файл добавляется после каждой инсталляции. Декомпиляция с помощью dark.exe подтвердила догадку - .msi файлы в каталоге “%SystemRoot%\Installer” были модифицированными версиями оригинальных файлов из инсталляции. Похоже, что модификация состояла в том, что из модифицированных версий были исключены все установочные файлы (.cab). Однако все custom actions, бинарные файлы и все остальные установки остались на месте. В результате, размер .msi файла может быть довольно велик. Максимальный размер в моем случае – 17 MB.

Зачем нужны эти файлы? Они используются для деинсталляции и восстановления установленных приложений.

Аналогичная ситуация наблюдается с .msp файлами. Если мне не изменяет память, расширение .msp зарезервировано для обновлений. Учитывая, что обновления ставятся каждый месяц, их должно накопиться приличное количество.

В заключение, пройдемся по пунктам “обвинения” (шучу, шучу :-) ):

“c:\WINDOWS\Installer” - если имеет отношения к Add/Remove Programs то весьма косвенное, и единственное применение этого каталога обнаруженное мной в следующем: ярлычки на программы установленные Windows Installer’ом завянные на вызов конкретных exe файлов ссылаются не на иконки этих exe файлов, а на иконки

К Add/Remove Programs содержимое каталога (.msi и .msp файлы) относится напрямую. При удалении .msi файлов возникают проблемы с деинсталляцией приложений (если верить тому, что находит Гугл).

просто копий тех же exe файлов (адрес см ниже) но с другим именем, которые конечно не могут работать отдельно от библиотек, которых нет рядом (откровенная профанация)

На самом деле, эти файлы должны содержать только иконки, что, впрочем, зависит от разработчика инсталляции. Насколько я могу судить обычно так и есть.

Очень странен сам способ хранения в каталогах файловой системы и без того неэффективной с длинными названиями соответствующими CLSID Наверно такое трюкачество нужно, чтобы показать, что если вы удалите этот “очень важный” каталог, то у Вас … ОЙ пропадут иконки …

Отдельные копии иконок нужны для того, чтобы работала “установка по требованию”. В этом случае ярлык должен показывать правильную иконку даже в том случае, если файлы рекламируемого компонента не установлены вообще.

получается такой каталог “копий иконок” обычно мегабайт на 300

При большом количестве установленных программ и обновлений системы – да. На моей машине размер каталога 683 MB. Размер “иконочной” части – 7 MB. Количество установленных программ и обновлений – 219 штук (обновлений действительно очень много). По-моему вполне разумные цифры.

Вопросы? :-)

comments powered by Disqus