/*
* 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.