Obtenir les plages mémoire utilisées par un processus dans la mémoire virtuelle

Soyez le premier à donner votre avis sur cette source.

Vue 5 175 fois - Téléchargée 536 fois

Description

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, @+

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

violent_ken
Messages postés
1822
Date d'inscription
mardi 31 mai 2005
Statut
Membre
Dernière intervention
26 octobre 2010
-
Mayzz ==> Merci ^_-

MadM@tt ==> le projet arrivera... je sais pas quand ! J'ai pu pas mal avancer avec les vacances, mais la dure vie d'insalien va bientôt reprendre (sans compter IGC qui va me bouffer du temps...dammit) donc avancement du programme au point mort, ou presque ;)

Econs ==> Merci d'avoir confirmé ;) Et en effet, c'est souvent les petits bouts de code qui servent pour construire des trucs plus gros.

@+
econs
Messages postés
4066
Date d'inscription
mardi 13 mai 2003
Statut
Modérateur
Dernière intervention
23 décembre 2008
18 -
Les raisons que tu présentes sont tout à fait valables. Tant que les mini projets (avec mise en situation) peuvent être considérés comme des sources, c'est effectivement plus facile à retrouver dans le moteur de recherches.
Il faut savoir que pas mal de sources empruntent des briques à d'autres sources. Et généralement, les briques ont été trouvées dans des sources qui faisaient, à tout casser 20 lignes.
Autant être efficace. Ce code-ci serait passé inaperçu dans une source de 1000 lignes. Ca aurait été dommage.
MadM@tt
Messages postés
2215
Date d'inscription
mardi 11 novembre 2003
Statut
Membre
Dernière intervention
16 juillet 2009
-
Salut !

C'est le genre de truc que je fais souvent, et je crois que les admins aussi ^^
C'est vrai, on ne fais pas des bouts d'exemple de code à longueur de journée, et je pense que c'est une bonne démarche de présenter des bouts de code comme ça. ça évite de se taper que des projets finis, comme 150 mille calculatrice, ou listeurs de process.
Quand on cherche un bout de code, une fonction (et c'est souvent le cas sur ce site), on préfère tomber sur une source comme ça qu'un projet complet.

Je pense que c'est une bonne idée, mais je suis pas admin alors ... ^^

Et j'ai hate de voir le projet dont tu parles ;)
Mayzz
Messages postés
2859
Date d'inscription
mardi 15 avril 2003
Statut
Membre
Dernière intervention
26 novembre 2013
16 -
Non en fait moi je trouve ca bien, pour toutes les raison que tu a énumérés ci-dessus, pour ce qui est des admins... je me posais la question mais c'étais personnel maintenant si ce ne leurs pose pas de problèmes je pense juste que plus de monde devrait suivre ta méthode ^^

Bonne prog ++
violent_ken
Messages postés
1822
Date d'inscription
mardi 31 mai 2005
Statut
Membre
Dernière intervention
26 octobre 2010
-
Salut, bah, disons que par exemple, il aurait été difficile de trouver ce morceau de code en voyant une source intitulée "Editeur Hexadécimal".

Il y a des morceaux de mes codes qui peuvent être utiles hors du contexte de mon projet, et qui ne seront pas trouvables par le moteur de recherche quand je l'aurait posté (c'est le cas ici). Donc pour que ces bouts de code servent, je trouve qu'il est utile de les poster comme ceci.

Et je ne fait pas un vulgaire copier/coller, je fait aussi un exemple d'utilisation ;)
Et puis rechercher 80 lignes de code dans plus de 10000... faut en avoir envie !

Si les admins ont un problème avec çà, faut me le dire. Mais il faut savoir que je ne subdivise pas mon projet en multiples fragments, c'est seulement le deuxième source qui est tiré de mon projet ;) (et peut être le dernier ?)

@+ et merci pour le commentaire

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.