![]() |
Der linken Seite kann nichts zugewiesen werden - Pointer 64bit
Ich habe hier im Forum, Link suche ich noch raus, eine schöne Funktion gefunden:
Delphi-Quellcode:
Er funktioniert beim Kompilieren mit 32bit wunderbar. Bei 64bit kracht es bei "// skip the jump" mit der Meldung "Der linken Seite kann nichts zugewiesen werden".
procedure OverwriteProcedure(OldProcedure, NewProcedure: Pointer; Data: POverwrittenData = nil);
{OverwriteProcedure originally from Igor Siticov} {Modified by Jacques Garcia Vazquez} var x: PAnsiChar; y: integer; ov2, ov: Cardinal; p: Pointer; begin if OldProcedure = nil then begin Data.Location := nil; Exit; end; if Assigned(Data) then if (Data.Location <> nil) then Exit; {procedure already overwritten} // need six bytes in place of 5 x := PAnsiChar(OldProcedure); VirtualProtect(Pointer(x), 6, PAGE_EXECUTE_READWRITE, @ov); // if a jump is present then a redirect is found // $FF25 = jmp dword ptr [xxx] // This redirect is normally present in bpl files, but not in exe files p := OldProcedure; if Word(p^) = $25FF then begin Inc(integer(p), 2); // skip the jump // get the jump address p^ and dereference it p^^ p := Pointer(Pointer(p^)^); // release the memory VirtualProtect(Pointer(x), 6, ov, @ov2); // re protect the correct one x := PAnsiChar(p); VirtualProtect(Pointer(x), 6, PAGE_EXECUTE_READWRITE, @ov); end; if Assigned(Data) then begin Move(x^, Data.OldCode, 6); {Assign Location last so that Location <> nil only if OldCode is properly initialized.} Data.Location := x; end; x[0] := AnsiChar($E9); y := integer(NewProcedure) - integer(p) - 5; x[1] := AnsiChar(y and 255); x[2] := AnsiChar((y shr 8) and 255); x[3] := AnsiChar((y shr 16) and 255); x[4] := AnsiChar((y shr 24) and 255); VirtualProtect(Pointer(x), 6, ov, @ov2); end; Ich bin kein Pointer-Profi und weiß hier daher nicht weiter. Was kann man hier machen :pale: |
AW: Der linken Seite kann nichts zugewiesen werden - Pointer 64bit
Unter 64-Bit belegt ein Pointer 8 Byte, weswegen der Cast auf Integer in die Hose geht.
Je nach Delphi-Version bietet sich dafür UIntPtr oder NativeUInt an. |
AW: Der linken Seite kann nichts zugewiesen werden - Pointer 64bit
Ich versuche gerade irgendwie hinter die Logik zu kommen, aber schaffe es nicht und finde deswegen keinen Lösungsansatz.
Pointer sind Chinesisch für mich (noch nie wirklich benutzt). |
AW: Der linken Seite kann nichts zugewiesen werden - Pointer 64bit
Ersetz doch einfach mal
Delphi-Quellcode:
durchInc(integer(p), 2); // skip the jump
Delphi-Quellcode:
Inc(UIntPtr(p), 2); // skip the jump |
AW: Der linken Seite kann nichts zugewiesen werden - Pointer 64bit
Danke für die Hilfe.
Folgende Lektüre kann ich auch empfehlen. Die habe ich mir gerade auch durchgelesen: -- Konvertieren von 32-Bit-Delphi-Anwendungen in 64-Bit-Windows: ![]()
Delphi-Quellcode:
{$IFDEF WIN32}
Inc(integer(p), 2); // skip the jump {$ELSE} Inc(UIntPtr(p), 2); // skip the jump {$ENDIF} |
AW: Der linken Seite kann nichts zugewiesen werden - Pointer 64bit
![]() Der Typ IntPtr oder UIntPtr wäre aber richtiger, er ist in Delphi aber nicht immer definiert. PS: ![]() Zitat:
Und hat in X64 der JUMP-Assembler-Befehl auch die selbe Signatur? |
AW: Der linken Seite kann nichts zugewiesen werden - Pointer 64bit
Zitat:
Gruß K-H |
AW: Der linken Seite kann nichts zugewiesen werden - Pointer 64bit
Ich weiß nicht was ich tue :lol:
Ich habe diesen Code, da ich ihn brauchte, glücklicherweise hier im Forum gefunden. Er stammt vom CodeLib-Manager. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:59 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