Index: /trunk/include/VBox/VBoxGuestLib.h
===================================================================
--- /trunk/include/VBox/VBoxGuestLib.h	(revision 23834)
+++ /trunk/include/VBox/VBoxGuestLib.h	(revision 23835)
@@ -404,4 +404,5 @@
 VBGLR3DECL(int)     VbglR3SetGuestCaps(uint32_t fOr, uint32_t fNot);
 VBGLR3DECL(int)     VbglR3WaitEvent(uint32_t fMask, uint32_t cMillies, uint32_t *pfEvents);
+VBGLR3DECL(int)     VbglR3GetAdditionsVersion(char **ppszVer, char **ppszRev);
 /** @} */
 
@@ -471,4 +472,11 @@
 VBGLR3DECL(int)     VbglR3GuestPropWait(uint32_t u32ClientId, const char *pszPatterns, void *pvBuf, uint32_t cbBuf, uint64_t u64Timestamp, uint32_t cMillies, char ** ppszName, char **ppszValue, uint64_t *pu64Timestamp, char **ppszFlags, uint32_t *pcbBufActual);
 /** @}  */
+
+/** @name Host version handling
+ * @{ */
+VBGLR3DECL(int)     VbglR3HostVersionCompare(const char *pszVer1, const char *pszVer2);
+VBGLR3DECL(bool)    VbglR3HostVersionCheckForUpdate(char **ppszHostVersion, char **ppszGuestVersion);
+VBGLR3DECL(int)     VbglR3HostVersionStore(const char* pszVer);
+/** @}  */
 # endif /* VBOX_WITH_GUEST_PROPS defined */
 
Index: /trunk/src/VBox/Additions/WINNT/VBoxTray/VBoxHostVersion.cpp
===================================================================
--- /trunk/src/VBox/Additions/WINNT/VBoxTray/VBoxHostVersion.cpp	(revision 23834)
+++ /trunk/src/VBox/Additions/WINNT/VBoxTray/VBoxHostVersion.cpp	(revision 23835)
@@ -27,157 +27,33 @@
 #include <VBox/VBoxGuestLib.h>
 
