CHM の正体
.chm は小さなファイルシステムです。Microsoft はこれを ITSS と呼びました。ヘッダー、エントリーのディレクトリ、そして一つか二つのコンテンツセクション — セクション 0 はそのまま格納、セクション 1 は LZX で圧縮されています。中身はごく普通の HTML ページ、スタイルシート、画像に加えて、名前が # や $ で始まるメタデータストリームがいくつか入っています。
そのうち二つが重要です。#SYSTEM はヘルプのタイトルと既定トピック — ビューアーが最初に開くべきページ — を記録しています。これがないと読み手は推測するしかなく、アルファベット順に推測するとたいていスタイルシートに行き着きます。.hhc は目次ツリーで、入れ子の <UL> と <LI> の中に <OBJECT type="text/sitemap"> を置いた HTML サイトマップとして書かれています。
実在の .hhc は不正な HTML であることで有名で、閉じられていないリスト項目だらけです。そこでブラウザー自身の HTML パーサーで解析します。当時のヘルプビューアーと同じように回復してくれるからです。XML パーサーならファイルごと拒否するでしょう。
ページを読む
各ページのスタイルシートと画像は、そのページ自身のヘルプ内パスを基準に解決し、CHM 自身のバイト列に置き換えます。トピック間のリンクも動きます。ページは同一オリジンだが allow-scripts のない iframe に表示されるので中の何も実行されず、一方でツール側はクリックを横取りしてリンク先トピックへ移動できます。外部のウェブを指すリンクはたどりません。挿入された default-src 'none' により、うっかり取得されることもありません。
圧縮について、率直に
このツールはファイルが使っている方式を報告します。LZX ならウィンドウサイズとリセットブロック数、すべてが格納セクションにあるなら「なし」です。
ここで使っている LZX デコーダーは、[MS-PATCH] 仕様と libmspack の lzxd.c をもとに書かれています。ビットストリーム読み取り、正準ハフマン復号、非圧縮ブロック、x86 フィルターにはユニットテストがあります。しかし verbatim・aligned ブロックの復号は、Microsoft 自身の圧縮器が作ったファイルに対して一度も動かしたことがありません。オフラインで試せる資料がなかったためです。
ですからページの展開に失敗した場合、このツールは具体的なエラーを表示し、何も描画しません。復元されたバイト列を画面に出すことはしません。ページのように見えるノイズは、正直な失敗より悪いのです。区別がつかないからです。実在のヘルプファイルでここが失敗したなら報告する価値があります。悪いのはこちらです。
そのほか
各ページのサイズと所属セクション、ファイルを作ったコンパイラー、ITSS ディレクトリの詳細。読むのではなく中身を取り出したい場合は CHM 抽出ツールをどうぞ。
プライバシー
ヘルプファイルはブラウザー内で開かれ、アップロードされることはありません。
Tiny Online Tools







