Lister et utiliser des fonctions de lib externe OpenLibrary

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
Ar-S
Messages : 9540
Inscription : dim. 09/oct./2005 16:51
Contact :

Lister et utiliser des fonctions de lib externe OpenLibrary

Message par Ar-S »

Salut les coders..
Par curiosité j'explore un peu les possibilités (surement grandes) de shell32.dll.

Comment peut on connaitre la liste des fonctions dispo ? J'ai trouvé cette page qui me parait pas mal mais faut il encore savoir ce qui fonctionne.
Ensuite comment connaitre la syntaxe pour utiliser ces fonctions ?

Exemple:

Code : Tout sélectionner

If OpenLibrary(0,"shell32.dll") 
Jusque là tout va bien
Ensuite pour mes testes j'ai vu qu'il existe CheckDiskSpace par exemple.
Mais si je fais un

Code : Tout sélectionner

If GetFunction(0,"CheckDiskSpace")
Et bien il ne la trouve pas.

Merci de m'éclairer dans ce domaine que je ne connais pas du tout.


EDIT

J'ai un peu avancé en utilisant l'ID de la fonction

Code : Tout sélectionner

Procedure CheckDiskSpace()
  If OpenLibrary(0,"shell32.dll") 
    Debug "Lib Ouverte"
    *CheckDsk = GetFunctionEntry(0,733)
    If *CheckDsk
    Debug "Fonction trouvée"
    test = CallFunctionFast(*CheckDsk)
    Debug test
  Else
    Debug "Fonction introuvable"
  EndIf
  CloseLibrary(0)
EndIf
ProcedureReturn test
EndProcedure

Debug "resultat " + CheckDiskSpace()
Si maintenant GetFunctionEntry(0,733) est bien trouvée (733 correspond à CheckDiskSpace normalement), le test lui me renvoie toujours 0
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Avatar de l’utilisateur
JohnJohnsonSHERMAN
Messages : 648
Inscription : dim. 13/déc./2015 11:05
Localisation : Allez, cherche...
Contact :

Re: Lister et utiliser des fonctions de lib externe OpenLibr

Message par JohnJohnsonSHERMAN »

Pour lister les fonctions d'une librairie, tu peux utiliser ExamineLibraryFunctions() :

Code : Tout sélectionner

If OpenLibrary(1,"Shell32.dll")
ExamineLibraryFunctions(1)
While NextLibraryFunction()
  Debug LibraryFunctionName()
Wend

EndIf
A noter que des doublons sont souvent retournés (plusieurs fois de suite la même fonction), et que cela ne fonctionne pas sur toutes les librairies, certaines ne peuvent pas etre listées ce qui est dommage...
"Le bug se situe entre la chaise et le clavier"
Votre expert national en bogage et segfaults.

CPU : AMD A8 Quad core - RAM 8Gb - HDD 2To
  • Windows 10 x64 - PB 5.61 x64
  • Linux Ubuntu 16.04 LTS x64 (dual boot) - PB pas encore réinstallé
Avatar de l’utilisateur
Kwai chang caine
Messages : 6989
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Re: Lister et utiliser des fonctions de lib externe OpenLibr

Message par Kwai chang caine »

Un code un peu plus complet de SROD
http://www.purebasic.fr/english/viewtop ... 00#p185000
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
Avatar de l’utilisateur
Ar-S
Messages : 9540
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Lister et utiliser des fonctions de lib externe OpenLibr

Message par Ar-S »

Merci à vous 2.
@JohnJohnsonSHERMAN
Pfff mes yeux sont ont zappé ExamineLibraryFunctions :oops:
Par contre CheckDiskSpace n'est pas dans la liste alors que GetFunctionEntry(0,733) me revoit bien 1 (733 étant censé correspondre à CheckDiskSpace)
Any suggestion ?

@KCC : le code de srod est pour XP et pour PB4.xx, il me retourne une erreur.
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Avatar de l’utilisateur
Kwai chang caine
Messages : 6989
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Re: Lister et utiliser des fonctions de lib externe OpenLibr

Message par Kwai chang caine »

Tiens c'est bizarre, je l'ai testé avant de te le donner sur w7 x86 v5.60 et il a marché 8O
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
Ollivier
Messages : 4197
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: Lister et utiliser des fonctions de lib externe OpenLibr

Message par Ollivier »

@Ar-S

N'y aurait-il point un problème de décalage

1) Soit d'une unité?
732? ou 734?

Je ne vois rien qui m'indique si ça commence à 0 ou à 1.

2) Soit de plusieurs unités?

