私は自分のバージョンのWindowsローダー(非常に単純なバージョンですが)を書いている最中ですが、これまでのところ、かなりうまくいっています。ただし、ロードされたモジュールのインポートテーブルを再帰的にウォークすることになると、ちょっとした問題に遭遇しました。
ほとんどの依存関係では、物事はうまく機能し、モジュールを再帰的にロードするだけです。ただし、一部の依存関係では、これはターゲットプロセスを壊すだけです。さらに調査したところ、これはWindowsのサイドバイサイドアセンブリが原因であることがわかりました。基本的に、ロードされたPEの依存関係は、ターゲットプロセスで使用されているモジュールの異なるSxSバージョンでした。
あるケースでは、ロードしていたDLLはmsvcr90.dllを参照していましたが、ターゲットプロセスは以前のバージョンのランタイムmsvcr71.dllを使用していました。
現在、Windowsローダーはこれをうまく処理できるので、これを行うための「正しい」方法が明らかにあります。アクティベーションコンテキストについて少し読みましたが、問題を把握するのに実際には役立ちませんでした。
LoadLibrary自体を呼び出しても、dllが正しいバージョンに解決されません
LoadLibraryW(L"msvcr90.dll");
単に0を返します。誰か知っていますか
a)インポートがSxSアセンブリであるかどうかを検出する方法
b)プロセスの正しいSxSバージョンへのインポートを解決する方法。
私はこれを行う方法に本当に困惑しています。私は現在、研究からほとんどのPEファイル形式を知っていますが、SxSはPE構造の範囲を超えていると確信しています。
さらに情報が必要な場合は、コメントしてください。実行可能ファイルには外部マニフェストがなく、その埋め込みマニフェストはランタイムバージョンを指定しません。ただし、作業ディレクトリにmsvcr71.dllのコピーが含まれている場合は、それが誰かに役立ちます。
乾杯。