2017-01-16 12 views
3

これが有効かどうかは簡単に質問しています。 インラインアセンブリコード内でのC++ネームスペースの使用

void __declspec(naked) HookProcessEventProxy() { 
__asm { 
    mov CallObjectPointer, ecx 
     push edx 
     mov edx, dword ptr[esp + 0x8] 
     mov UFunctionPointer, edx 
     mov edx, dword ptr[esp + 0xC] 
     mov ParamsPointer, edx 
     pop edx 
     pushfd 
     pushad 

} 
ProcessEventProxy(); 
__asm { 
    popad 
     popfd 
     jmp[Pointers::OldProcessEvent] // This is the line in question. 
    } 
} 

ポインタ名前空間には、 Pointers::OldProcessEventに行くために定義しないか、それは私が私の DLLMainの内側に持って ProcessEventに行くのだろうか?
HookProcessEventProxyは私の DLLMainの中にあります。

+0

どのコンパイラ? –

+1

試したときにコンパイラは何をしましたか? –

+0

コンパイラはエラーとしてそれを見つけません –

答えて

1

コード内のベンダー固有の拡張機能から、MSVCでこれをコンパイルしているようです。もしそうなら、これは問題ではない。インラインアセンブラは、C++スコープの規則と識別子を認識します。

コンパイラによって生成されたオブジェクトコードを分析することで、これを簡単に確認できます。 dumpbin /disasmを使用してバイナリを逆アセンブルするか、別のリストを取得するためにコンパイラを実行するときに/FAスイッチをスローしてください。あなたが表示されますと、コンパイラは非常にリテラルな方法であなたのインラインアセンブリを発することである:/FAスイッチを使用する場合

[email protected]@YAXXZ PROC     ; HookProcessEventProxy, COMDAT 
    mov  DWORD PTR [email protected]@3HA, ecx ; CallObjectPointer 
    push edx 
    mov  edx, DWORD PTR [esp+8] 
    mov  DWORD PTR [email protected]@3HA, edx ; UFunctionPointer 
    mov  edx, DWORD PTR [esp+12] 
    mov  DWORD PTR [email protected]@3HA, edx  ; ParamsPointer 
    pop  edx 
    pushfd 
    pushad 
    call [email protected]@YAXXZ    ; ProcessEventProxy 
    popad 
    popfd 
    jmp  [email protected]@@YAXXZ  ; Pointers::OldProcessEvent 
[email protected]@YAXXZ ENDP     ; HookProcessEventProxy 

上記のリストは、コンパイラによって生成されたファイルからです。右側のコメントは、対応するC++オブジェクトを示しています。

ブランチターゲットの周囲に角括弧は必要ありません。インラインアセンブラはそれらを無視しますが、それらを組み込むのは混乱します。ちょうど書く:

jmp Pointers::OldProcessEvent 
関連する問題