Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Partir à la chasse des DLL inutiles sur mon DD

3 réponses
Avatar
Jacques
Bonjour,
je recherche un logiciel qui détermine si des DLL présentes sur mon DD
sont inutiles. Avez-vous un conseil à me donner ?
Merci

3 réponses

Avatar
Azo3
...ouais, t'en méfier!!!!

--
Serge CENCI

MVP Microsoft WINDOWS
NB - adresse : enlever ENLEVER
"Jacques" <jpoupeau[nospam]@msn.com> a écrit dans le message de news:

Bonjour,
je recherche un logiciel qui détermine si des DLL présentes sur mon DD
sont inutiles. Avez-vous un conseil à me donner ?
Merci




Avatar
picosel
une dll inutile signalée est peut être celle d'n périphérique non connecté
ou désactivé
d'ou problème à la relance...
je confirme: prudence



"Azo3" a écrit dans le message de news:

...ouais, t'en méfier!!!!

--
Serge CENCI

MVP Microsoft WINDOWS
NB - adresse : enlever ENLEVER
"Jacques" <jpoupeau[nospam]@msn.com> a écrit dans le message de news:

Bonjour,
je recherche un logiciel qui détermine si des DLL présentes sur mon DD
sont inutiles. Avez-vous un conseil à me donner ?
Merci








Avatar
Jean-Claude BELLAMY
Dans le message :,
Jacques <jpoupeau[nospam]@msn.com> a pris la peine d'écrire ce qui suit :
Bonjour,
je recherche un logiciel qui détermine si des DLL présentes sur mon DD
sont inutiles. Avez-vous un conseil à me donner ?


NE PERDS PAS TON TEMPS A CHERCHER !
(oui, je crie!! ;-))


Ce logicel NE PEUT PAS exister !

Car les façons d'appeler une DLL depuis une appli quelconque sont multiples
(2 essentiellement)

1) Appel "statique" (= programmé à la compilation)
-----------------------------------------------------------------
On a défini dans le programme appelant la liste de
toutes les fonctions de la DLL dont on va avoir besoin
avec le nom et/ou l'index de chaque fonction tels qu'ils
sont définis dans la DLL, et bien sûr le nom (en clair)
de la DLL.

P.ex. (en Delphi, tiré de "SuperExec") :
Function NetServerEnum(servername:LPCWSTR;level:DWORD;
bufptr:Pointer;prefmaxlen:DWORD;
var entriesread,totalentries:DWORD;servertype:DWORD;
domain:LPCWSTR;var ResumeHandle:DWORD):NET_API_STATUS;
stdcall; external 'netapi32.dll';

-> L'appli ici concernée fait appel à la fonction "NetServerEnum"
de la DLL "'netapi32.dll"

On retrouve cela dans le binaire de Superexec :
...
000DC4C0 6F 78 41 00 6E 65 74 61 70 69 33 32 2E 64 6C 6C
oxA.netapi32.dll
000DC4D0 00 00 00 00 44 73 47 65 74 44 63 4E 61 6D 65 41
....DsGetDcNameA
000DC4E0 00 00 00 00 4E 65 74 53 68 61 72 65 45 6E 75 6D
....NetShareEnum
000DC4F0 00 00 00 00 4E 65 74 55 73 65 72 47 65 74 4C 6F
....NetUserGetLo
...
000DC5B0 73 65 72 73 00 00 00 00 4E 65 74 53 65 72 76 65
sers....NetServe
000DC5C0 72 45 6E 75 6D 00 00 00 4E 65 74 47 65 74 41 6E
rEnum...NetGetAn
...

Donc là, pas de problème, en "balayant" tous les EXE
(et autres modules binaires), on va savoir qui appelle qui.
Des outils tels que "Dependency Walker" (de Microsoft)
ou "Scanbin" (que j'ai conçu) savent éditer ces listes,
donc on est capable de connaitre la liste des applis
utilisant CETTE méthode qui appellent une DLL donnée.
http://www.dependencywalker.com/


http://cjoint.com/?lpqj7jRc2o

2) Appel "dynamique" (= non programmé à la compilation)
-------------------------------------------------------------------------
L'appel de la DLL se fait "à la volée", "sans préméditation" !
Le moment venu, on commence par charger la DLL
par la fonction "LoadLibrary" (de Kernel32.dll)
Puis on détermine l'adresse de la fonction voulue par la
fonction "GetProcAddress", en lui passant en paramètre sous
forme de chaine le nom de la fonction voulue.

P.ex. (en Delphi)

TNetServerEnum = function(servername:LPCWSTR;level:DWORD;
bufptr:Pointer;prefmaxlen:DWORD;
var entriesread,totalentries:DWORD;servertype:DWORD;
domain:LPCWSTR;var ResumeHandle:DWORD):NET_API_STATUS;
stdcall;
var
lHandle: THandle;
enumcomputer: TNetServerEnum;
....
lHandle:=LoadLibrary('netapi32.dll');
@enumcomputer:=GetProcAddress(lHandle,'NetServerEnum');

Dans ce cas, on est incapable, en examinant le module binaire
de l'appli, de savoir qu'elle va appeler la fonction ''NetServerEnum"
de la DLL "netapi32.dll", vu que les noms "netapi32.dll" et
''NetServerEnum" ne sont plus dans des zones réservées
(la zone des "imports"), mais seulement en vrac dans le "pot
commun" des données.


La 2ème méthode est beaucoup plus complexe que la 1ère, mais elle a
cependant souvent la préférence des développeurs car elle permet de TESTER
au prélalable l'existence de la DLL (par le compte-rendu de "LoadLibrary")
et si oui l'existence de la fonction (par le compte-rendu de
"GetProcAddress"). Donc on peut afficher un message d'erreur particularisé.

Un tel problème avec la 1ère méthode se solde avec la laconique et
standardisée boite de dialogue bien connue :
le point d'entrée "xxxxxxxxx" est introuvable
dans la bibliothèque "yyyyyyyyyyy"

Personnellement, j'utilise la 1ère quand je suis SÛR que la DLL et sa
fonction existe (cas des DLL du système).
Par contre j'utilise la 2ème si la présence de la DLL est hypothétique (liée
à une version de logiciel, ..)

Donc toutes les fois qu'on utilise la 2ème méthode, on ne peut savoir si
l'appli utilise telle ou telle DLL.
C'est pourquoi, dans SCANBIN, j'affiche toujours "Attention, cette liste est
peut-être incomplète ..." si je détecte l'appel de "LoadLibrary" et
"GetProcaddress".


Donc savoir si une DLL est inutile (car jamais appelée) est IMPOSSIBLE à
déterminer !



Compris ?


--
May the Force be with You!
La Connaissance s'accroît quand on la partage
----------------------------------------------------------
Jean-Claude BELLAMY [MVP]
http://www.bellamyjc.org ou http://jc.bellamy.free.fr