2

挿入されたプロセスの VMT で必要なポインターを変更することにより、特定の D3D 関数をフックする DLL を作成しています。アルゴリズムは次のようになります。

  1. ダミー ウィンドウ ハンドルを取得します。
  2. ダミーの D3D オブジェクトを初期化し、D3D デバイスを作成します。
  3. 必要なオフセット (VMT - D3D ベース アドレス) を取得します。
  4. D3D オブジェクトとウィンドウ ハンドルを破棄します。
  5. 挿入されたプロセスの D3D*.dll ベースを取得します。
  6. 実際の VMT ポインター (オフセット + ベース) を構築します。
  7. プロセス ヒープでそれらを検索します。
  8. 見つかった場合 - ポインターを自分のものに変更します。

D3Dを初期化し、描画ループを開始してからフック手順を起動するアプリケーション内で完全に正常に動作しますが、DLLからは動作しません.最後のエラーコードでダミーデバイスを作成しようとすると、何らかの理由でクラッシュします. = 126 (D3D*.dll は正しくロードされますが、「指定されたモジュールが見つかりませんでした」)。

同時に D3DDevice を 1 つだけ初期化できることはわかっていますが、私のテスト アプリでは、さらに 1 つの作品を作成できます。1 つの作品しか作成できませんが、それでも VMT を取得できます。

質問は、同じコードを EXE から実行する場合と DLL から実行する場合の違いは何ですか?

4

1 に答える 1

0

私も同じ問題を抱えていました。私が考えたのは、最初のスレッド (メインスレッド) を作成したのと同じスレッドを使用してデバイスを作成する必要があるということです。

デバイスの作成中に、さまざまなパラメーターの組み合わせをすべて試しました。さまざまな DX9 アプリケーション/ゲームを試しました。

メインスレッドの仮説が正しくないことがわかりました。DX サンプルのコードを更新し、セカンダリ スレッドで実行する独自のコードを追加したところ、問題なく動作しました。試してみたいアイデアがいくつかあります。そして更新してください

Dll Main から CreateDevice() を呼び出していたため、問題が発生していました。Dll Best Practicesによると、スレッドが互いに交差している可能性のある関数を呼び出すことは禁止されています。これにより、ここで発生するデッドロックが発生します。解決策は、こちらの回答に従うことです。

于 2014-04-16T10:38:27.350 に答える