![]() |
Re: Wie baut man sowas wie writeln/sprintf selbst ?
Zitat:
@flash: Such doch mal nach dem Quelltext von sprintf.c. Sollte doch leicht zu finden sein. Die machen doch auch nur Stackpointerarithmetik. C kennt doch eh nur 'Call by Value', sodaß die Offsets durch den Format-String gegeben sind: %c = 1 byte, %d und %s = 4 byte... oder nicht? |
Re: Wie baut man sowas wie writeln/sprintf selbst ?
ok so sieht das aus und es funktioniert, ist nich ganz schön aber läuft =)
Delphi-Quellcode:
greetz flash
type
TSprintf = function(Buffer:Pointer;Format1:PChar;dwArray:DWord):Integer;cdecl; implementation var SprintfOrg : TSprintf; function translate(Buffer: Pointer; Format1: PChar;dwFirst:DWord):Integer;cdecl; var i : Integer; c : Integer; ptr1 : 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] = 's' then // das ist nicht wichtig für die funktion begin //von hier ptr1 := @dwFirst; LogToFileStr(PChar(Pointer(Cardinal(ptr1)+4*(c-1) )^)) end; //bis hier hin if Format1[i+1] = '%' then dec(c,2); end; asm push eax push ebx mov eax , c @putonstack: test eax , eax je @stackok lea ebx , dwFirst shl eax , 2 add ebx , eax shr eax , 2 sub ebx , 4 //first index = 0 not 1 ! sub eax , 1 push DWord ptr [ebx] jmp @putonstack @stackok: push Format1 push Buffer call SprintfOrg //call the orignal function mov Result , eax mov eax , c //Paremeter Counter add eax , 2 //+ Buffer and Format shl eax , 2 //Size each 4bytes add esp , eax //fix stack because of cdecl pop ebx pop eax end; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:54 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz