/** * Reports Guest Additions API and OS version. * * Called whenever the Additions issue a guest version report request or the VM * is reset. * * @param pInterface Pointer to this interface. * @param guestInfo Pointer to guest information structure. * @thread The emulation thread. */ DECLCALLBACK(void) vmmdevUpdateGuestInfo(PPDMIVMMDEVCONNECTOR pInterface, const VBoxGuestInfo *guestInfo) { PDRVMAINVMMDEV pDrv = PDMIVMMDEVCONNECTOR_2_MAINVMMDEV(pInterface); Assert(guestInfo); if (!guestInfo) return; Console *pConsole = pDrv->pVMMDev->getParent(); /* Store that information in IGuest */ Guest* guest = pConsole->getGuest(); Assert(guest); if (!guest) return; if (guestInfo->interfaceVersion != 0) { char version[16]; RTStrPrintf(version, sizeof(version), "%d", guestInfo->interfaceVersion); guest->setAdditionsInfo(Bstr(version), guestInfo->osType); /* * Tell the console interface about the event * so that it can notify its consumers. */ pConsole->onAdditionsStateChange(); if (guestInfo->interfaceVersion < VMMDEV_VERSION) pConsole->onAdditionsOutdated(); } else { /* * The guest additions was disabled because of a reset * or driver unload. */ guest->setAdditionsInfo(Bstr(), guestInfo->osType); /* Clear interface version + OS type. */ /** @todo Would be better if GuestImpl.cpp did all this in the above method call * while holding down the. */ guest->setAdditionsInfo2(0, "", 0, 0); /* Clear Guest Additions version. */ RTTIMESPEC TimeSpecTS; RTTimeNow(&TimeSpecTS); guest->setAdditionsStatus(VBoxGuestFacilityType_All, VBoxGuestFacilityStatus_Inactive, 0 /*fFlags*/, &TimeSpecTS); pConsole->onAdditionsStateChange(); } }