diff --git a/gui/game_info.pas b/gui/game_info.pas index 7bbc8070..41c0682e 100644 --- a/gui/game_info.pas +++ b/gui/game_info.pas @@ -78,6 +78,7 @@ type g_p_pid:Integer; g_fork :Boolean; function is_terminated:Boolean; virtual; + function exit_code:DWORD; virtual; procedure suspend; virtual; procedure resume; virtual; procedure stop; virtual; @@ -91,6 +92,11 @@ begin Result:=False; end; +function TGameProcess.exit_code:DWORD; +begin + Result:=0; +end; + procedure TGameProcess.suspend; begin // diff --git a/gui/main.pas b/gui/main.pas index 63ae99e4..644d6731 100644 --- a/gui/main.pas +++ b/gui/main.pas @@ -685,9 +685,19 @@ begin end; procedure TfrmMain.TBStopClick(Sender: TObject); +var + exit_code:DWORD; + r:RawByteString; begin if GameProcessForked then //only forked begin + exit_code:=0; + + if FGameProcess.is_terminated then + begin + exit_code:=FGameProcess.exit_code; + end; + //terminate FGameProcess.stop; SetButtonsState(mbsStopped); @@ -702,6 +712,15 @@ begin CloseMainWindows; // Pages.ActivePage:=TabList; + + if (exit_code<>0) then + begin + r:='Game process stopped with exit code:0x'+HexStr(exit_code,8); + FileWrite(FAddHandle,PChar(r)^,Length(r)); + + MessageDlgEx(r,mtError,[mbOK],Self); + end; + end else begin TBPauseClick(Sender); diff --git a/sys/md/md_game_process.pas b/sys/md/md_game_process.pas index f1a145e5..004c297b 100644 --- a/sys/md/md_game_process.pas +++ b/sys/md/md_game_process.pas @@ -13,6 +13,7 @@ type TGameProcessPipe=class(TGameProcess) FChildpip:THandle; function is_terminated:Boolean; override; + function exit_code:DWORD; override; procedure suspend; override; procedure resume; override; procedure stop; override; @@ -32,6 +33,21 @@ begin Result:=(R=STATUS_WAIT_0); end; +function TGameProcessPipe.exit_code:DWORD; +var + info:PROCESS_BASIC_INFORMATION; +begin + info:=Default(PROCESS_BASIC_INFORMATION); + + NtQueryInformationProcess(g_proc, + ProcessBasicInformation, + @info, + SizeOf(info), + nil); + + Result:=info.ExitStatus; +end; + procedure TGameProcessPipe.suspend; begin NtSuspendProcess(g_proc);