-1

c++ メソッドの asm からメソッドを呼び出すのが正しいかどうかはわかりません。

c++ hkDrawIndexdPrimitive メソッド:

HRESULT WINAPI hkDrawIndexedPrimitive (LPDIRECT3DDEVICE8 pDevice,
D3DPRIMITIVETYPE PrimType, UINT minIndex, UNIT NumVertices, UNIT startIndex, UINT primCount)

hkDrawIndexdPrimitive メソッドを呼び出す asm コード:

__declspec(naked) void DIP_Mid( ) {
 __asm {
     pushad
     pushfd

     PUSH DWORD PTR SS:[EBP+0x1C]            // primCount               [4 Bytes]
     PUSH DWORD PTR SS:[EBP+0x18]            // startIndex              [4 Bytes]
     PUSH DWORD PTR SS:[EBP+0x14]            // NumVertices             [4 Bytes]
     PUSH DWORD PTR SS:[EBP+0x10]            // minIndex                [4 Bytes]
     PUSH DWORD PTR SS:[EBP+0x0C]            // PrimType                [4 Bytes]
     PUSH DWORD PTR SS:[EBP+0x08]            // pDevice                 [4 Bytes]

     CALL hkDrawIndexedPrimitive

     popad
     popfd

     XOR ESI,ESI                              // Replace Code 0x6D9D73D1 [2 Bytes]
     CMP DWORD PTR DS:[ESI+18],EBX            // Replace Code 0x6D9D73D3 [3 Bytes]

     JMP dwDIPRet;                            // Return to 0x6D9D73D6
  }
}
4

1 に答える 1

1

なぜあなたはそれを難し​​い方法でやっているのですか?D3D は、すべてのオブジェクト メソッドの仮想関数テーブルを持つ COM を使用します。つまり、アセンブリの深さを調べて、システム/コンパイラに依存するインライン ASM に依存する必要はありません。また、アプリケーションまたはシステム ローカルではなく、オブジェクト ローカルであるという追加の利点もあります。

MS Detoursなど、この種のことを簡単にするライブラリもあります。これは、 D3D9オブジェクトをフックするための迂回路の使用に関する優れたチュートリアルです。まったく同じことが D3D8 にも当てはまります (変更される可能性があるのは VFT オフセットのみです)。

アセンブリが正しいという点では、スタック フレームが既にセットアップされていると想定しているようですが、AFAIK、COM はスタック フレームを使用しないため、EBP はスタックの一番上を指していない可能性があります。また、スタックはFILOであるため、プッシュ命令とポップ命令をペアにする必要があります。たとえば、あなたの場合、

PUSHFD
PUSHAD
//code...
POPAD
POPFD

それ以外の場合は、ランダムなガベージを EFLAGS と他のレジスタに戻します

于 2012-06-23T14:48:57.980 に答える