2010-06-03 7 views
0

J'écris un pilote de périphérique qui est chargé par un pilote tiers. J'ai besoin d'un moyen de déterminer le nom du pilote tiers qui charge mon pilote de périphérique (à des fins de débogage).Comment déterminer le nom de la DLL (chaîne) qui a chargé ma DLL?

Par exemple, GetModuleFileName me fournira le nom de l'exécutable. J'aimerais plutôt pouvoir obtenir les noms de DLL.

La trace de pile peut être l'un des suivants:

(a)

app0.exe 
abc.dll <- detect "abc" 
common.dll 
my.dll 

(b)

app1.exe 
xyz.dll <- detect "xyz" 
common.dll 
my.dll 

(c)

app2.exe 
common.dll 
my.dll 

P.S. - Je ne ai besoin d'une méthode pour C++ \ Windows

Répondre

3

Je suppose que vous avez une poignée de processus, ou l'identifiant du processus votre my.dll est chargé dans

Voir un exemple MSDN à http://msdn.microsoft.com/en-us/library/ms686701(v=VS.85).aspx qui prendra un instantané. d'un processus et donner toutes les informations.

La méthode intéressante est à BOOL ListProcessModules(DWORD dwPID):

MODULEENTRY32 a un champ appelé szModule qui contient le nom du module. Voir http://msdn.microsoft.com/en-us/library/ms684225(VS.85).aspx

Toutes les entrées du module peuvent être récupérées à partir d'un processus à l'aide CreateToolhelp32Snapshot, ce qui nécessite l'identification de processus (th32ProcessID de PROCESSENTRY32).

Ensuite, vous allez parcourir tous les modules de l'instantané en utilisant Module32First et Module32Next. Aussi, n'oubliez pas de fermer le handle donné par CreateToolhelp32Snapshot.

(Note: ces méthodes sont disponibles à partir kernel32.dll)

Ce module est appelé marche, plus ici: http://msdn.microsoft.com/en-us/library/ms684236(v=VS.85).aspx (décrit ce qui est dans cette réponse déjà)

0

Si c'est pour le débogage fins seulement, vous pouvez simplement faire un stackwalk

Voir ceci stackoverflow answer pour les détails

Questions connexes