DLL内deno

解決


DD.  2006-02-09 22:07:42  No: 60697

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 のチェックを入れてあるので問題ないと思います。(ハンドルエラーの場合には「無効なハンドル」というエラーになるかと思いますが一応)

ならば共有にしてあるウィンドウプロシージャへのアクセスが拒否されてしまったのだろうか?と思い、


DD.  2006-02-09 22:34:48  No: 60698

途中で誤信してしまっていたようです。

申し訳ありません。当スレは無視して下さい。

管理人様、お気づきになられたら削除して下さい。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加