Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi RTL Fehler beheben - System.pas (https://www.delphipraxis.net/213430-rtl-fehler-beheben-system-pas.html)

Union 31. Jul 2023 15:13

AW: RTL Fehler beheben - System.pas
 
Stefan, geil! Du hast Sogar die virtual Jumps ($25FF) gehandelt!

Stevie 31. Jul 2023 15:26

AW: RTL Fehler beheben - System.pas
 
Zitat:

Zitat von Union (Beitrag 1525084)
Stefan, geil! Du hast Sogar die virtual Jumps ($25FF) gehandelt!

Ehre, wem Ehre gebührt, das hat mir Andreas Hausladen mal vor Jahren beigebracht 8-)

arcticwolf 10. Okt 2023 15:10

AW: RTL Fehler beheben - System.pas
 
Vielen Dank Stefan!

Es ist tatsächlich so, dass sich die Funktionen aus der System.pas, wie zum Beispiel "_WriteLong" oder "_WriteString", nicht direkt aufrufen lassen. Also habe ich es wie folgt versucht und das scheint auch zu funktionieren.
Delphi-Quellcode:
function GetWriteLongAddress: Pointer;
asm
  {$ifdef CPU64}
    mov rax,offset System.@WriteLong
  {$else}
    mov eax,offset System.@WriteLong
  {$endif}
end;

function GetWriteStringAddress: Pointer;
asm
  {$ifdef CPU64}
    mov rax,offset System.@WriteString
  {$else}
    mov eax,offset System.@WriteString
  {$endif}
end;
Ich möchte einen Fehler in der Funktion _WriteLong korrigieren:
Delphi-Quellcode:
function _WriteLong(var t: TTextRec; val, width: Integer): Pointer;
var
  S: _ShortStr;
begin
  // Str(val:0, S);    Fehler
  Str(Val:width, S); // Korrigiert
  Result := _WriteString(t, S, width);
end;
Im Anschluß muss der richtige Wert wieder an die nicht direkt aufrufbare Funktion _WriteString aus der System.pas übergeben werden. Also dachte ich, nichts leichter als das und habe folgendes versucht:
Delphi-Quellcode:
Type TFuncWriteString = Function(var t: TTextRec; const s: ShortString; width: Integer) : Pointer;

Const FuncWriteString : TFuncWriteString = Nil;

// Fixed Function WriteLong form System.pas
function WriteLongFixed(var t: TTextRec; val, width: Integer): Pointer;
var
  S: ShortString;
begin
  Str(val:width, S);
  Result := FuncWriteString(t, S, width);
end;

procedure RedirectFunction(OrgProc, NewProc: Pointer);
type
  TJmpBuffer = packed record
    Jmp: Byte;
    Offset: Integer;
  end;
var
  n: UINT_PTR;
  JmpBuffer: TJmpBuffer;
begin
  JmpBuffer.Jmp := $E9;
  JmpBuffer.Offset := PByte(NewProc) - (PByte(OrgProc) + 5);
  if not WriteProcessMemory(GetCurrentProcess, OrgProc, @JmpBuffer, SizeOf(JmpBuffer), n) then
    RaiseLastOSError;
end;

procedure ApplyPatch;
begin
  FuncWriteString := GetWriteStringAddress;
  RedirectFunction(GetWriteLongAddress, @WriteLongFixed);
end;
Bei folgender Zeile wirft der Compiler den Fehler "E2009 Inkompatible Typen: 'Liste der Parameter ist unterschiedlich'" aus.
Delphi-Quellcode:
FuncWriteString := GetWriteStringAddress;
Delphi-Quellcode:
    // Aus System.pas
    function _WriteString(var t: TTextRec; const s: _ShortStr; width: Integer): Pointer;
    begin
      Result := _WriteLString(t, s, width);
    end;

    // Meine Deklaration (siehe oben)
    Function(var t: TTextRec; const s: ShortString; width: Integer) : Pointer;
Wobei _ShortStr nur ein Alias für ShortString ist. Ergo sehe ich das Problem nicht!?

Delphi-Quellcode:
FuncWriteString := @GetWriteStringAddress;
Funktioniert (lässt sich compilieren) und im Debug-Modus springt Delphi dann auch in meine Funktion WriteLongFixed (Redirect funktioniert also). Der Aufruf von FuncWriteString wird dann jedoch mit einem IoError 103 quittiert.

Wie muss ich die Funktion _WriteString aus der System.pas richtig aufrufen/addresieren, damit das funktioniert? Ich stehe auf dem Schlauch.

himitsu 10. Okt 2023 15:25

AW: RTL Fehler beheben - System.pas
 
Oder dieses komische Zeugs lassen wie es ist
und statt dieser "uralten" Pascal-Funktionen z.B. den Delphi-Referenz durchsuchenTStringStream oder Delphi-Referenz durchsuchenTFile.WriteAllText oder TStringList oder TFileStream oder oder oder ... verwenden. :duck:


Jupp, _ShortStr ist ein "Ersatz" in der System.pas, da es in den Mobilen Compilern (iOS, Android) keinen ShortString gibt/gab.

arcticwolf 17. Okt 2023 11:31

AW: RTL Fehler beheben - System.pas
 
Zitat:

Oder dieses komische Zeugs lassen wie es ist
Das funktioniert leider nicht wenn man alten "Legacy-Code", mit meiner "Playcom Console Library" compilieren möchte, welcher System.Write oder System.Writeln verwendet. Wenn man nicht den kompletten Legacy-Code umschreiben möchte, dann müssen solche Funktionen richtig arbeiten.

Ich habe das Problem jetzt umschifft, in dem ich den Patch auf die Procedure System._WriteUString anwende und somit nicht gezwungen bin eine weitere Funktion aus der System.pas aufzurufen.

Lange Rede kurzer Sinn. Ich habe, Dank Eurer Hilfe und mit dem Code von Stefan, das Problem gelöst und die System.pas gepatched. Wer an der Lösung interessiert ist kann diese unter folgendem Link finden:

https://github.com/playcom-de/Consol...ly.Patches.pas

Stevie 17. Okt 2023 12:11

AW: RTL Fehler beheben - System.pas
 
Delphi-Quellcode:
procedure ApplyPatch;
begin
  @FuncWriteString := GetWriteStringAddress;
  RedirectFunction(GetWriteLongAddress, @WriteLongFixed);
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:34 Uhr.
Seite 2 von 2     12   

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