Brauche Hilfe beim Übersetzen von drei Zeilen C Code

Anfängerfragen zum Programmieren mit PureBasic.
Glow
Beiträge: 45
Registriert: 31.01.2005 01:36

Brauche Hilfe beim Übersetzen von drei Zeilen C Code

Beitrag von Glow »

Hi

Also, ich versuche gerade mal Spasseshalber ein bissel alten C Code in PB zu porten. Allerdings will das ganze nicht so wie ich :P
Die Hauptprobleme sind folgende. Das ganze zeigt jetzt einfach mal den C Code.

Code: Alles auswählen

DWORD	MyVar[8];

ReadProcessMemory (MyPID, (VOID *)0x00000000, MyVar, sizeof(MyVar), &read);
	if (read != sizeof(MyVar))
	{
		puts ("Konnte Speicherwert nicht lesen :(");
		return;
	}

printf ("Speicherwert ist: %d\n", MyVar[6]);
Ich komme echt nicht drauf, wie das ganze in PB funktionieren könnte ?
Bei mir klappt das jedenfalls kein Stück. Jemand eine Idee ? :)

Gruß
Glow
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Beitrag von edel »

Was geht nicht ? Den Ausschnitt zu uebersetzen bringt eh nichts, da die haelfte fehlt.
Glow
Beiträge: 45
Registriert: 31.01.2005 01:36

Beitrag von Glow »

Hi

Mir geht es dabei rein um die Schreibweisse in PB.
Z.B:

Code: Alles auswählen

DWORD   MyVar[8];
wäre das gleichzusetzen mit

Code: Alles auswählen

Dim MyVar.l(8) ?
Oder wie schaffe ich es, das Array in PB so aufzubauen, daß es

a) über ReadProcessMemory_ durchgehend gefüllt wird, und
b) trotzdem in 4byte Blöcken über das Arrayitem angesprochen werden kann ? Also wenn ich z.B folgende Definition habe:

DWORD MyVar[2] // 3 Items passen ins Array von 0-2, jeweils 4 Byte
Über ReadProcessMemory wird es nun gefüllt mit z.B

0 = 0A0A0A0A
1 = 0B0B0B0B
2 = 0C0C0C0C

damit ich dann später über MyVar(1) 0B0B0B0B erhalte ? Ich bekomme das mit Dim irgendwie nicht hin :/
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Beitrag von edel »

Sollte so gehen , weiss nur nicht was es an der Adresse 0 zum lesen
geben sollte. Falls es Fehler geben sollte lass dir den Wert von
GetlastError_() ausgeben
Glow
Beiträge: 45
Registriert: 31.01.2005 01:36

Beitrag von Glow »

Also bei mir sieht das jetzt so aus:

Code: Alles auswählen

Dim MyVar1.l(0)
Dim MyVar2.l(8)
dim MyVar3.l(14)

ReadProcessMemory_(pID, $1AB2101, @MyVar1, SizeOf(MyVar1), @TmpBuf)
ReadProcessMemory_(pID, MyVar1, @MyVar2, SizeOf(MyVar2), @TmpBuf)

ReadProcessMemory_(pID, MyVar2(4), @MyVar3, SizeOf(MyVar3), @TmpBuf)
Es erfolgt eine überprüfung of TmpBuf & Sizeof(MyVar3) gleich sind. Da schlägt es momentan fehl. Der ausgegebene Fehler lautet:
Nur ein Teil der ReadProcessMemory- oder WriteProcessMemory-Anforderung wurde abgeschlossen.

Ich kapier das nicht, der C-Code funktioniert einwandfrei :/
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Beitrag von edel »

Die Adresse eines Arrays bekommst du durch MyVar1() .
pID sollte ein Handle sein , das man z.b. von OpenProcess_([...])
bekommt. Der 2. Wert muss eine Adresse auf einen Speicherbereich
sein.

Code: Alles auswählen

Dim MyVar(7)

adresse   = 0 ; hier die adresse angeben 
nread     = 0
MyPID     = GetCurrentProcessId_()
hProcess  = OpenProcess_(#PROCESS_VM_READ,0,MyPID)
If Not ReadProcessMemory_(hProcess, adresse , MyVar(), 8*4, @nread) = 0
  Debug nread
EndIf
Glow
Beiträge: 45
Registriert: 31.01.2005 01:36

Beitrag von Glow »

Hi

Der Aufbau von ReadProcessMemory war mir schon klar, nur nicht wie ich die Arrays innerhalb nutzen muss. Dein Code hat mir trotzdem geholfen, da er das fehlende Puzzleteil enthalten hat:

MyVar()

Ich hatte innerhalb der API @MyVar geschrieben, und deshalb hat es nicht funktioniert. Jetzt klappt alles so wie es soll :D Der Punkt war ja, dass innerhalb der vorhergehenden Arrays weitere Speicheradressen "versteckt waren" die ich nach und nach auslesen musste.
Vielen Dank nochmal für deine Mühe.

Gruß
Glow
Antworten