unit md_game_process; {$mode ObjFPC}{$H+} interface uses windows, ntapi, host_ipc; 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; Destructor Destroy; override; end; implementation function TGameProcessPipe.is_terminated:Boolean; var R:DWORD; T:QWORD; begin T:=0; R:=NtWaitForSingleObject(g_proc,False,@T); Result:=(R=STATUS_WAIT_0); end; function TGameProcessPipe.exit_code:DWORD; var data:array[0..SizeOf(PROCESS_BASIC_INFORMATION)-1+7] of Byte; p_info:PPROCESS_BASIC_INFORMATION; begin p_info:=Align(@data,8); p_info^:=Default(PROCESS_BASIC_INFORMATION); NtQueryInformationProcess(g_proc, ProcessBasicInformation, p_info, SizeOf(PROCESS_BASIC_INFORMATION), nil); Result:=p_info^.ExitStatus; end; procedure TGameProcessPipe.suspend; begin NtSuspendProcess(g_proc); end; procedure TGameProcessPipe.resume; begin NtResumeProcess(g_proc); end; procedure TGameProcessPipe.stop; begin NtTerminateProcess(g_proc,0); end; Destructor TGameProcessPipe.Destroy; begin CloseHandle(g_proc); CloseHandle(FChildpip); inherited; end; end.