c/c++;关于胡克的清单

c/c++;关于胡克的清单,c,hook,variadic-functions,C,Hook,Variadic Functions,//但是我想调用原来的函数, //我不知道如何调用它 void foo(int fmt, ...) { } //I hook foo static void (*original_foo)(int fmt, ...); void replaced_foo(int fmt, ...) { printf("Hooking"); va_list args; va_start(args, fmt);

//但是我想调用原来的函数, //我不知道如何调用它

    void foo(int fmt, ...)
    {
    }

    //I hook foo

    static void (*original_foo)(int fmt, ...);
    void replaced_foo(int fmt, ...)
    {
      printf("Hooking");
      va_list args;
      va_start(args, fmt);
      //do something
      va_end(args);

如果您有一个对应的
original\u foo\u v()
,它接受
va\u args
,那么您很幸运:您可以使用它

如果您不这样做(例如如果您使用
DbgPrintf()
LStrPrintf()
与LabVIEW进行接口),那么您必须自己制作一些东西

基本上,你必须

  • 检查您得到的
    va_列表
  • 沿着堆栈走,找到它的堆栈框架
  • 假设需要
    va_列表
    指向的整个区域和下一个堆栈帧之间的整个区域,在堆栈上分配所需的内存
  • 调用不支持va的函数
当然,您必须为您打算支持的每个平台执行此操作


祝你好运,玩得开心。

使用标准C是不可能的-你必须使用汇编或特定于平台的东西。如果有一个变量
foo()
采用了
va_list
参数(比如
vprintf()
就是
printf()
的一个变量),那么您可以将
args
传递给它。这几乎就是答案,而不是注释:-例如int-ioctl(int-fildes,unsigned long request,…)<代码>ioctl(2)是另一回事-
    }
    //Hook Function not include ...

    Hook(foo, replaced_foo, (void **)&original_foo);