-/* Returns 0 if equal, 1 if Ver1 is greater, 2 if Ver2 is greater
- * Requires strings in form of "majorVer.minorVer.build" */
-/** @todo should be common code in the guest lib / headers */
-int VBoxCompareVersion (const char* pszVer1, const char* pszVer2)
-{
-    int rc = 0;
-    int iVer1Major, iVer1Minor, iVer1Build;
-    sscanf(pszVer1, "%d.%d.%d", &iVer1Major, &iVer1Minor, &iVer1Build);
-    int iVer2Major, iVer2Minor, iVer2Build;
-    sscanf(pszVer2, "%d.%d.%d", &iVer2Major, &iVer2Minor, &iVer2Build);
-
-    int iVer1Final = (iVer1Major * 10000) + (iVer1Minor * 100) + iVer1Build;
-    int iVer2Final = (iVer2Major * 10000) + (iVer2Minor * 100) + iVer2Build;
-
-    if (iVer1Final > iVer2Final)
-        rc = 1;
-    else if (iVer2Final > iVer1Final)
-        rc = 2;
-    return rc;
-}
 
 int VBoxCheckHostVersion ()
 {
-    int rc;
-    uint32_t uGuestPropSvcClientID;
+	int rc;
+	char *pszHostVersion;
+	char *pszGuestVersion;
+	rc = VbglR3HostVersionCheckForUpdate(&pszHostVersion, &pszGuestVersion);
+	if (RT_SUCCESS(rc))
+	{
+		char szMsg[256]; /* Sizes according to MSDN. */
+		char szTitle[64];
 
-    rc = VbglR3GuestPropConnect(&uGuestPropSvcClientID);
-    if (RT_SUCCESS(rc))
-        Log(("VBoxTray: Property Service Client ID: %ld\n", uGuestPropSvcClientID));
-    else
-        Log(("VBoxTray: Failed to connect to the guest property service! Error: %d\n", rc));
+		/** @todo add some translation macros here */
+		_snprintf(szTitle, sizeof(szTitle), "VirtualBox Guest Additions update available!");
+		_snprintf(szMsg, sizeof(szMsg), "Your guest is currently running the Guest Additions version %s. "
+										"We recommend updating to the latest version (%s) by choosing the "
+										"install option from the Devices menu.", pszGuestVersion, pszHostVersion);
 
-    /* Do we need to do all this stuff? */
-    char *pszCheckHostVersion;
-    rc = VbglR3GuestPropReadValueAlloc(uGuestPropSvcClientID, "/VirtualBox/GuestAdd/CheckHostVersion", &pszCheckHostVersion);
-    if (RT_FAILURE(rc))    
-    {
-        if (rc == VERR_NOT_FOUND)
-            rc = VINF_SUCCESS; /* If we don't find the value above we do the check by default */
-        else
-            Log(("VBoxTray: Could not read check host version flag! rc = %d\n", rc));
-    }
-    else
-    {
-        /* Only don't do the check if we have a valid "0" in it */
-        if (   atoi(pszCheckHostVersion) == 0
-            && strlen(pszCheckHostVersion))
-        {
-            rc = VERR_NOT_SUPPORTED;
-        }
-        VbglR3GuestPropReadValueFree(pszCheckHostVersion);
-    }
-    if (rc == VERR_NOT_SUPPORTED)            
-        Log(("VBoxTray: No host version check performed."));
-
-    char szMsg[256] = "\0"; /* Sizes according to MSDN. */
-    char szTitle[64] = "\0";
-
-    if (RT_SUCCESS(rc))
-    {
-        /* Look up host version (revision) */
-        char *pszVBoxHostVer;
-        rc = VbglR3GuestPropReadValueAlloc(uGuestPropSvcClientID, "/VirtualBox/HostInfo/VBoxVer", &pszVBoxHostVer);
-        if (RT_FAILURE(rc))
-        {
-            Log(("VBoxTray: Could not read VBox host version! rc = %d\n", rc));    
-        }
-        else
-        {
-            Log(("VBoxTray: Host version: %s\n", pszVBoxHostVer));
-
-            /* Look up guest version */
-            char szVBoxGuestVer[32];
-            char szVBoxGuestRev[32];
-
-            rc = getAdditionsVersion(szVBoxGuestVer, sizeof(szVBoxGuestVer), szVBoxGuestRev, sizeof(szVBoxGuestRev));
-            if (RT_SUCCESS(rc))
-            {
-                Log(("VBoxTray: Additions version: %s\n", szVBoxGuestVer));
-
-                /* Look up last informed host version */
-                char szVBoxHostVerLastChecked[32];
-                HKEY hKey;
-                LONG lRet = RegOpenKeyEx(HKEY_LOCAL_MACHINE, "SOFTWARE\\Sun\\VirtualBox Guest Additions\\VBoxTray", 0, KEY_READ, &hKey);
-                if (lRet == ERROR_SUCCESS)
-                {
-                    DWORD dwType;
-                    DWORD dwSize = sizeof(szVBoxHostVerLastChecked);
-                    lRet = RegQueryValueEx(hKey, "HostVerLastChecked", NULL, &dwType, (BYTE*)szVBoxHostVerLastChecked, &dwSize);
-                    if (lRet != ERROR_SUCCESS && lRet != ERROR_FILE_NOT_FOUND)
-                        Log(("VBoxTray: Could not read HostVerLastChecked! Error = %ld\n", lRet));
-                    RegCloseKey(hKey);
-                }
-                else if (lRet != ERROR_FILE_NOT_FOUND)
-                {
-                    Log(("VBoxTray: Could not open VBoxTray registry key! Error = %ld\n", lRet));
-                    rc = RTErrConvertFromWin32(lRet);
-                }
-
-                /* Compare both versions and prepare message */
-                if (   RT_SUCCESS(rc)
-                    && strcmp(pszVBoxHostVer, szVBoxHostVerLastChecked) != 0        /* Make sure we did not process this host version already */
-                    && VBoxCompareVersion(pszVBoxHostVer, szVBoxGuestVer) == 1)     /* Is host version greater than guest add version? */
-                {
-                    /** @todo add some translation macros here */
-                    _snprintf(szTitle, sizeof(szTitle), "VirtualBox Guest Additions update available!");
-                    _snprintf(szMsg, sizeof(szMsg), "Your guest is currently running the Guest Additions version %s. "
-                                                    "We recommend updating to the latest version (%s) by choosing the "
-                                                    "install option from the Devices menu.", szVBoxGuestVer, pszVBoxHostVer);
-
-                    /* Save the version to just do a balloon once per new version */
-                    if (RT_SUCCESS(rc))
-                    {
-                        lRet = RegCreateKeyEx (HKEY_LOCAL_MACHINE,
-                                               "SOFTWARE\\Sun\\VirtualBox Guest Additions\\VBoxTray",
-                                               0,           /* Reserved */
-                                               NULL,        /* lpClass [in, optional] */
-                                               0,           /* dwOptions [in] */
-                                               KEY_WRITE,
-                                               NULL,        /* lpSecurityAttributes [in, optional] */
-                                               &hKey,
-                                               NULL);       /* lpdwDisposition [out, optional] */
-                        if (lRet == ERROR_SUCCESS)
-                        {
-                            lRet = RegSetValueEx(hKey, "HostVerLastChecked", 0, REG_SZ, (BYTE*)pszVBoxHostVer, (DWORD)(strlen(pszVBoxHostVer)*sizeof(char)));
-                            if (lRet != ERROR_SUCCESS)
-                                Log(("VBoxTray: Could not write HostVerLastChecked! Error = %ld\n", lRet));
-                            RegCloseKey(hKey);
-                        }
-                        else
-                            Log(("VBoxTray: Could not open VBoxTray registry key! Error = %ld\n", lRet));
-
-                        if (lRet != ERROR_SUCCESS)
-                            rc = RTErrConvertFromWin32(lRet);
-                    }
-                }
-            }
-        }
-        VbglR3GuestPropReadValueFree(pszVBoxHostVer);
-    }
-
-    if (RT_SUCCESS(rc) && strlen(szMsg))
-    {
-        rc = showBalloonTip(gInstance, gToolWindow, ID_TRAYICON, szMsg, szTitle, 5000, 0);
+		rc = showBalloonTip(gInstance, gToolWindow, ID_TRAYICON, szMsg, szTitle, 5000, 0);
         if (RT_FAILURE(rc))
             Log(("VBoxTray: Could not show version notifier balloon tooltip! rc = %d\n", rc));
-    }
+
+		VbglR3GuestPropReadValueFree(pszHostVersion);
+		VbglR3GuestPropReadValueFree(pszGuestVersion);
+	}
 
     /* If we didn't have to check for the host version then this is not an error */
     if (rc == VERR_NOT_SUPPORTED)
         rc = VINF_SUCCESS;
-
-    VbglR3GuestPropDisconnect(uGuestPropSvcClientID);
     return rc;
 }
