c - Hook 类似 Printf 的函数并修改输出

标签 c printf hook variadic-functions

我正在 Hook 类似 printf 的函数,其定义如下:

int Con_Printf(const char *format, ...)

我想检查给定的字符串是否在参数内或最终格式化的字符串中,如果存在,则将其替换为另一个字符串,但我有以下代码将参数传递给原始函数:

va_list args;
char *parg;

va_start(args, format);
vasprintf(&parg, format, args);
va_end(args);

(*conprint)("%s", parg);
free(parg);

是 (*conprint) 原始的 Con_Printf 函数。

如何查看应用了格式的字符串(即将参数替换为占位符)以替换我需要的内容,而不仅仅是传递所有参数?

示例: 该程序调用 Con_Printf("%s %s", "foo", "bar"),我想知道在我的 Con_Printf Hook 中“bar”是否在参数内,但我不知道有多少个参数,因为Con_Printf 的“, ...)”定义。

如果在参数中找到“bar”,则将其替换为“baz”并转发修改后的调用 (*conprint)("%s %s", "foo", "baz")(用 baz 替换 bar )。 (*conprint)("foo baz") 也能做到这一点。

谢谢!

最佳答案

我想,你想要的是va_arg()。查看手册页here 。您可能需要

,而不是直接使用 vasprintf()
  1. 一次取出一个参数
  2. 执行所需的检查和操作
  3. 然后将它们放在一起进行最终conprint

从手册页来看,历史设置是:

#include <varargs.h>

void foo(va_alist)
    va_dcl
{
    va_list ap;

   va_start(ap);
    while (...) {
        ...
        x = va_arg(ap, type);
        ...
    }
    va_end(ap);
}

您需要根据提供的格式说明符选择类型

关于c - Hook 类似 Printf 的函数并修改输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27354946/

相关文章:

c - fread() 从当前文件和旧文件中读取

具有可变参数的 C 宏 - "incompatible pointer type"

c - 0 精度的 printf 0

git - 在 Git 钩子(Hook)中获取提交消息

ios - 在 Swift 中使用 C 函数

c - 产生无限循环的基本函数

c - 我修改的代码中出现未处理的异常

linux - Bash printf %q 指令无效

Emacs:在 magit-status 缓冲区中暂存或取消暂存更改时更新 git-gutter 注释

c# - 在 Windows 上监视文件读取 - C# 解决方案