### 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]

● UNARJ32.DLL for Win32  <May.5,2018>
[Vista][WinXP][Win2k][NT4.0][NT3.5x][WinMe][Win98][Win95][Win32s]

 「統合アーカイバ・プロジェクト」の API 仕様に準拠した ARJ 書庫の展開を行うための DLL (ダイナミック・リンク・ライブラリー) です。

 技術解説用としてフリー・ソフトウェアで公開されている UNARJ.EXE のソースをベースとしているため, 展開ルーチン以外は全て自前で作成する必要があったことから, 一応 ARJ.EXE 2.41a の (展開関係の) コマンド・スイッチを付加してあるものの, かなり貧弱なサブセットになってしまっています。

従って, ARJ.EXE Ver 2.5x 以降とは仕様が異なっている部分が存在しますし, 5 以降のメソッドについては展開できず, プロテクト書庫もバックアップメンバーも扱えません。

 DLL であることから, UNARJ32.DLL 単体では何もできません。 (例えば) ここで公開されている LHMelt のような対応アプリが必ず必要になります。


過去の更新履歴

Ver 1.10a からの変更点

Ver 1.10 からの変更点

  • UNARJ32.DLL におけるヒープオーバーフローの脆弱性について
  • UnarjOpenArchive() 等において, 省略値スイッチ指定等が重複して処理されてしまっていたバグを修正しました。
  • 動作妨害や脆弱性利用等を目的とした用途として使用が可能だったことから, レジストリーを利用した省略値スイッチ指定等の機能を削除しました。

Ver 1.04b からの変更点

  • Unarj() 等の API へ規定数を超えたパラメーターを含むコマンド文字列が渡されるとヒープオーバーフローを起こしてしまっていた脆弱性を修正しました。
  • 64 ビット time_t 値でタイムスタンプ情報を得る UnarjGetWriteTime64() 等の API を追加しました。 これに伴いバージョンが 1.10 へ更新となっています。
  • 整合性を考慮して, time_t 値でタイムスタンプ情報を得る UnarjGetArcWriteTime() 等の API を追加しました。 (メンバー用の UnarjGetWriteTime() 等の API は存在したものの, 書庫用の API が存在していなかったため。)
  • UNARJ32.H でのプロトタイプ宣言について, const 修飾子の有無を見直しました。 また, 付加し忘れていた箇所についても修正を行っています。
  • API を実行した結果エラーが返ってきたにもかかわらず, 直後の UnarjGetLastError() が ERROR_SUCCESS を返してしまうことのあったバグを修正しました。
  • Win9x/Win32s 上でデバッグ出力を行った際に, 一般保護エラーとなってしまうことのあったバグを修正しました。 (β版のみで発生。)
  • "-p0" スイッチの指定が無効となってしまうことのあったバグを修正しました。
  • "-hte2" スイッチの指定が無効となってしまっていたバグを修正しました。
  • "-hzs" と指定した場合に, 既定の 8 文字ではなくチェック無しとなってしまっていたバグを修正しました。
  • CP_UTF8 を使用できない環境にもかかわらず, "-hzl65001" 等の指定を行えてしまっていたバグを修正しました。
  • UNARJ32.DLL が使用する既定フォントの取得方法を変更しました。
  • 内部的には全て 64 ビットの time_t 値を扱うように改善しました。これに伴い, FILETIME 値の補正を 1752/09/14 00:00:00~2399/12/31 23:59:59 の範囲で行うように変更しました。 NT 4.0 等, Win2k より前の NT 系 OS や Win9x 系の環境については, 従来どおり 2099/12/31 23:59:59 を上限とします。
  • dir コマンド等, コマンド結果の表示等のみで問題が発生しているようであることから, time_t, ftime への変換について, Win2k 以降の NT 系 OS の場合には, 2099 年での丸めを行わないようにしました。
  • 一部自動的に行っていたタイムスタンプ補正についても, スイッチ指定に従って補正を行うように仕様変更しました。 タイムスタンプ補正をエラーとする設定を行っている場合に, 影響の出る可能性があります。
  • ヘッダーのタイムスタンプ情報を複数の形式で (内部的に) 保持していたものを, FILETIME 形式一本で保持するように整理・改善しました。
  • ファイル破損による誤動作防止のため, DLL ロード時にコード部分の簡易破損チェックを行うようにしました。 正式版のみで機能します。
  • UTF-16 のレスポンスファイル読込時の使用関数を変更しました。
  • API のパラメーターチェックを少々強化しました。
  • Win2k 以降の NT 系 OS の場合には, 既定コードページとして CP_THREAD_ACP を使用するように改善しました。
  • MultiByteCharToWideChar() 等について, 文字コードによって指定できないフラグへの対応を改善しました。
  • ANSI 版 API を使用している場合でも, BOM 付きであれば Unicode 文字のレスポンスファイルを受け付けるように改善しました。

Ver 1.04a からの変更点

  • 状況表示ダイアログの『中止』ボタンで処理を中止した際に, プログラムの抜けてしまうことがあったバグを修正しました。

Ver 1.04 からの変更点

  • 正式版としてコンパイルを行っただけで, 特に変更点はありません。

Ver 1.03a からの変更点

  • メモリーマップドファイルを使用している場合に, まれに一般保護エラーの発生してしまうことがあったバグを修正しました。

Ver 1.03 からの変更点

  • 正式版としてコンパイルを行っただけで, 特に変更点はありません。

Ver 1.02b からの変更点

  • "-hzz" スイッチでの拡張子指定が正常に機能していなかったバグを修正しました。

Ver 1.02a からの変更点

  • Ver 1.02a において, "--" スイッチによるスイッチ文字等の変更が利かなくなってしまうことのあったバグを修正しました。

Ver 1.02 からの変更点

  • 正式版としてコンパイルを行っただけで, 特に変更点はありません。

Ver 1.01b からの変更点

  • 強制指定スイッチについては, それまでの指定にかかわらず, 常に既定値のスイッチ文字を認識するように改善しました。

Ver 1.01a からの変更点

  • 正式版としてコンパイルを行っただけで, 特に変更点はありません。

Ver 1.01 からの変更点

  • Win32s 環境の場合にローカル時間との変換が正常に行われないことのあったバグを修正しました。
  • 'T' 命令の際に CRC エラーのメッセージボックスを表示しないように改善しました。

Ver 1.00a からの変更点

  • 『gzip における脆弱性』の Lzh 関連部分 (CVE-2006-4335, CVE-2006-4337, CVE-2006-4338) に対応しました。

Ver 1.00 からの変更点

  • "--" スイッチが不正扱いとなってしまう環境のあったバグを修正しました。

Ver 0.99b からの変更点

  • 正式版としてコンパイルを行いました。

Ver 0.99a からの変更点

  • Ver 0.99 以降において, NT 系以外の環境で WCharToCharN() が一般保護エラーを起こしてしまう可能性のあったバグを修正しました。

Ver 0.99 からの変更点

  • MySetFilePointer() において, lpToMoveHigh の返却値がおかしかったバグを修正しました。 返却値を使用していないことから表面化はしていません。
  • "-o", "-ob" スイッチについて, (2 秒単位ではなく) 秒単位で指定を行えるように改善しました。 SystemTimeToFileTime() API に問題を抱えている一部の環境 (当該 API がエラーを返してきた場合。) では, 従来どおり DosDateTimeToFileTime() API を使用することから, 2 秒単位となります。

Ver 0.63a からの変更点

  • Unicode 版 API を実装しました。 ただし, UNLHA32.DLL と異なり内部動作が ANSI のままであることから, ANSI 版 API と何も変わりません。 Unicode 版アプリから使用する場合に, 多少扱い易くなっただけです。
  • Unicode 版 API 実装に伴い, UNARJ32.H を ANSI/Unicode 両用の形式へ変更しました。UNARJ32.H の変更によって, マクロ UNICODE の定義有無に従い対象 API が変更されますので, 注意してください。
  • UnarjEnumMembersProc() 系 API を実装しました。
  • UnarjSetCP(), UnarjGetCP(), UnarjGetLastError() API の追加を行いました。
  • SetLangueSpecified() 系 API について, UNLHA32.DLL と同様, 処理結果を返すように仕様変更を行いました。
  • これまで, Unarj() 等で szCmdLine に NULL が渡された場合に ERROR_COMMAND_NAME を返していたものを, ERROR_INVALID_VALUE を返すように変更しました。
  • UnarjExtractMem() API が正常に動作していなかったバグを修正しました。
  • ファイルオープン再試行時について, ファイルが見つからなかったにもかかわらず共有指定変更による再試行を行ってしまっていたバグを修正しました。
  • ワイルドカードによる書庫指定が行われた場合に, 対象書庫が確定される前に FDD チェックを行ってしまっていたため, 正しく判定されないことのあったバグを修正しました。
  • "-htc" スイッチを指定した際に, 処理したファイル数が 0x8000 (32768) 以上になるとエラーとして扱われてしまうことのあったバグを修正しました。
  • 表面化していなかった (そのような条件で呼び出されることがない。) ものの, Mylstrcpyn2() がバッファー溢れを起こす可能性のあったバグを修正しました。
  • 不正パス警告メッセージの抑制を行う "-jyb" スイッチを追加しました。
  • スイッチ指定文字の無効化を行う "--" スイッチを追加しました。 UNLHA32.DLL と異なり, このスイッチを指定した場合, 以降, 一切のスイッチ指定が行えなくなりますので注意が必要となります。
  • 展開時の空き容量チェック警告表示を改善しました。
  • 各 API に渡されたバッファーの確保状況をチェックするように改善しました。 API に渡されたサイズの確保が行われていない (とシステムが判断した) 場合には, ERROR_INVALID_VALUE を返します。
  • FileSearchSubSub() での全指定チェックの無駄を省きました。

