In erster Linie, lassen Sie mich sagen, dass in modernen Betriebssystemen die Adresswerte, die Ihr Programm sieht (wie 0x00402000) nicht physikalische Adressen sind. Sie sind virtuelle Adressen, sie sind privat für den besitzenden Prozess (dh sie machen in anderen Prozessen keinen Sinn oder meinen etwas anderes) und werden über einen CPU-basierten Mechanismus ("die Paging-Einheit"), den nur OS hat, physischen Adressen zugeordnet Kontrolle über.
Wenn Sie eine Variable zwischen verschiedenen Prozessen teilen möchten, gibt es einen Mechanismus namens Shared Memory. Lesen Sie darüber nach. Die relevanten APIs sind CreateFileMapping
mit dem ersten Parameter INVALID_HANDLE_VALUE
, MapViewOfFile
, OpenFileMapping
. Es gibt auch andere Möglichkeiten der Interprozesskommunikation.
Wenn Sie die explizite Zusammenarbeit des Prozesses 'Speicher ohne diesen Prozess' lesen möchten, müssen Sie die Debugging-API lesen. Dies ist eine viel schwierigere Aufgabe als die Verwendung von gemeinsam genutztem Speicher.
Was Sie übrigens codiert haben, ist ein klassisches undefiniertes Verhalten.
Kein modernes Multitasking-Betriebssystem ermöglicht Ihnen den Zugriff auf Speicher von anderen Prozessen. Vielleicht möchten Sie jedoch über [shared memory] (http://en.wikipedia.org/wiki/Shared_memory) lesen. Ein Grund, warum Sie keinen anderen Prozessspeicher verwenden können, ist einfach, weil beide Prozesse ihre eigene Speicherzuordnung haben, und es ist sowieso alles [virtueller Speicher] (http://en.wikipedia.org/wiki/Virtual_memory). Wenn Sie dem zweiten Programm eine globale Variable hinzugefügt und seine Adresse ausgedruckt haben, ist möglicherweise sogar dieselbe Adresse wie beim ersten Prozess vorhanden. –
Das stimmt nicht. Kernel-Module haben Kernel-Privilegien – Magn3s1um
@ Joachim: sagen, dass ReadProcessMemory API. Klar, wie würdest du sonst noch debuggen? Es ist nur eine privilegierte Operation. –