單位FastCodePatch.pas在Win32平臺中工作。 Delphi XE2支持Win64平臺,有什麼想法讓FastCodePatch在Win64平臺下工作?如何使FastCodePatch在Delphi XE2 Win64平臺上工作?
unit FastcodePatch;
interface
function FastcodeGetAddress(AStub: Pointer): Pointer;
procedure FastcodeAddressPatch(const ASource, ADestination: Pointer);
implementation
uses
Windows;
type
PJump = ^TJump;
TJump = packed record
OpCode: Byte;
Distance: Pointer;
end;
function FastcodeGetAddress(AStub: Pointer): Pointer;
begin
if PBYTE(AStub)^ = $E8 then
begin
Inc(Integer(AStub));
Result := Pointer(Integer(AStub) + SizeOf(Pointer) + PInteger(AStub)^);
end
else
Result := nil;
end;
procedure FastcodeAddressPatch(const ASource, ADestination: Pointer);
const
Size = SizeOf(TJump);
var
NewJump: PJump;
OldProtect: Cardinal;
begin
if VirtualProtect(ASource, Size, PAGE_EXECUTE_READWRITE, OldProtect) then
begin
NewJump := PJump(ASource);
NewJump.OpCode := $E9;
NewJump.Distance := Pointer(Integer(ADestination) - Integer(ASource) - 5);
FlushInstructionCache(GetCurrentProcess, ASource, SizeOf(TJump));
VirtualProtect(ASource, Size, OldProtect, @OldProtect);
end;
end;
end.
由Ville Krumlinde提供的解決方案不適用於64位軟件包。它僅適用於獨立.exe應用程序。
這實際上是Ville回答了你原來的問題,軟件包中的修補功能是一個不同的遊戲,你所提供的代碼也需要在32位目標上。 –
偉大的代碼!我確認它可以在32/64位Windows 7下使用Delphi 10.1(柏林)完美工作,即使啓用了「DEP」也是如此。 –