でプラグインをロードする作業プログラムがありますLoadLibrary
。
新しい要件: コードのある時点でポインターが与えられ、このポインターがプラグインのコードまたは静的データを指しているかどうかをテストする必要があります。
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 ですが、それは別の問題です) で実行する必要があります。
必要な情報は多かれ少なかれ Sysinternals ユーティリティlistdlls
が報告するものなので、それがどのように実装されているかを調べてみました。にリンクする構造を取得するために を使用するという提案を見ました。有望に見えますが:NtQueryInformationProcess
PEB
LDR_DATA_TABLE_ENTRY
DllBase
各 DLL の開始アドレスのように見えるa が表示されますが (そうですか?)、サイズはありません。- のドキュメントは
NtQueryInformationProcess
それを移植不能とマークしていますが、私がやろうとしていることの代替案を示唆していません。 - 私のシステムでは、 と のフィールド
PEB
はBeingDebugged
とSessionId
、さらにいくつかのバイト配列だけです。これは良い兆候ではありません。ReservedN
プラグインのアドレス範囲を列挙したり、ポインターがプラグイン内にあるかどうかをテストしたり、ポインターが指しているプラグインを特定したりするにはどうすればよいですか?