пятница, 11 сентября 2009 г.

Windows Installer: Изменение одного или нескольких файлов в инсталляции

Сколько ни видел разных программ - к большинству из них почему-то "таблетки от жадности" прилагаются отдельно, зачастую вместе с нетривиальными инструкциями по применению. Между тем, сделать repack не просто, а очень просто...

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

Что для этого требуется? Поставить себе на машину MSI SDK (в моем случае 4.5) и CAB SDK.

Первым делом нам нужно добыть .cab из .msi. (если он интегрирован внутрь пакета)
Делается это командой msidb -x <имя>, где <имя> можно подсмотреть в таблице Media, например, с помощью Orca.
В моем случае это np4000.cab.

В составе CAB SDK есть утилита cabarc, которая прекрасным образом может просмотреть содержимое cab'a и даже его развернуть в заданный каталог (что нынче, прямо скажем - не фокус).

Фокус в другом - cabarc не годится для создания архива, поскольку (и это важно!) файлы в нем должны следовать ровно в том порядке, в котором они перечислены в таблице внутри MSI.

Для этого можно использовать другую утилиту - makecab, которая обеспечивает достаточно хороший контроль над порождаемым архивом.

На вход программы задается так назывемый .DDF-файл, на выходе получаем .CAB, которые можно использовать или as is, или вложить внуть .MSI (при необходимости).

Примерный вид .DDF-файла:
;*** Sample Source Code MakeCAB Directive file example
;
.OPTION EXPLICIT ; Generate errors
.Set MaxDiskSize1=CDROM
.Set CabinetNameTemplate=np4000.cab
.set DiskDirectoryTemplate=CDROM ; All cabinets go in a single directory
.Set CompressionType=MSZIP;** All files are compressed in cabinet files
.Set UniqueFiles="OFF"
.Set Cabinet=ON
.Set Compress=ON
.Set DiskDirectory1=e:\temp\my_extracted_cab

После последней строчки должно следовать перечисление файлов ровно в том порядке, которое cabarc выдал при просмотре исходного cab'a.

Кстати, имена файлов будут совпадать с теми идентификаторами, которые прописаны в .msi. Если не пользоваться бездумно автогенерацией фрагментов инсталляции с помощью tallow/mallow, то это будут не file1, file2, а вполне уникальные и читаемые имена, по которым можно идентифицировать файл.

Следующим шагом будет модификация хэша в .msi (иначе модифицированная инсталляция не поставится).
Складываем в какой-то каталог все файлы, которые мы модифицировали, на этот раз с их родными именами и делаем перерасчет хэша командой
E:\TEMP\i\2.00.011.2040\temp>msifiler -d ..\mfd.msi -h -s E:\TEMP\i\2.00.011.2040\temp\ -v

Обратите внимание, чтобы для всех модифицированных файлов в выдаче была бы строка вида
>> Updating file: E:\TEMP\i\2.00.011.2040\temp\MFRLT_AlarmCache.dll

Теперь уничтожаем старый .cab из .msi:
msidb -k np4000.cab

И добавляем вновь созданный:
msidb -a np4000.cab

После чего стираем лишние файлы, отдаем инсталляцию для работы.

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

При необходимости изменить официальную сборку лучше использовать создание патча, возможно я как-нибудь об этом напишу.

Комментариев нет: