2015-08-27 3 views
1

J'utilise SymEnumSymbols pour obtenir tous les symboles correspondants à un masque donné, et les pousser dans un vecteur en utilisant la fonction CALLBACK. Le problème est que le nom du symbole (qui se trouve dans la structure PSYMBOL_INFO) est seulement le nom de la fonction, et non la signature entière .. Par exemple, j'ai cette fonction:DbgHelp - Obtenir la signature complète du symbole (nom de la fonction + types de paramètres)

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

Quand j'appelle SymEnumSymbols avec le masque "TestMe!GetImageProcAddress" et imprime le nom du symbole apparié, je reçois:

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

Mais je veux imprimer un de ces:

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

Donc, ma question - est-il possible d'obtenir la signature complète du symbole (nom de la fonction + type de paramètres)? J'ai été en mesure de parcourir les paramètres en utilisant SymSetContext, puis SymEnumSymbols et en filtrant avec le drapeau SYMFLAG_PARAMETER - mais je ne sais pas comment obtenir les types de paramètres ..

Merci!

Répondre

1

Après une longue recherche - j'ai trouvé une solution. Après avoir obtenu l'indice de la fonction, vous devez énumérer ses paramètres en définissant le contexte à l'adresse de fonction spécifique à l'aide SymSetContext, puis en appelant SymEnumSymbols (et le mettre à utiliser le contexte):

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

Puis, par en utilisant le drapeau SYMFLAG_PARAMETER, vous pouvez sélectionner uniquement les paramètres de la fonction. Maintenant, en utilisant le paramètre TypeIndex, vous pouvez rechercher le type de paramètre en appelant (plusieurs fois) à SymGetTypeInfo. Il n'est pas simple, et il y a beaucoup de cas de base ...

Une très bonne explication peut être trouvée ici: HOW TO USE DBGHELP TO ACCESS TYPE INFORMATION

Et un exemple peut être trouvé ici: TYPEINFODUMP

Bonne la chance!