### Micco's Home Page ### Welcome to Micco's page!!
Sorry, but this web page is written in Japanese.
<English>
■ 更新情報
■ このWebページについて
■ お知らせ
■ ダウンロード
■ DLL のインストール方法
■ SFX の設定例
■ いろいろ
対応ブラウザー
[Internet Explorer] [Firefox] [Opera] [Sleipnir] [Safari] [Google Chrome]
連絡先:Micco
[e-mail]
[→Home]

■ 『Microsoft 圧縮 (LZH 形式) フォルダー』について  <Sep.29,2005>

 2005 年 4 月 28 日に公開された「Microsoft 圧縮 (LZH 形式) フォルダー」による展開を行った場合, UNLHA32.DLL や LHa.EXE 等によるものとは若干異なった結果が得られます。

 このページでは, 「Microsoft 圧縮 (LZH 形式) フォルダー」での制限等について簡単に記述してあります。


●タイムスタンプについて

 「Microsoft 圧縮 (LZH 形式) フォルダー」による展開時に一番問題となるのが, このタイムスタンプに関する部分です。

 タイムスタンプは更新日時のみが復元されます。 UNLHA32.DLL 等が独自ヘッダーにより記録している作成日時等については復元されません。 展開時のシステム時間が適用されます。

 さらに, どういう訳か ZIP 書庫の圧縮フォルダーと同様に更新日時の秒については復元されません。 一番制限の大きい h0/h1 形式の書庫であっても, FAT ファイルシステムと同じ 2 秒単位 (偶数秒) の情報が記録されていますが, その記録は無視され, 秒については常にゼロクリアーされます。

 これは相当大きな制限であり, タイムスタンプが重要となるファイルの展開には事実上使えないことを意味します。


[Apr.30,2005 追記]

 上で「タイムスタンプの秒が復元されない」と書きましたが, ZIP 書庫の場合を含めて, これはドラッグ&ドロップ等, 圧縮フォルダーの OLE2 サーバー機能を使用した場合です。

 メニューの「すべて展開」等, 展開ウイザードを使用した場合には全く状況が異なり, 更新日時については秒も含めて正常に復元される上に, 作成日時や参照日時にも更新日時が適用されます。 つまり操作方法によって全く異なった結果となるわけです。

 なお, 同じウイザード形式の操作でも「フォルダーへコピー」等, 編集メニュー配下のものは, OLE2 を使ったものなので, タイムスタンプは復元されません。

 操作方法によって結果が異なる上に, より多く使われるであろう OLE2 による操作時に難あり…と, ことタイムスタンプに関しては, かなり不安定と言わざるを得ないようです。

 余談ですが, 「サーバー機能」と限定しているのには, ちゃんと理由があって, クライアント側に立つ操作となる「圧縮フォルダー機能を使っての ZIP 書庫への格納」の場合には, タイムスタンプが正常に保存されます。 つまり「展開には問題があり, 圧縮・格納には問題がない」ことになります。


[Apr.30,2005 追記 2]

 圧縮フォルダーの系統には, もう一つ, CAB 書庫を扱う「キャビネットファイル」が存在します。 困ったことに, キャビネットファイルは ZIP, LZH 双方の圧縮フォルダーとは, また異なった結果となります。

 キャビネットファイルの場合は, ウイザードの場合でも OLE2 の場合でも, 正常に更新日時が復元されます。 秒がクリアーされるようなことはありません。 そして, 作成日時と参照日時については不定なのです。

 キャビネットを開いた直後では, そのキャビネットを開いた時間の適用されることが多いのですが, それも不変ではなく, ある程度時間が経つと適用される時間が更新されてしまったりします。 さらに, 展開した際の時間が連続して適用されることもあります。 どういった処理を行っているのか理解に苦しむ挙動です。(笑)

 おそらく, 圧縮フォルダー関係のモジュールは, どれも「行き当たりばったり」で作成されているのでしょう。 開発者も仕様も最初に実装されたプラットフォームもバラバラなので, 同系統のものとして扱わないほうが得策なのは明白なのですが, このモジュールが想定している使用者は, 同じものとして扱ってしまう向きの多いのが現実…。 Microsoft には, もっと考えてモジュール作成を行ってほしいものです。


