HostImpl.cpp revision 2e472cd3c6bfef41e092240234c070e89b2bf47c
c64777b77514bdc924249d2f9900be25079b0d84vboxsync * VirtualBox COM class implementation: Host
c64777b77514bdc924249d2f9900be25079b0d84vboxsync * Copyright (C) 2006-2007 Sun Microsystems, Inc.
c64777b77514bdc924249d2f9900be25079b0d84vboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
c64777b77514bdc924249d2f9900be25079b0d84vboxsync * available from http://www.virtualbox.org. This file is free software;
c64777b77514bdc924249d2f9900be25079b0d84vboxsync * you can redistribute it and/or modify it under the terms of the GNU
c64777b77514bdc924249d2f9900be25079b0d84vboxsync * General Public License (GPL) as published by the Free Software
c64777b77514bdc924249d2f9900be25079b0d84vboxsync * Foundation, in version 2 as it comes in the "COPYING" file of the
c64777b77514bdc924249d2f9900be25079b0d84vboxsync * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
c64777b77514bdc924249d2f9900be25079b0d84vboxsync * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
c64777b77514bdc924249d2f9900be25079b0d84vboxsync * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa
c64777b77514bdc924249d2f9900be25079b0d84vboxsync * Clara, CA 95054 USA or visit http://www.sun.com if you need
c64777b77514bdc924249d2f9900be25079b0d84vboxsync * additional information or have any questions.
c64777b77514bdc924249d2f9900be25079b0d84vboxsync/* bird: This is a hack to work around conflicts between these linux kernel headers
c64777b77514bdc924249d2f9900be25079b0d84vboxsync * and the GLIBC tcpip headers. They have different declarations of the 4
c64777b77514bdc924249d2f9900be25079b0d84vboxsync * standard byte order functions. */
c64777b77514bdc924249d2f9900be25079b0d84vboxsync// # include <libhal.h>
c64777b77514bdc924249d2f9900be25079b0d84vboxsync// /* These are defined by libhal.h and by VBox header files. */
c64777b77514bdc924249d2f9900be25079b0d84vboxsync// # undef TRUE
c64777b77514bdc924249d2f9900be25079b0d84vboxsync// # undef FALSE
c64777b77514bdc924249d2f9900be25079b0d84vboxsync#endif /* RT_OS_LINUX */
c64777b77514bdc924249d2f9900be25079b0d84vboxsync#endif /* RT_OS_SOLARIS */
c64777b77514bdc924249d2f9900be25079b0d84vboxsync#endif /* RT_OS_WINDOWS */
c64777b77514bdc924249d2f9900be25079b0d84vboxsync/** @todo the following line becomes obsolete after switching to Mp runtime functions */
c64777b77514bdc924249d2f9900be25079b0d84vboxsync// constructor / destructor
c64777b77514bdc924249d2f9900be25079b0d84vboxsync/////////////////////////////////////////////////////////////////////////////
c64777b77514bdc924249d2f9900be25079b0d84vboxsync// public initializer/uninitializer for internal purposes only
c64777b77514bdc924249d2f9900be25079b0d84vboxsync/////////////////////////////////////////////////////////////////////////////
c64777b77514bdc924249d2f9900be25079b0d84vboxsync * Initializes the host object.
c64777b77514bdc924249d2f9900be25079b0d84vboxsync * @returns COM result indicator
c64777b77514bdc924249d2f9900be25079b0d84vboxsync * @param parent handle of our parent object
c64777b77514bdc924249d2f9900be25079b0d84vboxsync * Create and initialize the USB Proxy Service.
c64777b77514bdc924249d2f9900be25079b0d84vboxsync# if defined (RT_OS_DARWIN)
c64777b77514bdc924249d2f9900be25079b0d84vboxsync mUSBProxyService = new USBProxyServiceDarwin (this);
c64777b77514bdc924249d2f9900be25079b0d84vboxsync mUSBProxyService = new USBProxyServiceLinux (this);
c64777b77514bdc924249d2f9900be25079b0d84vboxsync mUSBProxyService = new USBProxyServiceSolaris (this);
c64777b77514bdc924249d2f9900be25079b0d84vboxsync mUSBProxyService = new USBProxyServiceWindows (this);
c64777b77514bdc924249d2f9900be25079b0d84vboxsync#endif /* VBOX_WITH_USB */
c64777b77514bdc924249d2f9900be25079b0d84vboxsync /* Start resource usage sampler */
c64777b77514bdc924249d2f9900be25079b0d84vboxsync int vrc = RTTimerCreate (&mUsageSampler, VBOX_USAGE_SAMPLER_INTERVAL,
c64777b77514bdc924249d2f9900be25079b0d84vboxsync AssertMsgRC (vrc, ("Failed to create resource usage sampling "
c64777b77514bdc924249d2f9900be25079b0d84vboxsync#endif /* VBOX_WITH_RESOURCE_USAGE_API */
c64777b77514bdc924249d2f9900be25079b0d84vboxsync * Uninitializes the host object and sets the ready flag to FALSE.
c64777b77514bdc924249d2f9900be25079b0d84vboxsync * Called either from FinalRelease() or by the parent when it gets destroyed.
c64777b77514bdc924249d2f9900be25079b0d84vboxsync /* wait for USB proxy service to terminate before we uninit all USB
c64777b77514bdc924249d2f9900be25079b0d84vboxsync * devices */
c64777b77514bdc924249d2f9900be25079b0d84vboxsync LogFlowThisFunc (("Stopping USB proxy service...\n"));
c64777b77514bdc924249d2f9900be25079b0d84vboxsync LogFlowThisFunc (("Done stopping USB proxy service.\n"));
c64777b77514bdc924249d2f9900be25079b0d84vboxsync /* uninit all USB device filters still referenced by clients */
c64777b77514bdc924249d2f9900be25079b0d84vboxsync /* Destroy resource usage sampler */
c64777b77514bdc924249d2f9900be25079b0d84vboxsync AssertMsgRC (vrc, ("Failed to destroy resource usage "
c64777b77514bdc924249d2f9900be25079b0d84vboxsync#endif /* VBOX_WITH_RESOURCE_USAGE_API */
c64777b77514bdc924249d2f9900be25079b0d84vboxsync// IHost properties
c64777b77514bdc924249d2f9900be25079b0d84vboxsync/////////////////////////////////////////////////////////////////////////////
c64777b77514bdc924249d2f9900be25079b0d84vboxsync * Returns a list of host DVD drives.
c64777b77514bdc924249d2f9900be25079b0d84vboxsync * @returns COM status code
c64777b77514bdc924249d2f9900be25079b0d84vboxsync * @param drives address of result pointer
c64777b77514bdc924249d2f9900be25079b0d84vboxsyncSTDMETHODIMP Host::COMGETTER(DVDDrives) (IHostDVDDriveCollection **drives)
c64777b77514bdc924249d2f9900be25079b0d84vboxsync while (*p);
c64777b77514bdc924249d2f9900be25079b0d84vboxsync // Not all Solaris versions ship with libhal.
c64777b77514bdc924249d2f9900be25079b0d84vboxsync // So use a fallback approach similar to Linux.
c64777b77514bdc924249d2f9900be25079b0d84vboxsync cdromDrive = strtok(cdromEnv, ":"); /** @todo use strtok_r. */
c64777b77514bdc924249d2f9900be25079b0d84vboxsync // this might work on Solaris version older than Nevada.
c64777b77514bdc924249d2f9900be25079b0d84vboxsync // check the mounted drives
c64777b77514bdc924249d2f9900be25079b0d84vboxsync if (!getDVDInfoFromHal(list)) /* Playing with #defines in this way is nasty, I know. */
c64777b77514bdc924249d2f9900be25079b0d84vboxsync#endif /* USE_LIBHAL defined */
c64777b77514bdc924249d2f9900be25079b0d84vboxsync // On Linux without hal, the situation is much more complex. We will take a
c64777b77514bdc924249d2f9900be25079b0d84vboxsync // heuristical approach and also allow the user to specify a list of host
c64777b77514bdc924249d2f9900be25079b0d84vboxsync // CDROMs using an environment variable.
c64777b77514bdc924249d2f9900be25079b0d84vboxsync // The general strategy is to try some known device names and see of they
c64777b77514bdc924249d2f9900be25079b0d84vboxsync // exist. At last, we'll enumerate the /etc/fstab file (luckily there's an
c64777b77514bdc924249d2f9900be25079b0d84vboxsync // API to parse it) for CDROM devices. Ok, let's start!
c64777b77514bdc924249d2f9900be25079b0d84vboxsync cdromDrive = strtok(cdromEnv, ":"); /** @todo use strtok_r */
c64777b77514bdc924249d2f9900be25079b0d84vboxsync // this is a good guess usually
c64777b77514bdc924249d2f9900be25079b0d84vboxsync // check the mounted drives
c64777b77514bdc924249d2f9900be25079b0d84vboxsync // check the drives that can be mounted
c64777b77514bdc924249d2f9900be25079b0d84vboxsync /* PORTME */
c64777b77514bdc924249d2f9900be25079b0d84vboxsync * Returns a list of host floppy drives.
c64777b77514bdc924249d2f9900be25079b0d84vboxsync * @returns COM status code
c64777b77514bdc924249d2f9900be25079b0d84vboxsync * @param drives address of result pointer
c64777b77514bdc924249d2f9900be25079b0d84vboxsyncSTDMETHODIMP Host::COMGETTER(FloppyDrives) (IHostFloppyDriveCollection **drives)
c64777b77514bdc924249d2f9900be25079b0d84vboxsync while (*p);
c64777b77514bdc924249d2f9900be25079b0d84vboxsync if (!getFloppyInfoFromHal(list)) /* Playing with #defines in this way is nasty, I know. */
c64777b77514bdc924249d2f9900be25079b0d84vboxsync#endif /* USE_LIBHAL defined */
c64777b77514bdc924249d2f9900be25079b0d84vboxsync // As with the CDROMs, on Linux we have to take a multi-level approach
c64777b77514bdc924249d2f9900be25079b0d84vboxsync // involving parsing the mount tables. As this is not bulletproof, we'll
c64777b77514bdc924249d2f9900be25079b0d84vboxsync // give the user the chance to override the detection by an environment
c64777b77514bdc924249d2f9900be25079b0d84vboxsync // variable and skip the detection.
c64777b77514bdc924249d2f9900be25079b0d84vboxsync char *floppyEnv = strdupa(RTEnvGet("VBOX_FLOPPY"));
c64777b77514bdc924249d2f9900be25079b0d84vboxsync // check if this is an acceptable device
c64777b77514bdc924249d2f9900be25079b0d84vboxsync // we assume that a floppy is always /dev/fd[x] with x from 0 to 7
c64777b77514bdc924249d2f9900be25079b0d84vboxsync for (int i = 0; i <= 7; i++)
c64777b77514bdc924249d2f9900be25079b0d84vboxsync /* PORTME */
c64777b77514bdc924249d2f9900be25079b0d84vboxsync bool ret = false;
c64777b77514bdc924249d2f9900be25079b0d84vboxsync status = RegOpenKeyExA(HKEY_LOCAL_MACHINE, "SYSTEM\\CurrentControlSet\\Control\\Class\\{4D36E972-E325-11CE-BFC1-08002BE10318}", 0, KEY_READ, &hNetcard);
c64777b77514bdc924249d2f9900be25079b0d84vboxsync return false;
c64777b77514bdc924249d2f9900be25079b0d84vboxsync while(true)
c64777b77514bdc924249d2f9900be25079b0d84vboxsync status = RegEnumKeyExA(hNetcard, i, szEnumName, &len, NULL, NULL, NULL, NULL);
c64777b77514bdc924249d2f9900be25079b0d84vboxsync status = RegOpenKeyExA(hNetcard, szEnumName, 0, KEY_READ, &hNetCardGUID);
c64777b77514bdc924249d2f9900be25079b0d84vboxsync status = RegQueryValueExA(hNetCardGUID, "NetCfgInstanceId", NULL, &dwKeyType, (LPBYTE)szNetCfgInstanceId, &len);
c64777b77514bdc924249d2f9900be25079b0d84vboxsync if (status == ERROR_SUCCESS && dwKeyType == REG_SZ)
c64777b77514bdc924249d2f9900be25079b0d84vboxsync status = RegQueryValueExA(hNetCardGUID, "ProductName", NULL, &dwKeyType, (LPBYTE)szNetProductName, &len);
c64777b77514bdc924249d2f9900be25079b0d84vboxsync status = RegQueryValueExA(hNetCardGUID, "ProviderName", NULL, &dwKeyType, (LPBYTE)szNetProviderName, &len);
c64777b77514bdc924249d2f9900be25079b0d84vboxsync && !strcmp(szNetProductName, "VirtualBox TAP Adapter")
c64777b77514bdc924249d2f9900be25079b0d84vboxsync && (!strcmp(szNetProviderName, "innotek GmbH") || !strcmp(szNetProviderName, "Sun Microsystems, Inc.")))
c64777b77514bdc924249d2f9900be25079b0d84vboxsync * Returns a list of host network interfaces.
c64777b77514bdc924249d2f9900be25079b0d84vboxsync * @returns COM status code
c64777b77514bdc924249d2f9900be25079b0d84vboxsync * @param drives address of result pointer
c64777b77514bdc924249d2f9900be25079b0d84vboxsyncSTDMETHODIMP Host::COMGETTER(NetworkInterfaces) (IHostNetworkInterfaceCollection **networkInterfaces)
c64777b77514bdc924249d2f9900be25079b0d84vboxsync std::list <ComObjPtr <HostNetworkInterface> > list;
c64777b77514bdc924249d2f9900be25079b0d84vboxsync static const char *NetworkKey = "SYSTEM\\CurrentControlSet\\Control\\Network\\"
c64777b77514bdc924249d2f9900be25079b0d84vboxsync "{4D36E972-E325-11CE-BFC1-08002BE10318}";
c64777b77514bdc924249d2f9900be25079b0d84vboxsync status = RegOpenKeyExA (HKEY_LOCAL_MACHINE, NetworkKey, 0, KEY_READ, &hCtrlNet);
c64777b77514bdc924249d2f9900be25079b0d84vboxsync return setError (E_FAIL, tr("Could not open registry key \"%s\""), NetworkKey);
c64777b77514bdc924249d2f9900be25079b0d84vboxsync for (int i = 0;; ++ i)
c64777b77514bdc924249d2f9900be25079b0d84vboxsync status = RegEnumKeyExA (hCtrlNet, i, szNetworkGUID, &len, NULL, NULL, NULL, NULL);
c64777b77514bdc924249d2f9900be25079b0d84vboxsync RTStrPrintf (szNetworkConnection, sizeof (szNetworkConnection),
c64777b77514bdc924249d2f9900be25079b0d84vboxsync status = RegOpenKeyExA (hCtrlNet, szNetworkConnection, 0, KEY_READ, &hConnection);
c64777b77514bdc924249d2f9900be25079b0d84vboxsync status = RegQueryValueExW (hConnection, TEXT("Name"), NULL,
c64777b77514bdc924249d2f9900be25079b0d84vboxsync if (status == ERROR_SUCCESS && dwKeyType == REG_SZ)
c64777b77514bdc924249d2f9900be25079b0d84vboxsync size_t uniLen = (len + sizeof (OLECHAR) - 1) / sizeof (OLECHAR);
c64777b77514bdc924249d2f9900be25079b0d84vboxsync status = RegQueryValueExW (hConnection, TEXT("Name"), NULL,
c64777b77514bdc924249d2f9900be25079b0d84vboxsync RTLogPrintf("Connection name %ls\n", name.mutableRaw());
c64777b77514bdc924249d2f9900be25079b0d84vboxsync /* put a trailing zero, just in case (see MSDN) */
c64777b77514bdc924249d2f9900be25079b0d84vboxsync /* create a new object and add it to the list */
c64777b77514bdc924249d2f9900be25079b0d84vboxsync /* remove the curly bracket at the end */
c64777b77514bdc924249d2f9900be25079b0d84vboxsync if (SUCCEEDED (iface->init (name, Guid (szNetworkGUID + 1))))
c64777b77514bdc924249d2f9900be25079b0d84vboxsync ComObjPtr <HostNetworkInterfaceCollection> collection;
c64777b77514bdc924249d2f9900be25079b0d84vboxsync#endif /* RT_OS_WINDOWS */
c64777b77514bdc924249d2f9900be25079b0d84vboxsyncSTDMETHODIMP Host::COMGETTER(USBDevices)(IHostUSBDeviceCollection **aUSBDevices)
c64777b77514bdc924249d2f9900be25079b0d84vboxsync return mUSBProxyService->getDeviceCollection (aUSBDevices);
c64777b77514bdc924249d2f9900be25079b0d84vboxsync /* Note: The GUI depends on this method returning E_NOTIMPL with no
c64777b77514bdc924249d2f9900be25079b0d84vboxsync * extended error info to indicate that USB is simply not available
c64777b77514bdc924249d2f9900be25079b0d84vboxsync * (w/o treting it as a failure), for example, as in OSE */
c64777b77514bdc924249d2f9900be25079b0d84vboxsyncSTDMETHODIMP Host::COMGETTER(USBDeviceFilters) (IHostUSBDeviceFilterCollection **aUSBDeviceFilters)
c64777b77514bdc924249d2f9900be25079b0d84vboxsync ComObjPtr <HostUSBDeviceFilterCollection> collection;
c64777b77514bdc924249d2f9900be25079b0d84vboxsync /* Note: The GUI depends on this method returning E_NOTIMPL with no
c64777b77514bdc924249d2f9900be25079b0d84vboxsync * extended error info to indicate that USB is simply not available
c64777b77514bdc924249d2f9900be25079b0d84vboxsync * (w/o treting it as a failure), for example, as in OSE */
c64777b77514bdc924249d2f9900be25079b0d84vboxsync * Returns the number of installed logical processors
c64777b77514bdc924249d2f9900be25079b0d84vboxsync * @returns COM status code
c64777b77514bdc924249d2f9900be25079b0d84vboxsync * @param count address of result variable
c64777b77514bdc924249d2f9900be25079b0d84vboxsyncSTDMETHODIMP Host::COMGETTER(ProcessorCount)(ULONG *count)
c64777b77514bdc924249d2f9900be25079b0d84vboxsync /** @todo after implementing the Mp runtime on all platforms replace with
c64777b77514bdc924249d2f9900be25079b0d84vboxsync * *count = RTMpGetOnlineCount(); */
c64777b77514bdc924249d2f9900be25079b0d84vboxsync * Returns the (approximate) maximum speed of the given host CPU in MHz
c64777b77514bdc924249d2f9900be25079b0d84vboxsync * @returns COM status code
c64777b77514bdc924249d2f9900be25079b0d84vboxsync * @param cpu id to get info for.
c64777b77514bdc924249d2f9900be25079b0d84vboxsync * @param speed address of result variable, speed is 0 if unknown or cpuId is invalid.
c64777b77514bdc924249d2f9900be25079b0d84vboxsyncSTDMETHODIMP Host::COMGETTER(ProcessorSpeed)(ULONG cpuId, ULONG *speed)
c64777b77514bdc924249d2f9900be25079b0d84vboxsync /** @todo after implementing the Mp runtime on all platforms replace with
c64777b77514bdc924249d2f9900be25079b0d84vboxsync * *speed = RTMpGetOnlineCpuMaxSpeed(cpuId); */
c64777b77514bdc924249d2f9900be25079b0d84vboxsync * Returns a description string for the host CPU
c64777b77514bdc924249d2f9900be25079b0d84vboxsync * @returns COM status code
c64777b77514bdc924249d2f9900be25079b0d84vboxsync * @param cpu id to get info for.
c64777b77514bdc924249d2f9900be25079b0d84vboxsync * @param description address of result variable, NULL if known or cpuId is invalid.
c64777b77514bdc924249d2f9900be25079b0d84vboxsyncSTDMETHODIMP Host::COMGETTER(ProcessorDescription)(ULONG cpuId, BSTR *description)
c64777b77514bdc924249d2f9900be25079b0d84vboxsync /** @todo */
c64777b77514bdc924249d2f9900be25079b0d84vboxsync * Returns the amount of installed system memory in megabytes
c64777b77514bdc924249d2f9900be25079b0d84vboxsync * @returns COM status code
c64777b77514bdc924249d2f9900be25079b0d84vboxsync * @param size address of result variable
c64777b77514bdc924249d2f9900be25079b0d84vboxsyncSTDMETHODIMP Host::COMGETTER(MemorySize)(ULONG *size)
c64777b77514bdc924249d2f9900be25079b0d84vboxsync /** @todo */
c64777b77514bdc924249d2f9900be25079b0d84vboxsync * Returns the current system memory free space in megabytes
c64777b77514bdc924249d2f9900be25079b0d84vboxsync * @returns COM status code
c64777b77514bdc924249d2f9900be25079b0d84vboxsync * @param available address of result variable
c64777b77514bdc924249d2f9900be25079b0d84vboxsyncSTDMETHODIMP Host::COMGETTER(MemoryAvailable)(ULONG *available)
c64777b77514bdc924249d2f9900be25079b0d84vboxsync /** @todo */
c64777b77514bdc924249d2f9900be25079b0d84vboxsync * Returns the name string of the host operating system
c64777b77514bdc924249d2f9900be25079b0d84vboxsync * @returns COM status code
c64777b77514bdc924249d2f9900be25079b0d84vboxsync * @param os address of result variable
c64777b77514bdc924249d2f9900be25079b0d84vboxsyncSTDMETHODIMP Host::COMGETTER(OperatingSystem)(BSTR *os)
c64777b77514bdc924249d2f9900be25079b0d84vboxsync /** @todo */
c64777b77514bdc924249d2f9900be25079b0d84vboxsync * Returns the version string of the host operating system
c64777b77514bdc924249d2f9900be25079b0d84vboxsync * @returns COM status code
c64777b77514bdc924249d2f9900be25079b0d84vboxsync * @param os address of result variable
c64777b77514bdc924249d2f9900be25079b0d84vboxsyncSTDMETHODIMP Host::COMGETTER(OSVersion)(BSTR *version)
c64777b77514bdc924249d2f9900be25079b0d84vboxsync /** @todo */
c64777b77514bdc924249d2f9900be25079b0d84vboxsync * Returns the current host time in milliseconds since 1970-01-01 UTC.
c64777b77514bdc924249d2f9900be25079b0d84vboxsync * @returns COM status code
c64777b77514bdc924249d2f9900be25079b0d84vboxsync * @param time address of result variable
c64777b77514bdc924249d2f9900be25079b0d84vboxsyncSTDMETHODIMP Host::COMGETTER(UTCTime)(LONG64 *aUTCTime)
c64777b77514bdc924249d2f9900be25079b0d84vboxsync// IHost methods
c64777b77514bdc924249d2f9900be25079b0d84vboxsync////////////////////////////////////////////////////////////////////////////////
c64777b77514bdc924249d2f9900be25079b0d84vboxsync * Returns TRUE if the Windows version is 6.0 or greater (i.e. it's Vista and
c64777b77514bdc924249d2f9900be25079b0d84vboxsync * later OSes) and it has the UAC (User Account Control) feature enabled.
c64777b77514bdc924249d2f9900be25079b0d84vboxsync info.dwOSVersionInfoSize = sizeof (OSVERSIONINFOEX);
c64777b77514bdc924249d2f9900be25079b0d84vboxsync LogFlowFunc (("dwMajorVersion=%d, dwMinorVersion=%d\n",
c64777b77514bdc924249d2f9900be25079b0d84vboxsync /* we are interested only in Vista (and newer versions...). In all
c64777b77514bdc924249d2f9900be25079b0d84vboxsync * earlier versions UAC is not present. */
c64777b77514bdc924249d2f9900be25079b0d84vboxsync /* the default EnableLUA value is 1 (Enabled) */
c64777b77514bdc924249d2f9900be25079b0d84vboxsync "Software\\Microsoft\\Windows\\CurrentVersion\\Policies\\System",
c64777b77514bdc924249d2f9900be25079b0d84vboxsync Assert (rc == ERROR_SUCCESS || rc == ERROR_PATH_NOT_FOUND);
c64777b77514bdc924249d2f9900be25079b0d84vboxsync rc = RegQueryValueExA (hKey, "EnableLUA", NULL, NULL,
c64777b77514bdc924249d2f9900be25079b0d84vboxsync Assert (rc == ERROR_SUCCESS || rc == ERROR_FILE_NOT_FOUND);
c64777b77514bdc924249d2f9900be25079b0d84vboxsync LogFlowFunc (("rc=%d, dwEnableLUA=%d\n", rc, dwEnableLUA));
c64777b77514bdc924249d2f9900be25079b0d84vboxsync /* for SVCHlpMsg::CreateHostNetworkInterface */
c64777b77514bdc924249d2f9900be25079b0d84vboxsync /* for SVCHlpMsg::RemoveHostNetworkInterface */
c64777b77514bdc924249d2f9900be25079b0d84vboxsync /* first check whether an interface with the given name already exists */
c64777b77514bdc924249d2f9900be25079b0d84vboxsync rc = COMGETTER(NetworkInterfaces) (coll.asOutParam());
c64777b77514bdc924249d2f9900be25079b0d84vboxsync if (SUCCEEDED (coll->FindByName (aName, iface.asOutParam())))
c64777b77514bdc924249d2f9900be25079b0d84vboxsync tr ("Host network interface '%ls' already exists"), aName);
c64777b77514bdc924249d2f9900be25079b0d84vboxsync /* create a progress object */
c64777b77514bdc924249d2f9900be25079b0d84vboxsync rc = progress->init (mParent, static_cast <IHost *> (this),
c64777b77514bdc924249d2f9900be25079b0d84vboxsync /* create a new uninitialized host interface object */
c64777b77514bdc924249d2f9900be25079b0d84vboxsync /* create the networkInterfaceHelperClient() argument */
c64777b77514bdc924249d2f9900be25079b0d84vboxsync d->msgCode = SVCHlpMsg::CreateHostNetworkInterface;
c64777b77514bdc924249d2f9900be25079b0d84vboxsync static_cast <void *> (d.get()),
c64777b77514bdc924249d2f9900be25079b0d84vboxsync /* d is now owned by networkInterfaceHelperClient(), so release it */
c64777b77514bdc924249d2f9900be25079b0d84vboxsyncHost::RemoveHostNetworkInterface (INPTR GUIDPARAM aId,
e07a7480bb140d8cebbb6599980c7da0a12a6c4avboxsync /* first check whether an interface with the given name already exists */
e07a7480bb140d8cebbb6599980c7da0a12a6c4avboxsync rc = COMGETTER(NetworkInterfaces) (coll.asOutParam());
c64777b77514bdc924249d2f9900be25079b0d84vboxsync if (FAILED (coll->FindById (aId, iface.asOutParam())))
c64777b77514bdc924249d2f9900be25079b0d84vboxsync tr ("Host network interface with UUID {%Vuuid} does not exist"),
c64777b77514bdc924249d2f9900be25079b0d84vboxsync /* return the object to be removed to the caller */
c64777b77514bdc924249d2f9900be25079b0d84vboxsync /* create a progress object */
c64777b77514bdc924249d2f9900be25079b0d84vboxsync rc = progress->init (mParent, static_cast <IHost *> (this),
c64777b77514bdc924249d2f9900be25079b0d84vboxsync /* create the networkInterfaceHelperClient() argument */
c64777b77514bdc924249d2f9900be25079b0d84vboxsync d->msgCode = SVCHlpMsg::RemoveHostNetworkInterface;
c64777b77514bdc924249d2f9900be25079b0d84vboxsync static_cast <void *> (d.get()),
c64777b77514bdc924249d2f9900be25079b0d84vboxsync /* d is now owned by networkInterfaceHelperClient(), so release it */
c64777b77514bdc924249d2f9900be25079b0d84vboxsync#endif /* RT_OS_WINDOWS */
c64777b77514bdc924249d2f9900be25079b0d84vboxsyncSTDMETHODIMP Host::CreateUSBDeviceFilter (INPTR BSTR aName, IHostUSBDeviceFilter **aFilter)
c64777b77514bdc924249d2f9900be25079b0d84vboxsync /* Note: The GUI depends on this method returning E_NOTIMPL with no
c64777b77514bdc924249d2f9900be25079b0d84vboxsync * extended error info to indicate that USB is simply not available
c64777b77514bdc924249d2f9900be25079b0d84vboxsync * (w/o treting it as a failure), for example, as in OSE */
c64777b77514bdc924249d2f9900be25079b0d84vboxsyncSTDMETHODIMP Host::InsertUSBDeviceFilter (ULONG aPosition, IHostUSBDeviceFilter *aFilter)
c64777b77514bdc924249d2f9900be25079b0d84vboxsync /* Note: HostUSBDeviceFilter and USBProxyService also uses this lock. */
c64777b77514bdc924249d2f9900be25079b0d84vboxsync ComObjPtr <HostUSBDeviceFilter> filter = getDependentChild (aFilter);
c64777b77514bdc924249d2f9900be25079b0d84vboxsync tr ("The given USB device filter is not created within "
c64777b77514bdc924249d2f9900be25079b0d84vboxsync "this VirtualBox instance"));
c64777b77514bdc924249d2f9900be25079b0d84vboxsync tr ("The given USB device filter is already in the list"));
c64777b77514bdc924249d2f9900be25079b0d84vboxsync /* iterate to the position... */
c64777b77514bdc924249d2f9900be25079b0d84vboxsync USBDeviceFilterList::iterator it = mUSBDeviceFilters.begin();
c64777b77514bdc924249d2f9900be25079b0d84vboxsync /* ...and insert */
c64777b77514bdc924249d2f9900be25079b0d84vboxsync /* notify the proxy (only when the filter is active) */
c64777b77514bdc924249d2f9900be25079b0d84vboxsync if (mUSBProxyService->isActive() && filter->data().mActive)
c64777b77514bdc924249d2f9900be25079b0d84vboxsync filter->id() = mUSBProxyService->insertFilter (&filter->data().mUSBFilter);
c64777b77514bdc924249d2f9900be25079b0d84vboxsync /* save the global settings */
c64777b77514bdc924249d2f9900be25079b0d84vboxsync /* Note: The GUI depends on this method returning E_NOTIMPL with no
c64777b77514bdc924249d2f9900be25079b0d84vboxsync * extended error info to indicate that USB is simply not available
c64777b77514bdc924249d2f9900be25079b0d84vboxsync * (w/o treting it as a failure), for example, as in OSE */
c64777b77514bdc924249d2f9900be25079b0d84vboxsyncSTDMETHODIMP Host::RemoveUSBDeviceFilter (ULONG aPosition, IHostUSBDeviceFilter **aFilter)
c64777b77514bdc924249d2f9900be25079b0d84vboxsync /* Note: HostUSBDeviceFilter and USBProxyService also uses this lock. */
c64777b77514bdc924249d2f9900be25079b0d84vboxsync tr ("Invalid position: %lu (must be in range [0, %lu])"),
c64777b77514bdc924249d2f9900be25079b0d84vboxsync /* iterate to the position... */
c64777b77514bdc924249d2f9900be25079b0d84vboxsync USBDeviceFilterList::iterator it = mUSBDeviceFilters.begin();
c64777b77514bdc924249d2f9900be25079b0d84vboxsync /* ...get an element from there... */
c64777b77514bdc924249d2f9900be25079b0d84vboxsync /* ...and remove */
c64777b77514bdc924249d2f9900be25079b0d84vboxsync /* notify the proxy (only when the filter is active) */
c64777b77514bdc924249d2f9900be25079b0d84vboxsync if (mUSBProxyService->isActive() && filter->data().mActive)
c64777b77514bdc924249d2f9900be25079b0d84vboxsync /* save the global settings */
c64777b77514bdc924249d2f9900be25079b0d84vboxsync /* Note: The GUI depends on this method returning E_NOTIMPL with no
c64777b77514bdc924249d2f9900be25079b0d84vboxsync * extended error info to indicate that USB is simply not available
c64777b77514bdc924249d2f9900be25079b0d84vboxsync * (w/o treting it as a failure), for example, as in OSE */
c64777b77514bdc924249d2f9900be25079b0d84vboxsyncSTDMETHODIMP Host::GetProcessorUsage (ULONG *aUser, ULONG *aSystem, ULONG *aIdle)
c64777b77514bdc924249d2f9900be25079b0d84vboxsync if (aUser == NULL || aSystem == NULL || aIdle == NULL)
c64777b77514bdc924249d2f9900be25079b0d84vboxsync#else /* !VBOX_WITH_RESOURCE_USAGE_API */
c64777b77514bdc924249d2f9900be25079b0d84vboxsync#endif /* !VBOX_WITH_RESOURCE_USAGE_API */
c64777b77514bdc924249d2f9900be25079b0d84vboxsync// public methods only for internal purposes
c64777b77514bdc924249d2f9900be25079b0d84vboxsync////////////////////////////////////////////////////////////////////////////////
c64777b77514bdc924249d2f9900be25079b0d84vboxsyncHRESULT Host::loadSettings (const settings::Key &aGlobal)
c64777b77514bdc924249d2f9900be25079b0d84vboxsync using namespace settings;
c64777b77514bdc924249d2f9900be25079b0d84vboxsync Key::List filters = aGlobal.key ("USBDeviceFilters").keys ("DeviceFilter");
c64777b77514bdc924249d2f9900be25079b0d84vboxsync for (Key::List::const_iterator it = filters.begin();
c64777b77514bdc924249d2f9900be25079b0d84vboxsync Bstr manufacturer = (*it).stringValue ("manufacturer");
c64777b77514bdc924249d2f9900be25079b0d84vboxsync Bstr serialNumber = (*it).stringValue ("serialNumber");
c64777b77514bdc924249d2f9900be25079b0d84vboxsync const char *actionStr = (*it).stringValue ("action");
action);
return rc;
using namespace settings;
CHECK_READY();
#ifdef VBOX_WITH_USB
++ it;
return S_OK;
#ifdef VBOX_WITH_USB
CHECK_READY();
if (aActiveChanged)
return S_OK;
void Host::getUSBFilters(Host::USBDeviceFilterList *aGlobalFilters, VirtualBox::SessionMachineVector *aMachines)
# ifdef VBOX_USE_LIBHAL
bool halSuccess = false;
if (!gLibHalCheckPresence())
if (dbusConnection != 0)
if (halContext != 0)
int numDevices;
if (halDevices != 0)
halSuccess = true;
for (int i = 0; i < numDevices; i++)
#ifdef RT_OS_SOLARIS
if (devNode != 0)
if (product == 0)
LogRel(("Host::COMGETTER(DVDDrives): failed to get property \"info.product\" for device %s. dbus error: %s (%s)\n",
if (vendor != 0)
if (product != 0)
#ifndef RT_OS_SOLARIS
LogRel(("Host::COMGETTER(DVDDrives): failed to get property \"block.device\" for device %s. dbus error: %s (%s)\n",
LogRel(("Host::COMGETTER(DVDDrives): failed to get devices with capability \"storage.cdrom\". dbus error: %s (%s)\n", dbusError.name, dbusError.message));
LogRel(("Host::COMGETTER(DVDDrives): failed to shutdown the libhal context. dbus error: %s (%s)\n", dbusError.name, dbusError.message));
LogRel(("Host::COMGETTER(DVDDrives): failed to initialise libhal context. dbus error: %s (%s)\n", dbusError.name, dbusError.message));
LogRel(("Host::COMGETTER(DVDDrives): failed to connect to dbus. dbus error: %s (%s)\n", dbusError.name, dbusError.message));
return halSuccess;
bool halSuccess = false;
if (!gLibHalCheckPresence())
if (dbusConnection != 0)
if (halContext != 0)
int numDevices;
if (halDevices != 0)
halSuccess = true;
for (int i = 0; i < numDevices; i++)
if (driveType != 0)
if (devNode != 0)
if (product == 0)
LogRel(("Host::COMGETTER(FloppyDrives): failed to get property \"info.product\" for device %s. dbus error: %s (%s)\n",
if (vendor != 0)
if (product != 0)
// LogRel(("Host::COMGETTER(FloppyDrives): failed to validate the block device %s as a floppy drive\n"));
LogRel(("Host::COMGETTER(FloppyDrives): failed to get property \"block.device\" for device %s. dbus error: %s (%s)\n",
LogRel(("Host::COMGETTER(FloppyDrives): failed to get devices with capability \"storage.cdrom\". dbus error: %s (%s)\n", dbusError.name, dbusError.message));
LogRel(("Host::COMGETTER(FloppyDrives): failed to shutdown the libhal context. dbus error: %s (%s)\n", dbusError.name, dbusError.message));
LogRel(("Host::COMGETTER(FloppyDrives): failed to initialise libhal context. dbus error: %s (%s)\n", dbusError.name, dbusError.message));
LogRel(("Host::COMGETTER(FloppyDrives): failed to connect to dbus. dbus error: %s (%s)\n", dbusError.name, dbusError.message));
return halSuccess;
#ifdef RT_OS_LINUX
if (mtab)
char *mnt_type;
char *mnt_dev;
char *tmp;
if (tmp)
if (mnt_type)
if (tmp)
if (tmp)
if (mnt_dev)
if (tmp)
if (mntFile)
bool retValue = false;
if (!deviceNode)
if (isCDROM)
int fileHandle;
if (fileHandle >= 0)
#ifdef RT_OS_LINUX
retValue = true;
retValue = true;
return retValue;
#ifdef VBOX_WITH_USB
CHECK_READY();
return S_OK;
#ifdef RT_OS_WINDOWS
/* The original source of the VBoxTAP adapter creation/destruction code has the following copyright */
return E_INVALIDARG;
&pidl);
if (pShellFolder)
return hr;
return E_FAIL;
return E_FAIL;
return E_FAIL;
return status;
return S_OK;
GetLastError()));
if (!ok)
GetLastError()));
if (!ok)
GetLastError()));
if (!ok)
GetLastError()));
if (!ok)
GetLastError()));
while (TRUE)
if (!ret)
index++;
sizeof (detailBuf),
NULL))
TCHAR * t;
index ++;
if (!found)
if (!ok)
GetLastError()));
if (!ok)
GetLastError()));
if (!ok)
GetLastError()));
if (!ok)
GetLastError()));
if (ok)
if (!ok)
GetLastError()));
if (!ok)
GetLastError()));
if (!ok)
GetLastError()));
if (!ok)
GetLastError()));
KEY_READ);
GetLastError()));
if (destroyList)
return vrc;
SetErrBreak ((
SetErrBreak ((
SetErrBreak ((
if (hkeyConnection)
if (hkeyNetwork)
while (TRUE)
if (!ok)
index++;
NULL,
NULL,
&size);
if (!ok)
index++;
NULL,
size,
NULL);
if (!ok)
index++;
index++;
if (deviceHwid)
if (found)
index++;
GetLastError()));
if (!ok)
GetLastError()));
if (!ok)
GetLastError()));
return vrc;
return S_OK;
switch (d->msgCode)
bool endLoop = false;
while (!endLoop)
switch (reply)
endLoop = true;
endLoop = true;
endLoop = true;
bool endLoop = false;
while (!endLoop)
switch (reply)
endLoop = true;
endLoop = true;
endLoop = true;
if (aVrc)
return rc;
switch (aMsgCode)
return vrc;
#ifdef VBOX_WITH_RESOURCE_USAGE_API