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関数を呼び出したいのですが、//それを呼び出す方法がわかりません...

    }
    //Hook Function not include ...

    Hook(foo, replaced_foo, (void **)&original_foo);
4

1 に答える 1

2

original_foo_v()がかかる対応するがあるva_args場合は、ラッキーです。それを使用できます。

そうでない場合 (LabVIEW を使用している場合DbgPrintf()LStrPrintf()、LabVIEW とのインターフェイス用に使用している場合など)、自分で何かを作成する必要があります。

基本的に、あなたはする必要があります

  • va_listあなたが得たものを調べ、
  • スタックに沿って歩いてスタック フレームを見つけ、
  • va_listポイント先と次のスタックフレームの間の領域全体が必要であると仮定して、必要なだけスタックにメモリを割り当てます。
  • va認識関数を呼び出します。

もちろん、サポートする予定のプラットフォームごとにこれを行う必要があります...

頑張って楽しんでね。

于 2012-11-19T09:30:04.587 に答える