Option Explicit
'-------------------------------------------------------
'//MODULE DE GESTION DES PROCESSUS ET DE LEUR MEMOIRE
'-------------------------------------------------------
'-------------------------------------------------------
'CONSTANTES
'-------------------------------------------------------
Private Const SYNCHRONIZE As Long = &H100000
Private Const STANDARD_RIGHTS_REQUIRED As Long = &HF0000 'aussi pour d'autres accès que les processus
Private Const PROCESS_ALL_ACCESS As Long = (STANDARD_RIGHTS_REQUIRED Or _
SYNCHRONIZE Or &HFFF)
Private Const MEM_PRIVATE As Long = &H20000
Private Const MEM_COMMIT As Long = &H1000
'-------------------------------------------------------
'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 Sub GetSystemInfo Lib "kernel32" (lpSystemInfo As SYSTEM_INFO)
Private Declare Function VirtualQueryEx& Lib "kernel32" (ByVal hProcess As Long, lpAddress As Any, lpBuffer As MEMORY_BASIC_INFORMATION, ByVal dwLength As Long)
'-------------------------------------------------------
'TYPES ET ENUMS
'-------------------------------------------------------
Public Type MEMORY_BASIC_INFORMATION ' 28 bytes
BaseAddress As Long
AllocationBase As Long
AllocationProtect As Long
RegionSize As Long
State As Long
Protect As Long
lType As Long
End Type
Public Type SYSTEM_INFO ' 36 Bytes
dwOemID As Long
dwPageSize As Long
lpMinimumApplicationAddress As Long
lpMaximumApplicationAddress As Long
dwActiveProcessorMask As Long
dwNumberOrfProcessors As Long
dwProcessorType As Long
dwAllocationGranularity As Long
wProcessorLevel As Integer
wProcessorRevision As Integer
End Type
'-------------------------------------------------------
'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
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+regiosize
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
Seul les admins et l'auteur du code lui même peuvent modifier ce code.