MakeV29h.bas (c) 1994 by Altair☆ ○ 概要 MakeV29h.basは、OS/2のDOSセッションでVzのコンソール取り込みが働かない。 この問題を解決する為にANSI.SYSにパッチを当てるソフトウェアです。 QBASICでコーディングしてあります。 Vzのコンソール取り込みサポートの為に独立したCONドライバを1本書こうかとも 思ったのですが、たった3byteのANSI.SYSのパッチで問題解決が出来る事を実証す る為に、CONドライバの作成はやめて、パッチ用プログラムを公開する事にしまし た。 これにより、ANSI.SYSのごくごく些細な変更で、OS/2のDOSセッションでVzのコ ンソール取り込みが働かない問題を解決できる事を実証できたので、是非、次回の 修正モジュールの配布かバージョン・アップからは、IBMさんがVzのコンソール取り 込みをサポートしたANSI.SYS(或はCONドライバ)を配布して下さるよう切に希望し ます。m(_ _)m > IBM (...と言うのは後から付けた大義名分で、本当は、CONドライバを書くのがメン ドかっただけ。ANSI.SYSをパッチする方が簡単なのだよ。^^;) ○ テストした環境 このパッチ当てで、元になるANSI.SYSは、以下のタイム・スタンプの物でテスト して、うまく行きました。(^_-)v ANSI.SYS 8067 9-07-93 2:10a 日付やサイズが違っていても、運が良ければ、うまく動作すると思います。運が 悪ければ、うまく動作しません。あきらめて下さい。(^^;) ○ パッチの当て方 結構、面倒なので、よく読んで、落ち着いて作業する事。 MakeV29h.basは、フール・プルーフとかエラー処理のチェックは大幅に手を抜い ているので、よく読まずにあわてて作業すると、泣くのはあなた。 0) 準備 PC-DOSプロンプトでANSI.SYSが組み込まれる様にDOS設定をしておく事。ANSI.SYS 以外のデバイス・ドライバを組み込まない事。 1) ANSI.SYSがcomモデルかexeモデルかを調べる。 ブート・ドライブの\OS2\MDOSディレクトリを表示し、ANSI.SYSオプジェクトを左 ボタンでダブル・クリックしOS/2システム・エディタを起動する。ファイルの読み取 り中にNULL文字が・・・というメッセージが出るが、これを無視し、ファイルのロー ド続行を指示する。 最初の行の最初の2文字が『MZ』であったなら、OS/2システム・エディタをクロー ズしてから、ステップ3へ。 そうでなければ、OS/2システム・エディタをクローズしてから、ステップ2へ。 2) ANSI.SYSをワーク・ディレクトリにコピーする。 PC-DOSプロンプト(DOS英語モード)を起動し、\OS2\MDOS\ANSI.SYSをワークディ レクトリにANSIv29h.sysと言う名前でコピーする。 ステップ4へ。 3) ANSI.SYSをワーク・ディレクトリにコピーする。 PC-DOSプロンプト・ウィンドウ表示(DOS英語モード)を起動し、ウィンドウの左上 のボタンをマウスでクリックしポップ・アップ・メニューを表示する。DOS設定(T)を 選び、DOS_VERSIONにexe2bin.exe,6,00,255を指定する。ハード・ディスクに導入さ れているDOSがDOS 4またはDOS 5であれば、6,00,255の代わりに、4,00,255、また は、5,00,255を指定する。copyコマンドの代わりにDOSユーティリティのexe2binを 使って、ワーク・ディレクトリにANSI.SYSのコピーをANSIv29h.sysと言う名前で作 成する。(コピーされたANSIv29h.sysは、EXE2BINの作用により、サイズが小さくな ります)。 例) c:\dos\exe2bin d:\os2\mdos\ansi.sys c:\temp\ANSIv29h.sys 4) makev29hを起動する。 必要なら、CDコマンド等を用いて、開いているPC-DOSセッションのワーク・ディ レクトリに移動する。ワーク・ディレクトリにMakeV29h.basとANSIv29h.sys、そし て勿論ANSIv29h.sysを用意し、qbasic /run MakeV29h.basを実行する。 Patched up・・・というメッセージが表示されれば、たぶん、パッチ成功。 5) 完成 各DOSセッションのDOS設定でANSI.SYSを組み込む代わりに、上の作業で作成した ANSIv29h.sysを組み込む。 これで、DOSのVzエディタで、コンソール取り込みが可能になる・・・かも知れない。 ○ パッチ当ての原理 このパッチ当てプログラムは、幾つかの推論と仮定を元にコーディングした物で す。 逆アセンブルでANSI.SYSがどういうロジックで動いているかを解析してパッチを 当ててしまえば確実で簡単なのですが、OS/2の使用許諾条件では逆アセンブルが禁 止されていますから、逆アセンブルに頼らない手段で、パッチすべき個所を特定し なければなりません。 その為には、いくつかの仮定が必要になりました。 事実 1) Vzのコンソール取り込みがうまくいかないのは、OS/2のDOSセッションの コンソール表示がint 29hを経由しないからである。 Vzは、int 29hをトラップしてコンソール取り込みを行います。コンソー ル取り込みがうまく行かないというのは、int 29hがコンソール表示の際 にコールされていない事を意味しています。 事実 2) ANSI.SYSはCONデバイス・ドライバであり、かつ、int 29hをサポートする。 VMAPやMemory Infoなどのドライバ/TSR表示ツールが表示するデバイス・フ ラグで明らか。 仮定 3) CONデバイス・ドライバとしてANSI.SYSの常駐部が呼び出された時と、int 29hが呼び出された時の処理は共通している筈であるから、従って、その 共通部分はサブルーチンとしてコーディングされているであろう。(少な くとも、ボクがコーディングしたとすれば、そうする)。 仮定 4) CONデバイス・ドライバが呼び出す仮定3のサブルーチンの代わりに、int 29hをコールしても結果的に前記のサブルーチンが呼び出されるので、処 理結果は変わらないであろう。(しかも、CON呼び出しがint 29hを経由す るので、Vzのコンソール取り込みの為のint 29hトラップが機能するよう になる筈)。 仮定 5) int 29hルーチンは、iretまでリニアであり、サブ・ルーチン・コールは1つ のみである。(2つあると、どちらのサブルーチン・コールがCONデバイス・ ドライバと共通しているのかの特定が面倒になる。面倒な事は考えない。 この仮定が間違っていたら、それがわかった時点で、この仮定を除外すれ ば良い。まずは簡単な方からトライしてみる)。 仮定 6) 仮定5)のサブルーチンは、CONデバイス・ドライバからも1回だけコールさ れる。(コール個所が2個所以上あると、MakeV29h.basのパッチは不完全な 物になる。逆にint 29hからコールされるサブルーチンがCONデバイス・ド ライバから1回も呼び出されていないと仮定3が怪しい。^^;) ...と、MakeV29h.basは、このように、仮定の上に仮定を重ねて、偶然うまくパッチ が当たるという、なんともあやふやなパッチ・プログラムです。 ちなみに、以上の仮定のうち幾つかは、パッチの失敗を身を持って経験し、微妙 に修正を加えて、今回の公開に至っています。(OS/2は各セッションの独立性が高 いので、安心して無茶ができる。^^;) 最初にMakeV29h.basを走らせた時、このプログラムはパッチ当て個所を特定でき ませんでした。半分あきらめかけていました。 DOS 2.0以来、IBMは拡張子が.COMや.SYSのファイルでも、たまにEXEモデルを使っ ていたのを思い出し、テキスト・エディタで最初の2バイトを表示させてみたら、予 感通り、OS/2のDOSセッション用のANSI.SYSは拡張子が.SYSでありながらEXEモデル でした。(なんでだろ? IBMの開発担当者がEXE2BINし忘れたとか?) 仮定 7) EXEモデルのANSI.SYSは、マルチ・セグメントを利用しておらず、しかも、 セグメント・リロケータブルなコーディングはしていない。この仮定が正 しくない場合、EXE2BINではメモリ・イメージが作れませんから、MakeV29h .basのコードはEXEヘッダを解析できる様に複雑な物にしなければなりま せん。(仮定5と同様、まずは話を簡単にしてトライしてみる)。 仮定の上に仮定を重ねた上でのパッチ結果ですので、動作の如何は保証の限りで はありません。このパッチは必ずしも安全な物ではなく、パッチを当てるあなたの own riskが伴う事を十分理解の上で利用して下さい。 もし、パッチがうまく行かない場合、仮定の何処かが間違っています。仮定を修 正し、必要なら新たな仮説を追加してトライしてみて下さい。パッチ当てそのもの は、QBASICで記述していますので、ダウンロードなさった方が修正するのは比較的 簡単だと思います。(ほぼ正しそうだと言える仮説を作るのは簡単ではないかも知 れませんが...。^^;) 前回、OS/2 J2.00用のANSI.SYSのパッチは、LDIFF差分ファイルで簡単に自己解 凍する様になっていましたが、今回はパッチ個所を特定する為のソフトウェアとそ れの基になる仮定を公開します。LDIFF自己解凍差分公開の方がダウンロードなさっ た方の作業量は少なく、アップロードする側としてもアップロードの情報量が少な いので互いに楽なのですが、このパッチが安全な物では無い事を御理解頂く為に、 あえて、このような形での公開とさせていただきました。 今のところ、パッチを当てたANSI.SYSは私の所では、うまく動いているみたいで す。(^_-)v ○ MakeV29h.basのアルゴリズム まず、int 29hベクタを調べ、そこに指示されているint 29hルーチンを順に、IRET 命令に出会うまで走査します。その途中でCALL命令を見つけたら、それは上述の仮 定3のサブルーチンとして記憶します。 ここで、CALL命令が見つからなければ、仮定3が間違っており、MakeV29h.basは タコになります。また複数のCALL命令を見つけた時には、仮定5が誤りで、やはり タコ。 無事に、ひとつのCALL命令を見つけた場合は、ANSIv29h.sysをバイナリ・オープ ンして見つけたCALL命令と同じサブルーチンを呼んでいるCALL命令を探し、仮定4 に基づいて、そのCALL命令をint 29h命令に置換し、プログラムを終了します。 ○ MISSION IMPOSSIBLE (邦題: スパイ大作戦) おはよう、フェルプス君。 さて本日の君の使命だが、OS/2のDOSセッションで、Vzエディタのコンソール取 り込みがうまく動くようにANSI.SYSにパッチを当てる事にある。 君、もしくは、君のPCが何らかのトラブルに巻き込まれても当局は一切関知しな い。 なお、このパッチ当てプログラムは自動的に消滅...しないので、パッチし終え たら、自分で消しておくように...。 成功を祈る。 Altair☆ (NBG01720@nifty.ne.jp) http://www.vector.co.jp/authors/VA000199/