关于钩子的c / c ++ va_list

时间:2012-11-19 08:38:23

标签: 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);
      //do something
      va_end(args);

//但我想调用original_foo函数, //我不知道如何调用它......

    }
    //Hook Function not include ...

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

1 个答案:

答案 0 :(得分:2)

如果你有一个相应的original_foo_v()需要va_args,那么你很幸运:你可以使用它。

如果不这样做(例如,如果使用DbgPrintf()LStrPrintf()与LabVIEW连接),则必须自行制作。

基本上,你必须

  • 检查你得到的va_list
  • 通过沿着堆栈行走找到它的堆栈框架,
  • 根据需要在堆栈上分配尽可能多的内存,假设您需要va_list指向的位置和下一个堆栈帧之间的整个区域,
  • 调用非va感知功能。

当然,您必须为您打算支持的每个平台执行此操作...

祝你好运,玩得开心。