//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
请按任意键继续. . .

vb6.0 __stdcall函数内调用__cdecl函数_mingw版相关推荐

  1. javascript嵌套函数和在函数内调用外部函数的区别

    我们都知道在函数中定义的局部变量在声明他的函数体以及其嵌套的函数内始终是有定义的,并且在函数的作用域链上始终会有个对象指向全局对象,使函数能够访问到全局变量. var ga = 'global'; v ...

  2. vue函数如何调用其他函数?_好程序员Python教程系列之递归函数与匿名函数调用...

    好程序员Python教程系列递归函数与匿名函数调用,函数是Python技术学习中重要的一个环节,深入掌握该阶段的知识内容,对于Python技术能力的提升非常有帮助,这里就针对递归函数与匿名函数两种函数 ...

  3. mysql编写函数 求1 n 偶数之和,编写求1 2 3 - n的函数.在main函数中调用该函数

    输入两个正整数m,n,编写求阶乘的函数,计算m!/(n!*(m-n)!). C语言函数解答,谢谢. #includelongfactorial(intm,intn){longsum=1,sum1=1; ...

  4. vue函数如何调用其他函数?_C语言函数学习-函数的嵌套调用

    文章logo 函数的嵌套调用 C语言中不允许作嵌套的函数定义.因此各函数之间是平行的,不存在上一级函数和下一级函数的问题.但是C语言允许在一个函数的定义中出现对另一个函数的调用.这样就出现了函数的嵌套 ...

  5. C语言编程>第六周 ① 编写一个录入函数:用来从键盘接收n个整型数并存放在一个整型数组中。 在主函数中调用该函数计算出这n个整数之和。

    例题:编写一个录入函数:用来从键盘接收n个整型数并存放在一个整型数组中. 在主函数中调用该函数计算出这n个整数之和. 代码如下: /*代码分析:录入函数需要两个参数:一个参数是需要用来存储数字的数组, ...

  6. C语言:自定义函数中调用自定义函数的方法

    自定义函数中调用自定义函数 在我们编写C语言程序时,可以将要经常用到的或者有自己单独作用的那一部分代码独立成一个函数,不仅可以简化我们的程序,还可以使我们的程序更加可见话. 正文阿巴阿巴 方法一:直接 ...

  7. matlab子函数相互调用吗,matlab主函数如何调用子函数

    来源:学生作业帮 编辑:作业帮 分类:综合作业 时间:2021/03/18 18:00:53 matlab主函数如何调用子函数 我编写了一个matlab子函数是关于龙格库塔计算的 主函数内容为: fo ...

  8. python封装一个函数并调用_python - 函数的封装与调用

    一.函数的定义,函数名,函数体以及函数的调用 1.函数的定义语法: def 函数名(): 函数体 2.函数名的定义与变量名命名一样 3.函数的封装与调用 #函数的封装 defyue():print(' ...

  9. 类的成员函数指针和静态成员函数指针 调用成员函数***

    C++提供static这个关键词对静态成员进行声明,静态成员函数和类的实例化无关,对于同一类来说,静态成员函数是所有类的对象共享的.而普通成员函数需要实例化才能调用,对于每一个实例来说,普通成员函数是 ...

最新文章

  1. 关于Synchronized研伸扩展
  2. 中国中老年化妆品行业消费需求现状与产销规模前景展望报告2022年
  3. Java 算法 开心的金明
  4. python画矩阵图_Python根据已知邻接矩阵绘制无向图操作示例
  5. Linux常用命令及笔记
  6. 地下迷宫探索 (30 分)(DFS)
  7. 自制VBS自动刷屏器,再也不怕刷屏刷不过别人了
  8. 计算机自动关机命令,电脑自动关机命令是什么?你都知道吗?
  9. 奇妙软件3趋势破解代码
  10. Android ROS开发环境搭建
  11. 企业内网信息安全实践-记ChinaUnix技术交流
  12. WP Engine开发人员工具的好处
  13. 《精进:如何成为一个很厉害的人》读后感
  14. IO流-常用的IO流总结
  15. jmap命令(Java Memory Map)
  16. Spline导数及曲率计算
  17. 如何将背景图改为透明(透明就是我们看到的方格图)
  18. 简单的jsp代码 简易聊天室(登录,发送信息,退出)
  19. php+仿微信发红包+负数,php仿微信红包分配算法的实现方法
  20. 增广拉格朗日乘子法(Augmented Lagrange Method)

热门文章

  1. iOS 微信支付(服务端下单)
  2. 3dsmax的用途,3dsmax的强大,无法想象!
  3. AT命令发短信和GPRS通信
  4. 关于deepin应用商店一直显示正在安装安装时出现有未能满足的依赖关系的解决方法
  5. 用户与计算机网络接口,用户与计算机网络的接口是
  6. 汽车电子标识协议(类LLRP协议)wireshark插件
  7. 一个计算机软件学生的求职简历,计算机专业学生的简历范文
  8. 微软计算机电源怎么接,电脑电源线接法图解 主板电源线接法详细介绍
  9. 基于dsp的vxi总线动态存储器设计
  10. 4、Qt设备识别(简单的密钥生成器)