2010-11-05 38 views
0
/* 
* 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

什么是__usercall_func?如果它是一个指针,你应该使用'call dword ptr [__usercall_func]' – Abyx 2010-11-05 02:33:55

+0

另外,你应该在__usercall函数调用之后清除堆栈,添加'add esp,12'(尽管如果没有它,如果有ebp frame和esp检查被禁用) – Abyx 2010-11-05 02:37:20

回答

1

你不能在inline asm块中自己执行ret,因为你不知道外部函数用堆栈指针做了什么。相反,您需要安排汇编代码将返回值保留在局部变量中,该包装函数可以使用正常的C return语句返回。

您也可能需要修复从__usercall_func返回后的堆栈指针,除非它使用了一个不合常规的调用约定,它将自己的参数从堆栈中弹出。

+0

更新,但这个窗台不工作,因为代码不会到达这一行,因为它在__usercall_func上失败。 – Svisstack 2010-11-05 02:14:58