vb6.0 __stdcall函数内调用__cdecl函数_mingw版

//dy.c

#include <windows.h>

//C声明:
//int __stdcall dy(void * bdhsdz, int cssz[], int csgs);
//第一个参数:被调函数地址,第二个参数:参数数组,第三个参数:参数个数.
//dy(fp,0,0)表示无参函数调用.
//dy支持有返回值函数调用和无返回值函数调用.
//被调函数的返回值是dy的返回值.

__declspec(dllexport) int __declspec(naked) __stdcall dy(void *bdhsdz, int cssz[], int csgs) {
    __asm__
    ("\
    pushl %ebp;\
    movl %esp,%ebp;\
    pushl %ebx;\
    movl %ss:0x0C(%ebp),%ebx;\
    movl %ss:0x10(%ebp),%eax;\
    decl %eax;\
bqq:    cmpl $0x0,%eax;\
    jl bqh;\
    pushl %ds:(%ebx,%eax,0x4);\
    decl %eax;\
    jmp bqq;\
bqh:    call *%ss:0x8(%ebp);\
    movl %eax,%ebx;\
    movl $0x4,%eax;\
    imull %ss:0x10(%ebp);\
    addl %eax,%esp;\
    movl %ebx,%eax;\
    popl %ebx;\
    leave;\
    ret $0xC\
    ");
}

BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) {
    switch (fdwReason) {
        case DLL_PROCESS_ATTACH:
            // attach to process
            // return FALSE to fail DLL load
            break;
        case DLL_PROCESS_DETACH:
            // detach from process
            break;
        case DLL_THREAD_ATTACH:
            // attach to thread
            break;
        case DLL_THREAD_DETACH:
            // detach from thread
            break;
    }
    return TRUE; // succesful
}

编译成dll:
gcc -m32 -static -Wall dy.c -s -O2 -Wl,--kill-at -mdll -o dy.dll

dy.dll静态分析:


调用测试:
//main.c
#include <stdio.h>
#include <stdlib.h>

int __stdcall dy(void * bdhsdz, int cssz[], int csgs);

int a[2];

int main(void)
{
    a[0] = (int)"hello%d\n";
    a[1] = 123;
    
    printf("%d\n", dy(printf, a, 2));
    
    system("pause");
    return 0;
}
gcc main.c -static -s -m32 -Wall -o main.exe -O2 dy.dll
main.exe运行效果
hello123
9
请按任意键继续. . .

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

漫漫人生路_SUI

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值