c/c++ va_list 关于钩子(Hook)

标签 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);

最佳答案

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

如果您不这样做(例如,如果您使用 DbgPrintf()LStrPrintf() 与 LabVIEW 交互),则必须在您的拥有。

本质上,你必须

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

当然,您必须对您想要支持的每个平台执行此操作...

祝你好运,玩得开心。

关于c/c++ va_list 关于钩子(Hook),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13450162/

相关文章:

c - fflush 在命名管道中不起作用

c++ - X11 中点击事件的全局鼠标钩子(Hook)

variadic-functions - 如何在 Coq 中使用有关此函数类型的已知信息

objective-c - 为什么负 NSInteger(长整型)值在通过可变参数发送时会变成垃圾?

objective-c - 你如何从 Swift 调用 Objective-C 可变参数方法?

c - 如何按字典顺序对结构中的字符串进行排序?

c - 为什么我的指针数组在动态分配后被覆盖?

java - 钩子(Hook) @Before 和 @after 在开始时被调用两次

php - 带有 WooCommerce add_actions 的 Wordpress 不起作用

c - 如何以编程方式在 gtk 文本缓冲区中选择文本(主要选择)