int SessionTaskUpdateAdditions::runFile(GuestSession *pSession, GuestProcessStartupInfo &procInfo) { AssertPtrReturn(pSession, VERR_INVALID_POINTER); #ifdef VBOX_SERVICE_ENVARG_BUG GuestFsObjData objData; int rc = pSession->fileQueryInfoInternal(procInfo.mCommand, objData); if (RT_FAILURE(rc)) procInfo.mCommand = "C:\\Windows\\system32\\EMP" + procInfo.mCommand.substr(sizeof("%TEMP%\\") - sizeof(char)); #endif ComObjPtr<GuestProcess> pProcess; rc = pSession->processCreateExInteral(procInfo, pProcess); if (RT_SUCCESS(rc)) rc = pProcess->startProcess(); if (RT_SUCCESS(rc)) { LogRel(("Running %s ...\n", procInfo.mName.c_str())); GuestProcessWaitResult waitRes; rc = pProcess->waitFor(ProcessWaitForFlag_Terminate, 10 * 60 * 1000 /* 10 mins Timeout */, waitRes); if (waitRes.mResult == ProcessWaitResult_Terminate) { ProcessStatus_T procStatus; LONG exitCode; if ( ( SUCCEEDED(pProcess->COMGETTER(Status(&procStatus))) && procStatus != ProcessStatus_TerminatedNormally) || ( SUCCEEDED(pProcess->COMGETTER(ExitCode(&exitCode))) && exitCode != 0) ) { setProgressErrorMsg(VBOX_E_IPRT_ERROR, Utf8StrFmt(GuestSession::tr("Running %s failed with status %ld, exit code %ld"), procInfo.mName.c_str(), procStatus, exitCode)); rc = VERR_GENERAL_FAILURE; /* Fudge. */ } else /* Yay, success! */ { LogRel(("%s successfully completed\n", procInfo.mName.c_str())); } } else { if (RT_FAILURE(rc)) setProgressErrorMsg(VBOX_E_IPRT_ERROR, Utf8StrFmt(GuestSession::tr("Error while waiting running %s: %Rrc"), procInfo.mName.c_str(), rc)); else { setProgressErrorMsg(VBOX_E_IPRT_ERROR, pProcess->errorMsg()); rc = VERR_GENERAL_FAILURE; /* Fudge. */ } } } if (!pProcess.isNull()) pProcess->uninit(); return rc; }