Частенько Криста предоставляет свои обновления без исходников. Для этих случаев была написана программа разбора такого обновления.
У меня не было никакой документации - анализировал содержимое файлов сам, так что могут быть недочеты.
Типичное обновление содержит файл files.dat и набор файлов update_XXX.
files.dat содержит описание файлов входящих в набор и некоторые данные о обновлении (номера версий, компрессия и т.п.).
updates_XXX - это порезанный на куски архив с самим обновлением.
1. Анализируем files.dat.
2. Склеиваем update_XXX
3. Разархивируем то что получилось и получаем файл (назовем его _PACKED_URM_UPDATE_.DAT).
Я сделал разархивирование только для обновлений, сжатых LZMA (при подготовке обновления в программе PatchCreator была установлена галка "Максимальное сжатие"). Формат сжатия для обычных обновлений (сделанных без галки "Максимальное сжатие") я понять не смог. Если у кого нибудь будут идеи - пишите.
Чтоб разархивировать обновление, которое не поддерживает моя прога - нужно на каталоге "URM_Update" в "безопасности" папки поставить запрет удаления файлов и подкаталогов и провести обновление обычным порядком, затем вытащить из папки URM_Update файл _PACKED_URM_UPDATE_.DAT и подсунуть каталог с ним моей проге вместо обновления.
Анализ файла files.dat
04ac - длина файла (4 байта)
23 - количество элементов (4 байта)
а8 - смещение данных (4 байта)
по смещению а8 начинаются данные
1 байт - тип записи(03,05,0f)
затем в зависимости от типа следует структура
если тип 03:
4 байта - длина имени
N байт - имя
4 байта - длина значения
M байт - значение
если тип 05:
4 байта - длина имени
N байт - имя
4 байта - значение
если тип 0f:
4 байта - длина имени
N байт - имя
4 байта - длина значения
M байт - значение
4 байта - значение1
4 байта - значение2
Анализ этого файла позволяет:
1. Узнать тип компрессии (если есть поле LZMA и значение=1, то используем LZMA, иначе неизвестный алгоритм)
2. Узнать количество и имена файлов - т.е. имена кусков на которое порезано обновление.
3. Узнать исходную и новую версию - я не использую
4. Сверить контрольные суммы файлов - я не использую