Index: /trunk/src/VBox/Additions/WINNT/VBoxTray/VBoxHostVersion.h
===================================================================
--- /trunk/src/VBox/Additions/WINNT/VBoxTray/VBoxHostVersion.h	(revision 23834)
+++ /trunk/src/VBox/Additions/WINNT/VBoxTray/VBoxHostVersion.h	(revision 23835)
@@ -25,3 +25,2 @@
 
 #endif /* !___VBoxHostVersion_h */
-
Index: /trunk/src/VBox/Additions/WINNT/VBoxTray/helpers.cpp
===================================================================
--- /trunk/src/VBox/Additions/WINNT/VBoxTray/helpers.cpp	(revision 23834)
+++ /trunk/src/VBox/Additions/WINNT/VBoxTray/helpers.cpp	(revision 23835)
@@ -256,51 +256,2 @@
     return 0;
 }
-
-/** @todo move this in guest lib, also used in a similar way in VBoxService */
-int getAdditionsVersion(char *pszVer, size_t cbSizeVer, char *pszRev, size_t cbSizeRev)
-{
-    HKEY hKey;
-    int rc;
-
-    /* Check the new path first. */
-    rc = RegOpenKeyEx(HKEY_LOCAL_MACHINE, "SOFTWARE\\Sun\\VirtualBox Guest Additions", 0, KEY_READ, &hKey);
-#ifdef RT_ARCH_AMD64
-    if (rc != ERROR_SUCCESS)
-    {
-        /* Check Wow6432Node (for new entries). */
-        rc = RegOpenKeyEx(HKEY_LOCAL_MACHINE, "SOFTWARE\\Wow6432Node\\Sun\\VirtualBox Guest Additions", 0, KEY_READ, &hKey);
-    }
-#endif
-
-    /* Still no luck? Then try the old xVM paths ... */
-    if (RT_FAILURE(rc))
-    {
-        rc = RegOpenKeyEx(HKEY_LOCAL_MACHINE, "SOFTWARE\\Sun\\xVM VirtualBox Guest Additions", 0, KEY_READ, &hKey);
-#ifdef RT_ARCH_AMD64
-        if (rc != ERROR_SUCCESS)
-        {
-            /* Check Wow6432Node (for new entries). */
-            rc = RegOpenKeyEx(HKEY_LOCAL_MACHINE, "SOFTWARE\\Wow6432Node\\Sun\\xVM VirtualBox Guest Additions", 0, KEY_READ, &hKey);
-        }
-#endif
-    }
-
-    /* Did we get something worth looking at? */
-    if (RT_SUCCESS(rc))
-    {
-        DWORD dwSize;
-        DWORD dwType;
-
-        /* Revision. */
-        dwSize = cbSizeRev;
-        rc = RegQueryValueEx(hKey, "Revision", NULL, &dwType, (BYTE*)(LPCTSTR)pszRev, &dwSize);
-        /* Version. */
-        dwSize = cbSizeVer;
-        rc = RegQueryValueEx(hKey, "Version", NULL, &dwType, (BYTE*)(LPCTSTR)pszVer, &dwSize);
-    }
-
-    if (NULL != hKey)
-        RegCloseKey(hKey);
-
-    return rc;
-}
Index: /trunk/src/VBox/Additions/WINNT/VBoxTray/helpers.h
===================================================================
--- /trunk/src/VBox/Additions/WINNT/VBoxTray/helpers.h	(revision 23834)
+++ /trunk/src/VBox/Additions/WINNT/VBoxTray/helpers.h	(revision 23835)
@@ -33,5 +33,4 @@
 void resizeRect(RECTL *paRects, unsigned nRects, unsigned iPrimary, unsigned iResized, int NewWidth, int NewHeight);
 int showBalloonTip (HINSTANCE hInst, HWND hWnd, UINT uID, const char *pszMsg, const char *pszTitle, UINT uTimeout, DWORD dwInfoFlags);
