C语言获得把64位数的后32位,32位程序调用64位函数

这段C语言代码定义了一个名为X64Call的函数,该函数用于在32位程序中调用64位函数。它接受一个64位函数地址、参数数量和可变参数列表,通过va_list宏处理变参,并使用内联汇编将参数压入栈中。函数首先检查是否在64位环境下运行,然后对栈进行对齐,将参数正确地传入64位函数,最后返回64位函数的返回值。
摘要由CSDN通过智能技术生成

#pragma warning(push)

#pragma warning(disable : 4409)

DWORD64 __cdecl X64Call(DWORD64 func, int argC, ...)

{

if (!g_isWow64)

return 0;

va_list args;//VA_LIST 是在C语言中解决变参问题的一组宏,所在头文件:#include ,用于获取不确定个数的参数。

va_start(args, argC);//VA_START宏,获取可变参数列表的第一个参数的地址(ap是类型为va_list的指针,v是可变参数最左边的参数):

reg64 _rcx = { (argC > 0) ? argC--, va_arg(args, DWORD64) : 0 };

reg64 _rdx = { (argC > 0) ? argC--, va_arg(args, DWORD64) : 0 };//VA_ARG宏,获取可变参数的当前参数,返回指定类型并将指针指向下一参数(t参数描述了当前参数的类型):

reg64 _r8 = { (argC > 0) ? argC--, va_arg(args, DWORD64) : 0 };

reg64 _r9 = { (argC > 0) ? argC--, va_arg(args, DWORD64) : 0 };

reg64 _rax = { 0 };

reg64 restArgs = { (DWORD64)&va_arg(args, DWORD64) };//剩余成员用堆栈传递//conversion to QWORD for easier use in inline assemb

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值