問題タブ [unhookwindowshookex]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
winapi - グローバル CBT フックをアンフックした後、すべてのプロセスから DLL をアンロードする
DLL をロードしたシステム全体のフックがアンロードされたときに、すべてのプロセスから DLL を適切にアンロードするにはどうすればよいですか?
MSDNから:
UnhookWindowsHookEx を使用してグローバル フック プロシージャを解放できますが、この関数はフック プロシージャを含む DLL を解放しません。これは、デスクトップ内のすべてのアプリケーションのプロセス コンテキストでグローバル フック プロシージャが呼び出され、それらのすべてのプロセスに対して LoadLibrary 関数が暗黙的に呼び出されるためです。別のプロセスに対して FreeLibrary 関数を呼び出すことはできないため、DLL を解放する方法はありません。DLL に明示的にリンクされたすべてのプロセスが終了するか、FreeLibrary を呼び出し、フック プロシージャを呼び出したすべてのプロセスが DLL の外部で処理を再開した後、システムは最終的に DLL を解放します。
だから私が探しているのは、フックがフックされていないことを検出し、フックFreeLibrary
されたすべてのプロセスから呼び出す方法です。フックがアンロードされたときに DLL を即座にアンロードする他の方法はありますか?
c++ - 異常終了した場合でも UnhookWindowsHookEx が確実に呼び出されるようにするにはどうすればよいですか?
残念ながら、MSDN はそれについて十分に明確ではありません。グローバルフックを使用するプログラムを書いていますが、プログラムが異常終了した場合 (クラッシュ、ユーザーによる強制終了など) がどうなるか心配しています。
Windows は、プロセスの終了時に、プロセスによってインストールされたグローバル フックを自動的にアンフックしますか?
そうでない場合、別のプロセスで UnhookWindowsHookEx() を呼び出してフックを解放することは可能ですか? (インストーラープロセスが停止していることを検出した場合は、フックされたスレッドでこれを行うことを考えています。)
答えが「いいえ」または「いいえ」の場合、インストーラー プロセスが終了したときにグローバル フックをアクティブのままにしておくのは危険ではないでしょうか? この状況に対処する標準的な方法は何ですか?
UnhookWindowsHookEx() は他のプロセスにロードされた dll を解放しないことを MSDN で読みましたが、いつ dll が解放されるかはわかりません。CodeProject のこの記事は、最初のメッセージがフックされたスレッドに到着したときに dll が (それぞれのプロセスで) マップされていないことを示唆しているように思われるため、UnhookWindowsHookEx() 呼び出しの直後です。本当ですか?
ありがとうございました。
c++ - 挿入された DLL のアンロード
を使用して他のプロセスに挿入するDLLがありますSetWindowsHookEx
。DLL 内で、モジュールの参照カウンターを呼び出してインクリメントし、モジュールGetModuleHandleEx
がいつアンロードされるかを制御できるようにします。
この時点で、これらの API 呼び出しの両方からのモジュール参照カウントは「2 である必要があります」。呼び出しプロセスがシャットダウンすると、 が呼び出されUnhookWindowsHookEx
、参照カウントが 1 に減ります。DLL には、いくつかのことを待機するスレッドがあり、そのうちの 1 つは、 を呼び出したプロセスのハンドルですSetWindowsHookEx
。プロセスがなくなると、DLL はいくつかのクリーンアップを行い、すべてのスレッドを終了し、メモリとハンドルをクリーンアップしてから を呼び出しますFreeLibraryAndExitThread
。これにより、カウンターが減少し、DLL がアンロードされます。
これが私の問題です。いくつかのプロセス、特に UI のないプロセスでは、DLL がアンロードされません。私はすべてをきれいにしたと確信しています。そして、私のスレッドがどれも実行されていないという事実を知っています。
まず、原因を突き止めるためのトラブルシューティングのヒントがあれば、それが役に立ちます。NtQueryInformationProcess
それ以外の場合は、モジュール アドレスを取得し、モジュール ハンドル数が実際にゼロであることを確認するような API を使用してから、プロセス内からモジュール アドレスをアンロードするためCreateRemoteThread
の呼び出しを挿入することを考えていました。LdrUnloadDll
このアプローチについてどう思いますか?誰かがサンプルコードを持っていますか? モジュール ハンドル数を取得する方法がわかりません。
c# - 適切にアンフックする方法は?
非常に単純なフック コードを作成しました (私は初心者です)。
メモ帳を開いてテストしました。
任意のキーを押すと、ビープ音が鳴り、自分自身を印刷しました。
「×」キー以外はターミネータキーです。
質問:
「x」キーが印刷されるのを見たくありません。私はちょうどプログラムを終了しました。私は何をしなければなりませんか?
wpf - UnhookWindowsHookEx は ERROR_INVALID_HOOK_HANDLE を生成しますか?
画面の上部を右クリックしたときにのみいくつかのことを行うバックグラウンド アプリケーションを WPF に実装しようとしているので、フックしてみWH_MOUSE_LL
ました。問題は、アプリケーションを終了するときにコールバックをフック解除することです。これは、C では完全に正常に動作しますが、渡されたフック ハンドルが取得したハンドルとまったく同じERROR_INVALID_HOOK_HANDLE
であっても、C# で取得できます (以下の例)。UnhookWindowsHookEx
SetWindowsHookEx
EDIT:同じフックを登録してすぐに登録解除するベアボーンC#コンソールアプリケーションを作成したところ、それも正常に動作するため、WPFが問題を引き起こす可能性があると思います。
動作しない C# コードは次のとおりです。問題はデストラクタにあります。
完全に正常に動作する C コードは次のとおりです。