What is wrong with this __usercall wrapper?

2019-09-06 07:52发布

问题:

/*
 * Wrapper from
 * int func(int a, int b, int c, unsigned int d, signed int e);
 * to
 * int __usercall func<eax>(int a<eax>, int b<ecx>, int c, unsigned int d, signed int e);
 */
int func(int a, int b, int c, unsigned int d, signed int e)
{
    __asm
    {       
        push e
        push d
        push c
        mov ecx, b
        mov eax, a
        call __usercall_func // access violation somewhere inside here
        add esp, 12
    }
}

回答1:

You cannot perform ret yourself from within an inline asm block, because you don't know what the outer function has done with the stack pointer. Instead you need to arrange for the assembly code to leave the return value in a local variable, which the wrapper function can return with the normal C return statement.

You also probably need to fix the stack pointer after the return from __usercall_func, unless it uses a perverse calling convention where it pops its own parameters off the stack.