VMMDevInterface.cpp revision c74ea5ca6312c23032dca359df1759780503475e
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync/* $Id$ */
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync/** @file
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync * VirtualBox Driver Interface to VMM device.
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync */
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync/*
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync * Copyright (C) 2006-2010 Sun Microsystems, Inc.
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync *
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync * available from http://www.virtualbox.org. This file is free software;
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync * you can redistribute it and/or modify it under the terms of the GNU
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync * General Public License (GPL) as published by the Free Software
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync * Foundation, in version 2 as it comes in the "COPYING" file of the
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync *
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync * Clara, CA 95054 USA or visit http://www.sun.com if you need
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync * additional information or have any questions.
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync */
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync#include "VMMDev.h"
ddd5bf03356cc0515b0f42ed9048a6364e7eb1e2vboxsync#include "ConsoleImpl.h"
01df41f7a4e5f7de195a059541d1c89676da9673vboxsync#include "DisplayImpl.h"
01df41f7a4e5f7de195a059541d1c89676da9673vboxsync#include "GuestImpl.h"
01df41f7a4e5f7de195a059541d1c89676da9673vboxsync#include "MouseImpl.h"
01df41f7a4e5f7de195a059541d1c89676da9673vboxsync
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync#include "Logging.h"
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync#include <VBox/pdmdrv.h>
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync#include <VBox/VMMDev.h>
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync#include <VBox/shflsvc.h>
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync#include <iprt/asm.h>
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync#ifdef VBOX_WITH_HGCM
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync#include "hgcm/HGCM.h"
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync#include "hgcm/HGCMObjects.h"
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync# if defined(RT_OS_DARWIN) && defined(VBOX_WITH_CROGL)
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync# include <VBox/HostServices/VBoxCrOpenGLSvc.h>
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync# endif
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync#endif
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync//
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync// defines
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync//
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync#ifdef RT_OS_OS2
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync# define VBOXSHAREDFOLDERS_DLL "VBoxSFld"
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync#else
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync# define VBOXSHAREDFOLDERS_DLL "VBoxSharedFolders"
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync#endif
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync//
ddd5bf03356cc0515b0f42ed9048a6364e7eb1e2vboxsync// globals
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync//
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync/**
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync * VMMDev driver instance data.
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync */
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsynctypedef struct DRVMAINVMMDEV
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync{
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync /** Pointer to the VMMDev object. */
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync VMMDev *pVMMDev;
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync /** Pointer to the driver instance structure. */
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync PPDMDRVINS pDrvIns;
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync /** Pointer to the VMMDev port interface of the driver/device above us. */
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync PPDMIVMMDEVPORT pUpPort;
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync /** Our VMM device connector interface. */
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync PDMIVMMDEVCONNECTOR Connector;
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync#ifdef VBOX_WITH_HGCM
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync /** Pointer to the HGCM port interface of the driver/device above us. */
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync PPDMIHGCMPORT pHGCMPort;
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync /** Our HGCM connector interface. */
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync PDMIHGCMCONNECTOR HGCMConnector;
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync#endif
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync} DRVMAINVMMDEV, *PDRVMAINVMMDEV;
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync/** Converts PDMIVMMDEVCONNECTOR pointer to a DRVMAINVMMDEV pointer. */
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync#define PDMIVMMDEVCONNECTOR_2_MAINVMMDEV(pInterface) ( (PDRVMAINVMMDEV) ((uintptr_t)pInterface - RT_OFFSETOF(DRVMAINVMMDEV, Connector)) )
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync#ifdef VBOX_WITH_HGCM
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync/** Converts PDMIHGCMCONNECTOR pointer to a DRVMAINVMMDEV pointer. */
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync#define PDMIHGCMCONNECTOR_2_MAINVMMDEV(pInterface) ( (PDRVMAINVMMDEV) ((uintptr_t)pInterface - RT_OFFSETOF(DRVMAINVMMDEV, HGCMConnector)) )
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync#endif
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync//
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync// constructor / destructor
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync//
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsyncVMMDev::VMMDev(Console *console)
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync : mpDrv(NULL),
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync mParent(console)
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync{
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync int rc = RTSemEventCreate(&mCredentialsEvent);
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync AssertRC(rc);
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync#ifdef VBOX_WITH_HGCM
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync rc = HGCMHostInit ();
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync AssertRC(rc);
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync m_fHGCMActive = true;
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync#endif /* VBOX_WITH_HGCM */
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync mu32CredentialsFlags = 0;
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync}
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsyncVMMDev::~VMMDev()
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync{
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync#ifdef VBOX_WITH_HGCM
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync if (hgcmIsActive())
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync {
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync ASMAtomicWriteBool(&m_fHGCMActive, false);
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync HGCMHostShutdown();
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync }
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync#endif /* VBOX_WITH_HGCM */
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync RTSemEventDestroy (mCredentialsEvent);
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync if (mpDrv)
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync mpDrv->pVMMDev = NULL;
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync mpDrv = NULL;
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync}
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsyncPPDMIVMMDEVPORT VMMDev::getVMMDevPort()
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync{
ddd5bf03356cc0515b0f42ed9048a6364e7eb1e2vboxsync Assert(mpDrv);
ddd5bf03356cc0515b0f42ed9048a6364e7eb1e2vboxsync return mpDrv->pUpPort;
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync}
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync//
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync// public methods
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync//
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync/**
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync * Wait on event semaphore for guest credential judgement result.
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync */
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsyncint VMMDev::WaitCredentialsJudgement (uint32_t u32Timeout, uint32_t *pu32CredentialsFlags)
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync{
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync if (u32Timeout == 0)
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync {
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync u32Timeout = 5000;
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync }
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync int rc = RTSemEventWait (mCredentialsEvent, u32Timeout);
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync if (RT_SUCCESS(rc))
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync {
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync *pu32CredentialsFlags = mu32CredentialsFlags;
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync }
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync
ddd5bf03356cc0515b0f42ed9048a6364e7eb1e2vboxsync return rc;
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync}
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsyncint VMMDev::SetCredentialsJudgementResult (uint32_t u32Flags)
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync{
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync mu32CredentialsFlags = u32Flags;
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync int rc = RTSemEventSignal (mCredentialsEvent);
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync AssertRC(rc);
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync return rc;
d331ca5667e19a46f1e967617184483bec985e86vboxsync}
d331ca5667e19a46f1e967617184483bec985e86vboxsync
d331ca5667e19a46f1e967617184483bec985e86vboxsync
d331ca5667e19a46f1e967617184483bec985e86vboxsync/**
d331ca5667e19a46f1e967617184483bec985e86vboxsync * Report guest OS version.
d331ca5667e19a46f1e967617184483bec985e86vboxsync * Called whenever the Additions issue a guest version report request or the VM is reset.
d331ca5667e19a46f1e967617184483bec985e86vboxsync *
d331ca5667e19a46f1e967617184483bec985e86vboxsync * @param pInterface Pointer to this interface.
d331ca5667e19a46f1e967617184483bec985e86vboxsync * @param guestInfo Pointer to guest information structure
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync * @thread The emulation thread.
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync */
ddd5bf03356cc0515b0f42ed9048a6364e7eb1e2vboxsyncDECLCALLBACK(void) vmmdevUpdateGuestVersion(PPDMIVMMDEVCONNECTOR pInterface, VBoxGuestInfo *guestInfo)
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync{
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync PDRVMAINVMMDEV pDrv = PDMIVMMDEVCONNECTOR_2_MAINVMMDEV(pInterface);
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync Assert(guestInfo);
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync if (!guestInfo)
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync return;
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync /* store that information in IGuest */
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync Guest* guest = pDrv->pVMMDev->getParent()->getGuest();
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync Assert(guest);
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync if (!guest)
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync return;
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync if (guestInfo->additionsVersion != 0)
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync {
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync char version[20];
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync RTStrPrintf(version, sizeof(version), "%d", guestInfo->additionsVersion);
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync guest->setAdditionsVersion(Bstr(version), guestInfo->osType);
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync
ddd5bf03356cc0515b0f42ed9048a6364e7eb1e2vboxsync /*
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync * Tell the console interface about the event
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync * so that it can notify its consumers.
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync */
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync pDrv->pVMMDev->getParent()->onAdditionsStateChange();
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync if (guestInfo->additionsVersion < VMMDEV_VERSION)
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync pDrv->pVMMDev->getParent()->onAdditionsOutdated();
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync }
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync else
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync {
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync /*
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync * The guest additions was disabled because of a reset
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync * or driver unload.
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync */
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync guest->setAdditionsVersion (Bstr(), guestInfo->osType);
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync pDrv->pVMMDev->getParent()->onAdditionsStateChange();
ddd5bf03356cc0515b0f42ed9048a6364e7eb1e2vboxsync }
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync}
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync/**
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync * Update the guest additions capabilities.
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync * This is called when the guest additions capabilities change. The new capabilities
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync * are given and the connector should update its internal state.
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync *
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync * @param pInterface Pointer to this interface.
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync * @param newCapabilities New capabilities.
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync * @thread The emulation thread.
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync */
66a94fee6b0acc21c078369f49d97020cc03ab11vboxsyncDECLCALLBACK(void) vmmdevUpdateGuestCapabilities(PPDMIVMMDEVCONNECTOR pInterface, uint32_t newCapabilities)
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync{
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync PDRVMAINVMMDEV pDrv = PDMIVMMDEVCONNECTOR_2_MAINVMMDEV(pInterface);
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync /* store that information in IGuest */
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync Guest* guest = pDrv->pVMMDev->getParent()->getGuest();
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync Assert(guest);
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync if (!guest)
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync return;
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync guest->setSupportsSeamless(BOOL (newCapabilities & VMMDEV_GUEST_SUPPORTS_SEAMLESS));
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync guest->setSupportsGraphics(BOOL (newCapabilities & VMMDEV_GUEST_SUPPORTS_GRAPHICS));
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync /*
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync * Tell the console interface about the event
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync * so that it can notify its consumers.
d1cbcedef8f8eb139111351e183add8c0b7d3645vboxsync */
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync pDrv->pVMMDev->getParent()->onAdditionsStateChange();
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync}
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync/**
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync * Update the mouse capabilities.
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync * This is called when the mouse capabilities change. The new capabilities
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync * are given and the connector should update its internal state.
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync *
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync * @param pInterface Pointer to this interface.
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync * @param newCapabilities New capabilities.
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync * @thread The emulation thread.
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync */
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsyncDECLCALLBACK(void) vmmdevUpdateMouseCapabilities(PPDMIVMMDEVCONNECTOR pInterface, uint32_t newCapabilities)
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync{
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync PDRVMAINVMMDEV pDrv = PDMIVMMDEVCONNECTOR_2_MAINVMMDEV(pInterface);
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync /*
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync * Tell the console interface about the event
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync * so that it can notify its consumers.
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync */
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync Mouse *pMouse = pDrv->pVMMDev->getParent()->getMouse();
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync if (pMouse) /** @todo and if not? Can that actually happen? */
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync {
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync pMouse->onVMMDevCanAbsChange(!!(newCapabilities & VMMDEV_MOUSE_GUEST_CAN_ABSOLUTE));
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync pMouse->onVMMDevNeedsHostChange(!!(newCapabilities & VMMDEV_MOUSE_GUEST_NEEDS_HOST_CURSOR));
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync }
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync}
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync/**
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync * Update the pointer shape or visibility.
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync *
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync * This is called when the mouse pointer shape changes or pointer is hidden/displaying.
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync * The new shape is passed as a caller allocated buffer that will be freed after returning.
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync *
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync * @param pInterface Pointer to this interface.
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync * @param fVisible Whether the pointer is visible or not.
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync * @param fAlpha Alpha channel information is present.
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync * @param xHot Horizontal coordinate of the pointer hot spot.
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync * @param yHot Vertical coordinate of the pointer hot spot.
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync * @param width Pointer width in pixels.
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync * @param height Pointer height in pixels.
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync * @param pShape The shape buffer. If NULL, then only pointer visibility is being changed.
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync * @thread The emulation thread.
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync */
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsyncDECLCALLBACK(void) vmmdevUpdatePointerShape(PPDMIVMMDEVCONNECTOR pInterface, bool fVisible, bool fAlpha,
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync uint32_t xHot, uint32_t yHot,
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync uint32_t width, uint32_t height,
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync void *pShape)
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync{
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync PDRVMAINVMMDEV pDrv = PDMIVMMDEVCONNECTOR_2_MAINVMMDEV(pInterface);
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync /* tell the console about it */
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync pDrv->pVMMDev->getParent()->onMousePointerShapeChange(fVisible, fAlpha,
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync xHot, yHot, width, height, pShape);
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync}
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsyncDECLCALLBACK(int) iface_VideoAccelEnable(PPDMIVMMDEVCONNECTOR pInterface, bool fEnable, VBVAMEMORY *pVbvaMemory)
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync{
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync PDRVMAINVMMDEV pDrv = PDMIVMMDEVCONNECTOR_2_MAINVMMDEV(pInterface);
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync Display *display = pDrv->pVMMDev->getParent()->getDisplay();
ddd5bf03356cc0515b0f42ed9048a6364e7eb1e2vboxsync
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync if (display)
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync {
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync LogSunlover(("MAIN::VMMDevInterface::iface_VideoAccelEnable: %d, %p\n", fEnable, pVbvaMemory));
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync return display->VideoAccelEnable (fEnable, pVbvaMemory);
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync }
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync return VERR_NOT_SUPPORTED;
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync}
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsyncDECLCALLBACK(void) iface_VideoAccelFlush(PPDMIVMMDEVCONNECTOR pInterface)
66a94fee6b0acc21c078369f49d97020cc03ab11vboxsync{
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync PDRVMAINVMMDEV pDrv = PDMIVMMDEVCONNECTOR_2_MAINVMMDEV(pInterface);
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync Display *display = pDrv->pVMMDev->getParent()->getDisplay();
ddd5bf03356cc0515b0f42ed9048a6364e7eb1e2vboxsync
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync if (display)
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync {
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync LogSunlover(("MAIN::VMMDevInterface::iface_VideoAccelFlush\n"));
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync display->VideoAccelFlush ();
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync }
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync}
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsyncDECLCALLBACK(int) vmmdevVideoModeSupported(PPDMIVMMDEVCONNECTOR pInterface, uint32_t display, uint32_t width, uint32_t height,
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync uint32_t bpp, bool *fSupported)
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync{
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync PDRVMAINVMMDEV pDrv = PDMIVMMDEVCONNECTOR_2_MAINVMMDEV(pInterface);
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync if (!fSupported)
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync return VERR_INVALID_PARAMETER;
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync#ifdef DEBUG_sunlover
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync Log(("vmmdevVideoModeSupported: [%d]: %dx%dx%d\n", display, width, height, bpp));
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync#endif
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync IFramebuffer *framebuffer = NULL;
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync LONG xOrigin = 0;
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync LONG yOrigin = 0;
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync HRESULT hrc = pDrv->pVMMDev->getParent()->getDisplay()->GetFramebuffer(display, &framebuffer, &xOrigin, &yOrigin);
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync if (SUCCEEDED(hrc) && framebuffer)
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync {
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync framebuffer->VideoModeSupported(width, height, bpp, (BOOL*)fSupported);
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync framebuffer->Release();
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync }
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync else
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync {
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync#ifdef DEBUG_sunlover
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync Log(("vmmdevVideoModeSupported: hrc %x, framebuffer %p!!!\n", hrc, framebuffer));
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync#endif
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync *fSupported = true;
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync }
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync return VINF_SUCCESS;
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync}
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsyncDECLCALLBACK(int) vmmdevGetHeightReduction(PPDMIVMMDEVCONNECTOR pInterface, uint32_t *heightReduction)
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync{
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync PDRVMAINVMMDEV pDrv = PDMIVMMDEVCONNECTOR_2_MAINVMMDEV(pInterface);
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync if (!heightReduction)
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync return VERR_INVALID_PARAMETER;
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync IFramebuffer *framebuffer = pDrv->pVMMDev->getParent()->getDisplay()->getFramebuffer();
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync if (framebuffer)
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync framebuffer->COMGETTER(HeightReduction)((ULONG*)heightReduction);
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync else
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync *heightReduction = 0;
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync return VINF_SUCCESS;
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync}
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsyncDECLCALLBACK(int) vmmdevSetCredentialsJudgementResult(PPDMIVMMDEVCONNECTOR pInterface, uint32_t u32Flags)
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync{
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync PDRVMAINVMMDEV pDrv = PDMIVMMDEVCONNECTOR_2_MAINVMMDEV(pInterface);
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync
ddd5bf03356cc0515b0f42ed9048a6364e7eb1e2vboxsync int rc = pDrv->pVMMDev->SetCredentialsJudgementResult (u32Flags);
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync return rc;
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync}
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsyncDECLCALLBACK(int) vmmdevSetVisibleRegion(PPDMIVMMDEVCONNECTOR pInterface, uint32_t cRect, PRTRECT pRect)
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync{
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync PDRVMAINVMMDEV pDrv = PDMIVMMDEVCONNECTOR_2_MAINVMMDEV(pInterface);
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync if (!cRect)
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync return VERR_INVALID_PARAMETER;
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync IFramebuffer *framebuffer = pDrv->pVMMDev->getParent()->getDisplay()->getFramebuffer();
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync if (framebuffer)
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync {
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync framebuffer->SetVisibleRegion((BYTE *)pRect, cRect);
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync#if defined(RT_OS_DARWIN) && defined(VBOX_WITH_HGCM) && defined(VBOX_WITH_CROGL)
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync {
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync BOOL is3denabled;
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync pDrv->pVMMDev->getParent()->machine()->COMGETTER(Accelerate3DEnabled)(&is3denabled);
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync if (is3denabled)
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync {
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync VBOXHGCMSVCPARM parms[2];
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync parms[0].type = VBOX_HGCM_SVC_PARM_PTR;
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync parms[0].u.pointer.addr = pRect;
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync parms[0].u.pointer.size = 0; /* We don't actually care. */
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync parms[1].type = VBOX_HGCM_SVC_PARM_32BIT;
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync parms[1].u.uint32 = cRect;
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync int rc = pDrv->pVMMDev->hgcmHostCall("VBoxSharedCrOpenGL", SHCRGL_HOST_FN_SET_VISIBLE_REGION, 2, &parms[0]);
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync return rc;
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync }
66a94fee6b0acc21c078369f49d97020cc03ab11vboxsync }
66a94fee6b0acc21c078369f49d97020cc03ab11vboxsync#endif
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync }
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync return VINF_SUCCESS;
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync}
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync
6902a98267d5180fb081cb5273751d0a628bf04dvboxsyncDECLCALLBACK(int) vmmdevQueryVisibleRegion(PPDMIVMMDEVCONNECTOR pInterface, uint32_t *pcRect, PRTRECT pRect)
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync{
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync PDRVMAINVMMDEV pDrv = PDMIVMMDEVCONNECTOR_2_MAINVMMDEV(pInterface);
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync IFramebuffer *framebuffer = pDrv->pVMMDev->getParent()->getDisplay()->getFramebuffer();
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync if (framebuffer)
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync {
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync ULONG cRect = 0;
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync framebuffer->GetVisibleRegion((BYTE *)pRect, cRect, &cRect);
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync *pcRect = cRect;
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync }
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync return VINF_SUCCESS;
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync}
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync/**
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync * Request the statistics interval
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync *
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync * @returns VBox status code.
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync * @param pInterface Pointer to this interface.
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync * @param pulInterval Pointer to interval in seconds
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync * @thread The emulation thread.
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync */
6902a98267d5180fb081cb5273751d0a628bf04dvboxsyncDECLCALLBACK(int) vmmdevQueryStatisticsInterval(PPDMIVMMDEVCONNECTOR pInterface, uint32_t *pulInterval)
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync{
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync PDRVMAINVMMDEV pDrv = PDMIVMMDEVCONNECTOR_2_MAINVMMDEV(pInterface);
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync ULONG val = 0;
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync if (!pulInterval)
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync return VERR_INVALID_POINTER;
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync /* store that information in IGuest */
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync Guest* guest = pDrv->pVMMDev->getParent()->getGuest();
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync Assert(guest);
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync if (!guest)
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync return VERR_INVALID_PARAMETER; /** @todo wrong error */
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync guest->COMGETTER(StatisticsUpdateInterval)(&val);
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync *pulInterval = val;
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync return VINF_SUCCESS;
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync}
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync/**
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync * Query the current balloon size
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync *
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync * @returns VBox status code.
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync * @param pInterface Pointer to this interface.
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync * @param pcbBalloon Balloon size
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync * @thread The emulation thread.
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync */
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsyncDECLCALLBACK(int) vmmdevQueryBalloonSize(PPDMIVMMDEVCONNECTOR pInterface, uint32_t *pcbBalloon)
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync{
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync PDRVMAINVMMDEV pDrv = PDMIVMMDEVCONNECTOR_2_MAINVMMDEV(pInterface);
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync ULONG val = 0;
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync if (!pcbBalloon)
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync return VERR_INVALID_POINTER;
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync /* store that information in IGuest */
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync Guest* guest = pDrv->pVMMDev->getParent()->getGuest();
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync Assert(guest);
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync if (!guest)
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync return VERR_INVALID_PARAMETER; /** @todo wrong error */
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync guest->COMGETTER(MemoryBalloonSize)(&val);
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync *pcbBalloon = val;
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync return VINF_SUCCESS;
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync}
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync/**
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync * Report new guest statistics
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync *
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync * @returns VBox status code.
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync * @param pInterface Pointer to this interface.
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync * @param pGuestStats Guest statistics
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync * @thread The emulation thread.
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync */
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsyncDECLCALLBACK(int) vmmdevReportStatistics(PPDMIVMMDEVCONNECTOR pInterface, VBoxGuestStatistics *pGuestStats)
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync{
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync PDRVMAINVMMDEV pDrv = PDMIVMMDEVCONNECTOR_2_MAINVMMDEV(pInterface);
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync Assert(pGuestStats);
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync if (!pGuestStats)
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync return VERR_INVALID_POINTER;
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync /* store that information in IGuest */
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync Guest* guest = pDrv->pVMMDev->getParent()->getGuest();
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync Assert(guest);
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync if (!guest)
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync return VERR_INVALID_PARAMETER; /** @todo wrong error */
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync if (pGuestStats->u32StatCaps & VBOX_GUEST_STAT_CPU_LOAD_IDLE)
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync guest->SetStatistic(pGuestStats->u32CpuId, GUESTSTATTYPE_CPUIDLE, pGuestStats->u32CpuLoad_Idle);
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync if (pGuestStats->u32StatCaps & VBOX_GUEST_STAT_CPU_LOAD_KERNEL)
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync guest->SetStatistic(pGuestStats->u32CpuId, GUESTSTATTYPE_CPUKERNEL, pGuestStats->u32CpuLoad_Kernel);
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync if (pGuestStats->u32StatCaps & VBOX_GUEST_STAT_CPU_LOAD_USER)
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync guest->SetStatistic(pGuestStats->u32CpuId, GUESTSTATTYPE_CPUUSER, pGuestStats->u32CpuLoad_User);
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync /** @todo r=bird: Convert from 4KB to 1KB units?
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync * CollectorGuestHAL::getGuestMemLoad says it returns KB units to
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync * preCollect(). I might be wrong ofc, this is convoluted code... */
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync if (pGuestStats->u32StatCaps & VBOX_GUEST_STAT_PHYS_MEM_TOTAL)
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync guest->SetStatistic(pGuestStats->u32CpuId, GUESTSTATTYPE_MEMTOTAL, pGuestStats->u32PhysMemTotal);
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync if (pGuestStats->u32StatCaps & VBOX_GUEST_STAT_PHYS_MEM_AVAIL)
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync guest->SetStatistic(pGuestStats->u32CpuId, GUESTSTATTYPE_MEMFREE, pGuestStats->u32PhysMemAvail);
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync if (pGuestStats->u32StatCaps & VBOX_GUEST_STAT_PHYS_MEM_BALLOON)
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync guest->SetStatistic(pGuestStats->u32CpuId, GUESTSTATTYPE_MEMBALLOON, pGuestStats->u32PhysMemBalloon);
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync if (pGuestStats->u32StatCaps & VBOX_GUEST_STAT_MEM_SYSTEM_CACHE)
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync guest->SetStatistic(pGuestStats->u32CpuId, GUESTSTATTYPE_MEMCACHE, pGuestStats->u32MemSystemCache);
0e8453fd4bba7dd5e9ffe786904f7114393fb69cvboxsync
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync if (pGuestStats->u32StatCaps & VBOX_GUEST_STAT_PAGE_FILE_SIZE)
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync guest->SetStatistic(pGuestStats->u32CpuId, GUESTSTATTYPE_PAGETOTAL, pGuestStats->u32PageFileSize);
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync return VINF_SUCCESS;
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync}
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync#ifdef VBOX_WITH_HGCM
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync/* HGCM connector interface */
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsyncstatic DECLCALLBACK(int) iface_hgcmConnect (PPDMIHGCMCONNECTOR pInterface, PVBOXHGCMCMD pCmd, PHGCMSERVICELOCATION pServiceLocation, uint32_t *pu32ClientID)
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync{
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync LogSunlover(("Enter\n"));
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync PDRVMAINVMMDEV pDrv = PDMIHGCMCONNECTOR_2_MAINVMMDEV(pInterface);
0e8453fd4bba7dd5e9ffe786904f7114393fb69cvboxsync
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync if ( !pServiceLocation
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync || ( pServiceLocation->type != VMMDevHGCMLoc_LocalHost
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync && pServiceLocation->type != VMMDevHGCMLoc_LocalHost_Existing))
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync {
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync return VERR_INVALID_PARAMETER;
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync }
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync if (!pDrv->pVMMDev->hgcmIsActive ())
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync {
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync return VERR_INVALID_STATE;
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync }
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync return HGCMGuestConnect (pDrv->pHGCMPort, pCmd, pServiceLocation->u.host.achName, pu32ClientID);
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync}
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsyncstatic DECLCALLBACK(int) iface_hgcmDisconnect (PPDMIHGCMCONNECTOR pInterface, PVBOXHGCMCMD pCmd, uint32_t u32ClientID)
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync{
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync LogSunlover(("Enter\n"));
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync PDRVMAINVMMDEV pDrv = PDMIHGCMCONNECTOR_2_MAINVMMDEV(pInterface);
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync if (!pDrv->pVMMDev->hgcmIsActive ())
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync {
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync return VERR_INVALID_STATE;
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync }
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync return HGCMGuestDisconnect (pDrv->pHGCMPort, pCmd, u32ClientID);
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync}
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsyncstatic DECLCALLBACK(int) iface_hgcmCall (PPDMIHGCMCONNECTOR pInterface, PVBOXHGCMCMD pCmd, uint32_t u32ClientID, uint32_t u32Function,
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync uint32_t cParms, PVBOXHGCMSVCPARM paParms)
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync{
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync LogSunlover(("Enter\n"));
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync PDRVMAINVMMDEV pDrv = PDMIHGCMCONNECTOR_2_MAINVMMDEV(pInterface);
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync if (!pDrv->pVMMDev->hgcmIsActive ())
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync {
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync return VERR_INVALID_STATE;
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync }
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync return HGCMGuestCall (pDrv->pHGCMPort, pCmd, u32ClientID, u32Function, cParms, paParms);
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync}
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync/**
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync * Execute state save operation.
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync *
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync * @returns VBox status code.
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync * @param pDrvIns Driver instance of the driver which registered the data unit.
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync * @param pSSM SSM operation handle.
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync */
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsyncstatic DECLCALLBACK(int) iface_hgcmSave(PPDMDRVINS pDrvIns, PSSMHANDLE pSSM)
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync{
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync LogSunlover(("Enter\n"));
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync return HGCMHostSaveState (pSSM);
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync}
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync/**
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync * Execute state load operation.
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync *
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync * @returns VBox status code.
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync * @param pDrvIns Driver instance of the driver which registered the data unit.
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync * @param pSSM SSM operation handle.
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync * @param uVersion Data layout version.
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync * @param uPass The data pass.
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync */
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsyncstatic DECLCALLBACK(int) iface_hgcmLoad(PPDMDRVINS pDrvIns, PSSMHANDLE pSSM, uint32_t uVersion, uint32_t uPass)
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync{
ddd5bf03356cc0515b0f42ed9048a6364e7eb1e2vboxsync LogFlowFunc(("Enter\n"));
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync if (uVersion != HGCM_SSM_VERSION)
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync return VERR_SSM_UNSUPPORTED_DATA_UNIT_VERSION;
ddd5bf03356cc0515b0f42ed9048a6364e7eb1e2vboxsync Assert(uPass == SSM_PASS_FINAL); NOREF(uPass);
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync return HGCMHostLoadState (pSSM);
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync}
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsyncint VMMDev::hgcmLoadService (const char *pszServiceLibrary, const char *pszServiceName)
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync{
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync if (!hgcmIsActive ())
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync {
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync return VERR_INVALID_STATE;
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync }
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync return HGCMHostLoad (pszServiceLibrary, pszServiceName);
ddd5bf03356cc0515b0f42ed9048a6364e7eb1e2vboxsync}
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync
fc080a2caa666d6cdc9f978d31b49587fdc91125vboxsyncint VMMDev::hgcmHostCall (const char *pszServiceName, uint32_t u32Function,
fc080a2caa666d6cdc9f978d31b49587fdc91125vboxsync uint32_t cParms, PVBOXHGCMSVCPARM paParms)
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync{
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync if (!hgcmIsActive ())
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync {
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync return VERR_INVALID_STATE;
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync }
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync return HGCMHostCall (pszServiceName, u32Function, cParms, paParms);
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync}
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsyncvoid VMMDev::hgcmShutdown (void)
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync{
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync ASMAtomicWriteBool(&m_fHGCMActive, false);
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync HGCMHostShutdown ();
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync}
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync#endif /* HGCM */
fc080a2caa666d6cdc9f978d31b49587fdc91125vboxsync
fc080a2caa666d6cdc9f978d31b49587fdc91125vboxsync
fc080a2caa666d6cdc9f978d31b49587fdc91125vboxsync/**
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync * @interface_method_impl{PDMIBASE,pfnQueryInterface}
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync */
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsyncDECLCALLBACK(void *) VMMDev::drvQueryInterface(PPDMIBASE pInterface, const char *pszIID)
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync{
ddd5bf03356cc0515b0f42ed9048a6364e7eb1e2vboxsync PPDMDRVINS pDrvIns = PDMIBASE_2_PDMDRV(pInterface);
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync PDRVMAINVMMDEV pDrv = PDMINS_2_DATA(pDrvIns, PDRVMAINVMMDEV);
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync PDMIBASE_RETURN_INTERFACE(pszIID, PDMIBASE, &pDrvIns->IBase);
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync PDMIBASE_RETURN_INTERFACE(pszIID, PDMIVMMDEVCONNECTOR, &pDrv->Connector);
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync#ifdef VBOX_WITH_HGCM
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync PDMIBASE_RETURN_INTERFACE(pszIID, PDMIHGCMCONNECTOR, &pDrv->HGCMConnector);
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync#endif
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync return NULL;
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync}
ddd5bf03356cc0515b0f42ed9048a6364e7eb1e2vboxsync
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync/**
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync * Destruct a VMMDev driver instance.
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync *
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync * @returns VBox status.
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync * @param pDrvIns The driver instance data.
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync */
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsyncDECLCALLBACK(void) VMMDev::drvDestruct(PPDMDRVINS pDrvIns)
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync{
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync PDRVMAINVMMDEV pData = PDMINS_2_DATA(pDrvIns, PDRVMAINVMMDEV);
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync LogFlow(("VMMDev::drvDestruct: iInstance=%d\n", pDrvIns->iInstance));
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync#ifdef VBOX_WITH_HGCM
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync /* HGCM is shut down on the VMMDev destructor. */
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync#endif /* VBOX_WITH_HGCM */
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync if (pData->pVMMDev)
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync {
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync pData->pVMMDev->mpDrv = NULL;
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync }
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync}
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync/**
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync * Reset notification.
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync *
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync * @returns VBox status.
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync * @param pDrvIns The driver instance data.
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync */
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsyncDECLCALLBACK(void) VMMDev::drvReset(PPDMDRVINS pDrvIns)
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync{
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync LogFlow(("VMMDev::drvReset: iInstance=%d\n", pDrvIns->iInstance));
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync#ifdef VBOX_WITH_HGCM
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync HGCMHostReset ();
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync#endif /* VBOX_WITH_HGCM */
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync}
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync/**
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync * Construct a VMMDev driver instance.
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync *
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync * @copydoc FNPDMDRVCONSTRUCT
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync */
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsyncDECLCALLBACK(int) VMMDev::drvConstruct(PPDMDRVINS pDrvIns, PCFGMNODE pCfgHandle, uint32_t fFlags)
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync{
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync PDRVMAINVMMDEV pData = PDMINS_2_DATA(pDrvIns, PDRVMAINVMMDEV);
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync LogFlow(("Keyboard::drvConstruct: iInstance=%d\n", pDrvIns->iInstance));
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync /*
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync * Validate configuration.
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync */
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync if (!CFGMR3AreValuesValid(pCfgHandle, "Object\0"))
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync return VERR_PDM_DRVINS_UNKNOWN_CFG_VALUES;
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync AssertMsgReturn(PDMDrvHlpNoAttach(pDrvIns) == VERR_PDM_NO_ATTACHED_DRIVER,
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync ("Configuration error: Not possible to attach anything to this driver!\n"),
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync VERR_PDM_DRVINS_NO_ATTACH);
ddd5bf03356cc0515b0f42ed9048a6364e7eb1e2vboxsync
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync /*
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync * IBase.
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync */
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync pDrvIns->IBase.pfnQueryInterface = VMMDev::drvQueryInterface;
ddd5bf03356cc0515b0f42ed9048a6364e7eb1e2vboxsync
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync pData->Connector.pfnUpdateGuestVersion = vmmdevUpdateGuestVersion;
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync pData->Connector.pfnUpdateGuestCapabilities = vmmdevUpdateGuestCapabilities;
96a93b5e6bd7da64f6be955c9fd7569b80c8ae2evboxsync pData->Connector.pfnUpdateMouseCapabilities = vmmdevUpdateMouseCapabilities;
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync pData->Connector.pfnUpdatePointerShape = vmmdevUpdatePointerShape;
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync pData->Connector.pfnVideoAccelEnable = iface_VideoAccelEnable;
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync pData->Connector.pfnVideoAccelFlush = iface_VideoAccelFlush;
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync pData->Connector.pfnVideoModeSupported = vmmdevVideoModeSupported;
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync pData->Connector.pfnGetHeightReduction = vmmdevGetHeightReduction;
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync pData->Connector.pfnSetCredentialsJudgementResult = vmmdevSetCredentialsJudgementResult;
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync pData->Connector.pfnSetVisibleRegion = vmmdevSetVisibleRegion;
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync pData->Connector.pfnQueryVisibleRegion = vmmdevQueryVisibleRegion;
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync pData->Connector.pfnReportStatistics = vmmdevReportStatistics;
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync pData->Connector.pfnQueryStatisticsInterval = vmmdevQueryStatisticsInterval;
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync pData->Connector.pfnQueryBalloonSize = vmmdevQueryBalloonSize;
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync#ifdef VBOX_WITH_HGCM
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync pData->HGCMConnector.pfnConnect = iface_hgcmConnect;
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync pData->HGCMConnector.pfnDisconnect = iface_hgcmDisconnect;
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync pData->HGCMConnector.pfnCall = iface_hgcmCall;
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync#endif
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync /*
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync * Get the IVMMDevPort interface of the above driver/device.
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync */
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync pData->pUpPort = PDMIBASE_QUERY_INTERFACE(pDrvIns->pUpBase, PDMIVMMDEVPORT);
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync AssertMsgReturn(pData->pUpPort, ("Configuration error: No VMMDev port interface above!\n"), VERR_PDM_MISSING_INTERFACE_ABOVE);
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync#ifdef VBOX_WITH_HGCM
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync pData->pHGCMPort = PDMIBASE_QUERY_INTERFACE(pDrvIns->pUpBase, PDMIHGCMPORT);
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync AssertMsgReturn(pData->pHGCMPort, ("Configuration error: No HGCM port interface above!\n"), VERR_PDM_MISSING_INTERFACE_ABOVE);
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync#endif
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync /*
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync * Get the Console object pointer and update the mpDrv member.
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync */
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync void *pv;
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync int rc = CFGMR3QueryPtr(pCfgHandle, "Object", &pv);
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync if (RT_FAILURE(rc))
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync {
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync AssertMsgFailed(("Configuration error: No/bad \"Object\" value! rc=%Rrc\n", rc));
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync return rc;
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync }
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync pData->pVMMDev = (VMMDev*)pv; /** @todo Check this cast! */
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync pData->pVMMDev->mpDrv = pData;
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync#ifdef VBOX_WITH_HGCM
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync rc = pData->pVMMDev->hgcmLoadService (VBOXSHAREDFOLDERS_DLL,
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync "VBoxSharedFolders");
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync pData->pVMMDev->fSharedFolderActive = RT_SUCCESS(rc);
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync if (RT_SUCCESS(rc))
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync {
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync PPDMLED pLed;
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync PPDMILEDPORTS pLedPort;
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync LogRel(("Shared Folders service loaded.\n"));
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync pLedPort = PDMIBASE_QUERY_INTERFACE(pDrvIns->pUpBase, PDMILEDPORTS);
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync AssertMsgReturn(pLedPort, ("Configuration error: No LED port interface above!\n"), VERR_PDM_MISSING_INTERFACE_ABOVE);
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync rc = pLedPort->pfnQueryStatusLed(pLedPort, 0, &pLed);
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync if (RT_SUCCESS(rc) && pLed)
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync {
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync VBOXHGCMSVCPARM parm;
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync parm.type = VBOX_HGCM_SVC_PARM_PTR;
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync parm.u.pointer.addr = pLed;
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync parm.u.pointer.size = sizeof(*pLed);
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync rc = HGCMHostCall("VBoxSharedFolders", SHFL_FN_SET_STATUS_LED, 1, &parm);
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync }
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync else
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync AssertMsgFailed(("pfnQueryStatusLed failed with %Rrc (pLed=%x)\n", rc, pLed));
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync }
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync else
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync LogRel(("Failed to load Shared Folders service %Rrc\n", rc));
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync rc = PDMDrvHlpSSMRegisterEx(pDrvIns, HGCM_SSM_VERSION, 4096 /* bad guess */,
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync NULL, NULL, NULL,
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync NULL, iface_hgcmSave, NULL,
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync NULL, iface_hgcmLoad, NULL);
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync if (RT_FAILURE(rc))
878e6d9047ecb951fb66b8923976ae616d994f61vboxsync return rc;
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync
878e6d9047ecb951fb66b8923976ae616d994f61vboxsync#endif /* VBOX_WITH_HGCM */
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync return VINF_SUCCESS;
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync}
878e6d9047ecb951fb66b8923976ae616d994f61vboxsync
878e6d9047ecb951fb66b8923976ae616d994f61vboxsync
878e6d9047ecb951fb66b8923976ae616d994f61vboxsync/**
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync * VMMDevice driver registration record.
878e6d9047ecb951fb66b8923976ae616d994f61vboxsync */
878e6d9047ecb951fb66b8923976ae616d994f61vboxsyncconst PDMDRVREG VMMDev::DrvReg =
878e6d9047ecb951fb66b8923976ae616d994f61vboxsync{
878e6d9047ecb951fb66b8923976ae616d994f61vboxsync /* u32Version */
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync PDM_DRVREG_VERSION,
878e6d9047ecb951fb66b8923976ae616d994f61vboxsync /* szName */
878e6d9047ecb951fb66b8923976ae616d994f61vboxsync "HGCM",
878e6d9047ecb951fb66b8923976ae616d994f61vboxsync /* szRCMod */
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync "",
878e6d9047ecb951fb66b8923976ae616d994f61vboxsync /* szR0Mod */
878e6d9047ecb951fb66b8923976ae616d994f61vboxsync "",
878e6d9047ecb951fb66b8923976ae616d994f61vboxsync /* pszDescription */
878e6d9047ecb951fb66b8923976ae616d994f61vboxsync "Main VMMDev driver (Main as in the API).",
878e6d9047ecb951fb66b8923976ae616d994f61vboxsync /* fFlags */
878e6d9047ecb951fb66b8923976ae616d994f61vboxsync PDM_DRVREG_FLAGS_HOST_BITS_DEFAULT,
878e6d9047ecb951fb66b8923976ae616d994f61vboxsync /* fClass. */
878e6d9047ecb951fb66b8923976ae616d994f61vboxsync PDM_DRVREG_CLASS_VMMDEV,
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync /* cMaxInstances */
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync ~0,
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync /* cbInstance */
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync sizeof(DRVMAINVMMDEV),
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync /* pfnConstruct */
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync VMMDev::drvConstruct,
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync /* pfnDestruct */
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync VMMDev::drvDestruct,
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync /* pfnRelocate */
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync NULL,
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync /* pfnIOCtl */
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync NULL,
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync /* pfnPowerOn */
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync NULL,
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync /* pfnReset */
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync VMMDev::drvReset,
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync /* pfnSuspend */
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync NULL,
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync /* pfnResume */
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync NULL,
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync /* pfnAttach */
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync NULL,
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync /* pfnDetach */
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync NULL,
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync /* pfnPowerOff */
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync NULL,
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync /* pfnSoftReset */
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync NULL,
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync /* u32EndVersion */
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync PDM_DRVREG_VERSION
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync};
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync/* vi: set tabstop=4 shiftwidth=4 expandtab: */
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync