yeputons

Untitled

Apr 3rd, 2014
134
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Delphi 5.37 KB | None | 0 0
  1. function ExternalExecuteRedirect (const CmdStr, StartDirectory:string;
  2.          flags, TimeLimit, memorylimit:cardinal; infile, outfile, errfile:THandle;
  3.          var TimeUsed, MaxMemoryUsed:int64; var ReturnCode:cardinal; hProcess:PHandle = nil):cardinal;
  4. var SInfo:StartupInfo;
  5.     PInfo:Process_Information;
  6.     my_std_handle:array [1..StandardHandlesCount] of THandle;
  7.     my_console_mode:array [1..StandardHandlesCount] of cardinal;
  8.     i, eflags, olderrormode:cardinal;
  9.     handle:THandle;
  10.     CreateRes:boolean;
  11. begin
  12.   Result:=EXEC_FAIL;
  13.   fillchar (SInfo, sizeof (SInfo), 0);
  14.   SInfo.cb:=sizeof (SInfo);
  15.   if (flags and EXEC_FLAG_NEW_CONSOLE)<>0 then begin
  16.     SInfo.dwFlags:=STARTF_USESHOWWINDOW or STARTF_USESTDHANDLES;
  17.     SInfo.wShowWindow:=SW_MINIMIZE;
  18.     eflags:=CREATE_NEW_CONSOLE;
  19.   end else begin
  20.     SInfo.dwFlags:=STARTF_USESTDHANDLES;
  21.     if (flags and EXEC_FLAG_WINCALL)<>0 then eflags:=DETACHED_PROCESS
  22.                                         else eflags:=0;
  23.   end;
  24.   if (flags and EXEC_FLAG_NEW_PROCESS_GROUP)<>0 then
  25.     eflags:=eflags or CREATE_NEW_PROCESS_GROUP;
  26.   SInfo.hStdInput:=infile;
  27.   SInfo.hStdOutput:=outfile;
  28.   SInfo.hStdError:=errfile;
  29.  
  30.   if JudgeRunUser<>'' then begin
  31.     SInfo.lpDesktop:=PChar (''){PChar ('winsta0\default')}{@nullchar}{PChar ('bred')}{nil};
  32.   end;
  33.  
  34.   olderrormode:=SetErrorMode (SEM_FAILCRITICALERRORS or SEM_NOGPFAULTERRORBOX
  35.                               or SEM_NOOPENFILEERRORBOX);{error mode to inherit}
  36.   for i:=1 to StandardHandlesCount do begin
  37.     my_std_handle[i]:=GetStdHandle (HDLTypes [i]);
  38.     if not IsErrorHandle (my_std_handle[i]) then
  39.       if not GetConsoleMode (my_std_handle[i], my_console_mode[i]) then
  40.         my_std_handle[i]:=invalid_handle_value;
  41.   end;
  42.  
  43.   if hProcess <> nil then
  44.     hProcess^ := INVALID_HANDLE_VALUE;
  45.   if WaitForSingleObject (ExecAbortSemaphore, 0)=WAIT_OBJECT_0 then begin
  46.     RESULT:=EXEC_ABORT;
  47.     if (flags and EXEC_FLAG_UTILITY) = 0 then begin
  48.       if not IsErrorHandle(IServer_Process) then begin
  49.         writelog('Aborting IServer before starting contestant');
  50.         TerminateProcessWait (IServer_Process, $1000ffff);
  51.         IServer_Process := INVALID_HANDLE_VALUE;
  52.       end;
  53.     end;
  54.   end else begin
  55.     if (JudgeRunUser='') or (UtilityAdministrator and ((flags and EXEC_FLAG_UTILITY)<>0))
  56.                        then CreateRes:=CreateProcess (nil, PChar (CmdStr), nil, nil, true, eflags,
  57.                       nil, PChar (ExcludeTrailingPathDelimiter (
  58.                             ExpandFileName (StartDirectory))),
  59.                       SInfo, PInfo)
  60.                        else
  61.                             CreateRes:=CreateProcessAsUser (JudgeRunToken,
  62.                             nil, PChar (CmdStr), nil, nil, true, eflags,
  63.                             nil, PChar (ExcludeTrailingPathDelimiter (
  64.                             ExpandFileName (StartDirectory))),
  65.                       SInfo, PInfo);{begin
  66.                         CreateRes:=CreateProcessWithLogonW (JudgeRunUser,
  67.                           nil, JudgeRunUserPassword, 0, nil, CmdStr, nil, nil, true,
  68.                           eflags, ExpandFileName (StartDirectory), SInfo, PInfo);
  69.  
  70.  
  71.                       end;}
  72.     //writeln ('Create Result:  ', CreateRes);
  73.     //writeln ('GetLastError: ', GetLastError);
  74.     if (flags and EXEC_FLAG_CLOSE_HANDLES) <> 0 then begin
  75.       CloseHandle(infile);
  76.       CloseHandle(outfile);
  77.       CloseHandle(errfile);
  78.     end;
  79.     if CreateRes then begin
  80.       {1. open valid handle to process}
  81.       if (flags and (EXEC_FLAG_NEW_PROCESS_GROUP or EXEC_FLAG_NEW_CONSOLE or EXEC_FLAG_WINCALL))=0
  82.           then
  83.         handle:=OpenProcess (PROCESS_ALL_ACCESS, false,
  84.                                      PInfo.dwProcessId){windows 2000 bug}
  85.       else handle:=PInfo.hProcess;
  86.       if hProcess <> nil then
  87.         hProcess^ := handle;
  88.       {writeln (Startdirectory, ' ', cmdstr);
  89.       writeln (handle);
  90.       writeln (GetLastError);}
  91.       if IsErrorHandle (handle) then begin
  92.         {ABORT!!!}
  93.         writeln ('Could not get a valid handle to process');
  94.         TerminateProcess (PInfo.hProcess, $1000ffff);{may be it helps...}
  95.         CloseHandle (PInfo.hProcess);
  96.       end
  97.       else if (flags and EXEC_FLAG_NOWAIT) = 0 then begin
  98.         if (flags and EXEC_FLAG_UTILITY)<>0 then begin
  99.           Result:=WaitUtilityProcess (handle, flags, ReturnCode);
  100.           TimeUsed:=0;
  101.           MaxMemoryUsed:=0;
  102.         end else
  103.           Result:=WaitContestantProcess (handle, TimeLimit, MemoryLimit,
  104.                                          PInfo.dwProcessId, flags,
  105.                                          TimeUsed, MaxMemoryUsed, ReturnCode);
  106.  
  107.         {writeln (ReturnCode);}
  108.  
  109.  
  110.         if (flags and (EXEC_FLAG_NEW_PROCESS_GROUP or EXEC_FLAG_NEW_CONSOLE or EXEC_FLAG_WINCALL))=0
  111.             then
  112.           CloseHandle (handle); {different from provided}
  113.         CloseHandle (PInfo.hProcess);
  114.       end else begin
  115.         result := EXEC_OK;
  116.       end;
  117.       CloseHandle (PInfo.hThread);
  118.     end else begin
  119.       writeln ('Error: ', GetLastError);
  120.     end;
  121.   end;
  122.  
  123.   for i:=1 to StandardHandlesCount do
  124.     if not IsErrorHandle (my_std_handle[i]) then
  125.       if SetStdHandle (HDLTypes[i], my_std_handle[i]) then
  126.         SetConsoleMode (my_std_handle[i], my_console_mode[i]);
  127.   if ExecuteDelay>0 then Sleep (ExecuteDelay);
  128.   SetErrorMode (olderrormode);
  129. end;
Add Comment
Please, Sign In to add comment