В данном случае задача стоит куда более легальная - у нас есть только что сгенерированная инсталляция продукта, чисто в экспериментальных целях нужно подменить там несколько конфигурационных файлов и парочку 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
После чего стираем лишние файлы, отдаем инсталляцию для работы.
Обращаю внимание, что этот полухакерский способ явно не годится для производства официальных инсталляций из-за вопросов, связанных с управлением конфигурациями, воспроизводить такой дистрибутив вручную чревато ошибками.
При необходимости изменить официальную сборку лучше использовать создание патча, возможно я как-нибудь об этом напишу.
Комментариев нет:
Отправить комментарий