Des fonctions qui sont visibles "chez nous" alors qu'elles sont instanciées en interne quand des prog issus d'autres compilateurs appellent la DLL?
Avatar de l’utilisateur
Kwai chang caine
Messages : 6989
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Re: Lister et utiliser des fonctions de lib externe OpenLibr

Message par Kwai chang caine »

Je sais ce que j'ai fait
En fait, j'enregistre tous les jours les codes que les généreux membres donnent sur mon DD
Et je fais les recherches sur ce dernier, ce qui est beaucoup plus rapide et probant que par le forum
Et c'est donc pas le lien que j'ai testé, mais le code de SROD modifié par mes soins sur mon DD :oops:

Donc y'avait deux bricolettes à modifier
Cette fois testé, sur W10 X64 V5.60 :wink:

Code : Tout sélectionner

;'DllFunctionDump'. 
;----------------- 
;   Stephen Rodriguez. 
;   Created with Purebasic 4.02 for Windows. 
; 
;   Based on some code by Torsten Rienow;  http://www.powerbasic.com/support/forums/Forum7/HTML/001216.html 

;   Date:  March 2007. 
; 
;   Platforms:  Windows only.  Tested on XP professional SP2. 
; 
;Licence. 
;------- 
;   You are not allowed to use this code or any derivative for any hacking (api hijacking) 
;   tools. 
; 
;   No warranties... etc. 
;****************************************************************************************** 
; 
;The function GetDllFunctions() will retrieve all exported function names residing within 
;the specified dll/exe file.  The names are placed within a string array passed as a parameter 
;to the Procedure. 
;The function returns a count of the number of functions retrieved. 
;It will also return zero in the case of an error. 
; 
;The array will be redimensioned as appropriate, 
;****************************************************************************************** 


#IMAGE_DOS_SIGNATURE = $5A4D 
#IMAGE_NT_SIGNATURE = $4550 

;The following structure is not already defined by PB, 
Structure _IMAGE_SECTION_HEADER 
  Name.b[8]    ;8 bytes for a null-padded section name. UTF 8 format. 
  VirtualSize.l ;= 0 
  VirtualAddress.l ; = 0 
  SizeOfRawData.l 
  PointerToRawData.l 
  PointerToRelocations.l 
  PointerToLineNumbers.l ; = 0 
  NumberOfRelocations.w 
  NumberOfLineNumbers.w ; = 0 
  Characteristics.l 
EndStructure 



