2

特定のマスクに一致するすべてのシンボルを取得し、CALLBACK 関数を使用SymEnumSymbolsしてそれらをベクトルにプッシュするために使用しています。問題は、シンボル名 (PSYMBOL_INFO構造内にある) が関数の名前のみであり、署名全体ではないことです。たとえば、次の関数があります。

TestMe!GetImageProcAddress (struct HINSTANCE__ *hi, int num)

SymEnumSymbolsmaskで呼び出し"TestMe!GetImageProcAddress"、一致したシンボルの名前を出力すると、次のようになります。

printf("%s\n", pSymInfo->Name); // Prints: GetImageProcAddress

しかし、これらのいずれかを印刷したい:

TestMe!GetImageProcAddress (struct HINSTANCE__ *, int)
GetImageProcAddress (struct HINSTANCE__ *, int)

だから私の質問 - 完全なシンボル署名 (関数の名前 + パラメーターの型) を取得する方法はありますか? を使用してパラメーターを反復処理しSymSetContext、次にSymEnumSymbolsフラグを使用してフィルター処理することができましSYMFLAG_PARAMETERたが、パラメーターの型を取得する方法がわかりません..

ありがとう!

4

1 に答える 1

2

長い検索の後、解決策を見つけました。SymSetContext関数のインデックスを取得したら、 を使用してコンテキストを特定の関数アドレスに設定し、呼び出しSymEnumSymbolsて (そしてコンテキストを使用するように設定して) 、そのパラメーターを列挙する必要があります。

SymEnumSymbols(GetCurrentProcess(), 0, NULL, ...)

次に、フラグを使用してSYMFLAG_PARAMETER、関数パラメーターのみを選択できます。これで、 parameter を使用して、TypeIndexを (何度も) 呼び出すことで、パラメーターの型を検索できますSymGetTypeInfo。単純ではなく、基本的なケースがたくさんあります...

本当に良い説明がここにあります: HOW TO USE DBGHELP TO ACCESS TYPE INFORMATION

例はここにあります: TYPEINFODUMP

幸運を!

于 2015-08-31T15:09:11.177 に答える