Page 1 sur 2
Au sujet des Librairies...
Publié : mar. 04/mai/2004 12:48
par Chris
@ Fred
Est-ce que les librairies, (qu'elles soit utilisateur, ou inclues dans la distibution), ont un format particulier?
Par exemple, est-ce qu'elles ont un en-tête ou on peut retrouver la version, le nombre de fonctions, la taille, etc....
Enfin bref, tu vois un peu ce que je veux dire!
Je voudrais essayer de faire un petit utilitaire qui analyserait chaque librairies et chaque fichier .res pour détecter si il y a des noms, (de fonction, ou de constantes), en double.
Bon, j'ai un peu essayé de lire des lib dans un éditeur hexadécimal, mais je ne sais pas trop utiliser ce genre de truc, et du coup, je ne suis pas beaucoup plus renseigné qu'avant.
Chris

Publié : mer. 05/mai/2004 9:11
par Fred
Sur le forum anglais y'a un bout de code qui permet de lire les headers des libraries (je sais plus exactement ou..). Le format en soit est relativement simple.
Publié : lun. 13/déc./2004 16:42
par Anonyme2
Publié : lun. 13/déc./2004 16:50
par Chris
J'ai fait pareil!
J'ai passé plus d'une heure à chercher sans rien trouver, finalement, j'ai laissé tomber
Je pensais que ça venait de moi, ça me console!!!

Publié : lun. 13/déc./2004 16:53
par Anonyme2
Je crois que Fred confond avec un code de Num3 qui extrait les constantes des fichiers res, mais ça j'ai pas besoin.
Je vais demander à Fred comment est fait le header de ces fichiers et si la compression des Lib le modifie. Je n'ai pas trop de temps à perdre pour analyser ce header, ça ne m'apportera pas grand chose.
Merci Chris
Publié : mer. 15/déc./2004 6:37
par Anonyme2
Chris,
voici un code que je viens d'écrire pour extraire uniquement les noms de commandes des librairies "standart" de PB (pas celles du dossier Window ni les lib utilisateur)
Dans le résultat, certaines librairies n'ont pas de commandes (?) et en regardant le fichier, tout semble crypté.
Les noms qui se terminent avec un numéro indiquent que ces commandes ont des paramètres optionnels; le nom de commande PB interne avec ce numéro existe bien.
J'ai essayé de comprendre comment le header est fait, j'ai saisi je crois (

) le principe par contre je n'arrive pas à saisir la délimitation des champs, c'est différent en fonction des fichiers.
Donc je ne suis pas certain que toutes les commandes y soient....
Code : Tout sélectionner
Global CheminPB$
NewList ListeLibWindows.string()
NewList ListeLibStandart.string()
;//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\
Procedure.s CheminPureBasic()
Buffer$ = Space(260) : BufferSize = 259
If GetVersion_() & $FF0000 ; Windows NT/XP
clef = #HKEY_CLASSES_ROOT
Adresse = @"Applications\PureBasic.exe\shell\open\command"
Else ; La même chose pour Win9x
clef = #HKEY_LOCAL_MACHINE
Adresse = @"Software\Classes\PureBasic.exe\shell\open\command"
EndIf
If RegOpenKeyEx_(clef, Adresse, 0, #KEY_ALL_ACCESS, @Key) = #ERROR_SUCCESS
If RegQueryValueEx_(Key, "", 0, @type, @Buffer$, @BufferSize) = #ERROR_SUCCESS
OutputDirectory$ = GetPathPart(Mid(Buffer$, 2, Len(Buffer$) - 7))
EndIf
RegCloseKey_(Key)
EndIf
ProcedureReturn OutputDirectory$
EndProcedure
;//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\
Procedure ListFichiersLibWindows()
;stocke Tous les noms de fichiers du repertoire Windows des librairies
Retour = #false
If ExamineDirectory(0, CheminPB$+"PureLibraries\Windows\", "*.*")
ProchainDir = NextDirectoryEntry()
While ProchainDir <> 0
If Nom_de_fichier$ <> "." And Nom_de_fichier$ <> ".." And ProchainDir = 1
Nom_de_fichier$ = DirectoryEntryName()
If Len(GetExtensionPart(CheminPB$+"PureLibraries\Windows\"+ Nom_de_fichier$)) = 0
; on ne prend en compte que les fichiers sans extension, on ne sait jamais
AddElement(ListeLibWindows())
ListeLibWindows()\s = Nom_de_fichier$
Fichier +1
EndIf
EndIf
ProchainDir = NextDirectoryEntry()
Wend
Retour = #true
Else
Retour = -1 ; impossible d'examiner
EndIf
ProcedureReturn Retour
EndProcedure
;//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\
Procedure ListFichiersLibStandart()
;stocke Tous les noms de fichiers du repertoire des librairies sauf window et sauf userLib
Retour = #false
If ExamineDirectory(0, CheminPB$+"PureLibraries\", "*.*")
ProchainDir = NextDirectoryEntry()
While ProchainDir <> 0
If ProchainDir = 1
Nom_de_fichier$ = DirectoryEntryName()
If Len(GetExtensionPart(CheminPB$+"PureLibraries\"+ Nom_de_fichier$)) = 0
; on ne prend en compte que les fichiers sans extension, on ne sait jamais
AddElement(ListeLibStandart())
ListeLibStandart()\s = Nom_de_fichier$
Fichier +1
EndIf
EndIf
ProchainDir = NextDirectoryEntry()
Wend
Retour = #true
Else
Retour = -1 ; impossible d'examiner
EndIf
ProcedureReturn Retour
EndProcedure
;//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\
Procedure IsStringWindowsFile(File$)
; retourne #true si les noms correspondent, sinon #false
PositionDansLaListe = ListIndex(ListeLibWindows())
ForEach ListeLibWindows()
If UCase(File$) = UCase(ListeLibWindows()\s)
Retour = #true
Break
EndIf
Next
SelectElement(ListeLibWindows(), PositionDansLaListe)
ProcedureReturn Retour
EndProcedure
;//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\
Procedure IsStringStandartFile(File1$)
; retourne #true si les noms correspondent, sinon #false
PositionDansLaListe = ListIndex(ListeLibStandart())
ForEach ListeLibStandart()
If UCase(File1$) = UCase(ListeLibStandart()\s)
Retour = #true
Break
EndIf
Next
SelectElement(ListeLibStandart(), PositionDansLaListe)
ProcedureReturn Retour
EndProcedure
;//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\
Procedure LectureFichier(FichierCourant$)
If ReadFile(0, CheminPB$ + "PureLibraries\"+FichierCourant$)
While Eof(0) = 0
a$ = Trim(ReadString())
If Left(a$, 4) = "ERUP"
ERUP + 1
If ERUP > 1
Break
EndIf
ElseIf Left(a$, 4) = "LIB3"
; on passe le mot
Else
; If a$ <> "" And Len(a$) > 1
If Len(a$) > 1
Char = PeekB( @A$)
If (Char >= 'a' And Char <= 'z') Or (Char >= 'A' And Char <= 'Z')
; on teste si c'est le nom d'un fichier lib Window et aussi un nom de fichier lib standart
; si oui, on ne prend pas en compte
If IsStringWindowsFile(a$) = #false And IsStringStandartFile(a$) = #false
Debug " "+a$
EndIf
EndIf
EndIf
EndIf
Wend
Else
MessageRequester("", "Impossible ouvrir fichier", 16)
EndIf
EndProcedure
;//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\
; -- Prog principal
CheminPB$ = CheminPureBasic()
If ListFichiersLibWindows() And ListFichiersLibStandart()
; on lit toutes les libs standart et on extrait
Debug CountList(ListeLibStandart())
ForEach ListeLibStandart()
Debug "Fichier librairie --> "+ListeLibStandart()\s
LectureFichier(ListeLibStandart()\s)
Debug "- - - - "
Debug ""
Debug ""
Next
EndIf
End
Publié : mer. 15/déc./2004 10:17
par Fred
Desolé pour le manque d'informations, je n'etait pas chez moi hier soir (ni ce soir d'ailleurs). Je vais essayer de te faire ca ce Week-end.
Publié : mer. 15/déc./2004 13:08
par Anonyme2
Fred a écrit :Desolé pour le manque d'informations, je n'etait pas chez moi hier soir (ni ce soir d'ailleurs). Je vais essayer de te faire ca ce Week-end.

Publié : mer. 15/déc./2004 13:41
par El_Choni
J'avais fait il'y a quelques mois une petite app pour montrer les fonctions dupliquées, et "deactiver" les librairies avec ces fonctions (copier-les a un autre directoire) ou même deactiver seulement la fonction dupliquée. Si vous êtes interesé, je peux posser un link ici quand je sois retourné chez moi, je ne l'ai pas ici.
Bon jour,
Publié : mer. 15/déc./2004 13:46
par Anonyme2
Merci El_Choni,
je suis interessé.
J'ai cherché sur le forum anglais mais j'ai rien trouvé.
Merci pour le lien

Publié : jeu. 16/déc./2004 14:16
par Anonyme2
El_Choni
tu peux mettre ton lien (you could put your link here, tks)
Publié : jeu. 16/déc./2004 16:42
par El_Choni
Pas terminé, mais vous pouvez en regarder un peu comme ça est:
http://inicia.es/de/elchoni/PBLibManager.exe
Bonjour,
Publié : jeu. 16/déc./2004 16:52
par Chris
Merci, El_Choni!
C'est du bon boulot

Publié : jeu. 16/déc./2004 17:35
par Anonyme2
Merci El_Choni
je vais regarder ça

Publié : jeu. 16/déc./2004 17:49
par El_Choni
Et le methode que TailBite utilise por creer une liste des API:
Code : Tout sélectionner
Procedure.s GetPBFolder()
Shared hKey1, Type
cbData = (#MAX_PATH*2)+2
lpbData = AllocateMemory(cbData)
If GetVersion_()&$ff0000 ; Windows NT/XP
If RegOpenKeyEx_(#HKEY_CLASSES_ROOT, "Applications\PureBasic.exe\shell\open\command", 0, #KEY_ALL_ACCESS, @hKey1)=#ERROR_SUCCESS
If RegQueryValueEx_(hKey1, "", 0, @Type, lpbData, @cbData)=#ERROR_SUCCESS
Folder$ = PeekS(lpbData)
Folder$ = GetPathPart(Mid(Folder$, 2, Len(Folder$)-7))
EndIf
RegCloseKey_(hKey1)
EndIf
Else ; The same for Win9x
If RegOpenKeyEx_(#HKEY_LOCAL_MACHINE, "Software\Classes\PureBasic.exe\shell\open\command", 0, #KEY_ALL_ACCESS, @hKey1)=#ERROR_SUCCESS
If RegQueryValueEx_(hKey1, "", 0, @Type, lpbData, @cbData)=#ERROR_SUCCESS
Folder$ = PeekS(lpbData)
Folder$ = GetPathPart(Mid(Folder$, 2, Len(Folder$)-7))
EndIf
RegCloseKey_(hKey1)
EndIf
EndIf
FreeMemory(lpbData)
ProcedureReturn Folder$
EndProcedure
Procedure BuildApiList(PBFolder$)
WNL$ = Chr(13)+Chr(10)
WindowsLibsFolder$ = PBFolder$+"PureLibraries\Windows\"
DLLCount = 0
APICount = 0
If CreateFile(6, "APILIST1.TXT") And CreateFile(7, "APILIST2.TXT")
If ExamineDirectory(0, WindowsLibsFolder$, "")
While NextDirectoryEntry()
DLLName$ = DirectoryEntryName()
If DLLName$<>"." And DLLName$<>".." And FileSize(WindowsLibsFolder$+DLLName$)<>-2
If OpenFile(1, WindowsLibsFolder$+DLLName$)
ApiListSize = Lof()
*ApiList = AllocateMemory(ApiListSize)
ReadData(*ApiList, ApiListSize)
CloseFile(1)
ApiEnd = *ApiList+ApiListSize
ApiSeeker = *ApiList+9+Len(DLLName$)+1
UseFile(7)
While ApiSeeker<ApiEnd
ThisAPIFunction$ = PeekS(ApiSeeker)
ApiSeeker+Len(ThisAPIFunction$)+3
nArg = PeekB(ApiSeeker-2)*4
If PeekB(ApiSeeker-1)>0 And Right(ThisAPIFunction$, 1)<>"A"
ThisAPIFunction$+"A"
EndIf
WriteString("_"+ThisAPIFunction$+"@"+Str(nArg)+" "+Str(DLLCount)+WNL$)
APICount+1
Wend
FreeMemory(*ApiList)
UseFile(6)
WriteString(DLLName$+".DLL"+WNL$)
DLLCount+1
EndIf
EndIf
Wend
EndIf
CloseFile(7)
CloseFile(6)
If FileSize("APILIST.TXT")<>-1
DeleteFile("APILIST.TXT")
EndIf
If CreateFile(6, "APILIST.TXT")
WriteString(Str(DLLCount)+WNL$)
If OpenFile(7, "APILIST1.TXT")
ApiListSize = Lof()
*ApiList = AllocateMemory(ApiListSize)
ReadData(*ApiList, ApiListSize)
CloseFile(7)
UseFile(6)
WriteData(*ApiList, ApiListSize)
FreeMemory(*ApiList)
WriteString(Str(APICount)+WNL$)
If OpenFile(7, "APILIST2.TXT")
ApiListSize = Lof()
*ApiList = AllocateMemory(ApiListSize)
ReadData(*ApiList, ApiListSize)
CloseFile(7)
UseFile(6)
WriteData(*ApiList, ApiListSize)
FreeMemory(*ApiList)
EndIf
EndIf
CloseFile(6)
DeleteFile("APILIST1.TXT")
DeleteFile("APILIST2.TXT")
EndIf
EndIf
EndProcedure
BuildApiList(GetPBFolder())