Procedure.l GetDllFunctions(filename.s,  Array strTable.s(1)) 
  Protected filesize, fileid, hFileMapping, filebase 
  Protected *idh.IMAGE_DOS_HEADER, *inth.IMAGE_NT_HEADERS 
  Protected *ExpDir.IMAGE_EXPORT_DIRECTORY, *section._IMAGE_SECTION_HEADER, *exsection._IMAGE_SECTION_HEADER 
  Protected exportsStartRVA, exportsEndRVA, entryPointRVA 
  Protected delta, *pFunctions.LONG, *pNames.LONG, currentsymname$ 
  Protected flag, i, j, count, dirsize 
  ;First job, check the filename. 
    filesize = FileSize(filename) 
    If filesize <=0 : ProcedureReturn 0 : EndIf 
    fileid=ReadFile(#PB_Any, filename) 
    If fileid = 0 : ProcedureReturn 0 : EndIf 
  ;Create a file mapping object so that we can treat the dll as if it were in memory. 
    hFileMapping = CreateFileMapping_(FileID(fileid), 0, #PAGE_READONLY, 0, 0, 0) 
    If hFileMapping = 0 : CloseFile(fileid) : ProcedureReturn 0 : EndIf 
  ;Map the file. 
    FileBase = MapViewOfFile_(hFileMapping, #FILE_MAP_READ, 0, 0, 0) 
    If FileBase  = 0 
      CloseHandle_(hFileMapping) 
      CloseFile(fileid) 
      ProcedureReturn 0 
    EndIf 
    *idh=FileBase 
    If *idh\e_magic = #IMAGE_DOS_SIGNATURE 
      *inth=*idh + *idh\e_lfanew 
      ;Check that the current process has access to the memory and the image is a valid pe dll/exe.. 
      If IsBadReadPtr_(*inth, SizeOf(IMAGE_NT_HEADERS)) = 0  And*inth\Signature = #IMAGE_NT_SIGNATURE 
      ;Good to go! 
      ;Determine the RVA of the exports data directory. 
        exportsStartRVA = *inth\OptionalHeader\DataDirectory[#IMAGE_DIRECTORY_ENTRY_EXPORT]\VirtualAddress 
        exportsEndRVA = exportsStartRVA + *inth\OptionalHeader\DataDirectory[#IMAGE_DIRECTORY_ENTRY_EXPORT]\Size 
        ;Get the first section. 
          *section = *inth + SizeOf(IMAGE_FILE_HEADER)+4 + *inth\FileHeader\SizeOfOptionalHeader 
        ;Identify the section containing the exports.  It is not always .edata ! 
          For i=1 To *inth\FileHeader\NumberOfSections 
            If exportsStartRVA >= *section\VirtualAddress And exportsStartRVA < *section\VirtualAddress + *section\VirtualSize 
              *exsection = *section 
              Break        
            EndIf 
            *section +SizeOf(_IMAGE_SECTION_HEADER) 
          Next 
        If *exsection 
          ;Calculate the difference between the RVA's and the file offsets for the current section. 
            delta = *exsection\VirtualAddress - *exsection\PointerToRawData 
          ;Adjust the exportsStartRVa accordingly to give the file offset of the image export directory, 
          *ExpDir = *idh + exportsStartRVA - delta 
          *pFunctions  = *idh+ *ExpDir\AddressOfFunctions - delta 
          *pNames = *idh+ *ExpDir\AddressOfNames - delta 
          For i = 0 To *ExpDir\NumberOfNames - 1 
            ;Only add the function name if it actually points to some code! 
              entryPointRVA = *pFunctions\l : *pFunctions + SizeOf(LONG) 
              If entryPointRVA <> 0 
                ;Add the name to the strTable() array and increase the count. 
                  If *pNames\l
                    currentsymname$=PeekS(*pNames\l- delta + *idh,-1, #PB_Ascii) 
                    ReDim strTable.s(count) 
                    strTable(count)=currentsymname$ 
                    count+1 
                  EndIf
              EndIf 
            *pNames+SizeOf(LONG)
          Next 
        EndIf        
      EndIf 
    EndIf 
    UnmapViewOfFile_(FileBase) 
    CloseHandle_(hFileMapping) 
    CloseFile(fileid) 
  ProcedureReturn count 
EndProcedure 


;Test. 
Dim names.s(0) 
num=GetDllFunctions("c:\windows\system32\kernel32.dll", names()) 
For i = 0 To num-1 
  Debug names(i) 
Next 
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
Avatar de l’utilisateur
Ar-S
Messages : 9540
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Lister et utiliser des fonctions de lib externe OpenLibr

Message par Ar-S »

Merci pour la MAJ KCC.
Ollivier, je me suis référé à la page postée plus haut qui indique : CheckDiskSpace (733) sauf que je viens de m'apercevoir que cela concerne Windows XP ^^
Donc il y a bien un décalage mais pas d'ID, d'OS :)

Du coup en testant une fonction présente il la trouve bien :

Code : Tout sélectionner

If OpenLibrary(0,"shell32.dll") 
  If GetFunction(0,"Shell_GetCachedImageIndex")
    Debug "Function found :D"
  Else
    Debug "Function not found :("
  EndIf
EndIf
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Avatar de l’utilisateur
Zorro
Messages : 2186
Inscription : mar. 31/mai/2016 9:06

Re: Lister et utiliser des fonctions de lib externe OpenLibr

Message par Zorro »

et quid du nombres de parametres, et de leur type ?
Avatar de l’utilisateur
cage
Messages : 604
Inscription : ven. 16/oct./2015 18:22
Localisation : France
Contact :

Re: Lister et utiliser des fonctions de lib externe OpenLibr

Message par cage »

Bonjour,
Voici une petite application qui liste les fonctions contenues dans une DLL
DLL Export Viewer
et permet une recherche rapide dans Google.
■ Win10 Pro 64-bit (Intel Celeron CPU N2920 @ 1.86GHz, 4,0GB RAM, Intel HD Graphics) & PB 6.12 LTS
■ Vivre et laisser vivre.
■ PureBasic pour le fun
■ Gérard sur le forum Anglais
■ Mes sites: http://pbcage.free.fr - http://yh.toolbox.free.fr
Avatar de l’utilisateur
Ar-S
Messages : 9540
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Lister et utiliser des fonctions de lib externe OpenLibr

Message par Ar-S »

Zorro a écrit :et quid du nombres de paramètres, et de leur type ?
Surement en allant zieuter du coté de Microsoft
Pour Shell_GetCachedImageIndex : https://msdn.microsoft.com/en-us/librar ... s.85).aspx
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Répondre