You can use Dev-Pas 1.9.2.0 to compile this source code.
program Grid_Trainer;
{$MODE FPC}
Uses Windows, CRT;
{$R renan.rs}
Const Hi : Integer = 7;
Key01 : LongInt = $31;
Key02 : LongInt = $32;
Key03 : LongInt = $33;
Key04 : LongInt = $34;
Key05 : LongInt = $35;
Key06 : LongInt = $36;
Key07 : LongInt = $37;
Key08 : LongInt = $38;
Key09 : LongInt = $23;
Key10 : LongInt = $91;
SND_ASYNC = 1;
SND_MEMORY = 4;
SND_RESOURCE = $40004;
//Flashback arrays
Flash01 : Array[1..1] of byte = ($E9);
AllocWrite01 : Array[1..9] of byte = ($C7, $41, $14, $00, $00, $00, $00, $C3, $E9);
FlashLastNop : Array[1..1] of byte = ($90);
DesFlash : Array[1..5] of byte = ($83, $41, $14, $01, $C3);
FlashbackOff : Array[1..3] of byte = ($2B, $41, $14);
FlashbackOn : Array[1..3] of byte = ($03, $41, $14);
//EndRace arrays
EndRace01 : Array[1..1] of byte = ($E9);
EndRace01_03 : Array[1..2] of byte = ($90, $90);
AllocWrite01ER : Array[1..15] of byte = ($C7, $46, $30, $00, $00, $00, $00, $01, $46, $30, $8B, $4C, $24, $0C, $E9);
EndRace_LastNop : Array[1..1] of byte = ($90);
DesEndRace03 : Array[1..7] of byte = ($01, $46, $30, $8B, $4C, $24, $0C);
//X99 arrays
X01 : Array[1..1] of byte = ($E9);
AllocWrite01X99 : Array[1..13] of byte = ($C7, $41, $24, $00, $00, $60, $40, $F3, $0F, $10, $41, $24, $E9);
X02 : Array[1..1] of byte = ($E9);
X02_02 : Array[1..4] of byte = ($90, $90, $90, $90);
AllocWrite02X99 : Array[1..15]of byte = ($C6, $47, $18, $63, $8B, $57, $18, $3B, $96, $CC, $00, $00, $00, $0F, $8C);
AllocWrite03X99 : Array[1..1] of byte = ($E9);
XDes01 : Array[1..5] of byte = ($F3, $0F, $10, $41, $24);
XDes02 : Array[1..9] of byte = ($8B, $57, $18, $3B, $96, $CC, $00, $00, $00);
//EndLeDrift arrays
LeDrift01 : Array[1..1] of byte = ($E9);
LeDrift01_Nop : Array[1..1] of byte = ($90);
AllocWrite01EL : Array[1..11] of byte = ($C7, $46, $28, $FF, $FF, $FF, $FF, $8B, $56, $24, $E9);
LeDrift02 : Array[1..1] of byte = ($E9);
LeDrift02_Nop : Array[1..2] of byte = ($90, $90);
AllocWrite02EL : Array[1..12] of byte = ($C7, $46, $30, $FF, $FF, $FF, $FF, $8B, $4C, $24, $0C, $E9);
DesLeDrift01 : Array[1..6] of byte = ($01, $4E, $28, $8B, $56, $24);
DesLeDrift02 : Array[1..7] of byte = ($01, $46, $30, $8B, $4C, $24, $0C);
//No Damage arrays
Damage01 : Array[1..6] of byte = ($90, $90, $90, $90, $90, $90);
Damage02 : Array[1..6] of byte = ($90, $90, $90, $90, $90, $90);
Damage03 : Array[1..5] of byte = ($90, $90, $90, $90, $90);
Damage04 : Array[1..6] of byte = ($90, $90, $90, $90, $90, $90);
Damage05 : Array[1..4] of byte = ($90, $90, $90, $90);
Damage06 : Array[1..5] of byte = ($90, $90, $90, $90, $90);
DesDamage01 : Array[1..6] of byte = ($F3, $0F, $11, $44, $81, $18);
DesDamage02 : Array[1..6] of byte = ($F3, $0F, $11, $44, $9E, $18);
DesDamage03 : Array[1..5] of byte = ($F3, $0F, $11, $46, $0C);
DesDamage04 : Array[1..6] of byte = ($F3, $0F, $11, $44, $81, $28);
DesDamage05 : Array[1..4] of byte = ($F3, $0F, $11, $08);
DesDamage06 : Array[1..5] of byte = ($F3, $0F, $11, $4E, $0C);
label Start, HotkeyOn, HotkeyOff;
Function PlaySound(x1: PChar; x2: HMODULE; x3: DWORD): BOOL; stdcall; external 'winmm.dll' name
{$ifdef UNICODE}'PlaySoundW' {$else}'PlaySoundA' {$endif};
Function VirtualAllocEx(hProcess: THandle; lpAddress: Pointer; dwSize, flAllocationType: DWORD; flProtect: DWORD): Pointer; stdcall; External 'kernel32.dll' Name 'VirtualAllocEx';
procedure Flashback;
var
Flash01_02 : Pointer;
AllocBack01 : Pointer;
BackTo00697CC5 : Pointer;
AllocatedMem : Pointer;
ChangeMem : WinBOOL;
Check : Array[1..1] of byte;
GRIDWindow : HWnd;
ProcID, ThrID, myRead, myWrite: DWord;
ProcHandle : THandle;
mySize : Word;
begin
GRIDWindow := FindWindow('NeonClass_41', 'GRID');
if GRIDWindow <> 0 then
begin
ThrID := GetWindowThreadProcessId(GRIDWindow, @ProcID);
ProcHandle := OpenProcess(PROCESS_ALL_ACCESS, FALSE, ProcID);
ReadProcessMemory(ProcHandle, Pointer($00697CA3), @Check, $01, myRead);
if Check[01] = $2B then
begin
mySize:= $0200;
AllocatedMem:= VirtualAllocEx(ProcHandle, nil, mySize, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
ChangeMem := VirtualProtectEx(ProcHandle, AllocatedMem, mySize, PAGE_EXECUTE_READWRITE, nil);
Flash01_02 := AllocatedMem-$00697CC0-$05;
BackTo00697CC5:= Pointer($00697CC5);
AllocBack01:= Pointer(BackTo00697CC5-AllocatedMem-$0D);
WriteProcessMemory(ProcHandle, Pointer($00697CA3), @FlashbackOn, $03, myWrite);
WriteProcessMemory(ProcHandle, Pointer($00697CC0), @Flash01, 01, myWrite);
WriteProcessMemory(ProcHandle, Pointer($00697CC1), @Flash01_02, 04, myWrite);
WriteProcessMemory(ProcHandle, Pointer(AllocatedMem), @AllocWrite01, 09, myWrite);
WriteProcessMemory(ProcHandle, Pointer(AllocatedMem+$09), @AllocBack01, 04, myWrite);
WriteProcessMemory(ProcHandle, Pointer(AllocatedMem+$09+$04), @FlashLastNop, 01, myWrite);
PlaySound(PChar('Activate'),HInstance, snd_ASync or snd_Memory or snd_Resource);
CloseHandle(ProcHandle);
Sleep(100)
end
else
begin
ThrID := GetWindowThreadProcessId(GRIDWindow, @ProcID);
ProcHandle := OpenProcess(PROCESS_ALL_ACCESS, FALSE, ProcID);
WriteProcessMemory(ProcHandle, Pointer($00697CA3), @FlashbackOff, $03, myWrite);
WriteProcessMemory(ProcHandle, Pointer($00697CC0), @DesFlash , $05, myWrite);
PlaySound(PChar('Deactivate'),HInstance, snd_ASync or snd_Memory or snd_Resource);
CloseHandle(ProcHandle);
Sleep(100)
end;
end;
end;
procedure EndRace1st;
var
EndRace01_02 : Pointer;
AllocatedMem : Pointer;
AllocBack01 : Pointer;
BackTo008F2E98 : Pointer;
Check : Array[1..1] of byte;
//Global
mySize : Word;
GRIDWindow : HWnd;
ProcID, ThrID, myRead, myWrite: DWord;
ProcHandle : THandle;
ChangeMem : WinBOOL;
begin
GRIDWindow := FindWindow('NeonClass_41', 'GRID');
if GRIDWindow <> 0 then
begin
mySize:= $0200;
ThrID := GetWindowThreadProcessId(GRIDWindow, @ProcID);
ProcHandle := OpenProcess(PROCESS_ALL_ACCESS, FALSE, ProcID);
ReadProcessMemory(ProcHandle, Pointer($008F2E91), @Check, 01, myRead);
if Check[01] = $01 then
begin
AllocatedMem:= VirtualAllocEx(ProcHandle, nil, mySize, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
ChangeMem := VirtualProtectEx(ProcHandle, AllocatedMem, mySize, PAGE_EXECUTE_READWRITE, nil);
EndRace01_02 := AllocatedMem-$008F2E91-$05;
BackTo008F2E98 := Pointer($008F2E98);
AllocBack01 := Pointer(BackTo008F2E98-$13-AllocatedMem);
WriteProcessMemory(ProcHandle, Pointer($008F2E91), @EndRace01, 01, myWrite);
WriteProcessMemory(ProcHandle, Pointer($008F2E92), @EndRace01_02, 04, myWrite);
WriteProcessMemory(ProcHandle, Pointer($008F2E96), @EndRace01_03, 02, myWrite);
WriteProcessMemory(ProcHandle, Pointer(AllocatedMem), @AllocWrite01ER, 15, myWrite);
WriteProcessMemory(ProcHandle, Pointer(AllocatedMem+$0F), @AllocBack01, 04, myWrite);
WriteProcessMemory(ProcHandle, Pointer(AllocatedMem+$0F+$04), @EndRace_LastNop, 01, myWrite);
PlaySound(PChar('Activate'),HInstance, snd_ASync or snd_Memory or snd_Resource);
CloseHandle(ProcHandle);
Sleep(100)
end
else
begin
WriteProcessMemory(ProcHandle, Pointer($008F2E91), @DesEndRace03, 07, myWrite);
PlaySound(PChar('Deactivate'),HInstance, snd_ASync or snd_Memory or snd_Resource);
CloseHandle(ProcHandle);
Sleep(100)
end;
end;
end;
procedure Add5;
var
MoneyValueOld, MoneyValueNew : DWord;
MoneyAddress : ^DWord;
//Global
GRIDWindow : HWnd;
ProcID, ThrID, myRead, myWrite: DWord;
ProcHandle : THandle;
begin
GRIDWindow := FindWindow('NeonClass_41', 'GRID');
if GRIDWindow <> 0 then
begin
ThrID := GetWindowThreadProcessId(GRIDWindow, @ProcID);
ProcHandle := OpenProcess(PROCESS_ALL_ACCESS, FALSE, ProcID);
MoneyAddress:= Pointer($08DBF16C);
ReadProcessMemory(ProcHandle, MoneyAddress, @MoneyValueOld, SizeOf(MoneyAddress), myRead);
MoneyValueNew:= MoneyValueOld+$002625A0;
WriteProcessMemory(ProcHandle, MoneyAddress, @MoneyValueNew, SizeOf(MoneyAddress), myWrite);
PlaySound(PChar('Activate'),HInstance, snd_ASync or snd_Memory or snd_Resource);
CloseHandle(ProcHandle);
Sleep(100);
end;
end;
procedure Get2;
var
MoneyValueNew : DWord;
MoneyAddress : ^DWord;
//Global
GRIDWindow : HWnd;
ProcID, ThrID, myRead, myWrite: DWord;
ProcHandle : THandle;
begin
GRIDWindow := FindWindow('NeonClass_41', 'GRID');
if GRIDWindow <> 0 then
begin
ThrID := GetWindowThreadProcessId(GRIDWindow, @ProcID);
ProcHandle := OpenProcess(PROCESS_ALL_ACCESS, FALSE, ProcID);
MoneyAddress := Pointer($08DBF16C);
MoneyValueNew:= $3B9ACA00;
WriteProcessMemory(ProcHandle, MoneyAddress, @MoneyValueNew, SizeOf(MoneyAddress), myWrite);
PlaySound(PChar('Activate'),HInstance, snd_ASync or snd_Memory or snd_Resource);
CloseHandle(ProcHandle);
Sleep(100);
end;
end;
procedure AddDriftPoints;
var
DriftValueOld, DriftValueNew : Single;
//Global
GRIDWindow : HWnd;
ProcID, ThrID, myRead, myWrite: DWord;
ProcHandle : THandle;
begin
GRIDWindow := FindWindow('NeonClass_41', 'GRID');
if GRIDWindow <> 0 then
begin
ThrID := GetWindowThreadProcessId(GRIDWindow, @ProcID);
ProcHandle := OpenProcess(PROCESS_ALL_ACCESS, FALSE, ProcID);
ReadProcessMemory(ProcHandle, Pointer($0767596C), @DriftValueOld, 04, myRead);
DriftValueNew:= DriftValueOld+1000000;
WriteProcessMemory(ProcHandle, Pointer($0767596C), @DriftValueNew, 04, myWrite);
PlaySound(PChar('Activate'),HInstance, snd_ASync or snd_Memory or snd_Resource);
CloseHandle(ProcHandle);
Sleep(100);
end;
end;
procedure X99;
var
X01_02 : Pointer;
AllocBack01 : Pointer;
BackTo00634559 : Pointer;
Check : Array[1..1] of byte;
AllocatedMem : Pointer;
X02_01 : Pointer;
Allocjmp : Pointer;
AllocBack02 : Pointer;
AllocatedMem2 : Pointer;
AllocjmpTo005CDBBF : Pointer;
BackTo005CDB43 : Pointer;
//Global
mySize : Word;
GRIDWindow : HWnd;
ProcID, ThrID, myRead, myWrite: DWord;
ProcHandle : THandle;
ChangeMem : WinBOOL;
begin
GRIDWindow := FindWindow('NeonClass_41', 'GRID');
if GRIDWindow <> 0 then
begin
mySize:= $0200;
ThrID := GetWindowThreadProcessId(GRIDWindow, @ProcID);
ProcHandle := OpenProcess(PROCESS_ALL_ACCESS, FALSE, ProcID);
ReadProcessMemory(ProcHandle, Pointer($00634554), @Check, 01, myRead);
if Check[01] = $F3 then
begin
AllocatedMem:= VirtualAllocEx(ProcHandle, nil, mySize, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
AllocatedMem2:= AllocatedMem+$32;
ChangeMem := VirtualProtectEx(ProcHandle, AllocatedMem, mySize, PAGE_EXECUTE_READWRITE, nil);
X01_02 := AllocatedMem-$00634554-$05;
BackTo00634559 := Pointer($00634559);
AllocBack01 := Pointer(BackTo00634559-$11-AllocatedMem);
X02_01 := AllocatedMem2-$005CDB38-$05;
AllocjmpTo005CDBBF := Pointer($005CDBBF);
Allocjmp := Pointer(AllocjmpTo005CDBBF-AllocatedMem2-$13);
BackTo005CDB43 := Pointer($005CDB43);
AllocBack02 := Pointer(BackTo005CDB43-AllocatedMem2-$18);
WriteProcessMemory(ProcHandle, Pointer($00634554), @X01, 01, myWrite);
WriteProcessMemory(ProcHandle, Pointer($00634555), @X01_02, 04, myWrite);
WriteProcessMemory(ProcHandle, Pointer(AllocatedMem), @AllocWrite01X99, 13, myWrite);
WriteProcessMemory(ProcHandle, Pointer(AllocatedMem+$0D), @AllocBack01, 04, myWrite);
//WriteProcessMemory(ProcHandle, Pointer(), @, 00, myWrite);
WriteProcessMemory(ProcHandle, Pointer($005CDB38), @X02, 01, myWrite);
WriteProcessMemory(ProcHandle, Pointer($005CDB39), @X02_01, 04, myWrite);
WriteProcessMemory(ProcHandle, Pointer($005CDB3D), @X02_02, 04, myWrite);
WriteProcessMemory(ProcHandle, Pointer(AllocatedMem2), @AllocWrite02X99, 15, myWrite);
WriteProcessMemory(ProcHandle, Pointer(AllocatedMem2+$0F), @Allocjmp, 04, myWrite);
WriteProcessMemory(ProcHandle, Pointer(AllocatedMem2+$0F+$04), @AllocWrite03X99, 01, myWrite);
WriteProcessMemory(ProcHandle, Pointer(AllocatedMem2+$0F+$04+$01), @AllocBack02, 04, myWrite);
PlaySound(PChar('Activate'),HInstance, snd_ASync or snd_Memory or snd_Resource);
CloseHandle(ProcHandle);
Sleep(100)
end
else
begin
WriteProcessMemory(ProcHandle, Pointer($00634554), @XDes01, 05, myWrite);
WriteProcessMemory(ProcHandle, Pointer($005CDB38), @XDes02, 09, myWrite);
PlaySound(PChar('Deactivate'),HInstance, snd_ASync or snd_Memory or snd_Resource);
CloseHandle(ProcHandle);
Sleep(100)
end;
end;
end;
procedure EndLeDrift;
var
//01
LeDrift01_02: Pointer;
BackTo008FC18D: Pointer;
AllocBack01: Pointer;
//02
LeDrift02_02: Pointer;
BackTo008F2E98: Pointer;
AllocBack02: Pointer;
//03
GoTo008FC187: Pointer;
//Global
ProcID, ThrID, myRead, myWrite: DWord;
GRIDWindow : HWnd;
ProcHandle : THandle;
mySize : Word;
AllocatedMem : Pointer;
AllocatedMem2 : Pointer;
ChangeMem : WinBOOL;
ChangeMem2 : WinBOOL;
begin
GRIDWindow := FindWindow('NeonClass_41', 'GRID');
if GRIDWindow <> 0 then
begin
ThrID := GetWindowThreadProcessId(GRIDWindow, @ProcID);
ProcHandle := OpenProcess(PROCESS_ALL_ACCESS, FALSE, ProcID);
AllocatedMem:= VirtualAllocEx(ProcHandle, nil, mySize, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
AllocatedMem2:= VirtualAllocEx(ProcHandle, nil, mySize, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
ChangeMem := VirtualProtectEx(ProcHandle, AllocatedMem, mySize, PAGE_EXECUTE_READWRITE, nil);
ChangeMem2 := VirtualProtectEx(ProcHandle, AllocatedMem, mySize, PAGE_EXECUTE_READWRITE, nil);
GoTo008FC187:= Pointer($008FC187);
LeDrift01_02 := Pointer(AllocatedMem-GoTo008FC187-$05);
BackTo008FC18D:= Pointer($008FC18D);
AllocBack01:= Pointer(BackTo008FC18D-AllocatedMem-$0F);
LeDrift02_02 := AllocatedMem2-$008F2E91-$05;
BackTo008F2E98:= Pointer($008F2E98);
AllocBack02:= Pointer(BackTo008F2E98-AllocatedMem2-$10);
//01
WriteProcessMemory(ProcHandle, Pointer($008FC187), @LeDrift01, 01, myWrite);
WriteProcessMemory(ProcHandle, Pointer($008FC188), @LeDrift01_02, 04, myWrite);
WriteProcessMemory(ProcHandle, Pointer($008FC18C), @LeDrift01_Nop, 01, myWrite);
WriteProcessMemory(ProcHandle, Pointer(AllocatedMem), @AllocWrite01EL, 11, myWrite);
WriteProcessMemory(ProcHandle, Pointer(AllocatedMem+$0B), @AllocBack01, 04, myWrite);
//02
WriteProcessMemory(ProcHandle, Pointer($008F2E91), @LeDrift02, 01, myWrite);
WriteProcessMemory(ProcHandle, Pointer($008F2E92), @LeDrift02_02, 04, myWrite);
WriteProcessMemory(ProcHandle, Pointer($008F2E96), @LeDrift02_Nop, 02, myWrite);
WriteProcessMemory(ProcHandle, Pointer(AllocatedMem2), @AllocWrite02EL, 12, myWrite);
WriteProcessMemory(ProcHandle, Pointer(AllocatedMem2+$0C), @AllocBack02, 04, myWrite);
PlaySound(PChar('Activate'),HInstance, snd_ASync or snd_Memory or snd_Resource);
Sleep(500);
WriteProcessMemory(ProcHandle, Pointer($008FC187), @DesLeDrift01, 06, myWrite);
WriteProcessMemory(ProcHandle, Pointer($008F2E91), @DesLeDrift02, 07, myWrite);
CloseHandle(ProcHandle);
Sleep(100);
end;
end;
procedure NoDamage;
var
Check: Array[1..1] of byte;
//Global
ProcID, ThrID, myRead, myWrite: DWord;
GRIDWindow : HWnd;
ProcHandle : THandle;
begin
GRIDWindow := FindWindow('NeonClass_41', 'GRID');
if GRIDWindow <> 0 then
begin
ThrID := GetWindowThreadProcessId(GRIDWindow, @ProcID);
ProcHandle := OpenProcess(PROCESS_ALL_ACCESS, FALSE, ProcID);
ReadProcessMemory(ProcHandle, Pointer($00982F0F), @Check, 01, myRead);
if Check[01] = $F3 then begin
WriteProcessMemory(ProcHandle, Pointer($00982F0F), @Damage01, 06, myWrite);
WriteProcessMemory(ProcHandle, Pointer($009DADED), @Damage02, 06, myWrite);
WriteProcessMemory(ProcHandle, Pointer($009ADB37), @Damage03, 05, myWrite);
WriteProcessMemory(ProcHandle, Pointer($00982F4F), @Damage04, 06, myWrite);
WriteProcessMemory(ProcHandle, Pointer($0098295F), @Damage05, 04, myWrite);
WriteProcessMemory(ProcHandle, Pointer($009ADB3E), @Damage06, 05, myWrite);
PlaySound(PChar('Activate'),HInstance, snd_ASync or snd_Memory or snd_Resource);
CloseHandle(ProcHandle);
Sleep(100)
end
else begin
WriteProcessMemory(ProcHandle, Pointer($00982F0F), @DesDamage01, 06, myWrite);
WriteProcessMemory(ProcHandle, Pointer($009DADED), @DesDamage02, 06, myWrite);
WriteProcessMemory(ProcHandle, Pointer($009ADB37), @DesDamage03, 05, myWrite);
WriteProcessMemory(ProcHandle, Pointer($00982F4F), @DesDamage04, 06, myWrite);
WriteProcessMemory(ProcHandle, Pointer($0098295F), @DesDamage05, 04, myWrite);
WriteProcessMemory(ProcHandle, Pointer($009ADB3E), @DesDamage06, 05, myWrite);
PlaySound(PChar('Deactivate'),HInstance, snd_ASync or snd_Memory or snd_Resource);
CloseHandle(ProcHandle);
Sleep(100);
end;
end;
end;
begin
Start:
ClrScr;
SetConsoleTitle('Renan ^^');
TextColor(White);
TextBackground(Blue);
ClrScr;
Writeln('Race Driver GRID +8 Trainer');
Writeln('Made for the version 1.0.0.0 of the game');
Writeln('Created by Renan ([email protected])');
Writeln('');
Writeln('-------------------------------------------------');
Writeln('');
Writeln('Trainer Hotkeys:');
Writeln('');
Writeln('Press 1 - Unlimited Flashbacks (On/Off)');
Writeln('Press 2 - Always Finish in 1st Place (On/Off)');
Writeln('Press 3 - Add $5,000,000 To Your Bank');
Writeln('Press 4 - Get $2,000,000,000 in Your Bank');
Writeln('Press 5 - Add 1000000 Drift Points');
Writeln('Press 6 - X99 Combo Multiplier (On/Off)');
Writeln('Press 7 - End Le Mans/Freestyle Drift Race');
Writeln('Press 8 - No Damage (On/Off)');
Writeln('');
Writeln('-------------------------------------------------');
Writeln('');
Writeln('Press Scroll Lock - Enable/Disable cheat hotkeys');
Writeln('Press END - Quit');
repeat
HotkeyOn:
Sleep(100);
if (GetASyncKeyState (Key01) <> 0) then Flashback;
if (GetASyncKeyState (Key02) <> 0) then EndRace1st;
if (GetASyncKeyState (Key03) <> 0) then Add5;
if (GetASyncKeyState (Key04) <> 0) then Get2;
if (GetASyncKeyState (Key05) <> 0) then AddDriftPoints;
if (GetASyncKeyState (Key06) <> 0) then X99;
if (GetASyncKeyState (Key07) <> 0) then EndLeDrift;
if (GetASyncKeyState (Key08) <> 0) then NoDamage;
if (GetASyncKeyState (Key09) <> 0) then Exit;
if (GetASyncKeyState (Key10) <> 0) then goto HotkeyOff;
until Hi = 0;
repeat
HotkeyOff:
Sleep(100);
if (GetASyncKeyState (Key09) <> 0) then Exit;
if (GetASyncKeyState (Key10) <> 0) then goto HotkeyOn;
until Hi = 0;
end.