Ver 0.63 からの変更点

  • 正式版としてコンパイルを行いました。

Ver 0.62a からの変更点

  • UnarjExtractMem() 等において, 特定の箇所が正常に展開されない環境の存在していたバグを修正しました。
  • UnarjGetAttributes() API を追加しました。
  • MyGetFullPathName() でのパス構築ループで, 無駄にパスを遡りながら構築が行われていた点を改善しました。
  • MyGetFullPathName() においても連続スペースのチェックを行うように改善しました。
  • MyGetFullPathName(), CheckPathName() でのバッファー溢れチェック方法の改善を行いました。
  • メモリーマップドファイル使用時について, バッファー解放タイミングの改善を行いました。

Ver 0.62 からの変更点

  • 正式版としてコンパイルを行いました。

Ver 0.61 からの変更点

  • メモリーマップドファイルを使用していない場合に, ファイルポインターの設定に失敗してしまうことのあったバグを修正しました。
  • UnarjExtractMem() 等において, 展開対象となるメンバーのサイズが 64KB 程度を超えると, 最後の部分が展開されないことのあったバグを修正しました。

Ver 0.60b からの変更点

  • メモリーマップドファイルを使用しての書込オープン時に, サイズが 4GB を超えると書き込みエラーの発生してしまう環境があったバグを修正しました。
  • システムによるメモリーフラッシュの遅延により, ビューのコミットメモリーが蓄積され, 結果, スワップの連続状態に陥りハングアップ (に近い状態) してしまう環境が存在したため, 512MB 毎に強制的に FlushViewOfFile() API でフラッシュを行うように改善しました。

Ver 0.60a からの変更点

  • Ver 0.60 以降において, 環境が Win9x 系の場合にタイムスタンプが操作時のものになってしまうことのあったバグを修正しました。

Ver 0.60 からの変更点

  • 正式版としてコンパイルされているだけで, 変更点はありません。

Ver 0.59b からの変更点

  • "-htp" スイッチに実行可能ファイルの展開を抑制するための BPL_DENY_EXECUTABLE フラグ (8) を追加し, 規定の拡張子をオーバーライドする "-hzz" スイッチについても追加を行いました。
  • "-htp" スイッチで BPL_DENY_TOO_MANY_PARENTS が指定されている場合に, 拡張子偽造の疑われる連続したスペース (規定では 8 文字。) をもつ名前のメンバーを不正扱いとするようにし, 連続数を指定する "-hzs" スイッチを追加しました。
  • ファイル入出力について, メモリーマップドファイルを使用するようにしました。 Win2k 以降で使用され, 書込オープン時はローカルの固定ディスクの場合のみ有効となります。
    入出力ルーチンの変更を伴っていることから, この版の使用には注意してください。 問題が発生した場合は, 設定ダイアログでメモリーマップドファイルの無効化を行うことが可能です。
  • メモリーマップドファイル使用に伴い "-hts" スイッチ関係でのウエイト処理の変更・調整を行いました。
  • 進捗状況表示ダイアログでの描画更新タイミングの調整を行いました。
  • ダイアログ描画更新及びメッセージ送出タイミングの基となる基準サイズの調整を行いました。
  • DELREG.EXE について, WinSFX32M Ver 2.82 対応版への更新を行いました。
  • コンパイルスイッチの変更を行いました。 (stdcall→_fastcall)

Ver 0.59a からの変更点

  • UNLHA32.DLL 等に合わせて DELREG.EXE の更新を行いました。 DLL には変更点がありません。

