AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Wie baut man sowas wie writeln/sprintf selbst ?
Thema durchsuchen
Ansicht
Themen-Optionen

Wie baut man sowas wie writeln/sprintf selbst ?

Ein Thema von flash2009 · begonnen am 25. Dez 2008 · letzter Beitrag vom 27. Dez 2008
Antwort Antwort
Seite 2 von 3     12 3      
flash2009

Registriert seit: 15. Dez 2008
11 Beiträge
 
#11

Re: Wie baut man sowas wie writeln/sprintf selbst ?

  Alt 25. Dez 2008, 20:24
Hey cool was ihr mir alles dazu schreibt,
boah wie blöd ich mir immer vorkomme wenn ich sowas lese ^^ .
Ich glaub ich mach das mit nen DWord Array dann hab ich die meisten Dinge abgedeckt und an PChar Parameter komm ich dann wenn ich das DWord als Pointer übergebe, aber am im grunde will ich die Parameter nur weiterschleifen und den format teil (dieser PChar mit den Platzhaltern (%d) ) auslesen.


gruß flash
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#12

Re: Wie baut man sowas wie writeln/sprintf selbst ?

  Alt 25. Dez 2008, 21:02
Was willst Du überhaupt anstellen?
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
flash2009

Registriert seit: 15. Dez 2008
11 Beiträge
 
#13

Re: Wie baut man sowas wie writeln/sprintf selbst ?

  Alt 25. Dez 2008, 21:46
ich will die original funktion sprinft, austauschen nur müssen halt die paremeter wieder vom stack
ich seh grad das es wohl in cdecl gemacht ist und nicht stdcall muss ich mal bischen nachforschen

edit: ok ich seh grad das ding ist cdecl das heißt ich muss den stack garnicht fixen
  Mit Zitat antworten Zitat
flash2009

Registriert seit: 15. Dez 2008
11 Beiträge
 
#14

Re: Wie baut man sowas wie writeln/sprintf selbst ?

  Alt 26. Dez 2008, 17:49
ok hier mal eine grafik da ich das nicht so schön beschreiben kann

http://img518.imageshack.us/img518/2712/hukiw1.png

der rechte rote pfeil geht auch über die dll zurück

Delphi-Quellcode:
function test(Buffer:Pointer;Format1:PChar;const arg:Array of Const):Integer;cdecl;
begin
  Result := SprintfOrg(Buffer,Format1,arg);
end;
geht

Delphi-Quellcode:
function test(Buffer:Pointer;Format1:PChar;const arg:Array of DWord):Integer;cdecl;
begin
  Result := SprintfOrg(Buffer,Format1,arg);
end;
geht


Funktionsaufruf:
PUSH EAX ; /<%s> = " [17:29:26]"
PUSH EBX ; |<%s> = "abc"
PUSH 004488D8 ; |format = "%s%s"
PUSH ECX ; |s = 0017F388
CALL EBP ; \sprintf

Stack wenn sprintf gecallt ist:
0041F27E /CALL to sprintf from 0041F27C
0017F388 |s = 0017F388
004488D8 |format = "%s%s"
00447648 |<%s> = "abc"
08F12030 \<%s> = " [17:29:26]"

done thx @all
greetz flash
  Mit Zitat antworten Zitat
flash2009

Registriert seit: 15. Dez 2008
11 Beiträge
 
#15

Re: Wie baut man sowas wie writeln/sprintf selbst ?

  Alt 27. Dez 2008, 06:47
ok schade zu früh gefreut

vieleicht hat noch mal jemand lust mir nen tipp zu geben
irgendwo haperts am zusammenspiel zwischen array und stack pointer

ok const array of ..
dann wird für den array eine adresse vom stack kopiert(move) und der array zeigt auf die adresse
problem ist das der array quasi auf das erste element zeigt.
bei nem Pchar wäre das zb halloallesisttoll
einen index weiter fehlen dann die ersten 4 bytes oallesisttoll wäre noch übrig usw

