Index: /trunk/src/VBox/Main/GuestImpl.cpp
===================================================================
--- /trunk/src/VBox/Main/GuestImpl.cpp	(revision 33722)
+++ /trunk/src/VBox/Main/GuestImpl.cpp	(revision 33723)
@@ -258,9 +258,30 @@
                                                         ComSafeArrayAsInParam(args),
                                                         ComSafeArrayAsInParam(env),
-                                                        Bstr("").raw() /* Username */,
+                                                        Bstr("").raw() /* Username. */,
                                                         Bstr("").raw() /* Password */,
-                                                        10 * 1000 /* Wait 10s for getting the process started */,
-                                                        &uPID, progressCopy.asOutParam());
-                    if (SUCCEEDED(rc))
+                                                        5 * 1000 /* Wait 10s for getting the process started. */,
+                                                        &uPID, progressCopy.asOutParam(), &vrc);
+                    if (RT_FAILURE(vrc))
+                    {
+                        switch (vrc)
+                        {
+                            /* If we got back VERR_INVALID_PARAMETER we're running an old(er) Guest Additions version
+                             * (< 4.0) which does not support automatic updating and/or has not the internal tool "vbox_cat". */
+                            case VERR_INVALID_PARAMETER:
+                                rc = setError(VBOX_E_NOT_SUPPORTED,
+                                              tr("Currently installed Guest Additions don't support automatic updating, please update them manually"));
+                                break;
+                            /* Getting back a VERR_TIMEOUT basically means that either VBoxService on the guest does not run (anymore) or that
+                             * no Guest Additions (on a supported automatic updating OS) are installed at all. */
+                            case VERR_TIMEOUT:
+                                rc = setError(VBOX_E_NOT_SUPPORTED,
+                                              tr("Guest Additions seem not to be installed on the guest or are not responding, please update them manually"));
+                                break;
+
+                            default:
+                                break;
+                        }
+                    }
+                    else
                     {
                         if (aTask->progress)
@@ -362,6 +383,6 @@
                                                     Bstr("").raw() /* Username */,
                                                     Bstr("").raw() /* Password */,
-                                                    10 * 1000 /* Wait 10s for getting the process started */,
-                                                    &uPID, progressInstaller.asOutParam());
+                                                    5 * 1000 /* Wait 5s for getting the process started */,
+                                                    &uPID, progressInstaller.asOutParam(), &vrc);
                 if (SUCCEEDED(rc))
                 {
@@ -1456,5 +1477,5 @@
     return executeProcessInternal(aCommand, aFlags, ComSafeArrayInArg(aArguments),
                                   ComSafeArrayInArg(aEnvironment),
-                                  aUserName, aPassword, aTimeoutMS, aPID, aProgress);
+                                  aUserName, aPassword, aTimeoutMS, aPID, aProgress, NULL /* rc */);
 #endif
 }
@@ -1463,5 +1484,5 @@
                                       ComSafeArrayIn(IN_BSTR, aArguments), ComSafeArrayIn(IN_BSTR, aEnvironment),
                                       IN_BSTR aUserName, IN_BSTR aPassword,
-                                      ULONG aTimeoutMS, ULONG *aPID, IProgress **aProgress)
+                                      ULONG aTimeoutMS, ULONG *aPID, IProgress **aProgress, int *pRC)
 {
 /** @todo r=bird: Eventually we should clean up all the timeout parameters
@@ -1481,4 +1502,6 @@
             && !(aFlags & ExecuteProcessFlag_WaitForProcessStartOnly))
         {
+            if (pRC)
+                *pRC = VERR_INVALID_PARAMETER;
             return setError(E_INVALIDARG, tr("Unknown flags (%#x)"), aFlags);
         }
@@ -1508,5 +1531,5 @@
                                 Bstr(tr("Starting process ...")).raw());    /* Description of first stage. */
         }
-        if (FAILED(rc)) return rc;
+        ComAssertRC(rc);
 
         /*
@@ -1765,8 +1788,11 @@
         if (RT_FAILURE(vrc))
         {
-            if (!Utf8UserName.isEmpty()) /* Skip logging internal calls. */
+            if (!pRC) /* Skip logging internal calls. */
                 LogRel(("Executing guest process \"%s\" as user \"%s\" failed with %Rrc\n",
                         Utf8Command.c_str(), Utf8UserName.c_str(), vrc));
         }
+
+        if (pRC)
+            *pRC = vrc;
     }
     catch (std::bad_alloc &)
@@ -2308,5 +2334,5 @@
                                             Bstr(Utf8UserName).raw(),
                                             Bstr(Utf8Password).raw(),
-                                            10 * 1000 /* Wait 10s for getting the process started */,
+                                            5 * 1000 /* Wait 5s for getting the process started. */,
                                             &uPID, execProgress.asOutParam());
                     }
Index: /trunk/src/VBox/Main/include/GuestImpl.h
===================================================================
--- /trunk/src/VBox/Main/include/GuestImpl.h	(revision 33722)
+++ /trunk/src/VBox/Main/include/GuestImpl.h	(revision 33723)
@@ -111,5 +111,5 @@
                                    ComSafeArrayIn(IN_BSTR, aArguments), ComSafeArrayIn(IN_BSTR, aEnvironment),
                                    IN_BSTR aUserName, IN_BSTR aPassword,
-                                   ULONG aTimeoutMS, ULONG *aPID, IProgress **aProgress);
+                                   ULONG aTimeoutMS, ULONG *aPID, IProgress **aProgress, int *pRC);
     void setAdditionsInfo(Bstr aInterfaceVersion, VBOXOSTYPE aOsType);
     void setAdditionsInfo2(Bstr aAdditionsVersion, Bstr aVersionName, Bstr aRevision);
