Что не так с этой оболочкой __usercall?
/*
* 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 ответ
Решение
Вы не можете выполнить ret
Вы сами из встроенного блока asm, потому что вы не знаете, что внешняя функция сделала с указателем стека. Вместо этого вам нужно сделать так, чтобы код ассемблера оставлял возвращаемое значение в локальной переменной, которую функция-оболочка может вернуть с обычным C return
заявление.
Вы также, вероятно, должны исправить указатель стека после возврата из __usercall_func
, если только он не использует извращенное соглашение о вызовах, когда он выталкивает свои собственные параметры из стека.