Ver 0.59 からの変更点

  • 正式版としてコンパイルされているだけで, 変更点はありません。

Ver 0.58a からの変更点

  • Ver 0.56 以降, DELREG.EXE が Win32s 環境で実行できなくなっていたバグを修正しました。
  • Ver 0.58 以降, "-x" スイッチの正常に機能しないことがあったバグを修正しました。

Ver 0.58 からの変更点

  • 正式版としてコンパイルされているだけで, 変更点はありません。

Ver 0.57b からの変更点

  • レスポンスファイルからの読込時にバッファーオーバーフローしてしまうことがあったバグを修正しました。
  • "-p1" スイッチを指定した場合に, 格納ファイルに対する "Dir" といった一階層のみのディレクトリー指定による検索が正常に行われないことがあったバグを修正しました。
  • 上書き確認ダイアログ等について, ファイル名に従ってウインドウサイズを変更するように改善しました。

Ver 0.57a からの変更点

  • (UNLHA32.DLL について) 要望が多かったので, UnarjSetPriority() による優先度設定が THREAD_PRIORITY_NORMAL 以上の場合は, バックグラウンドモード時のみ Sleep() API によるウエイトを入れるようにしました。

Ver 0.57 からの変更点

  • DLL の変更点はありません。

Ver 0.56a からの変更点

  • UnarjSetPriority() API 等による優先度設定が THREAD_PRIORITY_BELOW_NORMAL となっている場合のウエイトを下げることで, NORMAL, LOWEST 間との調整を図りました。

Ver 0.56 からの変更点

  • タイムスタンプの丸め有無を指定する "-htf" スイッチを追加しました。

Ver 0.55b からの変更点

  • Ver 0.56 以降については, LHMelt Ver 1.36h~l 上で使用しないようにしてください。
  • レスポンスファイルが開けなかった場合等, UnarjMain() ルーチン内でエラーが発生した場合に, メモリーリークが発生していたバグを修正しました。
  • 進捗バーが正常に表示されない (0 のまま) ことがあったバグを修正しました。
  • Myfindfirst() のパスチェックを改善しました。 (不正パスチェックではありません。)
  • 他の API と (名前の上での) 統一性をもたせる意味から, UnarjSetlangueJapanese() 等の API を追加しました。
  • 優先順位を指定する UnarjSetPriority() API と "-hts" スイッチを追加しました。

Ver 0.55a からの変更点

  • 不正パスチェックの際にバッファーオーバーフローを起こしてしまう大バグを修正しました。

Ver 0.55 からの変更点

  • ChangeFileNameSub() で, 初期ディレクトリーが正しく設定されていなかったバグを修正しました。
  • サウンドが重複しないように, MyMessageBox() ではサウンドを鳴らさないようにしました。

Ver 0.54 からの変更点

  • "-hm+" を指定した場合に "-ha" スイッチが効かなくなっていたバグを修正しました。
  • 今更なのですが, 状況表示ダイアログでの表示について, 省略記号 ("...") を用いてファイル名が優先して表示されるように改善しました。
  • 0.54 でファイルバッファーの解放忘れを起こしていたバグを修正しました。
  • Win32s 以外では GetTextExtentPoint32() API を使用するように修正しました。
  • 『指定先以外の展開先へ展開が行われる脆弱性』の問題についての対応を行い, 不正パスチェックを行う "-htp1" を省略値としました。 そのため, 絶対パスを前提とした処理を行うアプリケーションで, 不具合の出る可能性があります。

Ver 0.53 からの変更点

  • ファイル処理のバッファーを 64KB から 256KB に拡張しました。
    一応,内部の下請けルーチンでは 64KB 毎の連続書き込みにしてありますが,(手元の環境では大丈夫だったものの) もしかしたら 1.2MB (98 フォーマット) の FD へのアクセスで問題の出る環境が存在するかもしれません。 (そのため,これまでは 64KB にしていた。)
  • 状況表示ダイアログの表示更新タイミングを見直しました。

Ver 0.52b からの変更点

  • UNARJ32.DLL で処理を行った後に, WinFD のフォーカスが混乱してしまっていた不具合を改善しました。
  • UnarjConfigDialog() について, 常に FALSE が返されてしまっていたバグを修正しました。
  • 状況表示ダイアログの子ウインドウ表示位置を改善しました。
[→Page top] [→『UNARJ32.DLL for Win32』] [→Home]