Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Constante als Paramter übergabe (https://www.delphipraxis.net/125036-constante-als-paramter-uebergabe.html)

gizzy 29. Nov 2008 16:35


Constante als Paramter übergabe
 
Hi Leute,

bin mal total verpeilt, aber ich bin mir sicher das ich das so nicht machen darf. Habt ihr ein Vorschlag folgendes zu Lösen (Nicht Dynmaisches Array Lösung :P).


Delphi-Quellcode:
function sr_wchar_z(pid: Integer; offset: DWord; const count: Integer): PChar; stdcall;
var
  HandleWindow, Buffer        : Cardinal;
  cleak                       : Array [0..count] of Char;
  leak                        : String;
  i                           : Byte;
begin
{Start}
  leak:= '';
{RM ~}
  HandleWindow := OpenProcess(PROCESS_VM_READ,False,pid);
  ReadProcessMemory(HandleWindow, Pointer(offset),@cleak, Sizeof(cleak), Buffer);
{CR ~}
  for i := 0 to count do
      leak:=leak+cleak[i];
  result:= Pchar(leak);
{End}
end;

Noedel 29. Nov 2008 16:39

Re: Constante als Paramter übergabe
 
du hast count nicht definiert?!

welche fehlermeldung bekommst du denn

Dax 29. Nov 2008 16:42

Re: Constante als Paramter übergabe
 
Das geht gar nicht. "const count" besagt nur, dass der Wert innerhalb der Prozedur nicht verändert werden darf - aber das ist keinesfalls eine Konstante. Wo wäre auch der Sinn darin, eine Konstante als Parameter zu benutzen?

gizzy 29. Nov 2008 16:42

Re: Constante als Paramter übergabe
 
Um die Länge meines Static-Arrays festzulegen.

mkinzler 29. Nov 2008 16:43

Re: Constante als Paramter übergabe
 
Zitat:

du hast count nicht definiert?!
Doch ist ein Parameter
Dieser ist aber keine Konstante, sondern ein konstanter ( nicht veränderbarer) Parameter
Ein dynamischer Array wäre ein optimale Lösung, warum willst du das nicht?
Sonst könntest du auch eine Liste verwenden

Dax 29. Nov 2008 16:46

Re: Constante als Paramter übergabe
 
Zitat:

Zitat von gizzy
Um die Länge meines Static-Arrays festzulegen.

Das geht aber nur mit Konstanten, nicht mit "änder mich bitte bitte nicht"-Parametern.

Zitat:

Zitat von mkinzler
Sonst könntest du auch eine Liste verwenden

Das könnte schwer werden, wenn er einen Puffer für eine API-Funktion haben will ;)

PS: du leakst Handles, dein Zusammenbau ist unnötig langsam und kompliziert (string SetLength, und dann das als Puffer verwenden wäre viel schöner), und deine Schleife ist eine Katastrophe, die nur auf den richtigen Moment wartet.. Denke count = 257 ;)

gizzy 29. Nov 2008 16:50

Re: Constante als Paramter übergabe
 
Zitat:

Zitat von mkinzler
Zitat:

du hast count nicht definiert?!
Doch ist ein Parameter
Dieser ist aber keine Konstante, sondern ein konstanter ( nicht veränderbarer) Parameter
Ein dynamischer Array wäre ein optimale Lösung, warum willst du das nicht?
Sonst könntest du auch eine Liste verwenden

Okáy, ich glaub ich sollte die DH nicht nur überfliegen, du hast Recht.

Weil ich mir nicht sicher war ob ReadProcessMemory das Variable genauso behandelt wie ein Dynamisches.
Ich hab es jetzt so gemacht:

Delphi-Quellcode:
function sr_wchar_z(pid: Integer; offset: DWord; count: SmallInt): PChar; stdcall;
var
  HandleWindow, Buffer        : Cardinal;
  cleak                       : Array of Char;
  leak                        : String;
  i                           : Byte;
begin
{Start}
  SetLength(cleak, count);
  leak:= '';
{RM ~}
  HandleWindow := OpenProcess(PROCESS_VM_READ,False,pid);
  ReadProcessMemory(HandleWindow, Pointer(offset),@cleak, Sizeof(cleak), Buffer);
{CR ~}
  for i := 0 to count do
      leak:=leak+cleak[i];
  result:= Pchar(leak);
{End}
end;

DeddyH 29. Nov 2008 16:51

Re: Constante als Paramter übergabe
 
Zitat:

Delphi-Quellcode:
for i := 0 to count do
      leak:=leak+cleak[i];

Sicher, dass das so richtig ist?

[edit] Das müsste doch auch so funktionieren:
Delphi-Quellcode:
function sr_wchar_z(pid: Integer; offset: DWord; count: Cardinal): PChar; stdcall;
var
  HandleWindow, Buffer, deg   : Cardinal;
//  cleak                       : Array of Char;
  leak                        : String;
  i                           : Byte;
begin
{Start}
  SetLength(leak, count);
//  leak:= '';
{RM ~}
  HandleWindow := OpenProcess(PROCESS_VM_READ,False,pid);
  ReadProcessMemory(HandleWindow, Pointer(offset),@leak[1], Length(leak), Buffer);
{CR ~}
{  for i := 0 to count do
      leak:=leak+cleak[i];}
  result:= Pchar(leak);
{End}
end;
[/edit]

gizzy 29. Nov 2008 16:53

Re: Constante als Paramter übergabe
 
Mit dem Dynamischen Array hauts mir ne Zugriffsverletzung um die Ohren :/

http://download.eyecook.net/zugriffsv.jpg

//Ich lass das erstmal für heute :/

Hawkeye219 29. Nov 2008 18:46

Re: Constante als Paramter übergabe
 
Hallo,

eine Funktion sollte niemals die Adresse einer lokalen Variablen (in diesem Fall leak) zurückgeben. Es wäre besser, den Puffer vom Aufrufer bereitstellen zu lassen.

Gruß Hawkeye


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:16 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz