Comme vous le savez, si l'appel à LoadLibrary spécifie un module de DLL déjà mappé dans l'espace d'adressage du processus d'appel, la fonction retourne simplement une poignée de la DLL et incrémente le compteur de référence du module. p>
Quelque part, j'ai besoin d'obtenir le nombre de références d'une DLL. Comment obtenir le nombre de référence de la DLL? Comment savoir où la DLL a été chargée? Merci. P>
8 Réponses :
Cette information n'est pas disponible via une API publique Afaik. Quel est votre scénario? Exécution Appliferifier attrapera des erreurs que vous avez faites avec module (ou tout autre) poignées. p>
J'ai googlé, et j'ai trouvé ce article qui prétend fournir la réponse. Désolé je ne pouvais pas être plus utile: p>
+1 pour votre point de vue sur le compte de manière programmatique
@C Johnson, l'avez-vous essayé? Cette solution dépend de fonctionnalités non documentées, qui ne sont pas garanties de fonctionner dans les versions futures de Windows.
En fait, ils ne sont même pas garantis de travailler dans Versions actuelles i> de Windows :-)
Si c'est une façon non programmatique (grâce à C.Johnson pour donner cette perspective), WinDBG pourrait être utile p>
http://windbg.info/doc/1-common-cmds. html # 10_modules p>
Regard sur le dll! Et c'est des variantes. P>
! DLL - Tous les modules chargés avec charge Compte p> blockQuote>
EDIT 2: p>
Si vous voulez savoir où toute la DLL est chargée du processus, il y a deux manières: p>
a. Regardez la commande p>
"bu kernel32! loadlibraryexw"; comme / mu $ {/ V: myalias} POI (@ ESP + 4); .si ( $ SPAT (\ "$ {myalias} \", \ " mydll em> \") ! = 0) {kn; } {G} .else » « p> blockQuote>
dans l'URL ci-dessus p>
b. Exécutez le processus en WinDBG. Débogou-> Même filtrer et sélectionner "Module de chargement" et définissez-le sur "Activé" sous "Exécution". Sous "Continuer", réglez-le sur "Non manipulé". P>
L'un d'entre eux devrait vous aider certainement. P>
@ Jack2000: S'il s'agit d'un but de débogage comme vous l'avez mentionné ailleurs, WINDBG et toutes les fonctionnalités puissantes de plus en plus puissantes devraient certainement vous donner un headstart.
Remarque Pour le débogage X64 (autre convention d'appel, premier paramètre est transmis dans RCX code> Enregistrement) et pour les fenêtres modernes (non in Kernel32 mais dans KernelBase), vous devez utiliser quelque chose comme ça à la place: bu Kernelbase! Loadlibraryexw "; AS / MU $ {/ V: Myalias} RCX; Du RCX; .if ($-SPAT (\" $ {myalias} \ ",}.}. {g} " code> J'utilise du RCX code> pour vider tous les paramètres passés pour vérifier que le test peut casser ou non.
Je ne suis pas certain que vous comprenez parfaitement comment Le nombre de références peut vous dire combien de fois cela a été "chargé" mais ne vous aidera pas à déterminer qui l'a chargé. P> LoadLibrary / Freeelibrary Code> est censé fonctionner. Vous appelez freeelibrary code> lorsque vous avez terminé avec elle et qui décompose le nombre de références qui a été incrémenté lorsque vous l'avez chargé. Si une autre partie de votre processus l'utilise toujours, ce n'est probablement pas votre préoccupation. P>
Process Explorer peut dire à qui tous utilisent tous une DLL donnée.
@CHUBSDAD, qui vous dira quel processus l'utilise, mais cela vous dira-t-il où il a été chargé d'un processus. Ma compréhension est que tout cela se passe dans un processus unique: Freeelibrary CODE> est une chose en cours de traitement, le comptage de référence ne transversale pas les limites de processus, elles ne sont que pour la cartographie dans l'espace d'adresses local.
Vous pouvez énumérer les modules chargés dans un processus avec module32first () code> / module32next () code> puis utiliser moduleIt32.glblcntusage code> pour vérifier qu'il est Compte de référence. Je ne sais pas à quel point cela est fiable. P>
typedef struct _PEB_LDR_DATA2
{
ULONG Length;
UCHAR Initialized;
PVOID SsHandle;
LIST_ENTRY InLoadOrderModuleList;
LIST_ENTRY InMemoryOrderModuleList;
LIST_ENTRY InInitializationOrderModuleList;
PVOID EntryInProgress;
} PEB_LDR_DATA2, *PPEB_LDR_DATA2;
Veuillez indiquer ci-dessous le code.
Remarque: J'ai écrit ci-dessous Code dans Visual Studio 2010.
Testé sur Windows 8.1. Ne garantira pas que cela fonctionnera sur de nouvelles fenêtres (par exemple 10, cependant - selon la documentation doit fonctionner) utilisation pour injecté .dll's: p>
Question intéressante, mais pourquoi voulez-vous faire cela? Je parie qu'il y a un moyen plus facile d'atteindre ce que vous êtes après.
Je veux décharger une DLL en appelant freelibrary, mais c'est toujours chargé. Je suppose que quelque part est de le référencer, alors je veux vérifier le nombre de références pour le débogage.
À cette fin, utilisez la dépendance Walker. C'est bien plus puissant que du code inséré.
@Peterrudherman Voici pourquoi je voulais faire cela avant de trouver cette question et de ses réponses et de découvrir que je ne voulais pas vraiment le faire après tout: j'ai écrit une classe C ++ qui enveloppe Loadlibraryex et je voulais un test d'unité qui a montré que la DLL a été déchargé dans le destructeur.