2013年09月一覧

gccでMSVCの_penter,_pexitと同様のことをするには

前回フックについて調べた勢いで、gccで VisualStudio の /Gh,/GHオプション(_penter,_pexit)と同様のことを行うにはどうすればよいかを調べてみました。

調べてみると gcc にも同様の機能を実現するためのオプションを発見しました。
”instrument-functions”というものです。ただフックの関数名はちょっと違うようで、 _cyg_profile_func_enter, _cyg_profile_func_exit となるようです。またこの関数のシグニチャは以下のようになっています。

便利なことに引数で呼び出し元関数のアドレスが入ってくるようです!


_penter,_pexitによるフック有効化について

一部では割と有名なこの機能について実際に触ってみました。VisualStudioのリンカーオプションで、/Gh,/GH で有効にできます。このフラグをONにすると、全関数のIN/OUTで _penter, _pexit という関数がそれぞれコールするようになります。

そしてこの関数については以下のプロトタイプ宣言を持ちます。

見慣れない修飾(naked)がついていますが、これはこの関数では関数のプロローグ・エピローグを作成しない、という意味です。

この機能を使うといろいろとできることが増えるのですが、32bitのプログラミングが主流の頃はこの関数で即インラインアセンブラを書いて、目的の操作を行っていました。しかしながらこの naked 指定は 64bit のプログラミングにおいては有効ではないとのことです。

参考元: /Gh (_penter フック関数の有効化)

また、知っての通り 64bit のプログラミングにおいて、インラインアセンブラは禁止となったため、従来のコードの構成をそのまま持って行くというのはできなくなりました。
よって、_penter, _pexit の実装もまた32bit/64bitで変更を受けるポイントとなるかと思います。当然64bitでは呼び出し規約が変わったためそこを考慮して、asmファイルを作成し、このasmから _penter, _pexit の関数を公開しておく、という形で実装することになりそうです。


開発者向けエクスプローラーのサムネイル拡張DLL

作業を続けていたエクスプローラーのサムネイル拡張DLLをバージョンアップ公開します。

現在の対応拡張子(ファイルフォーマット)

  • DDS
  • PSD
  • PVR
  • TGA

前回から変わったところは、内部データの保持方法が変わったことで、RGBA(RGBX)の要素を持つデータの解釈が強力になりました。従来うまく表示できなかったRGBX5551やARGB1555にも対応できるようになりました。他、TGA形式にも対応しました。

アンインストール方法

管理者権限ありのコマンドプロンプトを起動して、DevImageThumbnail.dllのある場所で、下記コマンドを実行してください。

ダウンロード

アルファ版です。DevImageThumbnail_v002をダウンロードする

既知バグなど

現在、DDS内の全てのチャンネルフォーマットに対応できていません(以前よりは対応できているのですが)。
DirectX10以降のテクスチャ形式が全滅しています。
Pvr形式も同様でVersion3以降の多彩なチャンネルフォーマットに対応し切れていません。