Autor Beitrag
tmtmtm
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 22



BeitragVerfasst: Mi 03.07.02 15:56 
Hallo Leudez!

Wollte mal fragen, wie man am besten direkt Daten aus dem Arbeitsspeicher lesen kann.

Ich versuche es derzeit mit folgender Methode:

ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
Const MaxWord=65536;
           Buffer=512;

Type 
  TBytes=Array[0..Buffer] of Byte;
  PBytes=^TBytes;
end;

Var B:Byte;

Procedure SetPBytes(Var P:PBytes;Seg,Offs:Word);
Begin
  IF Offs>(MaxWord Div Buffer)-1 Then Offs:=(MaxWord Div Buffer)-1;
  P:=Ptr(Seg*MaxWord+Offs*Buffer); // Setzt Anfangs-Adresse des 
//Arrays auf den gewünschten Ort 
 //im RAM
End;


Die Adressierung im RAM über die Prozedur SetPBytes funktioniert schon ordentlich. Nur wenn ich jedoch auf das gesetzte Array zugreifen (lesen, z.B. B:=P[2]) möchte, erhalte ich für viele Speicherbereiche eine EAccessViolation-Exception und bekomme keine Daten von der Stelle. :? Wie kann ich diese Bereiche trotzdem relativ schnell auslesen? (Wie ich die Exception abfange weiß ich.)

MfG Thomas

Code-Tag hinzugefügt. Marc
Pit
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 160



BeitragVerfasst: Mi 03.07.02 18:36 
tmtmtm hat folgendes geschrieben:
Wollte mal fragen, wie man am besten direkt Daten aus dem Arbeitsspeicher lesen kann.

Erzähle mal genau, was du machen möchtest.

Zitat:
Ich versuche es derzeit mit folgender Methode:

Das was du dort geschrieben hast, taugt ausschließlich um aufzuzeigen, daß du nicht weißt, was du machst. Du würfelst da irgendwelche Dinge zusammen, so gibt es z.B. bei 32 Bit gar keine Segmente mehr. Und so, wie du es da versuchst, haben Segmente noch nie funktioniert, jedenfalls bei keinem mir bekannten Prozessor.

Hinzu kommt, daß in einem Multitasking-Betriebssystem Anwendungen in unterschiedlichen Umgebungen laufen, das bedeutet, daß jede Anwendung seinen eigenen virtuellen Speicher hat.

MfG Pit.
tmtmtm Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 22



BeitragVerfasst: Mi 03.07.02 18:54 
Hallo Pit,

danke erst mal für deine Antwort.
Das war der Ansatz, den ich von meiner DOS-Programmierung her in Windows-Delphi 5 integrieren wollte.
Mir war klar, daß sich da ein kleiner Unterschied zwischen DOS- & Windows- Speicherverwaltung ergeben würde.
Also wie ist denn nun der Windows-Speicher aufgebaut?
Kann mann da wirklich nur 4 GB RAM adressieren???
Wie lese ich den gesamten Arbeitsspeicher aus??????
Wenn nicht, wie im DOS mit Zeigern? Wie dann???
Wenn du oder jemand anderes noch einen diesbezüglichen Tip für mich habt, dann her damit.
Im DOS klappt's nämlich schon. (Zumindest im Assembler.)
Jedoch habe ich vom Delphi-Windows-ASM NullKommaNull Ahnung.

Also auf bald,

Thomas :wink:
tmtmtm Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 22



BeitragVerfasst: Mi 03.07.02 18:57 
Ach ja, ich möchte unbedingt den physischen Arbeitsspeicher ohne irgendwelche Hindernisse auf gesperrte oder anderweitig reservierte Bereiche auslesen. D.h. nicht nur zu irgendeinem bestimmten Programm.
Aber zur Zeit weiß ich nicht mal direkt, wie der Speicher unter Windows organisiert ist. Wäre toll, wenn da jemand was wüßte.

Gruß T.M.
Pit
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 160



BeitragVerfasst: Do 04.07.02 14:06 
tmtmtm hat folgendes geschrieben:
Mir war klar, daß sich da ein kleiner Unterschied zwischen DOS- & Windows- Speicherverwaltung ergeben würde.

Das hat nichts mit DOS / Windows zu tun, sondern mit 16 / 32 Bit und mit RealMode / Protected Mode.

Zitat:
Also wie ist denn nun der Windows-Speicher aufgebaut?

Bei 32 Bit ist die virtuelle Adressierung linear. Die Adressbreite ist 32 Bit.

Zitat:
Kann mann da wirklich nur 4 GB RAM adressieren???

Was heißt hier nur?

Zitat:
Wie lese ich den gesamten Arbeitsspeicher aus??????

Gar nicht, der Speicher ist virtuell. Wenn du Speicher benötigst, dann sagst du der Speicherverwaltung, wieviel du gerne hättest und sofern vorhanden bekommst du dann einen bestimmten Bereich zugewiesen. Wo der physisch liegt, ist dabei völlig egal, wenn er gerade nicht gebraucht wird, liegt er bei Überbedarf an Speicher auch gerne mal auf der Festplatte rum.

Zitat:
Wenn nicht, wie im DOS mit Zeigern? Wie dann???

Die Zeiger arbeiten nicht mehr mit Segment und Offset, sondern linear. Allerdings nur virtuell, physisch gibt es dann wieder eine Unterteilung in Seiten.


tmtmtm hat folgendes geschrieben:
Ach ja, ich möchte unbedingt den physischen Arbeitsspeicher ohne irgendwelche Hindernisse auf gesperrte oder anderweitig reservierte Bereiche auslesen.

Kurz und schmerzlos: Vergiß es. Um das hinzubekommen, mußt du dich nicht nur mit dem Betriebssystem anlegen, sondern auch noch mit der CPU.

Die Frage ist, wozu du das überhaupt willst. Mit den Inhalten kannst du ohnehin nichts anfangen und nutzen kannst du auch nichts ohne dabei kleineren oder sogar gewaltigen Schaden anzurichten. Letzteres geht bis hin zum kompletten Verlust sämtlicher Daten auf dem Rechner.

MfG Pit.
Tino
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Veteran
Beiträge: 9839
Erhaltene Danke: 45

Windows 8.1
Delphi XE4
BeitragVerfasst: Fr 05.07.02 08:31 
Hier gehts weiter...
Dieses Thema ist gesperrt, Du kannst keine Beiträge editieren oder beantworten.

Das Thema wurde von einem Team-Mitglied geschlossen. Wenn du mit der Schließung des Themas nicht einverstanden bist, kontaktiere bitte das Team.