From: Andreas H. <ah...@us...> - 2006-02-28 22:40:22
|
Update of /cvsroot/jvcl/dev/JVCL3/install/JVCLInstall/Helpers In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv27320/install/JVCLInstall/Helpers Modified Files: CapExec.pas JVCLConfiguration.pas Log Message: Completely updated Installer Index: CapExec.pas =================================================================== RCS file: /cvsroot/jvcl/dev/JVCL3/install/JVCLInstall/Helpers/CapExec.pas,v retrieving revision 1.8 retrieving revision 1.9 diff -C2 -d -r1.8 -r1.9 *** CapExec.pas 14 Feb 2006 15:32:35 -0000 1.8 --- CapExec.pas 28 Feb 2006 22:40:18 -0000 1.9 *************** *** 38,47 **** TCaptureLine = procedure(const Line: string; var Aborted: Boolean) of object; ! function CaptureExecute(const App, Args, Dir: string; CaptureLine: TCaptureLine; ! OnIdle: TNotifyEvent = nil; CtrlCAbort: Boolean = False): Integer; implementation function Oem2Ansi(const Text: string): string; begin --- 38,59 ---- TCaptureLine = procedure(const Line: string; var Aborted: Boolean) of object; ! var ! CaptureStatusLine: TCaptureLine = nil; + function CaptureExecute(const App, Args, Dir: string; CaptureLine: TCaptureLine; + OnIdle: TNotifyEvent = nil; CtrlCAbort: Boolean = False; const EnvPath: string = ''; + InjectDll: Boolean = False): Integer; implementation + {uses + InjectDll, SharedMMFMem;} + + function GetEnvironmentVariable(const Name: string): string; + begin + SetLength(Result, 8 * 1024); + SetLength(Result, Windows.GetEnvironmentVariable(PChar(Name), PChar(Result), Length(Result))); + end; + function Oem2Ansi(const Text: string): string; begin *************** *** 51,68 **** function CaptureExecute(const App, Args, Dir: string; CaptureLine: TCaptureLine; ! OnIdle: TNotifyEvent = nil; CtrlCAbort: Boolean = False): Integer; ! const ! CtrlCBuffer: array[0..7] of Char = #3#3#3#3#3#3#3#3; var - ProcessInfo: TProcessInformation; - StartupInfo: TStartupInfo; - SecAttrib: TSecurityAttributes; - hRead, hWrite: THandle; - hAbortRead, hAbortWrite: THandle; - Line: string; Aborted: Boolean; - Num: Cardinal; ! procedure ProcessInput; var BytesInPipe, n: Cardinal; --- 63,71 ---- function CaptureExecute(const App, Args, Dir: string; CaptureLine: TCaptureLine; ! OnIdle: TNotifyEvent; CtrlCAbort: Boolean; const EnvPath: string; InjectDll: Boolean): Integer; var Aborted: Boolean; ! procedure ProcessInput(hRead: THandle; var Line: string; CaptureLine: TCaptureLine); var BytesInPipe, n: Cardinal; *************** *** 85,89 **** if Line[i] in [#10, #13] then begin ! CaptureLine(Oem2Ansi(Copy(Line, 1, i - 1)), Aborted); if (Line[i] = #13) and (Line[i + 1] = #10) then begin --- 88,93 ---- if Line[i] in [#10, #13] then begin ! if Assigned(CaptureLine) then ! CaptureLine(Oem2Ansi(Copy(Line, 1, i - 1)), Aborted); if (Line[i] = #13) and (Line[i + 1] = #10) then begin *************** *** 98,105 **** Break; end; ! until (Aborted) or (not Found); end; end; begin Result := -2; --- 102,120 ---- Break; end; ! until Aborted or not Found; end; end; + var + ProcessInfo: TProcessInformation; + StartupInfo: TStartupInfo; + SecAttrib: TSecurityAttributes; + hRead, hWrite: THandle; + hAbortRead, hAbortWrite: THandle; + ReadStatusPipe, WriteStatusPipe: THandle; + Line: string; + StatusLine: string; + OrgEnvPath: string; + // PipeP: ^THandle; begin Result := -2; *************** *** 108,112 **** FillChar(SecAttrib, SizeOf(SecAttrib), 0); ! with SecAttrib do begin nLength := SizeOf(SecAttrib); bInheritHandle := True; --- 123,128 ---- FillChar(SecAttrib, SizeOf(SecAttrib), 0); ! with SecAttrib do ! begin nLength := SizeOf(SecAttrib); bInheritHandle := True; *************** *** 121,175 **** Exit; try ! if CtrlCAbort then ! if not CreatePipe(hAbortRead, hAbortWrite, @SecAttrib, 0) then ! Exit; try StartupInfo.wShowWindow := SW_HIDE; ! if CtrlCAbort then ! StartupInfo.hStdInput := hAbortRead ! else ! StartupInfo.hStdInput := GetStdHandle(STD_INPUT_HANDLE); StartupInfo.hStdOutput := hWrite; StartupInfo.hStdError := StartupInfo.hStdOutput; // redirect StartupInfo.dwFlags := STARTF_USESTDHANDLES or STARTF_USESHOWWINDOW; ! if CreateProcess(nil, PChar(App + ' ' + Args), @SecAttrib, nil, True, ! 0, nil, PChar(Dir), StartupInfo, ProcessInfo) then ! begin ! CloseHandle(ProcessInfo.hThread); ! try ! while (WaitForSingleObject(ProcessInfo.hProcess, 30) = WAIT_TIMEOUT) and (not Aborted) do ! begin ! ProcessInput; ! if Assigned(OnIdle) then ! OnIdle(nil); ! end; ! ProcessInput; ! if Line <> '' then ! CaptureLine(Line, Aborted); ! if Aborted then begin ! if CtrlCAbort then begin ! WriteFile(hAbortWrite, CtrlCBuffer, SizeOf(CtrlCBuffer), Num, nil); ! if WaitForSingleObject(ProcessInfo.hProcess, 500) = WAIT_TIMEOUT then TerminateProcess(ProcessInfo.hProcess, Cardinal(1)); ! end ! else ! TerminateProcess(ProcessInfo.hProcess, Cardinal(1)); end; ! GetExitCodeProcess(ProcessInfo.hProcess, Cardinal(Result)); ! finally ! CloseHandle(ProcessInfo.hProcess); ! end; ! end ! else ! Result := -1; ! finally ! if CtrlCAbort then ! begin ! CloseHandle(hAbortRead); ! CloseHandle(hAbortWrite); end; end; finally --- 137,223 ---- Exit; try ! if not CreatePipe(hAbortRead, hAbortWrite, @SecAttrib, 0) then ! Exit; ! if not CreatePipe(ReadStatusPipe, WriteStatusPipe, @SecAttrib, 0) then ! begin ! WriteStatusPipe := 0; ! ReadStatusPipe := 0; ! end; ! try StartupInfo.wShowWindow := SW_HIDE; ! StartupInfo.hStdInput := hAbortRead; StartupInfo.hStdOutput := hWrite; StartupInfo.hStdError := StartupInfo.hStdOutput; // redirect StartupInfo.dwFlags := STARTF_USESTDHANDLES or STARTF_USESHOWWINDOW; ! OrgEnvPath := GetEnvironmentVariable('PATH'); ! if EnvPath <> '' then ! SetEnvironmentVariable('PATH', Pointer(EnvPath)); ! try ! if CreateProcess(nil, PChar(App + ' ' + Args), @SecAttrib, nil, True, ! CREATE_SUSPENDED, nil, PChar(Dir), StartupInfo, ProcessInfo) then ! begin ! {if InjectDll then begin ! SharedGetMem(PipeP, 'Local\dcc32Hook_StatusPipe' + IntToStr(ProcessInfo.dwProcessId), SizeOf(THandle)); ! if Assigned(PipeP) then begin ! try ! PipeP^ := WriteStatusPipe; ! InjectHookDll(ProcessInfo.dwProcessId, ExtractFilePath(ParamStr(0)) + 'dcc32Hook.dll', False); ! finally ! SharedFreeMem(PipeP); ! end; ! end; ! end;} ! ResumeThread(ProcessInfo.hThread); ! ! CloseHandle(ProcessInfo.hThread); ! try ! while (WaitForSingleObject(ProcessInfo.hProcess, 80) = WAIT_TIMEOUT) and (not Aborted) do ! begin ! ProcessInput(hRead, Line, CaptureLine); ! if ReadStatusPipe <> 0 then ! ProcessInput(ReadStatusPipe, StatusLine, CaptureStatusLine); ! if Assigned(OnIdle) then ! OnIdle(nil); ! end; ! ProcessInput(hRead, Line, CaptureLine); ! if (Line <> '') and Assigned(CaptureLine) then ! CaptureLine(Line, Aborted); ! if ReadStatusPipe <> 0 then ! ProcessInput(ReadStatusPipe, StatusLine, CaptureStatusLine); ! if (StatusLine <> '') and Assigned(CaptureStatusLine) then ! CaptureStatusLine(StatusLine, Aborted); ! if Aborted then ! begin ! if CtrlCAbort then ! begin ! GenerateConsoleCtrlEvent(CTRL_C_EVENT, ProcessInfo.dwProcessId); ! if WaitForSingleObject(ProcessInfo.hProcess, 500) = WAIT_TIMEOUT then ! TerminateProcess(ProcessInfo.hProcess, Cardinal(1)); ! end ! else TerminateProcess(ProcessInfo.hProcess, Cardinal(1)); ! end; ! GetExitCodeProcess(ProcessInfo.hProcess, Cardinal(Result)); ! finally ! CloseHandle(ProcessInfo.hProcess); end; ! end ! else ! Result := -1; ! finally ! if EnvPath <> '' then ! SetEnvironmentVariable('PATH', Pointer(OrgEnvPath)); end; + finally + if WriteStatusPipe <> 0 then + CloseHandle(WriteStatusPipe); + if ReadStatusPipe <> 0 then + CloseHandle(ReadStatusPipe); + CloseHandle(hAbortRead); + CloseHandle(hAbortWrite); end; finally *************** *** 179,181 **** --- 227,236 ---- end; + procedure NoHooking; + begin + end; + + exports + NoHooking; // prevent DllInjection to hook this process + end. Index: JVCLConfiguration.pas =================================================================== RCS file: /cvsroot/jvcl/dev/JVCL3/install/JVCLInstall/Helpers/JVCLConfiguration.pas,v retrieving revision 1.7 retrieving revision 1.8 diff -C2 -d -r1.7 -r1.8 *** JVCLConfiguration.pas 5 Jan 2005 00:06:37 -0000 1.7 --- JVCLConfiguration.pas 28 Feb 2006 22:40:18 -0000 1.8 *************** *** 296,300 **** --- 296,311 ---- procedure TJVCLConfig.SaveToFile(const FileName: String); + var + Lines: TStrings; begin + Lines := TStringList.Create; + try + if FileExists(FileName) then + Lines.LoadFromFile(FileName); + if Lines.Text = Text then // no changes + Exit; + finally + Lines.Free; + end; FileSetReadOnly(Filename, False); inherited SaveToFile(FileName); |