В 2012 году я опубликовал здесь скрипт для автоматической распаковки дистрибутивов конфигураций 1С 7.7 под Windows Vista и Windows 7, включая 64-разрядные версии. Он позволял извлекать файлы из многотомных архивов InstallShield 3.x без запуска старого установщика.
В основе того решения лежала утилита STIX Вайта Каннегизера (Veit Kannegieser), написанная на Virtual Pascal. Существенную помощь с компиляцией её исходников под Win32 оказал andrewks - благодаря ему появилась первая опубликованная версия распаковщика.
В этом году я вернулся к этому проекту по просьбе знакомых и разработал принципиально новую утилиту на C++ (UI) / Rust (Core), без использования каких-либо скриптов, с основным фокусом на удобство пользователя.
Основой модуля декомпрессии стала blast 1.3 Марка Адлера (Mark Adler) - реализация распаковки данных формата PKWARE DCL, опубликованная в каталоге contrib/blast проекта zlib. Для stix-unpacker я адаптировал её на Rust. Формат архивов InstallShield 3.x был восстановлен по исходникам STIX, разбор структуры архивов, поиск и обработка томов реализована отдельно.
Сначала это была небольшая консольная утилита для собственных задач. Позже, в качестве проекта выходного дня, я добавил графический интерфейс и подготовил публичную версию - stix unpacker gui.
Как устроена работа с дистрибутивами
В качестве источника можно выбрать папку с дистрибутивом или ZIP-архив. Утилита поддерживает привычную структуру DISK1, DISK2, …, DISKn, а также размещение всех томов в одной папке.
Один дистрибутив может содержать несколько архивов: например, std и stdonly с файлами конфигурации, demo с демонстрационной базой, а также _setup.lib со служебными файлами установщика. Тома распределяются по папкам носителей: std.1 может находиться в DISK1, std.2 — в DISK2 и так далее.
Программа распознаёт архивы по сигнатурам заголовков, группирует тома, проверяет их последовательность и выводит список файлов с размерами. Выбирать каждый том вручную не требуется.
Для обработки следует указывать папку одного дистрибутива. Если выбрать общий каталог с несколькими дистрибутивами и в нём обнаружатся одноимённые тома разных комплектов, программа сообщит о неоднозначности и остановит обработку.
По умолчанию включён режим Only std* archives (setup mode): извлекаются только архивы, имена которых начинаются со std, в том числе std и stdonly. Их содержимое объединяется в одной выходной папке; варианты имени EXTFORMS приводятся к ExtForms. Чтобы извлечь остальные архивы, например demo, снимите этот флажок. В таком режиме содержимое каждого архива сохраняется в отдельной подпапке.
Проверка и распаковка
После выбора источника доступны две основные операции:
- Verify - проверка распаковки без сохранения извлечённых файлов. Программа действительно декодирует содержимое архивов и проверяет структуру потоков и размеры данных. Это не проверка по контрольным суммам файлов.
- Unpack - извлечение файлов в папку, указанную в поле Output folder.
По умолчанию имя выходной папки формируется из имени входной с добавлением суффикса .unp. При необходимости путь можно изменить вручную. Перезапись существующих файлов включается отдельно флажком Overwrite existing files.
Если источником служит ZIP, сначала его содержимое извлекается в соседнюю папку с тем же именем без расширения .zip. Затем программа анализирует находящиеся в ней архивы InstallShield. Этот подготовительный этап записывает файлы на диск ещё до запуска Verify или Unpack.
Например, для actrcc597.1000000k.original.zip используются следующие папки:
- actrcc597.1000000k.original - содержимое исходного ZIP с томами дистрибутива;
- actrcc597.1000000k.original.unp - файлы конфигурации, извлечённые из архивов InstallShield.
Реализация и совместимость
Программа проверена в Windows 10 и Windows 11 на множестве дистрибутивов конфигураций 1С 7.7. Она предназначена для архивов InstallShield 3.x; более поздние форматы InstallShield CAB не поддерживаются.
Интерфейс написан на C++ с использованием нативного Windows API и стандартных элементов управления, без сторонних GUI-фреймворков. За распаковку InstallShield отвечает статически подключённая Rust-библиотека stix-unpacker, за обработку ZIP - miniz. Отдельные DLL этих библиотек не требуются. Размер текущей сборки MSVC составляет около 700 КБ.
Вступайте в нашу телеграмм-группу Инфостарт