c/c++;关于胡克的清单
//但是我想调用原来的函数, //我不知道如何调用它c/c++;关于胡克的清单,c,hook,variadic-functions,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);
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\u foo\u v()
,它接受va\u args
,那么您很幸运:您可以使用它
如果您不这样做(例如如果您使用DbgPrintf()
或LStrPrintf()
与LabVIEW进行接口),那么您必须自己制作一些东西
基本上,你必须
- 检查您得到的
va_列表
- 沿着堆栈走,找到它的堆栈框架
- 假设需要
指向的整个区域和下一个堆栈帧之间的整个区域,在堆栈上分配所需的内存va_列表
- 调用不支持va的函数
祝你好运,玩得开心。使用标准C是不可能的-你必须使用汇编或特定于平台的东西。如果有一个变量
foo()
采用了va_list
参数(比如vprintf()
就是printf()
的一个变量),那么您可以将args
传递给它。这几乎就是答案,而不是注释:-例如int-ioctl(int-fildes,unsigned long request,…)<代码>ioctl(2)是另一回事-
}
//Hook Function not include ...
Hook(foo, replaced_foo, (void **)&original_foo);