挿入されたプロセスの VMT で必要なポインターを変更することにより、特定の D3D 関数をフックする DLL を作成しています。アルゴリズムは次のようになります。
- ダミー ウィンドウ ハンドルを取得します。
- ダミーの D3D オブジェクトを初期化し、D3D デバイスを作成します。
- 必要なオフセット (VMT - D3D ベース アドレス) を取得します。
- D3D オブジェクトとウィンドウ ハンドルを破棄します。
- 挿入されたプロセスの D3D*.dll ベースを取得します。
- 実際の VMT ポインター (オフセット + ベース) を構築します。
- プロセス ヒープでそれらを検索します。
- 見つかった場合 - ポインターを自分のものに変更します。
D3Dを初期化し、描画ループを開始してからフック手順を起動するアプリケーション内で完全に正常に動作しますが、DLLからは動作しません.最後のエラーコードでダミーデバイスを作成しようとすると、何らかの理由でクラッシュします. = 126 (D3D*.dll は正しくロードされますが、「指定されたモジュールが見つかりませんでした」)。
同時に D3DDevice を 1 つだけ初期化できることはわかっていますが、私のテスト アプリでは、さらに 1 つの作品を作成できます。1 つの作品しか作成できませんが、それでも VMT を取得できます。
質問は、同じコードを EXE から実行する場合と DLL から実行する場合の違いは何ですか?