begin process at 2008 08 22 01:14:35
1 229 731 membres
3 nouveaux aujourd'hui
14 267 membres club

Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum.
Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

OBTENIR LES PLAGES MÉMOIRE UTILISÉES PAR UN PROCESSUS DANS LA MÉMOIRE VIRTUELLE


Information sur la source

Catégorie :Système Classé sous : virtualqueryex, mémoire, virtuelle, plage, region Niveau : Initié Date de création : 03/11/2006 Vu / téléchargé: 2 802 / 416

Note :
10 / 10 - par 3 personnes
10,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

Commentaire sur cette source (8)
Ajouter un commentaire et/ou une note


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

  • '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
'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, @+
Pour les "Membres Club", vous pouvez télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip

  • signaler à un administrateur
    Commentaire de Le cancre le 03/11/2006 12:06:11

    merci pour cette source ^^

  • signaler à un administrateur
    Commentaire de violent_ken le 03/11/2006 12:08:51

    De rien ;)

    J'ai pensé que donner quelques morceaux de mon projet avant le projet lui même (cf FileView) pourrait être utile, content que çà te serve ^^


    @+

  • signaler à un administrateur
    Commentaire de Mayzz le 03/11/2006 13:41:58

    violent_ken c'est pas mal ça de décomposer un prj en cours de construction pour en présenter le code. Ca permet de ne pas avoir à chercher dans une source, c'est mieux je trouve. De plus quand tu présenteras ta source complète on aura déja vu une partie dc pr la commenté ce sera plus simple =) Gare à ta note loool.

    Reste juste à savoir ce qu'en pense les admins...

  • signaler à un administrateur
    Commentaire de violent_ken le 03/11/2006 13:51:38

    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

  • signaler à un administrateur
    Commentaire de Mayzz le 03/11/2006 16:34:14

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

  • signaler à un administrateur
    Commentaire de MadM@tt le 03/11/2006 20:19:18

    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 ;)

  • signaler à un administrateur
    Commentaire de econs le 03/11/2006 21:10:16 administrateur CS

    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.

  • signaler à un administrateur
    Commentaire de violent_ken le 03/11/2006 21:22:46

    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.

    @+

Ajouter un commentaire

Discussions en rapport avec ce code source

Pub



Appels d'offres

CalendriCode

Août 2008
LMMJVSD
    123
45678910
11121314151617
18192021222324
25262728293031

Téléchargements

Logiciels à télécharger sur le même thème :

Boutique

Boutique de goodies CodeS-SourceS