VirtualBox

Changeset 33558 in vbox


Ignore:
Timestamp:
Oct 28, 2010 1:37:37 PM (14 years ago)
Author:
vboxsync
Message:

Guest Copy/Guest Additions: First working version of host-triggered Guest Additions updates.

Location:
trunk
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • trunk/include/VBox/HostServices/GuestControlSvc.h

    r33492 r33558  
    7676#define INPUT_FLAG_EOF              RT_BIT(0)
    7777
     78/*
     79 * Internal tools built into VBoxService which are
     80 * used in order to accomplish tasks host<->guest.
     81 */
     82#define VBOXSERVICE_TOOL_CAT        "vbox_cat"
     83
    7884/**
    7985 * Input status, reported by the client.
  • trunk/src/VBox/Additions/common/VBoxService/VBoxServiceControlExec.cpp

    r33492 r33558  
    11331133        else if (RTStrStr(pszExec, "vbox_") == pszExec)
    11341134        {
    1135             /* We want to use the internal toolbox. */
     1135            /* We want to use the internal toolbox (all internal
     1136             * tools are starting with "vbox_" (e.g. "vbox_cat"). */
    11361137            pszCmdTool = RTStrDup(szVBoxService);
    11371138            rc = VBoxServiceControlExecPrepareToolboxArgv(pszCmdTool, papszArgs, &papszArgsTool);
     
    11581159#endif
    11591160
     1161    /* If no user name specified run with current credentials.
     1162     * This is prohibited via official Main API! */
     1163    if (!strlen(pszAsUser))
     1164        fFlags &= ~RTPROC_FLAGS_SERVICE;
     1165
    11601166    /* Do normal execution. */
    11611167    rc = RTProcCreateEx(pszExec, papszArgs, hEnv, fFlags,
    1162                         phStdIn, phStdOut, phStdErr, pszAsUser,
    1163                         pszPassword, phProcess);
     1168                        phStdIn, phStdOut, phStdErr,
     1169                        strlen(pszAsUser) ? pszAsUser : NULL,
     1170                        strlen(pszPassword) ? pszPassword : NULL,
     1171                        phProcess);
    11641172    return rc;
    11651173}
  • trunk/src/VBox/Frontends/VBoxManage/VBoxManageGuestCtrl.cpp

    r33464 r33558  
    453453                        }
    454454                    }
    455 
    456 #if 0
    457                     static int sent = 0;
    458                     if (sent < 1)
    459                     {
    460                         RTISOFSFILE file;
    461                         int vrc = RTIsoFsOpen(&file, "c:\\Downloads\\VBoxGuestAdditions_3.2.8.iso");
    462                         if (RT_SUCCESS(vrc))
    463                         {
    464                             uint32_t cbOffset;
    465                             size_t cbLength;
    466                             vrc = RTIsoFsGetFileInfo(&file, "VBOXWINDOWSADDITIONS_X86.EXE", &cbOffset, &cbLength);
    467                             //vrc = RTIsoFsGetFileInfo(&file, "32BIT/README.TXT", &cbOffset, &cbLength);
    468                             if (   RT_SUCCESS(vrc)
    469                                 && cbOffset
    470                                 && cbLength)
    471                             {
    472                                 vrc = RTFileSeek(file.file, cbOffset, RTFILE_SEEK_BEGIN, NULL);
    473 
    474                                 size_t cbRead;
    475                                 size_t cbToRead;
    476                                 SafeArray<BYTE> aInputData(_64K);
    477                                 while (   cbLength
    478                                        && RT_SUCCESS(vrc))
    479                                 {
    480                                     cbToRead = RT_MIN(cbLength, _64K);
    481                                     vrc = RTFileRead(file.file, (uint8_t*)aInputData.raw(), cbToRead, &cbRead);
    482                                     if (   cbRead
    483                                         && RT_SUCCESS(vrc))
    484                                     {
    485                                         aInputData.resize(cbRead);
    486 
    487                                         /* Did we reach the end of the content
    488                                          * we want to transfer (last chunk)? */
    489                                         ULONG uFlags = ProcessInputFlag_None;
    490                                         if (cbLength < _64K)
    491                                         {
    492                                             RTPrintf("Last!\n");
    493                                             uFlags |= ProcessInputFlag_EndOfFile;
    494                                         }
    495 
    496                                         ULONG uBytesWritten;
    497                                         rc = guest->SetProcessInput(uPID, uFlags,
    498                                                                     ComSafeArrayAsInParam(aInputData), &uBytesWritten);
    499                                         if (FAILED(rc))
    500                                         {
    501                                             /* If we got a VBOX_E_IPRT error we handle the error in a more gentle way
    502                                              * because it contains more accurate info about what went wrong. */
    503                                             ErrorInfo info(guest, COM_IIDOF(IGuest));
    504                                             if (info.isFullAvailable())
    505                                             {
    506                                                 if (rc == VBOX_E_IPRT_ERROR)
    507                                                     RTMsgError("%ls.", info.getText().raw());
    508                                                 else
    509                                                     RTMsgError("%ls (%Rhrc).", info.getText().raw(), info.getResultCode());
    510                                             }
    511                                             break;
    512                                         }
    513                                         else
    514                                         {
    515                                             //Assert(uTransfered == cbRead);
    516                                             cbLength -= uBytesWritten;
    517                                             RTPrintf("Left: %u\n", cbLength);
    518                                         }
    519                                     }
    520                                 }
    521                                 RTPrintf("Finished\n");
    522                             }
    523                             RTIsoFsClose(&file);
    524                         }
    525                     }
    526                     sent++;
    527 #endif
    528455                    if (cbOutputData <= 0) /* No more output data left? */
    529456                    {
  • trunk/src/VBox/Frontends/VirtualBox/src/globals/VBoxProblemReporter.cpp

    r33540 r33558  
    292292    VBoxProgressDialog progressDlg (aProgress, aTitle, aMinDuration, aParent ? aParent : mainWindowShown());
    293293
    294     /* run the dialog with the 100 ms refresh interval */
     294    /* Run the dialog with the 350 ms refresh interval. */
    295295    progressDlg.run (350);
    296296
     
    23872387    message (aParent ? aParent : mainWindowShown(),
    23882388             Error,
    2389              tr ("Failed to update Guest Additions."),
     2389             tr ("Failed to update Guest Additions. The Guest Additions installation image will be mounted to provide a manual installation."),
    23902390             formatErrorInfo (aProgress.GetErrorInfo()));
    23912391}
  • trunk/src/VBox/Frontends/VirtualBox/src/runtime/UISession.cpp

    r33540 r33558  
    356356    CVirtualBox vbox = vboxGlobal().virtualBox();
    357357
    358 #ifdef DEBUG_andy
     358    /*
     359     * Flag indicating whether we want to do the usual .ISO mounting or not.
     360     * First try updating the Guest Additions directly without mounting the .ISO.
     361     */
     362    bool fDoMount = false;
    359363    /*
    360364     * If the already installed Guest Additions indicate a
     
    375379    {
    376380#ifdef DEBUG_andy
    377         CProgress progressInstall = guest.UpdateGuestAdditions("c:\\Downloads\\VBoxGuestAdditions_3.2.8.iso");
     381        CProgress progressInstall = guest.UpdateGuestAdditions("c:\\Downloads\\VBoxGuestAdditions-r67158.iso");
    378382#else
    379383        CProgress progressInstall = guest.UpdateGuestAdditions(strSource);
    380384#endif
    381 #if 0
    382385        bool fResult = guest.isOk();
    383386        if (fResult)
    384387        {
    385             vboxProblem().showModalProgressDialog(progressInstall, tr("Updating Guest Additions ..."), mainMachineWindow());
     388            vboxProblem().showModalProgressDialog(progressInstall, tr("Install"),
     389                                                  mainMachineWindow(), 0 /* No delay */);
    386390            if (progressInstall.GetCanceled())
    387391                return;
     
    389393            {
    390394                vboxProblem().cannotUpdateGuestAdditions(progressInstall, mainMachineWindow());
    391                 return;
     395                fDoMount = true; /* Since automatic updating failed, fall back to .ISO mounting. */
    392396            }
    393397        }
    394 #endif
    395     }
    396     else /* Fallback to only mounting the .ISO file. */
    397     {
    398 #endif /* DEBUG_andy */
     398    }
     399    else
     400    {
     401        /* Running guest OS not suitable (yet) for automatic updating,
     402         * fall back to .ISO mounting. */
     403        fDoMount = true;
     404    }
     405
     406    if (fDoMount) /* Fallback to only mounting the .ISO file. */
     407    {
    399408        QString strUuid;
    400409        CMedium image = vbox.FindMedium(strSource, KDeviceType_DVD);
     
    471480        else
    472481            vboxProblem().cannotMountGuestAdditions(machine.GetName());
    473 #ifdef DEBUG_andy
    474     }
    475 #endif /* DEBUG_andy */
     482    }
    476483}
    477484
  • trunk/src/VBox/Main/GuestImpl.cpp

    r33540 r33558  
    5454    enum TaskType
    5555    {
     56        /** Update Guest Additions by directly copying the required installer
     57         *  off the .ISO file, transfer it to the guest and execute the installer
     58         *  with system priviledges. */
    5659        UpdateGuestAdditions = 100
    5760    };
     
    148151    if (FAILED(autoCaller.rc())) return autoCaller.rc();
    149152
    150     AutoWriteLock appLock(this COMMA_LOCKVAL_SRC_POS);
     153    /*
     154     * Do *not* take a write lock here since we don't (and won't)
     155     * touch any class-specific data (of IGuest) here - only the member functions
     156     * which get called here can do that.
     157     */
    151158
    152159    HRESULT rc = S_OK;
     
    202209            }
    203210
    204             /** @todo Only Windows! */
     211            /** @todo Only Windows! Don't use percent (like %TEMP%) env vars -- Windows
     212             *        will quote it like "%TEMP%" which results in a *not* working command
     213             *        line! */
    205214            Utf8Str strInstallerPath = "C:\\Windows\\VBoxWindowsAdditions.exe";
    206215
     
    214223
    215224                    default:
    216                         rc = setError(VBOX_E_IPRT_ERROR, tr("An unknown error occured, rc=%Rrc"), vrc);
     225                        rc = setError(VBOX_E_IPRT_ERROR, tr("An unknown error occured (%Rrc)"), vrc);
    217226                        break;
    218227                }
     
    220229            else
    221230            {
    222                 /* Okay, we're ready to transfer the bits! */
     231                /* Okay, we're ready to start our copy routine on the guest! */
    223232                if (aTask->progress)
    224233                    aTask->progress->SetCurrentOperationProgress(15);
     
    231240                if (RTStrPrintf(szOutput, sizeof(szOutput), "--output=%s", strInstallerPath.c_str()))
    232241                {
    233                     args.push_back(Bstr("vbox_cat").raw()); /* The actual (internal) tool to use (as argv[0]). */
    234                     args.push_back(Bstr(szOutput).raw());   /* We want to write a file ... */
     242                    args.push_back(Bstr(VBOXSERVICE_TOOL_CAT).raw()); /* The actual (internal) tool to use (as argv[0]). */
     243                    args.push_back(Bstr(szOutput).raw());             /* We want to write a file ... */
    235244                }
    236245                else
     
    247256                     * system rights, no username/password specified).
    248257                     */
    249                     rc = pGuest->executeProcessInternal(Bstr("vbox_cat").raw(),
     258                    rc = pGuest->executeProcessInternal(Bstr(VBOXSERVICE_TOOL_CAT).raw(),
    250259                                                        ExecuteProcessFlag_WaitForProcessStartOnly,
    251260                                                        ComSafeArrayAsInParam(args),
     
    270279                               && !fCompleted)
    271280                        {
     281                            /* cbLength contains remaining bytes of our installer file
     282                             * opened above to read. */
    272283                            cbToRead = RT_MIN(cbLength, _64K);
    273                             vrc = RTFileRead(iso.file, (uint8_t*)aInputData.raw(), cbToRead, &cbRead);
    274                             if (   cbRead
    275                                 && RT_SUCCESS(vrc))
     284                            if (cbToRead)
    276285                            {
    277                                 aInputData.resize(cbRead);
    278 
    279                                 /* Did we reach the end of the content
    280                                  * we want to transfer (last chunk)? */
    281                                 ULONG uFlags = ProcessInputFlag_None;
    282                                 if (cbRead < _64K)
    283                                     uFlags |= ProcessInputFlag_EndOfFile;
    284 
    285                                 /* Transfer the current chunk ... */
    286                                 ULONG uBytesWritten;
    287                                 rc = SetProcessInput(uPID, uFlags,
    288                                                      ComSafeArrayAsInParam(aInputData), &uBytesWritten);
    289                                 if (FAILED(rc))
     286                                vrc = RTFileRead(iso.file, (uint8_t*)aInputData.raw(), cbToRead, &cbRead);
     287                                if (   cbRead
     288                                    && RT_SUCCESS(vrc))
    290289                                {
    291                                     break;
    292                                 }
    293                                 else
    294                                 {
     290                                    /* Did we reach the end of the content
     291                                     * we want to transfer (last chunk)? */
     292                                    ULONG uFlags = ProcessInputFlag_None;
     293                                    if (cbRead < _64K)
     294                                    {
     295                                        uFlags |= ProcessInputFlag_EndOfFile;
     296                                        if (cbRead > 0) /* Don't allow an empty array! */
     297                                            aInputData.resize(cbRead); /* Adjust array size (less than 64K read). */
     298                                    }
     299
     300                                    /* Transfer the current chunk ... */
     301                                    ULONG uBytesWritten;
     302                                    rc = SetProcessInput(uPID, uFlags,
     303                                                         ComSafeArrayAsInParam(aInputData), &uBytesWritten);
     304                                    if (FAILED(rc))
     305                                        break;
     306
     307                                    Assert(cbLength >= uBytesWritten);
    295308                                    cbLength -= uBytesWritten;
    296                                 }
    297 
    298                                 /* Progress canceled by Main API? */
    299                                 if (   SUCCEEDED(progressCopy->COMGETTER(Canceled(&fCanceled)))
    300                                     && fCanceled)
    301                                 {
    302                                     break;
     309
     310                                    /* Progress canceled by Main API? */
     311                                    if (   SUCCEEDED(progressCopy->COMGETTER(Canceled(&fCanceled)))
     312                                        && fCanceled)
     313                                    {
     314                                        break;
     315                                    }
    303316                                }
    304317                            }
     
    324337                /** @todo Only Windows! */
    325338                installerArgs.push_back(Bstr(strInstallerPath).raw()); /* The actual (internal) installer image (as argv[0]). */
    326                 installerArgs.push_back(Bstr("/S").raw());             /* We want to install in silent mode. */
    327                 installerArgs.push_back(Bstr("/l").raw());             /* ... and logging enabled. */
     339                /* Note that starting at Windows Vista the lovely session 0 separation applies:
     340                 * This means that if we run an application with the profile/security context
     341                 * of VBoxService (system rights!) we're not able to show any UI. */
     342                installerArgs.push_back(Bstr("/S").raw());      /* We want to install in silent mode. */
     343                installerArgs.push_back(Bstr("/l").raw());      /* ... and logging enabled. */
     344                /* Don't quit VBoxService during upgrade because it still is used for this
     345                 * piece of code we're in right now (that is, here!) ... */
     346                installerArgs.push_back(Bstr("/no_vboxservice_exit").raw());
    328347
    329348                /*
    330                  * Start built-in "vbox_cat" tool (inside VBoxService) to
    331                  * copy over/pipe the data into a file on the guest (with
    332                  * system rights, no username/password specified).
     349                 * Start the just copied over installer with system rights
     350                 * in silent mode on the guest.
    333351                 */
    334352                ComPtr<IProgress> progressInstaller;
     
    22642282                    if (RTStrPrintf(szOutput, sizeof(szOutput), "--output=%s", Utf8Dest.c_str()))
    22652283                    {
    2266                         args.push_back(Bstr("vbox_cat").raw()); /* The actual (internal) tool to use (as argv[0]). */
    2267                         args.push_back(Bstr(szOutput).raw());   /* We want to write a file ... */
     2284                        args.push_back(Bstr(VBOXSERVICE_TOOL_CAT).raw()); /* The actual (internal) tool to use (as argv[0]). */
     2285                        args.push_back(Bstr(szOutput).raw());             /* We want to write a file ... */
    22682286                    }
    22692287                    else
     
    22802298                         * actual copying, start the guest part now.
    22812299                         */
    2282                         rc = ExecuteProcess(Bstr("vbox_cat").raw(),
     2300                        rc = ExecuteProcess(Bstr(VBOXSERVICE_TOOL_CAT).raw(),
    22832301                                            ExecuteProcessFlag_WaitForProcessStartOnly,
    22842302                                            ComSafeArrayAsInParam(args),
     
    23772395        std::auto_ptr<TaskGuest> task(new TaskGuest(TaskGuest::UpdateGuestAdditions, this, progress));
    23782396
    2379         /* Assign data. */
     2397        /* Assign data - in that case aSource is the full path
     2398         * to the Guest Additions .ISO we want to mount. */
    23802399        task->strSource = (Utf8Str(aSource));
    23812400
Note: See TracChangeset for help on using the changeset viewer.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette