在内联汇编代码中使用C ++命名空间

时间:2017-01-16 22:11:48

标签: c++ assembly x86

我只是有一个简单的问题,关于它是否会起作用。

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命名空间是否定义为转到Pointers::OldProcessEvent,还是转到我ProcessEvent内的DLLMainHookProcessEventProxy位于DLLMain内。

1 个答案:

答案 0 :(得分:1)

从代码中特定于供应商的扩展,似乎您在MSVC上编译它。如果是这样,那么这不是问题。内联汇编程序了解C ++作用域规则和标识符。

您可以通过分析编译器生成的目标代码轻松地自行验证。使用dumpbin /disasm反汇编二进制文件,或者在运行编译器时抛出/FA开关以获得单独的列表。您将看到的是编译器以非常直接的方式发出内联汇编:

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

以上列表来自编译器在使用/FA开关时生成的文件。右边的注释表示相应的C ++对象。

请注意,您不需要分支目标周围的括号。虽然内联汇编程序忽略了它们,但包含它们会令人困惑。只需写下:

jmp Pointers::OldProcessEvent