【问题标题】:Call function at address with previously passed arguments使用先前传递的参数在地址调用函数
【发布时间】:2014-03-30 09:36:35
【问题描述】:

我正在尝试创建一个函数来调用位于某个地址的其他函数。 调用另一个函数的函数只接收传入的参数类型(如 char*)、返回类型和参数本身。 但是每次调用函数本身或调用它之后它都会突然崩溃。 基本上,我想要达到的是在 C++ 中编写这样的函数:

function callfunc(name,...) --Lua
 local func=_G[name];
 func(...)
end

这是我的代码:

#include <stdio.h>
#include <stdarg.h>
void testfunc(char *c){
    printf("Text: %s\n",c);
}
void callfunc(void *ptr,char ret,char *types,int argc,...){
//#define push(w,h,t) *(t*)(w-sizeof(t))=h; w-=sizeof(t)
#define push(w) asm("push %0"::"r"(w))
    typedef void (*funcptr)(...);
    typedef char* char_ptr;
    funcptr func=(funcptr)ptr;
    double d;
    char *p;
    int n;
    va_list vl;
    va_start(vl, argc);
    for(int i=0;i<argc;i++){
        switch(types[i]){
            case 'p':
                p=va_arg(vl,char_ptr);
                printf("Pushing char*: %s\n",p);
                push(p);
                break;
            case 'n':
                n=va_arg(vl,int);
                printf("Pushing int: %d",n);
                push(n);
                break;
            case 'd':
                d=va_arg(vl,double);
                printf("Pushing double: %f",d);
                push(d);
                break;
        }
    }
    va_end(vl);
    asm(
        "call *%0"
        ::"r"(func)
    );
}
int main(int argc, const char * argv[])
{
    //address can be directly set to lets say 0x450F10E0
    //we only know what is passed to function, we cant change function itself

    callfunc((void*)testfunc,'v',"p",1,"Hi!");
    return 0;
}

有人可以帮忙吗?

编辑 我要调用的函数是__stdcall。

【问题讨论】:

标签: c inline-assembly calling-convention


【解决方案1】:

不要乱用va_list,这是高度不可移植的。特别是,许多平台 ABI 在寄存器中传递一些参数的参数,你完全错过了这方面。 (您甚至没有告诉我们您使用的是哪个 ABI。)

标准预见的方法是将va_list 传递给您要调用的函数并在那里解释参数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-09-13
    • 1970-01-01
    • 1970-01-01
    • 2023-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多