如何在内联 ASM 中调用此函数? (MSVC++)

How do I call this function in inline ASM? (MSVC++)

void __usercall sub_101A7850@<eax>(int a1@<edx>, int a2@<ecx>, int a3, int a4, int a5, int a6)

我的第一次尝试(崩溃):

__declspec(naked) void __stdcall callit(const int& a1, const int& a2, unsigned int a3, const int *a4, int a5, int *a6)
    {
        // void __usercall sub_101A7850@<eax>(int a1@<edx>, int a2@<ecx>, int a3, int a4, int a5, int a6)
        __asm
        {
            mov ecx, [esp + 4] // a1
            mov edx, [esp + 8] // a2
            push [esp + 12] // a3
            push [esp + 16] // a4
            push [esp + 20] // a5
            push [esp + 24] // a6
            call funcaddr
            retn 24
        }
    }

我已验证 funcaddr 有效。很确定它是 __fastcall

你交换了 ecxedx:你的 func 签名写着 a1<edx> 但你把 a1 放到 ecxa2edx.

此外:在推送 a3 之后,a4esp 相对偏移量增加了 4 个字节。在推送 a4 之后,a5esp 相对偏移量变得更远 8 个字节,依此类推...(所以正确的偏移量是:a4[esp+20] , a5: [esp+28], a6: [esp+36])