ConsoleImpl2.cpp revision 0fd7f5d01e211ed0835a6aa864249a4cf3604300
5383c976362d5b18656cf7b9248b2063a764a203vboxsync * VBox Console COM Class implementation
5383c976362d5b18656cf7b9248b2063a764a203vboxsync * @remark We've split out the code that the 64-bit VC++ v8 compiler finds
5383c976362d5b18656cf7b9248b2063a764a203vboxsync * problematic to optimize so we can disable optimizations and later,
5383c976362d5b18656cf7b9248b2063a764a203vboxsync * perhaps, find a real solution for it (like rewriting the code and
5383c976362d5b18656cf7b9248b2063a764a203vboxsync * to stop resemble a tonne of spaghetti).
5383c976362d5b18656cf7b9248b2063a764a203vboxsync * Copyright (C) 2006-2010 Sun Microsystems, Inc.
5383c976362d5b18656cf7b9248b2063a764a203vboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
5383c976362d5b18656cf7b9248b2063a764a203vboxsync * available from http://www.virtualbox.org. This file is free software;
5383c976362d5b18656cf7b9248b2063a764a203vboxsync * you can redistribute it and/or modify it under the terms of the GNU
5383c976362d5b18656cf7b9248b2063a764a203vboxsync * General Public License (GPL) as published by the Free Software
5383c976362d5b18656cf7b9248b2063a764a203vboxsync * Foundation, in version 2 as it comes in the "COPYING" file of the
5383c976362d5b18656cf7b9248b2063a764a203vboxsync * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
5383c976362d5b18656cf7b9248b2063a764a203vboxsync * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
5383c976362d5b18656cf7b9248b2063a764a203vboxsync * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa
5383c976362d5b18656cf7b9248b2063a764a203vboxsync * Clara, CA 95054 USA or visit http://www.sun.com if you need
5383c976362d5b18656cf7b9248b2063a764a203vboxsync * additional information or have any questions.
5383c976362d5b18656cf7b9248b2063a764a203vboxsync/*******************************************************************************
5383c976362d5b18656cf7b9248b2063a764a203vboxsync* Header Files *
5383c976362d5b18656cf7b9248b2063a764a203vboxsync*******************************************************************************/
5383c976362d5b18656cf7b9248b2063a764a203vboxsync// generated header
5383c976362d5b18656cf7b9248b2063a764a203vboxsync#if 0 /* enable to play with lots of memory. */
5383c976362d5b18656cf7b9248b2063a764a203vboxsync#include <VBox/pdmapi.h> /* For PDMR3DriverAttach/PDMR3DriverDetach */
#ifdef VBOX_WITH_CROGL
#ifdef VBOX_WITH_GUEST_PROPS
# include <vector>
#ifdef VBOX_WITH_NETFLT
# if defined(RT_OS_SOLARIS)
# include <zone.h>
# include <unistd.h>
# include <unistd.h>
# if defined(RT_OS_WINDOWS)
# include <Ntddndis.h>
# include <devguid.h>
# include <HostNetworkInterfaceImpl.h>
# include <netif.h>
# include <stdlib.h>
#include "DHCPServerRunner.h"
# include "IOKit/IOKitLib.h"
return VERR_INTERNAL_ERROR;
if (!service)
return VERR_INTERNAL_ERROR;
return VERR_INTERNAL_ERROR;
(const void*)&inputStruct,
sizeof(inputStruct),
(void*)&outputStruct,
return VERR_INTERNAL_ERROR;
return VINF_SUCCESS;
#define VMWARE_NET_IN_SLOT_11
switch (enmType)
struct BootNic
unsigned mPciDev;
unsigned mPciFn;
int rc;
if (!fPresent)
return VERR_FILE_NOT_FOUND;
return S_OK;
int rc;
return rc;
bool fFdcEnabled = false;
#if !defined(VBOX_WITH_XPCOM)
int rc;
#define RC_CHECK() do { if (RT_FAILURE(rc)) { AssertMsgFailed(("rc=%Rrc\n", rc)); STR_FREE(); return rc; } } while (0)
#define H() do { if (FAILED(hrc)) { AssertMsgFailed(("hrc=%Rhrc\n", hrc)); STR_FREE(); return VERR_GENERAL_FAILURE; } } while (0)
STR_FREE();
#ifdef VBOX_WITH_RAW_MODE
STR_FREE();
if (fOsXGuest)
#ifdef VBOX_WITH_RAW_MODE
# ifdef RT_OS_DARWIN
if (fHWVirtExEnabled)
&fSupportsLongMode); H();
/** @todo Not exactly pretty to check strings; VBOXOSTYPE would be better, but that requires quite a bit of API change in Main. */
if ( !fIs64BitGuest
&& fIOAPIC
#ifdef VBOX_WITH_XPCOM
RC_CHECK();
RC_CHECK();
if (ioBandwidthMax != 0)
#ifdef VBOX_WITH_HPET
fHpetEnabled = false;
if (fHpetEnabled)
#ifdef VBOX_WITH_SMC
fSmcEnabled = false;
if (fSmcEnabled)
#ifdef VBOX_WITH_LPC
fLpcEnabled = false;
if (fLpcEnabled)
#ifdef DEBUG
if (fIOAPIC)
#ifdef VBOX_WITH_2X_4GB_ADDR_SPACE /* not safe here yet. */ /** @todo this needs fixing !!! No wonder VGA is slooooooooow on 32-bit darwin! */
rc = CFGMR3InsertString(pCfg, "LogoFile", logoImagePath ? Utf8Str(logoImagePath).c_str() : ""); RC_CHECK();
int iShowBootMenu;
switch (eBootMenuMode)
unsigned cModes = 0;
STR_FREE();
++cModes;
STR_FREE();
if (pFramebuffer)
ulHeightReduction = 0;
#ifdef VBOX_WITH_EFI
if (!fEfiEnabled)
return VERR_INVALID_PARAMETER;
const char *pszBootDevice;
switch (bootDevice)
case DeviceType_Null:
case DeviceType_HardDisk:
case DeviceType_DVD:
case DeviceType_Floppy:
case DeviceType_Network:
eFwType =
STR_FREE();
STR_FREE();
STR_FREE();
STR_FREE();
if (fOsXGuest)
if (!pDev)
switch (enmCtrlType)
rc = CFGMR3InsertInteger(pCfg, "papLeds", (uintptr_t)&pConsole->mapStorageLeds[iLedScsi]); RC_CHECK();
rc = CFGMR3InsertInteger(pCfg, "papLeds", (uintptr_t)&pConsole->mapStorageLeds[iLedScsi]); RC_CHECK();
if (pBiosCfg)
{ "SataPrimaryMasterLUN", "SataPrimarySlaveLUN", "SataSecondaryMasterLUN", "SataSecondarySlaveLUN" };
if (pBiosCfg)
rc = CFGMR3InsertInteger(pCfg, "papLeds", (uintptr_t)&pConsole->mapStorageLeds[iLedSata]); RC_CHECK();
rc = CFGMR3InsertInteger(pCfg, "papLeds", (uintptr_t)&pConsole->mapStorageLeds[iLedIde]); RC_CHECK();
fFdcEnabled = true;
rc = CFGMR3InsertInteger(pCfg, "papLeds", (uintptr_t)&pConsole->mapStorageLeds[iLedFloppy]); RC_CHECK();
rc = CFGMR3InsertInteger(pCfg, "papLeds", (uintptr_t)&pConsole->mapStorageLeds[iLedScsi]); RC_CHECK();
AssertMsgFailedReturn(("invalid storage controller type: %d\n", enmCtrlType), VERR_GENERAL_FAILURE);
#ifdef VMWARE_NET_IN_SLOT_11
bool fSwapSlots3and11 = false;
#ifdef VBOX_WITH_E1000
#ifdef VBOX_WITH_VIRTIO
if (!fEnabled)
switch (adapterType)
#ifdef VBOX_WITH_E1000
#ifdef VBOX_WITH_VIRTIO
if (ulInstance)
#ifdef VMWARE_NET_IN_SLOT_11
fSwapSlots3and11 = true;
switch (adapterType)
rc = CFGMR3InsertInteger(pCfg, "papLeds", (uintptr_t)&pConsole->mapNetworkLeds[ulInstance]); RC_CHECK();
unsigned uBootIdx = 0;
if (serialPort)
if (!fEnabled)
STR_FREE();
if (parallelPort)
if (!fEnabled)
STR_FREE();
if (audioAdapter)
if (enabled)
switch (audioController)
case AudioControllerType_AC97:
case AudioControllerType_SB16:
switch (audioDriver)
case AudioDriverType_Null:
#ifdef RT_OS_WINDOWS
#ifdef VBOX_WITH_WINMM
case AudioDriverType_WinMM:
#ifdef RT_OS_SOLARIS
case AudioDriverType_SolAudio:
#ifdef RT_OS_LINUX
# ifdef VBOX_WITH_ALSA
case AudioDriverType_ALSA:
# ifdef VBOX_WITH_PULSE
case AudioDriverType_Pulse:
case AudioDriverType_OSS:
#ifdef RT_OS_FREEBSD
# ifdef VBOX_WITH_PULSE
case AudioDriverType_Pulse:
#ifdef RT_OS_DARWIN
STR_FREE();
if (USBCtlPtr)
if (fOhciEnabled)
#ifdef VBOX_WITH_EHCI
if (fEhciEnabled)
#ifdef VBOX_WITH_USB
// VBoxManage setextradata "myvm" "VBoxInternal/USB/USBProxy/GlobalConfig/Force11PacketSize" 1
switch (mode)
case ClipboardMode_Disabled:
pConsole->mVMMDev->hgcmHostCall("VBoxSharedClipboard", VBOX_SHARED_CLIPBOARD_HOST_FN_SET_MODE, 1, &parm);
#ifdef VBOX_WITH_CROGL
if (fEnabled)
#ifdef VBOX_WITH_GUEST_PROPS
#ifdef VBOX_WITH_GUEST_CONTROL
if (fACPI)
fShowCpu = true;
if (fCpuHotPlug)
if (fCpuAttached)
if (pszCFGMValueName)
if (pNode)
if ( pszCFGMValue
&& *pszCFGMValue)
AssertLogRelMsgRC(rc, ("failed to insert CFGM value '%s' to key '%s'\n", pszCFGMValue, pszExtraDataKey));
#undef H
return rc;
/*static*/ void Console::setVMRuntimeErrorCallbackF(PVM pVM, void *pvConsole, uint32_t fFlags, const char *pszErrorId, const char *pszFormat, ...)
#define RC_CHECK() do { if (RT_FAILURE(rc)) { AssertMsgFailed(("rc=%Rrc\n", rc)); STR_FREE(); return rc; } } while (0)
#define H() do { if (FAILED(hrc)) { AssertMsgFailed(("hrc=%Rhrc\n", hrc)); STR_FREE(); return VERR_GENERAL_FAILURE; } } while (0)
unsigned uLUN;
if (pLunL0)
if (fAttachDetach)
RC_CHECK();
if (fAttachDetach)
if (paLedDevType)
#undef H
return VINF_SUCCESS;;
bool fPassthrough,
#define RC_CHECK() do { if (RT_FAILURE(rc)) { AssertMsgFailed(("rc=%Rrc\n", rc)); STR_FREE(); return rc; } } while (0)
#define H() do { if (FAILED(hrc)) { AssertMsgFailed(("hrc=%Rhrc\n", hrc)); STR_FREE(); if (phrc) *phrc = hrc; return VERR_GENERAL_FAILURE; } } while (0)
if (pMedium)
if (fHostDrive)
STR_FREE();
STR_FREE();
switch (enmType)
case DeviceType_DVD:
case DeviceType_Floppy:
case DeviceType_HardDisk:
if (pMedium)
STR_FREE();
STR_FREE();
bool fHostIP = true;
fHostIP = false;
if (!pMedium)
STR_FREE();
STR_FREE();
fHostIP = false;
if (!fHostIP)
#undef H
return VINF_SUCCESS;
bool fAttachDetach)
#define RC_CHECK() do { if (RT_FAILURE(rc)) { AssertMsgFailed(("rc=%Rrc\n", rc)); STR_FREE(); return rc; } } while (0)
#define H() do { if (FAILED(hrc)) { AssertMsgFailed(("hrc=%Rhrc\n", hrc)); STR_FREE(); return VERR_GENERAL_FAILURE; } } while (0)
if (pLunAD)
STR_FREE();
STR_FREE();
switch (eAttachmentType)
if (fSniffer)
STR_FREE();
STR_FREE();
if (str)
STR_FREE();
if (str)
STR_FREE();
if (mtu)
if (sockRcv)
if (sockSnd)
if (tcpRcv)
if (tcpSnd)
STR_FREE();
if (str)
STR_FREE();
if (str)
STR_FREE();
if (str)
bool fValid = true;
switch (proto)
case NATProtocol_UDP:
case NATProtocol_TCP:
fValid = false;
if (!fValid)
if (port)
if (port)
switch (hrc)
case VERR_ACCESS_DENIED:
if (fSniffer)
if (fSniffer)
# if defined(RT_OS_DARWIN)
if (!pszColon)
if (pszSpace)
if (pszColon)
AssertLogRelMsgFailed(("NetworkAttachmentType_Bridged: FindByName failed, rc=%Rhrc (0x%x)", hrc, hrc));
STR_FREE();
&pNc,
&pszApp);
hrc = VBoxNetCfgWinGetComponentByGuid(pNc, &GUID_DEVCLASS_NET, (GUID*)hostIFGuid.ptr(), pAdaptorComponent.asOutParam());
wchar_t * pswzBindName;
AssertLogRelMsgFailed(("NetworkAttachmentType_Bridged: WideCharToMultiByte failed, hr=%Rhrc (0x%x) err=%u\n", hrc, hrc, err));
AssertFailed();
AssertLogRelMsgFailed(("NetworkAttachmentType_Bridged: VBoxNetCfgWinGetComponentByGuid failed, hrc (0x%x)", hrc));
/* we're not releasing the INetCfg stuff here since we use it later to figure out whether it is wireless */
# if defined(RT_OS_FREEBSD)
switch (hrc)
case VERR_ACCESS_DENIED:
"permissions of that node, and that the net.link.tap.user_open "
if (iSock >= 0)
setVMRuntimeErrorCallbackF(pVM, this, 0, "BridgedInterfaceDown", "Bridged interface %s is down. Guest will not be able to use this interface", pszHifName);
RC_CHECK();
# if defined(RT_OS_DARWIN)
/** @todo Come up with a better deal here. Problem is that IHostNetworkInterface is completely useless here. */
if (iSock >= 0)
if (fSharedMacOnWire)
RC_CHECK();
if (iSock >= 0)
if (fSharedMacOnWire)
RC_CHECK();
NULL,
NULL);
bool fSharedMacOnWire = false;
&Oid,
sizeof(Oid),
&PhMedium,
sizeof(PhMedium),
&cbResult,
NULL))
fSharedMacOnWire = true;
Assert(winEr == ERROR_INVALID_PARAMETER || winEr == ERROR_NOT_SUPPORTED || winEr == ERROR_BAD_COMMAND);
if (fSharedMacOnWire)
AssertLogRelMsgFailed(("Console::configConstructor: CreateFile failed, err (0x%x), ignoring\n", winEr));
# if defined(RT_OS_SOLARIS)
if (fSniffer)
RC_CHECK();
RC_CHECK();
STR_FREE();
if (fSniffer)
RC_CHECK();
RC_CHECK();
#if defined(RT_OS_WINDOWS)
# ifndef VBOX_WITH_NETFLT
STR_FREE();
&pNc,
&pszApp);
hrc = VBoxNetCfgWinGetComponentByGuid(pNc, &GUID_DEVCLASS_NET, (GUID*)hostIFGuid.ptr(), pAdaptorComponent.asOutParam());
LogRel(("NetworkAttachmentType_HostOnly: VBoxNetCfgWinGetComponentByGuid failed, hrc=%Rhrc (0x%x)\n", hrc, hrc));
wchar_t * pswzBindName;
AssertLogRelMsgFailed(("NetworkAttachmentType_HostOnly: WideCharToMultiByte failed, hr=%Rhrc (0x%x) err=%u\n", hrc, hrc, err));
AssertFailed();
AssertLogRelMsgFailed(("NetworkAttachmentType_HostOnly: VBoxNetCfgWinGetComponentByGuid failed, hrc=%Rhrc (0x%x)\n", hrc, hrc));
/* Grab the IP number from the 'vboxnetX' instance number (see netif.h) */
hrc = virtualBox->GetExtraData(BstrFmt("HostOnly/%s/IPV6Address", pszHifName), tmpAddr.asOutParam());
hrc = virtualBox->GetExtraData(BstrFmt("HostOnly/%s/IPV6NetMask", pszHifName), tmpMask.asOutParam());
#if defined(VBOX_WITH_VDE)
STR_FREE();
switch (eAttachmentType)
#if defined(VBOX_WITH_VDE)
if (fAttachDetach)
if (fEnabled)
#undef H
return VINF_SUCCESS;
#ifdef VBOX_WITH_GUEST_PROPS
&parms[0]);
&parms[0]);
&paParm);
return rc;
#ifdef VBOX_WITH_GUEST_PROPS
if (valuesOut[i])
if (flagsOut[i])
(void *)papszNames,
(void *)papszValues,
(void *)pau64Timestamps,
(void *)papszFlags);
for (unsigned i = 0; i < cProps; ++i)
if (valuesOut[i])
if (flagsOut[i])
return VINF_SUCCESS;
return VERR_NOT_SUPPORTED;
#ifdef VBOX_WITH_GUEST_CONTROL
return rc;
return VERR_NOT_SUPPORTED;