GuestImpl.cpp revision cbf5a4260109bea05e1492f0b375b11a738cfb1d
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/* $Id$ */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/** @file
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * VirtualBox COM class implementation
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/*
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * Copyright (C) 2006-2008 Sun Microsystems, Inc.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * available from http://www.virtualbox.org. This file is free software;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * you can redistribute it and/or modify it under the terms of the GNU
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * General Public License (GPL) as published by the Free Software
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * Foundation, in version 2 as it comes in the "COPYING" file of the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * Clara, CA 95054 USA or visit http://www.sun.com if you need
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * additional information or have any questions.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#include "GuestImpl.h"
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#include "Global.h"
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#include "ConsoleImpl.h"
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#include "VMMDev.h"
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#include "AutoCaller.h"
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#include "Logging.h"
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#include <VBox/VMMDev.h>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#ifdef VBOX_WITH_GUEST_CONTROL
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# include <VBox/HostServices/GuestControlSvc.h>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# include <VBox/com/array.h>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#endif
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#include <iprt/cpp/utils.h>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#include <iprt/getopt.h>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync// defines
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/////////////////////////////////////////////////////////////////////////////
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync// constructor / destructor
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/////////////////////////////////////////////////////////////////////////////
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncDEFINE_EMPTY_CTOR_DTOR (Guest)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncHRESULT Guest::FinalConstruct()
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return S_OK;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncvoid Guest::FinalRelease()
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync uninit ();
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync// public methods only for internal purposes
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/////////////////////////////////////////////////////////////////////////////
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * Initializes the guest object.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncHRESULT Guest::init (Console *aParent)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LogFlowThisFunc(("aParent=%p\n", aParent));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ComAssertRet(aParent, E_INVALIDARG);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /* Enclose the state transition NotReady->InInit->Ready */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync AutoInitSpan autoInitSpan(this);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync AssertReturn(autoInitSpan.isOk(), E_FAIL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync unconst(mParent) = aParent;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /* mData.mAdditionsActive is FALSE */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /* Confirm a successful initialization when it's the case */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync autoInitSpan.setSucceeded();
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ULONG aMemoryBalloonSize;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync HRESULT ret = mParent->machine()->COMGETTER(MemoryBalloonSize)(&aMemoryBalloonSize);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (ret == S_OK)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mMemoryBalloonSize = aMemoryBalloonSize;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync else
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mMemoryBalloonSize = 0; /* Default is no ballooning */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mStatUpdateInterval = 0; /* Default is not to report guest statistics at all */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /* Clear statistics. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (unsigned i = 0 ; i < GUESTSTATTYPE_MAX; i++)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mCurrentGuestStat[i] = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return S_OK;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * Uninitializes the instance and sets the ready flag to FALSE.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * Called either from FinalRelease() or by the parent when it gets destroyed.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncvoid Guest::uninit()
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LogFlowThisFunc(("\n"));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /* Enclose the state transition Ready->InUninit->NotReady */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync AutoUninitSpan autoUninitSpan(this);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (autoUninitSpan.uninitDone())
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync unconst(mParent) = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync// IGuest properties
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/////////////////////////////////////////////////////////////////////////////
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncSTDMETHODIMP Guest::COMGETTER(OSTypeId) (BSTR *aOSTypeId)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CheckComArgOutPointerValid(aOSTypeId);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync AutoCaller autoCaller(this);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (FAILED(autoCaller.rc())) return autoCaller.rc();
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync AutoReadLock alock(this COMMA_LOCKVAL_SRC_POS);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // redirect the call to IMachine if no additions are installed
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (mData.mAdditionsVersion.isEmpty())
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return mParent->machine()->COMGETTER(OSTypeId)(aOSTypeId);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mData.mOSTypeId.cloneTo(aOSTypeId);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return S_OK;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncSTDMETHODIMP Guest::COMGETTER(AdditionsActive) (BOOL *aAdditionsActive)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CheckComArgOutPointerValid(aAdditionsActive);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync AutoCaller autoCaller(this);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (FAILED(autoCaller.rc())) return autoCaller.rc();
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync AutoReadLock alock(this COMMA_LOCKVAL_SRC_POS);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *aAdditionsActive = mData.mAdditionsActive;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return S_OK;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncSTDMETHODIMP Guest::COMGETTER(AdditionsVersion) (BSTR *aAdditionsVersion)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CheckComArgOutPointerValid(aAdditionsVersion);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync AutoCaller autoCaller(this);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (FAILED(autoCaller.rc())) return autoCaller.rc();
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync AutoReadLock alock(this COMMA_LOCKVAL_SRC_POS);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mData.mAdditionsVersion.cloneTo(aAdditionsVersion);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return S_OK;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncSTDMETHODIMP Guest::COMGETTER(SupportsSeamless) (BOOL *aSupportsSeamless)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CheckComArgOutPointerValid(aSupportsSeamless);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync AutoCaller autoCaller(this);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (FAILED(autoCaller.rc())) return autoCaller.rc();
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync AutoReadLock alock(this COMMA_LOCKVAL_SRC_POS);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *aSupportsSeamless = mData.mSupportsSeamless;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return S_OK;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncSTDMETHODIMP Guest::COMGETTER(SupportsGraphics) (BOOL *aSupportsGraphics)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CheckComArgOutPointerValid(aSupportsGraphics);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync AutoCaller autoCaller(this);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (FAILED(autoCaller.rc())) return autoCaller.rc();
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync AutoReadLock alock(this COMMA_LOCKVAL_SRC_POS);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *aSupportsGraphics = mData.mSupportsGraphics;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return S_OK;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncSTDMETHODIMP Guest::COMGETTER(MemoryBalloonSize) (ULONG *aMemoryBalloonSize)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CheckComArgOutPointerValid(aMemoryBalloonSize);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync AutoCaller autoCaller(this);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (FAILED(autoCaller.rc())) return autoCaller.rc();
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync AutoReadLock alock(this COMMA_LOCKVAL_SRC_POS);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *aMemoryBalloonSize = mMemoryBalloonSize;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return S_OK;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncSTDMETHODIMP Guest::COMSETTER(MemoryBalloonSize) (ULONG aMemoryBalloonSize)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync AutoCaller autoCaller(this);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (FAILED(autoCaller.rc())) return autoCaller.rc();
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync HRESULT ret = mParent->machine()->COMSETTER(MemoryBalloonSize)(aMemoryBalloonSize);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (ret == S_OK)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mMemoryBalloonSize = aMemoryBalloonSize;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /* forward the information to the VMM device */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync VMMDev *vmmDev = mParent->getVMMDev();
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (vmmDev)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync vmmDev->getVMMDevPort()->pfnSetMemoryBalloon(vmmDev->getVMMDevPort(), aMemoryBalloonSize);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return ret;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncSTDMETHODIMP Guest::COMGETTER(StatisticsUpdateInterval)(ULONG *aUpdateInterval)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CheckComArgOutPointerValid(aUpdateInterval);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync AutoCaller autoCaller(this);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (FAILED(autoCaller.rc())) return autoCaller.rc();
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync AutoReadLock alock(this COMMA_LOCKVAL_SRC_POS);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *aUpdateInterval = mStatUpdateInterval;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return S_OK;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncSTDMETHODIMP Guest::COMSETTER(StatisticsUpdateInterval)(ULONG aUpdateInterval)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync AutoCaller autoCaller(this);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (FAILED(autoCaller.rc())) return autoCaller.rc();
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mStatUpdateInterval = aUpdateInterval;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /* forward the information to the VMM device */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync VMMDev *vmmDev = mParent->getVMMDev();
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (vmmDev)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync vmmDev->getVMMDevPort()->pfnSetStatisticsInterval(vmmDev->getVMMDevPort(), aUpdateInterval);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return S_OK;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncSTDMETHODIMP Guest::InternalGetStatistics(ULONG aCpuId, ULONG *aCpuUser, ULONG *aCpuKernel, ULONG *aCpuIdle,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ULONG *aMemTotal, ULONG *aMemFree, ULONG *aMemBalloon, ULONG *aMemCache,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ULONG *aPageTotal, ULONG *aPageFree)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CheckComArgOutPointerValid(aCpuUser);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CheckComArgOutPointerValid(aCpuKernel);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CheckComArgOutPointerValid(aCpuIdle);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CheckComArgOutPointerValid(aMemTotal);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CheckComArgOutPointerValid(aMemFree);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CheckComArgOutPointerValid(aMemBalloon);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CheckComArgOutPointerValid(aMemCache);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CheckComArgOutPointerValid(aPageTotal);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CheckComArgOutPointerValid(aPageFree);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync AutoCaller autoCaller(this);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (FAILED(autoCaller.rc())) return autoCaller.rc();
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync AutoReadLock alock(this COMMA_LOCKVAL_SRC_POS);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *aCpuUser = mCurrentGuestStat[GUESTSTATTYPE_CPUUSER];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *aCpuKernel = mCurrentGuestStat[GUESTSTATTYPE_CPUKERNEL];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *aCpuIdle = mCurrentGuestStat[GUESTSTATTYPE_CPUIDLE];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *aMemTotal = mCurrentGuestStat[GUESTSTATTYPE_MEMTOTAL];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *aMemFree = mCurrentGuestStat[GUESTSTATTYPE_MEMFREE];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *aMemBalloon = mCurrentGuestStat[GUESTSTATTYPE_MEMBALLOON];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *aMemCache = mCurrentGuestStat[GUESTSTATTYPE_MEMCACHE];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *aPageTotal = mCurrentGuestStat[GUESTSTATTYPE_PAGETOTAL];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *aPageFree = mCurrentGuestStat[GUESTSTATTYPE_PAGEFREE];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return S_OK;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncHRESULT Guest::SetStatistic(ULONG aCpuId, GUESTSTATTYPE enmType, ULONG aVal)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync AutoCaller autoCaller(this);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (FAILED(autoCaller.rc())) return autoCaller.rc();
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (enmType >= GUESTSTATTYPE_MAX)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return E_INVALIDARG;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mCurrentGuestStat[enmType] = aVal;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return S_OK;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncSTDMETHODIMP Guest::SetCredentials(IN_BSTR aUserName, IN_BSTR aPassword,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN_BSTR aDomain, BOOL aAllowInteractiveLogon)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync AutoCaller autoCaller(this);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (FAILED(autoCaller.rc())) return autoCaller.rc();
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /* forward the information to the VMM device */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync VMMDev *vmmDev = mParent->getVMMDev();
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (vmmDev)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync uint32_t u32Flags = VMMDEV_SETCREDENTIALS_GUESTLOGON;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (!aAllowInteractiveLogon)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync u32Flags = VMMDEV_SETCREDENTIALS_NOLOCALLOGON;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync vmmDev->getVMMDevPort()->pfnSetCredentials(vmmDev->getVMMDevPort(),
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Utf8Str(aUserName).raw(), Utf8Str(aPassword).raw(),
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Utf8Str(aDomain).raw(), u32Flags);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return S_OK;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return setError(VBOX_E_VM_ERROR,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync tr("VMM device is not available (is the VM running?)"));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#ifdef VBOX_WITH_GUEST_CONTROL
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * Creates the argument list as an array used for executing a program.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * @returns VBox status code.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * @todo
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * @todo Respect spaces when quoting for arguments, e.g. "c:\\program files\\".
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * @todo Handle empty ("") argguments.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncint Guest::prepareExecuteArgs(const char *pszArgs, void **ppvList, uint32_t *pcbList, uint32_t *pcArgs)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync char **ppaArg;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync int iArgs;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync int rc = RTGetOptArgvFromString(&ppaArg, &iArgs, pszArgs, NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (RT_SUCCESS(rc))
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync char *pszTemp = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *pcbList = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (int i=0; i<iArgs; i++)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (i > 0) /* Insert space as delimiter. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync rc = RTStrAAppendN(&pszTemp, " ", 1);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (RT_FAILURE(rc))
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync else
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync rc = RTStrAAppendN(&pszTemp, ppaArg[i], strlen(ppaArg[i]));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (RT_FAILURE(rc))
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync RTGetOptArgvFree(ppaArg);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (RT_SUCCESS(rc))
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *ppvList = pszTemp;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *pcArgs = iArgs;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (pszTemp)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *pcbList = strlen(pszTemp) + 1; /* Include zero termination. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync else
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync RTStrFree(pszTemp);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return rc;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * Appends environment variables to the environment block. Each var=value pair is separated
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * by NULL (\0) sequence. The whole block will be stored in one blob and disassembled on the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * guest side later to fit into the HGCM param structure.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * @returns VBox status code.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * @todo
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncint Guest::prepareExecuteEnv(const char *pszEnv, void **ppvList, uint32_t *pcbList, uint32_t *pcEnv)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync int rc = VINF_SUCCESS;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync uint32_t cbLen = strlen(pszEnv);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (*ppvList)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync uint32_t cbNewLen = *pcbList + cbLen + 1; /* Include zero termination. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync char *pvTmp = (char*)RTMemRealloc(*ppvList, cbNewLen);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (NULL == pvTmp)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync rc = VERR_NO_MEMORY;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync else
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync memcpy(pvTmp + *pcbList, pszEnv, cbLen);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync pvTmp[cbNewLen - 1] = '\0'; /* Add zero termination. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *ppvList = (void**)pvTmp;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync else
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync char *pcTmp;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (RTStrAPrintf(&pcTmp, "%s", pszEnv) > 0)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *ppvList = (void**)pcTmp;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /* Reset counters. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *pcEnv = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *pcbList = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (RT_SUCCESS(rc))
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync {
*pcbList += cbLen + 1; /* Include zero termination. */
*pcEnv += 1; /* Increase env pairs count. */
}
return rc;
}
#endif /* VBOX_WITH_GUEST_CONTROL */
STDMETHODIMP Guest::ExecuteProgram(IN_BSTR aCommand, ULONG aFlags,
IN_BSTR aArguments, ComSafeArrayIn(IN_BSTR, aEnvironment),
IN_BSTR aStdIn, IN_BSTR aStdOut, IN_BSTR aStdErr,
IN_BSTR aUserName, IN_BSTR aPassword,
ULONG aTimeoutMS, ULONG *aPID)
{
#ifndef VBOX_WITH_GUEST_CONTROL
ReturnComNotImplemented();
#else /* VBOX_WITH_GUEST_CONTROL */
using namespace guestControl;
CheckComArgStrNotEmptyOrNull(aCommand);
CheckComArgOutPointerValid(aPID);
/* Flags are not supported at the moment. */
if (aFlags != 0)
return E_INVALIDARG;
HRESULT rc = S_OK;
try
{
AutoCaller autoCaller(this);
if (FAILED(autoCaller.rc())) return autoCaller.rc();
AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS);
/* Just be on the safe side when calling another process. */
alock.leave();
HRESULT rc = E_UNEXPECTED;
using namespace guestControl;
int vrc = VINF_SUCCESS;
Utf8Str Utf8Command(aCommand);
/* Prepare arguments. */
void *pvArgs;
uint32_t uNumArgs;
uint32_t cbArgs;
const char *pszCurArg = Utf8Str(aArguments).raw();
vrc = prepareExecuteArgs(pszCurArg,
&pvArgs, &cbArgs, &uNumArgs);
if (RT_SUCCESS(vrc))
{
/* Prepare environment. */
com::SafeArray<IN_BSTR> env(ComSafeArrayInArg(aEnvironment));
void *pvEnv = NULL;
uint32_t uNumEnv = env.size();
uint32_t cbEnv = 0;
for (unsigned i = 0; i < uNumEnv; i++)
{
const char *pszCurEnv = Utf8Str(env[i]).raw();
vrc = prepareExecuteEnv(pszCurEnv, &pvEnv, &cbEnv, &uNumEnv);
if (RT_FAILURE(vrc))
break;
}
if (RT_SUCCESS(vrc))
{
Utf8Str Utf8StdIn(aStdIn);
Utf8Str Utf8StdOut(aStdOut);
Utf8Str Utf8StdErr(aStdErr);
Utf8Str Utf8UserName(aUserName);
Utf8Str Utf8Password(aPassword);
VBOXHGCMSVCPARM paParms[13];
int i = 0;
paParms[i++].setPointer((void*)Utf8Command.raw(), (uint32_t)strlen(Utf8Command.raw()) + 1);
paParms[i++].setUInt32(aFlags);
paParms[i++].setUInt32(uNumArgs);
paParms[i++].setPointer((void*)pvArgs, cbArgs);
paParms[i++].setUInt32(uNumEnv);
paParms[i++].setPointer((void*)pvEnv, cbEnv);
paParms[i++].setPointer((void*)Utf8StdIn.raw(), (uint32_t)strlen(Utf8StdIn.raw()) + 1);
paParms[i++].setPointer((void*)Utf8StdOut.raw(), (uint32_t)strlen(Utf8StdOut.raw()) + 1);
paParms[i++].setPointer((void*)Utf8StdErr.raw(), (uint32_t)strlen(Utf8StdErr.raw()) + 1);
paParms[i++].setPointer((void*)Utf8UserName.raw(), (uint32_t)strlen(Utf8UserName.raw()) + 1);
paParms[i++].setPointer((void*)Utf8Password.raw(), (uint32_t)strlen(Utf8Password.raw()) + 1);
paParms[i++].setUInt32(aTimeoutMS);
/* Forward the information to the VMM device. */
AssertPtr(mParent);
VMMDev *vmmDev = mParent->getVMMDev();
if (vmmDev)
{
LogFlow(("Guest::ExecuteProgram: numParms=%d\n", i));
vrc = vmmDev->hgcmHostCall("VBoxGuestControlSvc", HOST_EXEC_CMD,
i, paParms);
/** @todo Get the PID. */
}
RTMemFree(pvEnv);
}
RTMemFree(pvArgs);
}
if (RT_SUCCESS(vrc))
rc = S_OK;
else
rc = setError(E_UNEXPECTED,
tr("The service call failed with the error %Rrc"),
vrc);
}
catch (std::bad_alloc &)
{
rc = E_OUTOFMEMORY;
};
return rc;
#endif /* VBOX_WITH_GUEST_CONTROL */
}
// public methods only for internal purposes
/////////////////////////////////////////////////////////////////////////////
void Guest::setAdditionsVersion(Bstr aVersion, VBOXOSTYPE aOsType)
{
AutoCaller autoCaller(this);
AssertComRCReturnVoid (autoCaller.rc());
AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS);
mData.mAdditionsVersion = aVersion;
mData.mAdditionsActive = !aVersion.isEmpty();
/* Older Additions didn't have this finer grained capability bit,
* so enable it by default. Newer Additions will disable it immediately
* if relevant. */
mData.mSupportsGraphics = mData.mAdditionsActive;
mData.mOSTypeId = Global::OSTypeId (aOsType);
}
void Guest::setSupportsSeamless (BOOL aSupportsSeamless)
{
AutoCaller autoCaller(this);
AssertComRCReturnVoid (autoCaller.rc());
AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS);
mData.mSupportsSeamless = aSupportsSeamless;
}
void Guest::setSupportsGraphics (BOOL aSupportsGraphics)
{
AutoCaller autoCaller(this);
AssertComRCReturnVoid (autoCaller.rc());
AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS);
mData.mSupportsGraphics = aSupportsGraphics;
}
/* vi: set tabstop=4 shiftwidth=4 expandtab: */