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
    }
}
4

1 に答える 1

1

ret外部関数がスタック ポインターで何を行ったかがわからないため、インライン asm ブロック内から実行することはできません。代わりに、アセンブリ コードが戻り値をローカル変数に残すように調整する必要があります。これにより、通常の Creturnステートメントでラッパー関数が返すことができます。

__usercall_funcまた、スタックから独自のパラメーターをポップする悪意のある呼び出し規則を使用しない限り、からの戻り後にスタック ポインターを修正する必要がある場合もあります。

于 2010-11-05T02:11:31.700 に答える