Obtenir la liste des modules d'un processus


Propriétés du code


Date de création : 07/12/2006 à 15:02:00
3 Commentaire(s)
  violent_ken

 

Présentation


Permet d'obtenir la liste des modules utilisés par un processus.


Exemple d'utilisation :


Private Const PID = 2588

Private Sub Command1_Click()
Dim mdl() As MODULEENTRY32, x As Long, s As String

CreateModuleList PID, mdl()
s = "Processus=[" & PID & "]" & vbNewLine

For x = 0 To UBound(mdl())
s = s & "Module=[" & Trim$(mdl(x).szExeFile) & "]" & " Taille=[" & Trim$(mdl(x).dwSize) & "]" & vbNewLine
Next x

Me.AutoRedraw = True
Me.Print s
End Sub



NOTE : Utiliser Trim$ pour enlever les espaces inutiles, car MODULEENTRY est défini avec des longueurs de chaines fixées.

 

Code


Option Explicit

'-------------------------------------------------------
'CONSTANTES
'-------------------------------------------------------
Private Const TH32CS_SNAPMODULE             As Long = &H8    'modules du processus


'-------------------------------------------------------
'APIs
'-------------------------------------------------------
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
Private Declare Function OpenProcess Lib "kernel32.dll" (ByVal dwDesiredAccessas As Long, ByVal bInheritHandle As Long, ByVal dwProcId As Long) As Long
Private Declare Function CreateToolhelpSnapshot Lib "kernel32" Alias "CreateToolhelp32Snapshot" (ByVal lFlags As Long, lProcessID As Long) As Long
Private Declare Function CreateToolhelp32Snapshot Lib "kernel32.dll" (ByVal dwFlags As Long, ByVal th32ProcessID As Long) As Long
Private Declare Function EnumProcessModules Lib "PSAPI.DLL" (ByVal hProcess As Long, ByRef lphModule As Long, ByVal cb As Long, ByRef cbNeeded As Long) As Long
Private Declare Function GetCurrentProcess Lib "kernel32.dll" () As Long
Private Declare Function Module32First Lib "kernel32.dll" (ByVal hSnapshot As Long, ByRef lppe As MODULEENTRY32) As Long
Private Declare Function Module32Next Lib "kernel32.dll" (ByVal hSnapshot As Long, ByRef lpme As MODULEENTRY32) As Long


'-------------------------------------------------------
'TYPES ET ENUMS
'-------------------------------------------------------
Public Type MODULEENTRY32
    dwSize As Long                  'taille de cette structure (à initialiser avant l'appel à Module32First ou Module32Next)
    th32ModuleID As Long            'ID du module
    th32ProcessID As Long           'ID du processus qui utilise le module
    GlblcntUsage As Long            'compteur d'usage global pour toutes les instances présentes dans la mémoire du système
    ProccntUsage As Long            'commteur d'usage du module pour le processus
    modBaseAddr As Long             'adresse de début du module en mémoire
    modBaseSize As Long             'taille du module en mémoire
    hModule As Long                 'HMODULE du module
    szModule As String * 256        'nom du module
    szExeFile As String * 260       'path du module
End Type



'-------------------------------------------------------
'créé une liste des modules d'un processus
'-------------------------------------------------------
Public Sub CreateModuleList(ByVal PID As Long, ByRef mdList() As MODULEENTRY32)
Dim lSnap As Long
Dim x As Long
Dim mdMOD As MODULEENTRY32
Dim mdTemp() As MODULEENTRY32

    x = 0

    'création du snapshot des modules
    lSnap = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, PID)

    mdMOD.dwSize = Len(mdMOD)
    
    's'occupe du premier module rencontré dans le snap
    If Module32First(lSnap, mdMOD) Then
        'alors on a trouvé un module, on va pouvoir continuer plus loin
        
        'on dimensionne notre tableau
        ReDim mdTemp(0)
        'on stocke les infos du premier module dans la liste, à l'emplacement 0
        mdTemp(0) = mdMOD
        mdMOD.dwSize = Len(mdMOD)
        
        'continue tant qu'il y a des nouveaux modules dans le snapshot
        Do While Module32Next(lSnap, mdMOD)

            'on redimensionne le tableau de 1 plus grand, pour pouvoir acceullir la liste temporaire du module en cours
            ReDim Preserve mdTemp(x)
            
            'formatage des strings directement dans cette Sub (car ces infos ne servent qu'à l'affichage direct)
            mdMOD.szExeFile = FormatedString(mdMOD.szExeFile)
            mdMOD.szModule = FormatedString(mdMOD.szModule)
            'les autres infos sont des Long, donc pas de formatage
            
            'stocke les infos du module en cours à l'emplacement x
            mdTemp(x) = mdMOD
            'prépare la taille pour le prochain module
            mdMOD.dwSize = Len(mdMOD)
            x = x + 1
        Loop
    Else
        ReDim mdTemp(1)
    End If
    
    ReDim Preserve mdTemp(UBound(mdTemp()) - 1)
    'stockage de la liste des modules
    mdList = mdTemp 'on aurait directement pu travailler sur mdList sans passer par mdTemp, mais il est plus propre de ne changer mdList (d'ailleurs toute autre valeur renvoyée par une sub/fonction) uniquement A LA FIN de cette sub/fonction
    
    'on le handle du snap
    CloseHandle lSnap
