diff --git a/BeefTools/RunAndWait/RunAndWait.cpp b/BeefTools/RunAndWait/RunAndWait.cpp index d5d7b63a..6201356d 100644 --- a/BeefTools/RunAndWait/RunAndWait.cpp +++ b/BeefTools/RunAndWait/RunAndWait.cpp @@ -120,50 +120,59 @@ int main() std::string cmdLine = useCmdLineStr; - PROCESS_INFORMATION processInfo; + for (int pass = 0; pass < 2; pass++) + { + PROCESS_INFORMATION processInfo; - STARTUPINFOA si; - ZeroMemory(&si, sizeof(si)); - si.cb = sizeof(si); - memset(&processInfo, 0, sizeof(processInfo)); + STARTUPINFOA si; + ZeroMemory(&si, sizeof(si)); + si.cb = sizeof(si); + memset(&processInfo, 0, sizeof(processInfo)); - si.hStdInput = GetStdHandle(STD_INPUT_HANDLE); + si.hStdInput = GetStdHandle(STD_INPUT_HANDLE); - HANDLE stdOut; - CreatePipe(stdOut, si.hStdOutput, false); - - HANDLE stdErr; - CreatePipe(stdErr, si.hStdError, false); + HANDLE stdOut; + CreatePipe(stdOut, si.hStdOutput, false); - si.dwFlags = STARTF_USESTDHANDLES; + HANDLE stdErr; + CreatePipe(stdErr, si.hStdError, false); - DWORD startTick = GetTickCount(); - BOOL worked = CreateProcessA(NULL, (char*)cmdLine.c_str(), NULL, NULL, TRUE, - flags, envPtr, NULL, &si, &processInfo); + si.dwFlags = STARTF_USESTDHANDLES; - ::CloseHandle(si.hStdOutput); - ::CloseHandle(si.hStdError); + DWORD startTick = GetTickCount(); + BOOL worked = CreateProcessA(NULL, (char*)cmdLine.c_str(), NULL, NULL, TRUE, + flags, envPtr, NULL, &si, &processInfo); - if (!worked) - return 1; + ::CloseHandle(si.hStdOutput); + ::CloseHandle(si.hStdError); - DWORD threadId; - ProcParams stdOutParams = { stdOut, GetStdHandle(STD_OUTPUT_HANDLE) }; - HANDLE stdOutThread = ::CreateThread(NULL, (SIZE_T)128*1024, (LPTHREAD_START_ROUTINE)ReadProc, (void*)&stdOutParams, 0, &threadId); + if (!worked) + return 1; - ProcParams stdErrParams = { stdErr, GetStdHandle(STD_ERROR_HANDLE) }; - HANDLE stdErrThread = ::CreateThread(NULL, (SIZE_T)128 * 1024, (LPTHREAD_START_ROUTINE)ReadProc, (void*)&stdErrParams, 0, &threadId); + DWORD threadId; + ProcParams stdOutParams = { stdOut, GetStdHandle(STD_OUTPUT_HANDLE) }; + HANDLE stdOutThread = ::CreateThread(NULL, (SIZE_T)128 * 1024, (LPTHREAD_START_ROUTINE)ReadProc, (void*)&stdOutParams, 0, &threadId); - while (true) - { - if (::WaitForSingleObject(processInfo.hProcess, 20) == WAIT_OBJECT_0) - break; + ProcParams stdErrParams = { stdErr, GetStdHandle(STD_ERROR_HANDLE) }; + HANDLE stdErrThread = ::CreateThread(NULL, (SIZE_T)128 * 1024, (LPTHREAD_START_ROUTINE)ReadProc, (void*)&stdErrParams, 0, &threadId); + + while (true) + { + if (::WaitForSingleObject(processInfo.hProcess, 20) == WAIT_OBJECT_0) + break; + } + ::WaitForSingleObject(stdOutThread, INFINITE); + ::WaitForSingleObject(stdErrThread, INFINITE); + + DWORD exitCode = 0; + ::GetExitCodeProcess(processInfo.hProcess, &exitCode); + + printf("Exit code: %d\n", exitCode); + if ((exitCode == 0) || (pass == 1)) + return exitCode; + + printf("FAILED! Starting second attempt.\n"); } - ::WaitForSingleObject(stdOutThread, INFINITE); - ::WaitForSingleObject(stdErrThread, INFINITE); - DWORD exitCode = 0; - ::GetExitCodeProcess(processInfo.hProcess, &exitCode); - - return exitCode; + return 0; } \ No newline at end of file diff --git a/BeefTools/RunAndWait/RunAndWait.vcxproj b/BeefTools/RunAndWait/RunAndWait.vcxproj index 745fc383..56723c07 100644 --- a/BeefTools/RunAndWait/RunAndWait.vcxproj +++ b/BeefTools/RunAndWait/RunAndWait.vcxproj @@ -23,32 +23,32 @@ {BE0C7160-375C-4164-8388-BFCC6DAA7828} Win32Proj RunAndWait - 10.0.16299.0 + 10.0 Application true - v141 + v143 Unicode Application false - v141 + v143 true Unicode Application true - v141 + v143 Unicode Application false - v141 + v143 true Unicode @@ -151,9 +151,9 @@ true - + - + diff --git a/bin/RunAndWait.exe b/bin/RunAndWait.exe index a42fac1a..3d510f33 100644 Binary files a/bin/RunAndWait.exe and b/bin/RunAndWait.exe differ