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
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
comment ?Envoyé par ilimo
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.
_____________________________________________________________
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); }
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)que surtout ca évolue constament
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 ??
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.
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.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.
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.
Il ne prend pas un gros bloc contiguë, mais plein de blocs plus ou moins gros, avec des "trous" entre-eux.mais ce processus jusqu'à quelle adresse prend de l'espace ??
La grande question est : qu'essayes-tu de faire ? Pourquoi as-tu besoin de cette info ?
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.
Et poutant... Le HMODULE est un reliquat de Win16, ca n'a plus de sens de nos jours. Code modifié:
résultat:
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" ) ); }
dll name : kernel32.dll
base address = 0x7C800000
hModule = 0x7C800000
GetModuleHandle(kernel32) = 0x7C800000
Partager