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é: 3 273 / 432

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

Fichier Zip

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

Commentaires et avis

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 dans le forum

"mémoire virtuelle insuffisante" [ par LeoNoAiolia84 ] Salut,J'ai créé un programme avec un nombre assez important de tableaux et de variables, et lorsqu'il est executé plusieur fois de suite je reçois le propriétés [ par MatthieuFourcade ] Bonjour, je suis en train de faire un logiciel. Mais j'ai juste une petite question. Dans mon logiciel il y a pas mal d'option. Et je voudrais les gar Process thread mémory... [ par nicolas12 ] bonjour a vousje cherche à lire et a stoquer sous forme de fichier toutes les plages mémoires qu'une application utilise, et a modifier automatiquemen MSFlexgrid en mémoire... [ par binette1er ] Bonjour, j'ai besoin de garder en mémoire temporaire un MSFlexgrid avec des données stoquées dedans; je voudrais pouvoir le visualiser par après...pou selection dans excel et envoie par mail [ par vbdebut ] Bonjour à tous,J'aurai besoin d'un tuyau. Je voudrai séléctionner une plage de cellule dans une feuille excel et pouvoir l'envoyer par e-mail. Cela pe Infos Mémoire [ par crenaud76 ] Salut à tous !!Je recherche une fonction (ca sent l'API) permettant d'obtenir des infos sur la mémoire :Mémoire physique et virtuelle, taille totale, Mémoire vidéo? [ par nicko33 ] Bonsoir à tousj'aurai aimé savoir si c'était possible d'augmenter la mémoire vidéo partagée de mon ordinateur portable. C'est un compaq pressario muni modifier un fichier en mémoire vive [ par flippouille ] Comment puis-je mémoriser tous les octets d'un fichier en mémoire vive afin de faire un traitement dessusActuellement, j'ouvre un fichier sur le disue selectionner une plage [ par isamancal ] Comment faire pour a partir de la commande "Range("A1").End(xlDown).Offset(1, 0).Select" pour selectionner toutes les cellules au dessus de la premi Memoire virtuelle insuffisante sur impression [ par Como ] Bonjour,J'imprime une feuille contenant un MSHFlexgrid à l'aide de la commande Me.printForm. Mon document fait environ 48 Mo dans ma fil d'impression


Nos sponsors

Sondage...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Téléchargements

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

Comparez les prix Nouvelle version

Photothèque Nouveau !



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,530 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.