2
    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);
4

1 回答 1

2

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

如果您不这样做(例如,如果您使用LabVIEWDbgPrintf()LStrPrintf()与 LabVIEW 交互),您将不得不自己制作一些东西。

本质上,你必须

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

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

祝好运并玩得开心点。

于 2012-11-19T09:30:04.587 回答