2006-03 << 2006-04 >> 2006-05

2006-04-03 (月)

*バッチファイル

久しぶりに,ifとかforが出てくるバッチファイルらしいバッチファイルを書く.すっかり忘れているのでコマンドのヘルプを見ながら….ところで,%1とかのコマンドライン引数で渡されたパスからファイル名だけ抜き出したりできたような気がしたのですが,CALLのヘルプに書いてあったんですね.変数なので,SETとかに書かれてるものだと思ってました.cmd.exeは少しは使えるようになってますね.UNIX上で動くcmd.exe互換のシェルってあったりするんでしょうか?

*そうそう

いつも思うのだけど,Windowsのコンソールって変更できないんだろうか?もちろん,cmd.exe以外のコマンドインタプリタで独自のウインドウを作るものがあるけど,それはそういうGUIソフトであって,コンソールアプリケーションではない.そもそも,cmd.exe自体がコンソールアプリケーションであって,コンソールを表示しているのはWindows本体なような….つまり,AllocConsoleあたりのAPIで生成されるウインドウを別のものにしたいということです.無理やりウインドウハンドルを取得して,サブクラス化すれば何かできそうですが,肝心のテキスト出力のルーチンは変更できないしなぁ.

…あれか,AllocConsoleを乗っ取ってしまうソフトを作れということか.WindowsのAPIをフックして,Windowsに処理が渡る前に自前のプログラムで好き勝手にしてしまうというのは,Windowsのソフトを解析したことがある方なら方法は思いつくと思いますが….一番単純で面倒くさいのは,Kernel32.DLLのラッパDLLを作って置き換えてしまうという方法.普段はこれを使ってますが,全てのソフトを対象にするのは現実的でない.あとは,SetWindowsHookExで全プロセスにDLLをロードさせて,インポートテーブルを書き換えてしまうか….ただ,解析を避けるために,実行時にインポートテーブルを破壊するソフトやGetProcAddressとかでアドレスを得ているソフトは対象外になってしまいます.

そもそも,コンソールアプリは自分でAllocConsoleを呼んで無い….まぁ,コンソールアプリをダブルクリックした場合は,どこかにあるスタートアップルーチンが起動されてコンソールを開いているのかな.

というわけで,なんとかなりそうだなぁ.たぶんやらないけど….

2006-03 << 2006-04 >> 2006-05