2001/10/23 更新
Stbhdr (Stub File Header Convertor) Ver.1.01 Copyright (C) 2000-2001 K.Takata 1.概要 一般的な Windows プログラムを MS-DOS で実行すると、"This program cannot be run in MS-DOS mode." というメッセージが表示されます。これ はこのようなメッセージを表示する DOS プログラムが Windows プログラム の中に組み込まれているからなのですが、この組み込まれている DOS プロ グラムのことをスタブプログラムと言います。有効な MS-DOS の EXE プロ グラムであれば、どのプログラムでもスタブプログラムとして使用できるの ですが、スタブプログラムのヘッダはフル MS-DOS ヘッダと呼ばれる形式に なっていなければなりません。Stbhdr は DOS プログラムのヘッダをフル MS-DOS ヘッダ形式に変換して、スタブプログラムとして利用できるように するためのプログラムです。 2.動作環境 MS-DOS, Win9x DOS窓など 3.使用方法 > stbhdr [<option>] <execname>... <option> -f : 必ずフル MS-DOS ヘッダを付加する -p : 可能な限りヘッダを圧縮する -d : DOS 専用プログラムとしてヘッダを圧縮する (スタブ不可) -h, -? : このヘルプを表示する <execname> 処理するプログラム名(ワイルドカード可) 例えば foo.exe の EXE ヘッダをフル MS-DOS ヘッダに変換するには、コ マンドラインから > stbhdr foo.exe と入力します。拡張子が省略されたときは .exe を勝手に付加します。これ で foo.exe に、フル MS-DOS ヘッダを付加すると同時に、ヘッダを圧縮で きる場合は圧縮(無駄な空きを削除)します。オリジナルの foo.exe は foo.old という名前でバックアップされます。foo.old というファイルが既 に存在する場合は上書きされます。 なおプログラムによっては、フル MS-DOS ヘッダではない通常の EXE ヘ ッダのまま、スタブプログラムとして組み込んでも全く問題がない場合があ ります。そのようなプログラムに対しては通常はヘッダの圧縮のみを行い、 フル MS-DOS ヘッダは付加しません。もし、このようなプログラムに対して もフル MS-DOS ヘッダが必要な場合は -f オプションを指定してください。 既にフル MS-DOS ヘッダがあるプログラムに対しては、ヘッダの無駄な空 きがある場合はヘッダを圧縮し、それ以外は何もしません。このとき -p オ プションを指定すると、通常の EXE ヘッダに戻しても問題がないか調べ、 問題がない場合は通常のヘッダに戻します。通常のヘッダの方が少しサイズ が小さいので、少しでもスタブプログラムのサイズを小さくしたい場合は -p オプションを指定してください。 -d オプションを指定すると、(このソフトの名前に反して)スタブとし て組み込まないことを前提としてヘッダの圧縮を行います。プログラムのサ イズは -p を指定したときよりもさらに小さくなる可能性があります。しか し、スタブとして組み込むと正常に動作しない可能性が出てきます。スタブ として組み込むプログラムには -d は指定しないでください。(逆に EXE ヘッダの 3Ch-3Fh が上書きされることを考慮してプログラムを書くことで さらに小さいスタブプログラムを作ることもできますが。) なおプログラ ムによっては -p を指定した場合と -d を指定した場合で全く同じ結果にな ることもあります。 -f, -p, -d を同時に指定した場合、プログラム名の直前に指定したオプ ションが有効となります。(Ver.1.01 から仕様変更) > stbhdr -d -f foo.exe -p bar.exe -d baz.exe として実行すると、foo.exe に対しては -f が、bar.exe に対しては -p が、 baz.exe に対しては -d が指定されたことになります。 Win9x の DOS 窓や Win2k のコマンドプロンプトで Stbhdr を実行した場 合、以下のように LFN(Long File Name) が利用できます。スペースを含む パスを指定する場合は、ダブルクォーテーションで括ってください。 > stbhdr "\Program Files\foo.exe" (参考)Win, DOS 両用プログラムの作り方 スタブプログラムを Windows プログラムに組み込む方法を簡単 に紹介しておきます。コンパイラは Visual C++ 6.0 と LSI C-86 を想定しています。 DOS プログラムのソースが foo16.c、Win32 プログラムのソース が foo32.c だとします。まず foo16.c をコンパイルしスタブプロ グラムを作ります。 > lcc foo16.c > stbhdr foo16.exe 次に foo32.c をコンパイルし、そのときに foo16.exe をスタブと して組み込むように指定します。 > cl foo32.c /link /stub:foo16.exe 以上で foo32.exe が出来上がります。Windows 上で foo32.exe を 実行すると、Win32 プログラムとして動作し、DOS 上で foo32.exe を実行すると、その中に組み込まれた foo16.exe に相当する部分 が動作します。 4.EXE ヘッダの構造と Stbhdr の動作 offset | 内 容 --------+----------------------------------------------------- 00h-01h | "MZ" (*a) 02h-03h | 最終ページサイズ(最後のページに入っているバイト数) (*b) 04h-05h | ファイルページ数 (512bytes 単位のファイルサイズ) (*c) 06h-07h | リロケーションテーブルの項目数 (*d) 08h-09h | ヘッダサイズ(パラグラフ単位)(1paragraph = 16bytes) (*e) 0Ah-0Bh | 必要メモリの最小値(パラグラフ単位) (*f) 0Ch-0Dh | 必要メモリの最大値(パラグラフ単位) (*g) 0Eh-0Fh | SS 初期値(ロードモジュール先頭からの相対アドレス) (*h) 10h-11h | SP 初期値 (*i) 12h-13h | ワード補数チェックサム(未使用?) (*j) 14h-15h | IP 初期値 (*k) 16h-17h | CS 初期値(ロードモジュール先頭からの相対アドレス) (*l) 18h-19h | リロケーションテーブルのオフセット (*m) 1Ah-1Bh | オーバレイ番号 (*n) - | リロケーションテーブル1(4bytes 単位) (*o) 3Ch-3Fh | PE ヘッダのオフセット (*p) - | リロケーションテーブル2(4bytes 単位) (*q) | 512bytes 単位にするための空き (*r) EXE ヘッダは以上のような構造になっています。通常の EXE ヘッダと、 フル MS-DOS ヘッダは、リローケーションテーブルがどこから始まっている かに違いがあります。通常の EXE ヘッダは、リローケーションテーブルは 1Eh から始まっているものが多いようです。一方フル MS-DOS ヘッダは 40h から始まっていて、(*o) の領域は未使用のようです。通常の EXE ヘッダで は、本来 (*o), (*p), (*q) の区別がなく全体を1つのリロケーションテー ブルとして使っているのですが、これをスタブファイルとして組み込んだ場 合 (*p) の部分が上書きされてしまいます。(*d) が7以下ならば (*p) が 上書きされても問題は生じませんが、それ以上ではプログラムが正常に動作 しなくなります。通常 EXE ヘッダのプログラムをスタブとして組み込むと 警告が出るのはこれが理由です。リローケーションテーブルを 1Ch から始 めるようにすると (*d) は8までならば通常 EXE ヘッダでも問題はないよ うになります。Stbhdr では (*d) が9以上ならば無条件でフル MS-DOS ヘ ッダに変換するようにし、それ以下ではオプションに応じて動作します。 ヘッダの圧縮は (*r) の部分を削除することで行っています。リンカは EXE ヘッダを 512bytes 単位にするためにこのような空きを入れているので すが、実際にはヘッダは 512bytes 単位である必要はありません。ここを削 除し、(*b), (*c), (*e) の値を調整することで圧縮ができます。 5.コンパイル方法 このプログラムのコンパイルには LSI C-86 3.30c 試食版と、拙作の LFN library を利用しています。コマンドラインから以下のように入力すると stbhdr.exe ができます。 > lcc stbhdr.c > stbhdr -f stbhdr.exe VC++ 6.0 でもコンパイルできることを確認しています。 6.更新履歴 2000/12/15 Ver.1.00 ・最初の公開バージョン。 2001/10/23 Ver.1.01 ・-d オプションを新設。 7.注意事項、その他 ・このプログラムはフリーソフトウェアです。 ・このプログラムの著作権は作者である私 K.Takata(高田 謙)に帰属しま す。 ・もしこのプログラムを使用することで何らかの問題が発生しても作者はい っさいの責任を負いません。各自の責任で使用してください。 ・アーカイブを変更しない限り配布/転載は自由です。 ・ソースファイルの使用は非商用に限り自由です。 作者 : K.Takata(高田 謙) E-mail : kentkt@anet.ne.jp, HZL03275@nifty.ne.jp URL : http://webs.to/ken/