/*
* 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
}
}
答案 0 :(得分:1)
你不能在内联asm块中自己执行ret
,因为你不知道外部函数对堆栈指针做了什么。相反,您需要安排汇编代码将返回值保留在局部变量中,包装函数可以使用正常的C return
语句返回。
你可能还需要在从__usercall_func
返回后修复堆栈指针,除非它使用一个反常的调用约定,它会从堆栈中弹出自己的参数。