IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Threads & Processus C++ Discussion :

la zone memoire d'un processus : debut fin


Sujet :

Threads & Processus C++

Vue hybride

ilimo la zone memoire d'un... 24/06/2007, 20h48
Aurelien.Regat-Barrel comment ? C'est spécifique... 25/06/2007, 08h29
ilimo void Process_Adress_Debut()... 25/06/2007, 10h34
Aurelien.Regat-Barrel Si tu effectues plusieurs... 25/06/2007, 12h19
Médinoc Euh, au sujet des... 25/06/2007, 22h44
Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    84
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 84
    Par défaut la zone memoire d'un processus : debut fin
    bonjour
    je sais comment trouver "l'adresse memoire" de "debut" de la "zone memoire" d'un processus.

    comment je pourrai trouvez l'adresse memoire de sa fin ?

    merci pour votre aide

  2. #2
    Expert confirmé

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 756
    Billets dans le blog
    3
    Par défaut
    Citation Envoyé par ilimo
    je sais comment trouver "l'adresse memoire" de "debut" de la "zone memoire" d'un processus.
    comment ?

    C'est spécifique a chaque OS. Y'a pas vraiment de fin dans la mesure ou il y a des "trous", et que des dlls systemes sont mappés dans l'espace mémoire de ton process, que y'a des parties en lecture seule, etc... Et que surtout ca évolue constament.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    84
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 84
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
     
    void Process_Adress_Debut()
    {
    hProcess_Open = OpenProcess(PROCESS_ALL_ACCESS, FALSE, proc_id_);
    hModuleSnap = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, proc_id_); 
    if (hModuleSnap == INVALID_HANDLE_VALUE)
    {
    printf("snapshot impossible");
    }
     
    me32.dwSize = sizeof(MODULEENTRY32);
     
    Module32First( hModuleSnap, &me32 );
    do 
    { 
    Module32Next( hModuleSnap, &me32 );
    if(StrCmp(me32.szModule, "MyProcess.dll")== 0)
    { 
    printf( "\n dll name : %s", me32.szModule ); 
    printf( "\n base address = 0x%08X", (DWORD) me32.modBaseAddr );
    MyProcess_BaseAdr = (DWORD) me32.modBaseAddr;
    }
    } 
    while( StrCmp(me32.szModule, "MyProcess.dll")!= 0); 
     
    CloseHandle(hModuleSnap);
    }
    _____________________________________________________________
    que surtout ca évolue constament
    Chaque donnée stockée en mémoire principale (variable, fonction) a un emplacement unique, ceci lors de la meme execution( lors d'une autre, ça change)

    L'allocation dynamique de mémoire permet la réservation d'un espace mémoire

    Effectuer une allocation dynamique de mémoire, c'est demander au système de vous réserver un bloc de mémoire, que vous pourrez utiliser à votre convenance
    _____________________________________________________________

    ainsi, à chaque nouvelle execution de Myprocess.dll, je calcule l'adresse de base.
    de cette manière toutes les données manipulées par Myprocess.dll
    sont stockées dans des adresses mémomoires à partir de l'adresse memoire de base.
    on peut ignorer tout ce qui est avant cette adresse base.

    mais ce processus jusqu'à quelle adresse prend de l'espace ??

  4. #4
    Expert confirmé

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 756
    Billets dans le blog
    3
    Par défaut
    Si tu effectues plusieurs alloc, tu as donc plusieurs blocs mémoire réservés par le systeme... et des "trous" = fragmentation. Et un bloc alloué se libere... donc ca évolue a chaque allocation / libération, c.a.d constament. Fait une petite recherche sur le working set size sous Windows, et tu vas mieux comprendre. Exemple simple:
    Lance une appli, regarde sa consommation mémoire dans le gestionnaire des taches (Le "Mem Usage", = working set size). Minimise l'application et observe comment ca évolue... Et l'appli n'y est pour rien, c'est Windows qui gere l'espace mémoire du process, en fonction des dlls mappées etc...

    Sinon, ton code et ta question sont spécifiques Windows. Tout ton code de Process_Adress_Debut() ne sert a rien vu que Windows te donnes cette "adresse de début" en 1er parametre de DllMain.
    Et un simple GetModuleHandle("MyProcess.dll") ferait la meme chose.

    ainsi, à chaque nouvelle execution de Myprocess.dll, je calcule l'adresse de base.
    de cette manière toutes les données manipulées par Myprocess.dll
    sont stockées dans des adresses mémomoires à partir de l'adresse memoire de base.
    on peut ignorer tout ce qui est avant cette adresse base.
    Tu mélanges dll et process. L'adresse recue / renvoyée par ta fonction n'est pas l'adresse "de début" du process, mais l'adresse a laquelle est mappée ta dll.

    Il y a de tres fortes chances que ta dll alloue de la mémoire avant cette adresse. Fais juste un test, pour voir, sur l'adresse renvoyée par new. Car l'adresse du tas est tres certainement située avant celle de ta dll. Pire, ta dll peut utiliser la meme CRT que l'exe, ce qui a pour consequence que ta dll utilise la meme memoire que l'exe.
    mais ce processus jusqu'à quelle adresse prend de l'espace ??
    Il ne prend pas un gros bloc contiguë, mais plein de blocs plus ou moins gros, avec des "trous" entre-eux.

    La grande question est : qu'essayes-tu de faire ? Pourquoi as-tu besoin de cette info ?

  5. #5
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 393
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 393
    Par défaut
    Euh, au sujet des GetModuleHandle()...
    Je ne voudrais pas paraître défaitiste, mais d'après la structure MODULEENTRY32, handle de module et adresse de base sont deux choses différentes...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  6. #6
    Expert confirmé

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 756
    Billets dans le blog
    3
    Par défaut
    Et poutant... Le HMODULE est un reliquat de Win16, ca n'a plus de sens de nos jours. Code modifié:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
     
    #include <windows.h>
    #include <Tlhelp32.h>
    #include <stdio.h>
     
    void Process_Adress_Debut()
    {
      DWORD proc_id_ = GetCurrentProcessId();
      HANDLE hProcess_Open = OpenProcess(PROCESS_ALL_ACCESS, FALSE, proc_id_);
      HANDLE hModuleSnap = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, proc_id_); 
      if (hModuleSnap == INVALID_HANDLE_VALUE)
      {
        printf("snapshot impossible");
      }
     
      MODULEENTRY32 me32 = {0};
      me32.dwSize = sizeof(MODULEENTRY32);
     
      Module32First( hModuleSnap, &me32 );
      do 
      { 
        Module32Next( hModuleSnap, &me32 );
        if(strcmp(me32.szModule, "kernel32.dll")== 0)
        { 
          printf( "\n dll name : %s", me32.szModule ); 
          printf( "\n base address = 0x%08X", (DWORD) me32.modBaseAddr );
          printf( "\n hModule = 0x%08X", (DWORD) me32.hModule );
        }
      } 
      while( strcmp(me32.szModule, "kernel32.dll")!= 0); 
     
      CloseHandle(hModuleSnap);
    }
     
    int main()
    {
        Process_Adress_Debut();
        printf( "\n GetModuleHandle(kernel32) = 0x%08X",
          GetModuleHandle( "kernel32.dll" ) );
    }
    résultat:

    dll name : kernel32.dll
    base address = 0x7C800000
    hModule = 0x7C800000
    GetModuleHandle(kernel32) = 0x7C800000

Discussions similaires

  1. Zone de selection avec date debut et date fin
    Par lanaine07 dans le forum IHM
    Réponses: 1
    Dernier message: 25/05/2011, 08h50
  2. [C# debutant ] zone memoire toujours valide ?
    Par elmcherqui dans le forum C#
    Réponses: 6
    Dernier message: 03/02/2010, 23h11
  3. Representation hexadecimal d'une zone memoire.
    Par etranger dans le forum C++
    Réponses: 6
    Dernier message: 13/03/2007, 14h26
  4. partage memoire entre 2 processus
    Par gudul dans le forum Delphi
    Réponses: 1
    Dernier message: 12/09/2006, 13h43
  5. Rendre une zone memoire accessible a un autre processus
    Par Jack_serious dans le forum POSIX
    Réponses: 12
    Dernier message: 07/12/2005, 21h23

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo