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

3

我有一个问题,想知道这个方案是否适用。

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中。

哪个编译器? - user2100815
1
当您尝试编译器时,它会做什么? - Ben Voigt
编译器没有将其视为错误。 - Taylor Sasser
1个回答

2

从代码中的供应商特定扩展来看,您正在使用 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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接