[Jun.18,2005 追記]

 余談ですが, 「タイムスタンプを復元する必要があるのに, 手元には圧縮フォルダーのみで, 他の OLS 等をダウンロードする手段もない…」という状況に陥ることがあります。 そのままであれば困ってしまうわけですが, 少し手間を掛けることでタイムスタンプの復元されたファイルを手に入れることが可能です。

 上のほうで, 「OLE2 サーバーの問題によりタイムスタンプが復元されないだけで, 展開自体は正常に行われている」と書きました。 多くのアプリと同様, 圧縮フォルダーでも, 自分自身で用意した作業場所に, いったんファイルを展開した上で, ドロップした相手へ渡しています。 ドロップした後は用済みになるわけですが, 実は, 圧縮フォルダーを閉じるまでは, それらのファイルが作業場所に残ったままになっています。

 この点を利用すれば, 作業場所から直接コピーなりすることで, タイムスタンプの復元されたファイルを手に入れられるわけです。

 問題は「どこに展開されるのか?」ですが, ある程度知識のある方には簡単なので直接探してもらうとして, そうでない方は「検索」機能を使いましょう。 扱った書庫が「Archives.zip」なら「Archives.zip の一時ディレクトリー 1」という名前で探すことになります。 書庫の名前の後ろと最後の数字の手前には半角スペースが入り, また, 最後の数字は半角です, 念のため。 それと, 目的のフォルダーには隠し属性が設定されていますので, 隠し属性のファイルやフォルダーを扱えるようにしておく必要があります。

●属性について

 全て (読み込み, アーカイブ, 不可視, システム) 正常に復元されます。

●ファイルサイズについて

[Apr.29,2005 追記]

 2GB 以上 4GB 未満のファイルについては正常に扱われます。 4GB を超えるものについては UNLHA32.DLL の独自ヘッダーに対応していないことから正常に扱われません。 基本ヘッダーに記録されている 32 ビットのサイズ情報に基づいて展開を行ってしまい, その結果エラーとなります。

●lhd 形式 (ディレクトリー) メンバーについて

 正常に扱われますが, タイムスタンプは比較的多くのアプリと同様に復元されません。

●圧縮形式について

 lh5 / lh6 / lh7 形式が扱えます。 その他の形式については, 一覧表示は行えるものの扱うことはできません。 (エラーとなります。)


[Sep.29,2005 更新]

 メソッド ID と実際のメソッドが異なるメンバー (lh6 と lh7 形式メソッドの区別されていなかった時期が存在するため, そのような書庫が存在します。) の主なものについては, 以下のとおりです。 メソッド毎の初期化が決め打ちになっていると予想されます。

メソッド
(ヘッダー/実際)
結果  コメント
lh4/lh5 × 実際のルーチンにかかわらず, 未対応メソッドとしてエラー扱いとなる。
lh5/lh4
lh5/lh6 × 普通は展開できない。
lh6/lh5 × 普通は展開できない。
lh6/lh7 × DJLHA を始めとした一時期のツールで作成される。
lh7/lh6

●書庫形式について

 h0 / h1 / h2 形式が扱えますので, 通常, 問題は発生しないものと思われます。

●「指定外の場所へファイルが展開されてしまう脆弱性」の問題について

 絶対パスをもつものや, 親ディレクトリーを示す ".." のパス情報をもつメンバーについては, 不正なものとして無視されるようになっています。 従って一覧表示もされません。 そのため, 例えば, バックアップ等を目的として全てが絶対パスで保存されているような書庫の場合には, 書庫を開いても何も表示されない (空のウインドウ。) ことになります。

●「バッファーオーバーフロー」の問題について

 1000 文字といった長い名前をもったメンバー等の存在する書庫については, 不正書庫としてエラーが表示され扱われないようになっています。


[Sep.29,2005 追記]

 これらの不正なパス情報をもったファイルについては以下のとおりです:

不正内容  結果
絶対パス
(/WORK/Test.TXT)
不正メンバーとしてメンバー自体が無視される。
不正パス
(../../WORK/Test.TXT)
不正メンバーとしてメンバー自体が無視される。
オーバーフロー
(Long~700字~.txt)
不正書庫としてエラーとなる。
拡張子偽造
(Test.c ←40字→ .exe)
特に何も行わないので, アイコン等による確認が必要。
[→Page top] [→Home]