LoadLibrary
でプラグインを読み込む作業プログラムがあります。Windowsで動的にロードされるライブラリのアドレス範囲
新しい要件:コードのある時点でポインタが与えられています。このポインタがプラグインのコードまたは静的データを指しているかどうかをテストする必要があります。
bool is_pointer_into_plugin(void *p, HMODULE h);
同様に、ポインタがある場合は、それを指すプラグインを取得する必要があります。また、ポインタがメインプログラムのコードまたは静的データを指しているかどうかを知る必要があります(理想的には、読み取り専用領域と読み書き領域を区別する)。
HMODULE plugin_containing_pointer(void *p);
同様に、プラグインがマッピングされている範囲(アドレスとサイズ)を取得できる必要があります。私はまた、メインプログラムのためにこの情報が必要です。
is_pointer_into_plugin
、またはplugin_containing_pointer
などを実装するにはどうすればよいですか?
必要に応じてLoadLibrary
に電話を変更することができます。ルックアップはできるだけ速くなければなりません。ロードタイムコードは高速である必要はありません。別々のプロセスでプラグインを実行し、共有メモリを介して通信することは選択肢ではありません。プログラムはWindows XP以上で実行する必要があります(Linuxでも、それはanother questionです)。
私が必要とする情報は、Sysinternalsユーティリティlistdlls
が報告している情報なので、実装方法を調べようとしました。 NtQueryInformationProcess
を使用してPEB
構造を検索してLDR_DATA_TABLE_ENTRY
にリンクしているsuggestionを見ました。有望に見えますが、
DllBase
は、各DLLの開始アドレス(それですか?)ですが、サイズがないように見えます。NtQueryInformationProcess
のドキュメントでは、ポータブルではないとマークしていますが、私がしようとしていることの代替案はありません。- 私のシステムでは、
PEB
の唯一のフィールドはBeingDebugged
とSessionId
であり、一部にはReservedN
バイトの配列です。良い記号ではありません。
プラグインのアドレス範囲を列挙するか、ポインタがプラグイン内にあるかどうかをテストする方法、またはポインタがどのプラグインにポイントしているかを調べる方法はありますか?