Что такое CHM на самом деле
.chm — это маленькая файловая система. Microsoft назвала её ITSS: заголовок, каталог записей и один или два раздела содержимого — раздел 0 хранится как есть, раздел 1 сжат алгоритмом LZX. Внутри лежат обычные HTML-страницы, таблицы стилей и картинки, плюс несколько потоков метаданных, имена которых начинаются с # или $.
Два из них здесь важны. #SYSTEM хранит заголовок справки и её тему по умолчанию — страницу, которую программа просмотра должна открыть первой. Без неё читателю остаётся гадать, а угадывание по алфавиту обычно приводит к таблице стилей. Файл .hhc — это дерево содержания, записанное как HTML-карта сайта из вложенных <UL> и <LI> с элементами <OBJECT type="text/sitemap"> внутри.
Настоящие .hhc печально известны своей некорректностью — незакрытые пункты списка повсюду, — поэтому они разбираются собственным HTML-парсером браузера, который восстанавливается после этого так же, как это делала оригинальная программа просмотра справки. XML-парсер просто отверг бы такой файл.
Чтение страницы
Стили и изображения каждой страницы разрешаются относительно её собственного пути внутри справки и заменяются байтами самого CHM. Ссылки между темами работают: страница показывается в iframe того же происхождения, но без allow-scripts, поэтому внутри ничего не может выполниться, а сам инструмент способен перехватить щелчок и перейти к нужной теме. Ссылка в открытый интернет не открывается, а внедрённая политика default-src 'none' не даст загрузить её даже случайно.
О сжатии — прямо
Инструмент сообщает, что использует файл: LZX с размером окна и числом блоков сброса, либо ничего, если всё лежит в хранимом разделе.
Декодер LZX здесь написан по спецификации [MS-PATCH] и по lzxd.c из libmspack. Его чтение битового потока, каноническое декодирование Хаффмана, несжатые блоки и фильтр x86 покрыты модульными тестами. А вот декодирование блоков verbatim и aligned ни разу не запускалось на файле, созданном компрессором самой Microsoft, потому что не было офлайн-корпуса для проверки.
Поэтому, если страница не распаковывается, инструмент показывает конкретную ошибку и отказывается что-либо отрисовывать. Он не выводит восстановленные байты на экран. Мусор, похожий на страницу, хуже честной неудачи, потому что отличить их невозможно. Если настоящий файл справки здесь не открылся, об этом стоит сообщить — ошибка наша.
Ещё доступно
Каждая страница с размером и разделом, в котором она лежит, компилятор, собравший файл, и подробности каталога ITSS. Чтобы вытащить файлы, а не читать их, воспользуйтесь извлечением CHM.
Конфиденциальность
Файл справки открывается в браузере и никогда не загружается на сервер.
Tiny Online Tools







