2012-11-19 84 views
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功能, //我不知道如何調用它...C/C++的va_list

} 
    //Hook Function not include ... 

    Hook(foo, replaced_foo, (void **)&original_foo); 
+8

你不能用標準C - 你必須下降到裝配什麼特定平臺。如果有'foo()'的變體需要'va_list'參數(如'vprintf()'是'printf()'的變體),那麼你可以傳遞'args'給它。 –

+1

這幾乎是答案,而不是:-P – Will

回答

2

如果你有一個相應的original_foo_v()這需要一個va_args,你很幸運:你可以使用它。如果你不這樣做(例如你使用DbgPrintf()LStrPrintf()與LabVIEW接口),你必須自己製作一些東西。

從本質上講,你必須

  • 檢查va_list你,
  • 沿堆棧走找到它的堆棧幀,
  • 在棧上分配儘可能多的內存,因爲你需要,假設你需要在va_list點和下一個堆棧幀之間的整個區域,
  • 調用非va知曉的功能。

當然,你必須這樣做對每一個你打算支持平臺...

好運氣和樂趣。

+0

例如INT的ioctl評論(INT菲爾德斯,unsigned long類型的請求,...); – user1742844

+0

'ioctl(2)'是另一回事 - [第三個參數是一個無類型指向內存的指針。它傳統上是char * argp(從void *之前的日子開始是有效的C),並且將在本次討論中被命名爲。](http://www.kernel.org/doc/man-pages/online/pages/man2/ ioctl.2.html) – glglgl