Index: /trunk/src/VBox/Runtime/r3/win/process-win.cpp
===================================================================
--- /trunk/src/VBox/Runtime/r3/win/process-win.cpp	(revision 30064)
+++ /trunk/src/VBox/Runtime/r3/win/process-win.cpp	(revision 30065)
@@ -328,7 +328,7 @@
 
 
-static BOOL rtProcFindProcessByName(const char *pszName, PSID pSID, PHANDLE phToken)
-{
-    AssertPtr(pszName);
+static BOOL rtProcFindProcessByName(const char * const *papszNames, PSID pSID, PHANDLE phToken)
+{
+    AssertPtr(papszNames);
     AssertPtr(pSID);
     AssertPtr(phToken);
@@ -360,22 +360,27 @@
                     if (hSnap != INVALID_HANDLE_VALUE)
                     {
-                        PROCESSENTRY32 procEntry;
-                        procEntry.dwSize = sizeof(PROCESSENTRY32);
-                        if (pfnProcess32First(hSnap, &procEntry))
+                        for (size_t i = 0; papszNames[i] && !fFound; i++)
                         {
-                            do
-                            {
-                                if (   _stricmp(procEntry.szExeFile, pszName) == 0
-                                    && RT_SUCCESS(rtProcGetProcessHandle(procEntry.th32ProcessID, pSID, phToken)))
+                            PROCESSENTRY32 procEntry;
+                            procEntry.dwSize = sizeof(PROCESSENTRY32);
+                            if (pfnProcess32First(hSnap, &procEntry))
+                            {   
+                                do
                                 {
-                                    fFound = TRUE;
-                                }
-                            } while (pfnProcess32Next(hSnap, &procEntry) && !fFound);
+                                    if (   _stricmp(procEntry.szExeFile, papszNames[i]) == 0
+                                        && RT_SUCCESS(rtProcGetProcessHandle(procEntry.th32ProcessID, pSID, phToken)))
+                                    {
+                                        fFound = TRUE;
+                                    }
+                                } while (pfnProcess32Next(hSnap, &procEntry) && !fFound);
+                            }
+                            else /* Process32First */
+                                dwErr = GetLastError();
+                            if (FAILED(dwErr))
+                                break;
                         }
-                        else /* Process32First */
-                            dwErr = GetLastError();
                         CloseHandle(hSnap);
                     }
-                    else /* hSnap =! INVALID_HANDLE_VALUE */
+                    else /* hSnap == INVALID_HANDLE_VALUE */
                         dwErr = GetLastError();
                 }
@@ -406,30 +411,35 @@
                         if (pfnEnumProcesses(dwPIDs, sizeof(dwPIDs), &cbBytes))
                         {
-                            for (DWORD dwIdx = 0; dwIdx < cbBytes/sizeof(DWORD) && !fFound; dwIdx++)
+                            for (size_t i = 0; papszNames[i] && !fFound; i++)
                             {
-                                HANDLE hProc = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ,
-                                                           FALSE, dwPIDs[dwIdx]);
-                                if (hProc)
+                                for (DWORD dwIdx = 0; dwIdx < cbBytes/sizeof(DWORD) && !fFound; dwIdx++)
                                 {
-                                    char *pszProcName = NULL;
-                                    DWORD dwSize = 128;
-                                    do
+                                    HANDLE hProc = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ,
+                                                               FALSE, dwPIDs[dwIdx]);
+                                    if (hProc)
                                     {
-                                        RTMemRealloc(pszProcName, dwSize);
-                                        if (pfnGetModuleBaseName(hProc, 0, pszProcName, dwSize) == dwSize)
-                                            dwSize += 128;
-                                    } while (GetLastError() == ERROR_INSUFFICIENT_BUFFER);
-
-                                    if (pszProcName)
-                                    {
-                                        if (   _stricmp(pszProcName, pszName) == 0
-                                            && RT_SUCCESS(rtProcGetProcessHandle(dwPIDs[dwIdx], pSID, phToken)))
+                                        char *pszProcName = NULL;
+                                        DWORD dwSize = 128;
+                                        do
                                         {
-                                            fFound = TRUE;
+                                            RTMemRealloc(pszProcName, dwSize);
+                                            if (pfnGetModuleBaseName(hProc, 0, pszProcName, dwSize) == dwSize)
+                                                dwSize += 128;
+                                            if (dwSize > _4K) /* Play safe. */
+                                                break;
+                                        } while (GetLastError() == ERROR_INSUFFICIENT_BUFFER);
+    
+                                        if (pszProcName)
+                                        {
+                                            if (   _stricmp(pszProcName, papszNames[i]) == 0
+                                                && RT_SUCCESS(rtProcGetProcessHandle(dwPIDs[dwIdx], pSID, phToken)))
+                                            {
+                                                fFound = TRUE;
+                                            }
                                         }
+                                        if (pszProcName)
+                                            RTStrFree(pszProcName);
+                                        CloseHandle(hProc);
                                     }
-                                    if (pszProcName)
-                                        RTStrFree(pszProcName);
-                                    CloseHandle(hProc);
                                 }
                             }
@@ -587,10 +597,22 @@
                         && IsValidSid(pSID))
                     {
-                        fFound = rtProcFindProcessByName(
+                        /* Array of process names we want to look for. */
+                        char *papszProcNames[] = 
 #ifdef VBOX
-                                                         "VBoxTray.exe",
+                        /*
+                         * Add lookup for "explorer.exe" as a fallback in case the VBox
+                         * Guest Additions are not (yet) installed, but prefer looking
+                         * up "VBoxTray.exe" in the first place.
+                         */
+                            { { "VBoxTray.exe" },
+                              { "explorer.exe" },
+                              NULL 
+                            };
 #else
-                                                         "explorer.exe"
-#endif
+                            { { "explorer.exe" },
+                              NULL 
+                            };
+#endif                        
+                        fFound = rtProcFindProcessByName(papszProcNames,
                                                          pSID, &hTokenUserDesktop);
                     }
