int SessionTaskUpdateAdditions::copyFileToGuest(GuestSession *pSession, PRTISOFSFILE pISO, Utf8Str const &strFileSource, const Utf8Str &strFileDest, bool fOptional, uint32_t *pcbSize) { AssertPtrReturn(pSession, VERR_INVALID_POINTER); AssertPtrReturn(pISO, VERR_INVALID_POINTER); /* pcbSize is optional. */ uint32_t cbOffset; size_t cbSize; int rc = RTIsoFsGetFileInfo(pISO, strFileSource.c_str(), &cbOffset, &cbSize); if (RT_FAILURE(rc)) { if (fOptional) return VINF_SUCCESS; return rc; } Assert(cbOffset); Assert(cbSize); rc = RTFileSeek(pISO->file, cbOffset, RTFILE_SEEK_BEGIN, NULL); /* Copy over the Guest Additions file to the guest. */ if (RT_SUCCESS(rc)) { LogRel(("Copying Guest Additions installer file \"%s\" to \"%s\" on guest ...\n", strFileSource.c_str(), strFileDest.c_str())); if (RT_SUCCESS(rc)) { SessionTaskCopyTo *pTask = new SessionTaskCopyTo(pSession /* GuestSession */, &pISO->file, cbOffset, cbSize, strFileDest, CopyFileFlag_None); AssertPtrReturn(pTask, VERR_NO_MEMORY); ComObjPtr<Progress> pProgressCopyTo; rc = pSession->startTaskAsync(Utf8StrFmt(GuestSession::tr("Copying Guest Additions installer file \"%s\" to \"%s\" on guest"), mSource.c_str(), strFileDest.c_str()), pTask, pProgressCopyTo); if (RT_SUCCESS(rc)) { BOOL fCanceled = FALSE; HRESULT hr = pProgressCopyTo->WaitForCompletion(-1); if ( SUCCEEDED(pProgressCopyTo->COMGETTER(Canceled)(&fCanceled)) && fCanceled) { rc = VERR_GENERAL_FAILURE; /* Fudge. */ } else if (FAILED(hr)) { Assert(FAILED(hr)); rc = VERR_GENERAL_FAILURE; /* Fudge. */ } } } } /** @todo Note: Since there is no file locking involved at the moment, there can be modifications * between finished copying, the verification and the actual execution. */ /* Determine where the installer image ended up and if it has the correct size. */ if (RT_SUCCESS(rc)) { LogRel(("Verifying Guest Additions installer file \"%s\" ...\n", strFileDest.c_str())); GuestFsObjData objData; int64_t cbSizeOnGuest; rc = pSession->fileQuerySizeInternal(strFileDest, &cbSizeOnGuest); #ifdef VBOX_SERVICE_ENVARG_BUG if (RT_FAILURE(rc)) { /* Ugly hack: Because older Guest Additions have problems with environment variable expansion in parameters we have to check an alternative location on Windows. So check for "%TEMP%\" being "C:\\Windows\\system32\\EMP" actually. */ if (strFileDest.startsWith("%TEMP%\\", RTCString::CaseSensitive)) { Utf8Str strFileDestBug = "C:\\Windows\\system32\\EMP" + strFileDest.substr(sizeof("%TEMP%\\") - sizeof(char)); rc = pSession->fileQuerySizeInternal(strFileDestBug, &cbSizeOnGuest); } } #endif if ( RT_SUCCESS(rc) && cbSize == (uint64_t)cbSizeOnGuest) { LogRel(("Guest Additions installer file \"%s\" successfully verified\n", strFileDest.c_str())); } else { if (RT_SUCCESS(rc)) /* Size does not match. */ rc = VERR_BROKEN_PIPE; /** @todo FInd a better error. */ } if (RT_SUCCESS(rc)) { if (pcbSize) *pcbSize = cbSizeOnGuest; } } return rc; }