Ce code permet de savoir quelles sont les plages mémoire (à savoir l'adresse de départ et la taille de la région) utilisées par un processus.
Avant de vous donner le code, voici une petite aide (forte utile) pour comprendre comment est partitionné l'espace mémoire virtuelle d'un processus ==>
http://minso.free.fr/cavinfo/systeme/memoirevirtuelle.html
Pour le code en lui même, çà réside dans l'utiisation de l'API VirtualQueryEx.
Ce code présente également :
-comment obtenir les droits pour son application pour pouvoir obtenir le handle de n'importe quel processus (avec la procédure GetAllPrivileges)
-comment lister les processus (rien de nouveau)
Source / Exemple :
'Je ne donne ici que la procédure pour obtenir les espaces mémoire, l'exemple et les déclaration sont dans le *.zip
'-------------------------------------------------------
'obtient les différentes zones mémoire d'un processus utilisées dans la zone virtuelle
'-------------------------------------------------------
Public Sub RetrieveMemRegions(ByVal lPid As Long, ByRef lBaseAdress() As Long, ByRef lRegionSize() As Long)
Dim lHandle As Long
Dim lPosMem As Long
Dim lRet As Long
Dim lLenMBI As Long
Dim mbi As MEMORY_BASIC_INFORMATION
Dim si As SYSTEM_INFO
'initialise les tableaux
ReDim lBaseAdress(0)
ReDim lRegionSize(0)
'obtient le handle du processus
lHandle = OpenProcess(PROCESS_ALL_ACCESS, False, lPid)
lLenMBI = Len(mbi) 'taille de la structure
GetSystemInfo si 'obtient les infos sur les adresses de début et de fin de la plage mémoire maximum
lPosMem = si.lpMinimumApplicationAddress 'adresse la plus petite ==> part de là
Do While lPosMem < si.lpMaximumApplicationAddress 'tant que l'adresse est inférieure à l'adresse maximale
mbi.RegionSize = 0
'obtient les infos sur les régions mémoire du processus définit par son handle hProcess
lRet = VirtualQueryEx(lHandle, ByVal lPosMem, mbi, lLenMBI)
If lRet = lLenMBI Then
If (mbi.lType = MEM_PRIVATE) And (mbi.State = MEM_COMMIT) Then
'alors utilisé par le processus, on récupère les infos
If mbi.RegionSize > 0 Then
'région non nulle, alors on la stocke dans les tableaux résultats
'les redimensionne
ReDim Preserve lBaseAdress(UBound(lBaseAdress) + 1)
ReDim Preserve lRegionSize(UBound(lRegionSize) + 1)
'stocke à la fin
lRegionSize(UBound(lRegionSize)) = mbi.RegionSize
lBaseAdress(UBound(lBaseAdress)) = mbi.BaseAddress
End If
End If
'continue la recherche des régions (ajoute la taille de la région à l'adresse de départ ==> donne la prochaine adresse de départ)
On Error GoTo ErrCapacityGestion 'dépassement de capacité pour la dernière adresse+regionsize
lPosMem = mbi.BaseAddress + mbi.RegionSize 'fait l'ajout
Else
'recherche terminée
Exit Do
End If
Loop
ErrCapacityGestion:
CloseHandle lHandle 'ferme le handle du processus
End Sub
Conclusion :
Encore un p'tit bout de mon editeur hexa, qui viendra probablement dans plus trop trop longtemps.
N'oubliez pas de commenter, et de noter ;)
Merci, @+
Vous n'êtes pas encore membre ?
inscrivez-vous, c'est gratuit et ça prend moins d'une minute !
Les membres obtiennent plus de réponses que les utilisateurs anonymes.
Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.
Le fait d'être membre vous permet d'avoir des options supplémentaires.