DD.でございます。度々申し訳ありませんが、少し質問させて頂きたいと思います。
DLL内で扱う共有メモリを使用する変数の判断と、その使用の仕方についてご質問させて頂きたいと思います。
現在、システムフックを行うDLLを作成しております。
正確には他プロセスにシステムフックを仕掛け、サブクラス化し、一部制御を乗っ取ってしまうものです。
その上で共有メモリを使用している変数は
○フックハンドル(HHOOK)
○サブクラス化するプロセスのハンドル(HWND)
○サブクラス化したプロセスに対して元のウィンドウプロシージャを確保するためのアドレス(WNDPROC)
です。
処理の流れとしては、
FindWindowEx()とGetWindowThreadProcessId()で取得したものを、あらかじめ DllMain の第一引数でグローバル変数に取得しておいた(共有メモリではない)
インスタンスハンドルと共に SetWindowsHookEx() に渡します。
サブクラス化するプロセスのハンドルは、フックプロシージャの LPARAM から取得したものを格納しています。→((MSG*)lParam->hwnd)
尚、こちらの処理の参考にさせて頂いたのは
http://techtips.belution.com/ja/vc/0026/
に、なります。
<余談>
DLL・フックに関する知識は「猫でもわかる〜」やその他、ネットで得たものです。
残念ながら、DLLやフックを使い、他プロセスを扱うための詳しい詳細やサンプルがのったページを探すことができませんでしたorz
よいページがあれば教えて頂ければ幸いです<(_ _)>
</余談>
ここで、SetWindowLong()を使い、元のプロシージャへのアドレスを確保しつつ、自作したウィンドウプロシージャへ制御を移し変えます。
その後、フック解除の依頼がきたら SetWindowLong()にて元プロシージャに戻してやります。
その際に GetLastError()にて「アクセス拒否されました」とエラーになってします。
SetWindowLong()に渡すハンドルは !=NULL のチェックを入れてあるので問題ないと思います。(ハンドルエラーの場合には「無効なハンドル」というエラーになるかと思いますが一応)
ならば共有にしてあるウィンドウプロシージャへのアクセスが拒否されてしまったのだろうか?と思い、
途中で誤信してしまっていたようです。
申し訳ありません。当スレは無視して下さい。
管理人様、お気づきになられたら削除して下さい。
ツイート | ![]() |