Index: /trunk/include/VBox/VBoxGuestLib.h
===================================================================
--- /trunk/include/VBox/VBoxGuestLib.h	(revision 31363)
+++ /trunk/include/VBox/VBoxGuestLib.h	(revision 31364)
@@ -379,5 +379,7 @@
 
 DECLVBGL(int) VbglQueryVMMDevMemory (VMMDevMemory **ppVMMDevMemory);
-DECLR0VBGL(bool)    VbglR0CanUsePhysPageList(void);
+DECLR0VBGL(bool) VbglR0CanUsePhysPageList(void);
+
+DECLR0VBGL(int) VbglR0MiscReportGuestInfo(VBOXOSTYPE enmOSType);
 
 #endif /* IN_RING0 && !IN_RING0_AGNOSTIC */
Index: /trunk/src/VBox/Additions/WINNT/VBoxGuest/Helper.cpp
===================================================================
--- /trunk/src/VBox/Additions/WINNT/VBoxGuest/Helper.cpp	(revision 31363)
+++ /trunk/src/VBox/Additions/WINNT/VBoxGuest/Helper.cpp	(revision 31364)
@@ -191,105 +191,32 @@
 }
 
-/** @todo Maybe we should drop this routine entirely later because we detecting
- *        the running OS via VBoxService in ring 3 using guest properties since a while.
- *
- *  @todo Consider of using vboxGuestInitReportGuestInfo in the ..\common\Helper.cpp
- *        module to have a common base and less redundant code.
- */
-NTSTATUS hlpVBoxReportGuestInfo (PVBOXGUESTDEVEXT pDevExt)
-{
-    VMMDevReportGuestInfo *pReq = NULL;
-    int rc = VbglGRAlloc ((VMMDevRequestHeader **)&pReq, sizeof (VMMDevReportGuestInfo), VMMDevReq_ReportGuestInfo);
-    dprintf(("hlpVBoxReportGuestInfo: VbglGRAlloc rc = %d\n", rc));
-    if (RT_SUCCESS(rc))
-    {
-        pReq->guestInfo.interfaceVersion = VMMDEV_VERSION;
-
-        /* we've already determined the Windows product before */
-        switch (winVersion)
-        {
-            case WINNT4:
-                pReq->guestInfo.osType = VBOXOSTYPE_WinNT4;
-                break;
-            case WIN2K:
-                pReq->guestInfo.osType = VBOXOSTYPE_Win2k;
-                break;
-            case WINXP:
-                pReq->guestInfo.osType = VBOXOSTYPE_WinXP;
-                break;
-            case WIN2K3:
-                pReq->guestInfo.osType = VBOXOSTYPE_Win2k3;
-                break;
-            case WINVISTA:
-                pReq->guestInfo.osType = VBOXOSTYPE_WinVista;
-                break;
-            case WIN7:
-                pReq->guestInfo.osType = VBOXOSTYPE_Win7;
-                break;
-            default:
-                /* we don't know, therefore NT family */
-                pReq->guestInfo.osType = VBOXOSTYPE_WinNT;
-                break;
-        }
-
-        /** @todo registry lookup for additional information */
-
-        rc = VbglGRPerform (&pReq->header);
-        if (RT_FAILURE(rc))
-        {
-            dprintf(("VBoxGuest::hlpVBoxReportGuestInfo: Error reporting guest info to VMMDev. "
-                     "rc = %Rrc\n", rc));
-        }
-
-        VbglGRFree (&pReq->header);
-    }
-
-    VMMDevReportGuestInfo2 *pReq2 = NULL;
-    if (RT_SUCCESS(rc))
-        rc = VbglGRAlloc ((VMMDevRequestHeader **)&pReq2, sizeof (VMMDevReportGuestInfo2), VMMDevReq_ReportGuestInfo2);
-    dprintf(("hlpVBoxReportGuestInfo2: VbglGRAlloc rc = %d\n", rc));
-
-    if (RT_SUCCESS(rc))
-    {
-        pReq2->guestInfo.additionsMajor = VBOX_VERSION_MAJOR;
-        pReq2->guestInfo.additionsMinor = VBOX_VERSION_MINOR;
-        pReq2->guestInfo.additionsBuild = VBOX_VERSION_BUILD;
-        pReq2->guestInfo.additionsRevision = VBOX_SVN_REV;
-        pReq2->guestInfo.additionsFeatures = 0;
-        RTStrCopy(pReq2->guestInfo.szName, sizeof(pReq2->guestInfo.szName), VBOX_VERSION_STRING);
-
-        rc = VbglGRPerform (&pReq2->header);
-        if (RT_FAILURE(rc))
-        {
-            dprintf(("VBoxGuest::hlpVBoxReportGuestInfo: Error reporting guest info to VMMDev. "
-                     "rc = %Rrc\n", rc));
-        }
-        if (rc == VERR_NOT_IMPLEMENTED) /* Compatibility with older hosts. */
-            rc = VINF_SUCCESS;
-        VbglGRFree (&pReq2->header);
-    }
-
-    /*
-     * Report guest status to host.  Because the host set the "Guest Additions active" flag as soon
-     * as he received the VMMDevReportGuestInfo above to make sure all is compatible with older Guest
-     * Additions we now have to disable that flag again here (too early, VBoxService and friends need
-     * to start up first).
-     */
-    VMMDevReportGuestStatus *pReq3;
-    rc = VbglGRAlloc((VMMDevRequestHeader **)&pReq3, sizeof(*pReq3), VMMDevReq_ReportGuestStatus);
-    if (RT_SUCCESS(rc))
-    {
-        pReq3->guestStatus.facility = VBoxGuestStatusFacility_VBoxGuestDriver;
-        pReq3->guestStatus.status = VBoxGuestStatusCurrent_Active; /** @todo Are we actually *really* active at this point? */
-        pReq3->guestStatus.flags = 0;
-        rc = VbglGRPerform(&pReq3->header);
-        if (RT_FAILURE(rc))
-            dprintf(("VBoxGuest::hlpVBoxReportGuestInfo: Reporting guest status failed with rc=%Rrc\n", rc));
-        if (rc == VERR_NOT_IMPLEMENTED) /* Compatibility with older hosts. */
-            rc = VINF_SUCCESS;
-        VbglGRFree(&pReq3->header);
-    }
-
-    return RT_FAILURE(rc) ? STATUS_UNSUCCESSFUL : STATUS_SUCCESS;
-}
-
+VBOXOSTYPE hlpVBoxWinVersionToOSType (winVersion_t winVer)
+{
+    switch (winVer)
+    {
+        case WINNT4:
+            return VBOXOSTYPE_WinNT4;
+
+        case WIN2K:
+            return VBOXOSTYPE_Win2k;
+
+        case WINXP:
+            return VBOXOSTYPE_WinXP;
+
+        case WIN2K3:
+            return VBOXOSTYPE_Win2k3;
+
+        case WINVISTA:
+            return VBOXOSTYPE_WinVista;
+
+        case WIN7:
+            return VBOXOSTYPE_Win7;
+
+        default:
+            break;
+    }
+
+    /* We don't know, therefore NT family. */
+    return VBOXOSTYPE_WinNT;
+}
+
Index: /trunk/src/VBox/Additions/WINNT/VBoxGuest/Helper.h
===================================================================
--- /trunk/src/VBox/Additions/WINNT/VBoxGuest/Helper.h	(revision 31363)
+++ /trunk/src/VBox/Additions/WINNT/VBoxGuest/Helper.h	(revision 31364)
@@ -3,5 +3,5 @@
  * VBoxGuest -- VirtualBox Win32 guest support driver
  *