End Sub

'-------------------------------------------------------
'formatage de string
'-------------------------------------------------------
Public Function FormatedString(ByVal sString As String) As String
Dim s As String

    s = sString
    
    'enlève le vbnullchar de fin si nécessaire
    If InStr(s, vbNullChar) Then s = Left$(s, InStr(s, vbNullChar) - 1)
    
    'enlève les espaces inutiles
    s = Trim$(s)
    
    FormatedString = s
End Function


 
 

Modifier le code

Seul les admins et l'auteur du code lui même peuvent modifier ce code.

 

Commentaires


De MadMatt le 07/12/2006 à 20:18


J'ai ajouté ton dernier code à la librairie, par contre pour celui la, en le recopiant dans la librairie j'ai vu que y'allait avoir un problème au niveau des données renvoyées : ce sont des types ModuleEntry
Et comme c'est une classe (et une dll activex), c'est pas pratique de renvoyer des types perso. C'est pour ça que ce qu'il faudrait faire, c'est comme pour la liste des processus. Il faudrait créer un type "ModuleInfo" perso (comme pour les processus), avec toutes les infos qu'on peut récupérer, comme ça on évite de renvoyer les types d'api, et on peut y ajouter plus d'infos, leurs donner des noms plus clairs, et virer les inutiles.
Il faudrait aussi qu'on voit du coté des NtQueryInformation si on peut pas récupérer la liste des modules (comme pour la liste des processus : http://vbsystemlibrary.free.fr/code.php?ID=17), parce que c'est 10x plus rapide au moins, et comme des modules y'en a bcp par processus, et que des processus y'en a beaucoup, ça pourrait etre un plus.

 

De sebdraluorg le 17/02/2007 à 16:11


Salut,

Eh par NtQueryInformationProcess j'ai pas trouvé mais y a EnumProcessModule qui est un peu plus rapide

Exemple avec un type ModuleInfo:



Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
Private Declare Function OpenProcess Lib "kernel32.dll" (ByVal dwDesiredAccessas As Long, ByVal bInheritHandle As Long, ByVal dwProcId As Long) As Long

Private Declare Function EnumProcessModules Lib "PSAPI.DLL" (ByVal hProcess As Long, lphModule As Long, ByVal cb As Long, lpcbNeeded As Long) As Long
Private Declare Function GetModuleFileNameEx Lib "PSAPI.DLL" Alias "GetModuleFileNameExA" (ByVal hProcess As Long, ByVal hModule As Long, ByVal lpFileName As String, ByVal nSize As Long) As Long

Private Const PROCESS_QUERY_INFORMATION = &H400
Private Const PROCESS_VM_READ = &H10

Public Type ModuleInfo
hModule As Long
FileName As String
PathFileName As String
End Type

Public Function GetModuleList(ByVal Pid As Long, ByRef ModsInfo() As ModuleInfo) As Long

Dim i As Integer
Dim hMod() As Long
Dim CntMod As Long
Dim hProcess As Long
Dim RetLenght As Long
Dim sBuff As String

hProcess = OpenProcess(PROCESS_QUERY_INFORMATION Or PROCESS_VM_READ, False, Pid)

If (hProcess <> 0) Then
ReDim hMod(1023)
If EnumProcessModules(hProcess, hMod(0), &H1000, RetLenght) Then
CntMod = RetLenght / 4
ReDim ModsInfo(CntMod)
ReDim Preserve hMod(CntMod)
For i = 0 To CntMod - 1
sBuff = Space(MAX_PATH)
If GetModuleFileNameEx(hProcess, hMod(i), sBuff, MAX_PATH) Then
ModsInfo(i).PathFileName = RemoveNullChar(sBuff)
ModsInfo(i).FileName = GetFileNameFromFullPath(ModsInfo(i).PathFileName)
End If
ModsInfo(i).hModule = hMod(i)
Next i
End If
Erase hMod
CloseHandle hProcess
GetModuleList = CntMod
End If

End Function

Public Function GetFileNameFromFullPath(ByVal FullPath As String) As String

Dim Pos As Long

Pos = InStrRev(FullPath, "\")
If Pos > 0 Then
GetFileNameFromFullPath = Right$(FullPath, Len(FullPath) - Pos)
Else
GetFileNameFromFullPath = FullPath
End If

End Function

 

De sebdraluorg le 17/02/2007 à 16:12


Erf desolé pour l'indentation qui s'est barrée...

 

Ajouter un commentaire


Vous devez être connecté pour pouvoir poster un commentaire.

 
 

Valid HTML 4.01 Transitional Valid CSS

Site web de Vb System Library version 1.3
Developpement et design réalisé par : Matthieu Napoli (MadMatt)
© 2007 Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
Temps d'execution de la page : 0.012 s
www.mnapoli.fr