Code:
function StartGame(const fn: String; const DllPath: AnsiString) : Boolean;
const
GGSucces: array [0 .. 5] of Byte = ($E9, $8B, $00, $00, $00, $90);
GGStart : array [0 .. 1] of Byte = ($EB, $1A);
var
StartupInfo : TStartupInfo;
OldProtect: Cardinal;
ProcessInformation: TProcessInformation;
lpNumberOfBytesWritten: Cardinal;
begin
FillChar(StartupInfo, SizeOf(StartupInfo), 0);
StartupInfo.CB := SizeOf(StartupInfo);
Result := CreateProcess(
nil,
PChar('"'+fn + '" connect /mMU'),
nil,
nil,
False,
CREATE_NEW_PROCESS_GROUP + IDLE_PRIORITY_CLASS + SYNCHRONIZE + CREATE_SUSPENDED,
nil,
nil,
StartupInfo,
ProcessInformation);
if Result then
begin
WaitForInputIdle(ProcessInformation.hProcess, 500);
if VirtualProtectEx(ProcessInformation.hProcess,Ptr(GAMEGUARD_SUCCESS),SizeOf(GGSucces), PAGE_EXECUTE_READWRITE, OldProtect) then
begin
WriteProcessMemory(ProcessInformation.hProcess, Ptr(GAMEGUARD_SUCCESS), @GGSucces[0], Length(GGSucces), lpNumberOfBytesWritten);
VirtualProtectEx(ProcessInformation.hProcess,Ptr(GAMEGUARD_SUCCESS),SizeOf(GGSucces), OldProtect, OldProtect)
end;
if VirtualProtectEx(ProcessInformation.hProcess,Ptr(GAMEGUARD_START), SizeOf(GGStart), PAGE_EXECUTE_READWRITE, OldProtect) then
begin
WriteProcessMemory(ProcessInformation.hProcess, Ptr(GAMEGUARD_START), @GGStart[0], SizeOf(GGSucces), lpNumberOfBytesWritten);
VirtualProtectEx(ProcessInformation.hProcess,Ptr(GAMEGUARD_START), SizeOf(GGStart), OldProtect, OldProtect)
end;
ResumeThread(ProcessInformation.hThread);
if MainFrm.CWindowsMode.Checked then
if (InjectLibrary(ProcessInformation.dwProcessId, PAnsiChar(DllPath)) = False) then
begin
MainFrm.LogMessage(Decrypt_Str(@Str_windowsmode_failed[0], Length(Str_windowsmode_failed)));
end
end;
end;