挂钩类似Printf的功能并修改输出

时间:2014-12-08 09:27:51

标签: c printf hook variadic-functions

我挂了像这样定义的类似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钩子中知道" bar& #34;在争论中,但由于",...)"我不知道有多少参数。 Con_Printf的定义。

如果" bar"在参数中找到,然后将其替换为" baz"转发修改后的电话(* conprint)("%s%s"," foo"," baz")(用baz替换吧)。 (* conprint)(" foo baz")也可以做到这一点。

谢谢!

3 个答案:

答案 0 :(得分:0)

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

而不是直接使用vasprintf()
  1. 一次取出一个参数
  2. 执行必要的检查和操作
  3. 然后将它们放在一起进行最后的conprint
  4. 从手册页中,历史设置为:

    #include <varargs.h>
    
    void foo(va_alist)
        va_dcl
    {
        va_list ap;
    
       va_start(ap);
        while (...) {
            ...
            x = va_arg(ap, type);
            ...
        }
        va_end(ap);
    }
    

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

答案 1 :(得分:0)

好吧,我想我错过了字符串部分应该包含已经格式化的文本的事实,所以我可以直接在那里进行字符串操作来替换针。

所以,我的代码终于像这样结束了:

va_list args;
char *parg;

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

char* replacedstr;
replacedstr =  str_replace(parg, "bar", "baz");
(*conprint)("%s", replacedstr); 
free(parg);

str_replace是一个很好的功能,我找到了某个地方(我从来没有在C中编码,只是做实验)。

答案 2 :(得分:-1)

static (*__cdecl)F_HOOK *edit_f(&printf, sizeof(printf))
{
    __cdecl _:printf
    {
    /* .. code before executing printf stuff.. */
    }
}