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! :lol:

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
Ca fait 3 heures que je recherche ce post sur le forum anglais et j'en ai m.... J'ai fait des dizaines de requêtes pour rien, j'ai lu des dizaines de posts .........

Qui a le lien de ce post ou le code correspondant ?

Sinon va falloir repasser des heures à décomposer le header pour faire la même chose, je n'ai pas envie de réinventer l'eau chaude :cry: :cry: :cry: :cry: :cry: :cry: :cry: :cry: :cry: :cry: :cry: :cry: :cry: :cry: :cry: :cry: :cry: :cry: :cry:

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 :lol:

Je pensais que ça venait de moi, ça me console!!! :lol:

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 ( :roll: ) 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.
:D :D

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 :wink:

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 :D

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())