2011年12月19日

Windowsのファイルマネージャーの検索バーみたいな半透明エディットボックスが欲しい!!

カーネル / VM Advent Calendar (2011年度) の参加記事です。
メインの内容はWindowsのDLLで遅延読み込みされるAPIを、Delay IATを書き換える方法でフックです。なんかぐぐっても見つからないので情報共有的な意味でも。

--- どうでもいいところを飛ばす ---

下記のような、Windowsのファイルマネージャーの検索バーみたいな半透明エディットボックスが欲しい!!
1.png

普通に、ウィンドウのガラス領域にエディットボックスをCreateWindowで作ってみたら、次のようになってしまって若干おかしい・・・・

2.png

いろいろぐぐってみたら、下記サイトに情報があった

http://weblogs.asp.net/kennykerr/archive/2007/01/23/controls-and-the-desktop-window-manager.aspx

情報のとおりにやってみたら、綺麗に描画できるようになった

3.png

しかし・・・

4.png

原因を調べると、次のようなことがわかった。

5.png

なので、良くあるWindowsのAPIフックを使い、再描画のタイミングを制御するためのコードを注入した。
自分は、http://ruffnex.oc.to/kenji/text/api_hook/ を参考にさせてもらった。

6.png

ただし、comctl32.dll からの DrawThemeBackground() APIの呼び出しは、dllの遅延インポート領域にかいてあるらしく、
直接フックはできないので、遅延インポート領域を初期化するのに使われるGetProcAddress() APIをフックして、そいつ経由で
コードを注入した

7.png

しかし、Windows Vista/7 はこの方法でいけたのだが、なぜかWindows8ではDrawThemeBackground() APIのフックに失敗する・・・・。

11.png

調べてみると、なんとDrawThemeBackground() APIを遅延インポートするのに、GetProcAddress() APIが使われていない・・・

9.png

誰だよ!勝手にアドレス書いたのは!!....orz

8.png

・・・ということで、こんどはきっちりメモリにはりついている、上図参照のqword ptr [__imp_DrawThemeBackground] を書き換えることにする。

10.png

 
なぜかネットにぜんぜん情報が無かったので、しょーがなくスタックオーバーフローの記事
http://stackoverflow.com/questions/3430718/thunk-table-in-import-address-tableとかそこにのってるリンク先とか色々見ながら自前で実装した

delay import address tableのベースアドレスをゲットできれば、あとは伝統的なIAT書き換えフックと要領は同じだった

13.png

ちゃんと動く(と思う)ソースはこちら

これで実装してみたら、
14.png

VCのプロジェクトはこれです


 

 

コメントする





トラックバック(0)

トラックバックURL: http://www.lunaport.net/mt/mt-tb.cgi/35

るなぽブログ

最近のブログ記事

その他