Seite 1 von 1

DMA Copy ?

Verfasst: 20.10.2007 22:59
von tft
Hallo,
Ich habe schon lang nicht mer mit der Windows API gearbeitet. Aber nichts desto trotz benötige ich einige hilfestellung für folgendes Problem.

Ich suche einen Weg wie ich Daten Blöcke mit hilfe der API von einem Virtuellen Adressraum zum anderen kopiren kann.

Der sinn dahinter ist. Das 2 Processe untereinander Daten austausch. Das ist in einem Multi Core / Multi Process System durch die Virtuelle Speicherverwaltung mit den standart API Funktionen nicht möglich.

Ich stelle mir vor das die Funktion so aussehen müste.

DMACopy(ProcessID1,Adresse,Länge,ProcessID2,Adresse)

Ich habe aber etwas vergleichbares bisher nicht gefunden. Im Moment mache ich das Kopiren über UDP. Das ist aber eigentlich zu langsam. Ausserdem sind die Möglichkeiten beschrängt.
Das Clipboard habe ich auch schon bemüht, sowie eine RamDisk. Aber das hilft alles nicht wirklich. Ich brauche erheblich mer Pervormance.

Fileicht gibt es ja Funktionen die einen solchen Datentransfher ermöglichen.


Danke TFT

Verfasst: 21.10.2007 09:40
von Rings
und täglich grüßt das Murmeltier...
in der PBOSL (findest du über purearea.net oderweiter unten)
gibt es eine Library wo genau das gemacht wird.
Und sogar der source gibts auch noch dazu.
Global Shared Memory

Re: DMA Copy ?

Verfasst: 21.10.2007 14:40
von Thorium
tft hat geschrieben: Der sinn dahinter ist. Das 2 Processe untereinander Daten austausch. Das ist in einem Multi Core / Multi Process System durch die Virtuelle Speicherverwaltung mit den standart API Funktionen nicht möglich.
Doch ist es. Musst halt 2 API-Funktionen verwenden: ReadProcessMemory und WriteProcessMemory für weitere Infos die MSDN befragen.

Verfasst: 23.10.2007 13:55
von tft
Hallo..

ReadProcessMemory scheint der richtige weg zu sein. Allerdings habe ich jetzt das problem an eine Gültige PID zu kommen.

Mit WH=FindWindow("","Name") hole ich den Handler des Fensters.
Mit PID=GetWindowThreadProcessID(WH,0) hole ich die Process ID
Mit PIDH=OpenProcess(($1F0FFF,0,PID) sollte ich eigentlich den Process öffnen können. Aber da kommt immer nur 0 bei raus.

Ich denke ich mache da etwas grundlegend falsch. Möchte noch anmerken das ich das nicht in PB machen möchte. Im prinzip solte es ja mit der API immer funktionieren.

Verfasst: 27.10.2007 17:26
von tft
Hi ...

für alle die es interesiert. Ich habe etwas grundlegendes falsch gemacht.
Die Funktion OpenProcess() erwartet die PID nicht als Wert sondern als Zeiger auf eine Speicheradresse. Das ergebniss ist dann der Handler auf den geöffneten Process.

Verfasst: 27.10.2007 17:29
von Thorium
tft hat geschrieben:Hi ...

für alle die es interesiert. Ich habe etwas grundlegendes falsch gemacht.
Die Funktion OpenProcess() erwartet die PID nicht als Wert sondern als Zeiger auf eine Speicheradresse. Das ergebniss ist dann der Handler auf den geöffneten Process.
Öhm, nein, eigentlich nicht.
Vieleicht irgendeine Eigenheit der Sprache in der du die API verwendest?

Verfasst: 27.10.2007 17:36
von edel
tft hat geschrieben:Hi ...

für alle die es interesiert. Ich habe etwas grundlegendes falsch gemacht.
Die Funktion OpenProcess() erwartet die PID nicht als Wert sondern als Zeiger auf eine Speicheradresse. Das ergebniss ist dann der Handler auf den geöffneten Process.
Wie Thorium bereits schrieb wird der Wert nicht als Zeiger uebergeben.
Wenn der OpenProcess null zurueck liefert, pruefe mit GetLastError.