2011-07-19 9 views
3

私は、さまざまなタイプのデジタル署名付き共有ライブラリを読み込んで管理するためのマルチプラットフォームC++コンポーネントを作成しました。これは、呼び出しプロセスへのマッピング、分岐修正の適用、インポートのバインド、および初期化エントリポイントの呼び出しを含む、ロードと初期化のすべての側面を処理します。 LoadLibrary()はプラットフォーム固有であり、すべての共有ライブラリがPE形式ではないため、コンポーネントはLoadLibrary()を使用できません。デバッグイベントを外部ソースからWindowsデバッガに送信

私が直面している残りのいくつかの問題の1つは、対象となるプラットフォームと開発環境で適切なデバッガのサポートを提供することです。 MS Windows環境では、コンパイラとリンカによって生成された(または他のソースから変換された)シンボル情報を読み込むようにデバッガを取得することが含まれます。ライブラリのロードと初期化はカーネルの外部で行われるため、デバッガはLOAD_DLL_DEBUG_EVENTイベントとUNLOAD_DLL_DEBUG_EVENTイベントを受け取ることはありません。これは、次の質問につながります。

  1. LOAD_DLL_DEBUG_EVENTなどのイベントをデバッガに直接送信できるAPIまたはシステムコールはありますか?
  2. プログラムまたはセッションデバッグマネージャまたはマシンデバッグマネージャサービスと直接通信するための文書化された方法はありますか?
  3. カーネルお​​よびその後にDLLがロードされたことをデバッガに通知するためのAPIまたはシステムコールがありますか? PEファイルは主にサポートされている形式の1つで、これが最も望ましいオプションです。また、ライブラリがプロセスのモジュールリストに表示されるという潜在的な利点もあります。
  4. WinDBG SDKはWindows全体のデバッグに適用され、WinDBG拡張機能を使用してデバッガにシンボル情報のロードを指示できますか?

私は上記のトピックに関する情報を広範に検索していますが、短くなっています。私は、Windowsデバッガで使用されているデータ構造に関する情報を少し見つけましたが、私の特定の状況には関係ありません。

私は、文書化されているか文書化されていないAPI /システムコールとアプローチにはオープンしています。

+0

なぜカーネルモードのデバッグが必要ですか? – Ajay

+0

@ajay私はしません。私のポストには不明なものがありますか? –

答えて

1

私は問題を理解している場合、あなたが表示されることがあります。

  1. Writing a basic Windows Debuggers
  2. Writing Windows Debugger(詳細)
+0

私はデバッガを書いていないので、特定のイベントをデバッガに伝える必要があります。 –

+0

しかし、私は3つのアクションがすべてOSによって自動的に実行されることを確認します。デバッガはイベントを受け取ります。 – Ajay

+0

デバッガは 'CreateProcess(... DEBUG_PROCESS ...)'を使ってデバッガによって起動されるので、情報を送るためにデバッガループにフックするのは難しいです。私はProcess Monitorの提案を開始できます:http://technet.microsoft.com/en-us/sysinternals/bb896645 これを使用すると、デバッガがイベントを取得したときに何が起きているのかを知り、それらのイベントを自分で送信しようとするかもしれません。 – Ajay

3

を私は直接の種類を送信するための方法があるとは思いませんあなたが(LOAD_DLL_DEBUG_EVENTのような)プロセスに必要なイベントは、少なくとも簡単にはありません。 Windowsの通常のDLLの中にライブラリを単純に入れないのはなぜですか?たぶん、各 "プロキシ" DLLの中に独自のモジュール読み込み機構を埋め込むことができます。この方法では、OSがすでに提供している機能を多く複製する必要はありません。

+0

残念ながら、スタブdllを使用すると、問題の部分的な解決策しか得られません。共用ライブラリーのタイプに応じて、実行時に行わなければならない追加のフィックスアップが適用されます。 –

関連する問題