ReadProcessMemory
- 
					
					
					
					
 Ich möchte mit ReadProcessMemory den gesamten Speicher eines anderen Programms auslesen. Die Frage ist, wie ich an gültige Start-Adressen komme. Mein bisheriger Ansatz war, jeweils im Abstand von 1024 Byte alle Adressen abzufragen. Dabei würde ich aber Speicher, der nicht an einer 1024-Grenze aligniert ist, übersehen. Wie komme ich an die Startadressen der allokierten Adressbereiche? 
 
- 
					
					
					
					
 Mit VirtualQueryEx kriegst du die gültigen Blöcke raus. 
 
- 
					
					
					
					
 Ich hab folgendes versucht: MEMORY_BASIC_INFORMATION meminfo[1000]; size_t written = VirtualQueryEx(hproc, 0, meminfo, sizeof(meminfo)); written /= sizeof(MEMORY_BASIC_INFORMATION); for (size_t i = 0; i < written; i++) { std::cout << i << ":" << std::endl; std::cout << meminfo[i].AllocationBase << std::endl; std::cout << meminfo[i].BaseAddress << std::endl; std::cout << meminfo[i].RegionSize << std::endl; }Aber es kommt nur ein Block raus: 0: 0 0 65536Das kann nicht sein, das Programm, das ich auslese, verbraucht gut 200 MB. Wenn ich die Funktion richtig verstanden hab, sollte sie mir beginnend an Adresse 0 alle Blöcke liefern (sofern es nicht mehr als 1000 sind). 
 
- 
					
					
					
					
 Dein Code ist ja auch irgendwie komisch  Warum legst du ein Array mit 1000 MEMORY_BASIC_INFORMATIONs an? Du kriegst die Daten wahrscheinlich blockweise. Musst also in einer Schleife die Startadresse, die du VirtualQueryEx reingibst erhöhen. Such mal nach Beispielen, gibt bestimmt welche. Warum legst du ein Array mit 1000 MEMORY_BASIC_INFORMATIONs an? Du kriegst die Daten wahrscheinlich blockweise. Musst also in einer Schleife die Startadresse, die du VirtualQueryEx reingibst erhöhen. Such mal nach Beispielen, gibt bestimmt welche.
 
- 
					
					
					
					
 Achso, dann habe ich die Parameter falsch verstanden. Was ist denn dann überhaupt der Sinn des letzten Parameters? Die Größe von MEMORY_BASIC_INFORMATION ist doch konstant. Welchen Sinn macht es dann, etwas anderes als sizeof(MEMORY_BASIC_INFORMATION) anzugeben? Wer hat sich diese API ausgedacht? Oder hab ich immer noch etwas falsch verstanden? ok, es geht jetzt, danke für eure Hilfe. 
 
- 
					
					
					
					
 Ramanujan schrieb: Achso, dann habe ich die Parameter falsch verstanden. Was ist denn dann überhaupt der Sinn des letzten Parameters? Die Größe von MEMORY_BASIC_INFORMATION ist doch konstant. Es gibt auch MEMORY_BASIC_INFORMATION32undMEMORY_BASIC_INFORMATION64...
 
- 
					
					
					
					
 Swordfish schrieb: Ramanujan schrieb: Achso, dann habe ich die Parameter falsch verstanden. Was ist denn dann überhaupt der Sinn des letzten Parameters? Die Größe von MEMORY_BASIC_INFORMATION ist doch konstant. Es gibt auch MEMORY_BASIC_INFORMATION32undMEMORY_BASIC_INFORMATION64...Und die nächste Windows-Version benutzt evtl. einen neuen weiteren Parameter... 
 
 
			
			
		