-int getAdditionsVersion(char *pszVer, size_t cbSizeVer, char *pszRev, size_t cbSizeRev);
 
 #endif /* !___VBOXTRAY_HELPERS_H */
Index: /trunk/src/VBox/Additions/common/VBoxGuestLib/Makefile.kmk
===================================================================
--- /trunk/src/VBox/Additions/common/VBoxGuestLib/Makefile.kmk	(revision 23834)
+++ /trunk/src/VBox/Additions/common/VBoxGuestLib/Makefile.kmk	(revision 23835)
@@ -86,5 +86,7 @@
 	VBoxGuestR3LibDaemonize.cpp \
 	VBoxGuestR3LibGR.cpp \
-	$(if $(VBOX_WITH_GUEST_PROPS),VBoxGuestR3LibGuestProp.cpp,) \
+	$(if $(VBOX_WITH_GUEST_PROPS), \
+		VBoxGuestR3LibGuestProp.cpp \
+		VBoxGuestR3LibHostVersion.cpp,) \
 	VBoxGuestR3LibMouse.cpp \
 	VBoxGuestR3LibMisc.cpp \
Index: /trunk/src/VBox/Additions/common/VBoxGuestLib/VBoxGuestR3LibHostVersion.cpp
===================================================================
--- /trunk/src/VBox/Additions/common/VBoxGuestLib/VBoxGuestR3LibHostVersion.cpp	(revision 23835)
+++ /trunk/src/VBox/Additions/common/VBoxGuestLib/VBoxGuestR3LibHostVersion.cpp	(revision 23835)
@@ -0,0 +1,205 @@
+/* $Id: */
+/** @file
+ * VBoxGuestR3Lib - Ring-3 Support Library for VirtualBox guest additions, host version check.
+ */
+
+/*
+ * Copyright (C) 2009 Sun Microsystems, Inc.
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa
+ * Clara, CA 95054 USA or visit http://www.sun.com if you need
+ * additional information or have any questions.
+ */
+
+
+/*******************************************************************************
+*   Header Files                                                               *
+*******************************************************************************/
+#include <stdlib.h>
+#include <stdio.h>
+#include <iprt/string.h>
+#include <VBox/log.h>
+
+#ifdef RT_OS_WINDOWS
+ #define WIN32_LEAN_AND_MEAN
+ #include <windows.h>
+#endif
+
+#include "VBGLR3Internal.h"
+
+/** Compares two VirtualBox version strings and returns the result.
+ *  Requires strings in form of "majorVer.minorVer.build"
+ *
+ * @returns 0 if equal, 1 if Ver1 is greater, 2 if Ver2 is greater.
+ *
+ * @param   pszVer1		First version string to compare.
+ * @param   pszVer2     First version string to compare.
+ *
+ */
+VBGLR3DECL(int) VbglR3HostVersionCompare(const char *pszVer1, const char *pszVer2)
+{
+    int rc = 0;
+    int iVer1Major, iVer1Minor, iVer1Build;
+    sscanf(pszVer1, "%d.%d.%d", &iVer1Major, &iVer1Minor, &iVer1Build);
+    int iVer2Major, iVer2Minor, iVer2Build;
+    sscanf(pszVer2, "%d.%d.%d", &iVer2Major, &iVer2Minor, &iVer2Build);
+
+    int iVer1Final = (iVer1Major * 10000) + (iVer1Minor * 100) + iVer1Build;
+    int iVer2Final = (iVer2Major * 10000) + (iVer2Minor * 100) + iVer2Build;
+
+    if (iVer1Final > iVer2Final)
+        rc = 1;
+    else if (iVer2Final > iVer1Final)
+        rc = 2;
+    return rc;
+}
+
+
+/** @todo Docs */
+VBGLR3DECL(bool) VbglR3HostVersionCheckForUpdate(char **ppszHostVersion, char **ppszGuestVersion)
+{
+    int rc;
+    uint32_t uGuestPropSvcClientID;
+
+    rc = VbglR3GuestPropConnect(&uGuestPropSvcClientID);
+    if (RT_SUCCESS(rc))
+        LogFlow(("Property Service Client ID: %ld\n", uGuestPropSvcClientID));
+    else
+        LogFlow(("Failed to connect to the guest property service! Error: %d\n", rc));
+
+    /* Do we need to do all this stuff? */
+    char *pszCheckHostVersion;
+    rc = VbglR3GuestPropReadValueAlloc(uGuestPropSvcClientID, "/VirtualBox/GuestAdd/CheckHostVersion", &pszCheckHostVersion);
+    if (RT_FAILURE(rc))
+    {
+        if (rc == VERR_NOT_FOUND)
+            rc = VINF_SUCCESS; /* If we don't find the value above we do the check by default */
+        else
+            LogFlow(("Could not read check host version flag! rc = %d\n", rc));
+    }
+    else
+    {
+        /* Only don't do the check if we have a valid "0" in it */
+        if (   atoi(pszCheckHostVersion) == 0
+            && strlen(pszCheckHostVersion))
+        {
+            rc = VERR_NOT_SUPPORTED;
+        }
+        VbglR3GuestPropReadValueFree(pszCheckHostVersion);
+    }
+    if (rc == VERR_NOT_SUPPORTED)
+        LogRel(("No host version check performed (disabled)."));
+
+    if (RT_SUCCESS(rc))
+    {
+        /* Look up host version (revision) */
+        rc = VbglR3GuestPropReadValueAlloc(uGuestPropSvcClientID, "/VirtualBox/HostInfo/VBoxVer", ppszHostVersion);
+        if (RT_FAILURE(rc))
+        {
+            LogFlow(("Could not read VBox host version! rc = %d\n", rc));
+        }
+        else
+        {
+            LogFlow(("Host version: %s\n", *ppszHostVersion));
+
+            /* Look up guest version */
+            rc = VbglR3GetAdditionsVersion(ppszGuestVersion, NULL /* Revision */);
+            if (RT_SUCCESS(rc))
+            {
+                LogFlow(("Additions version: %s\n", *ppszGuestVersion));
+
+                /* Look up last informed host version */
+                char szVBoxHostVerLastChecked[32];
+#ifdef RT_OS_WINDOWS
+                HKEY hKey;
+                LONG lRet = RegOpenKeyEx(HKEY_LOCAL_MACHINE, "SOFTWARE\\Sun\\VirtualBox Guest Additions", 0, KEY_READ, &hKey);
+                if (lRet == ERROR_SUCCESS)
+                {
+                    DWORD dwType;
+                    DWORD dwSize = sizeof(szVBoxHostVerLastChecked);
+                    lRet = RegQueryValueEx(hKey, "HostVerLastChecked", NULL, &dwType, (BYTE*)szVBoxHostVerLastChecked, &dwSize);
+                    if (lRet != ERROR_SUCCESS && lRet != ERROR_FILE_NOT_FOUND)
+                        LogFlow(("Could not read HostVerLastChecked! Error = %ld\n", lRet));
+                    RegCloseKey(hKey);
+                }
+                else if (lRet != ERROR_FILE_NOT_FOUND)
+                {
+                    LogFlow(("Could not open registry key! Error = %ld\n", lRet));
+                    rc = RTErrConvertFromWin32(lRet);
+                }
+#else
+
+#endif
+                /* Compare both versions and prepare message */
+                if (   RT_SUCCESS(rc)
+                    && strcmp(*ppszHostVersion, szVBoxHostVerLastChecked) != 0        /* Make sure we did not process this host version already */
+                    && VbglR3HostVersionCompare(*ppszHostVersion, *ppszGuestVersion) == 1)     /* Is host version greater than guest add version? */
+                {
+                    LogFlow(("Update found."));
+                }
+		else rc = VERR_VERSION_MISMATCH; /* No update found. */
+            }
+        }
+    }
+
+    if (RT_FAILURE(rc))
+    {
+	if (*ppszHostVersion)
+	    VbglR3GuestPropReadValueFree(*ppszHostVersion);
+	if (*ppszGuestVersion)
+	    VbglR3GuestPropReadValueFree(*ppszGuestVersion);
+    }
+    return rc == VINF_SUCCESS ? true : false;
+}
+
+
+/** @todo Docs */
+VBGLR3DECL(int) VbglR3HostVersionStore(const char* pszVer)
+{
+    int rc;
+    uint32_t uGuestPropSvcClientID;
+
+    rc = VbglR3GuestPropConnect(&uGuestPropSvcClientID);
+    if (RT_FAILURE(rc))
+    {
+    LogFlow(("Failed to connect to the guest property service! Error: %d\n", rc));
+    }
+    else
+    {
+#ifdef RT_OS_WINDOWS
+	HKEY hKey;
+	long lRet;
+	lRet = RegCreateKeyEx (HKEY_LOCAL_MACHINE,
+						   "SOFTWARE\\Sun\\VirtualBox Guest Additions",
+						   0,           /* Reserved */
+						   NULL,        /* lpClass [in, optional] */
+						   0,           /* dwOptions [in] */
+						   KEY_WRITE,
+						   NULL,        /* lpSecurityAttributes [in, optional] */
+						   &hKey,
+						   NULL);       /* lpdwDisposition [out, optional] */
+	if (lRet == ERROR_SUCCESS)
+	{
+	    lRet = RegSetValueEx(hKey, "HostVerLastChecked", 0, REG_SZ, (BYTE*)pszVBoxHostVer, (DWORD)(strlen(pszVBoxHostVer)*sizeof(char)));
+	    if (lRet != ERROR_SUCCESS)
+		    LogFlow(("Could not write HostVerLastChecked! Error = %ld\n", lRet));
+	    RegCloseKey(hKey);
+	}
+	else
+	    LogFlow(("Could not open registry key! Error = %ld\n", lRet));
+
+	if (lRet != ERROR_SUCCESS)
+		rc = RTErrConvertFromWin32(lRet);
+#else
+#endif
+    }
+    return rc;
+}
Index: /trunk/src/VBox/Additions/common/VBoxGuestLib/VBoxGuestR3LibMisc.cpp
===================================================================
--- /trunk/src/VBox/Additions/common/VBoxGuestLib/VBoxGuestR3LibMisc.cpp	(revision 23834)
+++ /trunk/src/VBox/Additions/common/VBoxGuestLib/VBoxGuestR3LibMisc.cpp	(revision 23835)
@@ -26,4 +26,8 @@
 #include <iprt/mem.h>
 #include <VBox/log.h>
+#ifdef RT_OS_WINDOWS
+ #define WIN32_LEAN_AND_MEAN
+ #include <windows.h>
+#endif
 
 #include "VBGLR3Internal.h"
@@ -194,2 +198,55 @@
 }
 
+
+/** @todo Docs */
+VBGLR3DECL(int) VbglR3GetAdditionsVersion(char **ppszVer, char **ppszRev)
+{
+    int rc;
+#ifdef RT_OS_WINDOWS
+    HKEY hKey;
+
+	/* Check the new path first. */
+    rc = RegOpenKeyEx(HKEY_LOCAL_MACHINE, "SOFTWARE\\Sun\\VirtualBox Guest Additions", 0, KEY_READ, &hKey);
+#ifdef RT_ARCH_AMD64
+    if (rc != ERROR_SUCCESS)
+    {
+        /* Check Wow6432Node (for new entries). */
+        rc = RegOpenKeyEx(HKEY_LOCAL_MACHINE, "SOFTWARE\\Wow6432Node\\Sun\\VirtualBox Guest Additions", 0, KEY_READ, &hKey);
+    }
+#endif
+
+    /* Still no luck? Then try the old xVM paths ... */
+    if (RT_FAILURE(rc))
+    {
+        rc = RegOpenKeyEx(HKEY_LOCAL_MACHINE, "SOFTWARE\\Sun\\xVM VirtualBox Guest Additions", 0, KEY_READ, &hKey);
+#ifdef RT_ARCH_AMD64
+        if (rc != ERROR_SUCCESS)
+        {
+            /* Check Wow6432Node (for new entries). */
+            rc = RegOpenKeyEx(HKEY_LOCAL_MACHINE, "SOFTWARE\\Wow6432Node\\Sun\\xVM VirtualBox Guest Additions", 0, KEY_READ, &hKey);
+        }
+#endif
+    }
+
+    /* Did we get something worth looking at? */
+    if (RT_SUCCESS(rc))
+    {
+        /* Version. */
+        dwSize = 32;
+        pszVer = (char*)RTMemAlloc(dwSize);
+        rc = RegQueryValueEx(hKey, "Version", NULL, &dwType, (BYTE*)(LPCTSTR)*ppszVer, &dwSize);
+        /* Revision. */
+        if (ppszRev)
+        {
+			dwSize = 32;
+			ppszRev = (char*)RTMemAlloc(dwSize);
+			rc = RegQueryValueEx(hKey, "Revision", NULL, &dwType, (BYTE*)(LPCTSTR)*ppszRev, &dwSize);
+		}
+    }
+
+    if (NULL != hKey)
+        RegCloseKey(hKey);
+#else
+#endif /* RT_OS_WINDOWS */
+    return rc;
+}
Index: /trunk/src/VBox/Additions/x11/VBoxClient/Makefile.kmk
===================================================================
--- /trunk/src/VBox/Additions/x11/VBoxClient/Makefile.kmk	(revision 23834)
+++ /trunk/src/VBox/Additions/x11/VBoxClient/Makefile.kmk	(revision 23835)
@@ -61,10 +61,12 @@
 	seamless-x11.cpp \
 	thread.cpp \
-	display.cpp \
-	hostversion.cpp
+	display.cpp
  VBoxClient_LIBS += \
 	Xext Xmu
 endif
-
+ifdef VBOX_WITH_GUEST_PROPS
+ VBoxClient_SOURCES += hostversion.cpp
+ VBoxClient_DEFS += VBOX_WITH_GUEST_PROPS
+endif
 #
 # Link aginst libstdc++.a. (http://www.trilithium.com/johan/2005/06/static-libstdc/).
Index: /trunk/src/VBox/Additions/x11/VBoxClient/main.cpp
===================================================================
--- /trunk/src/VBox/Additions/x11/VBoxClient/main.cpp	(revision 23834)
+++ /trunk/src/VBox/Additions/x11/VBoxClient/main.cpp	(revision 23835)
@@ -191,4 +191,5 @@
                 fSuccess = false;
         }
+#ifdef VBOX_WITH_GUEST_PROPS
         else if (!strcmp(argv[i], "--checkhostversion"))
         {
@@ -198,4 +199,5 @@
                 fSuccess = false;
         }
+#endif
         else if (!strcmp(argv[i], "-h") || !strcmp(argv[i], "--help"))
         {