nächsten versuch das const wegzu lassen , funktioniert (theretisch) praktisch sieht das aber so aus das der compiler das parameter wo die rücksprung adresse steht,den register edx geschoben wird und dann runtergezählt wird bis 0 , das programm is irgendwo bei 40000 oder so und das überschreibt ja dann quasi den gesamten programcode .
http://img224.imageshack.us/img224/8113/huk2vq1.png

in asm würd ich mir vom ersten parameter adresse nehmen 0027FEF8 und dann immer 4 weitergehen , aber wie kann ich sowas schön ohne inline asm realisieren .

edit1:
-----------------------
als zwischenlösung bin ich jetzt bei dem kram angekommen
Delphi-Quellcode:
function translate(Buffer: Pointer; Format1: PChar;dwFirst:DWord):Integer;cdecl;
var
  i : Integer;
  c : Integer;
  ptr : Pointer;
begin
  c:= 0;
  i := 0;
  for i := 0 to (length(Format1)-1) do
  if Format1[i] = '%then
   begin
    inc(c);
    if Format1[i+1] = 'sthen
    begin
      ptr := @dwFirst;
      LogToFileStr(PChar(Pointer(Cardinal(ptr)+4*(c-1) )^))
    end;
    if Format1[i+1] = '%then
      dec(c,2);
   end;
  //Result := SprintfOrg(Buffer,Format1,arg);
end;
ich werd über diesen counter c dann versuchen die parameter wieder auf den stack zu schaufen bevor ich die echte sprintf callen werde, aber ist das noch schön was ich da mache oder geht sowas nicht anders?
  Mit Zitat antworten Zitat
Benutzerbild von Sharky
Sharky

Registriert seit: 29. Mai 2002
Ort: Frankfurt
8.252 Beiträge
 
Delphi 2006 Professional
 
#16

Re: Wie baut man sowas wie writeln/sprintf selbst ?

  Alt 27. Dez 2008, 07:19
Hai flash2009,

sei doch bitte so lieb und hänge die Grafiken als Anhang an deine Postings. Dadurch sind sie:

a) auch noch vorhanden wenn sie auf "deinem" Server nicht mehr bereit stehen
b) muss nur der User der sich dafür interessiert die Daten runterladen.


Danke.
Stephan B.
"Lasst den Gänsen ihre Füßchen"
  Mit Zitat antworten Zitat
Cyf

Registriert seit: 30. Mai 2008
407 Beiträge
 
Lazarus
 
#17

Re: Wie baut man sowas wie writeln/sprintf selbst ?

  Alt 27. Dez 2008, 14:57
Ich muss grad zugeben, dass ich nicht so ganz folgen kann, was du überhaupt erreichen willst, aber bedenke dass (im Bezug auf array of const):

a) ein PChar sich nicht mitten im Array befindet, sondern nur ein Zeiger auf den Anfang des Strings und dieser dann irgendwo im Speicher ist, dieser ist selbst nur insgesamt 4 Byte groß
b) in einem array of const jedes Element ein 8 Byte großes TVarRec ist
c) die im TVarRec übergeben Zeiger offenbar nur im Scope der Funktion gültig sind (siehe obiger Link)

Kannst du nochmal kurz und knapp erklären, warum du den Stackpointer manuell manipulieren musst und was es mit deiner DLL auf sich hat?
  Mit Zitat antworten Zitat
Oreaden

Registriert seit: 10. Nov 2008
60 Beiträge
 
#18

Re: Wie baut man sowas wie writeln/sprintf selbst ?

  Alt 27. Dez 2008, 15:23
Zitat von alzaimar:
In Delphi kann man keine beliebige Anzahl von Parametern deklarieren. In C(++) und C# geht das, weil hier die Aufrufkonventionen anders sind und die Sprache zudem spezielle syntaktische Elemente bereit hält.
Fast, auch in Delphi kann man Funktionen und Proceduren als CDECL deklarieren, dann kann man eine unbestimmte Anzahl an Parametern übergeben. Der Rest sollte in der OH mit einem Beispiel beschrieben sein, wenn mich meine grauen Zellen nicht ganz verlassen haben.

Also, es ist möglich, der erste Schritt sind wie von Alzaimer erkannt, die Aufrufkonventionen zu korrigieren.

Schöne Grüße
OREADEN
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.033 Beiträge
 
Delphi 12 Athens
 
#19

Re: Wie baut man sowas wie writeln/sprintf selbst ?

  Alt 27. Dez 2008, 16:41
CDECL:

OK, da könnte man dann via Assembler auslesen wieviele Parameter übergeben würden, aber es ist praktisch nicht möglich rauszufinden von welchem Typ diese Parameter sind.

Außerdem ist es in Delphi/Pascal schwer diese Parameter dann anzugeben, da dort via Funktions/Prozedur-Definition geprüft wird welche Parameter angegeben werden müssen und ohne Definition kann man da keine Parameter angeben/eintragen.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
flash2009

Registriert seit: 15. Dez 2008
11 Beiträge
 
#20

Re: Wie baut man sowas wie writeln/sprintf selbst ?

  Alt 27. Dez 2008, 19:52
Zitat von Cyf:
Ich muss grad zugeben, dass ich nicht so ganz folgen kann, was du überhaupt erreichen willst, aber bedenke dass (im Bezug auf array of const):

a) ein PChar sich nicht mitten im Array befindet, sondern nur ein Zeiger auf den Anfang des Strings und dieser dann irgendwo im Speicher ist, dieser ist selbst nur insgesamt 4 Byte groß
b) in einem array of const jedes Element ein 8 Byte großes TVarRec ist
c) die im TVarRec übergeben Zeiger offenbar nur im Scope der Funktion gültig sind (siehe obiger Link)

Kannst du nochmal kurz und knapp erklären, warum du den Stackpointer manuell manipulieren musst und was es mit deiner DLL auf sich hat?

Ok ich hab alle Posts gelesen und werd mal hier wieder ansetzen.
-------------
Zu erst, ich hab nen Hook entwickelt der die Original Api(function) mit meiner function austauscht und die Original function trozdem noch verfügbar hält um Parameter oder rückgabe Werte zu ändern bevor der Original Code weiter läuft. (der hook ist fertig und eigentlich perfekt, einzige Einschränkung er kann nur functions hooken die in Visual Studio gemacht wurden aber das ist jetzt ne Nebensache.)
-------------
So jetzt zu sprinft die ich hooken will, eine function aus der c++ library
int sprintf ( char * str, const char * format, ... );

Rückgabewert (Integer), Parameter(Pointer auf einen Buffer,ein PChar, eine beliebige Anzahl an Parametern), das ganze ist Standard c++ also cdecl (Parameter von rechts nach links pushen und der Stack wir vom Code der die function called wieder bereinigt(add esp, .. ) )
-------------
So jetzt das Problem ist jetzt dieses ... hierbei handelt es sich um sowas wie nen Array aber das Problem ist das ein const array of.. , genau wie call by reference(var ...) nen Pointer auf ne Array struktur übergibt und das geht da leider nicht. Ohne const ist Delphi wiederum nicht in der Lage zu erkennen wie lang der Array ist.

Mein Ansatz war nun das erste Parameter zu nehmen zb nen DWord der hat 4 Byte und über ein @ and die Adresse zu kommen , somit hab ich die Adresse vom ersten Parameter alle weiteren sind immer 4 Bytes weiter.Das ist jetzt nicht schön aber funktioniert schonmal.

gruß flash
Miniaturansicht angehängter Grafiken
huk2vq1_871.png   hukiw1_105.png  
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 3     12 3      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:28 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