- * Copyright (C) 2006-2007 Oracle Corporation
+ * Copyright (C) 2006-2010 Oracle Corporation
  *
  * This file is part of VirtualBox Open Source Edition (OSE), as
@@ -44,10 +44,10 @@
 
 /**
- * Helper to report the guest information to host.
+ * Helper for mapping the Windows version to the OS type understood by the host.
  *
- * @param pDevExt   VMMDev device extension
- * @return NT status code
+ * @return The OS type.
+ * @param winVer   Windows version to translate.
  */
-NTSTATUS hlpVBoxReportGuestInfo (PVBOXGUESTDEVEXT pDevExt);
+VBOXOSTYPE hlpVBoxWinVersionToOSType (winVersion_t winVer);
 
 #ifdef VBOX_WITH_GUEST_BUGCHECK_DETECTION
Index: /trunk/src/VBox/Additions/WINNT/VBoxGuest/NTLegacy.cpp
===================================================================
--- /trunk/src/VBox/Additions/WINNT/VBoxGuest/NTLegacy.cpp	(revision 31363)
+++ /trunk/src/VBox/Additions/WINNT/VBoxGuest/NTLegacy.cpp	(revision 31364)
@@ -54,4 +54,5 @@
 {
     ULONG busNumber, slotNumber;
+    int vrc = VINF_SUCCESS;
     NTSTATUS rc = STATUS_SUCCESS;
 
@@ -271,19 +272,26 @@
     }
 
-    rc = hlpVBoxReportGuestInfo (pDevExt);
-    if (!NT_SUCCESS(rc))
-    {
-        dprintf(("VBoxGuest::AddDevice: could not report information to host, rc = %d, exiting!\n", rc));
+    /** @todo Cleanup on failure. */
+
+    /** @todo Don't mix up IPRT rc and NTSTATUS rc above! */
+
+    vrc = VBoxInitMemBalloon(pDevExt);
+    if (RT_SUCCESS(vrc))
+    {
+        vrc = VbglR0MiscReportGuestInfo(hlpVBoxWinVersionToOSType(winVersion));
+        if (RT_FAILURE(vrc))
+            dprintf(("VBoxGuest::ntCreateDevice: could not report information to host, rc = %d, exiting!\n", rc));
+    }
+
+    if (   NT_ERROR(rc)
+        || RT_FAILURE(vrc))
+    {
         freeDeviceResources(pDrvObj, pDevObj);
         return STATUS_UNSUCCESSFUL;
     }
 
-    /** @todo cleanup on failure */
-
-    VBoxInitMemBalloon(pDevExt);
-
     // ready to rumble!
     pDevExt->devState = WORKING;
-    dprintf(("returning from createDevice with rc = 0x%x\n", rc));
+    dprintf(("returning from ntCreateDevice with rc = 0x%x\n, vrc = %Rrc", rc, vrc));
     return rc;
 }
Index: /trunk/src/VBox/Additions/WINNT/VBoxGuest/VBoxGuest.cpp
===================================================================
--- /trunk/src/VBox/Additions/WINNT/VBoxGuest/VBoxGuest.cpp	(revision 31363)
+++ /trunk/src/VBox/Additions/WINNT/VBoxGuest/VBoxGuest.cpp	(revision 31364)
@@ -774,5 +774,5 @@
 #endif
 
-void VBoxInitMemBalloon(PVBOXGUESTDEVEXT pDevExt)
+int VBoxInitMemBalloon(PVBOXGUESTDEVEXT pDevExt)
 {
 #ifdef VBOX_WITH_MANAGEMENT
@@ -783,5 +783,7 @@
     pDevExt->MemBalloon.paMdlMemBalloon = NULL;
 
-    VBoxGuestQueryMemoryBalloon(pDevExt, &dummy);
+    return VBoxGuestQueryMemoryBalloon(pDevExt, &dummy);
+#else
+    return VINF_SUCCESS;
 #endif
 }
Index: /trunk/src/VBox/Additions/WINNT/VBoxGuest/VBoxGuestPnP.cpp
===================================================================
--- /trunk/src/VBox/Additions/WINNT/VBoxGuest/VBoxGuestPnP.cpp	(revision 31363)
+++ /trunk/src/VBox/Additions/WINNT/VBoxGuest/VBoxGuestPnP.cpp	(revision 31364)
@@ -111,5 +111,5 @@
 NTSTATUS VBoxGuestPnP(PDEVICE_OBJECT pDevObj, PIRP pIrp)
 {
-    PVBOXGUESTDEVEXT    pDevExt = (PVBOXGUESTDEVEXT)pDevObj->DeviceExtension;
+    PVBOXGUESTDEVEXT   pDevExt = (PVBOXGUESTDEVEXT)pDevObj->DeviceExtension;
     PIO_STACK_LOCATION pStack  = IoGetCurrentIrpStackLocation(pIrp);
     NTSTATUS rc = STATUS_SUCCESS;
@@ -208,13 +208,4 @@
                     if (NT_SUCCESS(rc))
                     {
-                        rc = hlpVBoxReportGuestInfo (pDevExt);
-                        if (!NT_SUCCESS(rc))
-                        {
-                            dprintf(("VBoxGuest::START_DEVICE: could not report information to host, rc = %d\n", rc));
-                        }
-                    }
-
-                    if (NT_SUCCESS(rc))
-                    {
                         // register DPC and ISR
                         dprintf(("VBoxGuest::VBoxGuestPnp: initializing DPC...\n"));
@@ -250,5 +241,11 @@
                 pDevExt->HGCMWaitTimeout.QuadPart *= -10000;     /* relative in 100ns units */
 
-                VBoxInitMemBalloon(pDevExt);
+                int vrc = VBoxInitMemBalloon(pDevExt);
+                if (RT_SUCCESS(vrc))
+                {
+                    vrc = VbglR0MiscReportGuestInfo(hlpVBoxWinVersionToOSType(winVersion));
+                    if (RT_FAILURE(vrc))
+                        dprintf(("VBoxGuest::VBoxGuestPnp::IRP_MN_START_DEVICE: could not report information to host, rc = %d\n", rc));
+                }
 
                 // ready to rumble!
Index: /trunk/src/VBox/Additions/WINNT/VBoxGuest/VBoxGuest_Internal.h
===================================================================
--- /trunk/src/VBox/Additions/WINNT/VBoxGuest/VBoxGuest_Internal.h	(revision 31363)
+++ /trunk/src/VBox/Additions/WINNT/VBoxGuest/VBoxGuest_Internal.h	(revision 31364)
@@ -262,5 +262,5 @@
 NTSTATUS createThreads(PVBOXGUESTDEVEXT pDevExt);
 VOID     unreserveHypervisorMemory(PVBOXGUESTDEVEXT pDevExt);
-void     VBoxInitMemBalloon(PVBOXGUESTDEVEXT pDevExt);
+int      VBoxInitMemBalloon(PVBOXGUESTDEVEXT pDevExt);
 void     VBoxCleanupMemBalloon(PVBOXGUESTDEVEXT pDevExt);
 }
Index: /trunk/src/VBox/Additions/common/VBoxGuest/VBoxGuest.cpp
===================================================================
--- /trunk/src/VBox/Additions/common/VBoxGuest/VBoxGuest.cpp	(revision 31363)
+++ /trunk/src/VBox/Additions/common/VBoxGuest/VBoxGuest.cpp	(revision 31364)
@@ -255,70 +255,4 @@
 
 /**
- * Report guest information to the VMMDev.
- *
- * @returns VBox status code.
- * @param   pDevExt     The device extension.
- * @param   enmOSType   The OS type to report.
- */
-static int vboxGuestInitReportGuestInfo(PVBOXGUESTDEVEXT pDevExt, VBOXOSTYPE enmOSType)
-{
-    /*
-     * Report general info + capabilities to host.
-     */
-    VMMDevReportGuestInfo *pReq;
-    int rc = VbglGRAlloc((VMMDevRequestHeader **)&pReq, sizeof(*pReq), VMMDevReq_ReportGuestInfo);
-    if (RT_SUCCESS(rc))
-    {
-        pReq->guestInfo.interfaceVersion = VMMDEV_VERSION;
-        pReq->guestInfo.osType = enmOSType;
-        rc = VbglGRPerform(&pReq->header);
-        if (RT_FAILURE(rc))
-            LogRel(("vboxGuestInitReportGuestInfo: 1st part failed with rc=%Rrc\n", rc));
-        VbglGRFree(&pReq->header);
-    }
-    VMMDevReportGuestInfo2 *pReq2;
-    if (RT_SUCCESS(rc))
-        rc = VbglGRAlloc((VMMDevRequestHeader **)&pReq2, sizeof(*pReq2), VMMDevReq_ReportGuestInfo2);
-    if (RT_SUCCESS(rc))
-    {
-        pReq2->guestInfo.additionsMajor = VBOX_VERSION_MAJOR;
-        pReq2->guestInfo.additionsMinor = VBOX_VERSION_MINOR;
-        pReq2->guestInfo.additionsBuild = VBOX_VERSION_BUILD;
-        pReq2->guestInfo.additionsRevision = VBOX_SVN_REV;
-        pReq2->guestInfo.additionsFeatures = 0;
-        RTStrCopy(pReq2->guestInfo.szName, sizeof(pReq2->guestInfo.szName), VBOX_VERSION_STRING);
-        rc = VbglGRPerform(&pReq2->header);
-        if (rc == VERR_NOT_IMPLEMENTED) /* Compatibility with older hosts. */
-            rc = VINF_SUCCESS;
-        if (RT_FAILURE(rc))
-            LogRel(("vboxGuestInitReportGuestInfo: 2nd part failed with rc=%Rrc\n", rc));
-        VbglGRFree(&pReq2->header);
-    }
-
-    /*
-     * Report guest status to host.  Because the host set the "Guest Additions active" flag as soon
-     * as he received the VMMDevReportGuestInfo above to make sure all is compatible with older Guest
-     * Additions we now have to disable that flag again here (too early, VBoxService and friends need
-     * to start up first).
-     */
-    VMMDevReportGuestStatus *pReq3;
-    rc = VbglGRAlloc((VMMDevRequestHeader **)&pReq3, sizeof(*pReq3), VMMDevReq_ReportGuestStatus);
-    if (RT_SUCCESS(rc))
-    {
-        pReq3->guestStatus.facility = VBoxGuestStatusFacility_VBoxGuestDriver;
-        pReq3->guestStatus.status = VBoxGuestStatusCurrent_Active; /** @todo Are we actually *really* active at this point? */
-        pReq3->guestStatus.flags = 0;
-        rc = VbglGRPerform(&pReq3->header);
-        if (rc == VERR_NOT_IMPLEMENTED) /* Compatibility with older hosts. */
-            rc = VINF_SUCCESS;
-        if (RT_FAILURE(rc))
-            LogRel(("vboxGuestInitReportGuestInfo: reporting status failed with rc=%Rrc\n", rc));
-        VbglGRFree(&pReq3->header);
-    }
-    return rc;
-}
-
-
-/**
  * Inflate the balloon by one chunk represented by an R0 memory object.
  *
@@ -799,30 +733,28 @@
             Assert(pDevExt->PhysIrqAckEvents != 0);
 
-            rc = vboxGuestInitReportGuestInfo(pDevExt, enmOSType);
+            rc = vboxGuestSetFilterMask(pDevExt, fFixedEvents);
             if (RT_SUCCESS(rc))
             {
-                rc = vboxGuestSetFilterMask(pDevExt, fFixedEvents);
+                /*
+                 * Disable guest graphics capability by default. The guest specific
+                 * graphics driver will re-enable this when it is necessary.
+                 */
+                rc = VBoxGuestSetGuestCapabilities(0, VMMDEV_GUEST_SUPPORTS_GRAPHICS);
                 if (RT_SUCCESS(rc))
                 {
-                    /*
-                     * Disable guest graphics capability by default. The guest specific
-                     * graphics driver will re-enable this when it is necessary.
-                     */
-                    rc = VBoxGuestSetGuestCapabilities(0, VMMDEV_GUEST_SUPPORTS_GRAPHICS);
-                    if (RT_SUCCESS(rc))
-                    {
-                        vboxGuestInitFixateGuestMappings(pDevExt);
-                        Log(("VBoxGuestInitDevExt: returns success\n"));
-                        return VINF_SUCCESS;
-                    }
-
-                    LogRel(("VBoxGuestInitDevExt: VBoxGuestSetGuestCapabilities failed, rc=%Rrc\n", rc));
+                    vboxGuestInitFixateGuestMappings(pDevExt);
+
+                    rc = VbglR0MiscReportGuestInfo(enmOSType);
+                    if (RT_FAILURE(rc))
+                        LogRel(("VBoxGuestInitDevExt: VbglR0MiscReportGuestInfo failed, rc=%Rrc\n", rc));
+
+                    Log(("VBoxGuestInitDevExt: returns success\n"));
+                    return VINF_SUCCESS;
                 }
-                else
-                    LogRel(("VBoxGuestInitDevExt: vboxGuestSetFilterMask failed, rc=%Rrc\n", rc));
+
+                LogRel(("VBoxGuestInitDevExt: VBoxGuestSetGuestCapabilities failed, rc=%Rrc\n", rc));
             }
             else
-                LogRel(("VBoxGuestInitDevExt: vboxGuestInitReportGuestInfo failed, rc=%Rrc\n", rc));
-
+                LogRel(("VBoxGuestInitDevExt: vboxGuestSetFilterMask failed, rc=%Rrc\n", rc));
             VbglGRFree((VMMDevRequestHeader *)pDevExt->pIrqAckEvents);
         }
Index: /trunk/src/VBox/Additions/common/VBoxGuestLib/Makefile.kmk
===================================================================
--- /trunk/src/VBox/Additions/common/VBoxGuestLib/Makefile.kmk	(revision 31363)
+++ /trunk/src/VBox/Additions/common/VBoxGuestLib/Makefile.kmk	(revision 31364)
@@ -61,6 +61,9 @@
 	VMMDev.cpp \
 	HGCM.cpp \
+	VBoxGuestR0LibMisc.c \
 	VBoxGuestR0LibSharedFolders.c \
 	VbglR0CanUsePhysPageList.cpp
+
+VBoxGuestR0LibMisc.c_DEFS = VBOX_SVN_REV=$(VBOX_SVN_REV)
 
 
@@ -79,5 +82,6 @@
 	VMMDev.cpp \
 	HGCMInternal.cpp \
-	VbglR0CanUsePhysPageList.cpp
+	VbglR0CanUsePhysPageList.cpp \
+	VBoxGuestR0LibMisc.c
 
 #
Index: /trunk/src/VBox/Additions/common/VBoxGuestLib/VBoxGuestR0LibMisc.c
===================================================================
--- /trunk/src/VBox/Additions/common/VBoxGuestLib/VBoxGuestR0LibMisc.c	(revision 31364)
+++ /trunk/src/VBox/Additions/common/VBoxGuestLib/VBoxGuestR0LibMisc.c	(revision 31364)
@@ -0,0 +1,92 @@
+/* $Id$ */
+/** @file
+ * VBoxGuestR0LibMisc - Miscellaneous functions.
+ */
+
+/*
+ * Copyright (C) 2010 Oracle Corporation
+ *
+ * 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.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+ * VirtualBox OSE distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ */
+
+#include <iprt/string.h>
+#include <VBox/err.h>
+#include <VBox/log.h>
+#include <VBox/VBoxGuestLib.h>
+#include <VBox/version.h>
+
+
+DECLR0VBGL(int) VbglR0MiscReportGuestInfo(VBOXOSTYPE enmOSType)
+{
+    VMMDevReportGuestInfo2 *pReq = NULL;
+    int rc = VbglGRAlloc((VMMDevRequestHeader **)&pReq, sizeof (VMMDevReportGuestInfo2), VMMDevReq_ReportGuestInfo2);
+    if (RT_SUCCESS(rc))
+    {
+        pReq->guestInfo.additionsMajor = VBOX_VERSION_MAJOR;
+        pReq->guestInfo.additionsMinor = VBOX_VERSION_MINOR;
+        pReq->guestInfo.additionsBuild = VBOX_VERSION_BUILD;
+        pReq->guestInfo.additionsRevision = VBOX_SVN_REV;
+        pReq->guestInfo.additionsFeatures = 0; /* Not (never?) used. */
+        RTStrCopy(pReq->guestInfo.szName, sizeof(pReq->guestInfo.szName), VBOX_VERSION_STRING);
+
+        rc = VbglGRPerform(&pReq->header);
+        if (rc == VERR_NOT_IMPLEMENTED) /* Compatibility with older hosts. */
+            rc = VINF_SUCCESS;
+        VbglGRFree(&pReq->header);
+    }
+
+    /*
+     * Report guest status of the VBox driver to the host.
+     */
+    if (RT_SUCCESS(rc))
+    {
+        VMMDevReportGuestStatus *pReq2;
+        rc = VbglGRAlloc((VMMDevRequestHeader **)&pReq2, sizeof(*pReq2), VMMDevReq_ReportGuestStatus);
+        if (RT_SUCCESS(rc))
+        {
+            pReq2->guestStatus.facility = VBoxGuestStatusFacility_VBoxGuestDriver;
+            pReq2->guestStatus.status = VBoxGuestStatusCurrent_Active; /** @todo Are we actually *really* active at this point? */
+            pReq2->guestStatus.flags = 0;
+            rc = VbglGRPerform(&pReq2->header);
+            if (rc == VERR_NOT_IMPLEMENTED) /* Compatibility with older hosts. */
+                rc = VINF_SUCCESS;
+            VbglGRFree(&pReq2->header);
+        }
+    }
+
+    /*
+     * VMMDevReportGuestInfo acts as a beacon and signals the host that all guest information is
+     * now complete.  So always send this report last!
+     */
+    if (RT_SUCCESS(rc))
+    {
+        VMMDevReportGuestInfo *pReq3 = NULL;
+        rc = VbglGRAlloc((VMMDevRequestHeader **)&pReq3, sizeof (VMMDevReportGuestInfo), VMMDevReq_ReportGuestInfo);
+        if (RT_SUCCESS(rc))
+        {
+            pReq3->guestInfo.interfaceVersion = VMMDEV_VERSION;
+            pReq3->guestInfo.osType = enmOSType;
+
+            rc = VbglGRPerform(&pReq3->header);
+            VbglGRFree(&pReq3->header);
+        }
+    }
+
+    return rc;
+}
+
Index: /trunk/src/VBox/Main/GuestImpl.cpp
===================================================================
--- /trunk/src/VBox/Main/GuestImpl.cpp	(revision 31363)
+++ /trunk/src/VBox/Main/GuestImpl.cpp	(revision 31364)
@@ -1441,5 +1441,6 @@
 /**
  * Sets the general Guest Additions information like
- * API (interface) version and OS type.
+ * API (interface) version and OS type.  Gets called by
+ * vmmdevUpdateGuestInfo.
  *
  * @param aInterfaceVersion
@@ -1460,8 +1461,17 @@
     /*
      * Older Additions rely on the Additions API version whether they
-     * are assumed to be active or not. Newer additions will disable
-     * this immediately.
+     * are assumed to be active or not.  Since newer Additions do report
+     * the Additions version *before* calling this function (by calling
+     * VMMDevReportGuestInfo2, VMMDevReportGuestStatus, VMMDevReportGuestInfo,
+     * in that order) we can tell apart old and new Additions here. Old
+     * Additions never would set VMMDevReportGuestInfo2 (which set mData.mAdditionsVersion)
+     * so they just rely on the aInterfaceVersion string (which gets set by
+     * VMMDevReportGuestInfo).
+     *
+     * So only mark the Additions as being active when we don't have the Additions
+     * version set.
      */
-    mData.mAdditionsActive = !aInterfaceVersion.isEmpty();
+    if (mData.mAdditionsVersion.isEmpty())
+        mData.mAdditionsActive = !aInterfaceVersion.isEmpty();
     /*
      * Older Additions didn't have this finer grained capability bit,
@@ -1482,4 +1492,5 @@
 /**
  * Sets the Guest Additions version information details.
+ * Gets called by vmmdevUpdateGuestInfo2.
  *
  * @param aAdditionsVersion
@@ -1501,4 +1512,5 @@
 /**
  * Sets the status of a certain Guest Additions facility.
+ * Gets called by vmmdevUpdateGuestStatus.
  *
  * @param Facility
Index: /trunk/src/VBox/Main/VMMDevInterface.cpp
===================================================================
--- /trunk/src/VBox/Main/VMMDevInterface.cpp	(revision 31363)
+++ /trunk/src/VBox/Main/VMMDevInterface.cpp	(revision 31364)
@@ -229,5 +229,5 @@
         guest->setAdditionsInfo(Bstr(), guestInfo->osType); /* Clear interface version + OS type. */
         guest->setAdditionsInfo2(Bstr(), Bstr()); /* Clear Guest Additions version. */
-        guest->setAdditionsStatus(VBoxGuestStatusFacility_Unknown,
+        guest->setAdditionsStatus(VBoxGuestStatusFacility_All,
                                   VBoxGuestStatusCurrent_Disabled,
                                   0); /* Flags; not used. */
@@ -269,17 +269,8 @@
 
         /*
-         * Tell the console interface about the event
-         * so that it can notify its consumers.
+         * No need to tell the console interface about the update;
+         * vmmdevUpdateGuestInfo takes care of that when called as the
+         * last event in the chain.
          */
-        pDrv->pVMMDev->getParent()->onAdditionsStateChange();
-    }
-    else
-    {
-        /*
-         * The guest additions was disabled because of a reset
-         * or driver unload.
-         */
-        guest->setAdditionsInfo2(Bstr(), Bstr());
-        pDrv->pVMMDev->getParent()->onAdditionsStateChange();
     }
 }
@@ -314,5 +305,4 @@
      */
     pDrv->pVMMDev->getParent()->onAdditionsStateChange();
-
 }
 
@@ -340,5 +330,4 @@
     }
 }
-
 
 /**
