summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Config.kmk13
-rwxr-xr-xconfigure2
-rw-r--r--doc/manual/Makefile.kmk34
-rw-r--r--doc/manual/en_US/SDKRef.xml37
-rw-r--r--doc/manual/en_US/user_AdvancedTopics.xml27
-rw-r--r--doc/manual/en_US/user_Networking.xml17
-rw-r--r--doc/manual/en_US/user_Security.xml2
-rw-r--r--doc/manual/en_US/user_Troubleshooting.xml7
-rw-r--r--doc/manual/en_US/user_VBoxManage.xml5
-rw-r--r--doc/manual/user_ChangeLogImpl.xml131
-rw-r--r--include/VBox/VBoxGuestLib.h2
-rw-r--r--include/VBox/err.h3
-rw-r--r--src/VBox/Additions/common/VBoxGuestLib/VBoxGuestR3LibAdditions.cpp50
-rw-r--r--src/VBox/Additions/common/VBoxGuestLib/VBoxGuestR3LibHostVersion.cpp3
-rw-r--r--src/VBox/Additions/common/VBoxService/VBoxServicePipeBuf.cpp4
-rw-r--r--src/VBox/Additions/common/VBoxService/VBoxServiceVMInfo.cpp6
-rw-r--r--src/VBox/Additions/common/crOpenGL/getprocaddress.py8
-rw-r--r--src/VBox/Additions/common/crOpenGL/glx.c55
-rw-r--r--src/VBox/Additions/common/crOpenGL/pack/packspu_get.py88
-rw-r--r--src/VBox/Additions/linux/Makefile.kmk3
-rwxr-xr-xsrc/VBox/Additions/linux/installer/vboxadd-x11.sh10
-rwxr-xr-xsrc/VBox/Additions/linux/installer/vboxadd.sh24
-rwxr-xr-xsrc/VBox/Additions/solaris/Installer/postinstall.sh127
-rw-r--r--src/VBox/Additions/solaris/Makefile.kmk27
-rw-r--r--src/VBox/Additions/x11/x11include/1.4/xorg/Pci.h445
-rw-r--r--src/VBox/Devices/Makefile.kmk1
-rw-r--r--src/VBox/Devices/Network/DevE1000.cpp14
-rw-r--r--src/VBox/Devices/Network/slirp/bsd/sys/mbuf.h5
-rw-r--r--src/VBox/Devices/Network/slirp/dnsproxy/dnsproxy.c2
-rw-r--r--src/VBox/Devices/Network/slirp/slirp.c22
-rw-r--r--src/VBox/Devices/Network/slirp/slirp.h41
-rw-r--r--src/VBox/Devices/Network/slirp/tftp.c6
-rw-r--r--src/VBox/Devices/Network/slirp/udp.c1
-rw-r--r--src/VBox/Devices/PC/BIOS/rombios.c81
-rw-r--r--src/VBox/Devices/PC/DevHPET.cpp2
-rw-r--r--src/VBox/Devices/Storage/DevAHCI.cpp2
-rw-r--r--src/VBox/Devices/Storage/DevATA.cpp6
-rw-r--r--src/VBox/Devices/Storage/fdc.c182
-rw-r--r--src/VBox/Frontends/VBoxBalloonCtrl/VBoxBalloonCtrl.cpp412
-rw-r--r--src/VBox/Frontends/VBoxHeadless/VBoxHeadless.cpp9
-rw-r--r--src/VBox/Frontends/VBoxManage/VBoxManage.cpp17
-rw-r--r--src/VBox/Frontends/VBoxManage/VBoxManageControlVM.cpp45
-rw-r--r--src/VBox/Frontends/VBoxManage/VBoxManageHelp.cpp1
-rw-r--r--src/VBox/Frontends/VBoxSDL/Makefile.kmk4
-rw-r--r--src/VBox/Frontends/VBoxSDL/VBoxSDL.cpp6
-rw-r--r--src/VBox/Frontends/VirtualBox/nls/VirtualBox_bg.ts20
-rw-r--r--src/VBox/Frontends/VirtualBox/nls/VirtualBox_ca.ts21
-rw-r--r--src/VBox/Frontends/VirtualBox/nls/VirtualBox_ca_VA.ts71
-rw-r--r--src/VBox/Frontends/VirtualBox/nls/VirtualBox_de.ts36
-rw-r--r--src/VBox/Frontends/VirtualBox/nls/VirtualBox_fr.ts22
-rw-r--r--src/VBox/Frontends/VirtualBox/nls/VirtualBox_hu.ts80
-rw-r--r--src/VBox/Frontends/VirtualBox/nls/VirtualBox_it.ts16
-rw-r--r--src/VBox/Frontends/VirtualBox/nls/VirtualBox_lt.ts24
-rw-r--r--src/VBox/Frontends/VirtualBox/nls/VirtualBox_nl.ts20
-rw-r--r--src/VBox/Frontends/VirtualBox/nls/VirtualBox_pt_BR.ts109
-rw-r--r--src/VBox/Frontends/VirtualBox/nls/VirtualBox_ru.ts20
-rw-r--r--src/VBox/Frontends/VirtualBox/nls/VirtualBox_uk.ts330
-rw-r--r--src/VBox/Frontends/VirtualBox/nls/VirtualBox_zh_TW.ts274
-rw-r--r--src/VBox/Frontends/VirtualBox/nls/qt_bg.ts18
-rw-r--r--src/VBox/Frontends/VirtualBox/nls/qt_zh_TW.ts16
-rw-r--r--src/VBox/Frontends/VirtualBox/src/globals/COMDefs.cpp8
-rw-r--r--src/VBox/Frontends/VirtualBox/src/globals/VBoxProblemReporter.cpp37
-rw-r--r--src/VBox/Frontends/VirtualBox/src/runtime/UIFrameBufferQuartz2D.cpp24
-rw-r--r--src/VBox/Frontends/VirtualBox/src/runtime/UIKeyboardHandler.cpp2
-rw-r--r--src/VBox/Frontends/VirtualBox/src/settings/UISettingsDialogSpecific.cpp6
-rw-r--r--src/VBox/HostDrivers/Support/SUPDrv.c4
-rw-r--r--src/VBox/HostDrivers/VBoxNetAdp/VBoxNetAdp.c7
-rw-r--r--src/VBox/HostDrivers/VBoxNetAdp/solaris/VBoxNetAdp-solaris.c8
-rw-r--r--src/VBox/HostDrivers/VBoxNetFlt/VBoxNetFltInternal.h10
-rw-r--r--src/VBox/HostDrivers/VBoxNetFlt/linux/VBoxNetFlt-linux.c4
-rw-r--r--src/VBox/HostDrivers/VBoxNetFlt/solaris/VBoxNetFltBow-solaris.c663
-rw-r--r--src/VBox/HostDrivers/VBoxUSB/win/Device/vboxdev.cpp28
-rw-r--r--src/VBox/HostDrivers/VBoxUSB/win/Device/vboxrwr.cpp300
-rw-r--r--src/VBox/HostDrivers/VBoxUSB/win/Monitor/USBMon.cpp35
-rw-r--r--src/VBox/HostDrivers/VBoxUSB/win/Monitor/USBMon.h2
-rw-r--r--src/VBox/HostDrivers/VBoxUSB/win/Monitor/USBMonFlt.cpp26
-rwxr-xr-xsrc/VBox/Installer/linux/install.sh8
-rw-r--r--src/VBox/Installer/linux/rpm/VirtualBox.tmpl.spec10
-rwxr-xr-xsrc/VBox/Installer/linux/vboxdrv.sh.in2
-rw-r--r--src/VBox/Installer/win/Makefile.kmk6
-rw-r--r--src/VBox/Installer/win/VBoxKey.wxi1
-rw-r--r--src/VBox/Installer/win/VirtualBox.wxs7
-rw-r--r--src/VBox/Main/idl/VirtualBox.xidl4
-rw-r--r--src/VBox/Main/include/USBGetDevices.h38
-rw-r--r--src/VBox/Main/include/USBProxyService.h51
-rw-r--r--src/VBox/Main/src-all/Global.cpp4
-rw-r--r--src/VBox/Main/src-client/ConsoleImpl.cpp4
-rw-r--r--src/VBox/Main/src-client/ConsoleImpl2.cpp9
-rw-r--r--src/VBox/Main/src-client/DisplayImpl.cpp12
-rw-r--r--src/VBox/Main/src-server/ApplianceImplImport.cpp12
-rw-r--r--src/VBox/Main/src-server/HostImpl.cpp46
-rw-r--r--src/VBox/Main/src-server/MachineImpl.cpp3
-rw-r--r--src/VBox/Main/src-server/USBProxyService.cpp1
-rw-r--r--src/VBox/Main/src-server/linux/USBGetDevices.cpp144
-rw-r--r--src/VBox/Main/src-server/linux/USBProxyServiceLinux.cpp85
-rw-r--r--src/VBox/Main/src-server/solaris/NetIf-solaris.cpp9
-rw-r--r--src/VBox/Main/src-server/xpcom/server_module.cpp7
-rw-r--r--src/VBox/Main/testcase/Makefile.kmk9
-rw-r--r--src/VBox/Main/testcase/tstHostHardwareLinux.cpp22
-rw-r--r--src/VBox/Main/testcase/tstUSBProxyLinux.cpp221
-rw-r--r--src/VBox/RDP/client/vrdp/rdpusb.c14
-rw-r--r--src/VBox/Runtime/common/ldr/ldrPE.cpp4
-rw-r--r--src/VBox/Runtime/r0drv/darwin/mp-r0drv-darwin.cpp14
-rw-r--r--src/VBox/Runtime/r0drv/darwin/the-darwin-kernel.h24
-rw-r--r--src/VBox/Runtime/r0drv/darwin/threadpreempt-r0drv-darwin.cpp13
-rw-r--r--src/VBox/Runtime/r0drv/linux/mp-r0drv-linux.c1
-rw-r--r--src/VBox/Runtime/r3/linux/sched-linux.cpp4
-rw-r--r--src/VBox/Runtime/r3/posix/thread-posix.cpp4
-rw-r--r--src/VBox/Runtime/testcase/tstRTStrVersion.cpp6
-rw-r--r--src/VBox/Storage/VD.cpp2
-rw-r--r--src/VBox/VMM/VMMR0/HWACCMR0.cpp4
-rw-r--r--src/VBox/VMM/VMMR3/CSAM.cpp22
-rw-r--r--src/VBox/VMM/VMMR3/HWACCM.cpp6
-rw-r--r--src/VBox/VMM/VMMR3/PATM.cpp8
-rw-r--r--src/VBox/VMM/VMMR3/PDMBlkCache.cpp2
-rw-r--r--src/VBox/VMM/VMMR3/PGMSavedState.cpp8
-rw-r--r--src/VBox/VMM/VMMR3/SSM.cpp26
117 files changed, 2793 insertions, 2314 deletions
diff --git a/Config.kmk b/Config.kmk
index f75fc6aa7..165be6baf 100644
--- a/Config.kmk
+++ b/Config.kmk
@@ -157,9 +157,13 @@ VBOX_VERSION_MINOR = 0
# This is the current build number. It should be increased every time we publish a
# new build. The define is available in every source file. Only even build numbers
# will be published, odd numbers are set during development.
-VBOX_VERSION_BUILD = 6
+VBOX_VERSION_BUILD = 8
+# The raw version string. This *must not* contain any other information/fields than
+# major, minor and build revision (as it is now) -- also will be used for host/guest version
+# comparison.
+VBOX_VERSION_STRING_RAW = $(VBOX_VERSION_MAJOR).$(VBOX_VERSION_MINOR).$(VBOX_VERSION_BUILD)
# Full version string (may include more than just x.y.z, but no spaces or other problematic chars).
-VBOX_VERSION_STRING = $(VBOX_VERSION_MAJOR).$(VBOX_VERSION_MINOR).$(VBOX_VERSION_BUILD)
+VBOX_VERSION_STRING = $(VBOX_VERSION_STRING_RAW)
# Force the additions.sh script to get an exact additions build when we're doing the release.
ifeq ($(int-mod $(VBOX_VERSION_BUILD),2),0)
@@ -4535,7 +4539,7 @@ endif
# directory. If you don't run it there, you get a consistent sub-tree only.
#
VBOX_BAD_CHAR_SET = ,;:/\$(SP)$(TAB)$(HASH)=![]@%&''()*""<>?^{}|~
-VBOX_VERSION_STAMP = $(PATH_OUT)/version-stamp-$(translate $(VBOX_VERSION_STRING)-$(VBOX_C_YEAR)-$(VBOX_VENDOR)-$(VBOX_PRODUCT),$(VBOX_BAD_CHAR_SET),,_)
+VBOX_VERSION_STAMP = $(PATH_OUT)/version-stamp-raw-$(translate $(VBOX_VERSION_STRING)-$(VBOX_C_YEAR)-$(VBOX_VENDOR)-$(VBOX_PRODUCT),$(VBOX_BAD_CHAR_SET),,_)
VBOX_VERSION_HEADER = $(PATH_OUT)/version-generated.h
VBOX_VERSION_MK = $(PATH_OUT)/version-generated.mk
@@ -4555,6 +4559,7 @@ $(VBOX_VERSION_HEADER): $(VBOX_VERSION_STAMP)
$(QUIET)$(APPEND) $@.tmp '#define VBOX_VERSION_MAJOR $(VBOX_VERSION_MAJOR)'
$(QUIET)$(APPEND) $@.tmp '#define VBOX_VERSION_MINOR $(VBOX_VERSION_MINOR)'
$(QUIET)$(APPEND) $@.tmp '#define VBOX_VERSION_BUILD $(VBOX_VERSION_BUILD)'
+ $(QUIET)$(APPEND) $@.tmp '#define VBOX_VERSION_STRING_RAW "$(VBOX_VERSION_STRING_RAW)"'
$(QUIET)$(APPEND) $@.tmp '#define VBOX_VERSION_STRING "$(VBOX_VERSION_STRING)"'
$(QUIET)$(APPEND) $@.tmp ''
$(QUIET)$(APPEND) $@.tmp '#endif'
@@ -4654,7 +4659,7 @@ endif
SVN ?= svn$(HOSTSUFF_EXE)
VBOX_SVN_REV_KMK = $(PATH_OUT)/revision.kmk
ifndef VBOX_SVN_REV
- VBOX_SVN_REV_FALLBACK := $(patsubst %:,, $Rev: 71344 $ )
+ VBOX_SVN_REV_FALLBACK := $(patsubst %:,, $Rev: 71778 $ )
VBOX_SVN_DEP := $(wildcard $(PATH_ROOT)/.svn/entries)
ifeq ($(which $(SVN)),)
VBOX_SVN_DEP :=
diff --git a/configure b/configure
index cb4725d42..02ce9fa9c 100755
--- a/configure
+++ b/configure
@@ -412,7 +412,7 @@ check_gcc()
elif [ $cc_maj -lt 3 \
-o \( $cc_maj -eq 3 -a $cc_min -lt 2 \) \
-o \( $cc_maj -eq 4 -a $cc_min -lt 1 -a "$OS" != "darwin" \) \
- -o \( $cc_maj -eq 4 -a $cc_min -gt 5 \) \
+ -o \( $cc_maj -eq 4 -a $cc_min -gt 6 \) \
-o $cc_maj -gt 4 ]; then
log_failure "gcc version $cc_ver found, expected gcc 3.x with x>1 or gcc 4.x with 0<x<5"
fail really
diff --git a/doc/manual/Makefile.kmk b/doc/manual/Makefile.kmk
index a52b56fbf..f07afcf2e 100644
--- a/doc/manual/Makefile.kmk
+++ b/doc/manual/Makefile.kmk
@@ -4,7 +4,7 @@
#
#
-# Copyright (C) 2006-2007 Oracle Corporation
+# Copyright (C) 2006-2011 Oracle Corporation
#
# This file is part of VirtualBox Open Source Edition (OSE), as
# available from http://www.virtualbox.org. This file is free software;
@@ -508,11 +508,15 @@ $(foreach f,$(VBOX_MANUAL_LANGUAGES),$(VBOX_PATH_MANUAL_OUTBASE)/$f/UserManual.p
$(foreach f,$(VBOX_MANUAL_LANGUAGES),\
$(addprefix $(VBOX_PATH_MANUAL_OUTBASE)/$f/,$(VBOX_MANUAL_PNG_FILES_$(f)))) | $$(dir $$@)
# PDF generation via Latex: generate the .tex file
- $(call MSG_L1,pdflatex $< (three passes) -> $@)
+ $(call MSG_L1,pdflatex $< (four passes) -> $@)
$(QUIET)$(REDIRECT) -w+ti /dev/null -C $(@D) -- $(PDFLATEX) UserManual.tex
$(QUIET)$(REDIRECT) -w+ti /dev/null -C $(@D) -- $(PDFLATEX) UserManual.tex
$(QUIET)$(REDIRECT) -w+ti /dev/null -C $(@D) -- $(PDFLATEX) UserManual.tex
$(QUIET)$(REDIRECT) -w+ti /dev/null -C $(@D) -- $(PDFLATEX) UserManual.tex
+ $(QUIET)$(SED) -n \
+ -e '/Warning: There were \(undefined references\|multiply-defined labels\)/{p; q 1}' \
+ $(basename $@).log
+
##@todo restore this when above has been converted to INSTALLS target. $(call MSG_L1,Fresh LaTeX-generated PDF is now at $@)
# generate temporary LaTeX source from processed XML
@@ -553,6 +557,9 @@ $(VBOX_PATH_SDK)/docs/SDKRef.pdf: \
$(QUIET)$(REDIRECT) -C $(<D) -- $(PDFLATEX) SDKRef.tex
$(QUIET)$(REDIRECT) -C $(<D) -- $(PDFLATEX) SDKRef.tex
$(QUIET)$(REDIRECT) -C $(<D) -- $(PDFLATEX) SDKRef.tex
+ $(QUIET)$(SED) -n \
+ -e '/Warning: There were \(undefined references\|multiply-defined labels\)/{p; q 1}' \
+ $(basename $<).log
$(QUIET)$(CP) $(<D)/SDKRef.pdf $@
$(call MSG_L1,Fresh LaTeX-generated PDF is now at $@)
@@ -717,28 +724,19 @@ $(VBOX_PATH_MANUAL_OUTBASE)/en_US/docbook-changelog-formatcfg.xsl: \
-e 's|\$$TARGETPATH|$(@D)|g' --output $@.tmp $<
$(QUIET)$(MV) -f $@.tmp $@
-$(VBOX_PATH_MANUAL_OUTBASE)/en_US/ChangeLog.xml: ChangeLog.xml
- $(QUIET)$(CP) $< $@
-
-$(VBOX_PATH_MANUAL_OUTBASE)/user_ChangeLogImpl_1.xml: $(VBOX_PATH_MANUAL_SRC)/user_ChangeLogImpl.xml
- $(QUIET)$(RM) -f $@.tmp $@
- $(QUIET)$(SED) -e 's|para|simpara|g' \
- --output $@.tmp $<
- $(QUIET)$(MV) -f $@.tmp $@
-
+# This XSLT rule depends on $(VBOX_PATH_MANUAL_OUTBASE)/en_US/user_ChangeLog.xml, which is build by the complex rule
+# $(foreach f,$(VBOX_MANUAL_LANGUAGES),$(VBOX_PATH_MANUAL_OUTBASE)/$f/user_ChangeLog.xml): ...
+# much further above. That rule takes en_US/user_ChangeLog.xml and replaces $VIRTUALBOX_CHANGELOG_IMPL
+# with the actual change log contained in user_ChangeLogImpl.xml
$(VBOX_PATH_MANUAL_OUTBASE)/en_US/ChangeLog.html: \
- $(VBOX_PATH_MANUAL_OUTBASE)/user_ChangeLogImpl_1.xml \
$(VBOX_PATH_MANUAL_OUTBASE)/en_US/docbook-changelog-formatcfg.xsl \
- $(VBOX_PATH_MANUAL_OUTBASE)/en_US/ChangeLog.xml
+ $(VBOX_PATH_MANUAL_OUTBASE)/en_US/user_ChangeLog.xml
$(QUIET)$(VBOX_XSLTPROC) --xinclude --nonet --output $(VBOX_PATH_MANUAL_OUTBASE)/en_US/ChangeLog.html \
$(@D)/docbook-changelog-formatcfg.xsl \
- $(VBOX_PATH_MANUAL_OUTBASE)/en_US/ChangeLog.xml
-
-$(PATH_BIN)/ChangeLog.html: $(VBOX_PATH_MANUAL_OUTBASE)/en_US/ChangeLog.html
- $(QUIET)$(CP) $< $@
+ $(VBOX_PATH_MANUAL_OUTBASE)/en_US/user_ChangeLog.xml
$(call MSG_L1,Fresh ChangeLog.html is now at $@)
-cl-html: $(PATH_BIN)/ChangeLog.html
+cl-html: $(VBOX_PATH_MANUAL_OUTBASE)/en_US/ChangeLog.html
include $(KBUILD_PATH)/subfooter.kmk
diff --git a/doc/manual/en_US/SDKRef.xml b/doc/manual/en_US/SDKRef.xml
index 8f72c26f4..60039d81b 100644
--- a/doc/manual/en_US/SDKRef.xml
+++ b/doc/manual/en_US/SDKRef.xml
@@ -1456,7 +1456,7 @@ if mach is None:
else:
session = mgr.getSessionObject(vbox)
# one can also start headless session with "headless" instead of "gui"
- progress = vb.openRemoteSession(session, mach.id, "gui", "")
+ progress = mach.launchVMProcess(session, mach.id, "gui", "")
progress.waitForCompletion(-1)
session.close()
</screen>
@@ -1746,19 +1746,18 @@ IFoo *foo;
rc = object-&gt;vtbl-&gt;Method(object, args, ..., &amp;foo);</screen>
<para>As a real-world example of a method invocation, let's call
- <xref linkend="IVirtualBox__openRemoteSession"
- xreflabel="IVirtualBox::openRemoteSession" /> which returns an
+ <xref linkend="IMachine__launchVMProcess"
+ xreflabel="IMachine::launchVMProcess" /> which returns an
IProgress object. Note again that the method name is
capitalized.</para>
<screen>IProgress *progress;
...
-rc = vbox-&gt;vtbl-&gt;OpenRemoteSession(
- vbox, /* this */
+rc = vbox-&gt;vtbl-&gt;LaunchVMProcess(
+ machine, /* this */
session, /* arg 1 */
- id, /* arg 2 */
- sessionType, /* arg 3 */
- env, /* arg 4 */
+ sessionType, /* arg 2 */
+ env, /* arg 3 */
&amp;progress /* Out */
);
</screen>
@@ -4002,20 +4001,20 @@ AuthResult AUTHCALL AuthEntry(
</listitem>
<listitem>
- <para>The <xref linkend="IVRDPServer" xreflabel="IVRDPServer" />,
- <xref linkend="IRemoteDisplayInfo" xreflabel="IRemoteDisplayInfo" />
- and IConsoleCallback interfaces were changed to reflect VRDP server
- ability to bind to one of available ports from a list of
- ports.</para>
+ <para>The <computeroutput>IVRDPServer</computeroutput>,
+ <computeroutput>IRemoteDisplayInfo</computeroutput> and
+ <computeroutput>IConsoleCallback</computeroutput> interfaces were
+ changed to reflect VRDP server ability to bind to one of available
+ ports from a list of ports.</para>
<para>The <computeroutput>IVRDPServer::port</computeroutput>
- attribute has been replaced with <xref linkend="IVRDPServer__ports"
- xreflabel="IVRDPServer::ports" />, which is a comma-separated list
- of ports or ranges of ports.</para>
+ attribute has been replaced with
+ <computeroutput>IVRDPServer::ports</computeroutput>, which is a
+ comma-separated list of ports or ranges of ports.</para>
- <para>An <xref linkend="IRemoteDisplayInfo__port"
- xreflabel="IRemoteDisplayInfo::port" /> attribute has been added for
- querying the actual port VRDP server listens on.</para>
+ <para>An <computeroutput>IRemoteDisplayInfo::port</computeroutput>
+ attribute has been added for querying the actual port VRDP server
+ listens on.</para>
<para>An IConsoleCallback::onRemoteDisplayInfoChange() notification
callback has been added.</para>
diff --git a/doc/manual/en_US/user_AdvancedTopics.xml b/doc/manual/en_US/user_AdvancedTopics.xml
index ac33d7ece..c1cb7e23d 100644
--- a/doc/manual/en_US/user_AdvancedTopics.xml
+++ b/doc/manual/en_US/user_AdvancedTopics.xml
@@ -1421,4 +1421,31 @@ VBoxManage setextradata "VM name" VBoxInternal2/CoreDumpLive 1</screen>At
</listitem>
</itemizedlist></para>
</sect1>
+
+ <sect1 id="vboxballoonctrl">
+ <title>Memory Ballooning Service</title>
+
+ <para>Starting at VirtualBox 4.0.8 a new host executable called <computeroutput>VBoxBalloonCtrl</computeroutput> is
+ available to automatically take care of a VM's configured memory balloon (see <xref linkend="guestadd-balloon" />
+ for an introduction to memory ballooning). This especially is useful for server environments where VMs may dynamically
+ require more or less memory during runtime.</para>
+
+ <para>VBoxBalloonCtrl periodically checks a VM's current memory balloon and its free guest RAM and automatically adjusts
+ the current memory balloon by inflating or deflating it accordingly. This handling only applies to running VMs having recent
+ Guest Additions installed.</para>
+
+ <para>To set up VBoxBalloonCtrl and adjust the maximum ballooning size a VM can reach the following parameters will be checked in the following
+ order:
+ <itemizedlist>
+ <listitem>specified via VBoxBalloonCtrl command line parameter <computeroutput>--balloon-max</computeroutput></listitem>
+ <listitem>per-VM parameter using <screen>VBoxManage setextradata "VM-Name" VBoxInternal/Guest/BalloonSizeMax &lt;Size in MB&gt;</screen></listitem>
+ <listitem>global parameter for all VMs using <screen>VBoxManage setextradata global VBoxInternal/Guest/BalloonSizeMax &lt;Size in MB&gt;</screen></listitem>
+ </itemizedlist>
+ <note>
+ <para>If no maximum ballooning size is specified by at least one of the parameters above, no ballooning will be performed at all.</para>
+ </note>
+ </para>
+
+ <para>For more options and parameters check the built-in command line help accessible with <computeroutput>--help</computeroutput>.</para>
+ </sect1>
</chapter>
diff --git a/doc/manual/en_US/user_Networking.xml b/doc/manual/en_US/user_Networking.xml
index aadb0f2d1..5ae181c0d 100644
--- a/doc/manual/en_US/user_Networking.xml
+++ b/doc/manual/en_US/user_Networking.xml
@@ -42,7 +42,7 @@
</listitem>
<listitem>
- <para>Intel PRO/1000 MT Desktop (82540OEM);</para>
+ <para>Intel PRO/1000 MT Desktop (82540EM);</para>
</listitem>
<listitem>
@@ -62,15 +62,12 @@
all operating systems out of the box, as well as the GNU GRUB boot
manager. As an exception, the Intel PRO/1000 family adapters are chosen
for some guest operating system types that no longer ship with drivers for
- the PCNet card, such as Windows Vista; see <xref
- linkend="vista_networking" /> for details.<footnote>
- <para>Support for the Intel PRO/1000 MT Desktop type was added with
- VirtualBox 1.6. The T Server variant of the Intel PRO/1000 card was
- added with VirtualBox 1.6.2 because this one is recognized by Windows
- XP guests without additional driver installation. The MT Server
- variant was added with VirtualBox 2.2 to facilitate OVF imports from
- other platforms.</para>
- </footnote></para>
+ the PCNet card, such as Windows Vista.</para>
+
+ <para>The Intel PRO/1000 MT Desktop type works with Windows Vista and later
+ versions. The T Server variant of the Intel PRO/1000 card is recognized by
+ Windows XP guests without additional driver installation. The MT Server
+ variant facilitates OVF imports from other platforms.</para>
<para>The <emphasis role="bold">"Paravirtualized network adapter
(virtio-net)"</emphasis> is special. If you select this, then VirtualBox
diff --git a/doc/manual/en_US/user_Security.xml b/doc/manual/en_US/user_Security.xml
index 51d5d8aa6..e28c23b75 100644
--- a/doc/manual/en_US/user_Security.xml
+++ b/doc/manual/en_US/user_Security.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE chapter PUBLIC "-//OASIS//DTD DocBook XML V4.4//EN"
"http://www.oasis-open.org/docbook/xml/4.4/docbookx.dtd">
-<chapter id="Troubleshooting">
+<chapter id="Security">
<title>Security considerations</title>
<sect1>
diff --git a/doc/manual/en_US/user_Troubleshooting.xml b/doc/manual/en_US/user_Troubleshooting.xml
index d954a61f6..192f50d08 100644
--- a/doc/manual/en_US/user_Troubleshooting.xml
+++ b/doc/manual/en_US/user_Troubleshooting.xml
@@ -710,9 +710,10 @@
before version 1.6.0. For Windows Vista guests, VirtualBox now uses an
Intel E1000 card by default.</para>
- <para>If, for some reason, you still want to use the AMD card,
- VirtualBox ships a 32-bit driver for that card with the Windows Guest
- Additions; see <xref linkend="vista_networking" />.</para>
+ <para>If, for some reason, you still want to use the AMD card, you need
+ to download the PCNet driver from the AMD website (available for 32-bit
+ Windows only). You can transfer it into the virtual machine using a
+ shared folder, see (see <xref linkend="sharedfolders" />).</para>
</sect2>
<sect2>
diff --git a/doc/manual/en_US/user_VBoxManage.xml b/doc/manual/en_US/user_VBoxManage.xml
index bc240a225..92b2e6003 100644
--- a/doc/manual/en_US/user_VBoxManage.xml
+++ b/doc/manual/en_US/user_VBoxManage.xml
@@ -1365,6 +1365,11 @@ Virtual system 0:
</listitem>
<listitem>
+ <para><computeroutput>screenshotpng</computeroutput> takes a screenshot
+ of the guest display and saves it in PNG format.</para>
+ </listitem>
+
+ <listitem>
<para>The <computeroutput>setcredentials</computeroutput> operation is
used for remote logons in Windows guests. For details, please refer to
<xref linkend="autologon" />.</para>
diff --git a/doc/manual/user_ChangeLogImpl.xml b/doc/manual/user_ChangeLogImpl.xml
index c988d71a7..968d4feb1 100644
--- a/doc/manual/user_ChangeLogImpl.xml
+++ b/doc/manual/user_ChangeLogImpl.xml
@@ -1,6 +1,127 @@
<?xml version="1.0" encoding="UTF-8"?>
<sect1>
+ <title>Version 4.0.8 (2011-05-16)</title>
+
+ <para>This is a maintenance release. The following items were fixed and/or
+ added:</para>
+
+ <itemizedlist>
+
+ <listitem>
+ <para>Mac OS X hosts: fixed incompatibility with recent Mac OS X
+ versions in 64-bit mode (bug #8474)</para>
+ </listitem>
+
+ <listitem>
+ <para>Mac OS X hosts: fixed incompatibility with hosts with more
+ than 16 cores (bug #8389)</para>
+ </listitem>
+
+ <listitem>
+ <para>Mac OS X hosts: fixed painting corruptions on a second monitor in
+ 64-bit mode (bug #7606)</para>
+ </listitem>
+
+ <listitem>
+ <para>GUI: restored functionality to set an empty host key to disallow any
+ host key combination (4.0.6 regression; bug #8793)</para>
+ </listitem>
+
+ <listitem>
+ <para>GUI: more expressive error messages for USB proxy permission
+ problems (mainly Linux hosts; bug #8823)</para>
+ </listitem>
+
+ <listitem>
+ <para>VBoxManage: added <computeroutput>controlvm screenshotpng</computeroutput>
+ subcommand for saving the screenshot of a running VM in PNG format</para>
+ </listitem>
+
+ <listitem>
+ <para>VBoxHeadless: fixed potential crash during shutdown
+ (Windows hosts only)</para>
+ </listitem>
+
+ <listitem>
+ <para>NAT: built-in services use the correct Ethernet addresses in
+ Ethernet header and in ARP requests</para>
+ </listitem>
+
+ <listitem>
+ <para>Host-only networking: fixed adapter reference counting</para>
+ </listitem>
+
+ <listitem>
+ <para>E1000: fixed rare guest crashes with Linux SMP guests (bug #8755)</para>
+ </listitem>
+
+ <listitem>
+ <para>SATA: fixed guest disk corruption under rare circumstances
+ (only relevant for guests with more than 2GB RAM; bug #8826)</para>
+ </listitem>
+
+ <listitem>
+ <para>Storage: fixed data corruption after a snapshot was taken with
+ asynchronous I/O enabled (bug #8498)</para>
+ </listitem>
+
+ <listitem>
+ <para>Floppy: several improvement</para>
+ </listitem>
+
+ <listitem>
+ <para>HPET: another fix for time jumps (bug #8707)</para>
+ </listitem>
+
+ <listitem>
+ <para>USB: use correct permissions when creating /dev/vboxusb
+ (Linux hosts only)</para>
+ </listitem>
+
+ <listitem>
+ <para>USB: removed assumption that string descriptors are null-terminated
+ (Windows hosts only)</para>
+ </listitem>
+
+ <listitem>
+ <para>3D support: fixed a potential crash when resizing the guest
+ window</para>
+ </listitem>
+
+ <listitem>
+ <para>3D support: fixed GNOME 3 rendering under Ubuntu 11.04 and
+ Fedora 15</para>
+ </listitem>
+
+ <listitem>
+ <para>Snapshots: fixed another bug which could lose entries in the media
+ registry when restoring a snapshot (bug #8363)</para>
+ </listitem>
+
+ <listitem>
+ <para>Shared Folders: don't stop mounting the other valid folders if one
+ host folder is inaccessible (4.0.6 regression)</para>
+ </listitem>
+
+ <listitem>
+ <para>Linux Additions: check whether gcc and make are installed before
+ building kernel modules (bug #8795)</para>
+ </listitem>
+
+ <listitem>
+ <para>Solaris Additions: added support for X.Org Server 1.10</para>
+ </listitem>
+
+ <listitem>
+ <para>Guest Additions: fixed inappropriate Guest Additions update
+ notification when using vendor-specific version suffixes (bug #8844)</para>
+ </listitem>
+
+ </itemizedlist>
+ </sect1>
+
+ <sect1>
<title>Version 4.0.6 (2011-04-21)</title>
<para>This is a maintenance release. The following items were fixed and/or
@@ -235,7 +356,7 @@
<listitem>
<para>Windows Additions: fixed driver bugcheck error when handling PnP
- messages (4.0 regression; bug 8367)</para>
+ messages (4.0 regression; bug #8367)</para>
</listitem>
<listitem>
@@ -544,7 +665,7 @@
<listitem>
<para>Storage: fixed possible crashes with VMDK/VHD images with snapshots
- and async I/O (4.0 regression)</para>
+ and asynchronous I/O (4.0 regression)</para>
</listitem>
<listitem>
@@ -1418,7 +1539,7 @@
</listitem>
<listitem>
- <para>GUI: switch to native file dialogs (Windows hosts only; bug 5459)</para>
+ <para>GUI: switch to native file dialogs (Windows hosts only; bug #5459)</para>
</listitem>
<listitem>
@@ -1650,7 +1771,7 @@
<listitem>
<para>Storage: fixed hang with images located on filesystems which
- don't support async I/O (bug #6905)</para>
+ don't support asynchronous I/O (bug #6905)</para>
</listitem>
<listitem>
@@ -3917,7 +4038,7 @@
</listitem>
<listitem>
- <para>NAT: fixed ethernet address corruptions (bug #4839)</para>
+ <para>NAT: fixed Ethernet address corruptions (bug #4839)</para>
</listitem>
<listitem>
diff --git a/include/VBox/VBoxGuestLib.h b/include/VBox/VBoxGuestLib.h
index f0f8b2b3d..b5012ea64 100644
--- a/include/VBox/VBoxGuestLib.h
+++ b/include/VBox/VBoxGuestLib.h
@@ -413,7 +413,7 @@ VBGLR3DECL(int) VbglR3SetGuestCaps(uint32_t fOr, uint32_t fNot);
VBGLR3DECL(int) VbglR3WaitEvent(uint32_t fMask, uint32_t cMillies, uint32_t *pfEvents);
VBGLR3DECL(int) VbglR3ReportAdditionsStatus(VBoxGuestStatusFacility Facility, VBoxGuestStatusCurrent StatusCurrent, uint32_t uFlags);
-VBGLR3DECL(int) VbglR3GetAdditionsVersion(char **ppszVer, char **ppszRev);
+VBGLR3DECL(int) VbglR3GetAdditionsVersion(char **ppszVer, char **ppszVerEx, char **ppszRev);
VBGLR3DECL(int) VbglR3GetAdditionsInstallationPath(char **ppszPath);
VBGLR3DECL(int) VbglR3GetSessionId(uint64_t *pu64IdSession);
diff --git a/include/VBox/err.h b/include/VBox/err.h
index 8ebd98c85..1d1a484ee 100644
--- a/include/VBox/err.h
+++ b/include/VBox/err.h
@@ -1308,6 +1308,9 @@
/** The requested operation cannot be performed because the device
* is currently suspended. */
#define VERR_VUSB_DEVICE_IS_SUSPENDED (-3407)
+/** Not permitted to open the USB device.
+ * The user doesn't have access to the device node, check group memberships. */
+#define VERR_VUSB_USB_DEVICE_PERMISSION (-3408)
/** @} */
diff --git a/src/VBox/Additions/common/VBoxGuestLib/VBoxGuestR3LibAdditions.cpp b/src/VBox/Additions/common/VBoxGuestLib/VBoxGuestR3LibAdditions.cpp
index 2618872ac..b530f4316 100644
--- a/src/VBox/Additions/common/VBoxGuestLib/VBoxGuestR3LibAdditions.cpp
+++ b/src/VBox/Additions/common/VBoxGuestLib/VBoxGuestR3LibAdditions.cpp
@@ -4,7 +4,7 @@
*/
/*
- * Copyright (C) 2007-2010 Oracle Corporation
+ * Copyright (C) 2007-2011 Oracle Corporation
*
* This file is part of VirtualBox Open Source Edition (OSE), as
* available from http://www.virtualbox.org. This file is free software;
@@ -38,15 +38,24 @@
/**
* Fallback for vbglR3GetAdditionsVersion.
*/
-static int vbglR3GetAdditionsCompileTimeVersion(char **ppszVer, char **ppszRev)
+static int vbglR3GetAdditionsCompileTimeVersion(char **ppszVer, char **ppszVerEx, char **ppszRev)
{
+ /* Raw version string: major.minor.build. */
if (ppszVer)
{
- *ppszVer = RTStrDup(VBOX_VERSION_STRING);
+ *ppszVer = RTStrDup(VBOX_VERSION_STRING_RAW);
if (!*ppszVer)
return VERR_NO_STR_MEMORY;
}
+ /* Extended version string: major.minor.build (+ vendor [suffix(es)]). */
+ if (ppszVerEx)
+ {
+ *ppszVerEx = RTStrDup(VBOX_VERSION_STRING);
+ if (!*ppszVerEx)
+ return VERR_NO_STR_MEMORY;
+ }
+
if (ppszRev)
{
char szRev[64];
@@ -168,14 +177,18 @@ VBGLR3DECL(int) VbglR3ReportAdditionsStatus(VBoxGuestStatusFacility enmFacility,
* Retrieves the installed Guest Additions version and/or revision.
*
* @returns IPRT status value
- * @param ppszVer Receives pointer of allocated version string. NULL is
+ * @param ppszVer Receives pointer of allocated raw version string
+ * (major.minor.build). NULL is accepted. The returned
+ * pointer must be freed using RTStrFree().*
+ * @param ppszVerEx Receives pointer of allocated full version string
+ * (raw version + vendor suffix(es)). NULL is
* accepted. The returned pointer must be freed using
* RTStrFree().
* @param ppszRev Receives pointer of allocated revision string. NULL is
* accepted. The returned pointer must be freed using
* RTStrFree().
*/
-VBGLR3DECL(int) VbglR3GetAdditionsVersion(char **ppszVer, char **ppszRev)
+VBGLR3DECL(int) VbglR3GetAdditionsVersion(char **ppszVer, char **ppszVerEx, char **ppszRev)
{
#ifdef RT_OS_WINDOWS
HKEY hKey;
@@ -209,6 +222,29 @@ VBGLR3DECL(int) VbglR3GetAdditionsVersion(char **ppszVer, char **ppszRev)
else
rc = VERR_NO_MEMORY;
}
+ if (ppszVerEx)
+ {
+ dwSize = 32; /* Reset */
+ pszTmp = (char*)RTMemAlloc(dwSize);
+ if (pszTmp)
+ {
+ l = RegQueryValueEx(hKey, "VersionEx", NULL, &dwType, (BYTE*)(LPCTSTR)pszTmp, &dwSize);
+ if (l == ERROR_SUCCESS)
+ {
+ if (dwType == REG_SZ)
+ rc = RTStrDupEx(ppszVerEx, pszTmp);
+ else
+ rc = VERR_INVALID_PARAMETER;
+ }
+ else
+ {
+ rc = RTErrConvertFromWin32(l);
+ }
+ RTMemFree(pszTmp);
+ }
+ else
+ rc = VERR_NO_MEMORY;
+ }
/* Revision. */
if (ppszRev)
{
@@ -247,7 +283,7 @@ VBGLR3DECL(int) VbglR3GetAdditionsVersion(char **ppszVer, char **ppszRev)
* No registry entries found, return the version string compiled
* into this binary.
*/
- rc = vbglR3GetAdditionsCompileTimeVersion(ppszVer, ppszRev);
+ rc = vbglR3GetAdditionsCompileTimeVersion(ppszVer, ppszVerEx, ppszRev);
}
return rc;
@@ -255,7 +291,7 @@ VBGLR3DECL(int) VbglR3GetAdditionsVersion(char **ppszVer, char **ppszRev)
/*
* On non-Windows platforms just return the compile-time version string.
*/
- return vbglR3GetAdditionsCompileTimeVersion(ppszVer, ppszRev);
+ return vbglR3GetAdditionsCompileTimeVersion(ppszVer, ppszVerEx, ppszRev);
#endif /* !RT_OS_WINDOWS */
}
diff --git a/src/VBox/Additions/common/VBoxGuestLib/VBoxGuestR3LibHostVersion.cpp b/src/VBox/Additions/common/VBoxGuestLib/VBoxGuestR3LibHostVersion.cpp
index 80264ad2e..03cfce8fd 100644
--- a/src/VBox/Additions/common/VBoxGuestLib/VBoxGuestR3LibHostVersion.cpp
+++ b/src/VBox/Additions/common/VBoxGuestLib/VBoxGuestR3LibHostVersion.cpp
@@ -128,7 +128,8 @@ VBGLR3DECL(int) VbglR3HostVersionCheckForUpdate(uint32_t u32ClientId, bool *pfUp
/* Look up guest version */
if (RT_SUCCESS(rc))
{
- rc = VbglR3GetAdditionsVersion(ppszGuestVersion, NULL /* Revision not needed here */);
+ rc = VbglR3GetAdditionsVersion(ppszGuestVersion, NULL /* Extended version not needed here */,
+ NULL /* Revision not needed here */);
if (RT_FAILURE(rc))
LogFlow(("Could not read VBox guest version! rc = %Rrc\n", rc));
}
diff --git a/src/VBox/Additions/common/VBoxService/VBoxServicePipeBuf.cpp b/src/VBox/Additions/common/VBoxService/VBoxServicePipeBuf.cpp
index 5a9027480..8f652e8bc 100644
--- a/src/VBox/Additions/common/VBoxService/VBoxServicePipeBuf.cpp
+++ b/src/VBox/Additions/common/VBoxService/VBoxServicePipeBuf.cpp
@@ -363,7 +363,7 @@ int VBoxServicePipeBufWriteToPipe(PVBOXSERVICECTRLEXECPIPEBUF pBuf, RTPIPE hPipe
*/
bool VBoxServicePipeBufIsEnabled(PVBOXSERVICECTRLEXECPIPEBUF pBuf)
{
- AssertPtrReturn(pBuf, VERR_INVALID_POINTER);
+ AssertPtrReturn(pBuf, false);
bool fEnabled = false;
if ( RTCritSectIsInitialized(&pBuf->CritSect)
@@ -387,7 +387,7 @@ bool VBoxServicePipeBufIsEnabled(PVBOXSERVICECTRLEXECPIPEBUF pBuf)
*/
bool VBoxServicePipeBufIsClosing(PVBOXSERVICECTRLEXECPIPEBUF pBuf)
{
- AssertPtrReturn(pBuf, VERR_INVALID_POINTER);
+ AssertPtrReturn(pBuf, false);
bool fClosing = false;
if ( RTCritSectIsInitialized(&pBuf->CritSect)
diff --git a/src/VBox/Additions/common/VBoxService/VBoxServiceVMInfo.cpp b/src/VBox/Additions/common/VBoxService/VBoxServiceVMInfo.cpp
index f31cc2459..59f24e72b 100644
--- a/src/VBox/Additions/common/VBoxService/VBoxServiceVMInfo.cpp
+++ b/src/VBox/Additions/common/VBoxService/VBoxServiceVMInfo.cpp
@@ -189,15 +189,19 @@ static void vboxserviceVMInfoWriteFixedProperties(void)
* Retrieve version information about Guest Additions and installed files (components).
*/
char *pszAddVer;
+ char *pszAddVerEx;
char *pszAddRev;
- rc = VbglR3GetAdditionsVersion(&pszAddVer, &pszAddRev);
+ rc = VbglR3GetAdditionsVersion(&pszAddVer, &pszAddVerEx, &pszAddRev);
VBoxServiceWritePropF(g_uVMInfoGuestPropSvcClientID, "/VirtualBox/GuestAdd/Version",
"%s", RT_FAILURE(rc) ? "" : pszAddVer);
+ VBoxServiceWritePropF(g_uVMInfoGuestPropSvcClientID, "/VirtualBox/GuestAdd/VersionEx",
+ "%s", RT_FAILURE(rc) ? "" : pszAddVerEx);
VBoxServiceWritePropF(g_uVMInfoGuestPropSvcClientID, "/VirtualBox/GuestAdd/Revision",
"%s", RT_FAILURE(rc) ? "" : pszAddRev);
if (RT_SUCCESS(rc))
{
RTStrFree(pszAddVer);
+ RTStrFree(pszAddVerEx);
RTStrFree(pszAddRev);
}
diff --git a/src/VBox/Additions/common/crOpenGL/getprocaddress.py b/src/VBox/Additions/common/crOpenGL/getprocaddress.py
index 190c29497..39c9c2340 100644
--- a/src/VBox/Additions/common/crOpenGL/getprocaddress.py
+++ b/src/VBox/Additions/common/crOpenGL/getprocaddress.py
@@ -88,6 +88,14 @@ CR_PROC CR_APIENTRY crGetProcAddress( const char *name )
if (!crStrcmp( name, "glXBindTexImageEXT" )) return (CR_PROC) VBOXGLXTAG(glXBindTexImageEXT);
if (!crStrcmp( name, "glXReleaseTexImageEXT" )) return (CR_PROC) VBOXGLXTAG(glXReleaseTexImageEXT);
+#if defined(Linux) && defined(CR_EXT_framebuffer_blit)
+ /* Hacky way to make gnome3 happy on ubuntu 11.04, even though glBlitFramebuffer is part of OpenGL 3.0 spec,
+ * it expects to find glBlitFramebuffer and not glBlitFramebufferEXT after checking for EXT_framebuffer_blit support.
+ * Untill 3.0 support, it's better to go this way instead of adding an alias to src/VBox/GuestHost/OpenGL/glapi_parser/apispec.txt.
+ */
+ if (!crStrcmp(name, "glBlitFramebuffer")) return crGetProcAddress("glBlitFramebufferEXT");
+#endif
+
if (name) crDebug("Returning NULL for %s", name);
return NULL;
}
diff --git a/src/VBox/Additions/common/crOpenGL/glx.c b/src/VBox/Additions/common/crOpenGL/glx.c
index 50df8b45e..bfd727cff 100644
--- a/src/VBox/Additions/common/crOpenGL/glx.c
+++ b/src/VBox/Additions/common/crOpenGL/glx.c
@@ -13,6 +13,7 @@
#include "stub.h"
#include "dri_glx.h"
#include "GL/internal/glcore.h"
+#include "cr_glstate.h"
#include <X11/Xregion.h>
@@ -2218,6 +2219,38 @@ static void stubCheckXDamageCB(unsigned long key, void *data1, void *data2)
}
}
+static const CRPixelPackState defaultPacking =
+{
+ 0, /*rowLength*/
+ 0, /*skipRows*/
+ 0, /*skipPixels*/
+ 1, /*alignment*/
+ 0, /*imageHeight*/
+ 0, /*skipImages*/
+ GL_FALSE, /*swapBytes*/
+ GL_FALSE /*lsbFirst*/
+};
+
+static void stubGetUnpackState(CRPixelPackState *pUnpackState)
+{
+ stub.spu->dispatch_table.GetIntegerv(GL_UNPACK_ROW_LENGTH, &pUnpackState->rowLength);
+ stub.spu->dispatch_table.GetIntegerv(GL_UNPACK_SKIP_ROWS, &pUnpackState->skipRows);
+ stub.spu->dispatch_table.GetIntegerv(GL_UNPACK_SKIP_PIXELS, &pUnpackState->skipPixels);
+ stub.spu->dispatch_table.GetIntegerv(GL_UNPACK_ALIGNMENT, &pUnpackState->alignment);
+ stub.spu->dispatch_table.GetBooleanv(GL_UNPACK_SWAP_BYTES, &pUnpackState->swapBytes);
+ stub.spu->dispatch_table.GetBooleanv(GL_UNPACK_LSB_FIRST, &pUnpackState->psLSBFirst);
+}
+
+static void stubSetUnpackState(const CRPixelPackState *pUnpackState)
+{
+ stub.spu->dispatch_table.PixelStorei(GL_UNPACK_ROW_LENGTH, pUnpackState->rowLength);
+ stub.spu->dispatch_table.PixelStorei(GL_UNPACK_SKIP_ROWS, pUnpackState->skipRows);
+ stub.spu->dispatch_table.PixelStorei(GL_UNPACK_SKIP_PIXELS, pUnpackState->skipPixels);
+ stub.spu->dispatch_table.PixelStorei(GL_UNPACK_ALIGNMENT, pUnpackState->alignment);
+ stub.spu->dispatch_table.PixelStorei(GL_UNPACK_SWAP_BYTES, pUnpackState->swapBytes);
+ stub.spu->dispatch_table.PixelStorei(GL_UNPACK_LSB_FIRST, pUnpackState->psLSBFirst);
+}
+
static GLX_Pixmap_t* stubInitGlxPixmap(GLX_Pixmap_t* pCreateInfoPixmap, Display *dpy, GLXDrawable draw, ContextInfo *pContext)
{
int x, y;
@@ -2354,14 +2387,20 @@ static void stubXshmUpdateWholeImage(Display *dpy, GLXDrawable draw, GLX_Pixmap_
}
else
{
+ CRPixelPackState unpackState;
+
XLOCK(dpy);
XCopyArea(dpy, (Pixmap)draw, pGlxPixmap->hShmPixmap, pGlxPixmap->gc,
pGlxPixmap->x, pGlxPixmap->y, pGlxPixmap->w, pGlxPixmap->h, 0, 0);
/* Have to make sure XCopyArea is processed */
XSync(dpy, False);
XUNLOCK(dpy);
+
+ stubGetUnpackState(&unpackState);
+ stubSetUnpackState(&defaultPacking);
stub.spu->dispatch_table.TexImage2D(pGlxPixmap->target, 0, pGlxPixmap->format, pGlxPixmap->w, pGlxPixmap->h, 0,
GL_BGRA, GL_UNSIGNED_BYTE, stub.xshmSI.shmaddr);
+ stubSetUnpackState(&unpackState);
/*crDebug("Sync texture for drawable 0x%x(dmg handle 0x%x) [%i,%i,%i,%i]",
(unsigned int) draw, (unsigned int)pGlxPixmap->hDamage,
pGlxPixmap->x, pGlxPixmap->y, pGlxPixmap->w, pGlxPixmap->h);*/
@@ -2396,7 +2435,7 @@ static void stubXshmUpdateImageRect(Display *dpy, GLXDrawable draw, GLX_Pixmap_t
}
else
{
- GLint origUnpackRowLength;
+ CRPixelPackState unpackState;
XLOCK(dpy);
XCopyArea(dpy, (Pixmap)draw, pGlxPixmap->hShmPixmap, pGlxPixmap->gc,
@@ -2405,19 +2444,15 @@ static void stubXshmUpdateImageRect(Display *dpy, GLXDrawable draw, GLX_Pixmap_t
XSync(dpy, False);
XUNLOCK(dpy);
- /* Save original value, doesn't cause sync as it's reported by state tracker*/
+ stubGetUnpackState(&unpackState);
+ stubSetUnpackState(&defaultPacking);
if (pRect->width!=pGlxPixmap->w)
{
- stub.spu->dispatch_table.GetIntegerv(GL_UNPACK_ROW_LENGTH, &origUnpackRowLength);
stub.spu->dispatch_table.PixelStorei(GL_UNPACK_ROW_LENGTH, pGlxPixmap->w);
}
stub.spu->dispatch_table.TexSubImage2D(pGlxPixmap->target, 0, pRect->x, pRect->y, pRect->width, pRect->height,
GL_BGRA, GL_UNSIGNED_BYTE, stub.xshmSI.shmaddr);
- if (pRect->width!=pGlxPixmap->w)
- {
- /* Restore original value*/
- stub.spu->dispatch_table.PixelStorei(GL_UNPACK_ROW_LENGTH, origUnpackRowLength);
- }
+ stubSetUnpackState(&unpackState);
/*crDebug("Region sync texture for drawable 0x%x(dmg handle 0x%x) [%i,%i,%i,%i]",
(unsigned int) draw, (unsigned int)pGlxPixmap->hDamage,
@@ -2502,6 +2537,7 @@ DECLEXPORT(void) VBOXGLXTAG(glXBindTexImageEXT)(Display *dpy, GLXDrawable draw,
{
/*@todo add damage support here too*/
XImage *pxim;
+ CRPixelPackState unpackState;
XLOCK(dpy);
pxim = XGetImage(dpy, (Pixmap)draw, pGlxPixmap->x, pGlxPixmap->y, pGlxPixmap->w, pGlxPixmap->h, AllPlanes, ZPixmap);
@@ -2531,8 +2567,11 @@ DECLEXPORT(void) VBOXGLXTAG(glXBindTexImageEXT)(Display *dpy, GLXDrawable draw,
return;
}
+ stubGetUnpackState(&unpackState);
+ stubSetUnpackState(&defaultPacking);
stub.spu->dispatch_table.TexImage2D(pGlxPixmap->target, 0, pGlxPixmap->format, pxim->width, pxim->height, 0,
GL_BGRA, GL_UNSIGNED_BYTE, (void*)(&(pxim->data[0])));
+ stubSetUnpackState(&unpackState);
XDestroyImage(pxim);
}
else /* Use shm to get pixmap data */
diff --git a/src/VBox/Additions/common/crOpenGL/pack/packspu_get.py b/src/VBox/Additions/common/crOpenGL/pack/packspu_get.py
index 0b842f4cb..b496c9d5e 100644
--- a/src/VBox/Additions/common/crOpenGL/pack/packspu_get.py
+++ b/src/VBox/Additions/common/crOpenGL/pack/packspu_get.py
@@ -19,6 +19,34 @@ print """
#include "packspu_proto.h"
"""
+print """
+GLboolean crPackIsPixelStoreParm(GLenum pname)
+{
+ if (pname == GL_UNPACK_ALIGNMENT
+ || pname == GL_UNPACK_ROW_LENGTH
+ || pname == GL_UNPACK_SKIP_PIXELS
+ || pname == GL_UNPACK_LSB_FIRST
+ || pname == GL_UNPACK_SWAP_BYTES
+#ifdef CR_OPENGL_VERSION_1_2
+ || pname == GL_UNPACK_IMAGE_HEIGHT
+#endif
+ || pname == GL_UNPACK_SKIP_ROWS
+ || pname == GL_PACK_ALIGNMENT
+ || pname == GL_PACK_ROW_LENGTH
+ || pname == GL_PACK_SKIP_PIXELS
+ || pname == GL_PACK_LSB_FIRST
+ || pname == GL_PACK_SWAP_BYTES
+#ifdef CR_OPENGL_VERSION_1_2
+ || pname == GL_PACK_IMAGE_HEIGHT
+#endif
+ || pname == GL_PACK_SKIP_ROWS)
+ {
+ return GL_TRUE;
+ }
+ return GL_FALSE;
+}
+"""
+
from get_sizes import *
from get_components import *
@@ -70,24 +98,7 @@ for func_name in keys:
print '\t}'
if func_name in simple_funcs:
print """
- if (pname == GL_UNPACK_ALIGNMENT
- || pname == GL_UNPACK_ROW_LENGTH
- || pname == GL_UNPACK_SKIP_PIXELS
- || pname == GL_UNPACK_LSB_FIRST
- || pname == GL_UNPACK_SWAP_BYTES
-#ifdef CR_OPENGL_VERSION_1_2
- || pname == GL_UNPACK_IMAGE_HEIGHT
-#endif
- || pname == GL_UNPACK_SKIP_ROWS
- || pname == GL_PACK_ALIGNMENT
- || pname == GL_PACK_ROW_LENGTH
- || pname == GL_PACK_SKIP_PIXELS
- || pname == GL_PACK_LSB_FIRST
- || pname == GL_PACK_SWAP_BYTES
-#ifdef CR_OPENGL_VERSION_1_2
- || pname == GL_PACK_IMAGE_HEIGHT
-#endif
- || pname == GL_PACK_SKIP_ROWS
+ if (crPackIsPixelStoreParm(pname)
|| pname == GL_DRAW_BUFFER
#ifdef CR_OPENGL_VERSION_1_3
|| pname == GL_ACTIVE_TEXTURE
@@ -105,31 +116,36 @@ for func_name in keys:
#endif
)
{
-#ifndef DEBUG
- crState%s( pname, params );
- return;
-#else
- %s localparams;
- localparams = (%s) crAlloc(__numValues(pname) * sizeof(*localparams));
- crState%s(pname, localparams);
- crPack%s(%s, &writeback);
- packspuFlush( (void *) thread );
- while (writeback)
- crNetRecv();
- for (i=0; i<__numValues(pname); ++i)
+#ifdef DEBUG
+ if (!crPackIsPixelStoreParm(pname))
{
- if (localparams[i] != params[i])
+ %s localparams;
+ localparams = (%s) crAlloc(__numValues(pname) * sizeof(*localparams));
+ crState%s(pname, localparams);
+ crPack%s(%s, &writeback);
+ packspuFlush( (void *) thread );
+ while (writeback)
+ crNetRecv();
+ for (i=0; i<__numValues(pname); ++i)
{
- crWarning("Incorrect local state in %s for %%x param %%i", pname, i);
- crWarning("Expected %%i but got %%i", (int)localparams[i], (int)params[i]);
+ if (localparams[i] != params[i])
+ {
+ crWarning("Incorrect local state in %s for %%x param %%i", pname, i);
+ crWarning("Expected %%i but got %%i", (int)localparams[i], (int)params[i]);
+ }
}
+ crFree(localparams);
+ return;
}
- crFree(localparams);
- return;
+ else
#endif
+ {
+ crState%s(pname, params);
+ return;
+ }
}
- """ % (func_name, params[-1][1], params[-1][1], func_name, func_name, apiutil.MakeCallString(params), func_name)
+ """ % (params[-1][1], params[-1][1], func_name, func_name, apiutil.MakeCallString(params), func_name, func_name)
params.append( ("&writeback", "foo", 0) )
print '\tif (pack_spu.swap)'
print '\t{'
diff --git a/src/VBox/Additions/linux/Makefile.kmk b/src/VBox/Additions/linux/Makefile.kmk
index e4a737e50..6c51aa7e4 100644
--- a/src/VBox/Additions/linux/Makefile.kmk
+++ b/src/VBox/Additions/linux/Makefile.kmk
@@ -318,7 +318,8 @@ lnx_add_inst-noexec_SOURCES = \
$(VBOX_REL_X11_ADD_INST)50-vboxmouse.conf \
$(VBOX_REL_LNX_ADD_INST)70-xorg-vboxmouse.rules \
$(VBOX_REL_LNX_ADD_INST)90-vboxguest.fdi \
- selinux-fedora/vbox_x11.pp
+ selinux-fedora/vbox_x11.pp \
+ selinux-fedora/vbox_accel.pp
INSTALLS += lnx_add_inst-license
lnx_add_inst-license_INST = $(subst $(PATH_TARGET),obj,$(VBOX_LNX_ADD_INST_OUT_DIR))/
diff --git a/src/VBox/Additions/linux/installer/vboxadd-x11.sh b/src/VBox/Additions/linux/installer/vboxadd-x11.sh
index 90ec958df..55e6ec640 100755
--- a/src/VBox/Additions/linux/installer/vboxadd-x11.sh
+++ b/src/VBox/Additions/linux/installer/vboxadd-x11.sh
@@ -1,6 +1,6 @@
#! /bin/sh
#
-# Linux Additions X11 setup init script ($Revision: 71289 $)
+# Linux Additions X11 setup init script ($Revision: 71770 $)
#
#
@@ -514,12 +514,16 @@ EOF
fi
begin "Installing graphics libraries and desktop services components"
- # Install selinux policy for Fedora 7 and 8 to allow the X server to
- # open device files
case "$redhat_release" in
+ # Install selinux policy for Fedora 7 and 8 to allow the X server to
+ # open device files
Fedora\ release\ 7* | Fedora\ release\ 8* )
semodule -i "$share_dir/vbox_x11.pp" > /dev/null 2>&1
;;
+ # Similar for the accelerated graphics check on Fedora 15
+ Fedora\ release\ 15* )
+ semodule -i "$share_dir/vbox_accel.pp" > /dev/null 2>&1
+ ;;
esac
# Install selinux policy for Fedora 8 to allow the X server to
diff --git a/src/VBox/Additions/linux/installer/vboxadd.sh b/src/VBox/Additions/linux/installer/vboxadd.sh
index 807248155..4f02c64c9 100755
--- a/src/VBox/Additions/linux/installer/vboxadd.sh
+++ b/src/VBox/Additions/linux/installer/vboxadd.sh
@@ -1,6 +1,6 @@
#! /bin/sh
#
-# Linux Additions kernel module init script ($Revision: 70087 $)
+# Linux Additions kernel module init script ($Revision: 71770 $)
#
#
@@ -168,6 +168,12 @@ userdev=/dev/vboxuser
owner=vboxadd
group=1
+test_for_gcc_and_make()
+{
+ which make > /dev/null 2>&1 || printf "\nThe make utility was not found. If the following module compilation fails then\nthis could be the reason and you should try installing it.\n"
+ which gcc > /dev/null 2>&1 || printf "\nThe gcc utility was not found. If the following module compilation fails then\nthis could be the reason and you should try installing it.\n"
+}
+
test_sane_kernel_dir()
{
KERN_VER=`uname -r`
@@ -364,6 +370,7 @@ setup_modules()
return 0
fi
+ test_for_gcc_and_make
test_sane_kernel_dir
if ! sh /usr/share/$PACKAGE/test/build_in_tmp \
@@ -455,9 +462,20 @@ extra_setup()
# Put mount.vboxsf in the right place
ln -sf "$lib_path/$PACKAGE/mount.vboxsf" /sbin
- # At least Fedora 11 and Fedora 12 demand on the correct security context when
- # executing this command from service scripts. Shouldn't hurt for other distributions.
+ # At least Fedora 11 and Fedora 12 require the correct security context when
+ # executing this command from service scripts. Shouldn't hurt for other
+ # distributions.
chcon -u system_u -t mount_exec_t "$lib_path/$PACKAGE/mount.vboxsf" > /dev/null 2>&1
+ # And at least Fedora 15 needs this for the acceleration support check to
+ # work
+ redhat_release=`cat /etc/redhat-release 2> /dev/null`
+ case "$redhat_release" in Fedora\ release\ 15* )
+ for i in "$lib_path"/*.so
+ do
+ restorecon "$i" >/dev/null
+ done
+ ;;
+ esac
succ_msg
}
diff --git a/src/VBox/Additions/solaris/Installer/postinstall.sh b/src/VBox/Additions/solaris/Installer/postinstall.sh
index d1fbe74d3..98d3ebfad 100755
--- a/src/VBox/Additions/solaris/Installer/postinstall.sh
+++ b/src/VBox/Additions/solaris/Installer/postinstall.sh
@@ -22,70 +22,55 @@
# terms and conditions of either the GPL or the CDDL or both.
#
+# uncompress(directory, file)
+# Updates package metadata and uncompresses the file.
+uncompress_file()
+{
+ if test -z "$1" || test -z "$2"; then
+ echo "missing argument to uncompress_file()"
+ return 1
+ fi
+
+ # Remove compressed path from the pkg
+ /usr/sbin/removef $PKGINST "$1/$2.Z" 1>/dev/null
+
+ # Add uncompressed path to the pkg
+ /usr/sbin/installf -c none $PKGINST "$1/$2" f
+
+ # Uncompress the file (removes compressed file when done)
+ uncompress -f "$1/$2.Z" > /dev/null 2>&1
+}
+
uncompress_files()
{
- # Remove compressed names from the pkg
- /usr/sbin/removef $PKGINST "$1/VBoxClient.Z" 1>/dev/null
- /usr/sbin/removef $PKGINST "$1/VBoxService.Z" 1>/dev/null
- /usr/sbin/removef $PKGINST "$1/VBoxControl.Z" 1>/dev/null
- /usr/sbin/removef $PKGINST "$1/vboxvideo_drv_13.so.Z" 1>/dev/null
- /usr/sbin/removef $PKGINST "$1/vboxvideo_drv_14.so.Z" 1>/dev/null
- /usr/sbin/removef $PKGINST "$1/vboxvideo_drv_15.so.Z" 1>/dev/null
- /usr/sbin/removef $PKGINST "$1/vboxvideo_drv_16.so.Z" 1>/dev/null
- /usr/sbin/removef $PKGINST "$1/vboxvideo_drv_17.so.Z" 1>/dev/null
- /usr/sbin/removef $PKGINST "$1/vboxvideo_drv_18.so.Z" 1>/dev/null
- /usr/sbin/removef $PKGINST "$1/vboxvideo_drv_19.so.Z" 1>/dev/null
- /usr/sbin/removef $PKGINST "$1/vboxvideo_drv_71.so.Z" 1>/dev/null
- /usr/sbin/removef $PKGINST "$1/vboxmouse_drv_14.so.Z" 1>/dev/null
- /usr/sbin/removef $PKGINST "$1/vboxmouse_drv_15.so.Z" 1>/dev/null
- /usr/sbin/removef $PKGINST "$1/vboxmouse_drv_16.so.Z" 1>/dev/null
- /usr/sbin/removef $PKGINST "$1/vboxmouse_drv_17.so.Z" 1>/dev/null
- /usr/sbin/removef $PKGINST "$1/vboxmouse_drv_18.so.Z" 1>/dev/null
- /usr/sbin/removef $PKGINST "$1/vboxmouse_drv_19.so.Z" 1>/dev/null
- /usr/sbin/removef $PKGINST "$1/vboxmouse_drv_70.so.Z" 1>/dev/null
- /usr/sbin/removef $PKGINST "$1/vboxmouse_drv_71.so.Z" 1>/dev/null
-
- # Add uncompressed names to the pkg
- /usr/sbin/installf -c none $PKGINST "$1/VBoxClient" f
- /usr/sbin/installf -c none $PKGINST "$1/VBoxService" f
- /usr/sbin/installf -c none $PKGINST "$1/VBoxControl" f
- /usr/sbin/installf -c none $PKGINST "$1/vboxvideo_drv_13.so" f
- /usr/sbin/installf -c none $PKGINST "$1/vboxvideo_drv_14.so" f
- /usr/sbin/installf -c none $PKGINST "$1/vboxvideo_drv_15.so" f
- /usr/sbin/installf -c none $PKGINST "$1/vboxvideo_drv_16.so" f
- /usr/sbin/installf -c none $PKGINST "$1/vboxvideo_drv_17.so" f
- /usr/sbin/installf -c none $PKGINST "$1/vboxvideo_drv_18.so" f
- /usr/sbin/installf -c none $PKGINST "$1/vboxvideo_drv_19.so" f
- /usr/sbin/installf -c none $PKGINST "$1/vboxvideo_drv_71.so" f
- /usr/sbin/installf -c none $PKGINST "$1/vboxmouse_drv_14.so" f
- /usr/sbin/installf -c none $PKGINST "$1/vboxmouse_drv_15.so" f
- /usr/sbin/installf -c none $PKGINST "$1/vboxmouse_drv_16.so" f
- /usr/sbin/installf -c none $PKGINST "$1/vboxmouse_drv_17.so" f
- /usr/sbin/installf -c none $PKGINST "$1/vboxmouse_drv_18.so" f
- /usr/sbin/installf -c none $PKGINST "$1/vboxmouse_drv_19.so" f
- /usr/sbin/installf -c none $PKGINST "$1/vboxmouse_drv_70.so" f
- /usr/sbin/installf -c none $PKGINST "$1/vboxmouse_drv_71.so" f
-
- # Overwrite compressed with uncompressed file
- uncompress -f "$1/VBoxClient.Z" > /dev/null 2>&1
- uncompress -f "$1/VBoxService.Z" > /dev/null 2>&1
- uncompress -f "$1/VBoxControl.Z" > /dev/null 2>&1
- uncompress -f "$1/vboxvideo_drv_13.so.Z" > /dev/null 2>&1
- uncompress -f "$1/vboxvideo_drv_14.so.Z" > /dev/null 2>&1
- uncompress -f "$1/vboxvideo_drv_15.so.Z" > /dev/null 2>&1
- uncompress -f "$1/vboxvideo_drv_16.so.Z" > /dev/null 2>&1
- uncompress -f "$1/vboxvideo_drv_17.so.Z" > /dev/null 2>&1
- uncompress -f "$1/vboxvideo_drv_18.so.Z" > /dev/null 2>&1
- uncompress -f "$1/vboxvideo_drv_19.so.Z" > /dev/null 2>&1
- uncompress -f "$1/vboxvideo_drv_71.so.Z" > /dev/null 2>&1
- uncompress -f "$1/vboxmouse_drv_14.so.Z" > /dev/null 2>&1
- uncompress -f "$1/vboxmouse_drv_15.so.Z" > /dev/null 2>&1
- uncompress -f "$1/vboxmouse_drv_16.so.Z" > /dev/null 2>&1
- uncompress -f "$1/vboxmouse_drv_17.so.Z" > /dev/null 2>&1
- uncompress -f "$1/vboxmouse_drv_18.so.Z" > /dev/null 2>&1
- uncompress -f "$1/vboxmouse_drv_19.so.Z" > /dev/null 2>&1
- uncompress -f "$1/vboxmouse_drv_70.so.Z" > /dev/null 2>&1
- uncompress -f "$1/vboxmouse_drv_71.so.Z" > /dev/null 2>&1
+ # VBox guest files
+ uncompress_file "$1" "VBoxClient"
+ uncompress_file "$1" "VBoxService"
+ uncompress_file "$1" "VBoxControl"
+
+ # VBox Xorg Video drivers
+ uncompress_file "$1" "vboxvideo_drv_13.so"
+ uncompress_file "$1" "vboxvideo_drv_14.so"
+ uncompress_file "$1" "vboxvideo_drv_15.so"
+ uncompress_file "$1" "vboxvideo_drv_16.so"
+ uncompress_file "$1" "vboxvideo_drv_17.so"
+ uncompress_file "$1" "vboxvideo_drv_18.so"
+ uncompress_file "$1" "vboxvideo_drv_19.so"
+ uncompress_file "$1" "vboxvideo_drv_110.so"
+ uncompress_file "$1" "vboxvideo_drv_70.so"
+ uncompress_file "$1" "vboxvideo_drv_71.so"
+
+ # VBox Xorg Mouse drivers
+ uncompress_file "$1" "vboxmouse_drv_13.so"
+ uncompress_file "$1" "vboxmouse_drv_14.so"
+ uncompress_file "$1" "vboxmouse_drv_15.so"
+ uncompress_file "$1" "vboxmouse_drv_16.so"
+ uncompress_file "$1" "vboxmouse_drv_17.so"
+ uncompress_file "$1" "vboxmouse_drv_18.so"
+ uncompress_file "$1" "vboxmouse_drv_19.so"
+ uncompress_file "$1" "vboxmouse_drv_110.so"
+ uncompress_file "$1" "vboxmouse_drv_70.so"
+ uncompress_file "$1" "vboxmouse_drv_71.so"
}
solaris64dir="amd64"
@@ -190,6 +175,10 @@ if test ! -z "$xorgbin"; then
vboxmouse_src="vboxmouse_drv_19.so"
vboxvideo_src="vboxvideo_drv_19.so"
;;
+ 1.10.*)
+ vboxmouse_src="vboxmouse_drv_110.so"
+ vboxvideo_src="vboxvideo_drv_110.so"
+ ;;
7.1.* | *7.2.* )
vboxmouse_src="vboxmouse_drv_71.so"
vboxvideo_src="vboxvideo_drv_71.so"
@@ -223,6 +212,16 @@ if test ! -z "$xorgbin"; then
vboxmouse64_dest_base=$vboxmouse32_dest_base/$solaris64dir
vboxvideo64_dest_base=$vboxvideo32_dest_base/$solaris64dir
+ # snv_163 drops 32-bit support completely, and uses 32-bit locations for the 64-bit stuff. Ugly.
+ # We try to detect this by looking at bitness of "mouse_drv.so", and adjust our destination paths accordingly.
+ bitsize=`file $vboxmouse32_dest_base/mouse_drv.so | grep "32-bit"`
+ skip32="no"
+ if test -z "$bitsize"; then
+ skip32="yes"
+ vboxmouse64_dest_base=$vboxmouse32_dest_base
+ vboxvideo64_dest_base=$vboxvideo32_dest_base
+ fi
+
# Make sure destination path exists
if test ! -d $vboxmouse32_dest_base || test ! -d $vboxvideo32_dest_base || test ! -d $vboxmouse64_dest_base || test ! -d $vboxvideo64_dest_base; then
echo "*** Missing destination paths for mouse or video modules. Aborting."
@@ -232,7 +231,7 @@ if test ! -z "$xorgbin"; then
retval=2
else
# 32-bit x11 drivers
- if test -f "$vboxadditions32_path/$vboxmouse_src"; then
+ if test "$skip32" = "no" && test -f "$vboxadditions32_path/$vboxmouse_src"; then
vboxmouse_dest="$vboxmouse32_dest_base/vboxmouse_drv.so"
vboxvideo_dest="$vboxvideo32_dest_base/vboxvideo_drv.so"
/usr/sbin/installf -c none $PKGINST "$vboxmouse_dest" f
@@ -287,7 +286,7 @@ if test ! -z "$xorgbin"; then
7.1.* | 7.2.* | 6.9.* | 7.0.* | 1.3.* )
$vboxadditions_path/x11config.pl
;;
- 1.4.* | 1.5.* | 1.6.* | 1.7.* | 1.8.* | 1.9.* )
+ 1.4.* | 1.5.* | 1.6.* | 1.7.* | 1.8.* | 1.9.* | 1.10.*)
$vboxadditions_path/x11config15sol.pl
;;
esac
diff --git a/src/VBox/Additions/solaris/Makefile.kmk b/src/VBox/Additions/solaris/Makefile.kmk
index 9a145c011..8558523a7 100644
--- a/src/VBox/Additions/solaris/Makefile.kmk
+++ b/src/VBox/Additions/solaris/Makefile.kmk
@@ -177,12 +177,14 @@ SOLARIS_ADD_DRIVERS_CONF = \
vboxguest.conf
SOLARIS_ADD_XORG_DRIVERS = \
+ vboxmouse_drv_13.so \
vboxmouse_drv_14.so \
vboxmouse_drv_15.so \
vboxmouse_drv_16.so \
vboxmouse_drv_17.so \
vboxmouse_drv_18.so \
vboxmouse_drv_19.so \
+ vboxmouse_drv_110.so \
vboxmouse_drv_70.so \
vboxmouse_drv_71.so \
vboxvideo_drv_13.so \
@@ -192,6 +194,7 @@ SOLARIS_ADD_XORG_DRIVERS = \
vboxvideo_drv_17.so \
vboxvideo_drv_18.so \
vboxvideo_drv_19.so \
+ vboxvideo_drv_110.so \
vboxvideo_drv_70.so \
vboxvideo_drv_71.so
@@ -437,6 +440,7 @@ ifdef VBOX_WITH_COMBINED_SOLARIS_GUEST_PACKAGE
$(SOLARIS_ADD_BIN_64)/vboxvideo_drv_17.so \
$(SOLARIS_ADD_BIN_64)/vboxvideo_drv_18.so \
$(SOLARIS_ADD_BIN_64)/vboxvideo_drv_19.so \
+ $(SOLARIS_ADD_BIN_64)/vboxvideo_drv_110.so \
$(SOLARIS_ADD_BIN_64)/vboxvideo_drv_70.so \
$(SOLARIS_ADD_BIN_64)/vboxvideo_drv_71.so \
$(SOLARIS_ADD_BIN_64)/vboxmouse_drv_14.so \
@@ -445,6 +449,7 @@ ifdef VBOX_WITH_COMBINED_SOLARIS_GUEST_PACKAGE
$(SOLARIS_ADD_BIN_64)/vboxmouse_drv_17.so \
$(SOLARIS_ADD_BIN_64)/vboxmouse_drv_18.so \
$(SOLARIS_ADD_BIN_64)/vboxmouse_drv_19.so \
+ $(SOLARIS_ADD_BIN_64)/vboxmouse_drv_110.so \
$(SOLARIS_ADD_BIN_64)/vboxmouse_drv_70.so \
$(SOLARIS_ADD_BIN_64)/vboxmouse_drv_71.so \
$(SOLARIS_ADD_BIN_32)/vboxguest \
@@ -461,6 +466,7 @@ ifdef VBOX_WITH_COMBINED_SOLARIS_GUEST_PACKAGE
$(SOLARIS_ADD_BIN_32)/vboxvideo_drv_17.so \
$(SOLARIS_ADD_BIN_32)/vboxvideo_drv_18.so \
$(SOLARIS_ADD_BIN_32)/vboxvideo_drv_19.so \
+ $(SOLARIS_ADD_BIN_32)/vboxvideo_drv_110.so \
$(SOLARIS_ADD_BIN_32)/vboxvideo_drv_70.so \
$(SOLARIS_ADD_BIN_32)/vboxvideo_drv_71.so \
$(SOLARIS_ADD_BIN_32)/vboxmouse_drv_14.so \
@@ -469,6 +475,7 @@ ifdef VBOX_WITH_COMBINED_SOLARIS_GUEST_PACKAGE
$(SOLARIS_ADD_BIN_32)/vboxmouse_drv_17.so \
$(SOLARIS_ADD_BIN_32)/vboxmouse_drv_18.so \
$(SOLARIS_ADD_BIN_32)/vboxmouse_drv_19.so \
+ $(SOLARIS_ADD_BIN_32)/vboxmouse_drv_110.so \
$(SOLARIS_ADD_BIN_32)/vboxmouse_drv_70.so \
$(SOLARIS_ADD_BIN_32)/vboxmouse_drv_71.so
ifdef VBOX_WITH_CROGL
@@ -498,6 +505,7 @@ else
$(SOLARIS_ADD_BIN)/vboxvideo_drv_17.so \
$(SOLARIS_ADD_BIN)/vboxvideo_drv_18.so \
$(SOLARIS_ADD_BIN)/vboxvideo_drv_19.so \
+ $(SOLARIS_ADD_BIN)/vboxvideo_drv_110.so \
$(SOLARIS_ADD_BIN)/vboxvideo_drv_70.so \
$(SOLARIS_ADD_BIN)/vboxvideo_drv_71.so \
$(SOLARIS_ADD_BIN)/vboxmouse_drv_14.so \
@@ -506,6 +514,7 @@ else
$(SOLARIS_ADD_BIN)/vboxmouse_drv_17.so \
$(SOLARIS_ADD_BIN)/vboxmouse_drv_18.so \
$(SOLARIS_ADD_BIN)/vboxmouse_drv_19.so \
+ $(SOLARIS_ADD_BIN)/vboxmouse_drv_110.so \
$(SOLARIS_ADD_BIN)/vboxmouse_drv_70.so \
$(SOLARIS_ADD_BIN)/vboxmouse_drv_71.so
ifdef VBOX_WITH_CROGL
@@ -583,6 +592,7 @@ ifdef VBOX_WITH_COMBINED_SOLARIS_GUEST_PACKAGE
$(QUIET)$(BIN_COPY) $(SOLARIS_ADD_BIN_64)/vboxvideo_drv_17.so $(SOLARIS_ADD_INST_DIR_64)/vboxvideo_drv_17.so
$(QUIET)$(BIN_COPY) $(SOLARIS_ADD_BIN_64)/vboxvideo_drv_18.so $(SOLARIS_ADD_INST_DIR_64)/vboxvideo_drv_18.so
$(QUIET)$(BIN_COPY) $(SOLARIS_ADD_BIN_64)/vboxvideo_drv_19.so $(SOLARIS_ADD_INST_DIR_64)/vboxvideo_drv_19.so
+ $(QUIET)$(BIN_COPY) $(SOLARIS_ADD_BIN_64)/vboxvideo_drv_110.so $(SOLARIS_ADD_INST_DIR_64)/vboxvideo_drv_110.so
$(QUIET)$(BIN_COPY) $(SOLARIS_ADD_BIN_64)/vboxvideo_drv_70.so $(SOLARIS_ADD_INST_DIR_64)/vboxvideo_drv_70.so
$(QUIET)$(BIN_COPY) $(SOLARIS_ADD_BIN_64)/vboxvideo_drv_71.so $(SOLARIS_ADD_INST_DIR_64)/vboxvideo_drv_71.so
$(QUIET)$(BIN_COPY) $(SOLARIS_ADD_BIN_64)/vboxmouse_drv_14.so $(SOLARIS_ADD_INST_DIR_64)/vboxmouse_drv_14.so
@@ -591,6 +601,7 @@ ifdef VBOX_WITH_COMBINED_SOLARIS_GUEST_PACKAGE
$(QUIET)$(BIN_COPY) $(SOLARIS_ADD_BIN_64)/vboxmouse_drv_17.so $(SOLARIS_ADD_INST_DIR_64)/vboxmouse_drv_17.so
$(QUIET)$(BIN_COPY) $(SOLARIS_ADD_BIN_64)/vboxmouse_drv_18.so $(SOLARIS_ADD_INST_DIR_64)/vboxmouse_drv_18.so
$(QUIET)$(BIN_COPY) $(SOLARIS_ADD_BIN_64)/vboxmouse_drv_19.so $(SOLARIS_ADD_INST_DIR_64)/vboxmouse_drv_19.so
+ $(QUIET)$(BIN_COPY) $(SOLARIS_ADD_BIN_64)/vboxmouse_drv_110.so $(SOLARIS_ADD_INST_DIR_64)/vboxmouse_drv_110.so
$(QUIET)$(BIN_COPY) $(SOLARIS_ADD_BIN_64)/vboxmouse_drv_70.so $(SOLARIS_ADD_INST_DIR_64)/vboxmouse_drv_70.so
$(QUIET)$(BIN_COPY) $(SOLARIS_ADD_BIN_64)/vboxmouse_drv_71.so $(SOLARIS_ADD_INST_DIR_64)/vboxmouse_drv_71.so
$(QUIET)$(INSTALL) -s -m 0755 $(SOLARIS_ADD_BIN_64)/VBoxOGL.so $(SOLARIS_ADD_INST_DIR_64)/VBoxOGL.so
@@ -614,6 +625,7 @@ ifdef VBOX_WITH_COMBINED_SOLARIS_GUEST_PACKAGE
$(QUIET)$(BIN_COPY) $(SOLARIS_ADD_BIN_32)/vboxvideo_drv_17.so $(SOLARIS_ADD_INST_DIR_32)/vboxvideo_drv_17.so
$(QUIET)$(BIN_COPY) $(SOLARIS_ADD_BIN_32)/vboxvideo_drv_18.so $(SOLARIS_ADD_INST_DIR_32)/vboxvideo_drv_18.so
$(QUIET)$(BIN_COPY) $(SOLARIS_ADD_BIN_32)/vboxvideo_drv_19.so $(SOLARIS_ADD_INST_DIR_32)/vboxvideo_drv_19.so
+ $(QUIET)$(BIN_COPY) $(SOLARIS_ADD_BIN_32)/vboxvideo_drv_110.so $(SOLARIS_ADD_INST_DIR_32)/vboxvideo_drv_110.so
$(QUIET)$(BIN_COPY) $(SOLARIS_ADD_BIN_32)/vboxvideo_drv_70.so $(SOLARIS_ADD_INST_DIR_32)/vboxvideo_drv_70.so
$(QUIET)$(BIN_COPY) $(SOLARIS_ADD_BIN_32)/vboxvideo_drv_71.so $(SOLARIS_ADD_INST_DIR_32)/vboxvideo_drv_71.so
$(QUIET)$(BIN_COPY) $(SOLARIS_ADD_BIN_32)/vboxmouse_drv_14.so $(SOLARIS_ADD_INST_DIR_32)/vboxmouse_drv_14.so
@@ -622,6 +634,7 @@ ifdef VBOX_WITH_COMBINED_SOLARIS_GUEST_PACKAGE
$(QUIET)$(BIN_COPY) $(SOLARIS_ADD_BIN_32)/vboxmouse_drv_17.so $(SOLARIS_ADD_INST_DIR_32)/vboxmouse_drv_17.so
$(QUIET)$(BIN_COPY) $(SOLARIS_ADD_BIN_32)/vboxmouse_drv_18.so $(SOLARIS_ADD_INST_DIR_32)/vboxmouse_drv_18.so
$(QUIET)$(BIN_COPY) $(SOLARIS_ADD_BIN_32)/vboxmouse_drv_19.so $(SOLARIS_ADD_INST_DIR_32)/vboxmouse_drv_19.so
+ $(QUIET)$(BIN_COPY) $(SOLARIS_ADD_BIN_32)/vboxmouse_drv_110.so $(SOLARIS_ADD_INST_DIR_32)/vboxmouse_drv_110.so
$(QUIET)$(BIN_COPY) $(SOLARIS_ADD_BIN_32)/vboxmouse_drv_70.so $(SOLARIS_ADD_INST_DIR_32)/vboxmouse_drv_70.so
$(QUIET)$(BIN_COPY) $(SOLARIS_ADD_BIN_32)/vboxmouse_drv_71.so $(SOLARIS_ADD_INST_DIR_32)/vboxmouse_drv_71.so
$(QUIET)$(INSTALL) -s -m 0755 $(SOLARIS_ADD_BIN_32)/VBoxOGL.so $(SOLARIS_ADD_INST_DIR_32)/VBoxOGL.so
@@ -643,6 +656,7 @@ ifdef VBOX_WITH_COMBINED_SOLARIS_GUEST_PACKAGE
$(QUIET)$(VBOX_COMPRESS) $(SOLARIS_ADD_INST_DIR_64)/vboxvideo_drv_17.so
$(QUIET)$(VBOX_COMPRESS) $(SOLARIS_ADD_INST_DIR_64)/vboxvideo_drv_18.so
$(QUIET)$(VBOX_COMPRESS) $(SOLARIS_ADD_INST_DIR_64)/vboxvideo_drv_19.so
+ $(QUIET)$(VBOX_COMPRESS) $(SOLARIS_ADD_INST_DIR_64)/vboxvideo_drv_110.so
$(QUIET)$(VBOX_COMPRESS) $(SOLARIS_ADD_INST_DIR_64)/vboxvideo_drv_70.so
$(QUIET)$(VBOX_COMPRESS) $(SOLARIS_ADD_INST_DIR_64)/vboxvideo_drv_71.so
$(QUIET)$(VBOX_COMPRESS) $(SOLARIS_ADD_INST_DIR_64)/vboxmouse_drv_14.so
@@ -651,6 +665,7 @@ ifdef VBOX_WITH_COMBINED_SOLARIS_GUEST_PACKAGE
$(QUIET)$(VBOX_COMPRESS) $(SOLARIS_ADD_INST_DIR_64)/vboxmouse_drv_17.so
$(QUIET)$(VBOX_COMPRESS) $(SOLARIS_ADD_INST_DIR_64)/vboxmouse_drv_18.so
$(QUIET)$(VBOX_COMPRESS) $(SOLARIS_ADD_INST_DIR_64)/vboxmouse_drv_19.so
+ $(QUIET)$(VBOX_COMPRESS) $(SOLARIS_ADD_INST_DIR_64)/vboxmouse_drv_110.so
$(QUIET)$(VBOX_COMPRESS) $(SOLARIS_ADD_INST_DIR_64)/vboxmouse_drv_70.so
$(QUIET)$(VBOX_COMPRESS) $(SOLARIS_ADD_INST_DIR_64)/vboxmouse_drv_71.so
$(QUIET)$(VBOX_COMPRESS) $(SOLARIS_ADD_INST_DIR_32)/VBoxClient
@@ -663,6 +678,7 @@ ifdef VBOX_WITH_COMBINED_SOLARIS_GUEST_PACKAGE
$(QUIET)$(VBOX_COMPRESS) $(SOLARIS_ADD_INST_DIR_32)/vboxvideo_drv_17.so
$(QUIET)$(VBOX_COMPRESS) $(SOLARIS_ADD_INST_DIR_32)/vboxvideo_drv_18.so
$(QUIET)$(VBOX_COMPRESS) $(SOLARIS_ADD_INST_DIR_32)/vboxvideo_drv_19.so
+ $(QUIET)$(VBOX_COMPRESS) $(SOLARIS_ADD_INST_DIR_32)/vboxvideo_drv_110.so
$(QUIET)$(VBOX_COMPRESS) $(SOLARIS_ADD_INST_DIR_32)/vboxvideo_drv_70.so
$(QUIET)$(VBOX_COMPRESS) $(SOLARIS_ADD_INST_DIR_32)/vboxvideo_drv_71.so
$(QUIET)$(VBOX_COMPRESS) $(SOLARIS_ADD_INST_DIR_32)/vboxmouse_drv_14.so
@@ -671,14 +687,15 @@ ifdef VBOX_WITH_COMBINED_SOLARIS_GUEST_PACKAGE
$(QUIET)$(VBOX_COMPRESS) $(SOLARIS_ADD_INST_DIR_32)/vboxmouse_drv_17.so
$(QUIET)$(VBOX_COMPRESS) $(SOLARIS_ADD_INST_DIR_32)/vboxmouse_drv_18.so
$(QUIET)$(VBOX_COMPRESS) $(SOLARIS_ADD_INST_DIR_32)/vboxmouse_drv_19.so
+ $(QUIET)$(VBOX_COMPRESS) $(SOLARIS_ADD_INST_DIR_32)/vboxmouse_drv_110.so
$(QUIET)$(VBOX_COMPRESS) $(SOLARIS_ADD_INST_DIR_32)/vboxmouse_drv_70.so
$(QUIET)$(VBOX_COMPRESS) $(SOLARIS_ADD_INST_DIR_32)/vboxmouse_drv_71.so
endif # VBOX_COMPRESS
else # !VBOX_WITH_COMBINED_SOLARIS_GUEST_PACKAGE
$(QUIET)$(INSTALL) -m 0644 $(SOLARIS_ADD_BIN)/vboxguest $(SOLARIS_ADD_INST_DIR_ISA)/vboxguest
- $(QUIET)$(INSTALL) -m 0644 $(SOLARIS_ADD_BIN)/vboxfs $(SOLARIS_ADD_INST_DIR_ISA)/vboxfs
- $(QUIET)$(INSTALL) -m 0644 $(SOLARIS_ADD_BIN)/vboxfs_s10 $(SOLARIS_ADD_INST_DIR_ISA)/vboxfs_s10
- $(QUIET)$(INSTALL) -m 0755 $(SOLARIS_ADD_BIN)/vboxfsmount $(SOLARIS_ADD_INST_DIR_ISA)/vboxfsmount
+ $(QUIET)$(INSTALL) -m 0644 $(SOLARIS_ADD_BIN)/vboxfs $(SOLARIS_ADD_INST_DIR_ISA)/vboxfs
+ $(QUIET)$(INSTALL) -m 0644 $(SOLARIS_ADD_BIN)/vboxfs_s10 $(SOLARIS_ADD_INST_DIR_ISA)/vboxfs_s10
+ $(QUIET)$(INSTALL) -m 0755 $(SOLARIS_ADD_BIN)/vboxfsmount $(SOLARIS_ADD_INST_DIR_ISA)/vboxfsmount
$(QUIET)$(INSTALL) -s -m 0755 $(SOLARIS_ADD_BIN)/VBoxClient $(SOLARIS_ADD_INST_DIR_ISA)/VBoxClient
$(QUIET)$(INSTALL) -s -m 0755 $(SOLARIS_ADD_BIN)/VBoxService $(SOLARIS_ADD_INST_DIR_ISA)/VBoxService
$(QUIET)$(INSTALL) -s -m 0755 $(SOLARIS_ADD_BIN)/VBoxControl $(SOLARIS_ADD_INST_DIR_ISA)/VBoxControl
@@ -689,6 +706,7 @@ else # !VBOX_WITH_COMBINED_SOLARIS_GUEST_PACKAGE
$(QUIET)$(BIN_COPY) $(SOLARIS_ADD_BIN)/vboxvideo_drv_17.so $(SOLARIS_ADD_INST_DIR_ISA)/vboxvideo_drv_17.so
$(QUIET)$(BIN_COPY) $(SOLARIS_ADD_BIN)/vboxvideo_drv_18.so $(SOLARIS_ADD_INST_DIR_ISA)/vboxvideo_drv_18.so
$(QUIET)$(BIN_COPY) $(SOLARIS_ADD_BIN)/vboxvideo_drv_19.so $(SOLARIS_ADD_INST_DIR_ISA)/vboxvideo_drv_19.so
+ $(QUIET)$(BIN_COPY) $(SOLARIS_ADD_BIN)/vboxvideo_drv_110.so $(SOLARIS_ADD_INST_DIR_ISA)/vboxvideo_drv_110.so
$(QUIET)$(BIN_COPY) $(SOLARIS_ADD_BIN)/vboxvideo_drv_70.so $(SOLARIS_ADD_INST_DIR_ISA)/vboxvideo_drv_70.so
$(QUIET)$(BIN_COPY) $(SOLARIS_ADD_BIN)/vboxvideo_drv_71.so $(SOLARIS_ADD_INST_DIR_ISA)/vboxvideo_drv_71.so
$(QUIET)$(BIN_COPY) $(SOLARIS_ADD_BIN)/vboxmouse_drv_14.so $(SOLARIS_ADD_INST_DIR_ISA)/vboxmouse_drv_14.so
@@ -697,6 +715,7 @@ else # !VBOX_WITH_COMBINED_SOLARIS_GUEST_PACKAGE
$(QUIET)$(BIN_COPY) $(SOLARIS_ADD_BIN)/vboxmouse_drv_17.so $(SOLARIS_ADD_INST_DIR_ISA)/vboxmouse_drv_17.so
$(QUIET)$(BIN_COPY) $(SOLARIS_ADD_BIN)/vboxmouse_drv_18.so $(SOLARIS_ADD_INST_DIR_ISA)/vboxmouse_drv_18.so
$(QUIET)$(BIN_COPY) $(SOLARIS_ADD_BIN)/vboxmouse_drv_19.so $(SOLARIS_ADD_INST_DIR_ISA)/vboxmouse_drv_19.so
+ $(QUIET)$(BIN_COPY) $(SOLARIS_ADD_BIN)/vboxmouse_drv_110.so $(SOLARIS_ADD_INST_DIR_ISA)/vboxmouse_drv_110.so
$(QUIET)$(BIN_COPY) $(SOLARIS_ADD_BIN)/vboxmouse_drv_70.so $(SOLARIS_ADD_INST_DIR_ISA)/vboxmouse_drv_70.so
$(QUIET)$(BIN_COPY) $(SOLARIS_ADD_BIN)/vboxmouse_drv_71.so $(SOLARIS_ADD_INST_DIR_ISA)/vboxmouse_drv_71.so
$(QUIET)$(INSTALL) -s -m 0755 $(SOLARIS_ADD_BIN)/VBoxOGL.so $(SOLARIS_ADD_INST_DIR_ISA)/VBoxOGL.so
@@ -718,6 +737,7 @@ else # !VBOX_WITH_COMBINED_SOLARIS_GUEST_PACKAGE
$(QUIET)$(VBOX_COMPRESS) $(SOLARIS_ADD_INST_DIR_ISA)/vboxvideo_drv_17.so
$(QUIET)$(VBOX_COMPRESS) $(SOLARIS_ADD_INST_DIR_ISA)/vboxvideo_drv_18.so
$(QUIET)$(VBOX_COMPRESS) $(SOLARIS_ADD_INST_DIR_ISA)/vboxvideo_drv_19.so
+ $(QUIET)$(VBOX_COMPRESS) $(SOLARIS_ADD_INST_DIR_ISA)/vboxvideo_drv_110.so
$(QUIET)$(VBOX_COMPRESS) $(SOLARIS_ADD_INST_DIR_ISA)/vboxvideo_drv_70.so
$(QUIET)$(VBOX_COMPRESS) $(SOLARIS_ADD_INST_DIR_ISA)/vboxvideo_drv_71.so
$(QUIET)$(VBOX_COMPRESS) $(SOLARIS_ADD_INST_DIR_ISA)/vboxmouse_drv_14.so
@@ -726,6 +746,7 @@ else # !VBOX_WITH_COMBINED_SOLARIS_GUEST_PACKAGE
$(QUIET)$(VBOX_COMPRESS) $(SOLARIS_ADD_INST_DIR_ISA)/vboxmouse_drv_17.so
$(QUIET)$(VBOX_COMPRESS) $(SOLARIS_ADD_INST_DIR_ISA)/vboxmouse_drv_18.so
$(QUIET)$(VBOX_COMPRESS) $(SOLARIS_ADD_INST_DIR_ISA)/vboxmouse_drv_19.so
+ $(QUIET)$(VBOX_COMPRESS) $(SOLARIS_ADD_INST_DIR_ISA)/vboxmouse_drv_110.so
$(QUIET)$(VBOX_COMPRESS) $(SOLARIS_ADD_INST_DIR_ISA)/vboxmouse_drv_70.so
$(QUIET)$(VBOX_COMPRESS) $(SOLARIS_ADD_INST_DIR_ISA)/vboxmouse_drv_71.so
endif # VBOX_COMPRESS
diff --git a/src/VBox/Additions/x11/x11include/1.4/xorg/Pci.h b/src/VBox/Additions/x11/x11include/1.4/xorg/Pci.h
deleted file mode 100644
index f0cb916da..000000000
--- a/src/VBox/Additions/x11/x11include/1.4/xorg/Pci.h
+++ /dev/null
@@ -1,445 +0,0 @@
-/*
- * Copyright 1998 by Concurrent Computer Corporation
- *
- * Permission to use, copy, modify, distribute, and sell this software
- * and its documentation for any purpose is hereby granted without fee,
- * provided that the above copyright notice appear in all copies and that
- * both that copyright notice and this permission notice appear in
- * supporting documentation, and that the name of Concurrent Computer
- * Corporation not be used in advertising or publicity pertaining to
- * distribution of the software without specific, written prior
- * permission. Concurrent Computer Corporation makes no representations
- * about the suitability of this software for any purpose. It is
- * provided "as is" without express or implied warranty.
- *
- * CONCURRENT COMPUTER CORPORATION DISCLAIMS ALL WARRANTIES WITH REGARD
- * TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
- * AND FITNESS, IN NO EVENT SHALL CONCURRENT COMPUTER CORPORATION BE
- * LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY
- * DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
- * WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
- * ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
- * SOFTWARE.
- *
- * Copyright 1998 by Metro Link Incorporated
- *
- * Permission to use, copy, modify, distribute, and sell this software
- * and its documentation for any purpose is hereby granted without fee,
- * provided that the above copyright notice appear in all copies and that
- * both that copyright notice and this permission notice appear in
- * supporting documentation, and that the name of Metro Link
- * Incorporated not be used in advertising or publicity pertaining to
- * distribution of the software without specific, written prior
- * permission. Metro Link Incorporated makes no representations
- * about the suitability of this software for any purpose. It is
- * provided "as is" without express or implied warranty.
- *
- * METRO LINK INCORPORATED DISCLAIMS ALL WARRANTIES WITH REGARD
- * TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
- * AND FITNESS, IN NO EVENT SHALL METRO LINK INCORPORATED BE
- * LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY
- * DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
- * WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
- * ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
- * SOFTWARE.
- *
- * This file is derived in part from the original xf86_PCI.h that included
- * following copyright message:
- *
- * Copyright 1995 by Robin Cutshaw <robin@XFree86.Org>
- *
- * Permission to use, copy, modify, distribute, and sell this software and its
- * documentation for any purpose is hereby granted without fee, provided that
- * the above copyright notice appear in all copies and that both that
- * copyright notice and this permission notice appear in supporting
- * documentation, and that the names of the above listed copyright holder(s)
- * not be used in advertising or publicity pertaining to distribution of
- * the software without specific, written prior permission. The above listed
- * copyright holder(s) make(s) no representations about the suitability of this
- * software for any purpose. It is provided "as is" without express or
- * implied warranty.
- *
- * THE ABOVE LISTED COPYRIGHT HOLDER(S) DISCLAIM(S) ALL WARRANTIES WITH REGARD
- * TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
- * AND FITNESS, IN NO EVENT SHALL THE ABOVE LISTED COPYRIGHT HOLDER(S) BE
- * LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY
- * DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER
- * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
- * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- *
- */
-/*
- * Copyright (c) 1999-2003 by The XFree86 Project, Inc.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
- * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
- * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
- * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
- * OTHER DEALINGS IN THE SOFTWARE.
- *
- * Except as contained in this notice, the name of the copyright holder(s)
- * and author(s) shall not be used in advertising or otherwise to promote
- * the sale, use or other dealings in this Software without prior written
- * authorization from the copyright holder(s) and author(s).
- */
-
-
-/*
- * This file has the private Pci definitions. The public ones are imported
- * from xf86Pci.h. Drivers should not use this file.
- */
-#ifdef HAVE_XORG_CONFIG_H
-#include <xorg-config.h>
-#endif
-
-#ifndef _PCI_H
-#define _PCI_H 1
-
-#include <X11/Xarch.h>
-#include <X11/Xfuncproto.h>
-#include "xf86Pci.h"
-#include "xf86PciInfo.h"
-
-/*
- * Global Definitions
- */
-#define MAX_PCI_DEVICES 128 /* Max number of devices accomodated */
- /* by xf86scanpci */
-#if defined(sun) && defined(SVR4) && defined(sparc)
-# define MAX_PCI_BUSES 4096 /* Max number of PCI buses */
-#elif (defined(__alpha__) || defined(__ia64__)) && defined (linux)
-# define MAX_PCI_DOMAINS 512
-# define PCI_DOM_MASK 0x01fful
-# define MAX_PCI_BUSES (MAX_PCI_DOMAINS*256) /* 256 per domain */
-#else
-# define MAX_PCI_BUSES 256 /* Max number of PCI buses */
-#endif
-
-#define DEVID(vendor, device) \
- ((CARD32)((PCI_##device << 16) | PCI_##vendor))
-
-#ifndef PCI_DOM_MASK
-# define PCI_DOM_MASK 0x0ffu
-#endif
-#define PCI_DOMBUS_MASK (((PCI_DOM_MASK) << 8) | 0x0ffu)
-
-/*
- * "b" contains an optional domain number.
- */
-#define PCI_MAKE_TAG(b,d,f) ((((b) & (PCI_DOMBUS_MASK)) << 16) | \
- (((d) & 0x00001fu) << 11) | \
- (((f) & 0x000007u) << 8))
-
-#define PCI_MAKE_BUS(d,b) ((((d) & (PCI_DOM_MASK)) << 8) | ((b) & 0xffu))
-
-#define PCI_DOM_FROM_TAG(tag) (((tag) >> 24) & (PCI_DOM_MASK))
-#define PCI_BUS_FROM_TAG(tag) (((tag) >> 16) & (PCI_DOMBUS_MASK))
-#define PCI_DEV_FROM_TAG(tag) (((tag) & 0x0000f800u) >> 11)
-#define PCI_FUNC_FROM_TAG(tag) (((tag) & 0x00000700u) >> 8)
-
-#define PCI_DFN_FROM_TAG(tag) (((tag) & 0x0000ff00u) >> 8)
-#define PCI_BDEV_FROM_TAG(tag) ((tag) & 0x00fff800u)
-
-#define PCI_DOM_FROM_BUS(bus) (((bus) >> 8) & (PCI_DOM_MASK))
-#define PCI_BUS_NO_DOMAIN(bus) ((bus) & 0xffu)
-#define PCI_TAG_NO_DOMAIN(tag) ((tag) & 0x00ffff00u)
-
-/*
- * Macros for bus numbers found in P2P headers.
- */
-#define PCI_PRIMARY_BUS_EXTRACT(x, tag) \
- ((((x) & PCI_PRIMARY_BUS_MASK ) >> 0) | (PCI_DOM_FROM_TAG(tag) << 8))
-#define PCI_SECONDARY_BUS_EXTRACT(x, tag) \
- ((((x) & PCI_SECONDARY_BUS_MASK ) >> 8) | (PCI_DOM_FROM_TAG(tag) << 8))
-#define PCI_SUBORDINATE_BUS_EXTRACT(x, tag) \
- ((((x) & PCI_SUBORDINATE_BUS_MASK) >> 16) | (PCI_DOM_FROM_TAG(tag) << 8))
-
-#define PCI_PRIMARY_BUS_INSERT(x, y) \
- (((x) & ~PCI_PRIMARY_BUS_MASK ) | (((y) & 0xffu) << 0))
-#define PCI_SECONDARY_BUS_INSERT(x, y) \
- (((x) & ~PCI_SECONDARY_BUS_MASK ) | (((y) & 0xffu) << 8))
-#define PCI_SUBORDINATE_BUS_INSERT(x, y) \
- (((x) & ~PCI_SUBORDINATE_BUS_MASK) | (((y) & 0xffu) << 16))
-
-/* Ditto for CardBus bridges */
-#define PCI_CB_PRIMARY_BUS_EXTRACT(x, tag) \
- PCI_PRIMARY_BUS_EXTRACT(x, tag)
-#define PCI_CB_CARDBUS_BUS_EXTRACT(x, tag) \
- PCI_SECONDARY_BUS_EXTRACT(x, tag)
-#define PCI_CB_SUBORDINATE_BUS_EXTRACT(x, tag) \
- PCI_SUBORDINATE_BUS_EXTRACT(x, tag)
-
-#define PCI_CB_PRIMARY_BUS_INSERT(x, tag) \
- PCI_PRIMARY_BUS_INSERT(x, tag)
-#define PCI_CB_CARDBUS_BUS_INSERT(x, tag) \
- PCI_SECONDARY_BUS_INSERT(x, tag)
-#define PCI_CB_SUBORDINATE_BUS_INSERT(x, tag) \
- PCI_SUBORDINATE_BUS_INSERT(x, tag)
-
-#if X_BYTE_ORDER == X_BIG_ENDIAN
-#define PCI_CPU(val) (((val >> 24) & 0x000000ff) | \
- ((val >> 8) & 0x0000ff00) | \
- ((val << 8) & 0x00ff0000) | \
- ((val << 24) & 0xff000000))
-#define PCI_CPU16(val) (((val >> 8) & 0x000000ff) | \
- ((val << 8) & 0x0000ff00))
-#else
-#define PCI_CPU(val) (val)
-#define PCI_CPU16(val) (val)
-#endif
-
-/*
- * Debug Macros/Definitions
- */
-/* #define DEBUGPCI 2 */ /* Disable/enable trace in PCI code */
-
-#if defined(DEBUGPCI)
-
-# define PCITRACE(lvl,printfargs) \
- if (lvl > xf86Verbose) { \
- ErrorF printfargs; \
- }
-
-#else /* !defined(DEBUGPCI) */
-
-# define PCITRACE(lvl,printfargs)
-
-#endif /* !defined(DEBUGPCI) */
-
-/*
- * PCI Config mechanism definitions
- */
-#define PCI_EN 0x80000000
-
-#define PCI_CFGMECH1_ADDRESS_REG 0xCF8
-#define PCI_CFGMECH1_DATA_REG 0xCFC
-
-#define PCI_CFGMECH1_MAXDEV 32
-
-/*
- * Select architecture specific PCI init function
- */
-#if defined(__alpha__)
-# if defined(linux)
-# define ARCH_PCI_INIT axpPciInit
-# define INCLUDE_XF86_MAP_PCI_MEM
-# elif defined(__FreeBSD__) || defined(__OpenBSD__)
-# define ARCH_PCI_INIT freebsdPciInit
-# define INCLUDE_XF86_MAP_PCI_MEM
-# define INCLUDE_XF86_NO_DOMAIN
-# elif defined(__NetBSD__)
-# define ARCH_PCI_INIT netbsdPciInit
-# define INCLUDE_XF86_MAP_PCI_MEM
-# define INCLUDE_XF86_NO_DOMAIN
-# endif
-#elif defined(__arm__)
-# if defined(linux)
-# define ARCH_PCI_INIT linuxPciInit
-# define INCLUDE_XF86_MAP_PCI_MEM
-# define INCLUDE_XF86_NO_DOMAIN
-# endif
-#elif defined(__hppa__)
-# if defined(linux)
-# define ARCH_PCI_INIT linuxPciInit
-# define INCLUDE_XF86_MAP_PCI_MEM
-# define INCLUDE_XF86_NO_DOMAIN
-# endif
-#elif defined(__ia64__)
-# if defined(linux)
-# define ARCH_PCI_INIT ia64linuxPciInit
-# define INCLUDE_XF86_MAP_PCI_MEM
-# elif defined(FreeBSD)
-# define ARCH_PCI_INIT freebsdPciInit
-# define INCLUDE_XF86_MAP_PCI_MEM
-# define INCLUDE_XF86_NO_DOMAIN
-# endif
-# define XF86SCANPCI_WRAPPER ia64ScanPCIWrapper
-#elif defined(__i386__) || defined(i386)
-# define ARCH_PCI_INIT ix86PciInit
-# define INCLUDE_XF86_MAP_PCI_MEM
-# define INCLUDE_XF86_NO_DOMAIN
-# if defined(linux)
-# define ARCH_PCI_OS_INIT linuxPciInit
-# endif
-#elif defined(__mc68000__)
-# if defined(linux)
-# define ARCH_PCI_INIT linuxPciInit
-# define INCLUDE_XF86_MAP_PCI_MEM
-# define INCLUDE_XF86_NO_DOMAIN
-# endif
-#elif defined(__mips__)
-# if defined(linux)
-# define ARCH_PCI_INIT linuxPciInit
-# define INCLUDE_XF86_MAP_PCI_MEM
-# define INCLUDE_XF86_NO_DOMAIN
-# endif
-#elif defined(__powerpc__) || defined(__powerpc64__)
-# if defined(linux)
-# define ARCH_PCI_INIT linuxPciInit
-# define INCLUDE_XF86_MAP_PCI_MEM
-# define INCLUDE_XF86_NO_DOMAIN /* Needs kernel work to remove */
-# elif defined(__FreeBSD__) || defined(__OpenBSD__)
-# define ARCH_PCI_INIT freebsdPciInit
-# define INCLUDE_XF86_MAP_PCI_MEM
-# define INCLUDE_XF86_NO_DOMAIN
-# elif defined(__NetBSD__)
-# define ARCH_PCI_INIT netbsdPciInit
-# define INCLUDE_XF86_MAP_PCI_MEM
-# define INCLUDE_XF86_NO_DOMAIN
-# else
-# define ARCH_PCI_INIT ppcPciInit
-# define INCLUDE_XF86_MAP_PCI_MEM
-# define INCLUDE_XF86_NO_DOMAIN
-# endif
-#elif defined(__s390__)
-# if defined(linux)
-# define ARCH_PCI_INIT linuxPciInit
-# define INCLUDE_XF86_MAP_PCI_MEM
-# define INCLUDE_XF86_NO_DOMAIN
-# endif
-#elif defined(__sh__)
-# if defined(linux)
-# define ARCH_PCI_INIT linuxPciInit
-# define INCLUDE_XF86_MAP_PCI_MEM
-# define INCLUDE_XF86_NO_DOMAIN
-# endif
-#elif defined(__sparc__) || defined(sparc)
-# if defined(linux)
-# define ARCH_PCI_INIT linuxPciInit
-# define INCLUDE_XF86_MAP_PCI_MEM
-# elif defined(sun)
-# define ARCH_PCI_INIT sparcPciInit
-# define INCLUDE_XF86_MAP_PCI_MEM
-# elif (defined(__OpenBSD__) || defined(__FreeBSD__)) && defined(__sparc64__)
-# define ARCH_PCI_INIT freebsdPciInit
-# define INCLUDE_XF86_MAP_PCI_MEM
-# define INCLUDE_XF86_NO_DOMAIN
-# endif
-# if !defined(__FreeBSD__) && !defined(linux)
-# define ARCH_PCI_PCI_BRIDGE sparcPciPciBridge
-# endif
-#elif defined(__amd64__) || defined(__amd64)
-# if defined(__FreeBSD__) || defined(__FreeBSD_kernel__)
-# define ARCH_PCI_INIT freebsdPciInit
-# else
-# define ARCH_PCI_INIT ix86PciInit
-# endif
-# define INCLUDE_XF86_MAP_PCI_MEM
-# define INCLUDE_XF86_NO_DOMAIN
-# if defined(linux)
-# define ARCH_PCI_OS_INIT linuxPciInit
-# endif
-#endif
-
-#ifndef ARCH_PCI_INIT
-#error No PCI support available for this architecture/OS combination
-#endif
-
-extern void ARCH_PCI_INIT(void);
-#if defined(ARCH_PCI_OS_INIT)
-extern void ARCH_PCI_OS_INIT(void);
-#endif
-
-#if defined(ARCH_PCI_PCI_BRIDGE)
-extern void ARCH_PCI_PCI_BRIDGE(pciConfigPtr pPCI);
-#endif
-
-#if defined(XF86SCANPCI_WRAPPER)
-typedef enum {
- SCANPCI_INIT,
- SCANPCI_TERM
-} scanpciWrapperOpt;
-extern void XF86SCANPCI_WRAPPER(scanpciWrapperOpt flags);
-#endif
-
-/*
- * Table of functions used to access a specific PCI bus domain
- * (e.g. a primary PCI bus and all of its secondaries)
- */
-typedef struct pci_bus_funcs {
- CARD32 (*pciReadLong)(PCITAG, int);
- void (*pciWriteLong)(PCITAG, int, CARD32);
- void (*pciSetBitsLong)(PCITAG, int, CARD32, CARD32);
- ADDRESS (*pciAddrHostToBus)(PCITAG, PciAddrType, ADDRESS);
- ADDRESS (*pciAddrBusToHost)(PCITAG, PciAddrType, ADDRESS);
- /*
- * The next three are optional. If NULL, the corresponding function is
- * to be performed generically.
- */
- CARD16 (*pciControlBridge)(int, CARD16, CARD16);
- void (*pciGetBridgeBuses)(int, int *, int *, int *);
- /* Use pointer's to avoid #include recursion */
- void (*pciGetBridgeResources)(int, pointer *, pointer *, pointer *);
-
- /* These are optional and will be implemented using read long
- * if not present. */
- CARD8 (*pciReadByte)(PCITAG, int);
- void (*pciWriteByte)(PCITAG, int, CARD8);
- CARD16 (*pciReadWord)(PCITAG, int);
- void (*pciWriteWord)(PCITAG, int, CARD16);
-
-} pciBusFuncs_t, *pciBusFuncs_p;
-
-/*
- * pciBusInfo_t - One structure per defined PCI bus
- */
-typedef struct pci_bus_info {
- unsigned char configMech; /* PCI config type to use */
- unsigned char numDevices; /* Range of valid devnums */
- unsigned char secondary; /* Boolean: bus is a secondary */
- int primary_bus; /* Parent bus */
- pciBusFuncs_p funcs; /* PCI access functions */
- void *pciBusPriv; /* Implementation private data */
- pciConfigPtr bridge; /* bridge that opens this bus */
-} pciBusInfo_t;
-
-#define HOST_NO_BUS ((pciBusInfo_t *)(-1))
-
-/* configMech values */
-#define PCI_CFG_MECH_UNKNOWN 0 /* Not yet known */
-#define PCI_CFG_MECH_1 1 /* Most machines */
-#define PCI_CFG_MECH_2 2 /* Older PC's */
-#define PCI_CFG_MECH_OTHER 3 /* Something else */
-
-/* Generic PCI service functions and helpers */
-PCITAG pciGenFindFirst(void);
-PCITAG pciGenFindNext(void);
-CARD32 pciCfgMech1Read(PCITAG tag, int offset);
-void pciCfgMech1Write(PCITAG tag, int offset, CARD32 val);
-void pciCfgMech1SetBits(PCITAG tag, int offset, CARD32 mask,
- CARD32 val);
-CARD32 pciByteSwap(CARD32);
-Bool pciMfDev(int, int);
-ADDRESS pciAddrNOOP(PCITAG tag, PciAddrType type, ADDRESS);
-
-extern void pciSetOSBIOSPtr(int (*bios_fn)(PCITAG Tag, int basereg, unsigned char * buf, int len));
-extern PCITAG (*pciFindFirstFP)(void);
-extern PCITAG (*pciFindNextFP)(void);
-
-extern CARD32 pciDevid;
-extern CARD32 pciDevidMask;
-
-extern int pciMaxBusNum;
-
-extern int pciBusNum;
-extern int pciDevNum;
-extern int pciFuncNum;
-extern PCITAG pciDeviceTag;
-
-extern int xf86MaxPciDevs;
-
-extern pciBusInfo_t *pciBusInfo[];
-
-#endif /* _PCI_H */
diff --git a/src/VBox/Devices/Makefile.kmk b/src/VBox/Devices/Makefile.kmk
index 488582817..ed95f4885 100644
--- a/src/VBox/Devices/Makefile.kmk
+++ b/src/VBox/Devices/Makefile.kmk
@@ -1121,6 +1121,7 @@ if !defined(VBOX_ONLY_EXTPACKS) # Goes on almost to the end of the file.
ServicesR0_DEFS = IN_INTNET_R0 IN_RT_R0
ServicesR0_SOURCES = \
Network/SrvIntNetR0.cpp
+ Network/SrvIntNetR0.cpp_CXXFLAGS := $(if-expr $(KBUILD_TARGET) == "win",,$(VBOX_GCC_Wno-array_bounds))
#
diff --git a/src/VBox/Devices/Network/DevE1000.cpp b/src/VBox/Devices/Network/DevE1000.cpp
index 073b13038..c367482ca 100644
--- a/src/VBox/Devices/Network/DevE1000.cpp
+++ b/src/VBox/Devices/Network/DevE1000.cpp
@@ -3529,7 +3529,19 @@ static void e1kDescReport(E1KSTATE* pState, E1KTXDESC* pDesc, RTGCPHYS addr)
* processed.
*/
/* Let's pretend we process descriptors. Write back with DD set. */
- if (pDesc->legacy.cmd.fRS || (GET_BITS(TXDCTL, WTHRESH) > 0))
+ /*
+ * Prior to r71586 we tried to accomodate the case when write-back bursts
+ * are enabled without actually implementing bursting by writing back all
+ * descriptors, even the ones that do not have RS set. This caused kernel
+ * panics with Linux SMP kernels, as the e1000 driver tried to free up skb
+ * associated with written back descriptor if it happened to be a context
+ * descriptor since context descriptors do not have skb associated to them.
+ * Starting from r71586 we write back only the descriptors with RS set,
+ * which is a little bit different from what the real hardware does in
+ * case there is a chain of data descritors where some of them have RS set
+ * and others do not. It is very uncommon scenario imho.
+ */
+ if (pDesc->legacy.cmd.fRS)
{
pDesc->legacy.dw3.fDD = 1; /* Descriptor Done */
e1kWriteBackDesc(pState, pDesc, addr);
diff --git a/src/VBox/Devices/Network/slirp/bsd/sys/mbuf.h b/src/VBox/Devices/Network/slirp/bsd/sys/mbuf.h
index 47a8e6268..30b918301 100644
--- a/src/VBox/Devices/Network/slirp/bsd/sys/mbuf.h
+++ b/src/VBox/Devices/Network/slirp/bsd/sys/mbuf.h
@@ -1042,8 +1042,9 @@ struct mbuf *m_uiotombuf(struct uio *, int, int, int, int);
#define PACKET_TAG_IPOPTIONS 27 /* Saved IP options */
#define PACKET_TAG_CARP 28 /* CARP info */
#ifdef VBOX
-#define PACKET_TAG_ALIAS 0xab01
-#define PACKET_TAG_ETHER 0xab02
+# define PACKET_TAG_ALIAS 0xab01
+# define PACKET_TAG_ETHER 0xab02
+# define PACKET_SERVICE 0xab03
#endif
/* Specific cookies and tags. */
diff --git a/src/VBox/Devices/Network/slirp/dnsproxy/dnsproxy.c b/src/VBox/Devices/Network/slirp/dnsproxy/dnsproxy.c
index a56a588dc..ea163f5ca 100644
--- a/src/VBox/Devices/Network/slirp/dnsproxy/dnsproxy.c
+++ b/src/VBox/Devices/Network/slirp/dnsproxy/dnsproxy.c
@@ -132,7 +132,7 @@ timeout(PNATState pData, struct socket *so, void *arg)
sofree(pData, so1);
return;
}
- m = m_getcl(pData, M_NOWAIT, MT_HEADER, M_PKTHDR);
+ m = slirpDnsMbufAlloc(pData);
if (m == NULL)
{
LogRel(("NAT: Can't allocate mbuf\n"));
diff --git a/src/VBox/Devices/Network/slirp/slirp.c b/src/VBox/Devices/Network/slirp/slirp.c
index ffb663c1b..a33a8fee4 100644
--- a/src/VBox/Devices/Network/slirp/slirp.c
+++ b/src/VBox/Devices/Network/slirp/slirp.c
@@ -1438,6 +1438,17 @@ static void arp_input(PNATState pData, struct mbuf *m)
{
case CTL_DNS:
case CTL_ALIAS:
+ case CTL_TFTP:
+ if (!slirpMbufTagService(pData, mr, (uint8_t)(htip & ~pData->netmask)))
+ {
+ static bool fTagErrorReported;
+ if (!fTagErrorReported)
+ {
+ LogRel(("NAT: couldn't add the tag(PACKET_SERVICE:%d) to mbuf:%p\n",
+ (uint8_t)(htip & ~pData->netmask), m));
+ fTagErrorReported = true;
+ }
+ }
rah->ar_sha[5] = (uint8_t)(htip & ~pData->netmask);
break;
default:;
@@ -1562,6 +1573,8 @@ void if_encap(PNATState pData, uint16_t eth_proto, struct mbuf *m, int flags)
if (memcmp(eh->h_source, special_ethaddr, ETH_ALEN) != 0)
{
+ struct m_tag *t = m_tag_first(m);
+ uint8_t u8ServiceId = CTL_ALIAS;
memcpy(eh->h_dest, eh->h_source, ETH_ALEN);
memcpy(eh->h_source, special_ethaddr, ETH_ALEN);
Assert(memcmp(eh->h_dest, special_ethaddr, ETH_ALEN) != 0);
@@ -1571,6 +1584,13 @@ void if_encap(PNATState pData, uint16_t eth_proto, struct mbuf *m, int flags)
m_freem(pData, m);
goto done;
}
+ if ( t
+ && (t = m_tag_find(m, PACKET_SERVICE, NULL)))
+ {
+ Assert(t);
+ u8ServiceId = *(uint8_t *)&t[1];
+ }
+ eh->h_source[5] = u8ServiceId;
}
/*
* we're processing the chain, that isn't not expected.
@@ -2019,6 +2039,8 @@ void slirp_arp_who_has(PNATState pData, uint32_t dst)
ahdr->ar_pln = 4;
ahdr->ar_op = RT_H2N_U16_C(ARPOP_REQUEST);
memcpy(ahdr->ar_sha, special_ethaddr, ETH_ALEN);
+ /* we assume that this request come from gw, but not from DNS or TFTP */
+ ahdr->ar_sha[5] = CTL_ALIAS;
*(uint32_t *)ahdr->ar_sip = RT_H2N_U32(RT_N2H_U32(pData->special_addr.s_addr) | CTL_ALIAS);
memset(ahdr->ar_tha, 0xff, ETH_ALEN); /*broadcast*/
*(uint32_t *)ahdr->ar_tip = dst;
diff --git a/src/VBox/Devices/Network/slirp/slirp.h b/src/VBox/Devices/Network/slirp/slirp.h
index b7f844d3f..26ff00790 100644
--- a/src/VBox/Devices/Network/slirp/slirp.h
+++ b/src/VBox/Devices/Network/slirp/slirp.h
@@ -472,5 +472,46 @@ static inline size_t slirp_size(PNATState pData)
AssertMsgFailed(("Unsupported size"));
return 0;
}
+
+static inline bool slirpMbufTagService(PNATState pData, struct mbuf *m, uint8_t u8ServiceId)
+{
+ struct m_tag * t = NULL;
+ /* if_encap assumes that all packets goes through aliased address(gw) */
+ if (u8ServiceId == CTL_ALIAS)
+ return true;
+ t = m_tag_get(PACKET_SERVICE, sizeof(uint8_t), 0);
+ if (!t)
+ return false;
+ *(uint8_t *)&t[1] = u8ServiceId;
+ m_tag_prepend(m, t);
+ return true;
+}
+
+/**
+ * This function tags mbuf allocated for special services.
+ * @todo: add service id verification.
+ */
+static inline struct mbuf *slirpServiceMbufAlloc(PNATState pData, uint8_t u8ServiceId)
+{
+ struct mbuf *m = NULL;
+ m = m_getcl(pData, M_DONTWAIT, MT_HEADER, M_PKTHDR);
+ if (!m)
+ return m;
+ if(!slirpMbufTagService(pData, m, u8ServiceId))
+ {
+ m_freem(pData, m);
+ return NULL;
+ }
+ return m;
+}
+
+static inline struct mbuf *slirpTftpMbufAlloc(PNATState pData)
+{
+ return slirpServiceMbufAlloc(pData, CTL_TFTP);
+}
+static inline struct mbuf *slirpDnsMbufAlloc(PNATState pData)
+{
+ return slirpServiceMbufAlloc(pData, CTL_DNS);
+}
#endif
diff --git a/src/VBox/Devices/Network/slirp/tftp.c b/src/VBox/Devices/Network/slirp/tftp.c
index 2b34a14dd..8b77bf0c6 100644
--- a/src/VBox/Devices/Network/slirp/tftp.c
+++ b/src/VBox/Devices/Network/slirp/tftp.c
@@ -144,7 +144,7 @@ static int tftp_send_oack(PNATState pData,
struct tftp_t *tp;
int n = 0;
- m = m_getcl(pData, M_DONTWAIT, MT_HEADER, M_PKTHDR);
+ m = slirpTftpMbufAlloc(pData);
if (!m)
return -1;
@@ -180,7 +180,7 @@ static int tftp_send_error(PNATState pData,
struct tftp_t *tp;
int nobytes;
- m = m_getcl(pData, M_DONTWAIT, MT_HEADER, M_PKTHDR);
+ m = slirpTftpMbufAlloc(pData);
if (!m)
return -1;
@@ -228,7 +228,7 @@ static int tftp_send_data(PNATState pData,
if (block_nr < 1)
return -1;
- m = m_getcl(pData, M_DONTWAIT, MT_HEADER, M_PKTHDR);
+ m = slirpTftpMbufAlloc(pData);
if (!m)
return -1;
diff --git a/src/VBox/Devices/Network/slirp/udp.c b/src/VBox/Devices/Network/slirp/udp.c
index c12353e31..1d1760744 100644
--- a/src/VBox/Devices/Network/slirp/udp.c
+++ b/src/VBox/Devices/Network/slirp/udp.c
@@ -188,6 +188,7 @@ udp_input(PNATState pData, register struct mbuf *m, int iphlen)
dst.sin_addr.s_addr = ip->ip_src.s_addr;
dst.sin_port = uh->uh_sport;
+ slirpMbufTagService(pData, m, CTL_DNS);
/* udp_output2() expects a pointer to the body of UDP packet. */
m->m_data += sizeof(struct udpiphdr);
m->m_len -= sizeof(struct udpiphdr);
diff --git a/src/VBox/Devices/PC/BIOS/rombios.c b/src/VBox/Devices/PC/BIOS/rombios.c
index ad4c87980..8d2eac282 100644
--- a/src/VBox/Devices/PC/BIOS/rombios.c
+++ b/src/VBox/Devices/PC/BIOS/rombios.c
@@ -7346,6 +7346,50 @@ floppy_media_known(drive)
}
bx_bool
+floppy_read_id(drive)
+ Bit16u drive;
+{
+ Bit8u val8;
+ Bit8u return_status[7];
+
+ floppy_prepare_controller(drive);
+
+ // send Read ID command (2 bytes) to controller
+ outb(0x03f5, 0x4a); // 4a: Read ID (MFM)
+ outb(0x03f5, drive); // 0=drive0, 1=drive1, head always 0
+
+ // turn on interrupts
+ASM_START
+ sti
+ASM_END
+
+ // wait on 40:3e bit 7 to become 1
+ do {
+ val8 = (read_byte(0x0040, 0x003e) & 0x80);
+ } while ( val8 == 0 );
+
+ val8 = 0; // separate asm from while() loop
+ // turn off interrupts
+ASM_START
+ cli
+ASM_END
+
+ // read 7 return status bytes from controller
+ return_status[0] = inb(0x3f5);
+ return_status[1] = inb(0x3f5);
+ return_status[2] = inb(0x3f5);
+ return_status[3] = inb(0x3f5);
+ return_status[4] = inb(0x3f5);
+ return_status[5] = inb(0x3f5);
+ return_status[6] = inb(0x3f5);
+
+ if ( (return_status[0] & 0xc0) != 0 )
+ return(0);
+ else
+ return(1);
+}
+
+ bx_bool
floppy_media_sense(drive)
Bit16u drive;
{
@@ -7357,8 +7401,9 @@ floppy_media_sense(drive)
return(0);
}
- // for now cheat and get drive type from CMOS,
- // assume media is same as drive type
+ // Try the diskette data rates in the following order:
+ // 1 Mbps -> 500 Kbps -> 300 Kbps -> 250 Kbps
+ // The 1 Mbps rate is only tried for 2.88M drives.
// ** config_data **
// Bitfields for diskette media control:
@@ -7396,13 +7441,13 @@ floppy_media_sense(drive)
if ( drive_type == 1 ) {
// 360K 5.25" drive
config_data = 0x00; // 0000 0000
- media_state = 0x25; // 0010 0101
+ media_state = 0x15; // 0001 0101
retval = 1;
}
else if ( drive_type == 2 ) {
// 1.2 MB 5.25" drive
config_data = 0x00; // 0000 0000
- media_state = 0x25; // 0010 0101 // need double stepping??? (bit 5)
+ media_state = 0x35; // 0011 0101 // need double stepping??? (bit 5)
retval = 1;
}
else if ( drive_type == 3 ) {
@@ -7451,10 +7496,30 @@ floppy_media_sense(drive)
retval = 0;
}
+ write_byte(0x0040, 0x008B, config_data);
+ while (!floppy_read_id(drive)) {
+ if ((config_data & 0xC0) == 0x80) {
+ // If even 250 Kbps failed, we can't do much
+ break;
+ }
+ switch (config_data & 0xC0) {
+ case 0xC0: // 1 Mbps
+ config_data = config_data & 0x3F | 0x00;
+ break;
+ case 0x00: // 500 Kbps
+ config_data = config_data & 0x3F | 0x40;
+ break;
+ case 0x40: // 300 Kbps
+ config_data = config_data & 0x3F | 0x80;
+ break;
+ }
+ write_byte(0x0040, 0x008B, config_data);
+ }
+
if (drive == 0)
- media_state_offset = 0x90;
+ media_state_offset = 0x0090;
else
- media_state_offset = 0x91;
+ media_state_offset = 0x0091;
write_byte(0x0040, 0x008B, config_data);
write_byte(0x0040, media_state_offset, media_state);
@@ -7563,6 +7628,10 @@ BX_DEBUG_INT13_FL("floppy f00\n");
SET_CF();
return;
}
+
+ // force re-calibration etc.
+ write_byte(0x0040, 0x003e, 0);
+
SET_AH(0);
set_diskette_ret_status(0);
CLEAR_CF(); // successful
diff --git a/src/VBox/Devices/PC/DevHPET.cpp b/src/VBox/Devices/PC/DevHPET.cpp
index 467110b00..ea3cdb147 100644
--- a/src/VBox/Devices/PC/DevHPET.cpp
+++ b/src/VBox/Devices/PC/DevHPET.cpp
@@ -333,7 +333,7 @@ static void hpetProgramTimer(HpetTimer *pTimer)
*/
if ((pTimer->u64Config & HPET_TN_32BIT) && !(pTimer->u64Config & HPET_TN_PERIODIC))
{
- u32TillWrap = 0xffffffff - (uint32_t)u64Ticks;
+ u32TillWrap = 0xffffffff - (uint32_t)u64Ticks + 1;
if (u32TillWrap < (uint32_t)u64Diff)
{
u64Diff = u32TillWrap;
diff --git a/src/VBox/Devices/Storage/DevAHCI.cpp b/src/VBox/Devices/Storage/DevAHCI.cpp
index a38b69d9f..6cf04fe57 100644
--- a/src/VBox/Devices/Storage/DevAHCI.cpp
+++ b/src/VBox/Devices/Storage/DevAHCI.cpp
@@ -745,7 +745,7 @@ AssertCompileSize(SGLEntry, 16);
#define AHCI_PORT_CLB_RESERVED 0xfffffc00 /* For masking out the reserved bits. */
-#define AHCI_PORT_FB_RESERVED 0x7fffff00 /* For masking out the reserved bits. */
+#define AHCI_PORT_FB_RESERVED 0xffffff00 /* For masking out the reserved bits. */
#define AHCI_PORT_IS_CPDS RT_BIT(31)
#define AHCI_PORT_IS_TFES RT_BIT(30)
diff --git a/src/VBox/Devices/Storage/DevATA.cpp b/src/VBox/Devices/Storage/DevATA.cpp
index 3e054ebd0..3a8af99c0 100644
--- a/src/VBox/Devices/Storage/DevATA.cpp
+++ b/src/VBox/Devices/Storage/DevATA.cpp
@@ -5293,7 +5293,7 @@ static DECLCALLBACK(int) ataBMDMAIORangeMap(PPCIDEVICE pPciDev, /*unsigned*/ int
for (uint32_t i = 0; i < RT_ELEMENTS(pThis->aCts); i++)
{
int rc2 = PDMDevHlpIOPortRegister(pPciDev->pDevIns, (RTIOPORT)GCPhysAddress + i * 8, 8,
- (RTHCPTR)i, ataBMDMAIOPortWrite, ataBMDMAIOPortRead, NULL, NULL, "ATA Bus Master DMA");
+ (RTHCPTR)(uintptr_t)i, ataBMDMAIOPortWrite, ataBMDMAIOPortRead, NULL, NULL, "ATA Bus Master DMA");
AssertRC(rc2);
if (rc2 < rc)
rc = rc2;
@@ -6797,7 +6797,7 @@ static DECLCALLBACK(int) ataR3Construct(PPDMDEVINS pDevIns, int iInstance, PCF
*/
for (uint32_t i = 0; i < RT_ELEMENTS(pThis->aCts); i++)
{
- rc = PDMDevHlpIOPortRegister(pDevIns, pThis->aCts[i].IOPortBase1, 8, (RTHCPTR)i,
+ rc = PDMDevHlpIOPortRegister(pDevIns, pThis->aCts[i].IOPortBase1, 8, (RTHCPTR)(uintptr_t)i,
ataIOPortWrite1, ataIOPortRead1, ataIOPortWriteStr1, ataIOPortReadStr1, "ATA I/O Base 1");
if (RT_FAILURE(rc))
return PDMDEV_SET_ERROR(pDevIns, rc, N_("PIIX3 cannot register I/O handlers"));
@@ -6823,7 +6823,7 @@ static DECLCALLBACK(int) ataR3Construct(PPDMDEVINS pDevIns, int iInstance, PCF
return PDMDEV_SET_ERROR(pDevIns, rc, "PIIX3 cannot register I/O handlers (R0).");
}
- rc = PDMDevHlpIOPortRegister(pDevIns, pThis->aCts[i].IOPortBase2, 1, (RTHCPTR)i,
+ rc = PDMDevHlpIOPortRegister(pDevIns, pThis->aCts[i].IOPortBase2, 1, (RTHCPTR)(uintptr_t)i,
ataIOPortWrite2, ataIOPortRead2, NULL, NULL, "ATA I/O Base 2");
if (RT_FAILURE(rc))
return PDMDEV_SET_ERROR(pDevIns, rc, N_("PIIX3 cannot register base2 I/O handlers"));
diff --git a/src/VBox/Devices/Storage/fdc.c b/src/VBox/Devices/Storage/fdc.c
index 13c605405..ea92c4108 100644
--- a/src/VBox/Devices/Storage/fdc.c
+++ b/src/VBox/Devices/Storage/fdc.c
@@ -133,6 +133,13 @@ typedef enum fdrive_flags_t {
FDISK_DBL_SIDES = 0x01
} fdrive_flags_t;
+typedef enum fdrive_rate_t {
+ FDRIVE_RATE_500K = 0x00, /* 500 Kbps */
+ FDRIVE_RATE_300K = 0x01, /* 300 Kbps */
+ FDRIVE_RATE_250K = 0x02, /* 250 Kbps */
+ FDRIVE_RATE_1M = 0x03 /* 1 Mbps */
+} fdrive_rate_t;
+
/**
* The status for one drive.
*
@@ -163,8 +170,6 @@ typedef struct fdrive_t {
RTUINT iLUN;
/** The LED for this LUN. */
PDMLED Led;
- /** Media change flag. */
- bool fMediaChanged;
#endif
/* Drive status */
fdrive_type_t drive;
@@ -180,6 +185,7 @@ typedef struct fdrive_t {
uint8_t max_track; /* Nb of tracks */
uint16_t bps; /* Bytes per sector */
uint8_t ro; /* Is read-only */
+ uint8_t media_rate; /* Data rate of medium */
} fdrive_t;
static void fd_init(fdrive_t *drv)
@@ -190,7 +196,6 @@ static void fd_init(fdrive_t *drv)
/* Disk */
drv->last_sect = 0;
drv->max_track = 0;
- drv->fMediaChanged = true;
}
static int fd_sector_calc(uint8_t head, uint8_t track, uint8_t sect,
@@ -269,54 +274,55 @@ typedef struct fd_format_t {
uint8_t last_sect;
uint8_t max_track;
uint8_t max_head;
+ fdrive_rate_t rate;
const char *str;
} fd_format_t;
-static const fd_format_t fd_formats[] = {
+static fd_format_t fd_formats[] = {
/* First entry is default format */
/* 1.44 MB 3"1/2 floppy disks */
- { FDRIVE_DRV_144, FDRIVE_DISK_144, 18, 80, 1, "1.44 MB 3\"1/2", },
- { FDRIVE_DRV_144, FDRIVE_DISK_144, 20, 80, 1, "1.6 MB 3\"1/2", },
- { FDRIVE_DRV_144, FDRIVE_DISK_144, 21, 80, 1, "1.68 MB 3\"1/2", },
- { FDRIVE_DRV_144, FDRIVE_DISK_144, 21, 82, 1, "1.72 MB 3\"1/2", },
- { FDRIVE_DRV_144, FDRIVE_DISK_144, 21, 83, 1, "1.74 MB 3\"1/2", },
- { FDRIVE_DRV_144, FDRIVE_DISK_144, 22, 80, 1, "1.76 MB 3\"1/2", },
- { FDRIVE_DRV_144, FDRIVE_DISK_144, 23, 80, 1, "1.84 MB 3\"1/2", },
- { FDRIVE_DRV_144, FDRIVE_DISK_144, 24, 80, 1, "1.92 MB 3\"1/2", },
+ { FDRIVE_DRV_144, FDRIVE_DISK_144, 18, 80, 1, FDRIVE_RATE_500K, "1.44 MB 3\"1/2", },
+ { FDRIVE_DRV_144, FDRIVE_DISK_144, 20, 80, 1, FDRIVE_RATE_500K, "1.6 MB 3\"1/2", },
+ { FDRIVE_DRV_144, FDRIVE_DISK_144, 21, 80, 1, FDRIVE_RATE_500K, "1.68 MB 3\"1/2", },
+ { FDRIVE_DRV_144, FDRIVE_DISK_144, 21, 82, 1, FDRIVE_RATE_500K, "1.72 MB 3\"1/2", },
+ { FDRIVE_DRV_144, FDRIVE_DISK_144, 21, 83, 1, FDRIVE_RATE_500K, "1.74 MB 3\"1/2", },
+ { FDRIVE_DRV_144, FDRIVE_DISK_144, 22, 80, 1, FDRIVE_RATE_500K, "1.76 MB 3\"1/2", },
+ { FDRIVE_DRV_144, FDRIVE_DISK_144, 23, 80, 1, FDRIVE_RATE_500K, "1.84 MB 3\"1/2", },
+ { FDRIVE_DRV_144, FDRIVE_DISK_144, 24, 80, 1, FDRIVE_RATE_500K, "1.92 MB 3\"1/2", },
/* 2.88 MB 3"1/2 floppy disks */
- { FDRIVE_DRV_288, FDRIVE_DISK_288, 36, 80, 1, "2.88 MB 3\"1/2", },
- { FDRIVE_DRV_288, FDRIVE_DISK_288, 39, 80, 1, "3.12 MB 3\"1/2", },
- { FDRIVE_DRV_288, FDRIVE_DISK_288, 40, 80, 1, "3.2 MB 3\"1/2", },
- { FDRIVE_DRV_288, FDRIVE_DISK_288, 44, 80, 1, "3.52 MB 3\"1/2", },
- { FDRIVE_DRV_288, FDRIVE_DISK_288, 48, 80, 1, "3.84 MB 3\"1/2", },
+ { FDRIVE_DRV_288, FDRIVE_DISK_288, 36, 80, 1, FDRIVE_RATE_1M, "2.88 MB 3\"1/2", },
+ { FDRIVE_DRV_288, FDRIVE_DISK_288, 39, 80, 1, FDRIVE_RATE_1M, "3.12 MB 3\"1/2", },
+ { FDRIVE_DRV_288, FDRIVE_DISK_288, 40, 80, 1, FDRIVE_RATE_1M, "3.2 MB 3\"1/2", },
+ { FDRIVE_DRV_288, FDRIVE_DISK_288, 44, 80, 1, FDRIVE_RATE_1M, "3.52 MB 3\"1/2", },
+ { FDRIVE_DRV_288, FDRIVE_DISK_288, 48, 80, 1, FDRIVE_RATE_1M, "3.84 MB 3\"1/2", },
/* 720 kB 3"1/2 floppy disks */
- { FDRIVE_DRV_144, FDRIVE_DISK_720, 9, 80, 1, "720 kB 3\"1/2", },
- { FDRIVE_DRV_144, FDRIVE_DISK_720, 10, 80, 1, "800 kB 3\"1/2", },
- { FDRIVE_DRV_144, FDRIVE_DISK_720, 10, 82, 1, "820 kB 3\"1/2", },
- { FDRIVE_DRV_144, FDRIVE_DISK_720, 10, 83, 1, "830 kB 3\"1/2", },
- { FDRIVE_DRV_144, FDRIVE_DISK_720, 13, 80, 1, "1.04 MB 3\"1/2", },
- { FDRIVE_DRV_144, FDRIVE_DISK_720, 14, 80, 1, "1.12 MB 3\"1/2", },
+ { FDRIVE_DRV_144, FDRIVE_DISK_720, 9, 80, 1, FDRIVE_RATE_250K, "720 kB 3\"1/2", },
+ { FDRIVE_DRV_144, FDRIVE_DISK_720, 10, 80, 1, FDRIVE_RATE_250K, "800 kB 3\"1/2", },
+ { FDRIVE_DRV_144, FDRIVE_DISK_720, 10, 82, 1, FDRIVE_RATE_250K, "820 kB 3\"1/2", },
+ { FDRIVE_DRV_144, FDRIVE_DISK_720, 10, 83, 1, FDRIVE_RATE_250K, "830 kB 3\"1/2", },
+ { FDRIVE_DRV_144, FDRIVE_DISK_720, 13, 80, 1, FDRIVE_RATE_250K, "1.04 MB 3\"1/2", },
+ { FDRIVE_DRV_144, FDRIVE_DISK_720, 14, 80, 1, FDRIVE_RATE_250K, "1.12 MB 3\"1/2", },
/* 1.2 MB 5"1/4 floppy disks */
- { FDRIVE_DRV_120, FDRIVE_DISK_288, 15, 80, 1, "1.2 kB 5\"1/4", },
- { FDRIVE_DRV_120, FDRIVE_DISK_288, 18, 80, 1, "1.44 MB 5\"1/4", },
- { FDRIVE_DRV_120, FDRIVE_DISK_288, 18, 82, 1, "1.48 MB 5\"1/4", },
- { FDRIVE_DRV_120, FDRIVE_DISK_288, 18, 83, 1, "1.49 MB 5\"1/4", },
- { FDRIVE_DRV_120, FDRIVE_DISK_288, 20, 80, 1, "1.6 MB 5\"1/4", },
+ { FDRIVE_DRV_120, FDRIVE_DISK_288, 15, 80, 1, FDRIVE_RATE_500K, "1.2 MB 5\"1/4", },
+ { FDRIVE_DRV_120, FDRIVE_DISK_288, 18, 80, 1, FDRIVE_RATE_500K, "1.44 MB 5\"1/4", },
+ { FDRIVE_DRV_120, FDRIVE_DISK_288, 18, 82, 1, FDRIVE_RATE_500K, "1.48 MB 5\"1/4", },
+ { FDRIVE_DRV_120, FDRIVE_DISK_288, 18, 83, 1, FDRIVE_RATE_500K, "1.49 MB 5\"1/4", },
+ { FDRIVE_DRV_120, FDRIVE_DISK_288, 20, 80, 1, FDRIVE_RATE_500K, "1.6 MB 5\"1/4", },
/* 720 kB 5"1/4 floppy disks */
- { FDRIVE_DRV_120, FDRIVE_DISK_288, 9, 80, 1, "720 kB 5\"1/4", },
- { FDRIVE_DRV_120, FDRIVE_DISK_288, 11, 80, 1, "880 kB 5\"1/4", },
+ { FDRIVE_DRV_120, FDRIVE_DISK_288, 9, 80, 1, FDRIVE_RATE_250K, "720 kB 5\"1/4", },
+ { FDRIVE_DRV_120, FDRIVE_DISK_288, 11, 80, 1, FDRIVE_RATE_250K, "880 kB 5\"1/4", },
/* 360 kB 5"1/4 floppy disks */
- { FDRIVE_DRV_120, FDRIVE_DISK_288, 9, 40, 1, "360 kB 5\"1/4", },
- { FDRIVE_DRV_120, FDRIVE_DISK_288, 9, 40, 0, "180 kB 5\"1/4", },
- { FDRIVE_DRV_120, FDRIVE_DISK_288, 10, 41, 1, "410 kB 5\"1/4", },
- { FDRIVE_DRV_120, FDRIVE_DISK_288, 10, 42, 1, "420 kB 5\"1/4", },
+ { FDRIVE_DRV_120, FDRIVE_DISK_288, 9, 40, 1, FDRIVE_RATE_300K, "360 kB 5\"1/4", },
+ { FDRIVE_DRV_120, FDRIVE_DISK_288, 9, 40, 0, FDRIVE_RATE_300K, "180 kB 5\"1/4", },
+ { FDRIVE_DRV_120, FDRIVE_DISK_288, 10, 41, 1, FDRIVE_RATE_300K, "410 kB 5\"1/4", },
+ { FDRIVE_DRV_120, FDRIVE_DISK_288, 10, 42, 1, FDRIVE_RATE_300K, "420 kB 5\"1/4", },
/* 320 kB 5"1/4 floppy disks */
- { FDRIVE_DRV_120, FDRIVE_DISK_288, 8, 40, 1, "320 kB 5\"1/4", },
- { FDRIVE_DRV_120, FDRIVE_DISK_288, 8, 40, 0, "160 kB 5\"1/4", },
+ { FDRIVE_DRV_120, FDRIVE_DISK_288, 8, 40, 1, FDRIVE_RATE_250K, "320 kB 5\"1/4", },
+ { FDRIVE_DRV_120, FDRIVE_DISK_288, 8, 40, 0, FDRIVE_RATE_250K, "160 kB 5\"1/4", },
/* 360 kB must match 5"1/4 better than 3"1/2... */
- { FDRIVE_DRV_144, FDRIVE_DISK_720, 9, 80, 0, "360 kB 3\"1/2", },
+ { FDRIVE_DRV_144, FDRIVE_DISK_720, 9, 80, 0, FDRIVE_RATE_250K, "360 kB 3\"1/2", },
/* end */
- { FDRIVE_DRV_NONE, FDRIVE_DISK_NONE, -1, -1, 0, NULL, },
+ { FDRIVE_DRV_NONE, FDRIVE_DISK_NONE, -1, -1, 0, 0, NULL, },
};
/* Revalidate a disk drive after a disk change */
@@ -380,8 +386,13 @@ static void fd_revalidate(fdrive_t *drv)
max_track = parse->max_track;
last_sect = parse->last_sect;
drv->drive = parse->drive;
+#ifdef VBOX
+ drv->media_rate = parse->rate;
+#endif
FLOPPY_DPRINTF("%s floppy disk (%d h %d t %d s) %s\n", parse->str,
nb_heads, max_track, last_sect, ro ? "ro" : "rw");
+ LogRel(("%s floppy disk (%d h %d t %d s) %s\n", parse->str,
+ nb_heads, max_track, last_sect, ro ? "ro" : "rw"));
}
if (nb_heads == 1) {
drv->flags &= ~FDISK_DBL_SIDES;
@@ -396,6 +407,7 @@ static void fd_revalidate(fdrive_t *drv)
drv->last_sect = 0;
drv->max_track = 0;
drv->flags &= ~FDISK_DBL_SIDES;
+ drv->dsk_chg = true; /* Disk change line active. */
}
}
@@ -415,6 +427,7 @@ static DECLCALLBACK(uint32_t) fdctrl_transfer_handler (PPDMDEVINS pDevIns,
uint32_t dma_len);
#endif /* VBOX */
static void fdctrl_raise_irq(fdctrl_t *fdctrl, uint8_t status0);
+static fdrive_t *get_cur_drv(fdctrl_t *fdctrl);
static void fdctrl_result_timer(void *opaque);
static uint32_t fdctrl_read_statusA(fdctrl_t *fdctrl);
@@ -428,6 +441,7 @@ static void fdctrl_write_rate(fdctrl_t *fdctrl, uint32_t value);
static uint32_t fdctrl_read_data(fdctrl_t *fdctrl);
static void fdctrl_write_data(fdctrl_t *fdctrl, uint32_t value);
static uint32_t fdctrl_read_dir(fdctrl_t *fdctrl);
+static void fdctrl_write_ccr(fdctrl_t *fdctrl, uint32_t value);
enum {
FD_DIR_WRITE = 0,
@@ -451,7 +465,8 @@ enum {
FD_REG_MSR = 0x04,
FD_REG_DSR = 0x04,
FD_REG_FIFO = 0x05,
- FD_REG_DIR = 0x07
+ FD_REG_DIR = 0x07,
+ FD_REG_CCR = 0x07
};
enum {
@@ -504,6 +519,8 @@ enum {
};
enum {
+ FD_SR1_MA = 0x01, /* Missing address mark */
+ FD_SR1_NW = 0x02, /* Not writable */
FD_SR1_EC = 0x80 /* End of cylinder */
};
@@ -702,6 +719,9 @@ static void fdctrl_write (void *opaque, uint32_t reg, uint32_t value)
case FD_REG_FIFO:
fdctrl_write_data(fdctrl, value);
break;
+ case FD_REG_CCR:
+ fdctrl_write_ccr(fdctrl, value);
+ break;
default:
break;
}
@@ -718,7 +738,7 @@ static DECLCALLBACK(void) fdMountNotify(PPDMIMOUNTNOTIFY pInterface)
{
fdrive_t *drv = PDMIMOUNTNOTIFY_2_FDRIVE (pInterface);
LogFlow(("fdMountNotify:\n"));
- drv->fMediaChanged = true;
+ fd_revalidate(drv);
}
/**
@@ -730,7 +750,7 @@ static DECLCALLBACK(void) fdUnmountNotify(PPDMIMOUNTNOTIFY pInterface)
{
fdrive_t *drv = PDMIMOUNTNOTIFY_2_FDRIVE (pInterface);
LogFlow(("fdUnmountNotify:\n"));
- drv->fMediaChanged = true;
+ fd_revalidate(drv);
}
#endif
@@ -758,6 +778,15 @@ static void fdctrl_raise_irq(fdctrl_t *fdctrl, uint8_t status0)
#endif
fdctrl->sra |= FD_SRA_INTPEND;
}
+ if (status0 & FD_SR0_SEEK) {
+ fdrive_t *cur_drv;
+
+ /* A seek clears the disk change line (if a disk is inserted). */
+ cur_drv = get_cur_drv(fdctrl);
+ if (cur_drv->max_track)
+ cur_drv->dsk_chg = false;
+ }
+
fdctrl->reset_sensei = 0;
fdctrl->status0 = status0;
FLOPPY_DPRINTF("Set interrupt status to 0x%02x\n", fdctrl->status0);
@@ -968,24 +997,37 @@ static void fdctrl_write_rate(fdctrl_t *fdctrl, uint32_t value)
fdctrl->dsr = value;
}
-static int fdctrl_media_changed(fdrive_t *drv)
+/* Configuration control register : 0x07 (write) */
+static void fdctrl_write_ccr(fdctrl_t *fdctrl, uint32_t value)
{
- int ret;
+ /* Reset mode */
+ if (!(fdctrl->dor & FD_DOR_nRESET)) {
+ FLOPPY_DPRINTF("Floppy controller in RESET state !\n");
+ return;
+ }
+ FLOPPY_DPRINTF("configuration control register set to 0x%02x\n", value);
+
+ /* Only the rate selection bits used in AT mode, and we
+ * store those in the DSR.
+ */
+ fdctrl->dsr = (fdctrl->dsr & ~FD_DSR_DRATEMASK) | (value & FD_DSR_DRATEMASK);
+}
+static int fdctrl_media_changed(fdrive_t *drv)
+{
#ifdef VBOX
- if (!drv->pDrvBlock)
- return 0;
- ret = drv->fMediaChanged;
- drv->fMediaChanged = false;
+ return drv->dsk_chg;
#else
+ int ret;
+
if (!drv->bs)
return 0;
ret = bdrv_media_changed(drv->bs);
-#endif
if (ret) {
fd_revalidate(drv);
}
return ret;
+#endif
}
/* Digital input register : 0x07 (read-only) */
@@ -993,6 +1035,9 @@ static uint32_t fdctrl_read_dir(fdctrl_t *fdctrl)
{
uint32_t retval = 0;
+#ifdef VBOX
+ if (fdctrl_media_changed(get_cur_drv(fdctrl)))
+#else
if (fdctrl_media_changed(drv0(fdctrl))
|| fdctrl_media_changed(drv1(fdctrl))
#if MAX_FD == 4
@@ -1000,6 +1045,7 @@ static uint32_t fdctrl_read_dir(fdctrl_t *fdctrl)
|| fdctrl_media_changed(drv3(fdctrl))
#endif
)
+#endif
retval |= FD_DIR_DSKCHG;
if (retval != 0)
FLOPPY_DPRINTF("Floppy digital input register: 0x%02x\n", retval);
@@ -1141,7 +1187,20 @@ static void fdctrl_start_transfer(fdctrl_t *fdctrl, int direction)
default:
break;
}
-
+ /* Check the data rate. If the programmed data rate does not match
+ * the currently inserted medium, the operation has to fail.
+ */
+#ifdef VBOX
+ if ((fdctrl->dsr & FD_DSR_DRATEMASK) != cur_drv->media_rate) {
+ FLOPPY_DPRINTF("data rate mismatch (fdc=%d, media=%d)\n",
+ fdctrl->dsr & FD_DSR_DRATEMASK, cur_drv->media_rate);
+ fdctrl_stop_transfer(fdctrl, FD_SR0_ABNTERM, FD_SR1_MA, 0x00);
+ fdctrl->fifo[3] = kt;
+ fdctrl->fifo[4] = kh;
+ fdctrl->fifo[5] = ks;
+ return;
+ }
+#endif
/* Set the FIFO state */
fdctrl->data_dir = direction;
fdctrl->data_pos = 0;
@@ -1358,7 +1417,7 @@ static int fdctrl_transfer_handler (void *opaque, int nchan,
/* Handle readonly medium early, no need to do DMA, touch the
* LED or attempt any writes. A real floppy doesn't attempt
* to write to readonly media either. */
- fdctrl_stop_transfer(fdctrl, FD_SR0_ABNTERM | FD_SR0_SEEK, cur_drv->ro << 1,
+ fdctrl_stop_transfer(fdctrl, FD_SR0_ABNTERM | FD_SR0_SEEK, FD_SR1_NW,
0x00);
goto transfer_error;
}
@@ -1783,13 +1842,22 @@ static void fdctrl_handle_seek(fdctrl_t *fdctrl, int direction)
SET_CUR_DRV(fdctrl, fdctrl->fifo[1] & FD_DOR_SELMASK);
cur_drv = get_cur_drv(fdctrl);
fdctrl_reset_fifo(fdctrl);
- if (cur_drv->max_track && fdctrl->fifo[2] > cur_drv->max_track) {
+#ifdef VBOX
+ /* The seek command just sends step pulses to the drive and doesn't care if
+ * there's a medium inserted or if it's banging the head against the drive.
+ */
+ cur_drv->track = fdctrl->fifo[2];
+ /* Raise Interrupt */
+ fdctrl_raise_irq(fdctrl, FD_SR0_SEEK);
+#else
+ if (fdctrl->fifo[2] > cur_drv->max_track) {
fdctrl_raise_irq(fdctrl, FD_SR0_ABNTERM | FD_SR0_SEEK);
} else {
cur_drv->track = fdctrl->fifo[2];
/* Raise Interrupt */
fdctrl_raise_irq(fdctrl, FD_SR0_SEEK);
}
+#endif
}
static void fdctrl_handle_perpendicular_mode(fdctrl_t *fdctrl, int direction)
@@ -1995,7 +2063,17 @@ static void fdctrl_result_timer(void *opaque)
if (cur_drv->last_sect != 0) {
cur_drv->sect = (cur_drv->sect % cur_drv->last_sect) + 1;
}
- fdctrl_stop_transfer(fdctrl, 0x00, 0x00, 0x00);
+ /* READ_ID can't automatically succeed! */
+#ifdef VBOX
+ if (/* !cur_drv->fMediaPresent || */
+ ((fdctrl->dsr & FD_DSR_DRATEMASK) != cur_drv->media_rate)) {
+ FLOPPY_DPRINTF("read id rate mismatch (fdc=%d, media=%d)\n",
+ fdctrl->dsr & FD_DSR_DRATEMASK, cur_drv->media_rate);
+ fdctrl_stop_transfer(fdctrl, FD_SR0_ABNTERM, FD_SR1_MA, 0x00);
+ }
+ else
+#endif
+ fdctrl_stop_transfer(fdctrl, 0x00, 0x00, 0x00);
}
#ifdef VBOX
diff --git a/src/VBox/Frontends/VBoxBalloonCtrl/VBoxBalloonCtrl.cpp b/src/VBox/Frontends/VBoxBalloonCtrl/VBoxBalloonCtrl.cpp
index 70cd3dbdd..c6fe22f3f 100644
--- a/src/VBox/Frontends/VBoxBalloonCtrl/VBoxBalloonCtrl.cpp
+++ b/src/VBox/Frontends/VBoxBalloonCtrl/VBoxBalloonCtrl.cpp
@@ -62,9 +62,6 @@ using namespace com;
* of a per-machine based one. */
#define VBOX_BALLOONCTRL_GLOBAL_PERFCOL
-/** The semaphore we're blocking on. */
-static RTSEMEVENTMULTI g_BalloonControlEvent = NIL_RTSEMEVENTMULTI;
-
/** The critical section for keep our stuff in sync. */
static RTCRITSECT g_MapCritSect;
@@ -119,13 +116,13 @@ static const RTGETOPTDEF g_aOptions[] = {
{ "--loginterval", 'I', RTGETOPT_REQ_UINT32 }
};
-unsigned long g_ulTimeoutMS = 30 * 1000; /* Default is 30 seconds timeout. */
-unsigned long g_ulMemoryBalloonIncrementMB = 256;
-unsigned long g_ulMemoryBalloonDecrementMB = 128;
+static unsigned long g_ulTimeoutMS = 30 * 1000; /* Default is 30 seconds timeout. */
+static unsigned long g_ulMemoryBalloonIncrementMB = 256;
+static unsigned long g_ulMemoryBalloonDecrementMB = 128;
/** Global balloon limit is 0, so disabled. Can be overridden by a per-VM
* "VBoxInternal/Guest/BalloonSizeMax" value. */
-unsigned long g_ulMemoryBalloonMaxMB = 0;
-unsigned long g_ulLowerMemoryLimitMB = 64;
+static unsigned long g_ulMemoryBalloonMaxMB = 0;
+static unsigned long g_ulLowerMemoryLimitMB = 64;
/** Global objects. */
static ComPtr<IVirtualBoxClient> g_pVirtualBoxClient = NULL;
@@ -151,28 +148,27 @@ typedef struct VBOXBALLOONCTRL_MACHINE
typedef std::map<Bstr, VBOXBALLOONCTRL_MACHINE> mapVM;
typedef std::map<Bstr, VBOXBALLOONCTRL_MACHINE>::iterator mapVMIter;
typedef std::map<Bstr, VBOXBALLOONCTRL_MACHINE>::const_iterator mapVMIterConst;
-mapVM g_mapVM;
+static mapVM g_mapVM;
/* Prototypes. */
#define serviceLogVerbose(a) if (g_fVerbose) { serviceLog a; }
-void serviceLog(const char *pszFormat, ...);
+static void serviceLog(const char *pszFormat, ...);
-bool machineIsRunning(MachineState_T enmState);
-mapVMIter machineGetByUUID(const Bstr &strUUID);
-int machineAdd(const ComPtr<IMachine> &rptrMachine);
-int machineUpdate(const ComPtr<IMachine> &rptrMachine, MachineState_T enmState);
-int machineUpdate(mapVMIter it, MachineState_T enmState);
-void machineRemove(mapVMIter it);
+static bool machineIsRunning(MachineState_T enmState);
+static bool machineHandled(const Bstr &strUuid);
+static int machineAdd(const Bstr &strUuid);
+static int machineRemove(const Bstr &strUuid);
+static int machineUpdate(const Bstr &strUuid, MachineState_T enmState);
-unsigned long balloonGetMaxSize(const ComPtr<IMachine> &rptrMachine);
-bool balloonIsRequired(mapVMIter it);
-int balloonUpdate(mapVMIterConst it);
+static unsigned long balloonGetMaxSize(const ComPtr<IMachine> &rptrMachine);
+static bool balloonIsRequired(PVBOXBALLOONCTRL_MACHINE pMachine);
+static int balloonUpdate(const Bstr &strUuid, PVBOXBALLOONCTRL_MACHINE pMachine);
-HRESULT balloonCtrlSetup();
-void balloonCtrlShutdown();
+static HRESULT balloonCtrlSetup();
+static void balloonCtrlShutdown();
-HRESULT createGlobalObjects();
-void deleteGlobalObjects();
+static HRESULT createGlobalObjects();
+static void deleteGlobalObjects();
#ifdef RT_OS_WINDOWS
/* Required for ATL. */
@@ -213,22 +209,15 @@ class VirtualBoxEventListener
int rc = RTCritSectEnter(&g_MapCritSect);
if (RT_SUCCESS(rc))
{
- if (fRegistered)
- {
- ComPtr <IMachine> machine;
- hr = g_pVirtualBox->FindMachine(uuid.raw(), machine.asOutParam());
- if (SUCCEEDED(hr))
- rc = machineAdd(machine);
- else
- rc = VERR_NOT_FOUND;
- }
- else
- machineRemove(machineGetByUUID(uuid));
- AssertRC(rc);
+ if (fRegistered && machineHandled(uuid))
+ rc = machineAdd(uuid);
+ else if (!fRegistered)
+ rc = machineRemove(uuid);
int rc2 = RTCritSectLeave(&g_MapCritSect);
if (RT_SUCCESS(rc))
rc = rc2;
+ AssertRC(rc);
}
}
break;
@@ -251,23 +240,11 @@ class VirtualBoxEventListener
int rc = RTCritSectEnter(&g_MapCritSect);
if (RT_SUCCESS(rc))
{
- mapVMIter it = machineGetByUUID(uuid);
- if (it == g_mapVM.end())
- {
- /* Use the machine object to figure out if we
- * need to do something. */
- ComPtr <IMachine> machine;
- hr = g_pVirtualBox->FindMachine(uuid.raw(), machine.asOutParam());
- if (SUCCEEDED(hr))
- rc = machineUpdate(machine, machineState);
- }
- else /* Update an existing machine. */
- rc = machineUpdate(it, machineState);
- AssertRC(rc);
-
+ rc = machineUpdate(uuid, machineState);
int rc2 = RTCritSectLeave(&g_MapCritSect);
if (RT_SUCCESS(rc))
rc = rc2;
+ AssertRC(rc);
}
}
break;
@@ -282,10 +259,9 @@ class VirtualBoxEventListener
if (!fAvailable)
{
serviceLog("VBoxSVC became unavailable\n");
- {
- balloonCtrlShutdown();
- deleteGlobalObjects();
- }
+
+ balloonCtrlShutdown();
+ deleteGlobalObjects();
}
else
{
@@ -329,11 +305,11 @@ static void signalHandler(int iSignal)
NOREF(iSignal);
ASMAtomicWriteBool(&g_fCanceled, true);
- if (g_BalloonControlEvent != NIL_RTSEMEVENTMULTI)
+ if (!g_pEventQ)
{
- int rc = RTSemEventMultiSignal(g_BalloonControlEvent);
+ int rc = g_pEventQ->interruptEventQueueProcessing();
if (RT_FAILURE(rc))
- serviceLog("Error: RTSemEventMultiSignal failed with rc=%Rrc\n");
+ serviceLog("Error: interruptEventQueueProcessing failed with rc=%Rrc\n", rc);
}
}
@@ -360,7 +336,15 @@ static void signalHandlerUninstall()
#endif
}
-long getlBalloonDelta(unsigned long ulCurrentDesktopBalloonSize, unsigned long ulDesktopFreeMemory, unsigned long ulMaxBalloonSize)
+/**
+ * Retrieves the current delta value
+ *
+ * @return long Delta (MB) of the balloon to be deflated (<0) or inflated (>0).
+ * @param ulCurrentDesktopBalloonSize The balloon's current size.
+ * @param ulDesktopFreeMemory The VM's current free memory.
+ * @param ulMaxBalloonSize The maximum balloon size (MB) it can inflate to.
+ */
+static long getlBalloonDelta(unsigned long ulCurrentDesktopBalloonSize, unsigned long ulDesktopFreeMemory, unsigned long ulMaxBalloonSize)
{
if (ulCurrentDesktopBalloonSize > ulMaxBalloonSize)
return (ulMaxBalloonSize - ulCurrentDesktopBalloonSize);
@@ -401,7 +385,7 @@ long getlBalloonDelta(unsigned long ulCurrentDesktopBalloonSize, unsigned long u
* @return bool Flag indicating whether the VM is running or not.
* @param enmState The VM's machine state to judge whether it's running or not.
*/
-bool machineIsRunning(MachineState_T enmState)
+static bool machineIsRunning(MachineState_T enmState)
{
switch (enmState)
{
@@ -420,19 +404,66 @@ bool machineIsRunning(MachineState_T enmState)
return false;
}
-mapVMIter machineGetByUUID(const Bstr &strUUID)
+/**
+ * Determines whether the specified machine needs to be handled
+ * by this service.
+ *
+ * @return bool True if the machine needs handling, false if not.
+ * @param strUuid UUID of the specified machine.
+ */
+static bool machineHandled(const Bstr &strUuid)
{
- return g_mapVM.find(strUUID);
+ bool fHandled = false;
+
+ do
+ {
+ HRESULT rc;
+
+ ComPtr <IMachine> machine;
+ CHECK_ERROR_BREAK(g_pVirtualBox, FindMachine(strUuid.raw(), machine.asOutParam()));
+
+ MachineState_T machineState;
+ CHECK_ERROR_BREAK(machine, COMGETTER(State)(&machineState));
+
+ if ( balloonGetMaxSize(machine)
+ && machineIsRunning(machineState))
+ {
+ serviceLogVerbose(("Handling machine \"%ls\"\n", strUuid.raw()));
+ fHandled = true;
+ }
+ }
+ while (0);
+
+ return fHandled;
}
-int machineAdd(const ComPtr<IMachine> &rptrMachine)
+/**
+ * Adds a specified machine to the list (map) of handled machines.
+ *
+ * @return IPRT status code.
+ * @param strUuid UUID of the specified machine.
+ */
+static int machineAdd(const Bstr &strUuid)
{
HRESULT rc;
do
{
+ ComPtr <IMachine> machine;
+ CHECK_ERROR_BREAK(g_pVirtualBox, FindMachine(strUuid.raw(), machine.asOutParam()));
+
+ MachineState_T machineState;
+ CHECK_ERROR_BREAK(machine, COMGETTER(State)(&machineState));
+
+ if ( !balloonGetMaxSize(machine)
+ || !machineIsRunning(machineState))
+ {
+ /* This machine does not need to be added, just skip it! */
+ break;
+ }
+
VBOXBALLOONCTRL_MACHINE m;
- m.machine = rptrMachine;
+ m.machine = machine;
/*
* Setup metrics.
@@ -441,7 +472,10 @@ int machineAdd(const ComPtr<IMachine> &rptrMachine)
com::SafeIfaceArray<IUnknown> metricObjects(1);
com::SafeIfaceArray<IPerformanceMetric> metricAffected;
- Bstr strMetricNames(L"Guest/RAM*");
+ /* NOTE: the base metric for Guest/RAM/Usage is RAM/Usage up to
+ * VirtualBox 4.0. Somewhat inconsistent, but changing may be
+ * considered an API change since it can break existing API clients. */
+ Bstr strMetricNames(L"RAM/Usage");
strMetricNames.cloneTo(&metricNames[0]);
m.machine.queryInterfaceTo(&metricObjects[0]);
@@ -463,67 +497,129 @@ int machineAdd(const ComPtr<IMachine> &rptrMachine)
/*
* Add machine to map.
*/
- Bstr strUUID;
- CHECK_ERROR_BREAK(rptrMachine, COMGETTER(Id)(strUUID.asOutParam()));
-
- mapVMIter it = g_mapVM.find(strUUID);
+ mapVMIter it = g_mapVM.find(strUuid);
Assert(it == g_mapVM.end());
- g_mapVM.insert(std::make_pair(strUUID, m));
+ g_mapVM.insert(std::make_pair(strUuid, m));
- serviceLogVerbose(("Added machine \"%s\"\n", Utf8Str(strUUID).c_str()));
+ serviceLogVerbose(("Added machine \"%ls\"\n", strUuid.raw()));
} while (0);
return SUCCEEDED(rc) ? VINF_SUCCESS : VERR_COM_IPRT_ERROR; /* @todo Find a better error! */
}
-void machineRemove(mapVMIter it)
+/**
+ * Removes a specified machine from the list of handled machines.
+ *
+ * @return IPRT status code.
+ * @param strUuid UUID of the specified machine.
+ */
+static int machineRemove(const Bstr &strUuid)
{
- if (it != g_mapVM.end())
+ int rc = RTCritSectEnter(&g_MapCritSect);
+ if (RT_SUCCESS(rc))
{
- /* Must log before erasing the iterator because of the UUID ref! */
- serviceLogVerbose(("Removing machine \"%s\"\n", Utf8Str(it->first).c_str()));
+ mapVMIter it = g_mapVM.find(strUuid);
+ if (it != g_mapVM.end())
+ {
+ /* Must log before erasing the iterator because of the UUID ref! */
+ serviceLogVerbose(("Removing machine \"%ls\"\n", strUuid.raw()));
- /*
- * Remove machine from map.
- */
- g_mapVM.erase(it);
+ /*
+ * Remove machine from map.
+ */
+ g_mapVM.erase(it);
+ }
+ else
+ {
+ serviceLogVerbose(("Warning: Removing not added machine \"%ls\"\n", strUuid.raw()));
+ rc = VERR_NOT_FOUND;
+ }
+
+ int rc2 = RTCritSectLeave(&g_MapCritSect);
+ if (RT_SUCCESS(rc))
+ rc = rc2;
}
+
+ return rc;
}
-int machineUpdate(const ComPtr<IMachine> &rptrMachine, MachineState_T enmState)
+/**
+ * Updates a specified machine according to its current machine state.
+ * That currently also could mean that a machine gets removed if it doesn't
+ * fit in our criteria anymore or a machine gets added if we need to handle
+ * it now (and didn't before).
+ *
+ * @return IPRT status code.
+ * @param strUuid UUID of the specified machine.
+ * @param enmState The machine's current state.
+ */
+static int machineUpdate(const Bstr &strUuid, MachineState_T enmState)
{
- if ( !balloonGetMaxSize(rptrMachine)
- || !machineIsRunning(enmState))
+ int rc = VINF_SUCCESS;
+
+ mapVMIter it = g_mapVM.find(strUuid);
+ if (it == g_mapVM.end())
{
- return VINF_SUCCESS; /* Machine is not required to be added. */
+ if (machineHandled(strUuid))
+ {
+ rc = machineAdd(strUuid);
+ if (RT_SUCCESS(rc))
+ it = g_mapVM.find(strUuid);
+ }
+ else
+ {
+ serviceLogVerbose(("Machine \"%ls\" (state: %u) does not need to be updated\n",
+ strUuid.raw(), enmState));
+ }
}
- return machineAdd(rptrMachine);
-}
-int machineUpdate(mapVMIter it, MachineState_T enmState)
-{
- Assert(it != g_mapVM.end());
-
- if ( !balloonIsRequired(it)
- || !machineIsRunning(enmState))
+ if (it != g_mapVM.end())
{
- machineRemove(it);
- return VINF_SUCCESS;
+ /*
+ * Ballooning stuff - start.
+ */
+
+ /* Our actual ballooning criteria. */
+ if ( !balloonIsRequired(&it->second)
+ || !machineIsRunning(enmState))
+ {
+ /* Current machine is not suited for ballooning anymore -
+ * remove it from our map. */
+ rc = machineRemove(strUuid);
+ }
+ else
+ {
+ rc = balloonUpdate(strUuid, &it->second);
+ AssertRC(rc);
+ }
}
- return balloonUpdate(it);
+ /*
+ * Ballooning stuff - end.
+ */
+
+ return rc;
}
-int getMetric(mapVMIterConst it, const Bstr& strName, LONG *pulData)
+/**
+ * Retrieves a metric from a specified machine.
+ *
+ * @return IPRT status code.
+ * @param pMachine Pointer to the machine's internal structure.
+ * @param strName Name of metric to retrieve.
+ * @param pulData Pointer to value to retrieve the actual metric value.
+ */
+static int getMetric(PVBOXBALLOONCTRL_MACHINE pMachine, const Bstr& strName, LONG *pulData)
{
- AssertPtrReturn(pulData, VERR_INVALID_PARAMETER);
+ AssertPtrReturn(pMachine, VERR_INVALID_POINTER);
+ AssertPtrReturn(pulData, VERR_INVALID_POINTER);
/* Input. */
com::SafeArray<BSTR> metricNames(1);
com::SafeIfaceArray<IUnknown> metricObjects(1);
- it->second.machine.queryInterfaceTo(&metricObjects[0]);
+ pMachine->machine.queryInterfaceTo(&metricObjects[0]);
/* Output. */
com::SafeArray<BSTR> retNames;
@@ -538,9 +634,11 @@ int getMetric(mapVMIterConst it, const Bstr& strName, LONG *pulData)
/* Query current memory free. */
strName.cloneTo(&metricNames[0]);
#ifdef VBOX_BALLOONCTRL_GLOBAL_PERFCOL
+ Assert(!g_pPerfCollector.isNull());
HRESULT hrc = g_pPerfCollector->QueryMetricsData(
#else
- HRESULT hrc = it->second.collector->QueryMetricsData(
+ Assert(!pMachine->collector.isNull());
+ HRESULT hrc = pMachine->collector->QueryMetricsData(
#endif
ComSafeArrayAsInParam(metricNames),
ComSafeArrayAsInParam(metricObjects),
@@ -583,9 +681,9 @@ int getMetric(mapVMIterConst it, const Bstr& strName, LONG *pulData)
* Determines the maximum balloon size to set for the specified machine.
*
* @return unsigned long Balloon size (in MB) to set, 0 if no ballooning required.
- * @param rptrMachine Pointer to specified machine.
+ * @param rptrMachine Pointer to interface of specified machine.
*/
-unsigned long balloonGetMaxSize(const ComPtr<IMachine> &rptrMachine)
+static unsigned long balloonGetMaxSize(const ComPtr<IMachine> &rptrMachine)
{
/*
* Try to retrieve the balloon maximum size via the following order:
@@ -622,17 +720,20 @@ unsigned long balloonGetMaxSize(const ComPtr<IMachine> &rptrMachine)
}
/**
- * Determines whether ballooning is required to the spcified VM.
+ * Determines whether ballooning is required to the specified machine.
*
- * @return bool True if ballooning is required, false if not.
- * @param it Iterator pointing to the VM to be processed.
+ * @return bool True if ballooning is required, false if not.
+ * @param strUuid UUID of the specified machine.
*/
-bool balloonIsRequired(mapVMIter it)
+static bool balloonIsRequired(PVBOXBALLOONCTRL_MACHINE pMachine)
{
+ AssertPtrReturn(pMachine, false);
+
/* Only do ballooning if we have a maximum balloon size set. */
- it->second.ulBalloonSizeMax = balloonGetMaxSize(it->second.machine);
+ pMachine->ulBalloonSizeMax = pMachine->machine.isNull()
+ ? 0 : balloonGetMaxSize(pMachine->machine);
- return it->second.ulBalloonSizeMax ? true : false;
+ return pMachine->ulBalloonSizeMax ? true : false;
}
/**
@@ -640,17 +741,20 @@ bool balloonIsRequired(mapVMIter it)
* capable and ready for ballooning.
*
* @return IPRT status code.
- * @param it Iterator pointing to the VM to be processed.
+ * @param strUuid UUID of the specified machine.
+ * @param pMachine Pointer to the machine's internal structure.
*/
-int balloonUpdate(mapVMIterConst it)
+static int balloonUpdate(const Bstr &strUuid, PVBOXBALLOONCTRL_MACHINE pMachine)
{
+ AssertPtrReturn(pMachine, VERR_INVALID_POINTER);
+
/*
* Get metrics collected at this point.
*/
LONG lMemFree, lBalloonCur;
- int vrc = getMetric(it, L"Guest/RAM/Usage/Free", &lMemFree);
+ int vrc = getMetric(pMachine, L"Guest/RAM/Usage/Free", &lMemFree);
if (RT_SUCCESS(vrc))
- vrc = getMetric(it, L"Guest/RAM/Usage/Balloon", &lBalloonCur);
+ vrc = getMetric(pMachine, L"Guest/RAM/Usage/Balloon", &lBalloonCur);
if (RT_SUCCESS(vrc))
{
@@ -659,7 +763,7 @@ int balloonUpdate(mapVMIterConst it)
if (lMemFree <= 0)
{
#ifdef DEBUG
- serviceLogVerbose(("%s: No metrics available yet!\n", Utf8Str(it->first).c_str()));
+ serviceLogVerbose(("%ls: No metrics available yet!\n", strUuid.raw()));
#endif
return VINF_SUCCESS;
}
@@ -667,25 +771,25 @@ int balloonUpdate(mapVMIterConst it)
lMemFree /= 1024;
lBalloonCur /= 1024;
- serviceLogVerbose(("%s: Balloon: %ld, Free mem: %ld, Max ballon: %ld\n",
- Utf8Str(it->first).c_str(),
- lBalloonCur, lMemFree, it->second.ulBalloonSizeMax));
+ serviceLogVerbose(("%ls: Balloon: %ld, Free mem: %ld, Max ballon: %ld\n",
+ strUuid.raw(),
+ lBalloonCur, lMemFree, pMachine->ulBalloonSizeMax));
/* Calculate current balloon delta. */
- long lDelta = getlBalloonDelta(lBalloonCur, lMemFree, it->second.ulBalloonSizeMax);
+ long lDelta = getlBalloonDelta(lBalloonCur, lMemFree, pMachine->ulBalloonSizeMax);
if (lDelta) /* Only do ballooning if there's really smth. to change ... */
{
lBalloonCur = lBalloonCur + lDelta;
Assert(lBalloonCur > 0);
- serviceLog("%s: %s balloon by %ld to %ld ...\n",
- Utf8Str(it->first).c_str(),
+ serviceLog("%ls: %s balloon by %ld to %ld ...\n",
+ strUuid.raw(),
lDelta > 0 ? "Inflating" : "Deflating", lDelta, lBalloonCur);
HRESULT rc;
/* Open a session for the VM. */
- CHECK_ERROR(it->second.machine, LockMachine(g_pSession, LockType_Shared));
+ CHECK_ERROR(pMachine->machine, LockMachine(g_pSession, LockType_Shared));
do
{
@@ -698,8 +802,8 @@ int balloonUpdate(mapVMIterConst it)
if (SUCCEEDED(rc))
CHECK_ERROR_BREAK(guest, COMSETTER(MemoryBalloonSize)(lBalloonCur));
else
- serviceLog("Error: Unable to set new balloon size %ld for machine \"%s\", rc=%Rhrc",
- lBalloonCur, Utf8Str(it->first).c_str(), rc);
+ serviceLog("Error: Unable to set new balloon size %ld for machine \"%ls\", rc=%Rhrc",
+ lBalloonCur, strUuid.raw(), rc);
} while (0);
/* Unlock the machine again. */
@@ -707,12 +811,12 @@ int balloonUpdate(mapVMIterConst it)
}
}
else
- serviceLog("Error: Unable to retrieve metrics for machine \"%s\", rc=%Rrc",
- Utf8Str(it->first).c_str(), vrc);
+ serviceLog("Error: Unable to retrieve metrics for machine \"%ls\", rc=%Rrc",
+ strUuid.raw(), vrc);
return vrc;
}
-void vmListDestroy()
+static void vmListDestroy()
{
serviceLogVerbose(("Destroying VM list ...\n"));
@@ -736,7 +840,7 @@ void vmListDestroy()
AssertRC(rc);
}
-int vmListBuild()
+static int vmListBuild()
{
serviceLogVerbose(("Building VM list ...\n"));
@@ -769,24 +873,14 @@ int vmListBuild()
CHECK_ERROR_BREAK(machines[i], COMGETTER(Accessible)(&fAccessible));
if (!fAccessible)
{
- serviceLogVerbose(("Machine \"%s\" is inaccessible, skipping\n",
- Utf8Str(strUUID).c_str()));
+ serviceLogVerbose(("Machine \"%ls\" is inaccessible, skipping\n",
+ strUUID.raw()));
continue;
}
- MachineState_T machineState;
- CHECK_ERROR_BREAK(machines[i], COMGETTER(State)(&machineState));
-
- if (g_fVerbose)
- serviceLogVerbose(("Processing machine \"%s\" (state: %ld)\n",
- Utf8Str(strUUID).c_str(), machineState));
-
- if (machineIsRunning(machineState))
- {
- rc = machineAdd(machines[i]);
- if (RT_FAILURE(rc))
- break;
- }
+ rc = machineAdd(strUUID);
+ if (RT_FAILURE(rc))
+ break;
}
}
@@ -801,8 +895,14 @@ int vmListBuild()
return rc;
}
-int balloonCtrlCheck()
+static int balloonCtrlCheck()
{
+ static uint64_t uLast = UINT64_MAX;
+ uint64_t uNow = RTTimeProgramMilliTS() / g_ulTimeoutMS;
+ if (uLast == uNow)
+ return VINF_SUCCESS;
+ uLast = uNow;
+
int rc = RTCritSectEnter(&g_MapCritSect);
if (RT_SUCCESS(rc))
{
@@ -813,7 +913,7 @@ int balloonCtrlCheck()
HRESULT hrc = it->second.machine->COMGETTER(State)(&machineState);
if (SUCCEEDED(hrc))
{
- rc = machineUpdate(it, machineState);
+ rc = machineUpdate(it->first /* UUID */, machineState);
if (RT_FAILURE(rc))
break;
}
@@ -828,7 +928,7 @@ int balloonCtrlCheck()
return rc;
}
-HRESULT balloonCtrlSetup()
+static HRESULT balloonCtrlSetup()
{
HRESULT rc = S_OK;
@@ -858,7 +958,7 @@ HRESULT balloonCtrlSetup()
return rc;
}
-void balloonCtrlShutdown()
+static void balloonCtrlShutdown()
{
serviceLog("Shutting down ballooning ...\n");
@@ -869,20 +969,19 @@ void balloonCtrlShutdown()
#endif
}
-RTEXITCODE balloonCtrlMain(HandlerArg *a)
+static RTEXITCODE balloonCtrlMain(HandlerArg *a)
{
HRESULT rc = S_OK;
do
{
+ int vrc = VINF_SUCCESS;
+
/* Initialize global weak references. */
g_pEventQ = com::EventQueue::getMainEventQueue();
RTCritSectInit(&g_MapCritSect);
- int vrc = RTSemEventMultiCreate(&g_BalloonControlEvent);
- AssertRCReturn(vrc, RTEXITCODE_FAILURE);
-
/*
* Install signal handlers.
*/
@@ -931,20 +1030,13 @@ RTEXITCODE balloonCtrlMain(HandlerArg *a)
* Process pending events, then wait for new ones. Note, this
* processes NULL events signalling event loop termination.
*/
- g_pEventQ->processEventQueue(500);
+ g_pEventQ->processEventQueue(g_ulTimeoutMS / 10);
if (g_fCanceled)
{
serviceLog("Signal caught, exiting ...\n");
break;
}
-
- vrc = RTSemEventMultiWait(g_BalloonControlEvent, g_ulTimeoutMS);
- if (vrc != VERR_TIMEOUT && RT_FAILURE(vrc))
- {
- serviceLog("Error: RTSemEventMultiWait failed; rc=%Rrc\n", vrc);
- break;
- }
}
signal(SIGINT, SIG_DFL);
@@ -966,8 +1058,6 @@ RTEXITCODE balloonCtrlMain(HandlerArg *a)
balloonCtrlShutdown();
RTCritSectDelete(&g_MapCritSect);
- RTSemEventMultiDestroy(g_BalloonControlEvent);
- g_BalloonControlEvent = NIL_RTSEMEVENTMULTI;
if (RT_FAILURE(vrc))
rc = VBOX_E_IPRT_ERROR;
@@ -977,7 +1067,7 @@ RTEXITCODE balloonCtrlMain(HandlerArg *a)
return SUCCEEDED(rc) ? RTEXITCODE_SUCCESS : RTEXITCODE_FAILURE;
}
-void serviceLog(const char *pszFormat, ...)
+static void serviceLog(const char *pszFormat, ...)
{
va_list args;
va_start(args, pszFormat);
@@ -990,7 +1080,7 @@ void serviceLog(const char *pszFormat, ...)
RTStrFree(psz);
}
-void logHeaderFooter(PRTLOGGER pLoggerRelease, RTLOGPHASE enmPhase, PFNRTLOGPHASEMSG pfnLog)
+static void logHeaderFooter(PRTLOGGER pLoggerRelease, RTLOGPHASE enmPhase, PFNRTLOGPHASEMSG pfnLog)
{
/* Some introductory information. */
static RTTIMESPEC s_TimeSpec;
@@ -1058,7 +1148,7 @@ void logHeaderFooter(PRTLOGGER pLoggerRelease, RTLOGPHASE enmPhase, PFNRTLOGPHAS
}
}
-void displayHelp()
+static void displayHelp()
{
RTStrmPrintf(g_pStdErr, "\nUsage: VBoxBalloonCtrl [options]\n\nSupported options (default values in brackets):\n");
for (unsigned i = 0;
@@ -1134,7 +1224,7 @@ void displayHelp()
"Set \"VBoxInternal/Guest/BalloonSizeMax\" for a per-VM maximum ballooning size.\n");
}
-void deleteGlobalObjects()
+static void deleteGlobalObjects()
{
serviceLogVerbose(("Deleting local objects ...\n"));
@@ -1147,7 +1237,7 @@ void deleteGlobalObjects()
*
* @return HRESULT
*/
-HRESULT createGlobalObjects()
+static HRESULT createGlobalObjects()
{
serviceLogVerbose(("Creating local objects ...\n"));
@@ -1199,6 +1289,8 @@ int main(int argc, char *argv[])
case 'i': /* Interval. */
g_ulTimeoutMS = ValueUnion.u32;
+ if (g_ulTimeoutMS < 500)
+ g_ulTimeoutMS = 500;
break;
case 'v':
diff --git a/src/VBox/Frontends/VBoxHeadless/VBoxHeadless.cpp b/src/VBox/Frontends/VBoxHeadless/VBoxHeadless.cpp
index 4abeb7fb4..57bc5a7f2 100644
--- a/src/VBox/Frontends/VBoxHeadless/VBoxHeadless.cpp
+++ b/src/VBox/Frontends/VBoxHeadless/VBoxHeadless.cpp
@@ -517,6 +517,11 @@ static void parse_environ(unsigned long *pulFrameWidth, unsigned long *pulFrameH
}
#endif /* VBOX_FFMPEG defined */
+#ifdef RT_OS_WINDOWS
+// Required for ATL
+static CComModule _Module;
+#endif
+
/**
* Entry point.
*/
@@ -545,6 +550,7 @@ extern "C" DECLEXPORT(int) TrustedMain(int argc, char **argv, char **envp)
const char *pszFileNameParam = "VBox-%d.vob";
#endif /* VBOX_FFMPEG */
+
/* Make sure that DISPLAY is unset, so that X11 bits do not get initialised
* on X11-using OSes. */
/** @todo this should really be taken care of in Main. */
@@ -1297,7 +1303,8 @@ extern "C" DECLEXPORT(int) TrustedMain(int argc, char **argv, char **envp)
session.setNull();
virtualBox.setNull();
pVirtualBoxClient.setNull();
-
+ machine.setNull();
+
com::Shutdown();
LogFlow(("VBoxHeadless FINISHED.\n"));
diff --git a/src/VBox/Frontends/VBoxManage/VBoxManage.cpp b/src/VBox/Frontends/VBoxManage/VBoxManage.cpp
index 62b0ef29a..0bd3b1ee4 100644
--- a/src/VBox/Frontends/VBoxManage/VBoxManage.cpp
+++ b/src/VBox/Frontends/VBoxManage/VBoxManage.cpp
@@ -151,7 +151,7 @@ HRESULT showProgress(ComPtr<IProgress> progress)
LONG lSecsRem = 0;
progress->COMGETTER(TimeRemaining)(&lSecsRem);
- RTStrmPrintf(g_pStdErr, "(%ld/%ld) %ls %ld%% => %ld%% (%d s remaining)\n", ulOperation + 1, cOperations, bstrOperationDescription.raw(), ulCurrentOperationPercent, ulCurrentPercent, lSecsRem);
+ RTStrmPrintf(g_pStdErr, "(%u/%u) %ls %02u%% => %02u%% (%d s remaining)\n", ulOperation + 1, cOperations, bstrOperationDescription.raw(), ulCurrentOperationPercent, ulCurrentPercent, lSecsRem);
ulLastPercent = ulCurrentPercent;
ulLastOperationPercent = ulCurrentOperationPercent;
}
@@ -166,7 +166,7 @@ HRESULT showProgress(ComPtr<IProgress> progress)
{
if (curVal < 100)
{
- RTStrmPrintf(g_pStdErr, "%ld%%...", curVal);
+ RTStrmPrintf(g_pStdErr, "%u%%...", curVal);
RTStrmFlush(g_pStdErr);
}
}
@@ -231,6 +231,12 @@ HRESULT showProgress(ComPtr<IProgress> progress)
#endif /* !VBOX_ONLY_DOCS */
+#ifdef RT_OS_WINDOWS
+// Required for ATL
+static CComModule _Module;
+#endif
+
+
int main(int argc, char *argv[])
{
/*
@@ -295,6 +301,13 @@ int main(int argc, char *argv[])
fShowLogo = false;
iCmd++;
}
+ else if ( !strcmp(argv[i], "--detailed-progress")
+ || !strcmp(argv[i], "-d"))
+ {
+ /* detailed progress report */
+ g_fDetailedProgress = true;
+ iCmd++;
+ }
else
{
break;
diff --git a/src/VBox/Frontends/VBoxManage/VBoxManageControlVM.cpp b/src/VBox/Frontends/VBoxManage/VBoxManageControlVM.cpp
index 5bd761769..45f0aa3c0 100644
--- a/src/VBox/Frontends/VBoxManage/VBoxManageControlVM.cpp
+++ b/src/VBox/Frontends/VBoxManage/VBoxManageControlVM.cpp
@@ -4,7 +4,7 @@
*/
/*
- * Copyright (C) 2006-2010 Oracle Corporation
+ * Copyright (C) 2006-2011 Oracle Corporation
*
* This file is part of VirtualBox Open Source Edition (OSE), as
* available from http://www.virtualbox.org. This file is free software;
@@ -35,6 +35,7 @@
#include <iprt/stream.h>
#include <iprt/string.h>
#include <iprt/uuid.h>
+#include <iprt/file.h>
#include <VBox/log.h>
#include "VBoxManage.h"
@@ -1023,6 +1024,48 @@ int handleControlVM(HandlerArg *a)
RTMsgError("Teleportation failed. No error message available!");
}
}
+ else if (!strcmp(a->argv[1], "screenshotpng"))
+ {
+ if (a->argc <= 2 || a->argc > 4)
+ {
+ errorSyntax(USAGE_CONTROLVM, "Incorrect number of parameters");
+ rc = E_FAIL;
+ break;
+ }
+ int vrc;
+ uint32_t displayIdx = 0;
+ if (a->argc == 4)
+ {
+ vrc = RTStrToUInt32Ex(a->argv[3], NULL, 0, &displayIdx);
+ if (vrc != VINF_SUCCESS)
+ {
+ errorArgument("Error parsing display number '%s'", a->argv[3]);
+ rc = E_FAIL;
+ break;
+ }
+ }
+ ComPtr<IDisplay> pDisplay;
+ CHECK_ERROR_BREAK(console, COMGETTER(Display)(pDisplay.asOutParam()));
+ ULONG width, height, bpp;
+ CHECK_ERROR_BREAK(pDisplay, GetScreenResolution(displayIdx, &width, &height, &bpp));
+ com::SafeArray<BYTE> saScreenshot;
+ CHECK_ERROR_BREAK(pDisplay, TakeScreenShotPNGToArray(displayIdx, width, height, ComSafeArrayAsOutParam(saScreenshot)));
+ RTFILE pngFile = NIL_RTFILE;
+ vrc = RTFileOpen(&pngFile, a->argv[2], RTFILE_O_OPEN_CREATE | RTFILE_O_WRITE | RTFILE_O_TRUNCATE);
+ if (RT_FAILURE(vrc))
+ {
+ RTMsgError("Failed to create file '%s'. rc=%Rrc", a->argv[2], vrc);
+ rc = E_FAIL;
+ break;
+ }
+ vrc = RTFileWrite(pngFile, saScreenshot.raw(), saScreenshot.size(), NULL);
+ if (RT_FAILURE(vrc))
+ {
+ RTMsgError("Failed to write screenshot to file '%s'. rc=%Rrc", a->argv[2], vrc);
+ rc = E_FAIL;
+ }
+ RTFileClose(pngFile);
+ }
else
{
errorSyntax(USAGE_CONTROLVM, "Invalid parameter '%s'", a->argv[1]);
diff --git a/src/VBox/Frontends/VBoxManage/VBoxManageHelp.cpp b/src/VBox/Frontends/VBoxManage/VBoxManageHelp.cpp
index a56d00e3b..cb77bbfd6 100644
--- a/src/VBox/Frontends/VBoxManage/VBoxManageHelp.cpp
+++ b/src/VBox/Frontends/VBoxManage/VBoxManageHelp.cpp
@@ -391,6 +391,7 @@ void printUsage(USAGECATEGORY u64Cmd, PRTSTREAM pStrm)
" vrdevideochannelquality <percent>\n");
RTStrmPrintf(pStrm,
" setvideomodehint <xres> <yres> <bpp> [display] |\n"
+ " screenshotpng <file> [display] |\n"
" setcredentials <username> <password> <domain>\n"
" [--allowlocallogon <yes|no>] |\n"
" teleport --host <name> --port <port>\n"
diff --git a/src/VBox/Frontends/VBoxSDL/Makefile.kmk b/src/VBox/Frontends/VBoxSDL/Makefile.kmk
index e52ce16bc..497297540 100644
--- a/src/VBox/Frontends/VBoxSDL/Makefile.kmk
+++ b/src/VBox/Frontends/VBoxSDL/Makefile.kmk
@@ -65,10 +65,6 @@ VBoxSDL_DEFS.solaris = VBOXSDL_WITH_X11
ifdef VBOX_OPENGL
#VBoxSDL_DEFS.linux += VBOX_OPENGL
endif
-ifndef VBOX_OSE
-# disable for now as this customer-specific GUI
-# VBoxSDL_DEFS.win = VBOX_WIN32_UI
-endif
VBoxSDL_DEFS.win.x86 = _WIN32_WINNT=0x0500
VBoxSDL_DEFS.win.amd64 = _WIN32_WINNT=0x0510
diff --git a/src/VBox/Frontends/VBoxSDL/VBoxSDL.cpp b/src/VBox/Frontends/VBoxSDL/VBoxSDL.cpp
index 5819a83a2..b43502578 100644
--- a/src/VBox/Frontends/VBoxSDL/VBoxSDL.cpp
+++ b/src/VBox/Frontends/VBoxSDL/VBoxSDL.cpp
@@ -688,6 +688,12 @@ void signal_handler_SIGINT(int sig)
}
#endif /* VBOXSDL_WITH_X11 */
+
+#ifdef RT_OS_WINDOWS
+// Required for ATL
+static CComModule _Module;
+#endif
+
/** entry point */
extern "C"
DECLEXPORT(int) TrustedMain(int argc, char **argv, char **envp)
diff --git a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_bg.ts b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_bg.ts
index 90fef4c0b..090ca552f 100644
--- a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_bg.ts
+++ b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_bg.ts
@@ -1462,7 +1462,7 @@ p, li { white-space: pre-wrap; &lt;/style&gt;&lt;/head&gt;&lt;body style=&quot;
</message>
<message>
<source>Extensions</source>
- <translation type="unfinished">Разширения</translation>
+ <translation>Разширения</translation>
</message>
</context>
<context>
@@ -1548,11 +1548,11 @@ p, li { white-space: pre-wrap; &lt;/style&gt;&lt;/head&gt;&lt;body style=&quot;
</message>
<message>
<source>Reset host combination</source>
- <translation type="unfinished"></translation>
+ <translation>Нулиране на основния клавиш</translation>
</message>
<message>
<source>Resets the key combination used as the host combination in the VM window.</source>
- <translation type="unfinished"></translation>
+ <translation>Връща настройката за основен клавиш във виртуалния прозорец по подразбиране.</translation>
</message>
</context>
<context>
@@ -1760,7 +1760,7 @@ p, li { white-space: pre-wrap; &lt;/style&gt;&lt;/head&gt;&lt;body style=&quot;
</message>
<message>
<source>Networking</source>
- <translation type="unfinished"></translation>
+ <translation>Мрежова свързаност</translation>
</message>
</context>
<context>
@@ -2096,7 +2096,7 @@ p, li { white-space: pre-wrap; &lt;/style&gt;&lt;/head&gt;&lt;body style=&quot;
</message>
<message>
<source>None</source>
- <translation type="unfinished"></translation>
+ <translation>Няма</translation>
</message>
</context>
<context>
@@ -3879,7 +3879,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>USB 2.0 is currently enabled for this virtual machine. However this requires the &lt;b&gt;%1&lt;/b&gt; to be installed. Please install the Extension Pack from the VirtualBox download site. After this you will be able to re-enable USB 2.0. It will be disabled in the meantime unless you cancel the current settings changes.</source>
- <translation type="unfinished"></translation>
+ <translation>USB 2.0 текущо е позволено за тази виртуална машина. Това изисква да бъде инсталиран &lt;b&gt;%1&lt;/b&gt;. Моля, инсталирайте пакета с разширения от сайта на VirtualBox. След това ще можете да позволите отново USB 2.0. Междувременно тази настройка ще бъде забранена, освен ако не откажете тази промяна в настройките.</translation>
</message>
</context>
<context>
@@ -7084,7 +7084,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>&apos;%1&apos; is an invalid host-combination code-sequence.</source>
- <translation type="unfinished"></translation>
+ <translation>&apos;%1&apos; е невалидна клавишна комбинация за основен клавиш.</translation>
</message>
</context>
<context>
@@ -8561,15 +8561,15 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>Deletion of all files belonging to the VM is currently disabled on Windows/x64 to prevent a crash. That will be fixed in the next release.</source>
- <translation type="unfinished"></translation>
+ <translation>Изтриването на всички файлове, принадлежащи към виртуалната машина, текущо е забранено за Windows/x64, за да се предотврати срив. Това ще бъде поправено в следващата версия.</translation>
</message>
<message>
<source>&lt;p&gt;Cannot create the machine folder &lt;b&gt;%1&lt;/b&gt; in the parent folder &lt;nobr&gt;&lt;b&gt;%2&lt;/b&gt;.&lt;/nobr&gt;&lt;/p&gt;&lt;p&gt;Please check that the parent really exists and that you have permissions to create the machine folder.&lt;/p&gt;</source>
- <translation type="unfinished"></translation>
+ <translation>&lt;p&gt;Не може да се създаде папката &lt;b&gt;%1&lt;/b&gt; за машината в родителската папка &lt;nobr&gt;&lt;b&gt;%2&lt;/b&gt;.&lt;/nobr&gt;&lt;/p&gt;&lt;p&gt;Моля, проверете дали родителската папка съществува и имате права за създаването на папката на машината.&lt;/p&gt;</translation>
</message>
<message>
<source>&lt;p&gt;USB 2.0 is currently enabled for this virtual machine. However this requires the &lt;b&gt;&lt;nobr&gt;%1&lt;/nobr&gt;&lt;/b&gt; to be installed.&lt;/p&gt;&lt;p&gt;Please install the Extension Pack from the VirtualBox download site. After this you will be able to re-enable USB 2.0. It will be disabled in the meantime unless you cancel the current settings changes.&lt;/p&gt;</source>
- <translation type="unfinished"></translation>
+ <translation>&lt;p&gt;USB 2.0 текущо е позволено за тази виртуална машина. Това изисква да бъде инсталиран &lt;b&gt;&lt;nobr&gt;%1&lt;/nobr&gt;&lt;/b&gt;.&lt;/p&gt;&lt;p&gt;Моля, инсталирайте пакета с разширения от сайта на VirtualBox. След това ще можете да позволите отново USB 2.0. Междувременно тази настройка ще бъде забранена, освен ако не откажете тази промяна в настройките.&lt;/p&gt;</translation>
</message>
</context>
<context>
diff --git a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_ca.ts b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_ca.ts
index aa53cc497..26dcd3c25 100644
--- a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_ca.ts
+++ b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_ca.ts
@@ -1559,7 +1559,8 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>Extensions</source>
- <translation type="unfinished">Extensions</translation>
+ <translatorcomment>Extensions</translatorcomment>
+ <translation>Extensions</translation>
</message>
</context>
<context>
@@ -1649,11 +1650,11 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>Reset host combination</source>
- <translation type="unfinished"></translation>
+ <translation>Reinicia la combinacio de l&apos;amfitrio</translation>
</message>
<message>
<source>Resets the key combination used as the host combination in the VM window.</source>
- <translation type="unfinished"></translation>
+ <translation>Reinicialitza la combinacio de tecles que es fa servir com a combinacio de l&apos;amfitrio a la finestra de la màquina virtual.</translation>
</message>
</context>
<context>
@@ -1861,7 +1862,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>Networking</source>
- <translation type="unfinished"></translation>
+ <translation>Gestio de xarxes</translation>
</message>
</context>
<context>
@@ -2197,7 +2198,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>None</source>
- <translation type="unfinished">Cap</translation>
+ <translation>Cap</translation>
</message>
</context>
<context>
@@ -4204,7 +4205,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>USB 2.0 is currently enabled for this virtual machine. However this requires the &lt;b&gt;%1&lt;/b&gt; to be installed. Please install the Extension Pack from the VirtualBox download site. After this you will be able to re-enable USB 2.0. It will be disabled in the meantime unless you cancel the current settings changes.</source>
- <translation type="unfinished"></translation>
+ <translation>L&apos;USB 2.0 es troba activat per a aquesta màquina virtual. Tot i així, això requereix la instal·lació de &lt;b&gt;%1&lt;/b&gt;. Instal·leu el paquet d&apos;extensions des del lloc web de baixades del VirtualBox. Una vegada fet això, haureu de tornar a activar l&apos;USB 2.0. Mentrestant es desactivarà a no ser que cancel·leu els canvis dels paràmetres actuals.</translation>
</message>
</context>
<context>
@@ -8278,7 +8279,7 @@ Versió %1</translation>
</message>
<message>
<source>&apos;%1&apos; is an invalid host-combination code-sequence.</source>
- <translation type="unfinished"></translation>
+ <translation>«%1» no és una combinació vàlida de codi-seqüència d&apos;amfitrió.</translation>
</message>
</context>
<context>
@@ -10505,15 +10506,15 @@ un disc dur per connectar a la ranura remarcada actualment.&lt;/a&gt;</translati
</message>
<message>
<source>Deletion of all files belonging to the VM is currently disabled on Windows/x64 to prevent a crash. That will be fixed in the next release.</source>
- <translation type="unfinished"></translation>
+ <translation>L&apos;eliminació de tots els fitxers que pertanyen a la màquina virtual es troba actualment inhabilitada en sistemes Windows/x64 per evitar fallades. Això s&apos;arreglarà en la propera versió.</translation>
</message>
<message>
<source>&lt;p&gt;Cannot create the machine folder &lt;b&gt;%1&lt;/b&gt; in the parent folder &lt;nobr&gt;&lt;b&gt;%2&lt;/b&gt;.&lt;/nobr&gt;&lt;/p&gt;&lt;p&gt;Please check that the parent really exists and that you have permissions to create the machine folder.&lt;/p&gt;</source>
- <translation type="unfinished"></translation>
+ <translation>&lt;p&gt;No es pot crear la carpeta de la màquina &lt;b&gt;%1&lt;/b&gt; a la carpeta superior &lt;nobr&gt;&lt;b&gt;%2&lt;/b&gt;.&lt;/nobr&gt;&lt;/p&gt;&lt;p&gt;Comproveu que la carpeta superior existeix i que teniu els permisos per poder crear la carpeta de la màquina.&lt;/p&gt;</translation>
</message>
<message>
<source>&lt;p&gt;USB 2.0 is currently enabled for this virtual machine. However this requires the &lt;b&gt;&lt;nobr&gt;%1&lt;/nobr&gt;&lt;/b&gt; to be installed.&lt;/p&gt;&lt;p&gt;Please install the Extension Pack from the VirtualBox download site. After this you will be able to re-enable USB 2.0. It will be disabled in the meantime unless you cancel the current settings changes.&lt;/p&gt;</source>
- <translation type="unfinished"></translation>
+ <translation>&lt;p&gt;L&apos;USB 2.0 es troba activat per a aquesta màquina virtual. Tot i així, es requereix la instal·lació de &lt;b&gt;&lt;nobr&gt;%1&lt;/nobr&gt;&lt;/b&gt;.&lt;/p&gt;&lt;p&gt;Instal·leu el paquet d&apos;extensions des del lloc web de baixades del VirtualBox. Una vegada fet això, podreu tornar a activar l&apos;USB 2.0. Mentrestant es desactivarà a no ser que cancel·leu els canvis dels paràmetres actuals.&lt;/p&gt;</translation>
</message>
</context>
<context>
diff --git a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_ca_VA.ts b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_ca_VA.ts
index ab4eda99c..2bbca0b23 100644
--- a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_ca_VA.ts
+++ b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_ca_VA.ts
@@ -933,7 +933,7 @@
<name>UIDownloaderUserManual</name>
<message>
<source>Select folder to save User Manual to</source>
- <translation>Seleccioneu la carpeta on s&apos;alçarà el manual de l&apos;usuari</translation>
+ <translation>Seleccioneu la carpeta on s'alçarà el manual de l&apos;usuari</translation>
</message>
</context>
<context>
@@ -1559,7 +1559,8 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>Extensions</source>
- <translation type="unfinished">Extensions</translation>
+ <translatorcomment>Extensions</translatorcomment>
+ <translation>Extensions</translation>
</message>
</context>
<context>
@@ -1649,11 +1650,11 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>Reset host combination</source>
- <translation type="unfinished"></translation>
+ <translation>Reinicia la combinacio de l&apos;amfitrio</translation>
</message>
<message>
<source>Resets the key combination used as the host combination in the VM window.</source>
- <translation type="unfinished"></translation>
+ <translation>Reinicialitza la combinacio de tecles que es fa servir com a combinacio de l&apos;amfitrio a la finestra de la màquina virtual.</translation>
</message>
</context>
<context>
@@ -1861,7 +1862,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>Networking</source>
- <translation type="unfinished"></translation>
+ <translation>Gestio de xarxes</translation>
</message>
</context>
<context>
@@ -2197,7 +2198,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>None</source>
- <translation type="unfinished">Cap</translation>
+ <translation>Cap</translation>
</message>
</context>
<context>
@@ -2493,7 +2494,7 @@ p, li { white-space: pre-wrap; }
<name>UIMachineSettingsAudio</name>
<message>
<source>When checked, a virtual PCI audio card will be plugged into the virtual machine and will communicate with the host audio system using the specified driver.</source>
- <translation>Quan estiga marcat, la tarjeta de so PCI virtual es connectarà a dins de la màquina virtual, la qual farà servir un controlador específic per comunicar-s&apos;amb la tarjeta de so de l&apos;amfitrió.</translation>
+ <translation>Quan estiga marcat, la tarjeta de so PCI virtual es connectarà a dins de la màquina virtual, la qual farà servir un controlador específic per comunicar-s'amb la tarjeta de so de l&apos;amfitrió.</translation>
</message>
<message>
<source>Enable &amp;Audio</source>
@@ -2505,7 +2506,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>Controls the audio output driver. The &lt;b&gt;Null Audio Driver&lt;/b&gt; makes the guest see an audio card, however every access to it will be ignored.</source>
- <translation>Gestiona el controlador d&apos;eixida de so. El &lt;b&gt;controlador d&apos;àudio Nul&lt;/b&gt; fa que el client veja una tarjeta de so, però l&apos;accés a ella s&apos;ignorarà.</translation>
+ <translation>Gestiona el controlador d'eixida de so. El &lt;b&gt;controlador d&apos;àudio Nul&lt;/b&gt; fa que el client veja una tarjeta de so, però l&apos;accés a ella s&apos;ignorarà.</translation>
</message>
<message>
<source>Audio &amp;Controller:</source>
@@ -2560,7 +2561,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>When checked, the VM will act as a Remote Desktop Protocol (RDP) server, allowing remote clients to connect and operate the VM (when it is running) using a standard RDP client.</source>
- <translation>Quan estiga marcat, la màquina virtual actuarà com un servidor RDP (protocol d&apos;escriptori remot), de forma que es permetrà a clients remots connectar-s&apos;i operar amb la màquina virtual (quan estiga en execució) fent servir un client estàndard RDP.</translation>
+ <translation>Quan estiga marcat, la màquina virtual actuarà com un servidor RDP (protocol d&apos;escriptori remot), de forma que es permetrà a clients remots connectar-s'i operar amb la màquina virtual (quan estiga en execució) fent servir un client estàndard RDP.</translation>
</message>
<message>
<source>&amp;Enable Server</source>
@@ -2651,7 +2652,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>Displays the path where snapshots of this virtual machine will be stored. Be aware that snapshots can take quite a lot of disk space.</source>
- <translation>Mostra el camí on les captures d&apos;esta màquina virtual s&apos;alçaran. Tingueu en compte que les captures poden ocupar prou quantitat d&apos;espai al disc dur.</translation>
+ <translation>Mostra el camí on les captures d&apos;esta màquina virtual s'alçaran. Tingueu en compte que les captures poden ocupar prou quantitat d&apos;espai al disc dur.</translation>
</message>
<message>
<source>&amp;Basic</source>
@@ -2815,7 +2816,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>If checked, any change to mounted CD/DVD or Floppy media performed during machine execution will be saved in the settings file in order to preserve the configuration of mounted media between runs.</source>
- <translation>Si està marcat, qualsevol canvi al CD/DVD o disquet muntat s&apos;alçarà al fitxer de configuració per tal de preservar la configuració dels suports muntats entre cada execució de la màquina virtual.</translation>
+ <translation>Si està marcat, qualsevol canvi al CD/DVD o disquet muntat s'alçarà al fitxer de configuració per tal de preservar la configuració dels suports muntats entre cada execució de la màquina virtual.</translation>
</message>
<message>
<source>&amp;Remember Mounted Media</source>
@@ -2867,7 +2868,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>If checked, show the Mini ToolBar at the top of the screen, rather than in its default position at the bottom of the screen.</source>
- <translation>Si està marcat, mostra una barra d&apos;eines petita a la part de dalt de la pantalla en lloc d&apos;a la posició per defecte a la part de sota.</translation>
+ <translation>Si està marcat, mostra una barra d&apos;eines petita a la part de dalt de la pantalla en lloc d'a la posició per defecte a la part de sota.</translation>
</message>
<message>
<source>Show At &amp;Top Of Screen</source>
@@ -3578,7 +3579,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>If checked, shows the differencing hard disks that are attached to slots rather than their base hard disks (shown for indirect attachments) and allows explicit attaching of differencing hard disks. Check this only if you need a complex hard disk setup.</source>
- <translation type="obsolete">Si està marcat, mostrarà de forma diferenciada els discos durs connectats a les ranures en lloc d&apos;als discos durs base (mostrat en cas d&apos;adjuncions indirectes), a més permetrà connectar altres discos durs explícitament. Marqueu això només si necessiteu una configuració complexa del disc dur.</translation>
+ <translation type="obsolete">Si està marcat, mostrarà de forma diferenciada els discos durs connectats a les ranures en lloc d'als discos durs base (mostrat en cas d&apos;adjuncions indirectes), a més permetrà connectar altres discos durs explícitament. Marqueu això només si necessiteu una configuració complexa del disc dur.</translation>
</message>
<message>
<source>&amp;Show Differencing Hard Disks</source>
@@ -4204,7 +4205,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>USB 2.0 is currently enabled for this virtual machine. However this requires the &lt;b&gt;%1&lt;/b&gt; to be installed. Please install the Extension Pack from the VirtualBox download site. After this you will be able to re-enable USB 2.0. It will be disabled in the meantime unless you cancel the current settings changes.</source>
- <translation type="unfinished"></translation>
+ <translation>L&apos;USB 2.0 es troba activat per a esta màquina virtual. Tot i així, això requereix la instal·lació de &lt;b&gt;%1&lt;/b&gt;. Instal·leu el paquet d&apos;extensions des del lloc web de baixades del VirtualBox. Una vegada fet això, haureu de tornar a activar l&apos;USB 2.0. Mentrestant es desactivarà a no ser que cancel·leu els canvis dels paràmetres actuals.</translation>
</message>
</context>
<context>
@@ -5231,7 +5232,7 @@ pas i connectar discos durs més avant, fent servir el diàleg de configuració
</message>
<message>
<source>&lt;p&gt;Saves the current execution state of the virtual machine to the physical hard disk of the host PC.&lt;/p&gt;&lt;p&gt;Next time this machine is started, it will be restored from the saved state and continue execution from the same place you saved it at, which will let you continue your work immediately.&lt;/p&gt;&lt;p&gt;Note that saving the machine state may take a long time, depending on the guest operating system type and the amount of memory you assigned to the virtual machine.&lt;/p&gt;</source>
- <translation>&lt;p&gt;Alça l&apos;estat d&apos;execució actual de la màquina virtual al disc dur físic de l&apos;ordinador amfitrió.&lt;/p&gt;&lt;p&gt;La propera vegada que s&apos;iniciÏ esta màquina, es restaurarà des de l&apos;estat alçat i continuarà l&apos;execució des del mateix lloc en què l&apos;heu alçat, cosa que permetrà continuar immediatament amb el vostre treball.&lt;/p&gt;&lt;p&gt;Tingueu en compte que l&apos;operació d&apos;alçar l&apos;estat de la màquina pot prendre molt de temps, depenent del tipus de sistema operatiu client i la quantitat de memòria assignada a la màquina virtual.&lt;/p&gt;</translation>
+ <translation>&lt;p&gt;Alça l&apos;estat d&apos;execució actual de la màquina virtual al disc dur físic de l&apos;ordinador amfitrió.&lt;/p&gt;&lt;p&gt;La propera vegada que s&apos;iniciÏ esta màquina, es restaurarà des de l&apos;estat alçat i continuarà l&apos;execució des del mateix lloc en què l&apos;heu alçat, cosa que permetrà continuar immediatament amb el vostre treball.&lt;/p&gt;&lt;p&gt;Tingueu en compte que l&apos;operació d'alçar l&apos;estat de la màquina pot prendre molt de temps, depenent del tipus de sistema operatiu client i la quantitat de memòria assignada a la màquina virtual.&lt;/p&gt;</translation>
</message>
<message>
<source>&amp;Save the machine state</source>
@@ -5239,7 +5240,7 @@ pas i connectar discos durs més avant, fent servir el diàleg de configuració
</message>
<message>
<source>&lt;p&gt;Sends the ACPI Power Button press event to the virtual machine.&lt;/p&gt;&lt;p&gt;Normally, the guest operating system running inside the virtual machine will detect this event and perform a clean shutdown procedure. This is a recommended way to turn off the virtual machine because all applications running inside it will get a chance to save their data and state.&lt;/p&gt;&lt;p&gt;If the machine doesn&apos;t respond to this action then the guest operating system may be misconfigured or doesn&apos;t understand ACPI Power Button events at all. In this case you should select the &lt;b&gt;Power off the machine&lt;/b&gt; action to stop virtual machine execution.&lt;/p&gt;</source>
- <translation>&lt;p&gt;Envia a la màquina virtual l&apos;esdeveniment de prémer el botó ACPI Power.&lt;/p&gt;&lt;p&gt;Normalment, el sistema operatiu client que s&apos;està executant a dins de la màquina virtual detectarà este esdeveniment i realitzarà un procediment de tancament net. Esta és una manera recomanada de tancar la màquina virtual perquè totes les aplicacions que s&apos;estan executant en ella tindran la possibilitat d&apos;alçar les seues dades i estat.&lt;/p&gt;&lt;p&gt;Si la màquina no respon a esta acció potser el sistema operatiu client pot estar mal configurat o no entén els events del botó ACPI Power. En este cas, seleccioneu l&apos;acció &lt;b&gt;Atura la màquina&lt;/b&gt; per aturar l&apos;execució de la màquina virtual.&lt;/p&gt;</translation>
+ <translation>&lt;p&gt;Envia a la màquina virtual l&apos;esdeveniment de prémer el botó ACPI Power.&lt;/p&gt;&lt;p&gt;Normalment, el sistema operatiu client que s&apos;està executant a dins de la màquina virtual detectarà este esdeveniment i realitzarà un procediment de tancament net. Esta és una manera recomanada de tancar la màquina virtual perquè totes les aplicacions que s&apos;estan executant en ella tindran la possibilitat d'alçar les seues dades i estat.&lt;/p&gt;&lt;p&gt;Si la màquina no respon a esta acció potser el sistema operatiu client pot estar mal configurat o no entén els events del botó ACPI Power. En este cas, seleccioneu l&apos;acció &lt;b&gt;Atura la màquina&lt;/b&gt; per aturar l&apos;execució de la màquina virtual.&lt;/p&gt;</translation>
</message>
<message>
<source>S&amp;end the shutdown signal</source>
@@ -5717,7 +5718,7 @@ Versió %1</translation>
&lt;p&gt;Note that saving the machine state may take a long time, depending on the guest operating system type and the amount of memory you assigned to the virtual machine.&lt;/p&gt;</source>
<translation type="obsolete">&lt;p&gt;Alça l&apos;estat d&apos;execució actual de la màquina virtual al disc dur físic de l&apos;ordinador d&apos;amfitrió.&lt;/p&gt;
&lt;p&gt;La propera vegada que s&apos;engegue esta màquina, es restaurarà des de l&apos;estat alçat i continuarà l&apos;execució des del mateix lloc en què l&apos;heu alçat, cosa que vos permetrà continuar immediatament amb el vostre treball.&lt;/p&gt;
-&lt;p&gt;Tingueu en compte que l&apos;operació d&apos;alçar l&apos;estat de la màquina pot prendre molt de temps, depenent del tipus de sistema operatiu client i la quantitat de memòria assignada a la màquina virtual.&lt;/p&gt;</translation>
+&lt;p&gt;Tingueu en compte que l&apos;operació d'alçar l&apos;estat de la màquina pot prendre molt de temps, depenent del tipus de sistema operatiu client i la quantitat de memòria assignada a la màquina virtual.&lt;/p&gt;</translation>
</message>
<message>
<source>S&amp;end the shutdown signal</source>
@@ -5728,7 +5729,7 @@ Versió %1</translation>
&lt;p&gt;Normally, the guest operating system running inside the virtual machine will detect this event and perform a clean shutdown procedure. This is a recommended way to turn off the virtual machine because all applications running inside it will get a chance to save their data and state.&lt;/p&gt;
&lt;p&gt;If the machine doesn&apos;t respond to this action then the guest operating system may be misconfigured or doesn&apos;t understand ACPI Power Button events at all. In this case you should select the &lt;b&gt;Power off the machine&lt;/b&gt; action to stop virtual machine execution.&lt;/p&gt;</source>
<translation type="obsolete">&lt;p&gt;Envia a la màquina virtual l&apos;esdeveniment de prémer el botó ACPI Power.&lt;/p&gt;
-&lt;p&gt;Normalment, el sistema operatiu client que s&apos;està executant a dins de la màquina virtual detectarà este esdeveniment i realitzarà un procediment de tancament net. Esta és una manera recomanada de tancar la màquina virtual perquè totes les aplicacions que s&apos;estan executant en ella tindran la possibilitat d&apos;alçar les seues dades i estat.&lt;/p&gt;
+&lt;p&gt;Normalment, el sistema operatiu client que s&apos;està executant a dins de la màquina virtual detectarà este esdeveniment i realitzarà un procediment de tancament net. Esta és una manera recomanada de tancar la màquina virtual perquè totes les aplicacions que s&apos;estan executant en ella tindran la possibilitat d'alçar les seues dades i estat.&lt;/p&gt;
&lt;p&gt;Si la màquina no respon a esta acció potser el sistema operatiu client pot estar mal configurat o no entén els events del botó ACPI Power. En este cas, seleccioneu l&apos;acció &lt;b&gt;Atura la màquina&lt;/b&gt; per aturar l&apos;execució de la màquina virtual.&lt;/p&gt;</translation>
</message>
<message>
@@ -5743,11 +5744,11 @@ Versió %1</translation>
</message>
<message>
<source>&lt;p&gt;Saves the current execution state of the virtual machine to the physical hard disk of the host PC.&lt;/p&gt;&lt;p&gt;Next time this machine is started, it will be restored from the saved state and continue execution from the same place you saved it at, which will let you continue your work immediately.&lt;/p&gt;&lt;p&gt;Note that saving the machine state may take a long time, depending on the guest operating system type and the amount of memory you assigned to the virtual machine.&lt;/p&gt;</source>
- <translation type="obsolete">&lt;p&gt;Alça l&apos;estat d&apos;execució actual de la màquina virtual al disc dur físic de l&apos;ordinador amfitrió.&lt;/p&gt;&lt;p&gt;La propera vegada que s&apos;iniciÏ esta màquina, es restaurarà des de l&apos;estat alçat i continuarà l&apos;execució des del mateix lloc en què l&apos;heu alçat, cosa que permetrà continuar immediatament amb el vostre treball.&lt;/p&gt;&lt;p&gt;Tingueu en compte que l&apos;operació d&apos;alçar l&apos;estat de la màquina pot prendre molt de temps, depenent del tipus de sistema operatiu client i la quantitat de memòria assignada a la màquina virtual.&lt;/p&gt;</translation>
+ <translation type="obsolete">&lt;p&gt;Alça l&apos;estat d&apos;execució actual de la màquina virtual al disc dur físic de l&apos;ordinador amfitrió.&lt;/p&gt;&lt;p&gt;La propera vegada que s&apos;iniciÏ esta màquina, es restaurarà des de l&apos;estat alçat i continuarà l&apos;execució des del mateix lloc en què l&apos;heu alçat, cosa que permetrà continuar immediatament amb el vostre treball.&lt;/p&gt;&lt;p&gt;Tingueu en compte que l&apos;operació d'alçar l&apos;estat de la màquina pot prendre molt de temps, depenent del tipus de sistema operatiu client i la quantitat de memòria assignada a la màquina virtual.&lt;/p&gt;</translation>
</message>
<message>
<source>&lt;p&gt;Sends the ACPI Power Button press event to the virtual machine.&lt;/p&gt;&lt;p&gt;Normally, the guest operating system running inside the virtual machine will detect this event and perform a clean shutdown procedure. This is a recommended way to turn off the virtual machine because all applications running inside it will get a chance to save their data and state.&lt;/p&gt;&lt;p&gt;If the machine doesn&apos;t respond to this action then the guest operating system may be misconfigured or doesn&apos;t understand ACPI Power Button events at all. In this case you should select the &lt;b&gt;Power off the machine&lt;/b&gt; action to stop virtual machine execution.&lt;/p&gt;</source>
- <translation type="obsolete">&lt;p&gt;Envia a la màquina virtual l&apos;esdeveniment de prémer el botó ACPI Power.&lt;/p&gt;&lt;p&gt;Normalment, el sistema operatiu client que s&apos;està executant a dins de la màquina virtual detectarà este esdeveniment i realitzarà un procediment de tancament net. Esta és una manera recomanada de tancar la màquina virtual perquè totes les aplicacions que s&apos;estan executant en ella tindran la possibilitat d&apos;alçar les seues dades i estat.&lt;/p&gt;&lt;p&gt;Si la màquina no respon a esta acció potser el sistema operatiu client pot estar mal configurat o no entén els events del botó ACPI Power. En este cas, seleccioneu l&apos;acció &lt;b&gt;Atura la màquina&lt;/b&gt; per aturar l&apos;execució de la màquina virtual.&lt;/p&gt;</translation>
+ <translation type="obsolete">&lt;p&gt;Envia a la màquina virtual l&apos;esdeveniment de prémer el botó ACPI Power.&lt;/p&gt;&lt;p&gt;Normalment, el sistema operatiu client que s&apos;està executant a dins de la màquina virtual detectarà este esdeveniment i realitzarà un procediment de tancament net. Esta és una manera recomanada de tancar la màquina virtual perquè totes les aplicacions que s&apos;estan executant en ella tindran la possibilitat d'alçar les seues dades i estat.&lt;/p&gt;&lt;p&gt;Si la màquina no respon a esta acció potser el sistema operatiu client pot estar mal configurat o no entén els events del botó ACPI Power. En este cas, seleccioneu l&apos;acció &lt;b&gt;Atura la màquina&lt;/b&gt; per aturar l&apos;execució de la màquina virtual.&lt;/p&gt;</translation>
</message>
<message>
<source>&lt;p&gt;Turns off the virtual machine.&lt;/p&gt;&lt;p&gt;Note that this action will stop machine execution immediately so that the guest operating system running inside it will not be able to perform a clean shutdown procedure which may result in &lt;i&gt;data loss&lt;/i&gt; inside the virtual machine. Selecting this action is recommended only if the virtual machine does not respond to the &lt;b&gt;Send the shutdown signal&lt;/b&gt; action.&lt;/p&gt;</source>
@@ -8278,7 +8279,7 @@ Versió %1</translation>
</message>
<message>
<source>&apos;%1&apos; is an invalid host-combination code-sequence.</source>
- <translation type="unfinished"></translation>
+ <translation>«%1» no és una combinació vàlida de codi-seqüència d&apos;amfitrió.</translation>
</message>
</context>
<context>
@@ -9499,7 +9500,7 @@ un disc dur per connectar a la ranura remarcada actualment.&lt;/a&gt;</translati
</message>
<message>
<source>&lt;p&gt;The Virtual Machine reports that the guest OS supports &lt;b&gt;mouse pointer integration&lt;/b&gt;. This means that you do not need to &lt;i&gt;capture&lt;/i&gt; the mouse pointer to be able to use it in your guest OS -- all mouse actions you perform when the mouse pointer is over the Virtual Machine&apos;s display are directly sent to the guest OS. If the mouse is currently captured, it will be automatically uncaptured.&lt;/p&gt;&lt;p&gt;The mouse icon on the status bar will look like&amp;nbsp;&lt;img src=mouse_seamless_16px.png/&gt;&amp;nbsp;to inform you that mouse pointer integration is supported by the guest OS and is currently turned on.&lt;/p&gt;&lt;p&gt;&lt;b&gt;Note&lt;/b&gt;: Some applications may behave incorrectly in mouse pointer integration mode. You can always disable it for the current session (and enable it again) by selecting the corresponding action from the menu bar.&lt;/p&gt;</source>
- <translation type="obsolete">&lt;p&gt;La Màquina Virtual ha informat que el sistema client suporta &lt;b&gt;integració del punter del ratolí&lt;/b&gt;. Això significa que no necessiteu &lt;i&gt;capturar&lt;/i&gt; el punter del ratolí per poder fer-lo servir al sistema client -- totes les accions que executeu quan el punter del ratolí estiga a sobre de la Màquina virtual s&apos;enviaran directament al sistema client. Si es captura el ratolí, automàticament es tornarà al mode normal.&lt;/p&gt;&lt;p&gt;La icona del ratolí a la barra d&apos;estat es mostrarà com&amp;nbsp;&lt;img src=mouse_seamless_16px.png/&gt;&amp;nbsp;per informar-vos que la integració del punter està suportada pel sistema client que està actiu.&lt;/p&gt;&lt;p&gt;&lt;b&gt;Nota&lt;/b&gt;: Algunes aplicacions poden comportar-s&apos;incorrectament treballant en el mode d&apos;integració del ratolí. Sempre podeu inhabilitar-ho a la sessió actual (o habilitar-ho) seleccionat l&apos;opció corresponent a la barra de menú.&lt;/p&gt;</translation>
+ <translation type="obsolete">&lt;p&gt;La Màquina Virtual ha informat que el sistema client suporta &lt;b&gt;integració del punter del ratolí&lt;/b&gt;. Això significa que no necessiteu &lt;i&gt;capturar&lt;/i&gt; el punter del ratolí per poder fer-lo servir al sistema client -- totes les accions que executeu quan el punter del ratolí estiga a sobre de la Màquina virtual s&apos;enviaran directament al sistema client. Si es captura el ratolí, automàticament es tornarà al mode normal.&lt;/p&gt;&lt;p&gt;La icona del ratolí a la barra d&apos;estat es mostrarà com&amp;nbsp;&lt;img src=mouse_seamless_16px.png/&gt;&amp;nbsp;per informar-vos que la integració del punter està suportada pel sistema client que està actiu.&lt;/p&gt;&lt;p&gt;&lt;b&gt;Nota&lt;/b&gt;: Algunes aplicacions poden comportar-s'incorrectament treballant en el mode d&apos;integració del ratolí. Sempre podeu inhabilitar-ho a la sessió actual (o habilitar-ho) seleccionat l&apos;opció corresponent a la barra de menú.&lt;/p&gt;</translation>
</message>
<message>
<source>&lt;p&gt;The virtual machine window is optimized to work in &lt;b&gt;%1&amp;nbsp;bit&lt;/b&gt; color mode but the virtual display is currently set to &lt;b&gt;%2&amp;nbsp;bit&lt;/b&gt;.&lt;/p&gt;&lt;p&gt;Please open the display properties dialog of the guest OS and select a &lt;b&gt;%3&amp;nbsp;bit&lt;/b&gt; color mode, if it is available, for best possible performance of the virtual video subsystem.&lt;/p&gt;&lt;p&gt;&lt;b&gt;Note&lt;/b&gt;. Some operating systems, like OS/2, may actually work in 32&amp;nbsp;bit mode but report it as 24&amp;nbsp;bit (16 million colors). You may try to select a different color mode to see if this message disappears or you can simply disable the message now if you are sure the required color mode (%4&amp;nbsp;bit) is not available in the guest OS.&lt;/p&gt;</source>
@@ -9678,7 +9679,7 @@ un disc dur per connectar a la ranura remarcada actualment.&lt;/a&gt;</translati
</message>
<message>
<source>&lt;p&gt;The following VirtualBox settings files have been automatically converted to the new settings file format version &lt;b&gt;%1&lt;/b&gt;.&lt;/p&gt;&lt;p&gt;However, the results of the conversion were not saved back to disk yet. Please press:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;Save&lt;/b&gt; to save all auto-converted files now (it will not be possible to use these settings files with an older version of VirtualBox in the future);&lt;/li&gt;&lt;li&gt;&lt;b&gt;Backup&lt;/b&gt; to create backup copies of the settings files in the old format before saving them in the new format;&lt;/li&gt;&lt;li&gt;&lt;b&gt;Cancel&lt;/b&gt; to not save the auto-converted settings files now.&lt;li&gt;&lt;/ul&gt;&lt;p&gt;Note that if you select &lt;b&gt;Cancel&lt;/b&gt;, the auto-converted settings files will be implicitly saved in the new format anyway once you change a setting or start a virtual machine, but &lt;b&gt;no&lt;/b&gt; backup copies will be created in this case.&lt;/p&gt;</source>
- <translation type="obsolete">&lt;p&gt;Els següents fitxers de paràmetres del VirtualBox s&apos;han convertit automàticament al nou format &lt;b&gt;%1&lt;/b&gt;.&lt;/p&gt;&lt;p&gt;Tot i així, els resultats de la conversió encara no s&apos;han alçat al disc. Premeu:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;Alça&lt;/b&gt; per alçar ara els fitxers auto-convertits (ja no serà possible fer servir estos paràmetres amb una versió anterior del VirtualBox);&lt;/li&gt;&lt;li&gt;&lt;b&gt;Còpia de seguretat&lt;/b&gt; per crear una còpia de seguretat dels fitxers de paràmetres en el format antic abans d&apos;alçar-los en el nou format;&lt;/li&gt;&lt;li&gt;&lt;b&gt;Cancel·la&lt;/b&gt; per no alçar ara els fitxers de paràmetres auto-convertits.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Tingueu en compte que si seleccioneu &lt;b&gt;Cancel·la&lt;/b&gt;, els fitxers de paràmetres auto-convertits s&apos;alçaran implícitament en el nou format tot i que una vegada que canvieu algun paràmetre o inicieu una màquina virtual, en canvi en este cas &lt;b&gt;no&lt;/b&gt; es faran còpies de seguretat.&lt;/p&gt;</translation>
+ <translation type="obsolete">&lt;p&gt;Els següents fitxers de paràmetres del VirtualBox s&apos;han convertit automàticament al nou format &lt;b&gt;%1&lt;/b&gt;.&lt;/p&gt;&lt;p&gt;Tot i així, els resultats de la conversió encara no s&apos;han alçat al disc. Premeu:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;Alça&lt;/b&gt; per alçar ara els fitxers auto-convertits (ja no serà possible fer servir estos paràmetres amb una versió anterior del VirtualBox);&lt;/li&gt;&lt;li&gt;&lt;b&gt;Còpia de seguretat&lt;/b&gt; per crear una còpia de seguretat dels fitxers de paràmetres en el format antic abans d'alçar-los en el nou format;&lt;/li&gt;&lt;li&gt;&lt;b&gt;Cancel·la&lt;/b&gt; per no alçar ara els fitxers de paràmetres auto-convertits.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Tingueu en compte que si seleccioneu &lt;b&gt;Cancel·la&lt;/b&gt;, els fitxers de paràmetres auto-convertits s'alçaran implícitament en el nou format tot i que una vegada que canvieu algun paràmetre o inicieu una màquina virtual, en canvi en este cas &lt;b&gt;no&lt;/b&gt; es faran còpies de seguretat.&lt;/p&gt;</translation>
</message>
<message>
<source>&amp;Save</source>
@@ -9768,7 +9769,7 @@ un disc dur per connectar a la ranura remarcada actualment.&lt;/a&gt;</translati
</message>
<message>
<source>&lt;p&gt;The Virtual Machine reports that the guest OS supports &lt;b&gt;mouse pointer integration&lt;/b&gt;. This means that you do not need to &lt;i&gt;capture&lt;/i&gt; the mouse pointer to be able to use it in your guest OS -- all mouse actions you perform when the mouse pointer is over the Virtual Machine&apos;s display are directly sent to the guest OS. If the mouse is currently captured, it will be automatically uncaptured.&lt;/p&gt;&lt;p&gt;The mouse icon on the status bar will look like&amp;nbsp;&lt;img src=:/mouse_seamless_16px.png/&gt;&amp;nbsp;to inform you that mouse pointer integration is supported by the guest OS and is currently turned on.&lt;/p&gt;&lt;p&gt;&lt;b&gt;Note&lt;/b&gt;: Some applications may behave incorrectly in mouse pointer integration mode. You can always disable it for the current session (and enable it again) by selecting the corresponding action from the menu bar.&lt;/p&gt;</source>
- <translation>&lt;p&gt;La Màquina Virtual ha informat que el sistema client suporta &lt;b&gt;integració del punter&lt;/b&gt;. Això significa que no necessiteu &lt;i&gt;capturar&lt;/i&gt; el punter per poder fer-lo servir al sistema client -- totes les accions que executeu quan el punter estiga a sobre de la Màquina virtual s&apos;enviaran directament al sistema client. Si es captura el punter, automàticament es tornarà al mode normal.&lt;/p&gt;&lt;p&gt;La icona del punter a la barra d&apos;estat es mostrarà com&amp;nbsp;&lt;img src=:/mouse_seamless_16px.png/&gt;&amp;nbsp;per informar-vos que la integració del punter està suportada pel sistema client que està actiu.&lt;/p&gt;&lt;p&gt;&lt;b&gt;Nota&lt;/b&gt;: Algunes aplicacions poden comportar-s&apos;incorrectament treballant en el mode d&apos;integració del punter. Sempre podeu inhabilitar-ho a la sessió actual (o habilitar-ho) seleccionat l&apos;opció corresponent a la barra de menú.&lt;/p&gt;</translation>
+ <translation>&lt;p&gt;La Màquina Virtual ha informat que el sistema client suporta &lt;b&gt;integració del punter&lt;/b&gt;. Això significa que no necessiteu &lt;i&gt;capturar&lt;/i&gt; el punter per poder fer-lo servir al sistema client -- totes les accions que executeu quan el punter estiga a sobre de la Màquina virtual s&apos;enviaran directament al sistema client. Si es captura el punter, automàticament es tornarà al mode normal.&lt;/p&gt;&lt;p&gt;La icona del punter a la barra d&apos;estat es mostrarà com&amp;nbsp;&lt;img src=:/mouse_seamless_16px.png/&gt;&amp;nbsp;per informar-vos que la integració del punter està suportada pel sistema client que està actiu.&lt;/p&gt;&lt;p&gt;&lt;b&gt;Nota&lt;/b&gt;: Algunes aplicacions poden comportar-s'incorrectament treballant en el mode d&apos;integració del punter. Sempre podeu inhabilitar-ho a la sessió actual (o habilitar-ho) seleccionat l&apos;opció corresponent a la barra de menú.&lt;/p&gt;</translation>
</message>
<message>
<source>&lt;p&gt;The virtual machine window will be now switched to &lt;b&gt;fullscreen&lt;/b&gt; mode. You can go back to windowed mode at any time by pressing &lt;b&gt;%1&lt;/b&gt;. Note that the &lt;i&gt;Host&lt;/i&gt; key is currently defined as &lt;b&gt;%2&lt;/b&gt;.&lt;/p&gt;&lt;p&gt;Note that the main menu bar is hidden in fullscreen mode. You can access it by pressing &lt;b&gt;Host+Home&lt;/b&gt;.&lt;/p&gt;</source>
@@ -10024,7 +10025,7 @@ un disc dur per connectar a la ranura remarcada actualment.&lt;/a&gt;</translati
</message>
<message>
<source>&lt;p&gt;The following VirtualBox settings files have been automatically converted to the new settings file format version &lt;b&gt;%1&lt;/b&gt;.&lt;/p&gt;&lt;p&gt;However, the results of the conversion were not saved back to disk yet. Please press:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;Backup&lt;/b&gt; to create backup copies of the settings files in the old format before saving them in the new format;&lt;/li&gt;&lt;li&gt;&lt;b&gt;Overwrite&lt;/b&gt; to save all auto-converted files without creating backup copies (it will not be possible to use these settings files with an older version of VirtualBox afterwards);&lt;/li&gt;%2&lt;/ul&gt;&lt;p&gt;It is recommended to always select &lt;b&gt;Backup&lt;/b&gt; because in this case it will be possible to go back to the previous version of VirtualBox (if necessary) without losing your current settings. See the VirtualBox Manual for more information about downgrading.&lt;/p&gt;</source>
- <translation type="obsolete">&lt;p&gt;Els següents fitxers de paràmetres del VirtualBox s&apos;han convertit automàticament al nou format &lt;b&gt;%1&lt;/b&gt;.&lt;/p&gt;&lt;p&gt;Tot i així, els resultats de la conversió encara no s&apos;han alçat al disc. Premeu:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;Alça&lt;/b&gt; per alçar ara els fitxers auto-convertits (ja no serà possible fer servir estos paràmetres amb una versió anterior del VirtualBox);&lt;/li&gt;&lt;li&gt;&lt;b&gt;Còpia de seguretat&lt;/b&gt; per crear una còpia de seguretat dels fitxers de paràmetres en el format antic abans d&apos;alçar-los en el nou format;&lt;/li&gt;&lt;li&gt;&lt;b&gt;Sobreescriu&lt;/b&gt; per alçar tots els fitxers auto-convertitts sense crear còpies de seguretat;&lt;/li&gt;%2&lt;/ul&gt;&lt;p&gt;Es recomana seleccionar en tot moment &lt;b&gt;Còpia de seguretat&lt;/b&gt; perquè sempre serà possible tornar a l&apos;estat anterior sense perdre els paràmetres de configuració actuals. Mireu el manual del VirtualBox per a més informació sobre desactualització.&lt;/p&gt;</translation>
+ <translation type="obsolete">&lt;p&gt;Els següents fitxers de paràmetres del VirtualBox s&apos;han convertit automàticament al nou format &lt;b&gt;%1&lt;/b&gt;.&lt;/p&gt;&lt;p&gt;Tot i així, els resultats de la conversió encara no s&apos;han alçat al disc. Premeu:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;Alça&lt;/b&gt; per alçar ara els fitxers auto-convertits (ja no serà possible fer servir estos paràmetres amb una versió anterior del VirtualBox);&lt;/li&gt;&lt;li&gt;&lt;b&gt;Còpia de seguretat&lt;/b&gt; per crear una còpia de seguretat dels fitxers de paràmetres en el format antic abans d'alçar-los en el nou format;&lt;/li&gt;&lt;li&gt;&lt;b&gt;Sobreescriu&lt;/b&gt; per alçar tots els fitxers auto-convertitts sense crear còpies de seguretat;&lt;/li&gt;%2&lt;/ul&gt;&lt;p&gt;Es recomana seleccionar en tot moment &lt;b&gt;Còpia de seguretat&lt;/b&gt; perquè sempre serà possible tornar a l&apos;estat anterior sense perdre els paràmetres de configuració actuals. Mireu el manual del VirtualBox per a més informació sobre desactualització.&lt;/p&gt;</translation>
</message>
<message>
<source>&lt;li&gt;&lt;b&gt;Exit&lt;/b&gt; to terminate VirtualBox without saving the results of the conversion to disk.&lt;/li&gt;</source>
@@ -10505,15 +10506,15 @@ un disc dur per connectar a la ranura remarcada actualment.&lt;/a&gt;</translati
</message>
<message>
<source>Deletion of all files belonging to the VM is currently disabled on Windows/x64 to prevent a crash. That will be fixed in the next release.</source>
- <translation type="unfinished"></translation>
+ <translation>L&apos;eliminació de tots els fitxers que pertanyen a la màquina virtual es troba actualment inhabilitada en sistemes Windows/x64 per evitar fallades. Això s&apos;arreglarà en la propera versió.</translation>
</message>
<message>
<source>&lt;p&gt;Cannot create the machine folder &lt;b&gt;%1&lt;/b&gt; in the parent folder &lt;nobr&gt;&lt;b&gt;%2&lt;/b&gt;.&lt;/nobr&gt;&lt;/p&gt;&lt;p&gt;Please check that the parent really exists and that you have permissions to create the machine folder.&lt;/p&gt;</source>
- <translation type="unfinished"></translation>
+ <translation>&lt;p&gt;No es pot crear la carpeta de la màquina &lt;b&gt;%1&lt;/b&gt; a la carpeta superior &lt;nobr&gt;&lt;b&gt;%2&lt;/b&gt;.&lt;/nobr&gt;&lt;/p&gt;&lt;p&gt;Comproveu que la carpeta superior existeix i que teniu els permisos per poder crear la carpeta de la màquina.&lt;/p&gt;</translation>
</message>
<message>
<source>&lt;p&gt;USB 2.0 is currently enabled for this virtual machine. However this requires the &lt;b&gt;&lt;nobr&gt;%1&lt;/nobr&gt;&lt;/b&gt; to be installed.&lt;/p&gt;&lt;p&gt;Please install the Extension Pack from the VirtualBox download site. After this you will be able to re-enable USB 2.0. It will be disabled in the meantime unless you cancel the current settings changes.&lt;/p&gt;</source>
- <translation type="unfinished"></translation>
+ <translation>&lt;p&gt;L&apos;USB 2.0 es troba activat per a esta màquina virtual. Tot i així, es requereix la instal·lació de &lt;b&gt;&lt;nobr&gt;%1&lt;/nobr&gt;&lt;/b&gt;.&lt;/p&gt;&lt;p&gt;Instal·leu el paquet d&apos;extensions des del lloc web de baixades del VirtualBox. Una vegada fet això, podreu tornar a activar l&apos;USB 2.0. Mentrestant es desactivarà a no ser que cancel·leu els canvis dels paràmetres actuals.&lt;/p&gt;</translation>
</message>
</context>
<context>
@@ -10592,7 +10593,7 @@ un disc dur per connectar a la ranura remarcada actualment.&lt;/a&gt;</translati
</message>
<message>
<source>&lt;p&gt;Please fill out this registration form to let vos know that you use VirtualBox and, optionally, to keep you informed about VirtualBox news and updates.&lt;/p&gt;&lt;p&gt;Please use Latin characters only to fill in the fields below. Sun Microsystems will use this information only to gather product usage statistics and to send you VirtualBox newsletters. In particular, Sun Microsystems will never pass your data to third parties. Detailed information about how we use your personal data can be found in the &lt;b&gt;Privacy Policy&lt;/b&gt; section of the VirtualBox Manual or on the &lt;a href=http://www.virtualbox.org/wiki/PrivacyPolicy&gt;Privacy Policy&lt;/a&gt; page of the VirtualBox web-site.&lt;/p&gt;</source>
- <translation type="obsolete">&lt;p&gt;Ompliu este formulari de registre per permetre&apos;ns conèixer que feu servir el VirtualBox i, opcionalment, mantindre-vos informat sobre novetats i actualitzacions del VirtualBox.&lt;/p&gt;&lt;p&gt;Feu servir caràcters llatins per omplir els camps següents. Tingueu en compte que Sun Microsystems farà servir esta informació només per a usos estadístics i per enviar-vos notícies sobre el VirtualBox. Sun Microsystems mai compartirà les vostres dades amb terceres parts. Més informació detallada sobre l&apos;ús de les vostres dades personals poden trobar-s&apos;a la secció de &lt;b&gt;Política de privacitat&lt;/b&gt; al manual de VirtualBox o al&lt;a href=http://www.virtualbox.org/wiki/PrivacyPolicy&gt;Privacy Policy&lt;/a&gt; lloc web del VirtualBox.&lt;/p&gt;</translation>
+ <translation type="obsolete">&lt;p&gt;Ompliu este formulari de registre per permetre&apos;ns conèixer que feu servir el VirtualBox i, opcionalment, mantindre-vos informat sobre novetats i actualitzacions del VirtualBox.&lt;/p&gt;&lt;p&gt;Feu servir caràcters llatins per omplir els camps següents. Tingueu en compte que Sun Microsystems farà servir esta informació només per a usos estadístics i per enviar-vos notícies sobre el VirtualBox. Sun Microsystems mai compartirà les vostres dades amb terceres parts. Més informació detallada sobre l&apos;ús de les vostres dades personals poden trobar-s'a la secció de &lt;b&gt;Política de privacitat&lt;/b&gt; al manual de VirtualBox o al&lt;a href=http://www.virtualbox.org/wiki/PrivacyPolicy&gt;Privacy Policy&lt;/a&gt; lloc web del VirtualBox.&lt;/p&gt;</translation>
</message>
<message>
<source>I &amp;already have a Sun Online account:</source>
@@ -11073,7 +11074,7 @@ un disc dur per connectar a la ranura remarcada actualment.&lt;/a&gt;</translati
<name>VBoxSettingsDialog</name>
<message>
<source>&lt;i&gt;Select a settings category from the list on the left-hand side and move the mouse over a settings item to get more information&lt;/i&gt;.</source>
- <translation type="obsolete">&lt;i&gt;Seleccioneu una categoria de paràmetres en la llista de l&apos;esquerra i deplaceu el punter sobre un element de la dreta per obtindre&apos;n més informació&lt;/i&gt;.</translation>
+ <translation type="obsolete">&lt;i&gt;Seleccioneu una categoria de paràmetres en la llista de l&apos;esquerra i deplaceu el punter sobre un element de la dreta per obtindre'n més informació&lt;/i&gt;.</translation>
</message>
<message>
<source>On the &lt;b&gt;%1&lt;/b&gt; page, %2</source>
@@ -12612,7 +12613,7 @@ o a ambdòs (&lt;i&gt;Qualsevol&lt;/i&gt;).&lt;/qt&gt;</translation>
</message>
<message>
<source>Displays the path where snapshots of this virtual machine will be stored. Be aware that snapshots can take quite a lot of disk space.</source>
- <translation type="obsolete">Mostra la ruta on les captures d&apos;esta màquina virtual s&apos;alçaran. Tingueu en compte que les captures poden ocupar prou quantitat d&apos;espai al disc dur.</translation>
+ <translation type="obsolete">Mostra la ruta on les captures d&apos;esta màquina virtual s'alçaran. Tingueu en compte que les captures poden ocupar prou quantitat d&apos;espai al disc dur.</translation>
</message>
<message>
<source>Displays the virtual hard disk to attach to this IDE slot and allows to quickly select a different hard disk.</source>
@@ -12708,7 +12709,7 @@ o a ambdòs (&lt;i&gt;Qualsevol&lt;/i&gt;).&lt;/qt&gt;</translation>
</message>
<message>
<source>If checked, any change to mounted CD/DVD or Floppy media performed during machine execution will be saved in the settings file in order to preserve the configuration of mounted media between runs.</source>
- <translation type="obsolete">Si està marcat, qualsevol canvi al CD/DVD o disquet muntat s&apos;alçarà al fitxer de configuració per tal de preservar la configuració dels suports muntats entre cada execució de la màquina virtual.</translation>
+ <translation type="obsolete">Si està marcat, qualsevol canvi al CD/DVD o disquet muntat s'alçarà al fitxer de configuració per tal de preservar la configuració dels suports muntats entre cada execució de la màquina virtual.</translation>
</message>
<message>
<source>&amp;Image File</source>
@@ -12892,7 +12893,7 @@ o a ambdòs (&lt;i&gt;Qualsevol&lt;/i&gt;).&lt;/qt&gt;</translation>
<message>
<source>&lt;qt&gt;Controls the audio output driver. The &lt;b&gt;Null Audio Driver&lt;/b&gt;
makes the guest see an audio card, however every access to it will be ignored.&lt;/qt&gt;</source>
- <translation type="obsolete">&lt;qt&gt;Gestiona el controlador d&apos;eixida de so. El &lt;b&gt;controlador d&apos;àudio Nul&lt;/b&gt;
+ <translation type="obsolete">&lt;qt&gt;Gestiona el controlador d'eixida de so. El &lt;b&gt;controlador d&apos;àudio Nul&lt;/b&gt;
fa que el client veja una tarjeta de so, però l&apos;accés a ella s&apos;ignorarà.&lt;/qt&gt;</translation>
</message>
<message>
@@ -13051,7 +13052,7 @@ esta característica després d&apos;haver instal·lat un Windows al sistema ope
</message>
<message>
<source>When checked, a virtual PCI audio card will be plugged into the virtual machine and will communicate with the host audio system using the specified driver.</source>
- <translation type="obsolete">Quan estiga marcat, la tarjeta de so PCI virtual es connectarà a dins de la màquina virtual, la qual farà servir un controlador específic per comunicar-s&apos;amb la tarjeta de so de l&apos;amfitrió.</translation>
+ <translation type="obsolete">Quan estiga marcat, la tarjeta de so PCI virtual es connectarà a dins de la màquina virtual, la qual farà servir un controlador específic per comunicar-s'amb la tarjeta de so de l&apos;amfitrió.</translation>
</message>
<message>
<source>When checked, the VM will act as a Remote Desktop Protocol (RDP) server, allowing remote clients to connect and operate the VM (when it is running) using a standard RDP client.</source>
@@ -13407,7 +13408,7 @@ al sistema amfitrió.&lt;/qt&gt;</translation>
<name>VBoxVMSettingsVRDP</name>
<message>
<source>When checked, the VM will act as a Remote Desktop Protocol (RDP) server, allowing remote clients to connect and operate the VM (when it is running) using a standard RDP client.</source>
- <translation type="obsolete">Quan estiga marcat, la màquina virtual actuarà com un servidor protocol d&apos;escriptori remot (RDP), permetent als clients remots connectar-s&apos;a la màquina virtual (quan estiga executant-se) fent servir l&apos;estàndard client RDP.</translation>
+ <translation type="obsolete">Quan estiga marcat, la màquina virtual actuarà com un servidor protocol d&apos;escriptori remot (RDP), permetent als clients remots connectar-s'a la màquina virtual (quan estiga executant-se) fent servir l&apos;estàndard client RDP.</translation>
</message>
<message>
<source>&amp;Enable VRDP Server</source>
diff --git a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_de.ts b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_de.ts
index 113337b31..84b806439 100644
--- a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_de.ts
+++ b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_de.ts
@@ -953,13 +953,13 @@
<translation>Netzwerk</translation>
</message>
<message>
- <source>VirtualBox - %1</source>
- <translation></translation>
- </message>
- <message>
<source>Extensions</source>
<translation>Zusatzpakete</translation>
</message>
+ <message>
+ <source>VirtualBox - %1</source>
+ <translation></translation>
+ </message>
</context>
<context>
<name>UIGlobalSettingsExtension</name>
@@ -4772,7 +4772,7 @@
<message>
<source>Null</source>
<comment>AuthType</comment>
- <translation type="unfinished"></translation>
+ <translation></translation>
</message>
<message>
<source>External</source>
@@ -5643,7 +5643,7 @@
</message>
<message>
<source>Could not access USB on the host system, because neither the USB file system (usbfs) nor the DBus and hal services are currently available. If you wish to use host USB devices inside guest systems, you must correct this and restart VirtualBox.</source>
- <translation>Der Zugriff auf USB-Geräte des Hosts ist nicht möglich, weil weder das USB-Dateisystem (usbfs) mit den entsprechenden Rechten gemountet ist, noch der DBus / Hal-Service verfügbar ist. Falls Sie USB-Geräte des Hosts innerhalb von Gästen nutzen wollen, müssen Sie dieses Problem beheben und VirtualBox neu starten.</translation>
+ <translation type="obsolete">Der Zugriff auf USB-Geräte des Hosts ist nicht möglich, weil weder das USB-Dateisystem (usbfs) mit den entsprechenden Rechten gemountet ist, noch der DBus / Hal-Service verfügbar ist. Falls Sie USB-Geräte des Hosts innerhalb von Gästen nutzen wollen, müssen Sie dieses Problem beheben und VirtualBox neu starten.</translation>
</message>
<message>
<source>You are trying to shut down the guest with the ACPI power button. This is currently not possible because the guest does not support software shutdown.</source>
@@ -6072,6 +6072,26 @@
<source>&lt;p&gt;Cannot create the machine folder &lt;b&gt;%1&lt;/b&gt; in the parent folder &lt;nobr&gt;&lt;b&gt;%2&lt;/b&gt;.&lt;/nobr&gt;&lt;/p&gt;&lt;p&gt;Please check that the parent really exists and that you have permissions to create the machine folder.&lt;/p&gt;</source>
<translation>&lt;p&gt;Das Verzeichnis für die virtuellen Maschinen &lt;b&gt;%1&lt;/b&gt; kann im Verzeichnis &lt;nobr&gt;&lt;b&gt;%2&lt;/nobr&gt; nicht erzeugt werden. &lt;/p&gt;&lt;p&gt;Bitte stellen Sie sicher, dass das übergeordnete Verzeichnis vorhanden und schreibbar ist.&lt;/p&gt;</translation>
</message>
+ <message>
+ <source>Could not load the Host USB Proxy Service (VERR_FILE_NOT_FOUND). The service might not be installed on the host computer</source>
+ <translation>Der USB-Proxy-Dienst konnte nicht gestarted werden. Dieser Dienst ist möglicherweise nicht auf diesem Computer installiert</translation>
+ </message>
+ <message>
+ <source>VirtualBox is not currently allowed to access USB devices. You can change this by adding your user to the &apos;vboxusers&apos; group. Please see the user manual for a more detailed explanation</source>
+ <translation>VirtualBox kann nicht auf USB-Geräte zugreifen. Dieses Problem kann dadurch gelöst werden, indem der aktuelle Nutzer Mitglied der Gruppe &apos;vboxusers&apos; wird. In der Dokumentation finden Sie eine genauere Erklärung</translation>
+ </message>
+ <message>
+ <source>VirtualBox is not currently allowed to access USB devices. You can change this by allowing your user to access the &apos;usbfs&apos; folder and files. Please see the user manual for a more detailed explanation</source>
+ <translation>VirtualBox kann nicht auf USB-Geräte zugreifen. Dieses Problem wird gelöst, wenn der aktuelle Nutzer auf die Dateien und Order des USB-Dateisystems (usbfs) zugreifen kann. In der Dokumentation finden Sie eine genauere Erklärung</translation>
+ </message>
+ <message>
+ <source>The USB Proxy Service has not yet been ported to this host</source>
+ <translation>Der USB-Proxy-Dienst wurde nicht auf diesen Host portiert</translation>
+ </message>
+ <message>
+ <source>Could not load the Host USB Proxy service</source>
+ <translation>Der USB-Proxy-Dienst konnte nicht gestartet werden</translation>
+ </message>
</context>
<context>
<name>VBoxSFDialog</name>
@@ -6175,10 +6195,6 @@
<translation>Zeigt die Log-Dateien der ausgewählten virtuellen Maschine</translation>
</message>
<message>
- <source>R&amp;esume</source>
- <translation type="obsolete">&amp;Fortfahren</translation>
- </message>
- <message>
<source>Resume the execution of the virtual machine</source>
<translation>Fährt mit der Ausführung der virtuellen Maschine fort</translation>
</message>
diff --git a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_fr.ts b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_fr.ts
index 4f4c648f6..76243dee8 100644
--- a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_fr.ts
+++ b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_fr.ts
@@ -3592,7 +3592,7 @@ And the size is not necessarily &quot;in megabytes&quot;, the slider chooses the
</message>
<message>
<source>&lt;p&gt;Select a virtual hard disk to be used as the boot hard disk of the virtual machine. You can either create a new hard disk or select an existing one from the drop-down list or by pressing corresponding button (to invoke file-open window).&lt;/p&gt;&lt;p&gt;If you need a more complicated hard disk setup, you can also skip this step and attach hard disks later using the VM Settings dialog.&lt;/p&gt;</source>
- <translation>&lt;p&gt;Choisissez un disque dur virtuel à utiliser pour l&apos;amorçage de la machine virtuelle. Void pouvez soit créer un nouveau disque, soit choisir un disque existant dans la liste ou en cliquant sur le bouton corréspontand.&lt;/p&gt;&lt;p&gt;Si vous avez besoin d&apos;une configuration de disques plus complexe, vous pouvez sauter cette étape et allouer des disques plus tard dans la Configuration de la machine.&lt;/p&gt;</translation>
+ <translation>&lt;p&gt;Choisissez un disque dur virtuel à utiliser pour l&apos;amorçage de la machine virtuelle. Vous pouvez soit créer un nouveau disque, soit choisir un disque existant dans la liste ou en cliquant sur le bouton correspondant.&lt;/p&gt;&lt;p&gt;Si vous avez besoin d&apos;une configuration de disques plus complexe, vous pouvez sauter cette étape et allouer des disques plus tard dans la Configuration de la machine.&lt;/p&gt;</translation>
</message>
<message>
<source>Choose a virtual hard disk file...</source>
@@ -6821,6 +6821,26 @@ And the size is not necessarily &quot;in megabytes&quot;, the slider chooses the
<source>&lt;p&gt;USB 2.0 is currently enabled for this virtual machine. However this requires the &lt;b&gt;&lt;nobr&gt;%1&lt;/nobr&gt;&lt;/b&gt; to be installed.&lt;/p&gt;&lt;p&gt;Please install the Extension Pack from the VirtualBox download site. After this you will be able to re-enable USB 2.0. It will be disabled in the meantime unless you cancel the current settings changes.&lt;/p&gt;</source>
<translation>&lt;p&gt;USB 2.0 est active pour cette machine virtuelle, mais ceci nécessite que l&apos;extension &lt;b&gt;&lt;nobr&gt;%1&lt;/nobr&gt;&lt;/b&gt; soit installée.&lt;/p&gt;&lt;p&gt;Veuillez installer l&apos;extension à partir du site de téléchargement VirtualBox. Vous pourrez alors réactiver USB 2.0. En attendant, la fonctionnalité sera désactivée si vous n&apos;annulez pas les changements actuels.&lt;/p&gt;</translation>
</message>
+ <message>
+ <source>Could not load the Host USB Proxy Service (VERR_FILE_NOT_FOUND). The service might not be installed on the host computer</source>
+ <translation>Le service de relais de périphériques USB n&apos;a pas pû être activé (erreur VERR_FILE_NOT_FOUND). Il se peut que le service ne soit pas installé sur l&apos;ordinateur hôte</translation>
+ </message>
+ <message>
+ <source>VirtualBox is not currently allowed to access USB devices. You can change this by adding your user to the &apos;vboxusers&apos; group. Please see the user manual for a more detailed explanation</source>
+ <translation>VirtualBox n&apos;est pas autorisé à accéder aux périphériques USB actuellement. Vous pouvez changer ceci en ajoutant votre nom d&apos;utilisateur au groupe «vboxusers». Veuillez consulter le guide de l&apos;utilisateur pour des explications plus détaillées</translation>
+ </message>
+ <message>
+ <source>VirtualBox is not currently allowed to access USB devices. You can change this by allowing your user to access the &apos;usbfs&apos; folder and files. Please see the user manual for a more detailed explanation</source>
+ <translation>VirtualBox n&apos;est pas autorisé à accéder aux périphériques USB actuellement. Vous pouvez changer ceci en donnant accès pour votre nom d&apos;utilisateur aux fichiers et dossiers «usbfs». Veuillez consulter le guide de l&apos;utilisateur pour des explications plus détaillées</translation>
+ </message>
+ <message>
+ <source>The USB Proxy Service has not yet been ported to this host</source>
+ <translation>Le service de relais de périphériques USB n&apos;a pas encore été porté sur ce système d&apos;exploitation</translation>
+ </message>
+ <message>
+ <source>Could not load the Host USB Proxy service</source>
+ <translation>Le service de relais de périphériques USB n&apos;a pas pû être activé</translation>
+ </message>
</context>
<context>
<name>VBoxSFDialog</name>
diff --git a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_hu.ts b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_hu.ts
index 9b5378ced..b3f5f9676 100644
--- a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_hu.ts
+++ b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_hu.ts
@@ -1571,7 +1571,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>Extensions</source>
- <translation type="unfinished">Kiterjesztők</translation>
+ <translation>Kiterjesztők</translation>
</message>
</context>
<context>
@@ -1665,11 +1665,11 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>Reset host combination</source>
- <translation type="unfinished"></translation>
+ <translation>Gazda-kombináció visszaállítása</translation>
</message>
<message>
<source>Resets the key combination used as the host combination in the VM window.</source>
- <translation type="unfinished"></translation>
+ <translation>A virtuális gép ablakában gazda-kombinációként használt billentyűkombináció vsszaállítása.</translation>
</message>
</context>
<context>
@@ -1877,7 +1877,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>Networking</source>
- <translation type="unfinished"></translation>
+ <translation>Hálózat</translation>
</message>
</context>
<context>
@@ -2197,7 +2197,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>None</source>
- <translation type="unfinished"></translation>
+ <translation>Nincs</translation>
</message>
</context>
<context>
@@ -4079,7 +4079,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>USB 2.0 is currently enabled for this virtual machine. However this requires the &lt;b&gt;%1&lt;/b&gt; to be installed. Please install the Extension Pack from the VirtualBox download site. After this you will be able to re-enable USB 2.0. It will be disabled in the meantime unless you cancel the current settings changes.</source>
- <translation type="unfinished"></translation>
+ <translation>Az USB 2.0 jelenleg be van kapcsolva a virtuális gépen. Azonban ehhez a következőnek telepítve kell lennie: &lt;b&gt;&lt;nobr&gt;%1&lt;/nobr&gt;&lt;/b&gt;.&lt;/p&gt;&lt;p&gt;A VirtualBox oldaláról letöltve telepítsd fel a Kiterjesztő csomagot. Ezután újra be engedélyezni tudod az USB 2.0-t. Addig ki lesz kapcsolva, hacsak meg nem szakítod a beállítások módosítását.</translation>
</message>
</context>
<context>
@@ -5020,7 +5020,7 @@ esetleg a &lt;b&gt;Létező&lt;/b&gt; gombbal a Virtuális lemezkezelőből.&lt;
</message>
<message>
<source>On the &lt;b&gt;%1&lt;/b&gt; page, %2</source>
- <translation>A(z) &lt;b&gt;%1&lt;/b&gt;. oldalon, %2</translation>
+ <translation>A(z) &lt;b&gt;%1&lt;/b&gt; oldalon, %2</translation>
</message>
<message>
<source>Invalid settings detected</source>
@@ -7865,37 +7865,37 @@ Verzió %1</translation>
<message numerus="yes">
<source>%n year(s)</source>
<translation>
- <numerusform>%n éve</numerusform>
+ <numerusform>%n év</numerusform>
</translation>
</message>
<message numerus="yes">
<source>%n month(s)</source>
<translation>
- <numerusform>%n hónapja</numerusform>
+ <numerusform>%n hónap</numerusform>
</translation>
</message>
<message numerus="yes">
<source>%n day(s)</source>
<translation>
- <numerusform>%n napja</numerusform>
+ <numerusform>%n nap</numerusform>
</translation>
</message>
<message numerus="yes">
<source>%n hour(s)</source>
<translation>
- <numerusform>%n órája</numerusform>
+ <numerusform>%n óra</numerusform>
</translation>
</message>
<message numerus="yes">
<source>%n minute(s)</source>
<translation>
- <numerusform>%n perce</numerusform>
+ <numerusform>%n perc</numerusform>
</translation>
</message>
<message numerus="yes">
<source>%n second(s)</source>
<translation>
- <numerusform>%n másodperce</numerusform>
+ <numerusform>%n másodperc</numerusform>
</translation>
</message>
<message>
@@ -8110,12 +8110,12 @@ Verzió %1</translation>
<message>
<source>Readonly</source>
<comment>DiskType</comment>
- <translation type="unfinished"></translation>
+ <translation>Írásvédett</translation>
</message>
<message>
<source>Multi-attach</source>
<comment>DiskType</comment>
- <translation type="unfinished"></translation>
+ <translation>Többszörös csatolás</translation>
</message>
</context>
<context>
@@ -8134,7 +8134,7 @@ Verzió %1</translation>
</message>
<message>
<source>&apos;%1&apos; is an invalid host-combination code-sequence.</source>
- <translation type="unfinished"></translation>
+ <translation>&apos;%1&apos; egy érvénytelen gazda-kombinációs kódsor.</translation>
</message>
</context>
<context>
@@ -9302,11 +9302,11 @@ to the system default language.&lt;/qt&gt;
</message>
<message>
<source>&lt;p&gt;The virtual machine window will be now switched to &lt;b&gt;fullscreen&lt;/b&gt; mode. You can go back to windowed mode at any time by pressing &lt;b&gt;%1&lt;/b&gt;. Note that the &lt;i&gt;Host&lt;/i&gt; key is currently defined as &lt;b&gt;%2&lt;/b&gt;.&lt;/p&gt;&lt;p&gt;Note that the main menu bar is hidden in fullscreen mode. You can access it by pressing &lt;b&gt;Host+Home&lt;/b&gt;.&lt;/p&gt;</source>
- <translation type="obsolete">&lt;p&gt;A virtuális gép ablaka most &lt;b&gt;teljesképernyős&lt;/b&gt; módra vált. Bármikor visszaléphetsz ablakos módba a(z) &lt;b&gt;%1&lt;/b&gt; gomb megnyomásával. Ne feledd, hogy a &lt;i&gt;gazda&lt;/i&gt; gomb jelenleg ez: &lt;b&gt;%2&lt;/b&gt;.&lt;/p&gt;&lt;p&gt;Ne feledd, hogy a főmenü eltűnik teljesképernyős módnál. A &lt;b&gt;gazda+Home&lt;/b&gt; gombok megnyomásával férhetsz hozzá.&lt;/p&gt;</translation>
+ <translation type="obsolete">&lt;p&gt;A virtuális gép ablaka most &lt;b&gt;teljesképernyős&lt;/b&gt; módra vált. Bármikor visszaléphetsz ablakos módba a(z) &lt;b&gt;%1&lt;/b&gt; gomb megnyomásával. Ne feledd, hogy a &lt;i&gt;gazda&lt;/i&gt; gomb jelenleg ez: &lt;b&gt;%2&lt;/b&gt;.&lt;/p&gt;&lt;p&gt;Ne feledd, hogy a főmenü eltűnik teljesképernyős módnál. A &lt;b&gt;gazda+Home&lt;/b&gt; gombok megnyomásával érheted el.&lt;/p&gt;</translation>
</message>
<message>
<source>&lt;p&gt;The virtual machine window will be now switched to &lt;b&gt;Seamless&lt;/b&gt; mode. You can go back to windowed mode at any time by pressing &lt;b&gt;%1&lt;/b&gt;. Note that the &lt;i&gt;Host&lt;/i&gt; key is currently defined as &lt;b&gt;%2&lt;/b&gt;.&lt;/p&gt;&lt;p&gt;Note that the main menu bar is hidden in seamless mode. You can access it by pressing &lt;b&gt;Host+Home&lt;/b&gt;.&lt;/p&gt;</source>
- <translation type="obsolete">&lt;p&gt;A virtuális gép ablaka most &lt;b&gt;asztal-integrációs&lt;/b&gt; módra vált. Bármikor visszaléphetsz ablakos módba a(z) &lt;b&gt;%1&lt;/b&gt; gomb megnyomásával. Ne feledd, hogy a &lt;i&gt;gazda&lt;/i&gt; gomb jelenleg ez: &lt;b&gt;%2&lt;/b&gt;.&lt;/p&gt;&lt;p&gt;Ne feledd, hogy a főmenü eltűnik asztal-integrációs módnál. A &lt;b&gt;gazda+Home&lt;/b&gt; gombok megnyomásával férhetsz hozzá.&lt;/p&gt;</translation>
+ <translation type="obsolete">&lt;p&gt;A virtuális gép ablaka most &lt;b&gt;asztal-integrációs&lt;/b&gt; módra vált. Bármikor visszaléphetsz ablakos módba a(z) &lt;b&gt;%1&lt;/b&gt; gomb megnyomásával. Ne feledd, hogy a &lt;i&gt;gazda&lt;/i&gt; gomb jelenleg ez: &lt;b&gt;%2&lt;/b&gt;.&lt;/p&gt;&lt;p&gt;Ne feledd, hogy a főmenü eltűnik asztal-integrációs módnál. A &lt;b&gt;gazda+Home&lt;/b&gt; gombok megnyomásával érheted el.&lt;/p&gt;</translation>
</message>
<message>
<source>&amp;Contents...</source>
@@ -9905,7 +9905,7 @@ to the system default language.&lt;/qt&gt;
</message>
<message>
<source>&lt;p&gt;The VirtualBox Guest Additions do not appear to be available on this virtual machine, and shared folders cannot be used without them. To use shared folders inside the virtual machine, please install the Guest Additions if they are not installed, or re-install them if they are not working correctly, by selecting &lt;b&gt;Install Guest Additions&lt;/b&gt; from the &lt;b&gt;Machine&lt;/b&gt; menu. If they are installed but the machine is not yet fully started then shared folders will be available once it is.&lt;/p&gt;</source>
- <translation type="obsolete">&lt;p&gt;Úgy tűnik a VirtualBox Integrációs szolgáltatások nem érhetők el a virtuális gépen, és nélküle a megosztott mappák nem használhatók. A virtuális gépen belüli megosztott mappák használatához telepítsd fel az Integrációs szolgáltatásokat, ha nincsenek telepítve, vagy ha csak nem működnek helyesen, az &lt;b&gt;Ezsközök&lt;/b&gt; menüben az &lt;b&gt;Integrciós szolgáltatások telepítése...&lt;/b&gt; választásával. Ha telepítve vannak, de a gép nem teljesen indult még el, a megosztott mappák elérhetők lesznek.&lt;/p&gt;</translation>
+ <translation type="obsolete">&lt;p&gt;Úgy tűnik a VirtualBox Integrációs szolgáltatások nem érhetők el a virtuális gépen, és nélküle a megosztott mappák nem használhatók. A virtuális gépen belüli megosztott mappák használatához telepítsd fel az Integrációs szolgáltatásokat, ha nincsenek telepítve, vagy ha csak nem működnek helyesen, az &lt;b&gt;Eszközök&lt;/b&gt; menüben az &lt;b&gt;Integrációs szolgáltatások telepítése...&lt;/b&gt; választásával. Ha telepítve vannak, de a gép nem teljesen indult még el, a megosztott mappák elérhetők lesznek.&lt;/p&gt;</translation>
</message>
<message numerus="yes">
<source>&lt;p&gt;The virtual machine(s) &lt;b&gt;%1&lt;/b&gt; are currently in a saved state.&lt;/p&gt;&lt;p&gt;If you continue the runtime state of the exported machine(s) will be discarded. Note that the existing machine(s) are not changed.&lt;/p&gt;</source>
@@ -9959,88 +9959,88 @@ to the system default language.&lt;/qt&gt;
</message>
<message>
<source>&lt;p&gt;Note that the storage unit of this medium will not be deleted and that it will be possible to use it later again.&lt;/p&gt;</source>
- <translation type="unfinished"></translation>
+ <translation>&lt;p&gt;Ne feledd, hogy ezen médium tárolóegysége nem lesz törölve és így később is hozzá lehet adni a listához.&lt;/p&gt;</translation>
</message>
<message>
<source>&lt;p&gt;The VirtualBox Guest Additions do not appear to be available on this virtual machine, and shared folders cannot be used without them. To use shared folders inside the virtual machine, please install the Guest Additions if they are not installed, or re-install them if they are not working correctly, by selecting &lt;b&gt;Install Guest Additions&lt;/b&gt; from the &lt;b&gt;Devices&lt;/b&gt; menu. If they are installed but the machine is not yet fully started then shared folders will be available once it is.&lt;/p&gt;</source>
- <translation type="unfinished"></translation>
+ <translation>&lt;p&gt;Úgy tűnik a VirtualBox Integrációs szolgáltatások nem érhetők el a virtuális gépen, és nélküle a megosztott mappák nem használhatók. A virtuális gépen belüli megosztott mappák használatához telepítsd fel az Integrációs szolgáltatásokat, ha nincsenek telepítve, vagy ha csak nem működnek helyesen, az &lt;b&gt;Eszközök&lt;/b&gt; menüben az &lt;b&gt;Integrációs szolgáltatások telepítése...&lt;/b&gt; választásával. Ha telepítve vannak, de a gép nem teljesen indult még el, a megosztott mappák elérhetők lesznek.&lt;/p&gt;</translation>
</message>
<message>
<source>&lt;p&gt;The virtual machine window will be now switched to &lt;b&gt;fullscreen&lt;/b&gt; mode. You can go back to windowed mode at any time by pressing &lt;b&gt;%1&lt;/b&gt;.&lt;/p&gt;&lt;p&gt;Note that the &lt;i&gt;Host&lt;/i&gt; key is currently defined as &lt;b&gt;%2&lt;/b&gt;.&lt;/p&gt;&lt;p&gt;Note that the main menu bar is hidden in fullscreen mode. You can access it by pressing &lt;b&gt;Host+Home&lt;/b&gt;.&lt;/p&gt;</source>
- <translation type="unfinished"></translation>
+ <translation>&lt;p&gt;A virtuális gép ablaka most &lt;b&gt;teljes képernyős&lt;/b&gt; módra vált. Bármikor visszaléphetsz az ablakos módba a(z) &lt;b&gt;%1&lt;/b&gt; gomb megnyomásával. Ne feledd, hogy a &lt;i&gt;gazda&lt;/i&gt; gomb jelenleg ez: &lt;b&gt;%2&lt;/b&gt;.&lt;/p&gt;&lt;p&gt;Ne feledd, hogy a főmenü eltűnik a teljes képernyős módnál. A &lt;b&gt;gazda+Home&lt;/b&gt; gombok megnyomásával érheted el.&lt;/p&gt;</translation>
</message>
<message>
<source>&lt;p&gt;The virtual machine window will be now switched to &lt;b&gt;Seamless&lt;/b&gt; mode. You can go back to windowed mode at any time by pressing &lt;b&gt;%1&lt;/b&gt;.&lt;/p&gt;&lt;p&gt;Note that the &lt;i&gt;Host&lt;/i&gt; key is currently defined as &lt;b&gt;%2&lt;/b&gt;.&lt;/p&gt;&lt;p&gt;Note that the main menu bar is hidden in seamless mode. You can access it by pressing &lt;b&gt;Host+Home&lt;/b&gt;.&lt;/p&gt;</source>
- <translation type="unfinished"></translation>
+ <translation>&lt;p&gt;A virtuális gép ablaka most &lt;b&gt;asztal-integrációs&lt;/b&gt; módra vált. Bármikor visszaléphetsz az ablakos módba a(z) &lt;b&gt;%1&lt;/b&gt; gomb megnyomásával. Ne feledd, hogy a &lt;i&gt;gazda&lt;/i&gt; gomb jelenleg ez: &lt;b&gt;%2&lt;/b&gt;.&lt;/p&gt;&lt;p&gt;Ne feledd, hogy a főmenü eltűnik asztal-integrációs módnál. A &lt;b&gt;gazda+Home&lt;/b&gt; gombok megnyomásával érheted el.&lt;/p&gt;</translation>
</message>
<message>
<source>&lt;p&gt;The virtual machine window will be now switched to &lt;b&gt;Scale&lt;/b&gt; mode. You can go back to windowed mode at any time by pressing &lt;b&gt;%1&lt;/b&gt;.&lt;/p&gt;&lt;p&gt;Note that the &lt;i&gt;Host&lt;/i&gt; key is currently defined as &lt;b&gt;%2&lt;/b&gt;.&lt;/p&gt;&lt;p&gt;Note that the main menu bar is hidden in scale mode. You can access it by pressing &lt;b&gt;Host+Home&lt;/b&gt;.&lt;/p&gt;</source>
- <translation type="unfinished"></translation>
+ <translation>&lt;p&gt;A virtuális gép ablaka most &lt;b&gt;átméretezhető&lt;/b&gt; módra vált. Bármikor visszaléphetsz az ablakos módba a(z) &lt;b&gt;%1&lt;/b&gt; gomb megnyomásával. Ne feledd, hogy a &lt;i&gt;gazda&lt;/i&gt; gomb jelenleg ez: &lt;b&gt;%2&lt;/b&gt;.&lt;/p&gt;&lt;p&gt;Ne feledd, hogy a főmenü eltűnik átméretezhető módnál. A &lt;b&gt;gazda+Home&lt;/b&gt; gombok megnyomásával érheted el.&lt;/p&gt;</translation>
</message>
<message>
<source>Switch</source>
<comment>scale</comment>
- <translation type="unfinished">Átváltás</translation>
+ <translation>Átváltás</translation>
</message>
<message>
<source>Failed to open the Extension Pack &lt;b&gt;%1&lt;/b&gt;.</source>
- <translation type="unfinished"></translation>
+ <translation>A Kiterjesztő csomag megnyitása sikertelen: &lt;b&gt;%1&lt;/b&gt;.</translation>
</message>
<message>
<source>&lt;p&gt;You are about to install a VirtualBox extension pack. Extension packs complement the functionality of VirtualBox and can contain system level software that could be potentially harmful to your system. Please review the description below and only proceed if you have obtained the extension pack from a trusted source.&lt;/p&gt;&lt;p&gt;&lt;table cellpadding=0 cellspacing=0&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;Name:&amp;nbsp;&amp;nbsp;&lt;/b&gt;&lt;/td&gt;&lt;td&gt;%1&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;Version:&amp;nbsp;&amp;nbsp;&lt;/b&gt;&lt;/td&gt;&lt;td&gt;%2&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;Description:&amp;nbsp;&amp;nbsp;&lt;/b&gt;&lt;/td&gt;&lt;td&gt;%3&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/p&gt;</source>
- <translation type="unfinished"></translation>
+ <translation>&lt;p&gt;Egy VirtualBox kiterjesztő csomagot telepítesz. A kiterjesztő csomagok kiegészítik a VirtualBox képességeit és rendszerszintű szoftvert tartalmaznak, mely teljesen ártalmatlan a rendszeredre. Nézd át a lenti leírást és csak akkor folytasd, ha megbízható forásból származik a kiterjesztő csomag.&lt;/p&gt;&lt;p&gt;&lt;table cellpadding=0 cellspacing=0&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;Név:&amp;nbsp;&amp;nbsp;&lt;/b&gt;&lt;/td&gt;&lt;td&gt;%1&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;Verzió:&amp;nbsp;&amp;nbsp;&lt;/b&gt;&lt;/td&gt;&lt;td&gt;%2&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;Leírás:&amp;nbsp;&amp;nbsp;&lt;/b&gt;&lt;/td&gt;&lt;td&gt;%3&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/p&gt;</translation>
</message>
<message>
<source>&amp;Install</source>
- <translation type="unfinished"></translation>
+ <translation>&amp;Telepítés</translation>
</message>
<message>
<source>Extension packs complement the functionality of VirtualBox and can contain system level software that could be potentially harmful to your system. Please review the description below and only proceed if you have obtained the extension pack from a trusted source.</source>
- <translation type="unfinished"></translation>
+ <translation>A kiterjesztő csomagok kiegészítik a VirtualBox képességeit és rendszerszintű szoftvert tartalmaznak, mely teljesen ártalmatlan a rendszeredre. Nézd át a lenti leírást és csak akkor folytasd, ha megbízható forásból származik a kiterjesztő csomag.</translation>
</message>
<message>
<source>&lt;p&gt;An older version of the extension pack is already installed, would you like to upgrade? &lt;p&gt;%1&lt;/p&gt;&lt;p&gt;&lt;table cellpadding=0 cellspacing=0&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;Name:&amp;nbsp;&amp;nbsp;&lt;/b&gt;&lt;/td&gt;&lt;td&gt;%2&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;New Version:&amp;nbsp;&amp;nbsp;&lt;/b&gt;&lt;/td&gt;&lt;td&gt;%3&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;Current Version:&amp;nbsp;&amp;nbsp;&lt;/b&gt;&lt;/td&gt;&lt;td&gt;%4&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;Description:&amp;nbsp;&amp;nbsp;&lt;/b&gt;&lt;/td&gt;&lt;td&gt;%5&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/p&gt;</source>
- <translation type="unfinished"></translation>
+ <translation>&lt;p&gt;Egy régi kiterjesztő csomag van telepítve. Szeretnéd frissíteni? &lt;p&gt;%1&lt;/p&gt;&lt;p&gt;&lt;table cellpadding=0 cellspacing=0&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;Név:&amp;nbsp;&amp;nbsp;&lt;/b&gt;&lt;/td&gt;&lt;td&gt;%2&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;Új verzió:&amp;nbsp;&amp;nbsp;&lt;/b&gt;&lt;/td&gt;&lt;td&gt;%3&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;Jelenlegi verzió:&amp;nbsp;&amp;nbsp;&lt;/b&gt;&lt;/td&gt;&lt;td&gt;%4&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;Leírás:&amp;nbsp;&amp;nbsp;&lt;/b&gt;&lt;/td&gt;&lt;td&gt;%5&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/p&gt;</translation>
</message>
<message>
<source>&amp;Upgrade</source>
- <translation type="unfinished"></translation>
+ <translation>&amp;Frissítés</translation>
</message>
<message>
<source>&lt;p&gt;An newer version of the extension pack is already installed, would you like to downgrade? &lt;p&gt;%1&lt;/p&gt;&lt;p&gt;&lt;table cellpadding=0 cellspacing=0&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;Name:&amp;nbsp;&amp;nbsp;&lt;/b&gt;&lt;/td&gt;&lt;td&gt;%2&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;New Version:&amp;nbsp;&amp;nbsp;&lt;/b&gt;&lt;/td&gt;&lt;td&gt;%3&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;Current Version:&amp;nbsp;&amp;nbsp;&lt;/b&gt;&lt;/td&gt;&lt;td&gt;%4&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;Description:&amp;nbsp;&amp;nbsp;&lt;/b&gt;&lt;/td&gt;&lt;td&gt;%5&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/p&gt;</source>
- <translation type="unfinished"></translation>
+ <translation>&lt;p&gt;Egy régebbi kiterjesztő csomag van telepítve. Szeretnéd visszabutítani? &lt;p&gt;%1&lt;/p&gt;&lt;p&gt;&lt;table cellpadding=0 cellspacing=0&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;Név:&amp;nbsp;&amp;nbsp;&lt;/b&gt;&lt;/td&gt;&lt;td&gt;%2&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;Új verzió:&amp;nbsp;&amp;nbsp;&lt;/b&gt;&lt;/td&gt;&lt;td&gt;%3&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;Jelenlegi verzió:&amp;nbsp;&amp;nbsp;&lt;/b&gt;&lt;/td&gt;&lt;td&gt;%4&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;Leírás:&amp;nbsp;&amp;nbsp;&lt;/b&gt;&lt;/td&gt;&lt;td&gt;%5&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/p&gt;</translation>
</message>
<message>
<source>&amp;Downgrade</source>
- <translation type="unfinished"></translation>
+ <translation>&amp;Lebutítás</translation>
</message>
<message>
<source>&lt;p&gt;The extension pack is already installed with the same version, would you like reinstall it? &lt;p&gt;%1&lt;/p&gt;&lt;p&gt;&lt;table cellpadding=0 cellspacing=0&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;Name:&amp;nbsp;&amp;nbsp;&lt;/b&gt;&lt;/td&gt;&lt;td&gt;%2&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;Version:&amp;nbsp;&amp;nbsp;&lt;/b&gt;&lt;/td&gt;&lt;td&gt;%3&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;Description:&amp;nbsp;&amp;nbsp;&lt;/b&gt;&lt;/td&gt;&lt;td&gt;%4&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/p&gt;</source>
- <translation type="unfinished"></translation>
+ <translation>&lt;p&gt;A kiterjesztő csomag ezen verziója már telepítve vav. Szeretnéd ismét feltelepíteni? &lt;p&gt;%1&lt;/p&gt;&lt;p&gt;&lt;table cellpadding=0 cellspacing=0&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;Név:&amp;nbsp;&amp;nbsp;&lt;/b&gt;&lt;/td&gt;&lt;td&gt;%2&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;Verzió:&amp;nbsp;&amp;nbsp;&lt;/b&gt;&lt;/td&gt;&lt;td&gt;%3&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;Leírás:&amp;nbsp;&amp;nbsp;&lt;/b&gt;&lt;/td&gt;&lt;td&gt;%4&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/p&gt;</translation>
</message>
<message>
<source>&amp;Reinstall</source>
- <translation type="unfinished"></translation>
+ <translation>Új&amp;ratelepítés</translation>
</message>
<message>
<source>&lt;p&gt;You are about to remove the VirtualBox extension pack &lt;b&gt;%1&lt;/b&gt;.&lt;/p&gt;&lt;p&gt;Are you sure you want to proceed?&lt;/p&gt;</source>
- <translation type="unfinished"></translation>
+ <translation>&lt;p&gt;Eltávolítod a VirtualBox kiterjesztő scomagot: &lt;b&gt;%1&lt;/b&gt;.&lt;/p&gt;&lt;p&gt;Biztos folytatni akarod?&lt;/p&gt;</translation>
</message>
<message>
<source>The extension pack &lt;br&gt;&lt;nobr&gt;&lt;b&gt;%1&lt;/b&gt;&lt;nobr&gt;&lt;br&gt; was installed successfully.</source>
- <translation type="unfinished"></translation>
+ <translation>A kiterjesztő csomag sikeresen telepítve: &lt;br&gt;&lt;nobr&gt;&lt;b&gt;%1&lt;/b&gt;&lt;nobr&gt;&lt;br&gt;.</translation>
</message>
<message>
<source>Deletion of all files belonging to the VM is currently disabled on Windows/x64 to prevent a crash. That will be fixed in the next release.</source>
- <translation type="unfinished"></translation>
+ <translation>A virtuális géphez tartozó fájlok fájlok törlése jelenleg le van tiltva Windows/x64 rendszeren az összeomlás elkerülése miatt. Ez a következő kiadásban kerül javításra.</translation>
</message>
<message>
<source>&lt;p&gt;Cannot create the machine folder &lt;b&gt;%1&lt;/b&gt; in the parent folder &lt;nobr&gt;&lt;b&gt;%2&lt;/b&gt;.&lt;/nobr&gt;&lt;/p&gt;&lt;p&gt;Please check that the parent really exists and that you have permissions to create the machine folder.&lt;/p&gt;</source>
- <translation type="unfinished"></translation>
+ <translation>&lt;p&gt;A(z) &lt;nobr&gt;&lt;b&gt;%2&lt;/b&gt; szülő mappában nem tudod létrehozni a gép mappáját: &lt;b&gt;%1&lt;/b&gt;.&lt;/nobr&gt;&lt;/p&gt;&lt;p&gt;Ellenőrizd, hogy a szülő mappa tényleg létezik és hogy van jogod ott mappát létrehozni.&lt;/p&gt;</translation>
</message>
<message>
<source>&lt;p&gt;USB 2.0 is currently enabled for this virtual machine. However this requires the &lt;b&gt;&lt;nobr&gt;%1&lt;/nobr&gt;&lt;/b&gt; to be installed.&lt;/p&gt;&lt;p&gt;Please install the Extension Pack from the VirtualBox download site. After this you will be able to re-enable USB 2.0. It will be disabled in the meantime unless you cancel the current settings changes.&lt;/p&gt;</source>
- <translation type="unfinished"></translation>
+ <translation>&lt;p&gt;Az USB 2.0 jelenleg be van kapcsolva a virtuális gépen. Azonban ehhez a következőnek telepítve kell lennie: &lt;b&gt;&lt;nobr&gt;%1&lt;/nobr&gt;&lt;/b&gt;.&lt;/p&gt;&lt;p&gt;A VirtualBox oldaláról letöltve telepítsd fel a Kiterjesztő csomagot. Ezután újra be engedélyezni tudod az USB 2.0-t. Addig ki lesz kapcsolva, hacsak meg nem szakítod a beállítások módosítását.&lt;/p&gt;</translation>
</message>
</context>
<context>
diff --git a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_it.ts b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_it.ts
index 7651ec56c..a7b46b3ce 100644
--- a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_it.ts
+++ b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_it.ts
@@ -9270,11 +9270,11 @@ la lingua a quella predefinita di sistema.&lt;/qt&gt;
</message>
<message>
<source>&lt;p&gt;Failed to initialize COM or to find the VirtualBox COM server. Most likely, the VirtualBox server is not running or failed to start.&lt;/p&gt;&lt;p&gt;The application will now terminate.&lt;/p&gt;</source>
- <translation>&lt;p&gt;Fallimento nell&apos;inizializzazione di COM o nell&apos;individuazione del server VirtualBox COM. Probabilmente il server VirtualBox non è in esecuzione o non è riuscito a partire.&lt;/p&gt;&lt;p&gt;L&apos;applicazione verrà chiusa.&lt;/p&gt;</translation>
+ <translation>&lt;p&gt;Inizializzazione COM o individuazione del server VirtualBox COM non riuscita. Probabilmente il server VirtualBox non è in esecuzione o non è riuscito a partire.&lt;/p&gt;&lt;p&gt;L&apos;applicazione sarà chiusa.&lt;/p&gt;</translation>
</message>
<message>
<source>&lt;p&gt;Failed to create the VirtualBox COM object.&lt;/p&gt;&lt;p&gt;The application will now terminate.&lt;/p&gt;</source>
- <translation>&lt;p&gt;Fallimento nella creazione dell&apos;oggetto COM VirtualBox.&lt;/p&gt;&lt;p&gt;L&apos;applicazione verrà ora chiusa.&lt;/p&gt;</translation>
+ <translation>&lt;p&gt;Creazione dell&apos;oggetto COM VirtualBox non riuscita.&lt;/p&gt;&lt;p&gt;L&apos;applicazione sarà chiusa immediatamente.&lt;/p&gt;</translation>
</message>
<message>
<source>&lt;p&gt;Failed to load the global GUI configuration.&lt;/p&gt;&lt;p&gt;The application will now terminate.&lt;/p&gt;</source>
@@ -9286,23 +9286,23 @@ la lingua a quella predefinita di sistema.&lt;/qt&gt;
</message>
<message>
<source>Failed to set global VirtualBox properties.</source>
- <translation>Fallimento nell&apos;impostazione delle proprietà globali di VirtualBox.</translation>
+ <translation>Impostazione delle proprietà globali di VirtualBox non riuscita.</translation>
</message>
<message>
<source>Failed to access the USB subsystem.</source>
- <translation>Fallimento nell&apos;accesso al subsystem USB.</translation>
+ <translation>Accesso al sottosistema USB non riuscito.</translation>
</message>
<message>
<source>Failed to create a new virtual machine.</source>
- <translation>Fallimento nella creazione di una nuova macchina virtuale.</translation>
+ <translation>Creazione di una nuova macchina virtuale non riuscita.</translation>
</message>
<message>
<source>Failed to create a new virtual machine &lt;b&gt;%1&lt;/b&gt;.</source>
- <translation>Fallimento nella creazione di una nuova macchina virtuale &lt;b&gt;%1&lt;/b&gt;.</translation>
+ <translation>Creazione di una nuova macchina virtuale &lt;b&gt;%1&lt;/b&gt; non riuscita.</translation>
</message>
<message>
<source>Failed to apply the settings to the virtual machine &lt;b&gt;%1&lt;/b&gt;.</source>
- <translation>Fallimento nell&apos;applicazione delle impostazioni alla macchina virtuale &lt;b&gt;%1&lt;/b&gt;.</translation>
+ <translation>Applicazione delle impostazioni alla macchina virtuale &lt;b&gt;%1&lt;/b&gt; non riuscita.</translation>
</message>
<message>
<source>Failed to save the settings of the virtual machine &lt;b&gt;%1&lt;/b&gt;.</source>
@@ -9342,7 +9342,7 @@ la lingua a quella predefinita di sistema.&lt;/qt&gt;
</message>
<message>
<source>Failed to discard the saved state of the virtual machine &lt;b&gt;%1&lt;/b&gt;.</source>
- <translation>Scarto dello stato salvato per la Macchina Virtuale &lt;b&gt;%1&lt;/b&gt; non riuscito.</translation>
+ <translation>Scarto dello stato salvato per la macchina virtuale &lt;b&gt;%1&lt;/b&gt; non riuscito.</translation>
</message>
<message>
<source>Failed to discard the snapshot &lt;b&gt;%1&lt;/b&gt; of the virtual machine &lt;b&gt;%2&lt;/b&gt;.</source>
diff --git a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_lt.ts b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_lt.ts
index 7a8f0f3bd..469f2b4eb 100644
--- a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_lt.ts
+++ b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_lt.ts
@@ -247,7 +247,7 @@
</message>
<message>
<source>Send the Ctrl-Alt-Del sequence to the virtual machine</source>
- <translation>Mašinai nusiųsti klavišų kombinaciją Vald+Alt+Šalinti(Delete)</translation>
+ <translation>Mašinai nusiųsti klavišų kombinaciją Vald(Ctrl)+Alt+Šalinti(Delete)</translation>
</message>
<message>
<source>&amp;Insert Ctrl-Alt-Backspace</source>
@@ -255,7 +255,7 @@
</message>
<message>
<source>Send the Ctrl-Alt-Backspace sequence to the virtual machine</source>
- <translation>Mašinai nusiųsti klavišų kombinaciją Vald+Alt+Naikinti(Backspace)</translation>
+ <translation>Mašinai nusiųsti klavišų kombinaciją Vald(Ctrl)+Alt+Naikinti(Backspace)</translation>
</message>
<message>
<source>Take &amp;Snapshot...</source>
@@ -3372,7 +3372,7 @@
<name>UIMachineWindowNormal</name>
<message>
<source>Shows the currently assigned Host key.&lt;br&gt;This key, when pressed alone, toggles the keyboard and mouse capture state. It can also be used in combination with other keys to quickly perform actions from the main menu.</source>
- <translation>Rodo pasirinktą pagrindinį klavišą. &lt;br&gt;Pavieniui nuspaustas, šis klavišas perjungia įvedimo klaviatūra veikseną. Jis taip pat gali būti naudojamas kartu su kitais klavišais norint greitai įvykdyti pagrindinio meniu komandas.</translation>
+ <translation>Rodo pasirinktą pagrindinio kompiuterio klavišą. &lt;br&gt;Pavieniui nuspaustas, šis klavišas perjungia įvedimo klaviatūra veikseną. Jis taip pat gali būti naudojamas kartu su kitais klavišais norint greitai įvykdyti pagrindinio meniu komandas.</translation>
</message>
</context>
<context>
@@ -3726,7 +3726,7 @@
</message>
<message>
<source>Protocol</source>
- <translation>Protolkolas</translation>
+ <translation>Protokolas</translation>
</message>
<message>
<source>Host IP</source>
@@ -7390,7 +7390,7 @@ IPv6.</translation>
</message>
<message>
<source>&lt;p&gt;The Virtual Machine reports that the guest OS does not support &lt;b&gt;mouse pointer integration&lt;/b&gt; in the current video mode. You need to capture the mouse (by clicking over the VM display or pressing the host key) in order to use the mouse inside the guest OS.&lt;/p&gt;</source>
- <translation>&lt;p&gt;Virtuali mašina pranešė, kad svečio OS nepalaiko &lt;b&gt;pelės žymeklio integravimo&lt;/b&gt; šioje vaizdo veiksenoje. Jei norite, kad virtuali mašina reaguotų į pelę, spragtelėkite pele svečio OS lange arba nuspauskite pagrindinį kompiuterio klavišą (host).&lt;/p&gt;</translation>
+ <translation>&lt;p&gt;Virtuali mašina pranešė, kad svečio OS nepalaiko &lt;b&gt;pelės žymeklio integravimo&lt;/b&gt; šioje vaizdo veiksenoje. Jei norite, kad virtuali mašina reaguotų į pelę, spragtelėkite pele svečio OS lange arba nuspauskite pagrindinio kompiuterio klavišą.&lt;/p&gt;</translation>
</message>
<message>
<source>&lt;p&gt;The Virtual Machine is currently in the &lt;b&gt;Paused&lt;/b&gt; state and not able to see any keyboard or mouse input. If you want to continue to work inside the VM, you need to resume it by selecting the corresponding action from the menu bar.&lt;/p&gt;</source>
@@ -7596,7 +7596,7 @@ IPv6.</translation>
<message>
<source>&lt;p&gt;The host key is currently defined as &lt;b&gt;%1&lt;/b&gt;.&lt;/p&gt;</source>
<comment>additional message box paragraph</comment>
- <translation>&lt;p&gt;Šiuo metu pagrindinis kompiuterio klavišas yra &lt;b&gt;%1&lt;/b&gt;.&lt;/p&gt;</translation>
+ <translation>&lt;p&gt;Šiuo metu pagrindinio kompiuterio klavišas yra &lt;b&gt;%1&lt;/b&gt;.&lt;/p&gt;</translation>
</message>
<message>
<source>Capture</source>
@@ -7661,11 +7661,11 @@ IPv6.</translation>
</message>
<message>
<source>&lt;p&gt;You have &lt;b&gt;clicked the mouse&lt;/b&gt; inside the Virtual Machine display or pressed the &lt;b&gt;host key&lt;/b&gt;. This will cause the Virtual Machine to &lt;b&gt;capture&lt;/b&gt; the host mouse pointer (only if the mouse pointer integration is not currently supported by the guest OS) and the keyboard, which will make them unavailable to other applications running on your host machine.&lt;/p&gt;&lt;p&gt;You can press the &lt;b&gt;host key&lt;/b&gt; at any time to &lt;b&gt;uncapture&lt;/b&gt; the keyboard and mouse (if it is captured) and return them to normal operation. The currently assigned host key is shown on the status bar at the bottom of the Virtual Machine window, next to the&amp;nbsp;&lt;img src=:/hostkey_16px.png/&gt;&amp;nbsp;icon. This icon, together with the mouse icon placed nearby, indicate the current keyboard and mouse capture state.&lt;/p&gt;</source>
- <translation>&lt;p&gt;&lt;b&gt;Spragtelėjote pele&lt;/b&gt; virtualios mašinos lange arba nuspaudėte kompiuterio &lt;b&gt;pagrindinį klavišą (Host)&lt;/b&gt;. Todėl virtuali mašina ims &lt;b&gt;reaguoti&lt;/b&gt; į pagrindinio kompiuterio pelės žymeklį (tik jei svečio operacinė sistema nepalaiko pelės žymeklio integravimo) ir į klaviatūrą; į pelę ir klaiviatūrą nebereaguos jokios kitos pagrindinio kompiuterio programos.&lt;/p&gt;&lt;p&gt;Nuspaudus kompiuterio &lt;b&gt;pagrindinį klavišą (host)&lt;/b&gt; bus &lt;b&gt;nebereaguojama&lt;/b&gt; automatiškai į pelę ir klaviatūrą (jei buvo reaguojama) ir darbas vyks įprastu būdu. Šiuo metu kaip pagrindnis klavišas yra naudojamas tas, kuris rodomas virtualios mašinos lango apatiniame kampe ties&amp;nbsp;&lt;img src=:/hostkey_16px.png/&gt;&amp;nbsp;ženkliuku. Šis ir pelės ženkliukas rodo reagavimo į klaviatūrą ir pelę būseną.&lt;/p&gt;</translation>
+ <translation>&lt;p&gt;&lt;b&gt;Spragtelėjote pele&lt;/b&gt; virtualios mašinos lange arba nuspaudėte &lt;b&gt;pagrindinio kompiuterio klavišą&lt;/b&gt;. Todėl virtuali mašina ims &lt;b&gt;reaguoti&lt;/b&gt; į pagrindinio kompiuterio pelės žymeklį (tik jei svečio operacinė sistema nepalaiko pelės žymeklio integravimo) ir į klaviatūrą; į pelę ir klaiviatūrą nebereaguos jokios kitos pagrindinio kompiuterio programos.&lt;/p&gt;&lt;p&gt;Nuspaudus &lt;b&gt;pagrindinio kompiuterio klavišą&lt;/b&gt; bus &lt;b&gt;nebereaguojama&lt;/b&gt; automatiškai į pelę ir klaviatūrą (jei buvo reaguojama) ir darbas vyks įprastu būdu. Šiuo metu pagrindinio kompiuterio klavišas yra tas, kuris rodomas virtualios mašinos lango apatiniame kampe ties&amp;nbsp;&lt;img src=:/hostkey_16px.png/&gt;&amp;nbsp;ženkliuku. Šis ir pelės ženkliukas rodo reagavimo į klaviatūrą ir pelę būseną.&lt;/p&gt;</translation>
</message>
<message>
<source>&lt;p&gt;You have the &lt;b&gt;Auto capture keyboard&lt;/b&gt; option turned on. This will cause the Virtual Machine to automatically &lt;b&gt;capture&lt;/b&gt; the keyboard every time the VM window is activated and make it unavailable to other applications running on your host machine: when the keyboard is captured, all keystrokes (including system ones like Alt-Tab) will be directed to the VM.&lt;/p&gt;&lt;p&gt;You can press the &lt;b&gt;host key&lt;/b&gt; at any time to &lt;b&gt;uncapture&lt;/b&gt; the keyboard and mouse (if it is captured) and return them to normal operation. The currently assigned host key is shown on the status bar at the bottom of the Virtual Machine window, next to the&amp;nbsp;&lt;img src=:/hostkey_16px.png/&gt;&amp;nbsp;icon. This icon, together with the mouse icon placed nearby, indicate the current keyboard and mouse capture state.&lt;/p&gt;</source>
- <translation>&lt;p&gt;Įgalinta &lt;b&gt;Automatinio reagavimo į klaviatūrą&lt;/b&gt; parinktis. Todėl virtuali mašina automatiškai &lt;b&gt;reaguos&lt;/b&gt; į klaviatūros paspaudimus, jei virtualios mašinos langas bus aktyvus; tuomet į klaviatūrą nereaguos jokios kitos pagrindiniame kompiuteryje paleistos programos; netgi dauguma sparčiųjų klavišų (įskaitant Alt+Tab) bus tiesiogiai perduoti virtualiai mašinai.&lt;/p&gt;&lt;p&gt;Nuspaudus kompiuterio &lt;b&gt;pagrindinį klavišą&lt;/b&gt; bus &lt;b&gt;nebereaguojama&lt;/b&gt; automatiškai į pelę ir klaviatūrą (jei buvo reaguojama) ir darbas vyks įprastu būdu. Šiuo metu kaip pagrindnis klavišas yra naudojamas tas, kuris rodomas virtualios mašinos lango apatiniame kampe ties&amp;nbsp;&lt;img src=:/hostkey_16px.png/&gt;&amp;nbsp;ženkliuku. Šis ir pelės ženkliukas rodo reagavimo į klaviatūrą ir pelę būseną.&lt;/p&gt;</translation>
+ <translation>&lt;p&gt;Įgalinta &lt;b&gt;Automatinio reagavimo į klaviatūrą&lt;/b&gt; parinktis. Todėl virtuali mašina automatiškai &lt;b&gt;reaguos&lt;/b&gt; į klaviatūros paspaudimus, jei virtualios mašinos langas bus aktyvus; tuomet į klaviatūrą nereaguos jokios kitos pagrindiniame kompiuteryje paleistos programos; netgi dauguma sparčiųjų klavišų (įskaitant Alt+Tab) bus tiesiogiai perduoti virtualiai mašinai.&lt;/p&gt;&lt;p&gt;Nuspaudus &lt;b&gt;pagrindinio kompiuterio klavišą&lt;/b&gt; bus &lt;b&gt;nebereaguojama&lt;/b&gt; automatiškai į pelę ir klaviatūrą (jei buvo reaguojama) ir darbas vyks įprastu būdu. Šiuo metu pagrindinio kompiuterio klavišas yra tas, kuris rodomas virtualios mašinos lango apatiniame kampe ties&amp;nbsp;&lt;img src=:/hostkey_16px.png/&gt;&amp;nbsp;ženkliuku. Šis ir pelės ženkliukas rodo reagavimo į klaviatūrą ir pelę būseną.&lt;/p&gt;</translation>
</message>
<message>
<source>&lt;p&gt;The Virtual Machine reports that the guest OS supports &lt;b&gt;mouse pointer integration&lt;/b&gt;. This means that you do not need to &lt;i&gt;capture&lt;/i&gt; the mouse pointer to be able to use it in your guest OS -- all mouse actions you perform when the mouse pointer is over the Virtual Machine&apos;s display are directly sent to the guest OS. If the mouse is currently captured, it will be automatically uncaptured.&lt;/p&gt;&lt;p&gt;The mouse icon on the status bar will look like&amp;nbsp;&lt;img src=:/mouse_seamless_16px.png/&gt;&amp;nbsp;to inform you that mouse pointer integration is supported by the guest OS and is currently turned on.&lt;/p&gt;&lt;p&gt;&lt;b&gt;Note&lt;/b&gt;: Some applications may behave incorrectly in mouse pointer integration mode. You can always disable it for the current session (and enable it again) by selecting the corresponding action from the menu bar.&lt;/p&gt;</source>
@@ -8439,15 +8439,15 @@ IPv6.</translation>
</message>
<message>
<source>&lt;p&gt;The virtual machine window will be now switched to &lt;b&gt;fullscreen&lt;/b&gt; mode. You can go back to windowed mode at any time by pressing &lt;b&gt;%1&lt;/b&gt;.&lt;/p&gt;&lt;p&gt;Note that the &lt;i&gt;Host&lt;/i&gt; key is currently defined as &lt;b&gt;%2&lt;/b&gt;.&lt;/p&gt;&lt;p&gt;Note that the main menu bar is hidden in fullscreen mode. You can access it by pressing &lt;b&gt;Host+Home&lt;/b&gt;.&lt;/p&gt;</source>
- <translation>&lt;p&gt;Virtualios mašinos langas netrukus pereis į &lt;b&gt;viso ekrano&lt;/b&gt; veikseną. Į įprastą lango veikseną sugrįšite nuspaudę &lt;b&gt;%1&lt;/b&gt;.&lt;/p&gt;&lt;p&gt;Atminkite, kad &lt;i&gt;Pagrindinis&lt;/i&gt; klavišas šiuo metu yra &lt;b&gt;%2&lt;/b&gt;.&lt;/p&gt;&lt;p&gt;Be to, viso ekrano veiksenoje meniu juosta yra paslėpta. Ją pasieksite nuspaudę &lt;b&gt;Pagrindinis + Prad&lt;/b&gt;.&lt;/p&gt;</translation>
+ <translation>&lt;p&gt;Virtualios mašinos langas netrukus pereis į &lt;b&gt;viso ekrano&lt;/b&gt; veikseną. Į įprastą lango veikseną sugrįšite nuspaudę &lt;b&gt;%1&lt;/b&gt;.&lt;/p&gt;&lt;p&gt;Atminkite, kad &lt;i&gt;pagrindinio kompiuterio&lt;/i&gt; klavišas šiuo metu yra &lt;b&gt;%2&lt;/b&gt;.&lt;/p&gt;&lt;p&gt;Be to, viso ekrano veiksenoje meniu juosta yra paslėpta. Ją pasieksite nuspaudę &lt;b&gt;(pagr. komp. klavišas) + Prad&lt;/b&gt;.&lt;/p&gt;</translation>
</message>
<message>
<source>&lt;p&gt;The virtual machine window will be now switched to &lt;b&gt;Seamless&lt;/b&gt; mode. You can go back to windowed mode at any time by pressing &lt;b&gt;%1&lt;/b&gt;.&lt;/p&gt;&lt;p&gt;Note that the &lt;i&gt;Host&lt;/i&gt; key is currently defined as &lt;b&gt;%2&lt;/b&gt;.&lt;/p&gt;&lt;p&gt;Note that the main menu bar is hidden in seamless mode. You can access it by pressing &lt;b&gt;Host+Home&lt;/b&gt;.&lt;/p&gt;</source>
- <translation>&lt;p&gt;Virtualios mašinos langas netrukus pereis į &lt;b&gt;integruoto darbalaukio&lt;/b&gt; veikseną. Į įprastą lango veikseną sugrįšite nuspaudę &lt;b&gt;%1&lt;/b&gt;.&lt;/p&gt;&lt;p&gt;Atminkite, kad &lt;i&gt;Pagrindinis&lt;/i&gt; klavišas šiuo metu yra &lt;b&gt;%2&lt;/b&gt;.&lt;/p&gt;&lt;p&gt;Be to, integruotoje veiksenoje meniu juosta yra paslėpta. Ją pasieksite nuspaudę &lt;b&gt;Pagrindinis+Prad&lt;/b&gt;.&lt;/p&gt;</translation>
+ <translation>&lt;p&gt;Virtualios mašinos langas netrukus pereis į &lt;b&gt;integruoto darbalaukio&lt;/b&gt; veikseną. Į įprastą lango veikseną sugrįšite nuspaudę &lt;b&gt;%1&lt;/b&gt;.&lt;/p&gt;&lt;p&gt;Atminkite, kad &lt;i&gt;pagrindinio kompiuterio&lt;/i&gt; klavišas šiuo metu yra &lt;b&gt;%2&lt;/b&gt;.&lt;/p&gt;&lt;p&gt;Be to, integruotoje veiksenoje meniu juosta yra paslėpta. Ją pasieksite nuspaudę &lt;b&gt;(pagr. komp. klav.) + Prad&lt;/b&gt;.&lt;/p&gt;</translation>
</message>
<message>
<source>&lt;p&gt;The virtual machine window will be now switched to &lt;b&gt;Scale&lt;/b&gt; mode. You can go back to windowed mode at any time by pressing &lt;b&gt;%1&lt;/b&gt;.&lt;/p&gt;&lt;p&gt;Note that the &lt;i&gt;Host&lt;/i&gt; key is currently defined as &lt;b&gt;%2&lt;/b&gt;.&lt;/p&gt;&lt;p&gt;Note that the main menu bar is hidden in scale mode. You can access it by pressing &lt;b&gt;Host+Home&lt;/b&gt;.&lt;/p&gt;</source>
- <translation>&lt;p&gt;Virtualios mašinos langas netrukus pereis į &lt;b&gt;keičiamo lango dydžio&lt;/b&gt; veikseną. Į įprastą lango veikseną sugrįšite nuspaudę &lt;b&gt;%1&lt;/b&gt;.&lt;/p&gt;&lt;p&gt;Atminkite, kad &lt;i&gt;Pagrindinis&lt;/i&gt; klavišas šiuo metu yra &lt;b&gt;%2&lt;/b&gt;.&lt;/p&gt;&lt;p&gt;Be to, keičiamo lango dydžio veiksenoje meniu juosta yra paslėpta. Ją pasieksite nuspaudę &lt;b&gt;Pagrindinis + Prad&lt;/b&gt;.&lt;/p&gt;</translation>
+ <translation>&lt;p&gt;Virtualios mašinos langas netrukus pereis į &lt;b&gt;keičiamo lango dydžio&lt;/b&gt; veikseną. Į įprastą lango veikseną sugrįšite nuspaudę &lt;b&gt;%1&lt;/b&gt;.&lt;/p&gt;&lt;p&gt;Atminkite, kad &lt;i&gt;pagrindinio kompiuterio&lt;/i&gt; klavišas šiuo metu yra &lt;b&gt;%2&lt;/b&gt;.&lt;/p&gt;&lt;p&gt;Be to, keičiamo lango dydžio veiksenoje meniu juosta yra paslėpta. Ją pasieksite nuspaudę &lt;b&gt;(pagr. komp. klav.) + Prad&lt;/b&gt;.&lt;/p&gt;</translation>
</message>
<message>
<source>Switch</source>
@@ -8811,7 +8811,7 @@ IPv6.</translation>
</message>
<message>
<source>Creates an Shortcut file to the VirtualBox Machine Definition file on your Desktop.</source>
- <translation>Darbalaukyje sukuriama šaukinio rinkmeną į VirtualBox mašinos apibrėžties rinkmeną.</translation>
+ <translation>Darbalaukyje sukuriama šaukinio rinkmena į VirtualBox mašinos apibrėžties rinkmeną.</translation>
</message>
<message>
<source>Show in File Manager</source>
diff --git a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_nl.ts b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_nl.ts
index cc6457a8b..3a3f95e83 100644
--- a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_nl.ts
+++ b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_nl.ts
@@ -1472,7 +1472,7 @@ p, li {white-space: pre-wrap; }
</message>
<message>
<source>Extensions</source>
- <translation type="unfinished">Extenties</translation>
+ <translation>Extenties</translation>
</message>
</context>
<context>
@@ -1559,11 +1559,11 @@ p, li {white-space: pre-wrap; }
</message>
<message>
<source>Reset host combination</source>
- <translation type="unfinished"></translation>
+ <translation>Zet de gastheer combinatie terug</translation>
</message>
<message>
<source>Resets the key combination used as the host combination in the VM window.</source>
- <translation type="unfinished"></translation>
+ <translation>Zet de toetscombinatie terug die als gastheer toets wordt gebruikt in het VM scherm.</translation>
</message>
</context>
<context>
@@ -1771,7 +1771,7 @@ p, li {white-space: pre-wrap; }
</message>
<message>
<source>Networking</source>
- <translation type="unfinished"></translation>
+ <translation>Netwerken</translation>
</message>
</context>
<context>
@@ -2109,7 +2109,7 @@ p, li {white-space: pre-wrap; }
</message>
<message>
<source>None</source>
- <translation type="unfinished">Geen</translation>
+ <translation>Geen</translation>
</message>
</context>
<context>
@@ -3744,7 +3744,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>USB 2.0 is currently enabled for this virtual machine. However this requires the &lt;b&gt;%1&lt;/b&gt; to be installed. Please install the Extension Pack from the VirtualBox download site. After this you will be able to re-enable USB 2.0. It will be disabled in the meantime unless you cancel the current settings changes.</source>
- <translation type="unfinished"></translation>
+ <translation>USB 2.0 is momenteel geactiveerd voor deze virtuele machine. Maar dit vereist installatie van &lt;b&gt;%1&lt;/b&gt;. Installeer het uitbreidingspakket beschikbaar op de VirtualBox download site. Hierna ben u instaat om de USB 2.0 opnieuw te activeren. In de tussentijn blijft deze inactief tenzij u de huidige instelling wijzigd.</translation>
</message>
</context>
<context>
@@ -6907,7 +6907,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>&apos;%1&apos; is an invalid host-combination code-sequence.</source>
- <translation type="unfinished"></translation>
+ <translation>&apos;%1&apos; is een ongeldige gastheer-combinatie code volgorde.</translation>
</message>
</context>
<context>
@@ -8374,15 +8374,15 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>Deletion of all files belonging to the VM is currently disabled on Windows/x64 to prevent a crash. That will be fixed in the next release.</source>
- <translation type="unfinished"></translation>
+ <translation>Verwijderen van alle bestanden die bij de VM horen is nu inactief op Windows/x64 om een crash te voorkomen. Dit wordt in de volgende versie opgelost.</translation>
</message>
<message>
<source>&lt;p&gt;Cannot create the machine folder &lt;b&gt;%1&lt;/b&gt; in the parent folder &lt;nobr&gt;&lt;b&gt;%2&lt;/b&gt;.&lt;/nobr&gt;&lt;/p&gt;&lt;p&gt;Please check that the parent really exists and that you have permissions to create the machine folder.&lt;/p&gt;</source>
- <translation type="unfinished"></translation>
+ <translation>&lt;p&gt;Kan de map &lt;b&gt;%1&lt;/b&gt; voor de machine niet aanmaken in de bovenligende map &lt;nobr&gt;&lt;b&gt;%2&lt;/b&gt;.&lt;/nobr&gt;&lt;/p&gt;&lt;p&gt;Controleer of de bovenliggende map bestaat en dan u rechten heeft om de machine map aan te maken.&lt;/p&gt;</translation>
</message>
<message>
<source>&lt;p&gt;USB 2.0 is currently enabled for this virtual machine. However this requires the &lt;b&gt;&lt;nobr&gt;%1&lt;/nobr&gt;&lt;/b&gt; to be installed.&lt;/p&gt;&lt;p&gt;Please install the Extension Pack from the VirtualBox download site. After this you will be able to re-enable USB 2.0. It will be disabled in the meantime unless you cancel the current settings changes.&lt;/p&gt;</source>
- <translation type="unfinished"></translation>
+ <translation>&lt;p&gt;USB 2.0 is momenteel geactiveerd voor deze virtuele machine. Maar dit vereist installatie van &lt;b&gt;&lt;nobr&gt;%1&lt;/nobr&gt;&lt;/b&gt;.&lt;/p&gt;&lt;p&gt;Installeer het uitbreidingspakket beschikbaar op de VirtualBox download site. Hierna ben u instaat om de USB 2.0 opnieuw te activeren. In de tussentijn blijft deze inactief tenzij u de huidige instelling wijzigd.&lt;/p&gt;</translation>
</message>
</context>
<context>
diff --git a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_pt_BR.ts b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_pt_BR.ts
index eb5d89ad5..be0eb9e80 100644
--- a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_pt_BR.ts
+++ b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_pt_BR.ts
@@ -1,6 +1,4 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!DOCTYPE TS>
-<TS version="2.0" language="pt_BR">
+<!DOCTYPE TS><TS>
<context>
<name>@@@</name>
<message>
@@ -1036,7 +1034,6 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>Please complete the additional fields like the username, password and the bucket, and provide a filename for the OVF target.</source>
- <translatorcomment>Bucket = serviço de armazenamento no estilo Amazon S3</translatorcomment>
<translation type="obsolete">Por favor complete os campos adicionais, tais como nome de usuário, senha e o nome do &apos;bucket&apos;. Finalmente, forneça o nome do arquivo OVF de destino.</translation>
</message>
<message>
@@ -1123,7 +1120,6 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>&amp;Simple Storage System (S3)</source>
- <translatorcomment>O nome do serviço é este, não seria produtivo traduzi-lo.</translatorcomment>
<translation>&amp;Simple Storage System (S3)</translation>
</message>
</context>
@@ -1230,7 +1226,6 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>&amp;Bucket:</source>
- <translatorcomment>O termo em inglês é mais apropriado neste caso.</translatorcomment>
<translation type="obsolete">&amp;Bucket:</translation>
</message>
<message>
@@ -1251,7 +1246,6 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>Appliance</source>
- <translatorcomment>O termo em inglês é mais apropriado neste caso.</translatorcomment>
<translation type="obsolete">Appliance</translation>
</message>
<message>
@@ -1596,7 +1590,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>Extensions</source>
- <translation type="unfinished">Extensões</translation>
+ <translation>Extensões</translation>
</message>
</context>
<context>
@@ -1647,7 +1641,6 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>&amp;Auto show Dock and Menubar in fullscreen</source>
- <translatorcomment>Mostrar Dock e Barra de Menus &amp;automaticamente em tela cheia</translatorcomment>
<translation></translation>
</message>
<message>
@@ -1687,11 +1680,11 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>Reset host combination</source>
- <translation type="unfinished"></translation>
+ <translation>Resetar combinação de hospedeiro</translation>
</message>
<message>
<source>Resets the key combination used as the host combination in the VM window.</source>
- <translation type="unfinished"></translation>
+ <translation>Reseta a combinação de teclas utilizada para ativar funções na janela da VM.</translation>
</message>
</context>
<context>
@@ -1899,7 +1892,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>Networking</source>
- <translation type="unfinished"></translation>
+ <translation>Rede</translation>
</message>
</context>
<context>
@@ -2235,7 +2228,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>None</source>
- <translation type="unfinished">Nenhum</translation>
+ <translation>Nenhum</translation>
</message>
</context>
<context>
@@ -2305,7 +2298,6 @@ p, li { white-space: pre-wrap; }
<name>UIImportApplianceWzdPage1</name>
<message>
<source>Select an appliance to import</source>
- <translatorcomment>O termo em inglês é mais apropriado neste caso.</translatorcomment>
<translation>Selecione um appliance para importar</translation>
</message>
<message>
@@ -3813,7 +3805,6 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>&amp;Passthrough</source>
- <translatorcomment>é mais simples explicar o passthrough do que criar uma tradução sem sentido.</translatorcomment>
<translation>&amp;Passthrough</translation>
</message>
<message>
@@ -4244,7 +4235,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>USB 2.0 is currently enabled for this virtual machine. However this requires the &lt;b&gt;%1&lt;/b&gt; to be installed. Please install the Extension Pack from the VirtualBox download site. After this you will be able to re-enable USB 2.0. It will be disabled in the meantime unless you cancel the current settings changes.</source>
- <translation type="unfinished"></translation>
+ <translation>USB 2.0 está habilitado para esta máquina virtual, mas para esta funcionalidade é necessário instalar &lt;b&gt;%1&lt;/b&gt;. Instale o Pacote de Extensão a partir do site do VirtualBox. Após instalar este componente, você poderá habilitar novamente o suporte a USB 2.0. Por enquanto, o suporte a USB 2.0 será desligado, a menos que você cancele as mudanças atuais.</translation>
</message>
</context>
<context>
@@ -6362,12 +6353,10 @@ Versão %1</translation>
</message>
<message>
<source>Session I&amp;nformation Dialog</source>
- <translatorcomment>A tradução precisa ser curta e concisa para este item.</translatorcomment>
<translation type="obsolete">I&amp;nformações sobre a Sessão</translation>
</message>
<message>
<source>Show Session Information Dialog</source>
- <translatorcomment>Tradução precisa ser curta e concisa.</translatorcomment>
<translation type="obsolete">Exibe Informações Sobre a Sessão</translation>
</message>
<message>
@@ -6521,7 +6510,6 @@ Versão %1</translation>
</message>
<message>
<source>Show Monitor Preview</source>
- <translatorcomment>Neste caso, o termo em inglês é mais coerente.</translatorcomment>
<translation type="obsolete">Exibir Preview do Monitor</translation>
</message>
<message>
@@ -8025,7 +8013,6 @@ Versão %1</translation>
<message>
<source>Guru Meditation</source>
<comment>MachineState</comment>
- <translatorcomment>Nem precisa traduzir....</translatorcomment>
<translation>Guru Meditation</translation>
</message>
<message>
@@ -8181,46 +8168,34 @@ Versão %1</translation>
<comment>medium</comment>
<translation>Este disco rígido de base está indiretamente conectado através do seguinte disco rígido diferencial:</translation>
</message>
- <message numerus="yes">
+ <message>
<source>%n year(s)</source>
- <translation>
- <numerusform>%n ano(s)</numerusform>
- <numerusform>%n anos</numerusform>
+ <translation>%n anos
</translation>
</message>
- <message numerus="yes">
+ <message>
<source>%n month(s)</source>
- <translation>
- <numerusform>%n mês(meses)</numerusform>
- <numerusform>%n meses</numerusform>
+ <translation>%n meses
</translation>
</message>
- <message numerus="yes">
+ <message>
<source>%n day(s)</source>
- <translation>
- <numerusform>%n dia(s)</numerusform>
- <numerusform>%n dias</numerusform>
+ <translation>%n dias
</translation>
</message>
- <message numerus="yes">
+ <message>
<source>%n hour(s)</source>
- <translation>
- <numerusform>%n hora(s)</numerusform>
- <numerusform>%n horas</numerusform>
+ <translation>%n horas
</translation>
</message>
- <message numerus="yes">
+ <message>
<source>%n minute(s)</source>
- <translation>
- <numerusform>%n minuto(s)</numerusform>
- <numerusform>%n minuto(s)</numerusform>
+ <translation>%n minuto(s)
</translation>
</message>
- <message numerus="yes">
+ <message>
<source>%n second(s)</source>
- <translation>
- <numerusform>%n segundo(s)</numerusform>
- <numerusform>%n segundos</numerusform>
+ <translation>%n segundos
</translation>
</message>
<message>
@@ -8459,7 +8434,7 @@ Versão %1</translation>
</message>
<message>
<source>&apos;%1&apos; is an invalid host-combination code-sequence.</source>
- <translation type="unfinished"></translation>
+ <translation>&apos;%1&apos; é uma combinação de teclas de hospedeiro inválida.</translation>
</message>
</context>
<context>
@@ -10596,11 +10571,9 @@ to the system default language.&lt;/qt&gt;
<source>&lt;p&gt;The VirtualBox Guest Additions do not appear to be available on this virtual machine, and shared folders cannot be used without them. To use shared folders inside the virtual machine, please install the Guest Additions if they are not installed, or re-install them if they are not working correctly, by selecting &lt;b&gt;Install Guest Additions&lt;/b&gt; from the &lt;b&gt;Machine&lt;/b&gt; menu. If they are installed but the machine is not yet fully started then shared folders will be available once it is.&lt;/p&gt;</source>
<translation type="obsolete">&lt;p&gt;Os Adicionais para Convidado não estão disponíveis nesta máquina virtual, e portanto não é possível utilizar o recurso de pastas compartilhadas. Para utilizar pastas compartilhadas dentro da máquina virtual, instale os Adicionais para Convidado, ou instale-os novamente caso não estejam funcionando corretamente. Para fazer isto, selecione a opção &lt;b&gt;Instalar Adicionais para Convidado&lt;/b&gt; no menu &lt;b&gt;Máquina&lt;/b&gt;. Caso já esteja instalado mas a máquina esteja em processo de inicialização, aguarde até que esteja totalmente ativa e a opção de pastas compartilhadas estará disponível.&lt;/p&gt;</translation>
</message>
- <message numerus="yes">
+ <message>
<source>&lt;p&gt;The virtual machine(s) &lt;b&gt;%1&lt;/b&gt; are currently in a saved state.&lt;/p&gt;&lt;p&gt;If you continue the runtime state of the exported machine(s) will be discarded. Note that the existing machine(s) are not changed.&lt;/p&gt;</source>
- <translation>
- <numerusform>&lt;p&gt;A máquina virtual &lt;b&gt;%1&lt;/b&gt; possui estado de execução salvo. &lt;/p&gt;&lt;p&gt;Se você continuar, o estado atual desta máquina será descartado. A máquina existente não será afetada.&lt;/p&gt;</numerusform>
- <numerusform>&lt;p&gt;As máquinas virtuais &lt;b&gt;%1&lt;/b&gt; possuem estado de execução salvo. &lt;/p&gt;&lt;p&gt;Se você continuar, o estado atual de execução destas máquinas será descartado. As máquinas existentes não serão afetadas.&lt;/p&gt;</numerusform>
+ <translation>&lt;p&gt;As máquinas virtuais &lt;b&gt;%1&lt;/b&gt; possuem estado de execução salvo. &lt;/p&gt;&lt;p&gt;Se você continuar, o estado atual de execução destas máquinas será descartado. As máquinas existentes não serão afetadas.&lt;/p&gt;
</translation>
</message>
<message>
@@ -10721,16 +10694,12 @@ to the system default language.&lt;/qt&gt;
<translation>O pacote de extensão &lt;br&gt;&lt;nobr&gt;&lt;b&gt;%1&lt;/b&gt;&lt;nobr&gt;&lt;br&gt; foi instalado com sucesso.</translation>
</message>
<message>
- <source>Deletion of all files belonging to the VM is currently disabled on Windows/x64 to prevent a crash. That will be fixed in the next release.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>&lt;p&gt;Cannot create the machine folder &lt;b&gt;%1&lt;/b&gt; in the parent folder &lt;nobr&gt;&lt;b&gt;%2&lt;/b&gt;.&lt;/nobr&gt;&lt;/p&gt;&lt;p&gt;Please check that the parent really exists and that you have permissions to create the machine folder.&lt;/p&gt;</source>
- <translation type="unfinished"></translation>
+ <translation>&lt;p&gt;Não foi possível criar a pasta da máquina &lt;b&gt;%1&lt;/b&gt; em &lt;nobr&gt;&lt;b&gt;%2&lt;/b&gt;.&lt;/nobr&gt;&lt;/p&gt;&lt;p&gt;Verifique se a pasta de destino realmente existe e que você tem permissões para criar a pasta da máquina neste local.&lt;/p&gt;</translation>
</message>
<message>
<source>&lt;p&gt;USB 2.0 is currently enabled for this virtual machine. However this requires the &lt;b&gt;&lt;nobr&gt;%1&lt;/nobr&gt;&lt;/b&gt; to be installed.&lt;/p&gt;&lt;p&gt;Please install the Extension Pack from the VirtualBox download site. After this you will be able to re-enable USB 2.0. It will be disabled in the meantime unless you cancel the current settings changes.&lt;/p&gt;</source>
- <translation type="unfinished"></translation>
+ <translation>&lt;p&gt;USB 2.0 está habilitado para esta máquina virtual, mas para esta funcionalidade é necessário instalar &lt;b&gt;&lt;nobr&gt;%1&lt;/nobr&gt;&lt;/b&gt;.&lt;/p&gt;&lt;p&gt; Instale o Pacote de Extensão a partir do site do VirtualBox. Após instalar este componente, você poderá habilitar novamente o suporte a USB 2.0. Por enquanto, o suporte a USB 2.0 será desligado, a menos que você cancele as mudanças atuais.&lt;/p&gt;</translation>
</message>
</context>
<context>
@@ -11689,32 +11658,24 @@ para acessá-lo de um sistema operacional Linux. Este recurso requer a instalaç
<source> (%1)</source>
<translation> (%1)</translation>
</message>
- <message numerus="yes">
+ <message>
<source> (%n day(s) ago)</source>
- <translation type="obsolete">
- <numerusform> (%n dia atrás)</numerusform>
- <numerusform> (%n dias atrás)</numerusform>
+ <translation type="obsolete"> (%n dias atrás)
</translation>
</message>
- <message numerus="yes">
+ <message>
<source> (%n hour(s) ago)</source>
- <translation type="obsolete">
- <numerusform> (%n hora atrás)</numerusform>
- <numerusform> (%n horas atrás)</numerusform>
+ <translation type="obsolete"> (%n horas atrás)
</translation>
</message>
- <message numerus="yes">
+ <message>
<source> (%n minute(s) ago)</source>
- <translation type="obsolete">
- <numerusform> (%n minuto atrás)</numerusform>
- <numerusform> (%n minutos atrás)</numerusform>
+ <translation type="obsolete"> (%n minutos atrás)
</translation>
</message>
- <message numerus="yes">
+ <message>
<source> (%n second(s) ago)</source>
- <translation type="obsolete">
- <numerusform> (%n segundo atrás)</numerusform>
- <numerusform> (%n segundos atrás)</numerusform>
+ <translation type="obsolete"> (%n segundos atrás)
</translation>
</message>
<message>
@@ -11787,11 +11748,9 @@ para acessá-lo de um sistema operacional Linux. Este recurso requer a instalaç
<source>Cancel</source>
<translation type="obsolete">Cancelar</translation>
</message>
- <message numerus="yes">
+ <message>
<source>Warning: You are taking a snapshot of a running machine which has %n immutable image(s) attached to it. As long as you are working from this snapshot the immutable image(s) will not be reset to avoid loss of data.</source>
- <translation>
- <numerusform>Aviso: Você está criando um snapshot de uma máquina em execução que possui %n imagem imutável associada a ela. Enquanto você estiver trabalhando a partir deste snapshot, a imagem imutável não será reestabelecida para evitar perda de dados.</numerusform>
- <numerusform>Aviso: Você está criando um snapshot de uma máquina em execução que possui %n imagens imutáveis associadas a ela. Enquanto você estiver trabalhando a partir deste snapshot, as imagens imutáveis não serão reestabelecidas para evitar perda de dados.</numerusform>
+ <translation>Aviso: Você está criando um snapshot de uma máquina em execução que possui %n imagens imutáveis associadas a ela. Enquanto você estiver trabalhando a partir deste snapshot, as imagens imutáveis não serão reestabelecidas para evitar perda de dados.
</translation>
</message>
</context>
diff --git a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_ru.ts b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_ru.ts
index f5cba617b..f96d1cd94 100644
--- a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_ru.ts
+++ b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_ru.ts
@@ -8890,6 +8890,26 @@ p, li { white-space: pre-wrap; }
<source>&lt;p&gt;USB 2.0 is currently enabled for this virtual machine. However this requires the &lt;b&gt;&lt;nobr&gt;%1&lt;/nobr&gt;&lt;/b&gt; to be installed.&lt;/p&gt;&lt;p&gt;Please install the Extension Pack from the VirtualBox download site. After this you will be able to re-enable USB 2.0. It will be disabled in the meantime unless you cancel the current settings changes.&lt;/p&gt;</source>
<translation>&lt;p&gt;В настоящий момент, поддержка USB 2.0 включена для данной виртуальной машины. Однако, для того, чтобы она работала верно, необходимо установить плагин &lt;b&gt;&lt;nobr&gt;%1&lt;/nobr&gt;&lt;/b&gt;.&lt;/p&gt;&lt;p&gt;Пожалуйста, установите плагин, предварительно загрузив его с сайта поддержки VirtualBox. После этого Вы сможете повторно активировать поддержку USB 2.0. До установки плагина поддержка USB 2.0 будет автоматически отключаться по принятии настроек данной машины.&lt;/p&gt;</translation>
</message>
+ <message>
+ <source>Could not load the Host USB Proxy Service (VERR_FILE_NOT_FOUND). The service might not be installed on the host computer</source>
+ <translation type="unfinished">Не удалось загрузить USB Proxy службу хоста (VERR_FILE_NOT_FOUND). Возможно, данная служба не установлена на данном компьютере</translation>
+ </message>
+ <message>
+ <source>VirtualBox is not currently allowed to access USB devices. You can change this by adding your user to the &apos;vboxusers&apos; group. Please see the user manual for a more detailed explanation</source>
+ <translation type="unfinished">В данный момент VirtualBox не может использовать устройства USB. Вы можете исправить данную проблему, добавив текущего пользователя в группу &apos;vboxusers&apos;. Для получения более детальных объяснений следуйте указаниям руководства пользователя</translation>
+ </message>
+ <message>
+ <source>VirtualBox is not currently allowed to access USB devices. You can change this by allowing your user to access the &apos;usbfs&apos; folder and files. Please see the user manual for a more detailed explanation</source>
+ <translation type="unfinished">В данный момент VirtualBox не может использовать устройства USB. Вы можете исправить данную проблему, открыв текущему пользователю доступ к файлам и папкам &apos;usbfs&apos;. Для получения более детальных объяснений следуйте указаниям руководства пользователя</translation>
+ </message>
+ <message>
+ <source>The USB Proxy Service has not yet been ported to this host</source>
+ <translation type="unfinished">Служба USB Proxy ещё не была портирована на данный хост</translation>
+ </message>
+ <message>
+ <source>Could not load the Host USB Proxy service</source>
+ <translation type="unfinished">Не удалось загрузить USB Proxy службу хоста</translation>
+ </message>
</context>
<context>
<name>VBoxRegistrationDlg</name>
diff --git a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_uk.ts b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_uk.ts
index 448cd07d8..3dcd38971 100644
--- a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_uk.ts
+++ b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_uk.ts
@@ -64,7 +64,7 @@
</message>
<message>
<source>Please try reinstalling VirtualBox.</source>
- <translation>Це може допомогти перевстановити VirtualBox.</translation>
+ <translation>Будь ласка, перевстановіть VirtualBox.</translation>
</message>
<message>
<source>This error means that the kernel driver was either not able to allocate enough memory or that some mapping operation failed.&lt;br/&gt;&lt;br/&gt;There are known problems with Linux 2.6.29. If you are running such a kernel, please edit /usr/src/vboxdrv-*/Makefile and enable &lt;i&gt;VBOX_USE_INSERT_PAGE = 1&lt;/i&gt;. After that, re-compile the kernel module by executing&lt;br/&gt;&lt;br/&gt; &lt;font color=blue&gt;&apos;/etc/init.d/vboxdrv setup&apos;&lt;/font&gt;&lt;br/&gt;&lt;br/&gt;as root.</source>
@@ -304,7 +304,7 @@
</message>
<message>
<source>Show Session Information Dialog</source>
- <translation>Показати інформацію про сеанс</translation>
+ <translation>Показувати інформацію про сеанс</translation>
</message>
<message>
<source>&amp;Pause</source>
@@ -388,7 +388,7 @@
</message>
<message>
<source>Mount the Guest Additions installation image</source>
- <translation>Змонтувати гостьові доповнення з установчого образа</translation>
+ <translation>Змонтувати гостьові доповнення з установчого образу</translation>
</message>
<message>
<source>De&amp;bug</source>
@@ -826,11 +826,11 @@
</message>
<message>
<source>Downloading the VirtualBox Guest Additions CD image from &lt;nobr&gt;&lt;b&gt;%1&lt;/b&gt;...&lt;/nobr&gt;</source>
- <translation type="obsolete">Звантаження образа CD віртуальних доповнень VirtualBox з &lt;nobr&gt;&lt;b&gt;%1&lt;/b&gt;...&lt;/nobr&gt;</translation>
+ <translation type="obsolete">Звантаження образу CD віртуальних доповнень VirtualBox з &lt;nobr&gt;&lt;b&gt;%1&lt;/b&gt;...&lt;/nobr&gt;</translation>
</message>
<message>
<source>Cancel the VirtualBox Guest Additions CD image download</source>
- <translation type="obsolete">Скасувати звантаження образа CD гостьових доповнень VirtualBox</translation>
+ <translation type="obsolete">Скасувати звантаження образу CD гостьових доповнень VirtualBox</translation>
</message>
<message>
<source>&lt;p&gt;Failed to save the downloaded file as &lt;nobr&gt;&lt;b&gt;%1&lt;/b&gt;.&lt;/nobr&gt;&lt;/p&gt;</source>
@@ -884,15 +884,15 @@
</message>
<message>
<source>Exporting Appliance ...</source>
- <translation type="obsolete">Експорт образа віртуальної машини ...</translation>
+ <translation type="obsolete">Експорт образу віртуальної машини ...</translation>
</message>
<message>
<source>Appliance Export Wizard</source>
- <translation>Майстер експорту образа віртуальної машини</translation>
+ <translation>Майстер експорту образу віртуальної машини</translation>
</message>
<message>
<source>Welcome to the Appliance Export Wizard!</source>
- <translation type="obsolete">Ласкаво просимо до майстера експорту образа віртуальної машини!</translation>
+ <translation type="obsolete">Ласкаво просимо до майстера експорту образу віртуальної машини!</translation>
</message>
<message>
<source>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;
@@ -906,7 +906,7 @@ p, li { white-space: pre-wrap; }
&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;
p, li { white-space: pre-wrap; }
&lt;/style&gt;&lt;/head&gt;&lt;body&gt;
-&lt;p style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;Цей майстер допоможе вам з експортом образа віртуальної машини. &lt;/p&gt;
+&lt;p style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;Цей майстер допоможе вам з експортом образу віртуальної машини. &lt;/p&gt;
&lt;p style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;Натисніть кнопку &lt;span style=&quot; font-weight:600;&quot;&gt;Далі&lt;/span&gt;, щоб перейти до наступної сторінки майстра і &lt;span style=&quot; font-weight:600;&quot;&gt;Назад&lt;/span&gt;, щоб повернутись до попередньої сторінки.&lt;/p&gt;
&lt;p style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;Будь ласка, виберіть віртуальні машини, які слід експортувати в образ віртуальної машини. Ви можете вибрати більше одного. Будь ласка, майте на увазі, що ті віртуальні машини потрібно вимкнути перед експортом.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
</message>
@@ -987,11 +987,11 @@ p, li { white-space: pre-wrap; }
<name>UIExportApplianceWzdPage1</name>
<message>
<source>Welcome to the Appliance Export Wizard!</source>
- <translation>Ласкаво просимо до майстра експорту образа віртуальної машини!</translation>
+ <translation>Ласкаво просимо до майстра експорту образу віртуальної машини!</translation>
</message>
<message>
<source>&lt;p&gt;This wizard will guide you through the process of exporting an appliance.&lt;/p&gt;&lt;p&gt;%1&lt;/p&gt;&lt;p&gt;Please select the virtual machines that should be added to the appliance. You can select more than one. Please note that these machines have to be turned off before they can be exported.&lt;/p&gt;</source>
- <translation>&lt;p&gt;Цей майстердопоможе вам пройти процес експорту образу віртуальної машини.&lt;/p&gt;&lt;p&gt;%1&lt;/p&gt;&lt;p&gt;Будь ласка, виберіть віртуальні машини, які потрібно долучити до образу. Ви можете вибрати кілька. Будь ласка, майте на увазі, ця машина повинна бути вимкненою перш аніж ви спробуєте її експортувати.&lt;/p&gt;</translation>
+ <translation>&lt;p&gt;Цей майстер допоможе вам пройти процес експортування образу віртуальної машини.&lt;/p&gt;&lt;p&gt;%1&lt;/p&gt;&lt;p&gt;Будь ласка, виберіть віртуальні машини, які потрібно долучити до образу. Ви можете вибрати кілька. Будь ласка, майте на увазі, ця машина повинна бути вимкненою перш аніж ви спробуєте її експортувати.&lt;/p&gt;</translation>
</message>
</context>
<context>
@@ -1176,11 +1176,11 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>Exporting Appliance ...</source>
- <translation>Експорт образа віртуальної машини ...</translation>
+ <translation>Експорт образу віртуальної машини ...</translation>
</message>
<message>
<source>Here you can change additional configuration values of the selected virtual machines. You can modify most of the properties shown by double-clicking on the items.</source>
- <translation>Тут ви можете змінити додаткові значення налаштування вибраної віртуальної машини. Ви можете змінити більшість показаних властивостей подвійним кліком по пунктах.</translation>
+ <translation>Тут ви можете змінити додаткові значення налаштування вибраної віртуальної машини. Ви можете змінити більшість показаних властивостей подвійним натискааням по пунктах.</translation>
</message>
</context>
<context>
@@ -1227,7 +1227,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>&amp;Image File</source>
- <translation type="obsolete">&amp;Файл образа</translation>
+ <translation type="obsolete">&amp;Файл образу</translation>
</message>
<message>
<source>Select Installation Media</source>
@@ -1325,7 +1325,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>&lt;p&gt;You have started a newly created virtual machine for the first time. This wizard will help you to perform the steps necessary for booting an operating system of your choice on the virtual machine.&lt;/p&gt;&lt;p&gt;Note that you will not be able to install an operating system into this virtual machine right now because you did not attach any hard disk to it. If this is not what you want, you can cancel the execution of this wizard, select &lt;b&gt;Settings&lt;/b&gt; from the &lt;b&gt;Machine&lt;/b&gt; menu of the main VirtualBox window to access the settings dialog of this machine and change the hard disk configuration.&lt;/p&gt;&lt;p&gt;%1&lt;/p&gt;</source>
- <translation>&lt;p&gt;Ви запустили новостворену віртуальну машину вперше. Цей майстер допоможе вам пройти потрібні кроки, щоб завантажити операційну систему за вашими вподобаннями у віртуальну машину.&lt;/p&gt;&lt;p&gt;Майте на увазі, ви не зможете встановити яку-будь операційну систему у цю віртуальну машину зараз, оскільки ви не під&apos;єднали до неї жодного твердого диска. Якщо це не те, що ви бажаєте, то можете вимкнути майстра, виберіть &lt;b&gt;Налаштування&lt;/b&gt; у меню &lt;b&gt;Машина&lt;/b&gt; головного меню вікна VirtualBox, щоб дозволити діалог налаштувань цієї машини і змінити налаштування твердого диска.&lt;/p&gt;&lt;p&gt;%1&lt;/p&gt;</translation>
+ <translation>&lt;p&gt;Ви запустили новостворену віртуальну машину вперше. Цей майстер допоможе вам пройти потрібні кроки, щоб завантажити операційну систему за вашими вподобаннями у віртуальну машину.&lt;/p&gt;&lt;p&gt;Майте на увазі, ви не зможете встановити будь-яку операційну систему у цю віртуальну машину зараз, оскільки ви не під&apos;єднали до неї жодного жорсткого диска. Якщо це не те, що ви бажаєте, то можете вимкнути майстра, виберіть &lt;b&gt;Налаштування&lt;/b&gt; у меню &lt;b&gt;Машина&lt;/b&gt; головного меню вікна VirtualBox, щоб дозволити діалог налаштувань цієї машини і змінити налаштування жорсткого диска.&lt;/p&gt;&lt;p&gt;%1&lt;/p&gt;</translation>
</message>
</context>
<context>
@@ -1359,7 +1359,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>&lt;p&gt;If the above is correct, press the &lt;b&gt;Finish&lt;/b&gt; button. Once you press it, the selected media will be temporarily mounted on the virtual machine and the machine will start execution.&lt;/p&gt;&lt;p&gt;Please note that when you close the virtual machine, the specified media will be automatically unmounted and the boot device will be set back to the first hard disk.&lt;/p&gt;&lt;p&gt;Depending on the type of the setup program, you may need to manually unmount (eject) the media after the setup program reboots the virtual machine, to prevent the installation process from starting again. You can do this by selecting the corresponding &lt;b&gt;Unmount...&lt;/b&gt; action in the &lt;b&gt;Devices&lt;/b&gt; menu.&lt;/p&gt;</source>
- <translation>&lt;p&gt;Якщо вищевказане правильне, натисніть кнопку &lt;b&gt;Закінчити&lt;/b&gt;. Після натиснення, вибрані носії будуть тимчасово змонтовані на віртуальну машину, яка відразу ж розпочне свою роботу.&lt;/p&gt;&lt;p&gt;Будь ласка, майте на увазі, коли ви закриєте віртуальну машину, вказані носії будуть демонтовані та пристрій завантаження буде вказано до першого твердого диска.&lt;/p&gt;&lt;p&gt;Залежно від типу програми встановлення, вам, можливо, буде потрібно вручну демонтувати(вийняти) носій після перезапуску машини цією програмою, щоб запобігти встановленню з самого початку ще раз. Ви можете це зробити, вибравши відповідну дію &lt;b&gt;Демонтувати...&lt;/b&gt; у меню &lt;b&gt;Пристрої&lt;/b&gt;.&lt;/p&gt;</translation>
+ <translation>&lt;p&gt;Якщо вищевказане правильне, натисніть кнопку &lt;b&gt;Закінчити&lt;/b&gt;. Після натиснення, вибрані носії будуть тимчасово змонтовані на віртуальну машину, яка відразу ж розпочне свою роботу.&lt;/p&gt;&lt;p&gt;Будь ласка, майте на увазі, коли ви закриєте віртуальну машину, вказані носії будуть демонтовані та пристрій завантаження буде вказано до першого жорсткого диска.&lt;/p&gt;&lt;p&gt;Залежно від типу програми встановлення, вам, можливо, буде потрібно вручну демонтувати(вийняти) носій після перезапуску машини цією програмою, щоб запобігти встановленню з самого початку ще раз. Ви можете це зробити, вибравши відповідну дію &lt;b&gt;Демонтувати...&lt;/b&gt; у меню &lt;b&gt;Пристрої&lt;/b&gt;.&lt;/p&gt;</translation>
</message>
<message>
<source>&lt;p&gt;If the above is correct, press the &lt;b&gt;Finish&lt;/b&gt; button. Once you press it, the selected media will be mounted on the virtual machine and the machine will start execution.&lt;/p&gt;</source>
@@ -1459,7 +1459,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>Extensions</source>
- <translation type="unfinished">Розширення</translation>
+ <translation>Розширення</translation>
</message>
</context>
<context>
@@ -1494,7 +1494,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>&amp;Show System Tray Icon</source>
- <translation>&amp;Показати піктограму системного лотка</translation>
+ <translation>&amp;Показувати піктограму системного лотка</translation>
</message>
<message>
<source>When checked, the Dock Icon will reflect the VM window content in realtime.</source>
@@ -1545,11 +1545,11 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>Reset host combination</source>
- <translation type="unfinished"></translation>
+ <translation>Скинути головну комбінацію</translation>
</message>
<message>
<source>Resets the key combination used as the host combination in the VM window.</source>
- <translation type="unfinished"></translation>
+ <translation>Скидає комбінацію клавіш, яка використовуються як комбінація у вікні віртуальної машини.</translation>
</message>
</context>
<context>
@@ -1757,7 +1757,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>Networking</source>
- <translation type="unfinished"></translation>
+ <translation>Засоби мережі</translation>
</message>
</context>
<context>
@@ -2093,7 +2093,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>None</source>
- <translation type="unfinished"></translation>
+ <translation>Немає</translation>
</message>
</context>
<context>
@@ -2108,11 +2108,11 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>Appliance Import Wizard</source>
- <translation>Майстер імпотру образів віртуальної машини</translation>
+ <translation>Майстер імпотрування образів віртуальної машини</translation>
</message>
<message>
<source>Welcome to the Appliance Import Wizard!</source>
- <translation type="obsolete">Ласкаво просимо до майстра імпорту образа віртуальної машини!</translation>
+ <translation type="obsolete">Ласкаво просимо до майстра імпорту образу віртуальної машини!</translation>
</message>
<message>
<source>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;
@@ -2128,7 +2128,7 @@ p, li { white-space: pre-wrap; }
&lt;/style&gt;&lt;/head&gt;&lt;body&gt;
&lt;p style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;Цей майстер інструтуруватиме вас через імпорт образів віртуальної машини. &lt;/p&gt;
&lt;p style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;Натисніть кнопку &lt;span style=&quot; font-weight:600;&quot;&gt;Далі&lt;/span&gt;, щоб перейти до наступної сторінки майстра та кнопку &lt;span style=&quot; font-weight:600;&quot;&gt;Back&lt;/span&gt;, щоб повернутись на попередню сторінку.&lt;/p&gt;
-&lt;p style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;Для того, щоб імпортувати образ віртуальної машини, ви спочатку повинні вибрати файл опису образа. Цей VirtualBox підтримує відкритий віртуалізаційний формат (OVF). Щоб продовжити, виберіть файл знизу для імпорту:&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
+&lt;p style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;Для того, щоб імпортувати образ віртуальної машини, ви спочатку повинні вибрати файл опису образу. Цей VirtualBox підтримує відкритий віртуалізаційний формат (OVF). Щоб продовжити, виберіть файл знизу для імпорту:&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
</message>
<message>
<source>&lt; &amp;Back</source>
@@ -2144,7 +2144,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>Appliance Import Settings</source>
- <translation type="obsolete">Налаштування імпорту образа віртуальної машини</translation>
+ <translation type="obsolete">Налаштування імпорту образу віртуальної машини</translation>
</message>
<message>
<source>These are the virtual machines contained in the appliance and the suggested settings of the imported VirtualBox machines. You can change many of the properties shown by double-clicking on the items and disable others using the check boxes below.</source>
@@ -2171,7 +2171,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>Welcome to the Appliance Import Wizard!</source>
- <translation>Ласкаво просимо до майстра імпорту образа віртуальної машини!</translation>
+ <translation>Ласкаво просимо до майстра імпорту образу віртуальної машини!</translation>
</message>
<message>
<source>&lt;p&gt;This wizard will guide you through importing an appliance.&lt;/p&gt;&lt;p&gt;%1&lt;/p&gt;&lt;p&gt;VirtualBox currently supports importing appliances saved in the Open Virtualization Format (OVF). To continue, select the file to import below:&lt;/p&gt;</source>
@@ -2182,11 +2182,11 @@ p, li { white-space: pre-wrap; }
<name>UIImportApplianceWzdPage2</name>
<message>
<source>These are the virtual machines contained in the appliance and the suggested settings of the imported VirtualBox machines. You can change many of the properties shown by double-clicking on the items and disable others using the check boxes below.</source>
- <translation>Це віртуальні машини, як описано в образі віртуальної машини з їхнім рекомендованим відображенням для імпорту до VirtualBox. Ви можете змінити багато з показаних властивостей, натиснувши подвійним кліком на пункти, і вимкнути інші, використовуючи мітки нижче.</translation>
+ <translation>Це віртуальні машини, як описано в образі віртуальної машини з їхнім рекомендованим відображенням для імпорту до VirtualBox. Ви можете змінити багато з показаних властивостей, натиснувши подвійним натисканням на пункти, і вимкнути інші, використовуючи мітки нижче.</translation>
</message>
<message>
<source>Appliance Import Settings</source>
- <translation>Налаштування імпорту образа віртуальної машини</translation>
+ <translation>Налаштування імпорту образу віртуальної машини</translation>
</message>
</context>
<context>
@@ -2229,7 +2229,7 @@ p, li { white-space: pre-wrap; }
<message>
<source>&lt;p style=&apos;white-space:pre&apos;&gt;&lt;nobr&gt;Indicates the activity of the virtual hard disks:&lt;/nobr&gt;%1&lt;/p&gt;</source>
<comment>HDD tooltip</comment>
- <translation>&lt;p style=&apos;white-space:pre&apos;&gt;&lt;nobr&gt;Індикатори активності віртуальних твердих дисків:&lt;/nobr&gt;%1&lt;/p&gt;</translation>
+ <translation>&lt;p style=&apos;white-space:pre&apos;&gt;&lt;nobr&gt;Індикатори активності віртуальних жорстких дисків:&lt;/nobr&gt;%1&lt;/p&gt;</translation>
</message>
<message>
<source>&lt;p style=&apos;white-space:pre&apos;&gt;&lt;nobr&gt;Indicates the activity of the CD/DVD devices:&lt;/nobr&gt;%1&lt;/p&gt;</source>
@@ -2440,7 +2440,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>Extended Features:</source>
- <translation>Розширені властивості:</translation>
+ <translation>Розширені функції:</translation>
</message>
<message>
<source>When checked, the virtual machine will be given access to the 3D graphics capabilities available on the host.</source>
@@ -2504,7 +2504,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>Mo&amp;nitor Count:</source>
- <translation>&amp;Число екранів:</translation>
+ <translation>&amp;Кількість екранів:</translation>
</message>
<message>
<source>Controls the amount of virtual monitors provided to the virtual machine.</source>
@@ -2539,7 +2539,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>&amp;Basic</source>
- <translation>&amp;Основний</translation>
+ <translation>&amp;Основне</translation>
</message>
<message>
<source>Identification</source>
@@ -2583,7 +2583,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>&amp;Advanced</source>
- <translation>&amp;Вдосконалений</translation>
+ <translation>&amp;Додатково</translation>
</message>
<message>
<source>Boo&amp;t Order:</source>
@@ -2731,7 +2731,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>Show In &amp;Fullscreen/Seamless</source>
- <translation>&amp;Показати в повноекранному/ціловикроєному</translation>
+ <translation>&amp;Показувати в повноекранному/ціловикроєному</translation>
</message>
<message>
<source>If checked, show the Mini ToolBar at the top of the screen, rather than in its default position at the bottom of the screen.</source>
@@ -2739,7 +2739,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>Show At &amp;Top Of Screen</source>
- <translation>Показати &amp;зверху екрана</translation>
+ <translation>Показувати &amp;зверху екрана</translation>
</message>
</context>
<context>
@@ -2883,7 +2883,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>A&amp;dvanced</source>
- <translation>В&amp;досконалений</translation>
+ <translation>&amp;Додатково</translation>
</message>
<message>
<source>Shows or hides additional network adapter options.</source>
@@ -3090,7 +3090,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>Lists all shared folders accessible to this machine. Use &apos;net use x: \\vboxsvr\share&apos; to access a shared folder named &lt;i&gt;share&lt;/i&gt; from a DOS-like OS, or &apos;mount -t vboxsf share mount_point&apos; to access it from a Linux OS. This feature requires Guest Additions.</source>
- <translation>Показує список всіх спільних тек, доступ до яких можливий з цього комп’ютера. Скористайтеся командою &apos;net use x: \\vboxsvr\share&apos; DOS-подібної операційної системи або &apos;mount -t vboxsf share mount_point&apos; Linux-подібної, щоб отримати доступ до спільної теки &lt;i&gt;share&lt;/i&gt;. Для функціонування цієї можливості потрібні гостьові доповнення.</translation>
+ <translation>Показує список всіх спільних тек, доступ до яких можливий з цього комп&apos;ютера. Скористайтеся командою &apos;net use x: \\vboxsvr\share&apos; DOS-подібної операційної системи або &apos;mount -t vboxsf share mount_point&apos; Linux-подібної, щоб отримати доступ до спільної теки &lt;i&gt;share&lt;/i&gt;. Для працездатності цієї можливості потрібні гостьові доповнення.</translation>
</message>
<message>
<source>Name</source>
@@ -3181,7 +3181,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>If checked, this shared folder will be permanent.</source>
- <translation>Якщо це відмічено, ця сільна тека буде незмінною.</translation>
+ <translation>Якщо це відмічено, ця спільна тека буде незмінною.</translation>
</message>
</context>
<context>
@@ -3359,7 +3359,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>&lt;nobr&gt;Add&amp;nbsp;Hard&amp;nbsp;Disk&lt;/nobr&gt;</source>
- <translation>&lt;nobr&gt;Додати&amp;nbsp;твердий&amp;nbsp;диск&lt;/nobr&gt;</translation>
+ <translation>&lt;nobr&gt;Додати&amp;nbsp;жорсткий&amp;nbsp;диск&lt;/nobr&gt;</translation>
</message>
<message>
<source>&lt;nobr&gt;Add&amp;nbsp;CD/DVD&amp;nbsp;Device&lt;/nobr&gt;</source>
@@ -3371,7 +3371,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>No hard disk is selected for &lt;i&gt;%1&lt;/i&gt;.</source>
- <translation>Не вибрано твердий диск для &lt;i&gt;%1&lt;/i&gt;.</translation>
+ <translation>Не вибрано жорсткий диск для &lt;i&gt;%1&lt;/i&gt;.</translation>
</message>
<message>
<source>&lt;i&gt;%1&lt;/i&gt; uses a medium that is already attached to &lt;i&gt;%2&lt;/i&gt;.</source>
@@ -3407,7 +3407,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>Add Hard Disk</source>
- <translation>Додати твердий диск</translation>
+ <translation>Додати жорсткий диск</translation>
</message>
<message>
<source>Add CD/DVD Device</source>
@@ -3455,7 +3455,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>Hard &amp;Disk:</source>
- <translation>&amp;Твердий диск:</translation>
+ <translation>&amp;жорсткий диск:</translation>
</message>
<message>
<source>&amp;CD/DVD Device:</source>
@@ -3507,7 +3507,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>Selects the slot on the storage controller used by this attachment. The available slots depend on the type of the controller and other attachments on it.</source>
- <translation>Вибирає гніздо на контролері пам&apos;яті, яуий використовується цим долученням. Доступні гнізда залежать від типу контролера й інших долучень на ньому.</translation>
+ <translation>Вибирає гніздо на контролері пам&apos;яті, якй використовується цим під&apos;єднаням. Доступні гнізда залежать від типу контролера й інших під&apos;єднань на ньому.</translation>
</message>
<message>
<source>Selects the virtual disk image or the host drive used by this attachment.</source>
@@ -3595,11 +3595,11 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>Choose or create a virtual hard disk file. The virtual machine will see the data in the file as the contents of the virtual hard disk.</source>
- <translation>Вибрати або створити віртуальний файл твердого диска. Віртуальна машина покаже дані в файлі як вміст віртуального твердого диска.</translation>
+ <translation>Вибрати або створити віртуальний файл жорсткого диска. Віртуальна машина покаже дані в файлі як вміст віртуального жорсткого диска.</translation>
</message>
<message>
<source>Set up the virtual hard disk</source>
- <translation>Налаштувати віртуальний твердий диск</translation>
+ <translation>Налаштувати віртуальний жорсткий диск</translation>
</message>
<message>
<source>CD/DVD &amp;Drive:</source>
@@ -3627,11 +3627,11 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>Create a new hard disk...</source>
- <translation>Створити новий твердий диск…</translation>
+ <translation>Створити новий жорсткий диск…</translation>
</message>
<message>
<source>Choose a virtual hard disk file...</source>
- <translation>Вибрати файл віртуального твердого диска…</translation>
+ <translation>Вибрати файл віртуального жорсткого диска…</translation>
</message>
<message>
<source>Choose a virtual CD/DVD disk file...</source>
@@ -3961,7 +3961,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>USB 2.0 is currently enabled for this virtual machine. However this requires the &lt;b&gt;%1&lt;/b&gt; to be installed. Please install the Extension Pack from the VirtualBox download site. After this you will be able to re-enable USB 2.0. It will be disabled in the meantime unless you cancel the current settings changes.</source>
- <translation type="unfinished"></translation>
+ <translation>USB 2.0 уже ввімкнено для цієї віртуальної машини. Однак потрібно встановити &lt;b&gt;%1&lt;/b&gt;. Будь ласка, встановіть пакунок розширень із сайту звантажень VirtualBox. Після цього зможете перезапустити USB 2.0. Це буде вимкнено протягом скасування змін поточних налаштувань.</translation>
</message>
</context>
<context>
@@ -4081,11 +4081,11 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>Cancel the VirtualBox Guest Additions CD image download</source>
- <translation>Скасувати звантаження образа CD гостьових доповнень VirtualBox</translation>
+ <translation>Скасувати звантаження образу CD гостьових доповнень VirtualBox</translation>
</message>
<message>
<source>Downloading the VirtualBox Guest Additions CD image from &lt;nobr&gt;&lt;b&gt;%1&lt;/b&gt;...&lt;/nobr&gt;</source>
- <translation>Звантаження образа CD віртуальних доповнень VirtualBox з &lt;nobr&gt;&lt;b&gt;%1&lt;/b&gt;...&lt;/nobr&gt;</translation>
+ <translation>Звантаження образу CD віртуальних доповнень VirtualBox з &lt;nobr&gt;&lt;b&gt;%1&lt;/b&gt;...&lt;/nobr&gt;</translation>
</message>
</context>
<context>
@@ -4146,7 +4146,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>Select a file for the new hard disk image file</source>
- <translation type="obsolete">Виберіть файл для нового образа жорсткого диска</translation>
+ <translation type="obsolete">Виберіть файл для нового образу жорсткого диска</translation>
</message>
<message>
<source>&lt; &amp;Back</source>
@@ -4241,14 +4241,14 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>&lt;p&gt;This wizard will help you to create a new virtual hard disk for your virtual machine.&lt;/p&gt;&lt;p&gt;%1&lt;/p&gt;</source>
- <translation>&lt;p&gt;Цей майстер допоможе вам створити новий віртуальний твердий диск для вашої віртуальної машини.&lt;/p&gt;&lt;p&gt;%1&lt;/p&gt;</translation>
+ <translation>&lt;p&gt;Цей майстер допоможе вам створити новий віртуальний жорсткий диск для вашої віртуальної машини.&lt;/p&gt;&lt;p&gt;%1&lt;/p&gt;</translation>
</message>
</context>
<context>
<name>UINewHDWzdPage2</name>
<message>
<source>&lt;p&gt;Select the type of virtual hard disk you want to create.&lt;/p&gt;&lt;p&gt;A &lt;b&gt;dynamically expanding storage&lt;/b&gt; initially occupies a very small amount of space on your physical hard disk. It will grow dynamically (up to the size specified) as the Guest OS claims disk space.&lt;/p&gt;&lt;p&gt;A &lt;b&gt;fixed-size storage&lt;/b&gt; does not grow. It is stored in a file of approximately the same size as the size of the virtual hard disk. The creation of a fixed-size storage may take a long time depending on the storage size and the write performance of your harddisk.&lt;/p&gt;</source>
- <translation>&lt;p&gt;Виберіть тип віртуального твердого диска, який ви бажаєте створити.&lt;/p&gt;&lt;p&gt;&lt;b&gt;Динамічно розширна пам&apos;ять&lt;/b&gt; початково займає дуже малу величину місця на фізичному твердому диску. Розмір буде динамічно зростати (до вказаного розміру) до тих пір, поки гостьова операційна система може використовувати дисковий простір.&lt;/p&gt;&lt;p&gt;&lt;b&gt;Незмінної розмірності пам&apos;ять&lt;/b&gt; не збільшується. Він зберігається у файлі приблизно такого ж розміру, як розмір віртуального твердого диска. Створення незмінної розмірності пам&apos;яті може забрати багато часу, який залежить від розміру пам&apos;яті та швидкодії вашого твердого диска.&lt;/p&gt;</translation>
+ <translation>&lt;p&gt;Виберіть тип віртуального жорсткого диска, який ви бажаєте створити.&lt;/p&gt;&lt;p&gt;&lt;b&gt;Динамічно розширна пам&apos;ять&lt;/b&gt; початково займає дуже малу величину місця на фізичному жорсткому диску. Розмір буде динамічно зростати (до вказаного розміру) до тих пір, поки гостьова операційна система може використовувати дисковий простір.&lt;/p&gt;&lt;p&gt;&lt;b&gt;Незмінної розмірності пам&apos;ять&lt;/b&gt; не збільшується. Він зберігається у файлі приблизно такого ж розміру, як розмір віртуального жорсткого диска. Створення незмінної розмірності пам&apos;яті може забрати багато часу, який залежить від розміру пам&apos;яті та швидкодії вашого жорсткого диска.&lt;/p&gt;</translation>
</message>
<message>
<source>Storage Type</source>
@@ -4264,14 +4264,14 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>Hard Disk Storage Type</source>
- <translation>Тип пам&apos;яті твердого диска</translation>
+ <translation>Тип пам&apos;яті жорсткого диска</translation>
</message>
</context>
<context>
<name>UINewHDWzdPage3</name>
<message>
<source>&lt;p&gt;Press the &lt;b&gt;Select&lt;/b&gt; button to select the location of a file to store the hard disk data or type a file name in the entry field.&lt;/p&gt;</source>
- <translation>&lt;p&gt;Натисніть кнопку &lt;b&gt;Вибрати&lt;/b&gt;, щоб вибрати адресу файла для зберігання даних віртуального твердого диска або введіть назву файла у поле вводу.&lt;/p&gt;</translation>
+ <translation>&lt;p&gt;Натисніть кнопку &lt;b&gt;Вибрати&lt;/b&gt;, щоб вибрати адресу файла для зберігання даних віртуального жорсткого диска або введіть назву файла у поле вводу.&lt;/p&gt;</translation>
</message>
<message>
<source>&amp;Location</source>
@@ -4279,7 +4279,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>&lt;p&gt;Select the size of the virtual hard disk in megabytes. This size will be reported to the Guest OS as the maximum size of this hard disk.&lt;/p&gt;</source>
- <translation>&lt;p&gt;Виберіть розмір віртуального твердого диска у мегабайтах. Цей розмір буде вказаний гостьовій операційній системі як максимальний розмір твердого диска.&lt;/p&gt;</translation>
+ <translation>&lt;p&gt;Виберіть розмір віртуального жорсткого диска у мегабайтах. Цей розмір буде вказаний гостьовій операційній системі як максимальний розмір жорсткого диска.&lt;/p&gt;</translation>
</message>
<message>
<source>&amp;Size</source>
@@ -4291,11 +4291,11 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>Select a file for the new hard disk image file</source>
- <translation>Виберіть файл для нового образа твердого диска</translation>
+ <translation>Виберіть файл для нового образу жорсткого диска</translation>
</message>
<message>
<source>Hard disk images (*.vdi)</source>
- <translation>Образ твердого диска (*.vdi)</translation>
+ <translation>Образ жорсткого диска (*.vdi)</translation>
</message>
<message>
<source>&lt;nobr&gt;%1 (%2 B)&lt;/nobr&gt;</source>
@@ -4306,7 +4306,7 @@ p, li { white-space: pre-wrap; }
<name>UINewHDWzdPage4</name>
<message>
<source>You are going to create a new virtual hard disk with the following parameters:</source>
- <translation>Ви збираєтесь створити новий віртуальний твердий диск з такими параметрами:</translation>
+ <translation>Ви збираєтесь створити новий віртуальний жорсткий диск з такими параметрами:</translation>
</message>
<message>
<source>Summary</source>
@@ -4333,7 +4333,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>If the above settings are correct, press the &lt;b&gt;%1&lt;/b&gt; button. Once you press it, a new hard disk will be created.</source>
- <translation>Якщо налаштування вище коректні, натисніть &lt;b&gt;%1&lt;/b&gt;. Як тільки ви натиснете це, новий твердий диск буде створено.</translation>
+ <translation>Якщо налаштування вище коректні, натисніть &lt;b&gt;%1&lt;/b&gt;. Як тільки ви натиснете це, новий жорсткий диск буде створено.</translation>
</message>
</context>
<context>
@@ -4542,15 +4542,15 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>&amp;Create new hard disk</source>
- <translation>&amp;Створити новий твердий диск</translation>
+ <translation>&amp;Створити новий жорсткий диск</translation>
</message>
<message>
<source>&amp;Use existing hard disk</source>
- <translation>&amp;Використовувати наявний твердий диск</translation>
+ <translation>&amp;Використовувати наявний жорсткий диск</translation>
</message>
<message>
<source>Virtual Hard Disk</source>
- <translation>Віртуальний твердий диск</translation>
+ <translation>Віртуальний жорсткий диск</translation>
</message>
<message>
<source>The recommended size of the boot hard disk is &lt;b&gt;%1&lt;/b&gt; MB.</source>
@@ -4558,19 +4558,19 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>Boot Hard &amp;Disk</source>
- <translation>З&amp;авантажувальний твердий диск</translation>
+ <translation>З&amp;авантажувальний жорсткий диск</translation>
</message>
<message>
<source>&lt;p&gt;Select a virtual hard disk to be used as the boot hard disk of the virtual machine. You can either create a new hard disk or select an existing one from the drop-down list or by pressing corresponding button (to invoke file-open window).&lt;/p&gt;&lt;p&gt;If you need a more complicated hard disk setup, you can also skip this step and attach hard disks later using the VM Settings dialog.&lt;/p&gt;</source>
- <translation>&lt;p&gt;Виберіть твердий диск, який буде завантажувальним для віртуальної машини. Ви можете або створити новий твердий диск, або вибрати наявний зі спадного списку або натиснувши відповідну кнопку (щоб викликати потрібне вікно).&lt;/p&gt;&lt;p&gt;Якщо вам потрібно складніші налаштування твердого диска, можна також пропустити цей крок і під&apos;єднати тверді диски використовуючи діалог налаштувань віртуальної машини.&lt;/p&gt;</translation>
+ <translation>&lt;p&gt;Виберіть жорсткий диск, який буде завантажувальним для віртуальної машини. Ви можете або створити новий жорсткий диск, або вибрати наявний зі спадного списку або натиснувши відповідну кнопку (щоб викликати потрібне вікно).&lt;/p&gt;&lt;p&gt;Якщо вам потрібно складніші налаштування жорсткого диска, можна також пропустити цей крок і під&apos;єднати жорсткі диски використовуючи діалог налаштувань віртуальної машини.&lt;/p&gt;</translation>
</message>
<message>
<source>Choose a virtual hard disk file...</source>
- <translation>Виберіть файл віртуального твердого диска…</translation>
+ <translation>Виберіть файл віртуального жорсткого диска…</translation>
</message>
<message>
<source>The recommended size of the boot hard disk is &lt;b&gt;%1&lt;/b&gt;.</source>
- <translation>Рекомендований розмір завантажувального твердого диска — &lt;b&gt;%1&lt;/b&gt;.</translation>
+ <translation>Рекомендований розмір завантажувального жорсткого диска — &lt;b&gt;%1&lt;/b&gt;.</translation>
</message>
</context>
<context>
@@ -4606,7 +4606,7 @@ p, li { white-space: pre-wrap; }
<message>
<source>Boot Hard Disk</source>
<comment>summary</comment>
- <translation>Завантажувальний твердий диск</translation>
+ <translation>Завантажувальний жорсткий диск</translation>
</message>
<message>
<source>&lt;p&gt;If the above is correct press the &lt;b&gt;%1&lt;/b&gt; button. Once you press it, a new virtual machine will be created. &lt;/p&gt;&lt;p&gt;Note that you can alter these and all other setting of the created virtual machine at any time using the &lt;b&gt;Settings&lt;/b&gt; dialog accessible through the menu of the main window.&lt;/p&gt;</source>
@@ -4767,7 +4767,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>&lt;p&gt;Saves the current execution state of the virtual machine to the physical hard disk of the host PC.&lt;/p&gt;&lt;p&gt;Next time this machine is started, it will be restored from the saved state and continue execution from the same place you saved it at, which will let you continue your work immediately.&lt;/p&gt;&lt;p&gt;Note that saving the machine state may take a long time, depending on the guest operating system type and the amount of memory you assigned to the virtual machine.&lt;/p&gt;</source>
- <translation>&lt;p&gt;Зберігає поточне виконання стану віртуальної машини на фізичний твердий диск головного комп&apos;ютера.&lt;/p&gt;&lt;p&gt;Наступного разу ця машина буде запущена з етапу, на якому вона була збережена, що дозволяє швидко продовжити вашу роботу.&lt;/p&gt;&lt;p&gt;Майте на увазі, що зберігання стану машини може зайняти багато часу, в залежності від типу гостьової операційної системи і кількості оперативної пам&apos;яті, яка була задана для цієї машини.&lt;/p&gt;</translation>
+ <translation>&lt;p&gt;Зберігає поточне виконання стану віртуальної машини на фізичний жорсткий диск головного комп&apos;ютера.&lt;/p&gt;&lt;p&gt;Наступного разу ця машина буде запущена з етапу, на якому вона була збережена, що дозволяє швидко продовжити вашу роботу.&lt;/p&gt;&lt;p&gt;Майте на увазі, що зберігання стану машини може зайняти багато часу, в залежності від типу гостьової операційної системи і кількості оперативної пам&apos;яті, яка була задана для цієї машини.&lt;/p&gt;</translation>
</message>
<message>
<source>&amp;Save the machine state</source>
@@ -4897,7 +4897,7 @@ p, li { white-space: pre-wrap; }
<name>UIVMSettingsDlg</name>
<message>
<source>General</source>
- <translation>Загально</translation>
+ <translation>Загальне</translation>
</message>
<message>
<source>System</source>
@@ -4949,7 +4949,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>you have 2D Video Acceleration enabled. As 2D Video Acceleration is supported for Windows guests only, this feature will be disabled.</source>
- <translation>ви маєте прискорення двовимірного відео увікнутим. Оскільки прискорення двохвимірного відео підтримується лише для гостьових Windows, цю властивість вимкнено.</translation>
+ <translation>ви маєте прискорення двовимірного відео увімкнутим. Оскільки прискорення двовимірного відео підтримується лише для гостьових Windows, цю властивість вимкнено.</translation>
</message>
<message>
<source>you have enabled a USB HID (Human Interface Device). This will not work unless USB emulation is also enabled. This will be done automatically when you accept the VM Settings by pressing the OK button.</source>
@@ -5058,15 +5058,15 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>Hard Disk Controller (IDE)</source>
- <translation>Контролер твердого диска IDE</translation>
+ <translation>Контролер жорсткого диска IDE</translation>
</message>
<message>
<source>Hard Disk Controller (SATA)</source>
- <translation>Контролер твердого диска SATA</translation>
+ <translation>Контролер жорсткого диска SATA</translation>
</message>
<message>
<source>Hard Disk Controller (SCSI)</source>
- <translation>Контролер твердого диска SCSI</translation>
+ <translation>Контролер жорсткого диска SCSI</translation>
</message>
<message>
<source>DVD</source>
@@ -5124,7 +5124,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>Hard Disk Controller (SAS)</source>
- <translation>Контролер твердого диска (SAS)</translation>
+ <translation>Контролер жорсткого диска (SAS)</translation>
</message>
</context>
<context>
@@ -5324,7 +5324,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>Mount the Guest Additions installation image</source>
- <translation type="obsolete">Змонтувати гостьові доповнення з установчого образа</translation>
+ <translation type="obsolete">Змонтувати гостьові доповнення з установчого образу</translation>
</message>
<message>
<source>Mount &amp;Floppy</source>
@@ -6021,7 +6021,7 @@ p, li { white-space: pre-wrap; }
<message>
<source>Powered Off</source>
<comment>MachineState</comment>
- <translation>Вимкнуто</translation>
+ <translation>Вимкнено</translation>
</message>
<message>
<source>Saved</source>
@@ -6106,7 +6106,7 @@ p, li { white-space: pre-wrap; }
<message>
<source>Hard Disk</source>
<comment>DeviceType</comment>
- <translation>Твердий диск</translation>
+ <translation>Жорсткий диск</translation>
</message>
<message>
<source>Network</source>
@@ -6587,7 +6587,7 @@ p, li { white-space: pre-wrap; }
<message>
<source>Enabled</source>
<comment>details report (3D Acceleration)</comment>
- <translation>Вімкнуте</translation>
+ <translation>Увімкнене</translation>
</message>
<message>
<source>Disabled</source>
@@ -6607,7 +6607,7 @@ p, li { white-space: pre-wrap; }
<message>
<source>Enabled</source>
<comment>details report (Nested Paging)</comment>
- <translation>Увімкнуте</translation>
+ <translation>Увімкнене</translation>
</message>
<message>
<source>Disabled</source>
@@ -6905,17 +6905,17 @@ p, li { white-space: pre-wrap; }
<message>
<source>Attaching this hard disk will be performed indirectly using a newly created differencing hard disk.</source>
<comment>medium</comment>
- <translation>Під&apos;єднання цього твердого диска буде здійснюватись непрямим чином, використовуючи новостворені обчислення твердого диска.</translation>
+ <translation>Під&apos;єднання цього жорсткого диска буде здійснюватись непрямим чином, використовуючи новостворені обчислення жорсткого диска.</translation>
</message>
<message>
<source>Some of the media in this hard disk chain are inaccessible. Please use the Virtual Media Manager in &lt;b&gt;Show Differencing Hard Disks&lt;/b&gt; mode to inspect these media.</source>
<comment>medium</comment>
- <translation>Деякі носії цієї низки твердих дисків недоступні. Будь ласка, використайте керування віртуальними носіями в режимі &lt;b&gt;Показати обчислення твердих дисків&lt;/b&gt;, щоб оглянути цей носій.</translation>
+ <translation>Деякі носії цієї низки жорсткий дисків недоступні. Будь ласка, використайте керування віртуальними носіями в режимі &lt;b&gt;Показати обчислення жорстких дисків&lt;/b&gt;, щоб оглянути цей носій.</translation>
</message>
<message>
<source>This base hard disk is indirectly attached using the following differencing hard disk:</source>
<comment>medium</comment>
- <translation>Цей базовий твердий диск не напряму під&apos;єднано, використовуючи такі обчислення твердого диска:</translation>
+ <translation>Цей базовий жорсткий диск не напряму під&apos;єднано, використовуючи такі обчислення жорсткого диска:</translation>
</message>
<message numerus="yes">
<source>%n year(s)</source>
@@ -7075,11 +7075,11 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>Choose a virtual hard disk file</source>
- <translation>Вибрати файл віртуального твердого диска</translation>
+ <translation>Вибрати файл віртуального жорсткого диска</translation>
</message>
<message>
<source>hard disk</source>
- <translation>твердий диск</translation>
+ <translation>жорсткий диск</translation>
</message>
<message>
<source>Choose a virtual CD/DVD disk file</source>
@@ -7177,12 +7177,12 @@ p, li { white-space: pre-wrap; }
<message>
<source>Readonly</source>
<comment>DiskType</comment>
- <translation type="unfinished"></translation>
+ <translation>Лише для читання</translation>
</message>
<message>
<source>Multi-attach</source>
<comment>DiskType</comment>
- <translation type="unfinished"></translation>
+ <translation>Кілька під&apos;єднань</translation>
</message>
</context>
<context>
@@ -7201,7 +7201,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>&apos;%1&apos; is an invalid host-combination code-sequence.</source>
- <translation type="unfinished"></translation>
+ <translation>«%1» — неправильна послідовність комбінації.</translation>
</message>
</context>
<context>
@@ -7215,11 +7215,11 @@ p, li { white-space: pre-wrap; }
<name>VBoxImportApplianceWgt</name>
<message>
<source>Importing Appliance ...</source>
- <translation>Імпорт образа віртуальної машини ...</translation>
+ <translation>Імпорт образу віртуальної машини ...</translation>
</message>
<message>
<source>Reading Appliance ...</source>
- <translation>Читання образа віртуальної машини …</translation>
+ <translation>Читання образу віртуальної машини …</translation>
</message>
</context>
<context>
@@ -7374,7 +7374,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>Select a hard disk image file</source>
- <translation>Вибрати файл образа твердого диска</translation>
+ <translation>Вибрати файл образу жорсткого диска</translation>
</message>
<message>
<source>CD/DVD-ROM images (*.iso);;All files (*)</source>
@@ -7382,7 +7382,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>Select a CD/DVD-ROM disk image file</source>
- <translation>Вибрати файл образа CD/DVD-ROM</translation>
+ <translation>Вибрати файл образу CD/DVD-ROM</translation>
</message>
<message>
<source>Floppy images (*.img);;All files (*)</source>
@@ -7390,7 +7390,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>Select a floppy disk image file</source>
- <translation>Вибрати файл образа дискети</translation>
+ <translation>Вибрати файл образу дискети</translation>
</message>
<message>
<source>&lt;i&gt;Not&amp;nbsp;Attached&lt;/i&gt;</source>
@@ -7407,7 +7407,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>Hard &amp;Disks</source>
- <translation>&amp;Тверді диски</translation>
+ <translation>&amp;Жорсткі диски</translation>
</message>
<message>
<source>Name</source>
@@ -7454,7 +7454,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>hard disk</source>
- <translation>твердий диск</translation>
+ <translation>жорсткий диск</translation>
</message>
<message>
<source>floppy disk</source>
@@ -7744,7 +7744,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>&lt;p&gt;A fatal error has occurred during virtual machine execution! The virtual machine will be powered off. Please copy the following error message using the clipboard to help diagnose the problem:&lt;/p&gt;</source>
- <translation>&lt;p&gt;Протягом роботи віртуальної машини трапилась невиправна помилка! Віртуальна машина буде вимкнуто. Пропонується використати копіювання в кишеню для подальшого вивчення помилки:&lt;/p&gt;</translation>
+ <translation>&lt;p&gt;Протягом роботи віртуальної машини трапилась невиправна помилка! Віртуальну машину буде вимкнено. Пропонується використати копіювання в кишеню для подальшого вивчення помилки:&lt;/p&gt;</translation>
</message>
<message>
<source>&lt;p&gt;An error has occurred during virtual machine execution! The error details are shown below. You may try to correct the error and resume the virtual machine execution.&lt;/p&gt;</source>
@@ -7809,7 +7809,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>&lt;p&gt;Could not find the VirtualBox Guest Additions CD image file &lt;nobr&gt;&lt;b&gt;%1&lt;/b&gt;&lt;/nobr&gt; or &lt;nobr&gt;&lt;b&gt;%2&lt;/b&gt;.&lt;/nobr&gt;&lt;/p&gt;&lt;p&gt;Do you wish to download this CD image from the Internet?&lt;/p&gt;</source>
- <translation>&lt;p&gt;Не вдалось знайти файл образа гостьових доповнень &lt;nobr&gt;&lt;b&gt;%1&lt;/b&gt;&lt;/nobr&gt; або &lt;nobr&gt;&lt;b&gt;%2&lt;/b&gt;.&lt;/nobr&gt;&lt;/p&gt;&lt;p&gt;Ви бажаєте звантажити образ з інтернету?&lt;/p&gt;</translation>
+ <translation>&lt;p&gt;Не вдалось знайти файл образу гостьових доповнень &lt;nobr&gt;&lt;b&gt;%1&lt;/b&gt;&lt;/nobr&gt; або &lt;nobr&gt;&lt;b&gt;%2&lt;/b&gt;.&lt;/nobr&gt;&lt;/p&gt;&lt;p&gt;Ви бажаєте звантажити образ з інтернету?&lt;/p&gt;</translation>
</message>
<message>
<source>&lt;p&gt;Failed to download the VirtualBox Guest Additions CD image from &lt;nobr&gt;&lt;a href=&quot;%1&quot;&gt;%2&lt;/a&gt;.&lt;/nobr&gt;&lt;/p&gt;&lt;p&gt;%3&lt;/p&gt;</source>
@@ -7829,7 +7829,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>&lt;p&gt;You didn&apos;t attach a hard disk to the new virtual machine. The machine will not be able to boot unless you attach a hard disk with a guest operating system or some other bootable media to it later using the machine settings dialog or the First Run Wizard.&lt;/p&gt;&lt;p&gt;Do you wish to continue?&lt;/p&gt;</source>
- <translation>&lt;p&gt;Ви не під&apos;єднали твердий диск до нової віртуальної машини. Машина не зможе завантажитись, якщо ви не під&apos;єднаєте твердий диск з гостьовою операційною системою або якісь інші носії завантаження для подальшого використання діалогу налаштувань машини або майстра першого запуску.&lt;/p&gt;&lt;p&gt;Бажаєте продовжити?&lt;/p&gt;</translation>
+ <translation>&lt;p&gt;Ви не під&apos;єднали жорсткий диск до нової віртуальної машини. Машина не зможе завантажитись, якщо ви не під&apos;єднаєте жорсткий диск з гостьовою операційною системою або якісь інші носії завантаження для подальшого використання діалогу налаштувань машини або майстра першого запуску.&lt;/p&gt;&lt;p&gt;Бажаєте продовжити?&lt;/p&gt;</translation>
</message>
<message>
<source>Failed to find license files in &lt;nobr&gt;&lt;b&gt;%1&lt;/b&gt;&lt;/nobr&gt;.</source>
@@ -7841,7 +7841,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>Failed to send the ACPI Power Button press event to the virtual machine &lt;b&gt;%1&lt;/b&gt;.</source>
- <translation>Не вдалось відправити сигнал ACPI вимкання живлення віртуальної машини &lt;b&gt;%1&lt;/b&gt;.</translation>
+ <translation>Не вдалось відправити сигнал ACPI вимкнення живлення віртуальної машини &lt;b&gt;%1&lt;/b&gt;.</translation>
</message>
<message>
<source>&lt;p&gt;Congratulations! You have been successfully registered as a user of VirtualBox.&lt;/p&gt;&lt;p&gt;Thank you for finding time to fill out the registration form!&lt;/p&gt;</source>
@@ -7986,7 +7986,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>&lt;p&gt;You have the &lt;b&gt;Auto capture keyboard&lt;/b&gt; option turned on. This will cause the Virtual Machine to automatically &lt;b&gt;capture&lt;/b&gt; the keyboard every time the VM window is activated and make it unavailable to other applications running on your host machine: when the keyboard is captured, all keystrokes (including system ones like Alt-Tab) will be directed to the VM.&lt;/p&gt;&lt;p&gt;You can press the &lt;b&gt;host key&lt;/b&gt; at any time to &lt;b&gt;uncapture&lt;/b&gt; the keyboard and mouse (if it is captured) and return them to normal operation. The currently assigned host key is shown on the status bar at the bottom of the Virtual Machine window, next to the&amp;nbsp;&lt;img src=:/hostkey_16px.png/&gt;&amp;nbsp;icon. This icon, together with the mouse icon placed nearby, indicate the current keyboard and mouse capture state.&lt;/p&gt;</source>
- <translation>&lt;p&gt;Ви вімкнули &lt;b&gt;Автозахоплення клавіатури&lt;/b&gt;. Віртуальна машина автоматично &lt;b&gt;захоплюватиме&lt;/b&gt; клавіатуру кожного разу, коли вікно віртуальної машини активне та робить його недоступним для інших програм, які запущено на вашій головній машині: коли клавіатура захоплена, будь-які натиснення клавіш (у тому ж числі такі системні, як Alt-Tab) будуть виконуватись всередині віртуальної машини.&lt;/p&gt;&lt;p&gt;&lt;p&gt;Ви можете натиснути &lt;b&gt;головну клавішу&lt;/b&gt; в будь-який момент, щоб &lt;b&gt;відпустити&lt;/b&gt; клавіатуру і мишку (якщо вони захоплені) та повернути назад. Поточна головна клавіша показується на панелі стану у вікні віртуальної машини, біля the&amp;nbsp;&lt;img src=:/hostkey_16px.png/&gt;&amp;nbsp;icon. Ця піктограма, знаходиться біля піктограми миші, показуючи поточний стан клавіатури і миші.&lt;/p&gt;</translation>
+ <translation>&lt;p&gt;Ви увімкнули &lt;b&gt;Автозахоплення клавіатури&lt;/b&gt;. Віртуальна машина автоматично &lt;b&gt;захоплюватиме&lt;/b&gt; клавіатуру кожного разу, коли вікно віртуальної машини активне та робить його недоступним для інших програм, які запущено на вашій головній машині: коли клавіатура захоплена, будь-які натиснення клавіш (у тому ж числі такі системні, як Alt-Tab) будуть виконуватись всередині віртуальної машини.&lt;/p&gt;&lt;p&gt;&lt;p&gt;Ви можете натиснути &lt;b&gt;головну клавішу&lt;/b&gt; в будь-який момент, щоб &lt;b&gt;відпустити&lt;/b&gt; клавіатуру і мишку (якщо вони захоплені) та повернути назад. Поточна головна клавіша показується на панелі стану у вікні віртуальної машини, біля the&amp;nbsp;&lt;img src=:/hostkey_16px.png/&gt;&amp;nbsp;icon. Ця піктограма, знаходиться біля піктограми миші, показуючи поточний стан клавіатури і миші.&lt;/p&gt;</translation>
</message>
<message>
<source>&lt;p&gt;The Virtual Machine reports that the guest OS supports &lt;b&gt;mouse pointer integration&lt;/b&gt;. This means that you do not need to &lt;i&gt;capture&lt;/i&gt; the mouse pointer to be able to use it in your guest OS -- all mouse actions you perform when the mouse pointer is over the Virtual Machine&apos;s display are directly sent to the guest OS. If the mouse is currently captured, it will be automatically uncaptured.&lt;/p&gt;&lt;p&gt;The mouse icon on the status bar will look like&amp;nbsp;&lt;img src=:/mouse_seamless_16px.png/&gt;&amp;nbsp;to inform you that mouse pointer integration is supported by the guest OS and is currently turned on.&lt;/p&gt;&lt;p&gt;&lt;b&gt;Note&lt;/b&gt;: Some applications may behave incorrectly in mouse pointer integration mode. You can always disable it for the current session (and enable it again) by selecting the corresponding action from the menu bar.&lt;/p&gt;</source>
@@ -8002,7 +8002,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>&amp;Contents...</source>
- <translation>&amp;Вміст...</translation>
+ <translation>&amp;Зміст...</translation>
</message>
<message>
<source>Show the online help contents</source>
@@ -8046,11 +8046,11 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>Show a dialog with product information</source>
- <translation>Показати діалог з інформацією про продукцію</translation>
+ <translation>Показати вікно з інформацією про продукцію</translation>
</message>
<message>
<source>&lt;p&gt;A new version of VirtualBox has been released! Version &lt;b&gt;%1&lt;/b&gt; is available at &lt;a href=&quot;http://www.virtualbox.org/&quot;&gt;virtualbox.org&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;You can download this version using the link:&lt;/p&gt;&lt;p&gt;&lt;a href=%2&gt;%3&lt;/a&gt;&lt;/p&gt;</source>
- <translation>&lt;p&gt;Вийшла нова версія VirtualBox! Версія &lt;b&gt;%1&lt;/b&gt; доступна на &lt;a href=&quot;http://www.virtualbox.org/&quot;&gt;virtualbox.org&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;Ви можете звантажити цю версію прямим посиланням:&lt;p&gt;&lt;a href=%2&gt;%3&lt;/a&gt;&lt;/p&gt;</translation>
+ <translation>&lt;p&gt;Випущено нову версію VirtualBox! Версія &lt;b&gt;%1&lt;/b&gt; доступна на &lt;a href=&quot;http://www.virtualbox.org/&quot;&gt;virtualbox.org&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;Ви можете звантажити цю версію прямим посиланням:&lt;p&gt;&lt;a href=%2&gt;%3&lt;/a&gt;&lt;/p&gt;</translation>
</message>
<message>
<source>&lt;p&gt;Are you sure you want to release the %1 &lt;nobr&gt;&lt;b&gt;%2&lt;/b&gt;&lt;/nobr&gt;?&lt;/p&gt;&lt;p&gt;This will detach it from the following virtual machine(s): &lt;b&gt;%3&lt;/b&gt;.&lt;/p&gt;</source>
@@ -8067,11 +8067,11 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>Note that as this hard disk is inaccessible its storage unit cannot be deleted right now.</source>
- <translation>Майте на увазі, цей твердий диск недоступний, тому його блок пам&apos;яті неможливо розпізнанати зараз.</translation>
+ <translation>Майте на увазі, цей жорсткий диск недоступний, тому його блок пам&apos;яті неможливо розпізнати зараз.</translation>
</message>
<message>
<source>The next dialog will let you choose whether you also want to delete the storage unit of this hard disk or keep it for later usage.</source>
- <translation>Наступний діалог дасть вам вибирати між тим, чи ви бажаєте вилучити блок пам&apos;яті цього твердого диска, чи затримати це на пізніше.</translation>
+ <translation>Наступний діалог дасть вам вибирати між тим, чи ви бажаєте вилучити блок пам&apos;яті цього жорсткого диска, чи затримати це на пізніше.</translation>
</message>
<message>
<source>&lt;p&gt;Note that the storage unit of this medium will not be deleted and that it will be possible to add it to the list later again.&lt;/p&gt;</source>
@@ -8084,11 +8084,11 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>&lt;p&gt;The hard disk storage unit at location &lt;b&gt;%1&lt;/b&gt; already exists. You cannot create a new virtual hard disk that uses this location because it can be already used by another virtual hard disk.&lt;/p&gt;&lt;p&gt;Please specify a different location.&lt;/p&gt;</source>
- <translation>&lt;p&gt;Блок пам&apos;яті твердого диска в &lt;b&gt;%1&lt;/b&gt; вже існує. Ви не можете створити новий віртуальний твердий диск, що використовує це місце, оскільки він вже використовується іншим віртуальним твердим диском.&lt;/p&gt;&lt;p&gt;Будь ласка, вкажіть інше місце.&lt;/p&gt;</translation>
+ <translation>&lt;p&gt;Блок пам&apos;яті жорсткого диска в &lt;b&gt;%1&lt;/b&gt; вже існує. Ви не можете створити новий віртуальний жорсткий диск, що використовує це місце, оскільки він вже використовується іншим віртуальним жорстким диском.&lt;/p&gt;&lt;p&gt;Будь ласка, вкажіть інше місце.&lt;/p&gt;</translation>
</message>
<message>
<source>&lt;p&gt;Do you want to delete the storage unit of the hard disk &lt;nobr&gt;&lt;b&gt;%1&lt;/b&gt;&lt;/nobr&gt;?&lt;/p&gt;&lt;p&gt;If you select &lt;b&gt;Delete&lt;/b&gt; then the specified storage unit will be permanently deleted. This operation &lt;b&gt;cannot be undone&lt;/b&gt;.&lt;/p&gt;&lt;p&gt;If you select &lt;b&gt;Keep&lt;/b&gt; then the hard disk will be only removed from the list of known hard disks, but the storage unit will be left untouched which makes it possible to add this hard disk to the list later again.&lt;/p&gt;</source>
- <translation>&lt;p&gt;Бажаєте вилучити блок пам&apos;яті твердого диска &lt;nobr&gt;&lt;b&gt;%1&lt;/b&gt;&lt;/nobr&gt;?&lt;/p&gt;&lt;p&gt;Якщо ви виберете &lt;b&gt;Вилучити&lt;/b&gt;, вказаний блок пам&apos;яті буде безповоротно вилучено. Цю операцію &lt;b&gt;неможливо скасувати&lt;/b&gt;.&lt;/p&gt;&lt;p&gt;Якщо ви виберете &lt;b&gt;Затримати&lt;/b&gt;, твердий диск буде вилучено лише зі списку твердих дисків, але блок пам&apos;яті залишиться недоторканим, що дозволить додати цей твердий диск до списку згодом.&lt;/p&gt;</translation>
+ <translation>&lt;p&gt;Бажаєте вилучити блок пам&apos;яті жорсткого диска &lt;nobr&gt;&lt;b&gt;%1&lt;/b&gt;&lt;/nobr&gt;?&lt;/p&gt;&lt;p&gt;Якщо ви виберете &lt;b&gt;Вилучити&lt;/b&gt;, вказаний блок пам&apos;яті буде безповоротно вилучено. Цю операцію &lt;b&gt;неможливо скасувати&lt;/b&gt;.&lt;/p&gt;&lt;p&gt;Якщо ви виберете &lt;b&gt;Затримати&lt;/b&gt;, жорсткий диск буде вилучено лише зі списку жорстких дисків, але блок пам&apos;яті залишиться недоторканим, що дозволить додати цей жорсткий диск до списку згодом.&lt;/p&gt;</translation>
</message>
<message>
<source>Delete</source>
@@ -8102,7 +8102,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>Failed to delete the storage unit of the hard disk &lt;b&gt;%1&lt;/b&gt;.</source>
- <translation>Не вдається вилучити блок пам&apos;яті твердого диска &lt;b&gt;%1&lt;/b&gt;.</translation>
+ <translation>Не вдається вилучити блок пам&apos;яті жорсткого диска &lt;b&gt;%1&lt;/b&gt;.</translation>
</message>
<message>
<source>&lt;p&gt;There are no unused hard disks available for the newly created attachment.&lt;/p&gt;&lt;p&gt;Press the &lt;b&gt;Create&lt;/b&gt; button to start the &lt;i&gt;New Virtual Disk&lt;/i&gt; wizard and create a new hard disk, or press the &lt;b&gt;Select&lt;/b&gt; if you wish to open the &lt;i&gt;Virtual Media Manager&lt;/i&gt;.&lt;/p&gt;</source>
@@ -8110,7 +8110,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>Failed to create the hard disk storage &lt;nobr&gt;&lt;b&gt;%1&lt;/b&gt;.&lt;/nobr&gt;</source>
- <translation>Не вдалося створити сховище на твердому диску &lt;nobr&gt;&lt;b&gt;%1&lt;/b&gt;.&lt;/nobr&gt;</translation>
+ <translation>Не вдалося створити сховище на жорсткому диску &lt;nobr&gt;&lt;b&gt;%1&lt;/b&gt;.&lt;/nobr&gt;</translation>
</message>
<message>
<source>Failed to attach the hard disk &lt;nobr&gt;&lt;b&gt;%1&lt;/b&gt;&lt;/nobr&gt; to slot &lt;i&gt;%2&lt;/i&gt; of the machine &lt;b&gt;%3&lt;/b&gt;.</source>
@@ -8150,7 +8150,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>&lt;p&gt;One or more virtual hard disks, CD/DVD or floppy media are not currently accessible. As a result, you will not be able to operate virtual machines that use these media until they become accessible later.&lt;/p&gt;&lt;p&gt;Press &lt;b&gt;Check&lt;/b&gt; to open the Virtual Media Manager window and see what media are inaccessible, or press &lt;b&gt;Ignore&lt;/b&gt; to ignore this message.&lt;/p&gt;</source>
- <translation>&lt;p&gt;Один або більше віртуальних носіїв твердих дисків, CD/DVD або дискет — недоступні. У результаті, ви не можете керувати віртуальною машиною, що використовує той носій, допоки носій не стане доступним.&lt;/p&gt;&lt;p&gt;Натисність &lt;b&gt;Перевірити&lt;/b&gt;, щоб відкрити вікно менеджера віртуальних носіїв і побачити які носії недоступні, або натиснути &lt;b&gt;Ігнорувати&lt;/b&gt;, щоб уникнути цього повідомлення.&lt;/p&gt;</translation>
+ <translation>&lt;p&gt;Один або більше віртуальних носіїв жорстких дисків, CD/DVD або дискет — недоступні. У результаті, ви не можете керувати віртуальною машиною, що використовує той носій, допоки носій не стане доступним.&lt;/p&gt;&lt;p&gt;Натисність &lt;b&gt;Перевірити&lt;/b&gt;, щоб відкрити вікно менеджера віртуальних носіїв і побачити які носії недоступні, або натиснути &lt;b&gt;Ігнорувати&lt;/b&gt;, щоб уникнути цього повідомлення.&lt;/p&gt;</translation>
</message>
<message>
<source>&lt;p&gt;Your existing VirtualBox settings files were automatically converted from the old format to a new format required by the new version of VirtualBox.&lt;/p&gt;&lt;p&gt;Press &lt;b&gt;OK&lt;/b&gt; to start VirtualBox now or press &lt;b&gt;More&lt;/b&gt; if you want to get more information about what files were converted and access additional actions.&lt;/p&gt;&lt;p&gt;Press &lt;b&gt;Exit&lt;/b&gt; to terminate the VirtualBox application without saving the results of the conversion to disk.&lt;/p&gt;</source>
@@ -8417,7 +8417,7 @@ p, li { white-space: pre-wrap; }
<message>
<source>hard disk</source>
<comment>failed to mount ...</comment>
- <translation>твердий диск</translation>
+ <translation>жорсткий диск</translation>
</message>
<message>
<source>CD/DVD</source>
@@ -8525,11 +8525,11 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>&lt;p&gt;You are about to remove the virtual machine &lt;b&gt;%1&lt;/b&gt; from the machine list.&lt;/p&gt;&lt;p&gt;Would you like to delete the files containing the virtual machine from your hard disk as well?&lt;/p&gt;</source>
- <translation>&lt;p&gt;Ви збираєтесь вилучити віртуальну машину &lt;b&gt;%1&lt;/b&gt; зі списку.&lt;/p&gt;&lt;p&gt;Бажаєте вилучити файли, які містять віртуальну машину, з вашого твердого диска також?&lt;/p&gt;</translation>
+ <translation>&lt;p&gt;Ви збираєтесь вилучити віртуальну машину &lt;b&gt;%1&lt;/b&gt; зі списку.&lt;/p&gt;&lt;p&gt;Бажаєте вилучити файли, які містять віртуальну машину, з вашого жорсткого диска також?&lt;/p&gt;</translation>
</message>
<message>
<source>&lt;p&gt;You are about to remove the virtual machine &lt;b&gt;%1&lt;/b&gt; from the machine list.&lt;/p&gt;&lt;p&gt;Would you like to delete the files containing the virtual machine from your hard disk as well? Doing this will also remove the files containing the machine&apos;s virtual hard disks if they are not in use by another machine.&lt;/p&gt;</source>
- <translation>&lt;p&gt;Ви збираєтесь вилучити віртуальну машину &lt;b&gt;%1&lt;/b&gt; зі списку.&lt;/p&gt;&lt;p&gt;Бажаєте вилучити файли, які містять віртуальну машину, з вашого твердого диска також? Це спричинить також вилучення файлів, які містять віртуальні тверді диски, якщо вони не використовується іншими машинами.&lt;/p&gt;</translation>
+ <translation>&lt;p&gt;Ви збираєтесь вилучити віртуальну машину &lt;b&gt;%1&lt;/b&gt; зі списку.&lt;/p&gt;&lt;p&gt;Бажаєте вилучити файли, які містять віртуальну машину, з вашого жорсткого диска також? Це спричинить також вилучення файлів, які містять віртуальні жорсткі диски, якщо вони не використовується іншими машинами.&lt;/p&gt;</translation>
</message>
<message>
<source>Delete all files</source>
@@ -8549,7 +8549,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>&lt;p&gt;You are about to add a virtual hard disk to controller &lt;b&gt;%1&lt;/b&gt;.&lt;/p&gt;&lt;p&gt;Would you like to create a new, empty file to hold the disk contents or select an existing one?&lt;/p&gt;</source>
- <translation>&lt;p&gt;Ви збираєтесь додати додати віртуальний твердий диск до контролера &lt;b&gt;%1&lt;/b&gt;.&lt;/p&gt;&lt;p&gt;Бажаєте створити новий, порожній файл, щоб тримати там його дані, чи вибрати наявний?&lt;/p&gt;</translation>
+ <translation>&lt;p&gt;Ви збираєтесь додати додати віртуальний жорсткий диск до контролера &lt;b&gt;%1&lt;/b&gt;.&lt;/p&gt;&lt;p&gt;Бажаєте створити новий, порожній файл, щоб тримати там його дані, чи вибрати наявний?&lt;/p&gt;</translation>
</message>
<message>
<source>Create &amp;new disk</source>
@@ -8581,7 +8581,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>Failed to detach the hard disk (&lt;nobr&gt;&lt;b&gt;%1&lt;/b&gt;&lt;/nobr&gt;) from the slot &lt;i&gt;%2&lt;/i&gt; of the machine &lt;b&gt;%3&lt;/b&gt;.</source>
- <translation>Не вдалось від&apos;єднати твердий диск (&lt;nobr&gt;&lt;b&gt;%1&lt;/b&gt;&lt;/nobr&gt;) із гнізда &lt;i&gt;%2&lt;/i&gt; машини &lt;b&gt;%3&lt;/b&gt;.</translation>
+ <translation>Не вдалось від&apos;єднати жорсткий диск (&lt;nobr&gt;&lt;b&gt;%1&lt;/b&gt;&lt;/nobr&gt;) із гнізда &lt;i&gt;%2&lt;/i&gt; машини &lt;b&gt;%3&lt;/b&gt;.</translation>
</message>
<message>
<source>Failed to detach the CD/DVD device (&lt;nobr&gt;&lt;b&gt;%1&lt;/b&gt;&lt;/nobr&gt;) from the slot &lt;i&gt;%2&lt;/i&gt; of the machine &lt;b&gt;%3&lt;/b&gt;.</source>
@@ -8637,7 +8637,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>Failed to attach the hard disk (&lt;nobr&gt;&lt;b&gt;%1&lt;/b&gt;&lt;/nobr&gt;) to the slot &lt;i&gt;%2&lt;/i&gt; of the machine &lt;b&gt;%3&lt;/b&gt;.</source>
- <translation>Не вдалось під&apos;єднати твердий диск (&lt;nobr&gt;&lt;b&gt;%1&lt;/b&gt;&lt;/nobr&gt;) до гнізда &lt;i&gt;%2&lt;/i&gt; машини &lt;b&gt;%3&lt;/b&gt;.</translation>
+ <translation>Не вдалось під&apos;єднати жорсткий диск (&lt;nobr&gt;&lt;b&gt;%1&lt;/b&gt;&lt;/nobr&gt;) до гнізда &lt;i&gt;%2&lt;/i&gt; машини &lt;b&gt;%3&lt;/b&gt;.</translation>
</message>
<message>
<source>Failed to attach the CD/DVD device (&lt;nobr&gt;&lt;b&gt;%1&lt;/b&gt;&lt;/nobr&gt;) to the slot &lt;i&gt;%2&lt;/i&gt; of the machine &lt;b&gt;%3&lt;/b&gt;.</source>
@@ -8649,88 +8649,88 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>Deletion of all files belonging to the VM is currently disabled on Windows/x64 to prevent a crash. That will be fixed in the next release.</source>
- <translation type="unfinished"></translation>
+ <translation>Вилучення всіх файлів, які належать віртуальній машині, наразі вимкнено для Windows/x64 задля запобігання крахів. Це буде виправлено в наступному випуску.</translation>
</message>
<message>
<source>&lt;p&gt;Note that the storage unit of this medium will not be deleted and that it will be possible to use it later again.&lt;/p&gt;</source>
- <translation type="unfinished"></translation>
+ <translation>&lt;p&gt;Зауважте, одиниці пам&apos;яті цього носія не буде вилучено і це буде можливо згодом знову.&lt;/p&gt;</translation>
</message>
<message>
<source>&lt;p&gt;The VirtualBox Guest Additions do not appear to be available on this virtual machine, and shared folders cannot be used without them. To use shared folders inside the virtual machine, please install the Guest Additions if they are not installed, or re-install them if they are not working correctly, by selecting &lt;b&gt;Install Guest Additions&lt;/b&gt; from the &lt;b&gt;Devices&lt;/b&gt; menu. If they are installed but the machine is not yet fully started then shared folders will be available once it is.&lt;/p&gt;</source>
- <translation type="unfinished"></translation>
+ <translation>&lt;p&gt;Гостьові доповнення VirtualBox не стали доступними для цієї віртуальної машини, а спільні теки неможливо використовувати без них. Щоб використовувати спільні теки всередині віртуальної машини, будь ласка, встановіть гостьові доповнення, якщо їх не встановлено, або перевстановіть їх, якщо вони працюють некоректно, вибравши &lt;b&gt;Встановити гостьові доповнення&lt;/b&gt; з меню &lt;b&gt;Пристрої&lt;/b&gt;. Якщо вони встановлені, однак машина не запущено повністю, то спільні теки будуть доступні після запуску.&lt;/p&gt;</translation>
</message>
<message>
<source>&lt;p&gt;The virtual machine window will be now switched to &lt;b&gt;fullscreen&lt;/b&gt; mode. You can go back to windowed mode at any time by pressing &lt;b&gt;%1&lt;/b&gt;.&lt;/p&gt;&lt;p&gt;Note that the &lt;i&gt;Host&lt;/i&gt; key is currently defined as &lt;b&gt;%2&lt;/b&gt;.&lt;/p&gt;&lt;p&gt;Note that the main menu bar is hidden in fullscreen mode. You can access it by pressing &lt;b&gt;Host+Home&lt;/b&gt;.&lt;/p&gt;</source>
- <translation type="unfinished"></translation>
+ <translation>&lt;p&gt;Вікно віртуальної машини буде перемкнуто на &lt;b&gt;повноекранний&lt;/b&gt; режим. Можете повернутись до віконного режим у будь-який момент через натиснення &lt;b&gt;%1&lt;/b&gt;.&lt;/p&gt;&lt;p&gt;Зауважте, &lt;i&gt;головну&lt;/i&gt; клавішу визначено як &lt;b&gt;%2&lt;/b&gt;.&lt;/p&gt;&lt;p&gt;Зауважте, що панель головного меню сховано в повноекранному режимі. Ви можете дістатись до неї через натиснення &lt;b&gt;головна клавіша+Home&lt;/b&gt;.&lt;/p&gt;</translation>
</message>
<message>
<source>&lt;p&gt;The virtual machine window will be now switched to &lt;b&gt;Seamless&lt;/b&gt; mode. You can go back to windowed mode at any time by pressing &lt;b&gt;%1&lt;/b&gt;.&lt;/p&gt;&lt;p&gt;Note that the &lt;i&gt;Host&lt;/i&gt; key is currently defined as &lt;b&gt;%2&lt;/b&gt;.&lt;/p&gt;&lt;p&gt;Note that the main menu bar is hidden in seamless mode. You can access it by pressing &lt;b&gt;Host+Home&lt;/b&gt;.&lt;/p&gt;</source>
- <translation type="unfinished"></translation>
+ <translation>&lt;p&gt;Вікно віртуальної машини буде перемкнуто на &lt;b&gt;ціловикроєний&lt;/b&gt; режим. Можете повенутись до віконного режим у будь-який момент через натиснення &lt;b&gt;%1&lt;/b&gt;.&lt;/p&gt;&lt;p&gt;Зауважте, &lt;i&gt;головну&lt;/i&gt; клавішу визначено як &lt;b&gt;%2&lt;/b&gt;.&lt;/p&gt;&lt;p&gt;Зауважте, що панель головного меню сховано в ціловикроєному режимі. Ви можете дістатись до неї через натиснення &lt;b&gt;головна клавіша+Home&lt;/b&gt;.&lt;/p&gt;</translation>
</message>
<message>
<source>&lt;p&gt;The virtual machine window will be now switched to &lt;b&gt;Scale&lt;/b&gt; mode. You can go back to windowed mode at any time by pressing &lt;b&gt;%1&lt;/b&gt;.&lt;/p&gt;&lt;p&gt;Note that the &lt;i&gt;Host&lt;/i&gt; key is currently defined as &lt;b&gt;%2&lt;/b&gt;.&lt;/p&gt;&lt;p&gt;Note that the main menu bar is hidden in scale mode. You can access it by pressing &lt;b&gt;Host+Home&lt;/b&gt;.&lt;/p&gt;</source>
- <translation type="unfinished"></translation>
+ <translation>&lt;p&gt;Вікно віртуальної машини буде перемкнуто на &lt;b&gt;масштабний&lt;/b&gt; режим. Можете повенутись до віконного режим у будь-який момент через натиснення &lt;b&gt;%1&lt;/b&gt;.&lt;/p&gt;&lt;p&gt;Зауважте, &lt;i&gt;головну&lt;/i&gt; клавішу визначено як &lt;b&gt;%2&lt;/b&gt;.&lt;/p&gt;&lt;p&gt;Зауважте, що панель головного меню сховано в масштабному режимі. Ви можете дістатись до неї через натиснення &lt;b&gt;головна клавіша+Home&lt;/b&gt;.&lt;/p&gt;</translation>
</message>
<message>
<source>Switch</source>
<comment>scale</comment>
- <translation type="unfinished">Перемкнути</translation>
+ <translation>Перемкнути</translation>
</message>
<message>
<source>&lt;p&gt;Cannot create the machine folder &lt;b&gt;%1&lt;/b&gt; in the parent folder &lt;nobr&gt;&lt;b&gt;%2&lt;/b&gt;.&lt;/nobr&gt;&lt;/p&gt;&lt;p&gt;Please check that the parent really exists and that you have permissions to create the machine folder.&lt;/p&gt;</source>
- <translation type="unfinished"></translation>
+ <translation>&lt;p&gt;Неможливо створити машинну теку &lt;b&gt;%1&lt;/b&gt; у батьківській теці &lt;nobr&gt;&lt;b&gt;%2&lt;/b&gt;.&lt;/nobr&gt;&lt;/p&gt;&lt;p&gt;Будь ласка, перевірте, чи батьківська тека справді існує і чи маєте ви право на створення машинних тек.&lt;/p&gt;</translation>
</message>
<message>
<source>Failed to open the Extension Pack &lt;b&gt;%1&lt;/b&gt;.</source>
- <translation type="unfinished"></translation>
+ <translation>Не вдалось відкрити пакунок розширень &lt;b&gt;%1&lt;/b&gt;.</translation>
</message>
<message>
<source>&lt;p&gt;You are about to install a VirtualBox extension pack. Extension packs complement the functionality of VirtualBox and can contain system level software that could be potentially harmful to your system. Please review the description below and only proceed if you have obtained the extension pack from a trusted source.&lt;/p&gt;&lt;p&gt;&lt;table cellpadding=0 cellspacing=0&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;Name:&amp;nbsp;&amp;nbsp;&lt;/b&gt;&lt;/td&gt;&lt;td&gt;%1&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;Version:&amp;nbsp;&amp;nbsp;&lt;/b&gt;&lt;/td&gt;&lt;td&gt;%2&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;Description:&amp;nbsp;&amp;nbsp;&lt;/b&gt;&lt;/td&gt;&lt;td&gt;%3&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/p&gt;</source>
- <translation type="unfinished"></translation>
+ <translation>&lt;p&gt;Ви збираєтесь установити пакунок розширень до VirtualBox. Пакунки розширень доповнюють функціональність VirtualBox і містять програми системного рівня, які можуть бути потенційно шкідливими для вашої системи. Будь ласка, перегляньте опис нижче і продовжуйте лише в тому разі, коли одержуватимете пакунок розширень з довірених джерел.&lt;/p&gt;&lt;p&gt;&lt;table cellpadding=0 cellspacing=0&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;Name:&amp;nbsp;&amp;nbsp;&lt;/b&gt;&lt;/td&gt;&lt;td&gt;%1&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;Версія:&amp;nbsp;&amp;nbsp;&lt;/b&gt;&lt;/td&gt;&lt;td&gt;%2&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;Опис:&amp;nbsp;&amp;nbsp;&lt;/b&gt;&lt;/td&gt;&lt;td&gt;%3&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/p&gt;</translation>
</message>
<message>
<source>&amp;Install</source>
- <translation type="unfinished"></translation>
+ <translation>&amp;Установити</translation>
</message>
<message>
<source>Extension packs complement the functionality of VirtualBox and can contain system level software that could be potentially harmful to your system. Please review the description below and only proceed if you have obtained the extension pack from a trusted source.</source>
- <translation type="unfinished"></translation>
+ <translation>Пакунки розширень доповнюють функціональність VirtualBox і можуть містити програми системного рівня, які можуть бути потенційно шкідливими для вашої системи. Будь ласка, перегляньте опис нижче і продовжуйте лише в тому разі, коли одержуватимете пакунок розширень з довірених джерел.</translation>
</message>
<message>
<source>&lt;p&gt;An older version of the extension pack is already installed, would you like to upgrade? &lt;p&gt;%1&lt;/p&gt;&lt;p&gt;&lt;table cellpadding=0 cellspacing=0&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;Name:&amp;nbsp;&amp;nbsp;&lt;/b&gt;&lt;/td&gt;&lt;td&gt;%2&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;New Version:&amp;nbsp;&amp;nbsp;&lt;/b&gt;&lt;/td&gt;&lt;td&gt;%3&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;Current Version:&amp;nbsp;&amp;nbsp;&lt;/b&gt;&lt;/td&gt;&lt;td&gt;%4&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;Description:&amp;nbsp;&amp;nbsp;&lt;/b&gt;&lt;/td&gt;&lt;td&gt;%5&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/p&gt;</source>
- <translation type="unfinished"></translation>
+ <translation>&lt;p&gt;Старішу версію пакунка розширень уже встановлено, оновити? &lt;p&gt;%1&lt;/p&gt;&lt;p&gt;&lt;table cellpadding=0 cellspacing=0&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;Name:&amp;nbsp;&amp;nbsp;&lt;/b&gt;&lt;/td&gt;&lt;td&gt;%2&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;Нова версія:&amp;nbsp;&amp;nbsp;&lt;/b&gt;&lt;/td&gt;&lt;td&gt;%3&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;Поточна версія:&amp;nbsp;&amp;nbsp;&lt;/b&gt;&lt;/td&gt;&lt;td&gt;%4&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;Опис:&amp;nbsp;&amp;nbsp;&lt;/b&gt;&lt;/td&gt;&lt;td&gt;%5&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/p&gt;</translation>
</message>
<message>
<source>&amp;Upgrade</source>
- <translation type="unfinished"></translation>
+ <translation>&amp;Оновити</translation>
</message>
<message>
<source>&lt;p&gt;An newer version of the extension pack is already installed, would you like to downgrade? &lt;p&gt;%1&lt;/p&gt;&lt;p&gt;&lt;table cellpadding=0 cellspacing=0&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;Name:&amp;nbsp;&amp;nbsp;&lt;/b&gt;&lt;/td&gt;&lt;td&gt;%2&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;New Version:&amp;nbsp;&amp;nbsp;&lt;/b&gt;&lt;/td&gt;&lt;td&gt;%3&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;Current Version:&amp;nbsp;&amp;nbsp;&lt;/b&gt;&lt;/td&gt;&lt;td&gt;%4&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;Description:&amp;nbsp;&amp;nbsp;&lt;/b&gt;&lt;/td&gt;&lt;td&gt;%5&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/p&gt;</source>
- <translation type="unfinished"></translation>
+ <translation>&lt;p&gt;Новішу версію пакунка розширень уже встановленого, понизити? &lt;p&gt;%1&lt;/p&gt;&lt;p&gt;&lt;table cellpadding=0 cellspacing=0&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;Name:&amp;nbsp;&amp;nbsp;&lt;/b&gt;&lt;/td&gt;&lt;td&gt;%2&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;Нова версія:&amp;nbsp;&amp;nbsp;&lt;/b&gt;&lt;/td&gt;&lt;td&gt;%3&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;Поточна версія:&amp;nbsp;&amp;nbsp;&lt;/b&gt;&lt;/td&gt;&lt;td&gt;%4&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;Опис:&amp;nbsp;&amp;nbsp;&lt;/b&gt;&lt;/td&gt;&lt;td&gt;%5&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/p&gt;</translation>
</message>
<message>
<source>&amp;Downgrade</source>
- <translation type="unfinished"></translation>
+ <translation>&amp;Понизити</translation>
</message>
<message>
<source>&lt;p&gt;The extension pack is already installed with the same version, would you like reinstall it? &lt;p&gt;%1&lt;/p&gt;&lt;p&gt;&lt;table cellpadding=0 cellspacing=0&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;Name:&amp;nbsp;&amp;nbsp;&lt;/b&gt;&lt;/td&gt;&lt;td&gt;%2&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;Version:&amp;nbsp;&amp;nbsp;&lt;/b&gt;&lt;/td&gt;&lt;td&gt;%3&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;Description:&amp;nbsp;&amp;nbsp;&lt;/b&gt;&lt;/td&gt;&lt;td&gt;%4&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/p&gt;</source>
- <translation type="unfinished"></translation>
+ <translation>&lt;p&gt;Пакунок розширень уже встановлено з тією ж версією, перевстановити? &lt;p&gt;%1&lt;/p&gt;&lt;p&gt;&lt;table cellpadding=0 cellspacing=0&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;Name:&amp;nbsp;&amp;nbsp;&lt;/b&gt;&lt;/td&gt;&lt;td&gt;%2&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;Версія:&amp;nbsp;&amp;nbsp;&lt;/b&gt;&lt;/td&gt;&lt;td&gt;%3&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;Опис:&amp;nbsp;&amp;nbsp;&lt;/b&gt;&lt;/td&gt;&lt;td&gt;%4&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/p&gt;</translation>
</message>
<message>
<source>&amp;Reinstall</source>
- <translation type="unfinished"></translation>
+ <translation>Пере&amp;встановити</translation>
</message>
<message>
<source>&lt;p&gt;You are about to remove the VirtualBox extension pack &lt;b&gt;%1&lt;/b&gt;.&lt;/p&gt;&lt;p&gt;Are you sure you want to proceed?&lt;/p&gt;</source>
- <translation type="unfinished"></translation>
+ <translation>&lt;p&gt;Ви збираєтесь вилучити пакунок розширень VirtualBox &lt;b&gt;%1&lt;/b&gt;.&lt;/p&gt;&lt;p&gt;Продовжити?&lt;/p&gt;</translation>
</message>
<message>
<source>The extension pack &lt;br&gt;&lt;nobr&gt;&lt;b&gt;%1&lt;/b&gt;&lt;nobr&gt;&lt;br&gt; was installed successfully.</source>
- <translation type="unfinished"></translation>
+ <translation>Пакунок розширень &lt;br&gt;&lt;nobr&gt;&lt;b&gt;%1&lt;/b&gt;&lt;nobr&gt;&lt;br&gt; успішно втсановлено.</translation>
</message>
<message>
<source>&lt;p&gt;USB 2.0 is currently enabled for this virtual machine. However this requires the &lt;b&gt;&lt;nobr&gt;%1&lt;/nobr&gt;&lt;/b&gt; to be installed.&lt;/p&gt;&lt;p&gt;Please install the Extension Pack from the VirtualBox download site. After this you will be able to re-enable USB 2.0. It will be disabled in the meantime unless you cancel the current settings changes.&lt;/p&gt;</source>
- <translation type="unfinished"></translation>
+ <translation>&lt;p&gt;USB 2.0 наразі ввімкнено для цієї віртуальної машини. Однак потрібно встановити &lt;b&gt;&lt;nobr&gt;%1&lt;/nobr&gt;&lt;/b&gt;.&lt;/p&gt;&lt;p&gt;Будь ласка, встановіть пакунок доповнень з сайту звантажень VirtualBox. Після цього зможете перезапустити USB 2.0. Це буде вимкнено протягом скасуванням змін поточних налаштувань.&lt;/p&gt;</translation>
</message>
</context>
<context>
@@ -8855,11 +8855,11 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>Click to view non-scaled screenshot.</source>
- <translation>Клікніть, щоб побачити немасштабований зріз.</translation>
+ <translation>Натисніть, щоб побачити немасштабований зріз.</translation>
</message>
<message>
<source>Click to view scaled screenshot.</source>
- <translation>Клікніть, щоб побачити масштабований зріз.</translation>
+ <translation>Натисніть, щоб побачити масштабований зріз.</translation>
</message>
</context>
<context>
@@ -8879,7 +8879,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>Display the global settings dialog</source>
- <translation>Показати діалог загальних налаштувань</translation>
+ <translation>Показати вікно загальних налаштувань</translation>
</message>
<message>
<source>E&amp;xit</source>
@@ -8891,7 +8891,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>&amp;New...</source>
- <translation>&amp;Нова...</translation>
+ <translation>&amp;Створити…</translation>
</message>
<message>
<source>Create a new virtual machine</source>
@@ -9007,7 +9007,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>Display the Virtual Media Manager dialog</source>
- <translation>Показати діалог керування віртуального носія</translation>
+ <translation>Показати вікно керування віртуального носія</translation>
</message>
<message>
<source>Log</source>
@@ -9020,19 +9020,19 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>&amp;Import Appliance...</source>
- <translation>&amp;Імпорт образа віртуальної машини...</translation>
+ <translation>&amp;Імпортувати образу віртуальної машини…</translation>
</message>
<message>
<source>Import an appliance into VirtualBox</source>
- <translation>Імпорт образа віртуальної машини у VirtualBox</translation>
+ <translation>Імпортувати образу віртуальної машини у VirtualBox</translation>
</message>
<message>
<source>&amp;Export Appliance...</source>
- <translation>&amp;Експорт образа віртуальної машини...</translation>
+ <translation>&amp;Експортувати образу віртуальної машини…</translation>
</message>
<message>
<source>Export one or more VirtualBox virtual machines as an appliance</source>
- <translation>Експорт образа віртуальної машини з VirtualBox</translation>
+ <translation>Експортувати образу віртуальної машини з VirtualBox</translation>
</message>
<message>
<source>Re&amp;fresh</source>
@@ -9040,7 +9040,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>&lt;h3&gt;Welcome to VirtualBox!&lt;/h3&gt;&lt;p&gt;The left part of this window is a list of all virtual machines on your computer. The list is empty now because you haven&apos;t created any virtual machines yet.&lt;img src=:/welcome.png align=right/&gt;&lt;/p&gt;&lt;p&gt;In order to create a new virtual machine, press the &lt;b&gt;New&lt;/b&gt; button in the main tool bar located at the top of the window.&lt;/p&gt;&lt;p&gt;You can press the &lt;b&gt;%1&lt;/b&gt; key to get instant help, or visit &lt;a href=http://www.virtualbox.org&gt;www.virtualbox.org&lt;/a&gt; for the latest information and news.&lt;/p&gt;</source>
- <translation>&lt;h3&gt;Ласкаво просимо до VirtualBox!&lt;/h3&gt;&lt;p&gt;У лівій частині цього вікна показується список віртуальних машин на вашому комп&apos;ютері. Зараз список порожній, оскільки, поки що, ви не маєте створених віртуальних машин.&lt;img src=:/welcome.png align=right/&gt;&lt;/p&gt;&lt;p&gt;Для того, щоб створити нову віртуальну машину, натисніть &lt;b&gt;Створити&lt;/b&gt; в головному меню панелі інструментів , які знаходяться вверху вікна.&lt;/p&gt;&lt;p&gt;Ви можете натиснути &lt;b&gt;%1&lt;/b&gt;, щоб отримати миттєву довідку, або відвідайте &lt;a href=http://www.virtualbox.org&gt;www.virtualbox.org&lt;/a&gt; щодо останніх новин.&lt;/p&gt;</translation>
+ <translation>&lt;h3&gt;Ласкаво просимо до VirtualBox!&lt;/h3&gt;&lt;p&gt;У лівій частині цього вікна показується список віртуальних машин на вашому комп&apos;ютері. Зараз список порожній, оскільки, поки що, ви не маєте створених віртуальних машин.&lt;img src=:/welcome.png align=right/&gt;&lt;/p&gt;&lt;p&gt;Для того, щоб створити нову віртуальну машину, натисніть &lt;b&gt;Створити&lt;/b&gt; в головному меню панелі інструментів , які знаходяться зверху вікна.&lt;/p&gt;&lt;p&gt;Ви можете натиснути &lt;b&gt;%1&lt;/b&gt;, щоб отримати миттєву довідку, або відвідайте &lt;a href=http://www.virtualbox.org&gt;www.virtualbox.org&lt;/a&gt; щодо останніх новин.&lt;/p&gt;</translation>
</message>
<message>
<source>&amp;File</source>
@@ -9083,11 +9083,11 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>Show in Finder</source>
- <translation>Показати в пошуку</translation>
+ <translation>Показувати в пошуку</translation>
</message>
<message>
<source>Show the VirtualBox Machine Definition file in Finder.</source>
- <translation>Показати визначення файла віртуальної машини в пошуку.</translation>
+ <translation>Показати значення файла віртуальної машини в пошуку.</translation>
</message>
<message>
<source>Create Alias on Desktop</source>
@@ -9099,7 +9099,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>Show in Explorer</source>
- <translation>Показати в переглядачі</translation>
+ <translation>Показувати в переглядачі</translation>
</message>
<message>
<source>Show the VirtualBox Machine Definition file in Explorer.</source>
@@ -9115,19 +9115,19 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>Show in File Manager</source>
- <translation>Показати у файловому менеджері</translation>
+ <translation>Показувати у файловому менеджері</translation>
</message>
<message>
<source>Show the VirtualBox Machine Definition file in the File Manager</source>
- <translation>Показати визначення файла віртуальної машин у файловому менеджері</translation>
+ <translation>Показувати визначення файла віртуальної машин у файловому менеджері</translation>
</message>
<message>
<source>Show Toolbar</source>
- <translation>Показати панель інструментів</translation>
+ <translation>Показувати панель інструментів</translation>
</message>
<message>
<source>Show Statusbar</source>
- <translation>Показати панель стану</translation>
+ <translation>Показувати смужку стану</translation>
</message>
</context>
<context>
@@ -9181,7 +9181,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>Click to enlarge the screenshot.</source>
- <translation>клікніть, щоб збільшити зріз.</translation>
+ <translation>Натисніть, щоб збільшити зріз.</translation>
</message>
<message>
<source>&amp;Name:</source>
@@ -9241,7 +9241,7 @@ p, li { white-space: pre-wrap; }
<message>
<source>offline)</source>
<comment>Snapshot details</comment>
- <translation>з вимкнутої машини)</translation>
+ <translation>з вимкненої машини)</translation>
</message>
<message>
<source>Taken at %1</source>
@@ -9280,7 +9280,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>S&amp;how Details</source>
- <translation>&amp;Показати подробиці</translation>
+ <translation>&amp;Показувати подробиці</translation>
</message>
<message>
<source>Discard the selected snapshot of the virtual machine</source>
@@ -9388,7 +9388,7 @@ p, li { white-space: pre-wrap; }
<source>Warning: You are taking a snapshot of a running machine which has %n immutable image(s) attached to it. As long as you are working from this snapshot the immutable image(s) will not be reset to avoid loss of data.</source>
<translation>
<numerusform>Обережно: ви робите зріз із запущеної машини, яка має %n сталий образ, приєднаний до нього. Поки ви працюватимете з цього зрізу, сталий образ не буде скинуто, щоб уникнути втрат даних. </numerusform>
- <numerusform>Обережно: ви робите зріз із запущеної машини, яка має %n сталих образа, приєднаний до нього. Поки ви працюватимете з цього зрізу, сталі образи не буде скинуто, щоб уникнути втрат даних. </numerusform>
+ <numerusform>Обережно: ви робите зріз із запущеної машини, яка має %n сталих образу, приєднаний до нього. Поки ви працюватимете з цього зрізу, сталі образи не буде скинуто, щоб уникнути втрат даних. </numerusform>
<numerusform>Обережно: ви робите зріз із запущеної машини, яка має %n сталих образів, приєднаний до нього. Поки ви працюватимете з цього зрізу, сталі образи не буде скинуто, щоб уникнути втрат даних. </numerusform>
</translation>
</message>
@@ -9740,7 +9740,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>CD/DVD image file is not selected</source>
- <translation type="obsolete">Файл образа CD/DVD не вибрано</translation>
+ <translation type="obsolete">Файл образу CD/DVD не вибрано</translation>
</message>
<message>
<source>When checked, mounts the specified media to the CD/DVD drive of the virtual machine. Note that the CD/DVD drive is always connected to the Secondary Master IDE controller of the machine.</source>
@@ -9776,11 +9776,11 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>&amp;ISO Image File</source>
- <translation type="obsolete">&amp;Файл образа ISO</translation>
+ <translation type="obsolete">&amp;Файл образу ISO</translation>
</message>
<message>
<source>Displays the image file to mount to the virtual CD/DVD drive and allows to quickly select a different image.</source>
- <translation type="obsolete">Показує файл образа для монтування до віртуальної машини носій CD/DVD і дозволяє швидко вибрати інший образ.</translation>
+ <translation type="obsolete">Показує файл образу для монтування до віртуальної машини носій CD/DVD і дозволяє швидко вибрати інший образ.</translation>
</message>
<message>
<source>Invokes the Virtual Media Manager to select a CD/DVD image to mount.</source>
@@ -9882,7 +9882,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>Floppy image file is not selected</source>
- <translation type="obsolete">Файл образа дискети не вибрано</translation>
+ <translation type="obsolete">Файл образу дискети не вибрано</translation>
</message>
<message>
<source>When checked, mounts the specified media to the Floppy drive of the virtual machine.</source>
@@ -9910,11 +9910,11 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>&amp;Image File</source>
- <translation type="obsolete">&amp;Файл образа</translation>
+ <translation type="obsolete">&amp;Файл образу</translation>
</message>
<message>
<source>Displays the image file to mount to the virtual Floppy drive and allows to quickly select a different image.</source>
- <translation type="obsolete">Показує файл образа для монтування до віртуальної машини носій дискет і дозволяє швидко вибрати інший образ.</translation>
+ <translation type="obsolete">Показує файл образу для монтування до віртуальної машини носій дискет і дозволяє швидко вибрати інший образ.</translation>
</message>
<message>
<source>Invokes the Virtual Media Manager to select a Floppy image to mount.</source>
diff --git a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_zh_TW.ts b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_zh_TW.ts
index aaef2a7df..07c7cfb7b 100644
--- a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_zh_TW.ts
+++ b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_zh_TW.ts
@@ -262,12 +262,8 @@
<translation>ACPI 關機(&amp;U)</translation>
</message>
<message>
- <source>ACPI S&amp;hutdown</source>
- <translation type="obsolete">ACPI 關機(&amp;H)</translation>
- </message>
- <message>
<source>Send the ACPI Power Button press event to the virtual machine</source>
- <translation>傳送按下 ACPI 電源開關按鈕的事件到虛擬機器</translation>
+ <translation>傳送按下 [ACPI 電源按鈕] 的事件到虛擬機器</translation>
</message>
<message>
<source>&amp;Close...</source>
@@ -401,7 +397,7 @@
<name>UIDescriptionPagePrivate</name>
<message>
<source>No description. Press the Edit button below to add it.</source>
- <translation>沒有任何描述。按下方的 [編輯] 按鈕來加入它。</translation>
+ <translation>沒有任何描述。 按下方的 [編輯] 按鈕來加入它。</translation>
</message>
<message>
<source>Edit</source>
@@ -472,7 +468,7 @@
<message>
<source>Nested Paging</source>
<comment>details report</comment>
- <translation>巢狀分頁</translation>
+ <translation>Nested Paging</translation>
</message>
<message>
<source>PAE/NX</source>
@@ -747,7 +743,7 @@
</message>
<message>
<source>&amp;Local Filesystem </source>
- <translation>本機檔案系統(&amp;L)</translation>
+ <translation>本機檔案系統(&amp;L) </translation>
</message>
<message>
<source>Sun &amp;Cloud</source>
@@ -849,7 +845,7 @@
</message>
<message>
<source>Here you can change additional configuration values of the selected virtual machines. You can modify most of the properties shown by double-clicking on the items.</source>
- <translation>在此您可以變更選取虛擬機器的額外組態值。 您可以在項目連按兩下修改大多數已顯示的內容。</translation>
+ <translation>在此您可以變更選取虛擬機器的額外組態值。 您可以在項目按兩下修改大多數已顯示的內容。</translation>
</message>
</context>
<context>
@@ -1005,7 +1001,7 @@
</message>
<message>
<source>Extensions</source>
- <translation type="unfinished">擴充</translation>
+ <translation>擴充</translation>
</message>
</context>
<context>
@@ -1058,14 +1054,6 @@
<translation>顯示於虛擬機器視窗中使用的 Host 鍵。 啟用項目欄位並按下新的 Host 鍵。 請注意,不能使用字母數字、游標移動與編輯鍵。</translation>
</message>
<message>
- <source>Reset Host Key</source>
- <translation type="obsolete">重設熱鍵</translation>
- </message>
- <message>
- <source>Resets the key used as a Host Key in the VM window.</source>
- <translation type="obsolete">重設在 VM 視窗中作為熱鍵的按鍵。</translation>
- </message>
- <message>
<source>When checked, the keyboard is automatically captured every time the VM window is activated. When the keyboard is captured, all keystrokes (including system ones like Alt-Tab) are directed to the VM.</source>
<translation>勾選時,每次虛擬機器視窗啟動時,鍵盤會自動擷取。 當擷取鍵盤時,所有的按鍵動作 (包括系統,如 Alt-Tab) 都會直接對虛擬機器。</translation>
</message>
@@ -1075,11 +1063,11 @@
</message>
<message>
<source>Reset host combination</source>
- <translation type="unfinished"></translation>
+ <translation>重設 Host 鍵組合</translation>
</message>
<message>
<source>Resets the key combination used as the host combination in the VM window.</source>
- <translation type="unfinished"></translation>
+ <translation>重設在 VM 視窗中作為 Host 鍵組合使用的按鍵組合。</translation>
</message>
</context>
<context>
@@ -1272,12 +1260,8 @@
<translation>名稱</translation>
</message>
<message>
- <source>New Host-Only Interface</source>
- <translation type="obsolete">新增「僅限主機」介面</translation>
- </message>
- <message>
<source>Networking</source>
- <translation type="unfinished"></translation>
+ <translation>網路</translation>
</message>
</context>
<context>
@@ -1437,11 +1421,11 @@
<name>UIHotKeyEditor</name>
<message>
<source>Left </source>
- <translation>←</translation>
+ <translation>← </translation>
</message>
<message>
<source>Right </source>
- <translation>→</translation>
+ <translation>→ </translation>
</message>
<message>
<source>Left Shift</source>
@@ -1485,7 +1469,7 @@
</message>
<message>
<source>Caps Lock</source>
- <translation>Caps Lock</translation>
+ <translation>大寫鎖定</translation>
</message>
<message>
<source>Scroll Lock</source>
@@ -1496,124 +1480,8 @@
<translation>&lt;key_%1&gt;</translation>
</message>
<message>
- <source>Pause</source>
- <translation type="obsolete">Pause</translation>
- </message>
- <message>
- <source>Print Screen</source>
- <translation type="obsolete">Print Screen</translation>
- </message>
- <message>
- <source>F1</source>
- <translation type="obsolete">F1</translation>
- </message>
- <message>
- <source>F2</source>
- <translation type="obsolete">F2</translation>
- </message>
- <message>
- <source>F3</source>
- <translation type="obsolete">F3</translation>
- </message>
- <message>
- <source>F4</source>
- <translation type="obsolete">F4</translation>
- </message>
- <message>
- <source>F5</source>
- <translation type="obsolete">F5</translation>
- </message>
- <message>
- <source>F6</source>
- <translation type="obsolete">F6</translation>
- </message>
- <message>
- <source>F7</source>
- <translation type="obsolete">F7</translation>
- </message>
- <message>
- <source>F8</source>
- <translation type="obsolete">F8</translation>
- </message>
- <message>
- <source>F9</source>
- <translation type="obsolete">F9</translation>
- </message>
- <message>
- <source>F10</source>
- <translation type="obsolete">F10</translation>
- </message>
- <message>
- <source>F11</source>
- <translation type="obsolete">F11</translation>
- </message>
- <message>
- <source>F12</source>
- <translation type="obsolete">F12</translation>
- </message>
- <message>
- <source>F13</source>
- <translation type="obsolete">F13</translation>
- </message>
- <message>
- <source>F14</source>
- <translation type="obsolete">F14</translation>
- </message>
- <message>
- <source>F15</source>
- <translation type="obsolete">F15</translation>
- </message>
- <message>
- <source>F16</source>
- <translation type="obsolete">F16</translation>
- </message>
- <message>
- <source>F17</source>
- <translation type="obsolete">F17</translation>
- </message>
- <message>
- <source>F18</source>
- <translation type="obsolete">F18</translation>
- </message>
- <message>
- <source>F19</source>
- <translation type="obsolete">F19</translation>
- </message>
- <message>
- <source>F20</source>
- <translation type="obsolete">F20</translation>
- </message>
- <message>
- <source>F21</source>
- <translation type="obsolete">F21</translation>
- </message>
- <message>
- <source>F22</source>
- <translation type="obsolete">F22</translation>
- </message>
- <message>
- <source>F23</source>
- <translation type="obsolete">F23</translation>
- </message>
- <message>
- <source>F24</source>
- <translation type="obsolete">F24</translation>
- </message>
- <message>
- <source>Num Lock</source>
- <translation type="obsolete">Num Lock</translation>
- </message>
- <message>
- <source>Forward</source>
- <translation type="obsolete">下一步</translation>
- </message>
- <message>
- <source>Back</source>
- <translation type="obsolete">上一步</translation>
- </message>
- <message>
<source>None</source>
- <translation type="unfinished">無</translation>
+ <translation>無</translation>
</message>
</context>
<context>
@@ -1650,7 +1518,7 @@
<name>UIImportApplianceWzdPage2</name>
<message>
<source>These are the virtual machines contained in the appliance and the suggested settings of the imported VirtualBox machines. You can change many of the properties shown by double-clicking on the items and disable others using the check boxes below.</source>
- <translation>這些是包含在應用裝置的虛擬機器和匯入 VirtualBox 機器的建議設定值。 您可以在項目連按兩下變更許多顯示的內容和使用以下核取方塊停用其它。</translation>
+ <translation>這些是包含在應用裝置的虛擬機器和匯入 VirtualBox 機器的建議設定值。 您可以在項目按兩下變更許多顯示的內容和使用以下核取方塊停用其它。</translation>
</message>
<message>
<source>Appliance Import Settings</source>
@@ -1762,7 +1630,7 @@
<message>
<source>Indicates the status of the hardware virtualization features used by this virtual machine:&lt;br&gt;&lt;nobr&gt;&lt;b&gt;%1:&lt;/b&gt;&amp;nbsp;%2&lt;/nobr&gt;&lt;br&gt;&lt;nobr&gt;&lt;b&gt;%3:&lt;/b&gt;&amp;nbsp;%4&lt;/nobr&gt;</source>
<comment>Virtualization Stuff LED</comment>
- <translation>指示這個虛擬機器使用的硬體虛擬化功能之狀態:&lt;br&gt;&lt;nobr&gt;&lt;b&gt;%1:&lt;/b&gt;&amp;nbsp;%2&lt;/nobr&gt;&lt;br&gt;&lt;nobr&gt;&lt;b&gt;%3:&lt;/b&gt;&amp;nbsp;%4&lt;/nobr&gt;</translation>
+ <translation>指示這部虛擬機器使用的硬體虛擬化功能之狀態:&lt;br&gt;&lt;nobr&gt;&lt;b&gt;%1:&lt;/b&gt;&amp;nbsp;%2&lt;/nobr&gt;&lt;br&gt;&lt;nobr&gt;&lt;b&gt;%3:&lt;/b&gt;&amp;nbsp;%4&lt;/nobr&gt;</translation>
</message>
<message>
<source>&lt;br&gt;&lt;nobr&gt;&lt;b&gt;%1:&lt;/b&gt;&amp;nbsp;%2&lt;/nobr&gt;</source>
@@ -1789,10 +1657,6 @@
<context>
<name>UIMachineLogic</name>
<message>
- <source>VirtualBox OSE</source>
- <translation type="obsolete">VirtualBox 開放原始碼版本 (OSE)</translation>
- </message>
- <message>
<source> EXPERIMENTAL build %1r%2 - %3</source>
<translation>EXPERIMENTAL 組建 %1r%2 - %3</translation>
</message>
@@ -1826,7 +1690,7 @@
</message>
<message>
<source>No supported devices connected to the host PC</source>
- <translation>沒有已支援的裝置連接到主機 PC</translation>
+ <translation>主機 PC 未連接已支援的裝置</translation>
</message>
</context>
<context>
@@ -1864,7 +1728,7 @@
</message>
<message>
<source>&lt;qt&gt;%1&amp;nbsp;MB&lt;/qt&gt;</source>
- <translation>&lt;qt&gt;%1&amp;nbsp;MB&lt;/qt&gt;</translation>
+ <translation>&lt;qt&gt;%1&amp;nbsp; MB&lt;/qt&gt;</translation>
</message>
<message>
<source>&amp;Video</source>
@@ -1971,7 +1835,7 @@
<name>UIMachineSettingsGeneral</name>
<message>
<source>Displays the path where snapshots of this virtual machine will be stored. Be aware that snapshots can take quite a lot of disk space.</source>
- <translation>顯示將儲存這個虛擬機器快照的路徑。 注意,快照可能需要相當多的磁碟空間。</translation>
+ <translation>顯示將儲存這部虛擬機器快照的路徑。 注意,快照可能需要相當多的磁碟空間。</translation>
</message>
<message>
<source>&amp;Basic</source>
@@ -2091,7 +1955,7 @@
</message>
<message>
<source>Selects the name of the network adapter for &lt;b&gt;Bridged Adapter&lt;/b&gt; or &lt;b&gt;Host-only Adapter&lt;/b&gt; attachments and the name of the network &lt;b&gt;Internal Network&lt;/b&gt; attachments.</source>
- <translation>選取&lt;b&gt;橋接介面卡&lt;/b&gt;或&lt;b&gt;「僅限主機」介面卡&lt;/b&gt;附件的網路卡名稱與&lt;b&gt;內部網路&lt;/b&gt;附件的網路名稱。</translation>
+ <translation>選取&lt;b&gt;橋接介面卡&lt;/b&gt;或&lt;b&gt;「僅限主機」介面卡&lt;/b&gt;附加的網路卡名稱與&lt;b&gt;內部網路&lt;/b&gt;附加的網路名稱。</translation>
</message>
<message>
<source>A&amp;dvanced</source>
@@ -2171,7 +2035,7 @@
</message>
<message>
<source>Displays the IRQ number of this parallel port. This should be a whole number between &lt;tt&gt;0&lt;/tt&gt; and &lt;tt&gt;255&lt;/tt&gt;. Values greater than &lt;tt&gt;15&lt;/tt&gt; may only be used if the &lt;b&gt;IO APIC&lt;/b&gt; setting is enabled for this virtual machine.</source>
- <translation>顯示這個串列埠的 IRQ 號碼。這應該是介於 &lt;tt&gt;0&lt;/tt&gt; 與 &lt;tt&gt;255&lt;/tt&gt; 之間的整數。 只有當這個虛擬機器啟用 &lt;b&gt;IO APIC&lt;/b&gt; 時,才能使用大於 &lt;tt&gt;15&lt;/tt&gt; 的值。</translation>
+ <translation>顯示這個串列埠的 IRQ 號碼。這應該是介於 &lt;tt&gt;0&lt;/tt&gt; 與 &lt;tt&gt;255&lt;/tt&gt; 之間的整數。 只有當這部虛擬機器啟用 &lt;b&gt;IO APIC&lt;/b&gt; 時,才能使用大於 &lt;tt&gt;15&lt;/tt&gt; 的值。</translation>
</message>
<message>
<source>Displays the base I/O port address of this parallel port. Valid values are integer numbers in range from &lt;tt&gt;0&lt;/tt&gt; to &lt;tt&gt;0xFFFF&lt;/tt&gt;.</source>
@@ -2182,15 +2046,15 @@
<name>UIMachineSettingsParallelPage</name>
<message>
<source>Duplicate port number selected </source>
- <translation>選取重複的連接埠號</translation>
+ <translation>選取重複的連接埠號 </translation>
</message>
<message>
<source>Port path not specified </source>
- <translation>未指定連接埠路徑</translation>
+ <translation>未指定連接埠路徑 </translation>
</message>
<message>
<source>Duplicate port path entered </source>
- <translation>輸入重複的連接埠路徑</translation>
+ <translation>輸入重複的連接埠路徑 </translation>
</message>
</context>
<context>
@@ -2256,7 +2120,7 @@
</message>
<message>
<source>Lists all shared folders accessible to this machine. Use &apos;net use x: \\vboxsvr\share&apos; to access a shared folder named &lt;i&gt;share&lt;/i&gt; from a DOS-like OS, or &apos;mount -t vboxsf share mount_point&apos; to access it from a Linux OS. This feature requires Guest Additions.</source>
- <translation>列出所有可存取這個機器的共用資料夾。 從類似 DOS 的作業系統使用 [net use x: \\vboxsvr\share] 存取名為 &lt;i&gt; share &lt;/i&gt; 的共用資料夾,或從 Linux 作業系統 [mount -t vboxsf share mount_point] 來存取它。 這個功能需要 Guest Additions 。</translation>
+ <translation>列出所有可存取這部機器的共用資料夾。 從類似 DOS 的作業系統使用 [net use x: \\vboxsvr\share] 存取名為 &lt;i&gt; share &lt;/i&gt; 的共用資料夾,或從 Linux 作業系統 [mount -t vboxsf share mount_point] 來存取它。 這個功能需要 Guest Additions 。</translation>
</message>
<message>
<source>Name</source>
@@ -2403,7 +2267,7 @@
</message>
<message>
<source>Displays the IRQ number of this serial port. This should be a whole number between &lt;tt&gt;0&lt;/tt&gt; and &lt;tt&gt;255&lt;/tt&gt;. Values greater than &lt;tt&gt;15&lt;/tt&gt; may only be used if the &lt;b&gt;IO APIC&lt;/b&gt; setting is enabled for this virtual machine.</source>
- <translation>顯示這個序列埠的 IRQ 號碼。這應該是介於 &lt;tt&gt;0&lt;/tt&gt; 與 &lt;tt&gt;255&lt;/tt&gt; 之間的整數。 只有當這個虛擬機器啟用 &lt;b&gt;IO APIC&lt;/b&gt; 時,才能使用大於 &lt;tt&gt;15&lt;/tt&gt; 的值。</translation>
+ <translation>顯示這個序列埠的 IRQ 號碼。這應該是介於 &lt;tt&gt;0&lt;/tt&gt; 與 &lt;tt&gt;255&lt;/tt&gt; 之間的整數。 只有當這部虛擬機器啟用 &lt;b&gt;IO APIC&lt;/b&gt; 時,才能使用大於 &lt;tt&gt;15&lt;/tt&gt; 的值。</translation>
</message>
<message>
<source>Displays the base I/O port address of this serial port. Valid values are integer numbers in range from &lt;tt&gt;0&lt;/tt&gt; to &lt;tt&gt;0xFFFF&lt;/tt&gt;.</source>
@@ -2414,15 +2278,15 @@
<name>UIMachineSettingsSerialPage</name>
<message>
<source>Duplicate port number selected </source>
- <translation>選取重複的連接埠號</translation>
+ <translation>選取重複的連接埠號 </translation>
</message>
<message>
<source>Port path not specified </source>
- <translation>未指定連接埠路徑</translation>
+ <translation>未指定連接埠路徑 </translation>
</message>
<message>
<source>Duplicate port path entered </source>
- <translation>輸入重複的連接埠路徑</translation>
+ <translation>輸入重複的連接埠路徑 </translation>
</message>
</context>
<context>
@@ -2541,7 +2405,7 @@
</message>
<message>
<source>Contains all storage controllers for this machine and the virtual images and host drives attached to them.</source>
- <translation>包含這個機器的所有存放控制器與附加到它們的虛擬機器及主機裝置。</translation>
+ <translation>包含這部機器的所有存放控制器與附加到它們的虛擬機器及主機裝置。</translation>
</message>
<message>
<source>Information</source>
@@ -2549,7 +2413,7 @@
</message>
<message>
<source>The Storage Tree can contain several controllers of different types. This machine currently has no controllers.</source>
- <translation>存放裝置樹能包含數個不同類型的控制器。 這個機器目前沒有控制器。</translation>
+ <translation>存放裝置樹能包含數個不同類型的控制器。 這部機器目前沒有控制器。</translation>
</message>
<message>
<source>Attributes</source>
@@ -2716,12 +2580,12 @@
</message>
<message>
<source>&lt;qt&gt;%1&amp;nbsp;MB&lt;/qt&gt;</source>
- <translation>&lt;qt&gt;%1&amp;nbsp;MB&lt;/qt&gt;</translation>
+ <translation>&lt;qt&gt;%1&amp;nbsp; MB&lt;/qt&gt;</translation>
</message>
<message>
<source>&lt;qt&gt;%1&amp;nbsp;CPU&lt;/qt&gt;</source>
<comment>%1 is 1 for now</comment>
- <translation>&lt;qt&gt;%1&amp;nbsp;顆&amp;nbsp;CPU&lt;/qt&gt;</translation>
+ <translation>&lt;qt&gt;%1&amp;nbsp; 顆 &amp;nbsp;CPU&lt;/qt&gt;</translation>
</message>
<message>
<source>&amp;Motherboard</source>
@@ -2809,16 +2673,16 @@
</message>
<message>
<source>When checked, the virtual machine will try to make use of the nested paging extension of Intel VT-x and AMD-V.</source>
- <translation>勾選時,虛擬機器將嘗試使用 Intel VT-x 和 AMD-V 的巢狀分頁擴充。</translation>
+ <translation>勾選時,虛擬機器將嘗試使用 Intel VT-x 和 AMD-V 的 Nested Paging 擴充。</translation>
</message>
<message>
<source>Enable Nested Pa&amp;ging</source>
- <translation>啟用巢狀分頁(&amp;G)</translation>
+ <translation>啟用 Nested Paging(&amp;G)</translation>
</message>
<message>
<source>&lt;qt&gt;%1&amp;nbsp;CPUs&lt;/qt&gt;</source>
<comment>%1 is host cpu count * 2 for now</comment>
- <translation>&lt;qt&gt;%1&amp;nbsp;顆&amp;nbsp;CPU&lt;/qt&gt;</translation>
+ <translation>&lt;qt&gt;%1&amp;nbsp; 顆 &amp;nbsp;CPU&lt;/qt&gt;</translation>
</message>
<message>
<source>When checked, the guest will support the Extended Firmware Interface (EFI), which is required to boot certain guest OSes. Non-EFI aware OSes will not be able to boot if this option is activated.</source>
@@ -2854,7 +2718,7 @@
</message>
<message>
<source>Defines chipset type used in this VM.</source>
- <translation>定義在這個 VM 中使用的晶片組類型。</translation>
+ <translation>定義在這部 VM 中使用的晶片組類型。</translation>
</message>
<message>
<source>you have assigned ICH9 chipset type to this VM. It will not work properly unless the IO-APIC feature is also enabled. This will be done automatically when you accept the VM Settings by pressing the OK button.</source>
@@ -2914,11 +2778,11 @@
<message>
<source>New Filter %1</source>
<comment>usb</comment>
- <translation>新增篩選器 %1</translation>
+ <translation>新篩選器 %1</translation>
</message>
<message>
<source>When checked, enables the virtual USB controller of this machine.</source>
- <translation>勾選時,啟用這個機器的虛擬 USB 控制器。</translation>
+ <translation>勾選時,啟用這部機器的虛擬 USB 控制器。</translation>
</message>
<message>
<source>Enable &amp;USB Controller</source>
@@ -2926,7 +2790,7 @@
</message>
<message>
<source>When checked, enables the virtual USB EHCI controller of this machine. The USB EHCI controller provides USB 2.0 support.</source>
- <translation>勾選時,啟用這個機器的虛擬 USB EHCI 控制器。 USB EHCI 控制器提供 USB 2.0 支援。</translation>
+ <translation>勾選時,啟用這部機器的虛擬 USB EHCI 控制器。 USB EHCI 控制器提供 USB 2.0 支援。</translation>
</message>
<message>
<source>Enable USB 2.0 (E&amp;HCI) Controller</source>
@@ -2938,7 +2802,7 @@
</message>
<message>
<source>Lists all USB filters of this machine. The checkbox to the left defines whether the particular filter is enabled or not. Use the context menu or buttons to the right to add or remove USB filters.</source>
- <translation>列出這個機器的所有 USB 篩選器。 左側的核取方塊定義是否啟用特定的篩選器。 使用內容功能表或右側的按鈕加入或移除 USB 篩選器。</translation>
+ <translation>列出這部機器的所有 USB 篩選器。 左側的核取方塊定義是否啟用特定的篩選器。 使用內容功能表或右側的按鈕加入或移除 USB 篩選器。</translation>
</message>
<message>
<source>[filter]</source>
@@ -2986,7 +2850,7 @@
</message>
<message>
<source>USB 2.0 is currently enabled for this virtual machine. However this requires the &lt;b&gt;%1&lt;/b&gt; to be installed. Please install the Extension Pack from the VirtualBox download site. After this you will be able to re-enable USB 2.0. It will be disabled in the meantime unless you cancel the current settings changes.</source>
- <translation type="unfinished"></translation>
+ <translation>USB 2.0 目前在這部虛擬機器啟用。 然而這需要安裝 &lt;b&gt;%1&lt;/b&gt;。 請從 VirtualBox 下載網站安裝擴充包。 在此之後您將可以重新安裝 USB 2.0。 除非您取消目前設定變更,否則將在此期間停用。</translation>
</message>
</context>
<context>
@@ -3477,7 +3341,7 @@
</message>
<message>
<source>&lt;p&gt;Saves the current execution state of the virtual machine to the physical hard disk of the host PC.&lt;/p&gt;&lt;p&gt;Next time this machine is started, it will be restored from the saved state and continue execution from the same place you saved it at, which will let you continue your work immediately.&lt;/p&gt;&lt;p&gt;Note that saving the machine state may take a long time, depending on the guest operating system type and the amount of memory you assigned to the virtual machine.&lt;/p&gt;</source>
- <translation>&lt;p&gt;儲存虛擬機器的目前執行狀態到主機 PC 的實體硬碟。&lt;/p&gt;&lt;p&gt;下次啟動這個機器,它將從儲存狀態還原並從您儲存的相同位置繼續執行,讓您立即繼續您的工作。&lt;/p&gt;&lt;p&gt;請注意儲存機器狀態可能需要很長時間取決於客體作業系統類型與分配至虛擬機器的記憶體量。&lt;/p&gt;</translation>
+ <translation>&lt;p&gt;儲存虛擬機器的目前執行狀態到主機 PC 的實體硬碟。&lt;/p&gt;&lt;p&gt;下次啟動這部機器,它將從儲存狀態還原並從您儲存的相同位置繼續執行,讓您立即繼續您的工作。&lt;/p&gt;&lt;p&gt;請注意儲存機器狀態可能需要很長時間取決於客體作業系統類型與分配至虛擬機器的記憶體量。&lt;/p&gt;</translation>
</message>
<message>
<source>&amp;Save the machine state</source>
@@ -3623,7 +3487,7 @@
</message>
<message>
<source>you have selected a 64-bit guest OS type for this VM. As such guests require hardware virtualization (VT-x/AMD-V), this feature will be enabled automatically.</source>
- <translation>您已針對這個 VM 選取 64 位元的客體作業系統類型。 如此的客體需要硬體虛擬化 (VT-x/AMD-V),這個功能將會自動啟用。</translation>
+ <translation>您已針對這部 VM 選取 64 位元的客體作業系統類型。 如此的客體需要硬體虛擬化 (VT-x/AMD-V),這個功能將會自動啟用。</translation>
</message>
<message>
<source>you have 2D Video Acceleration enabled. As 2D Video Acceleration is supported for Windows guests only, this feature will be disabled.</source>
@@ -3685,7 +3549,7 @@
</message>
<message>
<source>Vendor-URL</source>
- <translation>供應商-URL</translation>
+ <translation>供應商 URL</translation>
</message>
<message>
<source>Version</source>
@@ -4425,7 +4289,7 @@
<message>
<source>Nested Paging</source>
<comment>details report</comment>
- <translation>巢狀分頁</translation>
+ <translation>Nested Paging</translation>
</message>
<message>
<source>Enabled</source>
@@ -4827,7 +4691,7 @@
</message>
<message>
<source>Nested Paging</source>
- <translation>巢狀分頁</translation>
+ <translation>Nested Paging</translation>
</message>
<message>
<source>Shareable</source>
@@ -4974,10 +4838,6 @@
<context>
<name>VBoxGlobalSettings</name>
<message>
- <source>&apos;%1 (0x%2)&apos; is an invalid host key code.</source>
- <translation type="obsolete">「%1 (0x%2)」是無效的主機鍵碼。</translation>
- </message>
- <message>
<source>The value &apos;%1&apos; of the key &apos;%2&apos; doesn&apos;t match the regexp constraint &apos;%3&apos;.</source>
<translation>按鍵「%2」的值「%1」不符合正規運算式限制「%3」。</translation>
</message>
@@ -4987,7 +4847,7 @@
</message>
<message>
<source>&apos;%1&apos; is an invalid host-combination code-sequence.</source>
- <translation type="unfinished"></translation>
+ <translation>&apos;%1&apos; 不是有效的主機組合代碼序列。</translation>
</message>
</context>
<context>
@@ -5031,7 +4891,7 @@
</message>
<message>
<source>Find </source>
- <translation>尋找</translation>
+ <translation>尋找 </translation>
</message>
<message>
<source>Enter a search string here</source>
@@ -5255,11 +5115,11 @@
</message>
<message>
<source>Displays the operating system family that you plan to install into this virtual machine.</source>
- <translation>顯示您計畫要安裝於這個虛擬機器的作業系統家族。</translation>
+ <translation>顯示您計畫要安裝於這部虛擬機器的作業系統家族。</translation>
</message>
<message>
<source>Displays the operating system type that you plan to install into this virtual machine (called a guest operating system).</source>
- <translation>顯示您計畫要安裝於這個虛擬機器的作業系統類型 (稱之為客體作業系統)。</translation>
+ <translation>顯示您計畫要安裝於這部虛擬機器的作業系統類型 (稱之為客體作業系統)。</translation>
</message>
<message>
<source>&amp;Version:</source>
@@ -5433,7 +5293,7 @@
<message>
<source>Severity: </source>
<comment>runtime error info</comment>
- <translation>嚴重性:</translation>
+ <translation>嚴重性: </translation>
</message>
<message>
<source>&lt;p&gt;A fatal error has occurred during virtual machine execution! The virtual machine will be powered off. Please copy the following error message using the clipboard to help diagnose the problem:&lt;/p&gt;</source>
@@ -5450,27 +5310,27 @@
<message>
<source>Result&amp;nbsp;Code: </source>
<comment>error info</comment>
- <translation>結果碼:</translation>
+ <translation>結果碼: </translation>
</message>
<message>
<source>Component: </source>
<comment>error info</comment>
- <translation>元件:</translation>
+ <translation>元件: </translation>
</message>
<message>
<source>Interface: </source>
<comment>error info</comment>
- <translation>介面:</translation>
+ <translation>介面: </translation>
</message>
<message>
<source>Callee: </source>
<comment>error info</comment>
- <translation>被呼叫端:</translation>
+ <translation>被呼叫端: </translation>
</message>
<message>
<source>Callee&amp;nbsp;RC: </source>
<comment>error info</comment>
- <translation>被呼叫端&amp;nbsp;RC:</translation>
+ <translation>被呼叫端&amp;nbsp;RC: </translation>
</message>
<message>
<source>&lt;p&gt;Could not find a language file for the language &lt;b&gt;%1&lt;/b&gt; in the directory &lt;b&gt;&lt;nobr&gt;%2&lt;/nobr&gt;&lt;/b&gt;.&lt;/p&gt;&lt;p&gt;The language will be temporarily reset to the system default language. Please go to the &lt;b&gt;Preferences&lt;/b&gt; dialog which you can open from the &lt;b&gt;File&lt;/b&gt; menu of the main VirtualBox window, and select one of the existing languages on the &lt;b&gt;Language&lt;/b&gt; page.&lt;/p&gt;</source>
@@ -6105,10 +5965,6 @@
<translation>&lt;p&gt;未儲存連接埠轉送組態的變更。&lt;/p&gt;&lt;p&gt;如果您進行,您的變更將捨棄。&lt;/p&gt;</translation>
</message>
<message>
- <source>Sorry, some generic error happens.</source>
- <translation type="obsolete">抱歉,發生某些圖形錯誤。</translation>
- </message>
- <message>
<source>Failed to attach the hard disk (&lt;nobr&gt;&lt;b&gt;%1&lt;/b&gt;&lt;/nobr&gt;) to the slot &lt;i&gt;%2&lt;/i&gt; of the machine &lt;b&gt;%3&lt;/b&gt;.</source>
<translation>在機器 &lt;b&gt;%3&lt;/b&gt; 的插槽 &lt;i&gt;%2&lt;/i&gt; 附加硬碟裝置 (&lt;nobr&gt;&lt;b&gt;%1&lt;/b&gt;&lt;/nobr&gt;) 失敗。</translation>
</message>
@@ -6151,7 +6007,7 @@
</message>
<message>
<source>&lt;p&gt;You are about to install a VirtualBox extension pack. Extension packs complement the functionality of VirtualBox and can contain system level software that could be potentially harmful to your system. Please review the description below and only proceed if you have obtained the extension pack from a trusted source.&lt;/p&gt;&lt;p&gt;&lt;table cellpadding=0 cellspacing=0&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;Name:&amp;nbsp;&amp;nbsp;&lt;/b&gt;&lt;/td&gt;&lt;td&gt;%1&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;Version:&amp;nbsp;&amp;nbsp;&lt;/b&gt;&lt;/td&gt;&lt;td&gt;%2&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;Description:&amp;nbsp;&amp;nbsp;&lt;/b&gt;&lt;/td&gt;&lt;td&gt;%3&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/p&gt;</source>
- <translation>&lt;p&gt;您即將安裝 VirtualBox 擴充包。 擴充包補充 VirtualBox 的功能且可以包含系統層級的軟體,可能潛在危害您的系統。 請檢閱以下描述,並只進行從信任來源所取得的擴充包。&lt;/p&gt;&lt;p&gt;&lt;table cellpadding=0 cellspacing=0&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;名稱:&amp;nbsp;&amp;nbsp;&lt;/b&gt;&lt;/td&gt;&lt;td&gt;%1&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;版本:&amp;nbsp;&amp;nbsp;&lt;/b&gt;&lt;/td&gt;&lt;td&gt;%2&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;描述:&amp;nbsp;&amp;nbsp;&lt;/b&gt;&lt;/td&gt;&lt;td&gt;%3&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/p&gt;</translation>
+ <translation>&lt;p&gt;您即將安裝 VirtualBox 擴充包。 擴充包補充 VirtualBox 的功能且包含系統層級的軟體,可能潛在危害您的系統。 請檢閱以下描述,並只進行從信任來源所取得的擴充包。&lt;/p&gt;&lt;p&gt;&lt;table cellpadding=0 cellspacing=0&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;名稱:&amp;nbsp;&amp;nbsp;&lt;/b&gt;&lt;/td&gt;&lt;td&gt;%1&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;版本:&amp;nbsp;&amp;nbsp;&lt;/b&gt;&lt;/td&gt;&lt;td&gt;%2&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;描述:&amp;nbsp;&amp;nbsp;&lt;/b&gt;&lt;/td&gt;&lt;td&gt;%3&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/p&gt;</translation>
</message>
<message>
<source>&amp;Install</source>
@@ -6195,15 +6051,15 @@
</message>
<message>
<source>Deletion of all files belonging to the VM is currently disabled on Windows/x64 to prevent a crash. That will be fixed in the next release.</source>
- <translation type="unfinished"></translation>
+ <translation>刪除所有依賴 VM 的檔案目前已在 Windows/x64 停用以防止當機。 其將在下次發佈時修復。</translation>
</message>
<message>
<source>&lt;p&gt;Cannot create the machine folder &lt;b&gt;%1&lt;/b&gt; in the parent folder &lt;nobr&gt;&lt;b&gt;%2&lt;/b&gt;.&lt;/nobr&gt;&lt;/p&gt;&lt;p&gt;Please check that the parent really exists and that you have permissions to create the machine folder.&lt;/p&gt;</source>
- <translation type="unfinished"></translation>
+ <translation>&lt;p&gt;無法建立機器資料夾 &lt;b&gt;%1&lt;/b&gt; 在上層資料夾 &lt;nobr&gt;&lt;b&gt;%2&lt;/b&gt;。&lt;/nobr&gt;&lt;/p&gt;&lt;p&gt;請檢查上層真的存在且您有權限建立機器資料夾。&lt;/p&gt;</translation>
</message>
<message>
<source>&lt;p&gt;USB 2.0 is currently enabled for this virtual machine. However this requires the &lt;b&gt;&lt;nobr&gt;%1&lt;/nobr&gt;&lt;/b&gt; to be installed.&lt;/p&gt;&lt;p&gt;Please install the Extension Pack from the VirtualBox download site. After this you will be able to re-enable USB 2.0. It will be disabled in the meantime unless you cancel the current settings changes.&lt;/p&gt;</source>
- <translation type="unfinished"></translation>
+ <translation>&lt;p&gt;USB 2.0 目前在這部虛擬機器啟用。 然而這需要安裝 &lt;b&gt;&lt;nobr&gt;%1&lt;/nobr&gt;&lt;/b&gt;。&lt;/p&gt;&lt;p&gt;請從 VirtualBox 下載網站安裝擴充包。 在此之後您將可以重新安裝 USB 2.0。 除非您取消目前設定變更,否則將在此期間停用。&lt;/p&gt;</translation>
</message>
</context>
<context>
@@ -6231,10 +6087,6 @@
<context>
<name>VBoxSelectorWnd</name>
<message>
- <source>VirtualBox OSE</source>
- <translation type="obsolete">VirtualBox 開放原始碼版本 (OSE)</translation>
- </message>
- <message>
<source>&amp;Preferences...</source>
<comment>global settings</comment>
<translation>喜好設定(&amp;P)...</translation>
@@ -6312,10 +6164,6 @@
<translation>顯示選取虛擬機器的記錄檔案</translation>
</message>
<message>
- <source>R&amp;esume</source>
- <translation type="obsolete">繼續執行(&amp;E)</translation>
- </message>
- <message>
<source>Resume the execution of the virtual machine</source>
<translation>繼續執行虛擬機器</translation>
</message>
@@ -6531,7 +6379,7 @@
<message>
<source>%1 since %2</source>
<comment>Current State (time or date + time)</comment>
- <translation>%1 自從 %2</translation>
+ <translation>自從 %2 %1</translation>
</message>
<message>
<source>Snapshot %1</source>
diff --git a/src/VBox/Frontends/VirtualBox/nls/qt_bg.ts b/src/VBox/Frontends/VirtualBox/nls/qt_bg.ts
index 5f5801244..f7181d84f 100644
--- a/src/VBox/Frontends/VirtualBox/nls/qt_bg.ts
+++ b/src/VBox/Frontends/VirtualBox/nls/qt_bg.ts
@@ -3681,35 +3681,35 @@ Please choose a different file name.</source>
</message>
<message>
<source>System Request</source>
- <translation type="unfinished"></translation>
+ <translation>Системна заявка</translation>
</message>
<message>
<source>Select</source>
- <translation type="unfinished"></translation>
+ <translation>Избор</translation>
</message>
<message>
<source>Yes</source>
- <translation type="unfinished"></translation>
+ <translation>Да</translation>
</message>
<message>
<source>No</source>
- <translation type="unfinished"></translation>
+ <translation>Не</translation>
</message>
<message>
<source>Context1</source>
- <translation type="unfinished"></translation>
+ <translation>Контекст1</translation>
</message>
<message>
<source>Context2</source>
- <translation type="unfinished"></translation>
+ <translation>Контекст2</translation>
</message>
<message>
<source>Context3</source>
- <translation type="unfinished"></translation>
+ <translation>Контекст3</translation>
</message>
<message>
<source>Context4</source>
- <translation type="unfinished"></translation>
+ <translation>Контекст4</translation>
</message>
<message>
<source>Call</source>
@@ -4440,7 +4440,7 @@ Please choose a different file name.</source>
<name>QXml</name>
<message>
<source>no error occurred</source>
- <translation type="unfinished">не възникна грешка</translation>
+ <translation>не възникна грешка</translation>
</message>
<message>
<source>error triggered by consumer</source>
diff --git a/src/VBox/Frontends/VirtualBox/nls/qt_zh_TW.ts b/src/VBox/Frontends/VirtualBox/nls/qt_zh_TW.ts
index 3086e917d..1bbe31123 100644
--- a/src/VBox/Frontends/VirtualBox/nls/qt_zh_TW.ts
+++ b/src/VBox/Frontends/VirtualBox/nls/qt_zh_TW.ts
@@ -1216,7 +1216,7 @@ Do you want to delete it anyway?</source>
</message>
<message>
<source>Show </source>
- <translation>顯示</translation>
+ <translation>顯示 </translation>
</message>
<message>
<source>Forward</source>
@@ -3652,7 +3652,7 @@ Please choose a different file name.</source>
</message>
<message>
<source>Caps Lock</source>
- <translation>Caps Lock</translation>
+ <translation>大寫鎖定</translation>
</message>
<message>
<source>Num Lock</source>
@@ -4014,15 +4014,15 @@ Please choose a different file name.</source>
</message>
<message>
<source>LRE Start of left-to-right embedding</source>
- <translation>LRE 開始的左到右嵌入</translation>
+ <translation>LRE 開始的從左到右嵌入</translation>
</message>
<message>
<source>RLE Start of right-to-left embedding</source>
- <translation>RLE 開始的右到左嵌入</translation>
+ <translation>RLE 開始的從右到左嵌入</translation>
</message>
<message>
<source>LRO Start of left-to-right override</source>
- <translation>LRO 開始的左到右覆寫</translation>
+ <translation>LRO 開始的從左到右覆寫</translation>
</message>
<message>
<source>RLO Start of right-to-left override</source>
@@ -4088,7 +4088,7 @@ Please choose a different file name.</source>
<message>
<source>This is a searchable index. Enter search keywords: </source>
<comment>text that appears at the start of nearly-obsolete web pages in the form of a &apos;searchable index&apos;</comment>
- <translation>這是可搜尋的索引。 輸入搜尋關鍵字:</translation>
+ <translation>這是可搜尋的索引。 輸入搜尋關鍵字: </translation>
</message>
<message>
<source>Choose File</source>
@@ -4594,7 +4594,7 @@ Please choose a different file name.</source>
</message>
<message>
<source>Expected </source>
- <translation>預期的</translation>
+ <translation>預期的 </translation>
</message>
<message>
<source>, but got &apos;</source>
@@ -4713,7 +4713,7 @@ Please choose a different file name.</source>
</message>
<message>
<source>Time 24:%1:%2.%3 is invalid. Hour is 24, but minutes, seconds, and milliseconds are not all 0; </source>
- <translation>時間 24:%1:%2。%3 無效。 小時是 24,但分鐘、 秒和毫秒不是全部 0;</translation>
+ <translation>時間 24:%1:%2。%3 無效。 小時是 24,但分鐘、 秒和毫秒不是全部 0; </translation>
</message>
<message>
<source>Time %1:%2:%3.%4 is invalid.</source>
diff --git a/src/VBox/Frontends/VirtualBox/src/globals/COMDefs.cpp b/src/VBox/Frontends/VirtualBox/src/globals/COMDefs.cpp
index 86c320972..ea16aa07a 100644
--- a/src/VBox/Frontends/VirtualBox/src/globals/COMDefs.cpp
+++ b/src/VBox/Frontends/VirtualBox/src/globals/COMDefs.cpp
@@ -271,7 +271,7 @@ void COMErrorInfo::init(const CVirtualBoxErrorInfo &info)
mIsBasicAvailable = gotSomething;
mIsFullAvailable = gotAll;
- mIsNull = gotSomething;
+ mIsNull = !gotSomething;
AssertMsg (gotSomething, ("Nothing to fetch!\n"));
}
@@ -285,7 +285,7 @@ void COMErrorInfo::copyFrom(const COMErrorInfo &x)
mResultCode = x.mResultCode;
mInterfaceID = x.mInterfaceID;
mComponent = x.mComponent;
- mText = mText;
+ mText = x.mText;
if (x.m_pNext)
m_pNext = new COMErrorInfo(*x.m_pNext);
@@ -366,7 +366,7 @@ void COMErrorInfo::fetchFromCurrentThread(IUnknown *callee, const GUID *calleeII
if (gotSomething)
mIsBasicAvailable = true;
- mIsNull = gotSomething;
+ mIsNull = !gotSomething;
AssertMsg (gotSomething, ("Nothing to fetch!\n"));
}
@@ -410,7 +410,7 @@ void COMErrorInfo::fetchFromCurrentThread(IUnknown *callee, const GUID *calleeII
if (gotSomething)
mIsBasicAvailable = true;
- mIsNull = gotSomething;
+ mIsNull = !gotSomething;
AssertMsg (gotSomething, ("Nothing to fetch!\n"));
}
diff --git a/src/VBox/Frontends/VirtualBox/src/globals/VBoxProblemReporter.cpp b/src/VBox/Frontends/VirtualBox/src/globals/VBoxProblemReporter.cpp
index 0a74b544e..25b5be84a 100644
--- a/src/VBox/Frontends/VirtualBox/src/globals/VBoxProblemReporter.cpp
+++ b/src/VBox/Frontends/VirtualBox/src/globals/VBoxProblemReporter.cpp
@@ -532,22 +532,6 @@ void VBoxProblemReporter::cannotAccessUSB (const COMBaseWithEI &aObj)
if (res.rc() == E_NOTIMPL)
return;
-#ifdef RT_OS_LINUX
- /* xxx There is no macro to turn an error into a warning, but we need
- * to do that here. */
- if (res.rc() == (VBOX_E_HOST_ERROR & ~0x80000000))
- {
- message (mainWindowShown(), VBoxProblemReporter::Warning,
- tr ("Could not access USB on the host system, because "
- "neither the USB file system (usbfs) nor the DBus "
- "and hal services are currently available. If you "
- "wish to use host USB devices inside guest systems, "
- "you must correct this and restart VirtualBox."),
- formatErrorInfo (res),
- "cannotAccessUSB" /* aAutoConfirmId */);
- return;
- }
-#endif
message (mainWindowShown(), res.isWarning() ? Warning : Error,
tr ("Failed to access the USB subsystem."),
formatErrorInfo (res),
@@ -2853,6 +2837,14 @@ VBoxProblemReporter::VBoxProblemReporter()
this, SLOT(sltRemindAboutWrongColorDepth(ulong, ulong)), Qt::QueuedConnection);
connect(this, SIGNAL(sigRemindAboutUnsupportedUSB2(const QString&, QWidget*)),
this, SLOT(sltRemindAboutUnsupportedUSB2(const QString&, QWidget*)), Qt::QueuedConnection);
+
+ /* Translations for Main.
+ * Please make sure they corresponds to the strings coming from Main one-by-one symbol! */
+ tr("Could not load the Host USB Proxy Service (VERR_FILE_NOT_FOUND). The service might not be installed on the host computer");
+ tr("VirtualBox is not currently allowed to access USB devices. You can change this by adding your user to the 'vboxusers' group. Please see the user manual for a more detailed explanation");
+ tr("VirtualBox is not currently allowed to access USB devices. You can change this by allowing your user to access the 'usbfs' folder and files. Please see the user manual for a more detailed explanation");
+ tr("The USB Proxy Service has not yet been ported to this host");
+ tr("Could not load the Host USB Proxy service");
}
/* Returns a reference to the global VirtualBox problem reporter instance: */
@@ -2870,8 +2862,17 @@ QString VBoxProblemReporter::doFormatErrorInfo (const COMErrorInfo &aInfo,
* be used separately in QIMessageBox */
QString formatted;
- if (!aInfo.text().isEmpty())
- formatted += QString ("<p>%1.</p>").arg (vboxGlobal().emphasize (aInfo.text()));
+ /* Check if details text is NOT empty: */
+ QString strDetailsInfo = aInfo.text();
+ if (!strDetailsInfo.isEmpty())
+ {
+ /* Check if details text written in English (latin1) and translated: */
+ if (strDetailsInfo == QString::fromLatin1(strDetailsInfo.toLatin1()) &&
+ strDetailsInfo != tr(strDetailsInfo.toLatin1().constData()))
+ formatted += QString("<p>%1.</p>").arg(vboxGlobal().emphasize(tr(strDetailsInfo.toLatin1().constData())));
+ else
+ formatted += QString("<p>%1.</p>").arg(vboxGlobal().emphasize(strDetailsInfo));
+ }
formatted += "<!--EOM--><table bgcolor=#EEEEEE border=0 cellspacing=0 "
"cellpadding=0 width=100%>";
diff --git a/src/VBox/Frontends/VirtualBox/src/runtime/UIFrameBufferQuartz2D.cpp b/src/VBox/Frontends/VirtualBox/src/runtime/UIFrameBufferQuartz2D.cpp
index ef36cab39..fafad2c9f 100644
--- a/src/VBox/Frontends/VirtualBox/src/runtime/UIFrameBufferQuartz2D.cpp
+++ b/src/VBox/Frontends/VirtualBox/src/runtime/UIFrameBufferQuartz2D.cpp
@@ -187,7 +187,19 @@ void UIFrameBufferQuartz2D::paintEvent(QPaintEvent *aEvent)
CGImageRelease(pauseImg);
}
else
+ {
+#ifdef RT_ARCH_AMD64
+ /* Not sure who to blame, but it seems on 64bit there goes
+ * something terrible wrong (on a second monitor) when directly
+ * using CGImageCreateWithImageInRect without making a copy. We saw
+ * something like this already with the scale mode. */
+ CGImageRef tmpImage = CGImageCreateWithImageInRect(m_image, CGRectMake(m_pMachineView->contentsX(), m_pMachineView->contentsY(), m_pMachineView->visibleWidth(), m_pMachineView->visibleHeight()));
+ subImage = CGImageCreateCopy(tmpImage);
+ CGImageRelease(tmpImage);
+#else
subImage = CGImageCreateWithImageInRect(m_image, CGRectMake(m_pMachineView->contentsX(), m_pMachineView->contentsY(), m_pMachineView->visibleWidth(), m_pMachineView->visibleHeight()));
+#endif
+ }
Assert(VALID_PTR(subImage));
/* Clear the background (Make the rect fully transparent) */
CGContextClearRect(ctx, viewRect);
@@ -328,7 +340,19 @@ void UIFrameBufferQuartz2D::paintEvent(QPaintEvent *aEvent)
CGImageRelease(pauseImg);
}
else
+ {
+#ifdef RT_ARCH_AMD64
+ /* Not sure who to blame, but it seems on 64bit there goes
+ * something terrible wrong (on a second monitor) when directly
+ * using CGImageCreateWithImageInRect without making a copy. We saw
+ * something like this already with the scale mode. */
+ CGImageRef tmpImage = CGImageCreateWithImageInRect(m_image, ::darwinToCGRect(is));
+ subImage = CGImageCreateCopy(tmpImage);
+ CGImageRelease(tmpImage);
+#else
subImage = CGImageCreateWithImageInRect(m_image, ::darwinToCGRect(is));
+#endif
+ }
if (subImage)
{
/* Ok, for more performance we set a clipping path of the
diff --git a/src/VBox/Frontends/VirtualBox/src/runtime/UIKeyboardHandler.cpp b/src/VBox/Frontends/VirtualBox/src/runtime/UIKeyboardHandler.cpp
index 0ff8dd21d..b71fa383a 100644
--- a/src/VBox/Frontends/VirtualBox/src/runtime/UIKeyboardHandler.cpp
+++ b/src/VBox/Frontends/VirtualBox/src/runtime/UIKeyboardHandler.cpp
@@ -1131,7 +1131,7 @@ bool UIKeyboardHandler::keyEvent(int iKey, uint8_t uScan, int fFlags, ulong uScr
}
}
/* Check if we are currently holding FULL host-combo: */
- bool fIsFullHostComboPresent = allHostComboKeys == m_pressedHostComboKeys.keys().toSet();
+ bool fIsFullHostComboPresent = !allHostComboKeys.isEmpty() && allHostComboKeys == m_pressedHostComboKeys.keys().toSet();
/* Check if currently pressed/released key had changed host-combo state: */
const bool isHostComboStateChanged = (!m_bIsHostComboPressed && fIsFullHostComboPresent) ||
( m_bIsHostComboPressed && !fIsFullHostComboPresent);
diff --git a/src/VBox/Frontends/VirtualBox/src/settings/UISettingsDialogSpecific.cpp b/src/VBox/Frontends/VirtualBox/src/settings/UISettingsDialogSpecific.cpp
index cc90adc0d..901fa8bca 100644
--- a/src/VBox/Frontends/VirtualBox/src/settings/UISettingsDialogSpecific.cpp
+++ b/src/VBox/Frontends/VirtualBox/src/settings/UISettingsDialogSpecific.cpp
@@ -744,7 +744,6 @@ void UIVMSettingsDlg::putBackTo()
}
#endif /* VBOX_WITH_VIDEOHWACCEL */
-#ifndef VBOX_OSE
/* Enable OHCI controller if HID is enabled: */
if (pSystemPage && pSystemPage->isHIDEnabled())
{
@@ -752,7 +751,6 @@ void UIVMSettingsDlg::putBackTo()
if (!controller.isNull())
controller.SetEnabled(true);
}
-#endif /* !VBOX_OSE */
/* Clear the "GUI_FirstRun" extra data key in case if
* the boot order or disk configuration were changed: */
@@ -894,7 +892,6 @@ bool UIVMSettingsDlg::recorrelate(QWidget *pPage, QString &strWarning)
}
#endif /* VBOX_WITH_VIDEOHWACCEL */
-#ifndef VBOX_OSE
if (pPage == m_pSelector->idToPage(VMSettingsPage_System))
{
/* Get System & USB pages: */
@@ -913,7 +910,6 @@ bool UIVMSettingsDlg::recorrelate(QWidget *pPage, QString &strWarning)
return true;
}
}
-#endif /* !VBOX_OSE */
if (pPage == m_pSelector->idToPage(VMSettingsPage_Storage))
{
@@ -1016,7 +1012,7 @@ bool UIVMSettingsDlg::isAvailable(int id)
/* Get the USB controller object: */
CUSBController controller = m_machine.GetUSBController();
/* Show the machine error message if any: */
- if (!m_machine.isReallyOk())
+ if (!m_machine.isReallyOk() && !controller.isNull() && controller.GetEnabled())
vboxProblem().cannotAccessUSB(m_machine);
/* Check if USB is implemented: */
if (controller.isNull() || !controller.GetProxyAvailable())
diff --git a/src/VBox/HostDrivers/Support/SUPDrv.c b/src/VBox/HostDrivers/Support/SUPDrv.c
index f33858faa..bec56c2ac 100644
--- a/src/VBox/HostDrivers/Support/SUPDrv.c
+++ b/src/VBox/HostDrivers/Support/SUPDrv.c
@@ -1,4 +1,4 @@
-/* $Revision: 70883 $ */
+/* $Revision: 71409 $ */
/** @file
* VBoxDrv - The VirtualBox Support Driver - Common code.
*/
@@ -396,6 +396,8 @@ PFNRT g_apfnVBoxDrvIPRTDeps[] =
(PFNRT)RTUuidFromStr,
(PFNRT)RTStrDupTag,
(PFNRT)RTStrFree,
+ (PFNRT)RTStrCopy,
+ (PFNRT)RTStrNCmp,
/* VBoxNetAdp */
(PFNRT)RTRandBytes,
/* VBoxUSB */
diff --git a/src/VBox/HostDrivers/VBoxNetAdp/VBoxNetAdp.c b/src/VBox/HostDrivers/VBoxNetAdp/VBoxNetAdp.c
index 4860d1401..228098725 100644
--- a/src/VBox/HostDrivers/VBoxNetAdp/VBoxNetAdp.c
+++ b/src/VBox/HostDrivers/VBoxNetAdp/VBoxNetAdp.c
@@ -601,8 +601,9 @@ int vboxNetAdpCreate(PINTNETTRUNKFACTORY pIfFactory, PVBOXNETADP *ppNew)
if (vboxNetAdpCheckAndSetState(pThis, kVBoxNetAdpState_Invalid, kVBoxNetAdpState_Transitional))
{
/* Found an empty slot -- use it. */
+ uint32_t cRefs = ASMAtomicIncU32(&pThis->cRefs);
+ Assert(cRefs == 1);
RTMAC Mac;
- Assert(ASMAtomicIncU32(&pThis->cRefs) == 1);
vboxNetAdpComposeMACAddress(pThis, &Mac);
rc = vboxNetAdpOsCreate(pThis, &Mac);
*ppNew = pThis;
@@ -1087,7 +1088,9 @@ DECLINLINE(int) vboxNetAdpGetNextAvailableUnit(void)
DECLINLINE(void) vboxNetAdpReleaseUnit(int iUnit)
{
- Assert(ASMAtomicBitTestAndClear(g_aUnits, iUnit));
+ bool fSet = ASMAtomicBitTestAndClear(g_aUnits, iUnit);
+ NOREF(fSet);
+ Assert(fSet);
}
/**
diff --git a/src/VBox/HostDrivers/VBoxNetAdp/solaris/VBoxNetAdp-solaris.c b/src/VBox/HostDrivers/VBoxNetAdp/solaris/VBoxNetAdp-solaris.c
index e96f99852..44aaff152 100644
--- a/src/VBox/HostDrivers/VBoxNetAdp/solaris/VBoxNetAdp-solaris.c
+++ b/src/VBox/HostDrivers/VBoxNetAdp/solaris/VBoxNetAdp-solaris.c
@@ -459,7 +459,13 @@ static int vboxNetAdpSolarisSetMacAddress(gld_mac_info_t *pMacInfo, unsigned cha
static int vboxNetAdpSolarisSend(gld_mac_info_t *pMacInfo, mblk_t *pMsg)
{
- freemsg(pMsg);
+ while (pMsg)
+ {
+ mblk_t *pMsgNext = pMsg->b_cont;
+ pMsg->b_cont = NULL;
+ freemsg(pMsg);
+ pMsg = pMsgNext;
+ }
return GLD_SUCCESS;
}
diff --git a/src/VBox/HostDrivers/VBoxNetFlt/VBoxNetFltInternal.h b/src/VBox/HostDrivers/VBoxNetFlt/VBoxNetFltInternal.h
index 97a26d475..4eb593a37 100644
--- a/src/VBox/HostDrivers/VBoxNetFlt/VBoxNetFltInternal.h
+++ b/src/VBox/HostDrivers/VBoxNetFlt/VBoxNetFltInternal.h
@@ -179,16 +179,18 @@ typedef struct VBOXNETFLTINS
# ifdef VBOX_WITH_NETFLT_CROSSBOW
/** Whether the underlying interface is a VNIC or not. */
bool fIsVNIC;
+ /** Whether the underlying interface is a VNIC template or not. */
+ bool fIsVNICTemplate;
/** Handle to list of created VNICs. */
list_t hVNICs;
/** Instance number while creating VNICs. */
uint64_t uInstance;
- /** Pointer to the VNIC instance data. */
- void *pvVNIC;
/** The MAC address of the host interface. */
RTMAC MacAddr;
- /** Whether required capabilities have been reported. */
- bool fReportedInfo;
+ /** Handle of this interface (lower MAC). */
+ mac_handle_t hInterface;
+ /** Handle to link state notifier. */
+ mac_notify_handle_t hNotify;
# else
/** Pointer to the bound IPv4 stream. */
struct vboxnetflt_stream_t * volatile pIp4Stream;
diff --git a/src/VBox/HostDrivers/VBoxNetFlt/linux/VBoxNetFlt-linux.c b/src/VBox/HostDrivers/VBoxNetFlt/linux/VBoxNetFlt-linux.c
index dcbe6829f..59f8ad78a 100644
--- a/src/VBox/HostDrivers/VBoxNetFlt/linux/VBoxNetFlt-linux.c
+++ b/src/VBox/HostDrivers/VBoxNetFlt/linux/VBoxNetFlt-linux.c
@@ -1350,7 +1350,7 @@ static int vboxNetFltLinuxPacketHandler(struct sk_buff *pBuf,
pThis = VBOX_FLT_PT_TO_INST(pPacketType);
pDev = ASMAtomicUoReadPtrT(&pThis->u.s.pDev, struct net_device *);
- if (pThis->u.s.pDev != pSkbDev)
+ if (pDev != pSkbDev)
{
Log(("vboxNetFltLinuxPacketHandler: Devices do not match, pThis may be wrong! pThis=%p\n", pThis));
return 0;
@@ -2506,7 +2506,7 @@ int vboxNetFltOsPreInitInstance(PVBOXNETFLTINS pThis)
/*
* Init the linux specific members.
*/
- pThis->u.s.pDev = NULL;
+ ASMAtomicUoWriteNullPtr(&pThis->u.s.pDev);
pThis->u.s.fRegistered = false;
pThis->u.s.fPromiscuousSet = false;
memset(&pThis->u.s.PacketType, 0, sizeof(pThis->u.s.PacketType));
diff --git a/src/VBox/HostDrivers/VBoxNetFlt/solaris/VBoxNetFltBow-solaris.c b/src/VBox/HostDrivers/VBoxNetFlt/solaris/VBoxNetFltBow-solaris.c
index 6cef3c957..d5a6bc106 100644
--- a/src/VBox/HostDrivers/VBoxNetFlt/solaris/VBoxNetFltBow-solaris.c
+++ b/src/VBox/HostDrivers/VBoxNetFlt/solaris/VBoxNetFltBow-solaris.c
@@ -45,12 +45,13 @@
#include <sys/dls_mgmt.h>
#include <sys/mac.h>
#include <sys/strsun.h>
-#include <sys/sunddi.h>
#include <sys/vnic_mgmt.h>
#include <sys/mac_client.h>
#include <sys/mac_provider.h>
#include <sys/dls.h>
+#include <sys/dld.h>
+#include <sys/cred.h>
#if 0
#include "include/mac_provider.h" /* dependency for other headers */
@@ -74,8 +75,12 @@
#define DEVICE_NAME "vboxflt"
/** The module descriptions as seen in 'modinfo'. */
#define DEVICE_DESC_DRV "VirtualBox NetBow"
-/** The dynamically created VNIC name */
+/** The dynamically created VNIC name (hardcoded in NetIf-solaris.cpp).
+ * @todo move this define into a common header. */
#define VBOXFLT_VNIC_NAME "vboxvnic"
+/** The VirtualBox VNIC template name (hardcoded in NetIf-solaris.cpp).
+ * * @todo move this define into a common header. */
+#define VBOXFLT_VNIC_TEMPLATE_NAME "vboxvnic_template"
/** Debugging switch for using symbols in kmdb */
# define LOCAL static
/** VBOXNETFLTVNIC::u32Magic */
@@ -103,6 +108,21 @@ typedef struct VLANHEADER
} VLANHEADER;
typedef struct VLANHEADER *PVLANHEADER;
+/* Private: from sys/vlan.h */
+#ifndef VLAN_ID_NONE
+# define VLAN_ID_NONE 0
+#endif
+
+/* Private: from sys/param.h */
+#ifndef MAXLINKNAMESPECIFIER
+# define MAXLINKNAMESPECIFIER 96 /* MAXLINKNAMELEN + ZONENAME_MAX */
+#endif
+
+/* Private: from sys/mac_client_priv.h, mac client function prototypes. */
+extern uint16_t mac_client_vid(mac_client_handle_t hClient);
+extern void mac_client_get_resources(mac_client_handle_t hClient, mac_resource_props_t *pResources);
+extern int mac_client_set_resources(mac_client_handle_t hClient, mac_resource_props_t *pResources);
+
/*******************************************************************************
* Kernel Entry Hooks *
@@ -181,25 +201,48 @@ static struct modlinkage g_VBoxNetFltSolarisModLinkage =
}
};
+/*
+ * VBOXNETFLTVNICTEMPLATE: VNIC template information.
+ */
+typedef struct VBOXNETFLTVNICTEMPLATE
+{
+ /** The name of link on which the VNIC template is created on. */
+ char szLinkName[MAXNAMELEN];
+ /** The VLAN Id (can be VLAN_ID_NONE). */
+ uint16_t uVLANId;
+ /** Resources (bandwidth, CPU bindings, flow priority etc.) */
+ mac_resource_props_t Resources;
+} VBOXNETFLTVNICTEMPLATE;
+typedef struct VBOXNETFLTVNICTEMPLATE *PVBOXNETFLTVNICTEMPLATE;
+
/**
* VBOXNETFLTVNIC: Per-VNIC instance data.
*/
typedef struct VBOXNETFLTVNIC
{
- uint32_t u32Magic; /* Magic number (VBOXNETFLTVNIC_MAGIC) */
- bool fCreated; /* Whether we created the VNIC or not */
- void *pvIf; /* The VirtualBox interface */
- mac_handle_t hInterface; /* The lower MAC handle */
- datalink_id_t hLinkId; /* The link ID */
- mac_client_handle_t hClient; /* Client handle */
- mac_unicast_handle_t hUnicast; /* Unicast address handle */
- mac_promisc_handle_t hPromiscuous; /* Promiscuous handle */
- char szName[128]; /* The VNIC name */
- list_node_t hNode; /* Handle to the next VNIC in the list */
+ /** Magic number (VBOXNETFLTVNIC_MAGIC). */
+ uint32_t u32Magic;
+ /** Whether we created the VNIC or not. */
+ bool fCreated;
+ /** Pointer to the VNIC template if any. */
+ PVBOXNETFLTVNICTEMPLATE pVNICTemplate;
+ /** Pointer to the VirtualBox interface instance. */
+ void *pvIf;
+ /** The MAC handle. */
+ mac_handle_t hInterface;
+ /** The VNIC link ID. */
+ datalink_id_t hLinkId;
+ /** The MAC client handle */
+ mac_client_handle_t hClient;
+ /** The unicast address handle. */
+ mac_unicast_handle_t hUnicast;
+ /* The VNIC name. */
+ char szName[MAXLINKNAMESPECIFIER];
+ /** Handle to the next VNIC in the list. */
+ list_node_t hNode;
} VBOXNETFLTVNIC;
typedef struct VBOXNETFLTVNIC *PVBOXNETFLTVNIC;
-
/*******************************************************************************
* Global Variables *
*******************************************************************************/
@@ -219,12 +262,14 @@ LOCAL unsigned vboxNetFltSolarisMBlkCalcSGSegs(PVBOXNETFLTINS pThis, mblk_t *pMs
LOCAL int vboxNetFltSolarisMBlkToSG(PVBOXNETFLTINS pThis, mblk_t *pMsg, PINTNETSG pSG, unsigned cSegs, uint32_t fSrc);
LOCAL void vboxNetFltSolarisRecv(void *pvData, mac_resource_handle_t hResource, mblk_t *pMsg, boolean_t fLoopback);
LOCAL void vboxNetFltSolarisAnalyzeMBlk(mblk_t *pMsg);
-LOCAL void vboxNetFltSolarisReportInfo(PVBOXNETFLTINS pThis);
+LOCAL int vboxNetFltSolarisReportInfo(PVBOXNETFLTINS pThis, mac_handle_t hInterface, bool fIsVNIC);
LOCAL int vboxNetFltSolarisInitVNIC(PVBOXNETFLTINS pThis, PVBOXNETFLTVNIC pVNIC);
+LOCAL int vboxNetFltSolarisInitVNICTemplate(PVBOXNETFLTINS pThis, PVBOXNETFLTVNIC pVNIC, PVBOXNETFLTVNICTEMPLATE pVNICTemplate);
LOCAL PVBOXNETFLTVNIC vboxNetFltSolarisAllocVNIC(void);
LOCAL void vboxNetFltSolarisFreeVNIC(PVBOXNETFLTVNIC pVNIC);
LOCAL void vboxNetFltSolarisDestroyVNIC(PVBOXNETFLTVNIC pVNIC);
LOCAL int vboxNetFltSolarisCreateVNIC(PVBOXNETFLTINS pThis, PVBOXNETFLTVNIC *ppVNIC);
+LOCAL inline int vboxNetFltSolarisGetLinkId(const char *pszMacName, datalink_id_t *pLinkId);
/**
@@ -449,7 +494,7 @@ LOCAL int VBoxNetFltSolarisGetInfo(dev_info_t *pDip, ddi_info_cmd_t enmCmd, void
*
* @returns Solaris message block.
*/
-LOCAL mblk_t *vboxNetFltSolarisMBlkFromSG(PVBOXNETFLTINS pThis, PINTNETSG pSG, uint32_t fDst)
+LOCAL inline mblk_t *vboxNetFltSolarisMBlkFromSG(PVBOXNETFLTINS pThis, PINTNETSG pSG, uint32_t fDst)
{
LogFlow((DEVICE_NAME ":vboxNetFltSolarisMBlkFromSG pThis=%p pSG=%p\n", pThis, pSG));
@@ -658,7 +703,10 @@ LOCAL void vboxNetFltSolarisRecv(void *pvData, mac_resource_handle_t hResource,
* Active? Retain the instance and increment the busy counter.
*/
if (!vboxNetFltTryRetainBusyActive(pThis))
+ {
+ freemsgchain(pMsg);
return;
+ }
uint32_t fSrc = INTNETTRUNKDIR_WIRE;
PRTNETETHERHDR pEthHdr = (PRTNETETHERHDR)pMsg->b_rptr;
@@ -691,38 +739,116 @@ LOCAL void vboxNetFltSolarisRecv(void *pvData, mac_resource_handle_t hResource,
}
+#if 0
+/**
+ * MAC layer link notification hook.
+ *
+ * @param pvArg Opaque pointer to the instance.
+ * @param Type Notification Type.
+ *
+ * @remarks This hook will be invoked for various changes to the underlying
+ * interface even when VMs aren't running so don't do any funky stuff
+ * here.
+ */
+LOCAL void vboxNetFltSolarisLinkNotify(void *pvArg, mac_notify_type_t Type)
+{
+ LogRel((DEVICE_NAME ":vboxNetFltSolarisLinkNotify pvArg=%p Type=%d\n", pvArg, Type));
+
+ PVBOXNETFLTINS pThis = pvArg;
+ AssertReturnVoid(VALID_PTR(pThis));
+ AssertReturnVoid(pThis->u.s.hInterface);
+
+ switch (Type)
+ {
+ case MAC_NOTE_LINK:
+ {
+ LogRel((DEVICE_NAME ":vboxNetFltSolarisLinkNotify link state change\n"));
+ link_state_t hLinkState = mac_stat_get(pThis->u.s.hInterface, MAC_STAT_LINK_STATE);
+ bool fDisconnectedFromHost = hLinkState == LINK_STATE_UP ? false : true;
+ if (fDisconnectedFromHost != ASMAtomicUoReadBool(&pThis->fDisconnectedFromHost))
+ {
+ ASMAtomicUoWriteBool(&pThis->fDisconnectedFromHost, fDisconnectedFromHost);
+ LogRel((DEVICE_NAME ":vboxNetFltSolarisLinkNotify link state change: new state=%s\n", fDisconnectedFromHost ? "DOWN" : "UP"));
+ }
+ break;
+ }
+
+ default:
+ return;
+ }
+}
+#endif
+
+
/**
- * Report capabilities and MAC address to IntNet.
+ * Report capabilities and MAC address to IntNet after obtaining the MAC address
+ * of the underlying interface for a VNIC or the current interface if it's a
+ * physical/ether-stub interface.
*
* @param pThis The instance.
+ * @param hInterface The Interface handle.
+ * @param fIsVNIC Whether this interface handle corresponds to a VNIC
+ * or not.
+ *
* @remarks Retains the instance while doing it's job.
+ * @returns VBox status code.
*/
-LOCAL void vboxNetFltSolarisReportInfo(PVBOXNETFLTINS pThis)
+LOCAL int vboxNetFltSolarisReportInfo(PVBOXNETFLTINS pThis, mac_handle_t hInterface, bool fIsVNIC)
{
- if (!pThis->u.s.fReportedInfo)
+ mac_handle_t hLowerMac = NULL;
+ if (!fIsVNIC)
+ hLowerMac = hInterface;
+ else
{
- if (vboxNetFltTryRetainBusyNotDisconnected(pThis))
+ hLowerMac = mac_get_lower_mac_handle(hInterface);
+ if (RT_UNLIKELY(!hLowerMac))
{
- Assert(pThis->pSwitchPort);
- LogFlow((DEVICE_NAME ":vboxNetFltSolarisInitVNIC phys mac %.6Rhxs\n", &pThis->u.s.MacAddr));
- pThis->pSwitchPort->pfnReportMacAddress(pThis->pSwitchPort, &pThis->u.s.MacAddr);
- pThis->pSwitchPort->pfnReportPromiscuousMode(pThis->pSwitchPort, false); /** @todo Promisc */
- pThis->pSwitchPort->pfnReportGsoCapabilities(pThis->pSwitchPort, 0, INTNETTRUNKDIR_WIRE | INTNETTRUNKDIR_HOST);
- pThis->pSwitchPort->pfnReportNoPreemptDsts(pThis->pSwitchPort, 0 /* none */);
- vboxNetFltRelease(pThis, true /*fBusy*/);
- pThis->u.s.fReportedInfo = true;
+ LogRel((DEVICE_NAME ":vboxNetFltSolarisReportInfo failed to get lower MAC handle for '%s'\n", pThis->szName));
+ return VERR_INVALID_HANDLE;
}
}
+
+ pThis->u.s.hInterface = hLowerMac;
+
+#if 0
+ /*
+ * Try setup link notification hooks, this might fail if mac_no_notification()
+ * doesn't support it. We won't bother using the private function since link notification
+ * isn't critical for us and ignore failures.
+ */
+ pThis->u.s.hNotify = mac_notify_add(hLowerMac, vboxNetFltSolarisLinkNotify, pThis);
+ if (!pThis->u.s.hNotify)
+ LogRel((DEVICE_NAME ":vboxNetFltSolarisReportInfo Warning! Failed to setup link notification hook.\n"));
+#endif
+
+ mac_unicast_primary_get(hLowerMac, (uint8_t *)pThis->u.s.MacAddr.au8);
+ if (vboxNetFltTryRetainBusyNotDisconnected(pThis))
+ {
+ Assert(pThis->pSwitchPort);
+ LogFlow((DEVICE_NAME ":vboxNetFltSolarisReportInfo phys mac %.6Rhxs\n", &pThis->u.s.MacAddr));
+ pThis->pSwitchPort->pfnReportMacAddress(pThis->pSwitchPort, &pThis->u.s.MacAddr);
+ pThis->pSwitchPort->pfnReportPromiscuousMode(pThis->pSwitchPort, false); /** @todo Promisc */
+ pThis->pSwitchPort->pfnReportGsoCapabilities(pThis->pSwitchPort, 0, INTNETTRUNKDIR_WIRE | INTNETTRUNKDIR_HOST);
+ pThis->pSwitchPort->pfnReportNoPreemptDsts(pThis->pSwitchPort, 0 /* none */);
+ vboxNetFltRelease(pThis, true /*fBusy*/);
+ return VINF_SUCCESS;
+ }
+ else
+ LogRel((DEVICE_NAME ":vboxNetFltSolarisReportInfo failed to retain interface. pThis=%p\n", pThis));
+
+ return VERR_INTNET_FLT_IF_BUSY;
}
/**
- * Initialize a VNIC.
+ * Initialize a VNIC, optionally from a template.
*
* @param pThis The instance.
* @param pVNIC Pointer to the VNIC.
+ * @param pVNICTemplate Pointer to the VNIC template initialize from, can be
+ * NULL.
*
- * @returns Solaris error code (errno).
+ * @returns VBox status code.
*/
LOCAL int vboxNetFltSolarisInitVNIC(PVBOXNETFLTINS pThis, PVBOXNETFLTVNIC pVNIC)
{
@@ -732,8 +858,8 @@ LOCAL int vboxNetFltSolarisInitVNIC(PVBOXNETFLTINS pThis, PVBOXNETFLTVNIC pVNIC)
AssertReturn(pThis, VERR_INVALID_PARAMETER);
AssertReturn(pVNIC, VERR_INVALID_PARAMETER);
AssertReturn(pVNIC->hInterface, VERR_INVALID_POINTER);
- AssertReturn(pVNIC->hLinkId, VERR_INVALID_POINTER);
- AssertReturn(!pVNIC->hClient, VERR_INVALID_HANDLE);
+ AssertReturn(pVNIC->hLinkId != DATALINK_INVALID_LINKID, VERR_INVALID_HANDLE);
+ AssertReturn(!pVNIC->hClient, VERR_INVALID_POINTER);
int rc = mac_client_open(pVNIC->hInterface, &pVNIC->hClient,
NULL, /* name of this client */
@@ -742,63 +868,118 @@ LOCAL int vboxNetFltSolarisInitVNIC(PVBOXNETFLTINS pThis, PVBOXNETFLTVNIC pVNIC)
);
if (RT_LIKELY(!rc))
{
+ if (pVNIC->pVNICTemplate)
+ rc = mac_client_set_resources(pVNIC->hClient, &pVNIC->pVNICTemplate->Resources);
+
+ if (RT_LIKELY(!rc))
+ {
+ LogFlow((DEVICE_NAME ":vboxNetFltSolarisInitVNIC succesfully initialized VNIC.\n"));
+ return VINF_SUCCESS;
+ }
+ else
+ {
+ LogRel((DEVICE_NAME ":vboxNetFltSolarisInitVNIC mac_client_set_resources failed. rc=%d\n", rc));
+ rc = VERR_INTNET_FLT_VNIC_CREATE_FAILED;
+ }
+
+ mac_client_close(pVNIC->hClient, 0 /* flags */);
+ pVNIC->hClient = NULL;
+ }
+ else
+ LogRel((DEVICE_NAME ":vboxNetFltSolarisInitVNIC failed to open mac client for '%s' rc=%d\n", pThis->szName, rc));
+
+ return rc;
+}
+
+
+/**
+ * Initializes the VNIC template. This involves opening the template VNIC to
+ * retreive info. like the VLAN Id, underlying MAC address etc.
+ *
+ * @param pThis The VM connection instance.
+ * @param pVNIC Pointer to the VNIC.
+ * @param pVNICTemplate Pointer to a VNIC template to initialize.
+ *
+ * @returns VBox status code.
+ */
+LOCAL int vboxNetFltSolarisInitVNICTemplate(PVBOXNETFLTINS pThis, PVBOXNETFLTVNIC pVNIC, PVBOXNETFLTVNICTEMPLATE pVNICTemplate)
+{
+ LogFlow((DEVICE_NAME ":vboxNetFltSolarisInitVNICTemplate pThis=%p pVNIC=%p pVNICTemplate=%p\n", pThis, pVNIC, pVNICTemplate));
+
+ AssertReturn(pVNICTemplate, VERR_INVALID_PARAMETER);
+ AssertReturn(pThis->u.s.fIsVNICTemplate == true, VERR_INVALID_STATE);
+
+ /*
+ * Get the VNIC template's datalink ID.
+ */
+ datalink_id_t VNICLinkId;
+ int rc = vboxNetFltSolarisGetLinkId(pThis->szName, &VNICLinkId);
+ if (RT_SUCCESS(rc))
+ {
/*
- * Set the RX callback.
+ * Open the VNIC to obtain a MAC handle so as to retreive the VLAN ID.
*/
- mac_diag_t Diag = MAC_DIAG_NONE;
- rc = mac_unicast_add_set_rx(pVNIC->hClient,
- NULL /* MAC address, use existing VNIC address */,
- MAC_UNICAST_PRIMARY | /* Use Primary address of the VNIC */
- MAC_UNICAST_NODUPCHECK, /* Don't fail for conflicting MAC/VLAN-id combinations */
- &pVNIC->hUnicast,
- 0 /* VLAN-id */,
- &Diag,
- vboxNetFltSolarisRecv, /* RX callback */
- pThis /* callback private data */
- );
- if (RT_LIKELY(!rc))
+ mac_handle_t hInterface;
+ rc = mac_open_by_linkid(VNICLinkId, &hInterface);
+ if (!rc)
{
- if (!pThis->u.s.fReportedInfo)
+ /*
+ * Get the underlying linkname.
+ */
+ mac_handle_t hPhysLinkHandle = mac_get_lower_mac_handle(hInterface);
+ if (RT_LIKELY(hPhysLinkHandle))
{
- /*
- * Obtain the MAC address of the underlying physical interface.
- */
- mac_handle_t hLowerMac = mac_get_lower_mac_handle(pVNIC->hInterface);
- if (RT_LIKELY(hLowerMac))
+ const char *pszLinkName = mac_name(hPhysLinkHandle);
+ rc = RTStrCopy(pVNICTemplate->szLinkName, sizeof(pVNICTemplate->szLinkName), pszLinkName);
+ if (RT_SUCCESS(rc))
{
- mac_unicast_primary_get(hLowerMac, (uint8_t *)pThis->u.s.MacAddr.au8);
- vboxNetFltSolarisReportInfo(pThis);
+ /*
+ * Now open the VNIC template to retrieve the VLAN Id & resources.
+ */
+ mac_client_handle_t hClient;
+ rc = mac_client_open(hInterface, &hClient,
+ NULL, /* name of this client */
+ MAC_OPEN_FLAGS_USE_DATALINK_NAME | /* client name same as underlying NIC */
+ MAC_OPEN_FLAGS_MULTI_PRIMARY /* allow multiple primary unicasts */
+ );
+ if (RT_LIKELY(!rc))
+ {
+ pVNICTemplate->uVLANId = mac_client_vid(hClient);
+ mac_client_get_resources(hClient, &pVNICTemplate->Resources);
+ mac_client_close(hClient, 0 /* fFlags */);
+ mac_close(hInterface);
+
+ LogFlow((DEVICE_NAME ":vboxNetFltSolarisInitVNICTemplate successfully init. VNIC template. szLinkName=%s\n",
+ pVNICTemplate->szLinkName));
+ return VINF_SUCCESS;
+ }
+ else
+ {
+ LogRel((DEVICE_NAME ":vboxNetFltSolarisInitVNICTemplate failed to open VNIC template. rc=%d\n", rc));
+ rc = VERR_INTNET_FLT_IF_FAILED;
+ }
}
else
- {
- LogRel((DEVICE_NAME ":vboxNetFltSolarisInitVNIC failed to get lower MAC handle for '%s'\n", pThis->szName));
- rc = ENODEV;
- }
+ LogRel((DEVICE_NAME ":vboxNetFltSolarisInitVNICTemplate failed to copy link name of underlying interface. rc=%d\n", rc));
}
-
- if (!rc)
+ else
{
- Assert(pVNIC->hClient);
- Assert(pVNIC->hInterface);
- Assert(pVNIC->hLinkId);
- LogFlow((DEVICE_NAME ":vboxNetFltSolarisInitVNIC successfully initialized VNIC '%s'\n", pVNIC->szName));
- return 0;
+ LogRel((DEVICE_NAME ":vboxNetFltSolarisInitVNICTemplate failed to get lower handle for VNIC template '%s'.\n", pThis->szName));
+ rc = VERR_INTNET_FLT_IF_FAILED;
}
- mac_unicast_remove(pVNIC->hClient, pVNIC->hUnicast);
- mac_rx_clear(pVNIC->hClient);
- pVNIC->hUnicast = NULL;
+ mac_close(hInterface);
}
else
- LogRel((DEVICE_NAME ":vboxNetFltSolarisInitVNIC failed to set RX callback. rc=%d Diag=%d\n", rc, Diag));
-
- mac_client_close(pVNIC->hClient, 0 /* flags */);
- pVNIC->hClient = NULL;
+ {
+ LogRel((DEVICE_NAME ":vboxNetFltSolarisInitVNICTemplate failed to open by link ID. rc=%d\n", rc));
+ rc = VERR_INTNET_FLT_IF_FAILED;
+ }
}
else
- LogRel((DEVICE_NAME ":vboxNetFltSolarisInitVNIC failed to open mac client for '%s' rc=%d\n", pThis->szName, rc));
+ LogRel((DEVICE_NAME ":vboxNetFltSolarisInitVNICTemplate failed to get VNIC template link Id. rc=%d\n", rc));
- return RTErrConvertFromErrno(rc);
+ return rc;
}
@@ -813,14 +994,14 @@ LOCAL PVBOXNETFLTVNIC vboxNetFltSolarisAllocVNIC(void)
if (RT_UNLIKELY(!pVNIC))
return NULL;
- pVNIC->u32Magic = VBOXNETFLTVNIC_MAGIC;
- pVNIC->fCreated = false;
- pVNIC->pvIf = NULL;
- pVNIC->hInterface = NULL;
- pVNIC->hLinkId = DATALINK_INVALID_LINKID;
- pVNIC->hClient = NULL;
- pVNIC->hUnicast = NULL;
- pVNIC->hPromiscuous = NULL;
+ pVNIC->u32Magic = VBOXNETFLTVNIC_MAGIC;
+ pVNIC->fCreated = false;
+ pVNIC->pVNICTemplate = NULL;
+ pVNIC->pvIf = NULL;
+ pVNIC->hInterface = NULL;
+ pVNIC->hLinkId = DATALINK_INVALID_LINKID;
+ pVNIC->hClient = NULL;
+ pVNIC->hUnicast = NULL;
RT_ZERO(pVNIC->szName);
list_link_init(&pVNIC->hNode);
return pVNIC;
@@ -832,7 +1013,7 @@ LOCAL PVBOXNETFLTVNIC vboxNetFltSolarisAllocVNIC(void)
*
* @param pVNIC Pointer to the VNIC.
*/
-LOCAL void vboxNetFltSolarisFreeVNIC(PVBOXNETFLTVNIC pVNIC)
+LOCAL inline void vboxNetFltSolarisFreeVNIC(PVBOXNETFLTVNIC pVNIC)
{
if (pVNIC)
RTMemFree(pVNIC);
@@ -849,12 +1030,6 @@ LOCAL void vboxNetFltSolarisDestroyVNIC(PVBOXNETFLTVNIC pVNIC)
{
if (pVNIC)
{
- if (pVNIC->hPromiscuous)
- {
- mac_promisc_remove(pVNIC->hPromiscuous);
- pVNIC->hPromiscuous = NULL;
- }
-
if (pVNIC->hClient)
{
if (pVNIC->hUnicast)
@@ -881,6 +1056,12 @@ LOCAL void vboxNetFltSolarisDestroyVNIC(PVBOXNETFLTVNIC pVNIC)
pVNIC->hLinkId = DATALINK_INVALID_LINKID;
pVNIC->fCreated = false;
}
+
+ if (pVNIC->pVNICTemplate)
+ {
+ RTMemFree(pVNIC->pVNICTemplate);
+ pVNIC->pVNICTemplate = NULL;
+ }
}
}
@@ -891,7 +1072,7 @@ LOCAL void vboxNetFltSolarisDestroyVNIC(PVBOXNETFLTVNIC pVNIC)
* @param pThis The VM connection instance.
* @param ppVNIC Where to store the created VNIC.
*
- * @returns corresponding VBox error code.
+ * @returns VBox status code.
*/
LOCAL int vboxNetFltSolarisCreateVNIC(PVBOXNETFLTINS pThis, PVBOXNETFLTVNIC *ppVNIC)
{
@@ -904,7 +1085,6 @@ LOCAL int vboxNetFltSolarisCreateVNIC(PVBOXNETFLTINS pThis, PVBOXNETFLTVNIC *ppV
if (RT_UNLIKELY(!pVNIC))
return VERR_NO_MEMORY;
- AssertCompile(sizeof(pVNIC->szName) > sizeof(VBOXFLT_VNIC_NAME) + 64);
RTStrPrintf(pVNIC->szName, sizeof(pVNIC->szName), "%s%RU64", VBOXFLT_VNIC_NAME, pThis->u.s.uInstance);
/*
@@ -919,13 +1099,52 @@ LOCAL int vboxNetFltSolarisCreateVNIC(PVBOXNETFLTINS pThis, PVBOXNETFLTVNIC *ppV
AssertCompile(sizeof(RTMAC) <= MAXMACADDRLEN);
+ const char *pszLinkName = pThis->szName;
+ uint16_t uVLANId = VLAN_ID_NONE;
vnic_mac_addr_type_t AddrType = VNIC_MAC_ADDR_TYPE_FIXED;
vnic_ioc_diag_t Diag = VNIC_IOC_DIAG_NONE;
int MacSlot = 0;
int MacLen = sizeof(GuestMac);
uint32_t fFlags = 0;
+ int rc = VERR_INVALID_STATE;
+
+ if (pThis->u.s.fIsVNICTemplate)
+ {
+ pVNIC->pVNICTemplate = RTMemAllocZ(sizeof(VBOXNETFLTVNICTEMPLATE));
+ if (RT_UNLIKELY(!pVNIC->pVNICTemplate))
+ {
+ vboxNetFltSolarisFreeVNIC(pVNIC);
+ return VERR_NO_MEMORY;
+ }
- int rc = vnic_create(pVNIC->szName, pThis->szName, &AddrType, &MacLen, GuestMac.au8, &MacSlot, 0 /* Mac-Prefix Length */, 0 /* VLAN-ID */,
+ /*
+ * Initialize the VNIC template.
+ */
+ rc = vboxNetFltSolarisInitVNICTemplate(pThis, pVNIC, pVNIC->pVNICTemplate);
+ if (RT_FAILURE(rc))
+ {
+ LogRel((DEVICE_NAME ":vboxNetFltSolarisCreateVNIC failed to initialize VNIC from VNIC template. rc=%Rrc\n", rc));
+ vboxNetFltSolarisFreeVNIC(pVNIC);
+ return rc;
+ }
+
+ pszLinkName = pVNIC->pVNICTemplate->szLinkName;
+ uVLANId = pVNIC->pVNICTemplate->uVLANId;
+#if 0
+ /*
+ * Required only if we're creating a VLAN interface & not a VNIC with a VLAN Id.
+ */
+ if (uVLANId != VLAN_ID_NONE)
+ fFlags |= MAC_VLAN;
+#endif
+ LogFlow((DEVICE_NAME ":vboxNetFltSolarisCreateVNIC pThis=%p VLAN Id=%u\n", pThis, uVLANId));
+ }
+
+ /*
+ * Create the VNIC under 'pszLinkName', which can be the one from the VNIC template or can
+ * be a physical interface.
+ */
+ rc = vnic_create(pVNIC->szName, pszLinkName, &AddrType, &MacLen, GuestMac.au8, &MacSlot, 0 /* Mac-Prefix Length */, uVLANId,
fFlags, &pVNIC->hLinkId, &Diag, NULL /* Reserved */);
if (!rc)
{
@@ -937,11 +1156,15 @@ LOCAL int vboxNetFltSolarisCreateVNIC(PVBOXNETFLTINS pThis, PVBOXNETFLTVNIC *ppV
rc = mac_open_by_linkid(pVNIC->hLinkId, &pVNIC->hInterface);
if (!rc)
{
+ /*
+ * Initialize the VNIC from the physical interface or the VNIC template.
+ */
rc = vboxNetFltSolarisInitVNIC(pThis, pVNIC);
- if (RT_LIKELY(!rc))
+ if (RT_SUCCESS(rc))
{
pThis->u.s.uInstance++;
- LogFlow((DEVICE_NAME ":vboxNetFltSolarisCreateVNIC successfully created VNIC '%s' over '%s'\n", pVNIC->szName, pThis->szName));
+ LogFlow((DEVICE_NAME ":vboxNetFltSolarisCreateVNIC successfully created VNIC '%s' over '%s' with random mac %.6Rhxs\n",
+ pVNIC->szName, pszLinkName, &GuestMac));
*ppVNIC = pVNIC;
return VINF_SUCCESS;
}
@@ -958,12 +1181,12 @@ LOCAL int vboxNetFltSolarisCreateVNIC(PVBOXNETFLTINS pThis, PVBOXNETFLTVNIC *ppV
}
vboxNetFltSolarisDestroyVNIC(pVNIC);
- rc = VERR_OPEN_FAILED;
+ rc = VERR_INTNET_FLT_VNIC_CREATE_FAILED;
}
else
{
LogRel((DEVICE_NAME ":vboxNetFltSolarisCreateVNIC failed to create VNIC '%s' over '%s' rc=%d Diag=%d\n", pVNIC->szName,
- pThis->szName, rc, Diag));
+ pszLinkName, rc, Diag));
rc = VERR_INTNET_FLT_VNIC_CREATE_FAILED;
}
@@ -973,38 +1196,55 @@ LOCAL int vboxNetFltSolarisCreateVNIC(PVBOXNETFLTINS pThis, PVBOXNETFLTVNIC *ppV
}
+/**
+ * Wrapper for getting the datalink ID given the MAC name.
+ *
+ * @param pszMacName The MAC name.
+ * @param pLinkId Where to store the datalink ID.
+ *
+ * @returns VBox status code.
+ */
+LOCAL inline int vboxNetFltSolarisGetLinkId(const char *pszMacName, datalink_id_t *pLinkId)
+{
+ /*
+ * dls_mgmt_get_linkid() requires to be in a state to answer upcalls. We should always use this
+ * first before resorting to other means to retrieve the MAC name.
+ */
+ int rc = dls_mgmt_get_linkid(pszMacName, pLinkId);
+ if (rc)
+ rc = dls_devnet_macname2linkid(pszMacName, pLinkId);
+
+ if (RT_LIKELY(!rc))
+ return VINF_SUCCESS;
+
+ LogRel((DEVICE_NAME ":vboxNetFltSolarisGetLinkId failed for '%s'. rc=%d\n", pszMacName, rc));
+ return RTErrConvertFromErrno(rc);
+}
+
+
/* -=-=-=-=-=- Common Hooks -=-=-=-=-=- */
void vboxNetFltPortOsSetActive(PVBOXNETFLTINS pThis, bool fActive)
{
LogFlow((DEVICE_NAME ":vboxNetFltPortOsSetActive pThis=%p fActive=%d\n", pThis, fActive));
-#if 0
+
+ /*
+ * Reactivate/quiesce the interface.
+ */
+ PVBOXNETFLTVNIC pVNIC = list_head(&pThis->u.s.hVNICs);
if (fActive)
{
- /*
- * Activate promiscuous mode.
- */
- if (!pThis->u.s.hPromiscuous)
- {
- int rc = mac_promisc_add(pThis->u.s.hClient, MAC_CLIENT_PROMISC_ALL, vboxNetFltSolarisRecv, pThis, &pThis->u.s.hPromiscuous,
- MAC_PROMISC_FLAGS_NO_TX_LOOP);
- if (rc)
- LogRel((DEVICE_NAME ":vboxNetFltPortOsSetActive cannot enable promiscuous mode for '%s' rc=%d\n", pThis->szName, rc));
- }
+ for (; pVNIC != NULL; pVNIC = list_next(&pThis->u.s.hVNICs, pVNIC))
+ if (pVNIC->hClient)
+ mac_rx_set(pVNIC->hClient, vboxNetFltSolarisRecv, pThis);
}
else
{
- /*
- * Deactivate promiscuous mode.
- */
- if (pThis->u.s.hPromiscuous)
- {
- mac_promisc_remove(pThis->u.s.hPromiscuous);
- pThis->u.s.hPromiscuous = NULL;
- }
+ for (; pVNIC != NULL; pVNIC = list_next(&pThis->u.s.hVNICs, pVNIC))
+ if (pVNIC->hClient)
+ mac_rx_clear(pVNIC->hClient);
}
-#endif
}
@@ -1026,6 +1266,9 @@ void vboxNetFltOsDeleteInstance(PVBOXNETFLTINS pThis)
{
LogFlow((DEVICE_NAME ":vboxNetFltOsDeleteInstance pThis=%p\n", pThis));
+ if (pThis->u.s.hNotify)
+ mac_notify_remove(pThis->u.s.hNotify, B_TRUE /* Wait */);
+
/*
* Destroy all managed VNICs. If a VNIC was passed to us, there
* will be only 1 item in the list, otherwise as many interfaces
@@ -1048,7 +1291,8 @@ int vboxNetFltOsInitInstance(PVBOXNETFLTINS pThis, void *pvContext)
LogFlow((DEVICE_NAME ":vboxNetFltOsInitInstance pThis=%p pvContext=%p\n", pThis, pvContext));
/*
- * Figure out if the interface is a VNIC or a physical/etherstub/whatever NIC.
+ * Figure out if the interface is a VNIC or a physical/etherstub/whatever NIC, then
+ * do the actual VNIC creation if necessary in vboxNetFltPortOsConnectInterface().
*/
mac_handle_t hInterface;
int rc = mac_open_by_linkname(pThis->szName, &hInterface);
@@ -1057,58 +1301,39 @@ int vboxNetFltOsInitInstance(PVBOXNETFLTINS pThis, void *pvContext)
rc = mac_is_vnic(hInterface);
if (!rc)
{
- /*
- * This is NOT a VNIC. Just pretend success for now.
- * We will create a VNIC per VM interface later, see vboxNetFltPortOsConnectInterface().
- */
+ LogFlow((DEVICE_NAME ":vboxNetFltOsInitInstance pThis=%p physical interface '%s' detected.\n", pThis, pThis->szName));
pThis->u.s.fIsVNIC = false;
- mac_unicast_primary_get(hInterface, pThis->u.s.MacAddr.au8);
- vboxNetFltSolarisReportInfo(pThis);
- mac_close(hInterface);
- return VINF_SUCCESS;
}
-
- pThis->u.s.fIsVNIC = true;
-
- PVBOXNETFLTVNIC pVNIC = vboxNetFltSolarisAllocVNIC();
- if (RT_LIKELY(pVNIC))
+ else
{
- pVNIC->fCreated = false;
- pVNIC->hInterface = hInterface;
-
- /*
- * Obtain the data link ID for this VNIC, it's needed for modifying the MAC address among other things.
- */
- rc = dls_mgmt_get_linkid(pThis->szName, &pVNIC->hLinkId);
- if (RT_LIKELY(!rc))
+ pThis->u.s.fIsVNIC = true;
+ if (RTStrNCmp(pThis->szName, VBOXFLT_VNIC_TEMPLATE_NAME, sizeof(VBOXFLT_VNIC_TEMPLATE_NAME) - 1) == 0)
{
- /*
- * Initialize the VNIC and add it to the list of managed VNICs.
- */
- RTStrPrintf(pVNIC->szName, sizeof(pVNIC->szName), "%s", pThis->szName);
- rc = vboxNetFltSolarisInitVNIC(pThis, pVNIC);
- if (!rc)
- {
- list_insert_head(&pThis->u.s.hVNICs, pVNIC);
- return VINF_SUCCESS;
- }
- else
- LogRel((DEVICE_NAME ":vboxNetFltOsInitInstance vboxNetFltSolarisInitVNIC failed. rc=%d\n", rc));
+ LogFlow((DEVICE_NAME ":vboxNetFltOsInitInstance pThis=%p VNIC template '%s' detected.\n", pThis, pThis->szName));
+ pThis->u.s.fIsVNICTemplate = true;
}
- else
- LogRel((DEVICE_NAME ":vboxNetFltOsInitInstance failed to get link id for '%s'. rc=%d\n", pThis->szName, rc));
-
- vboxNetFltSolarisFreeVNIC(pVNIC);
}
- else
- LogRel((DEVICE_NAME ":vboxNetFltOsInitInstance failed to allocate VNIC private data.\n"));
+
+ if ( pThis->u.s.fIsVNIC
+ && !pThis->u.s.fIsVNICTemplate)
+ LogFlow((DEVICE_NAME ":vboxNetFltOsInitInstance pThis=%p VNIC '%s' detected.\n", pThis, pThis->szName));
+
+ /*
+ * Report info. (host MAC address, promiscuous, GSO capabilities etc.) to IntNet.
+ */
+ rc = vboxNetFltSolarisReportInfo(pThis, hInterface, pThis->u.s.fIsVNIC);
+ if (RT_FAILURE(rc))
+ LogRel((DEVICE_NAME ":vboxNetFltOsInitInstance failed to report info. rc=%d\n", rc));
mac_close(hInterface);
}
else
+ {
LogRel((DEVICE_NAME ":vboxNetFltOsInitInstance failed to open link '%s'! rc=%d\n", pThis->szName, rc));
+ rc = VERR_INTNET_FLT_IF_FAILED;
+ }
- return RTErrConvertFromErrno(rc);
+ return rc;
}
@@ -1117,12 +1342,12 @@ int vboxNetFltOsPreInitInstance(PVBOXNETFLTINS pThis)
/*
* Init. the solaris specific data.
*/
- pThis->u.s.fIsVNIC = false;
+ pThis->u.s.fIsVNIC = false;
+ pThis->u.s.fIsVNICTemplate = false;
list_create(&pThis->u.s.hVNICs, sizeof(VBOXNETFLTVNIC), offsetof(VBOXNETFLTVNIC, hNode));
- pThis->u.s.uInstance = 0;
- pThis->u.s.pvVNIC = NULL;
- bzero(&pThis->u.s.MacAddr, sizeof(pThis->u.s.MacAddr));
- pThis->u.s.fReportedInfo = false;
+ pThis->u.s.uInstance = 0;
+ pThis->u.s.hNotify = NULL;
+ RT_ZERO(pThis->u.s.MacAddr);
return VINF_SUCCESS;
}
@@ -1142,9 +1367,10 @@ int vboxNetFltPortOsXmit(PVBOXNETFLTINS pThis, void *pvIfData, PINTNETSG pSG, ui
* Validate parameters.
*/
PVBOXNETFLTVNIC pVNIC = pvIfData;
- AssertMsgReturn(VALID_PTR(pVNIC) && pVNIC->u32Magic == VBOXNETFLTVNIC_MAGIC,
- ("Invalid pvIfData=%p magic=%#x (expected %#x)\n", pvIfData, pVNIC ? pVNIC->u32Magic : 0, VBOXNETFLTVNIC_MAGIC),
- VERR_INVALID_PARAMETER);
+ AssertReturn(VALID_PTR(pVNIC), VERR_INVALID_POINTER);
+ AssertMsgReturn(pVNIC->u32Magic == VBOXNETFLTVNIC_MAGIC,
+ ("Invalid magic=%#x (expected %#x)\n", pVNIC->u32Magic, VBOXNETFLTVNIC_MAGIC),
+ VERR_INVALID_MAGIC);
/*
* Xmit the packet down the appropriate VNIC interface.
@@ -1161,7 +1387,7 @@ int vboxNetFltPortOsXmit(PVBOXNETFLTINS pThis, void *pvIfData, PINTNETSG pSG, ui
pMsg = NULL;
rc = VERR_NET_IO_ERROR;
- LogFlow((DEVICE_NAME ":vboxNetFltPortOsXmit Xmit failed pVNIC=%p.\n", pVNIC));
+ LogRel((DEVICE_NAME ":vboxNetFltPortOsXmit Xmit failed pVNIC=%p.\n", pVNIC));
}
else
{
@@ -1175,14 +1401,15 @@ int vboxNetFltPortOsXmit(PVBOXNETFLTINS pThis, void *pvIfData, PINTNETSG pSG, ui
void vboxNetFltPortOsNotifyMacAddress(PVBOXNETFLTINS pThis, void *pvIfData, PCRTMAC pMac)
{
- LogFlow((DEVICE_NAME ":vboxNetFltPortOSNotifyMacAddress %s %.6Rhxs\n", pThis->szName, pMac));
+ LogFlow((DEVICE_NAME ":vboxNetFltPortOSNotifyMacAddress pszIf=%s pszVNIC=%s MAC=%.6Rhxs\n", pThis->szName,
+ ((PVBOXNETFLTVNIC)pvIfData)->szName, pMac));
/*
* Validate parameters.
*/
PVBOXNETFLTVNIC pVNIC = pvIfData;
AssertMsgReturnVoid(VALID_PTR(pVNIC) && pVNIC->u32Magic == VBOXNETFLTVNIC_MAGIC,
- ("Invalid pvIfData=%p magic=%#x (expected %#x)\n", pvIfData, pVNIC ? pVNIC->u32Magic : 0, VBOXNETFLTVNIC_MAGIC));
+ ("Invalid pVNIC=%p magic=%#x (expected %#x)\n", pvIfData, VALID_PTR(pVNIC) ? pVNIC->u32Magic : 0, VBOXNETFLTVNIC_MAGIC));
AssertMsgReturnVoid(pVNIC->hLinkId != DATALINK_INVALID_LINKID,
("Invalid hLinkId pVNIC=%p magic=%#x\n", pVNIC, pVNIC->u32Magic));
@@ -1198,8 +1425,55 @@ void vboxNetFltPortOsNotifyMacAddress(PVBOXNETFLTINS pThis, void *pvIfData, PCRT
int MacLen = sizeof(RTMAC);
int rc = vnic_modify_addr(pVNIC->hLinkId, &AddrType, &MacLen, au8GuestMac, &MacSlot, 0 /* Mac-Prefix Length */, &Diag);
- if (RT_UNLIKELY(rc))
- LogRel((DEVICE_NAME ":vboxNetFltPortOsNotifyMacAddress failed! rc=%d Diag=%d\n", rc, Diag));
+ if (RT_LIKELY(!rc))
+ {
+ /*
+ * Remove existing unicast address and the RX hook.
+ */
+ if (pVNIC->hUnicast)
+ {
+ mac_rx_clear(pVNIC->hClient);
+ mac_unicast_remove(pVNIC->hClient, pVNIC->hUnicast);
+ pVNIC->hUnicast = NULL;
+ }
+
+ /*
+ * Add the primary unicast address and set the RX hook.
+ */
+ mac_diag_t MacDiag = MAC_DIAG_NONE;
+ /* uint16_t uVLANId = pVNIC->pVNICTemplate ? pVNIC->pVNICTemplate->uVLANId : 0; */
+ rc = mac_unicast_add(pVNIC->hClient, NULL, MAC_UNICAST_PRIMARY, &pVNIC->hUnicast, 0 /* VLAN Id */, &MacDiag);
+ if (RT_LIKELY(!rc))
+ {
+ /*
+ * Set the RX receive function.
+ * This shouldn't be necessary as vboxNetFltPortOsSetActive() will be invoked after this, but in the future,
+ * if the guest NIC changes MAC address this may not be followed by a vboxNetFltPortOsSetActive() call, so set it here anyway.
+ */
+ mac_rx_set(pVNIC->hClient, vboxNetFltSolarisRecv, pThis);
+ LogFlow((DEVICE_NAME ":vboxNetFltPortOsNotifyMacAddress successfully added unicast address %.6Rhxs\n", pMac));
+ }
+ else
+ LogRel((DEVICE_NAME ":vboxNetFltPortOsNotifyMacAddress failed to add primary unicast address. rc=%d Diag=%d\n", rc, MacDiag));
+ }
+ else
+ {
+ /*
+ * They really ought to use EEXIST, but I'm afraid this error comes from the VNIC device driver directly.
+ * Sequence: vnic_modify_addr()->mac_unicast_primary_set()->mac_update_macaddr() which uses a function pointer
+ * to the MAC driver (calls mac_vnic_unicast_set() in our case). Documented here if the error code should change we know
+ * where to look.
+ */
+ if (rc == ENOTSUP)
+ {
+ LogRel((DEVICE_NAME ":vboxNetFltPortOsNotifyMacAddress: failed! a VNIC with mac %.6Rhxs probably already exists.",
+ pMac, rc));
+ LogRel((DEVICE_NAME ":vboxNetFltPortOsNotifyMacAddress: This NIC cannot establish connection. szName=%s szVNIC=%s\n",
+ pThis->szName, pVNIC->szName));
+ }
+ else
+ LogRel((DEVICE_NAME ":vboxNetFltPortOsNotifyMacAddress failed! mac %.6Rhxs rc=%d Diag=%d\n", pMac, rc, Diag));
+ }
}
@@ -1210,10 +1484,11 @@ int vboxNetFltPortOsConnectInterface(PVBOXNETFLTINS pThis, void *pvIf, void **pp
int rc = VINF_SUCCESS;
/*
- * If the underlying interface is not a VNIC, we need to create
+ * If the underlying interface is a physical interface or a VNIC template, we need to create
* a VNIC per guest NIC.
*/
- if (!pThis->u.s.fIsVNIC)
+ if ( !pThis->u.s.fIsVNIC
+ || pThis->u.s.fIsVNICTemplate)
{
PVBOXNETFLTVNIC pVNIC = NULL;
rc = vboxNetFltSolarisCreateVNIC(pThis, &pVNIC);
@@ -1229,7 +1504,6 @@ int vboxNetFltPortOsConnectInterface(PVBOXNETFLTINS pThis, void *pvIf, void **pp
* Add the created VNIC to the list of VNICs we manage.
*/
list_insert_tail(&pThis->u.s.hVNICs, pVNIC);
- LogFlow((DEVICE_NAME ":vboxNetFltPortOsConnectInterface successfully created VNIC '%s'.\n", pVNIC->szName));
return VINF_SUCCESS;
}
else
@@ -1237,16 +1511,53 @@ int vboxNetFltPortOsConnectInterface(PVBOXNETFLTINS pThis, void *pvIf, void **pp
}
else
{
- PVBOXNETFLTVNIC pVNIC = list_head(&pThis->u.s.hVNICs);
+ /*
+ * This is a VNIC passed to us, use it directly.
+ */
+ PVBOXNETFLTVNIC pVNIC = vboxNetFltSolarisAllocVNIC();
if (RT_LIKELY(pVNIC))
{
- *ppvIfData = pVNIC;
- LogFlow((DEVICE_NAME ":vboxNetFltPortOsConnectInterface set VNIC '%s' private data\n", pVNIC->szName));
+ pVNIC->fCreated = false;
+
+ rc = mac_open_by_linkname(pThis->szName, &pVNIC->hInterface);
+ if (!rc)
+ {
+ /*
+ * Obtain the data link ID for this VNIC, it's needed for modifying the MAC address among other things.
+ */
+ rc = vboxNetFltSolarisGetLinkId(pThis->szName, &pVNIC->hLinkId);
+ if (RT_SUCCESS(rc))
+ {
+ /*
+ * Initialize the VNIC and add it to the list of managed VNICs.
+ */
+ RTStrPrintf(pVNIC->szName, sizeof(pVNIC->szName), "%s", pThis->szName);
+ rc = vboxNetFltSolarisInitVNIC(pThis, pVNIC);
+ if (!rc)
+ {
+ pVNIC->pvIf = pvIf;
+ *ppvIfData = pVNIC;
+ list_insert_head(&pThis->u.s.hVNICs, pVNIC);
+ return VINF_SUCCESS;
+ }
+ else
+ LogRel((DEVICE_NAME ":vboxNetFltPortOsConnectInterface failed to initialize VNIC. rc=%d\n", rc));
+ }
+ else
+ LogRel((DEVICE_NAME ":vboxNetFltPortOsConnectInterface failed to get link id for '%s'. rc=%d\n", pThis->szName, rc));
+ }
+ else
+ {
+ LogRel((DEVICE_NAME ":vboxNetFltPortOsConnectInterface failed to open VNIC '%s'. rc=%d\n", pThis->szName, rc));
+ rc = VERR_OPEN_FAILED;
+ }
+
+ vboxNetFltSolarisFreeVNIC(pVNIC);
}
else
{
- LogRel((DEVICE_NAME ":vboxNetFltPortOsConnectInterface huh!? Missing VNIC!\n"));
- return VERR_GENERAL_FAILURE;
+ LogRel((DEVICE_NAME ":vboxNetFltOsInitInstance failed to allocate VNIC private data.\n"));
+ rc = VERR_NO_MEMORY;
}
}
diff --git a/src/VBox/HostDrivers/VBoxUSB/win/Device/vboxdev.cpp b/src/VBox/HostDrivers/VBoxUSB/win/Device/vboxdev.cpp
index 84fffb7c1..e05f7393a 100644
--- a/src/VBox/HostDrivers/VBoxUSB/win/Device/vboxdev.cpp
+++ b/src/VBox/HostDrivers/VBoxUSB/win/Device/vboxdev.cpp
@@ -1867,6 +1867,16 @@ VBOXUSB_PIPE_INFO *VBoxUSBGetPipeState(PDEVICE_EXTENSION pDevice, uint32_t EndPo
return NULL;
}
+static VOID VBoxUSBStringDescriptorToUnicodeString(PUSB_STRING_DESCRIPTOR pDr, PUNICODE_STRING pUnicode)
+{
+ /* for some reason the string dr sometimes contains a non-null terminated string
+ * although we zeroed up the complete descriptor buffer
+ * this is why RtlInitUnicodeString won't work
+ * we need to init the scting length based on dr length */
+ pUnicode->Buffer = pDr->bString;
+ pUnicode->Length = pUnicode->MaximumLength = pDr->bLength - RT_OFFSETOF(USB_STRING_DESCRIPTOR, bString);
+}
+
/**
* Get a valid USB string descriptor language ID (the first ID found).
*
@@ -1984,13 +1994,17 @@ NTSTATUS VBoxUSBGetDeviceDescription(PDEVICE_EXTENSION pDevice)
/* Did we get a string back or not? */
if (pstrdescr->bLength > sizeof(USB_STRING_DESCRIPTOR))
{
- RtlInitUnicodeString(&ustr, pstrdescr->bString);
- RtlInitAnsiString(&astr, NULL);
-
- RtlUnicodeStringToAnsiString(&astr, &ustr, TRUE);
-
- strncpy(pDevice->usbdev.szSerial, astr.Buffer, sizeof(pDevice->usbdev.szSerial));
- RtlFreeAnsiString(&astr);
+ VBoxUSBStringDescriptorToUnicodeString(pstrdescr, &ustr);
+ astr.Buffer = pDevice->usbdev.szSerial;
+ astr.Length = 0;
+ astr.MaximumLength = (USHORT)sizeof(pDevice->usbdev.szSerial) - 1;
+ memset(pDevice->usbdev.szSerial, 0, sizeof(pDevice->usbdev.szSerial));
+ status = RtlUnicodeStringToAnsiString(&astr, &ustr, FALSE);
+ if (!NT_SUCCESS(status))
+ {
+ AssertMsgFailed((__FUNCTION__": RtlUnicodeStringToAnsiString Failed status (0x%x)\n", status));
+ goto fail;
+ }
}
}
diff --git a/src/VBox/HostDrivers/VBoxUSB/win/Device/vboxrwr.cpp b/src/VBox/HostDrivers/VBoxUSB/win/Device/vboxrwr.cpp
index b40f82b1a..206d387eb 100644
--- a/src/VBox/HostDrivers/VBoxUSB/win/Device/vboxrwr.cpp
+++ b/src/VBox/HostDrivers/VBoxUSB/win/Device/vboxrwr.cpp
@@ -128,311 +128,25 @@ VBoxUSB_DispatchReadWrite(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp
)
-/*++
-
-Routine Description:
-
- Dispatch routine for read and write.
- This routine creates a VBOXUSB_RW_CONTEXT for a read/write.
- This read/write is performed in stages of VBoxUSB_MAX_TRANSFER_SIZE.
- once a stage of transfer is complete, then the irp is circulated again,
- until the requested length of transfer is performed.
-
-Arguments:
-
- DeviceObject - pointer to device object
- Irp - I/O request packet
-
-Return Value:
-
- NT status value
-
---*/
{
- PMDL mdl;
- PURB urb;
- ULONG totalLength;
- ULONG stageLength;
- ULONG urbFlags;
- BOOLEAN read;
- NTSTATUS ntStatus;
- ULONG_PTR virtualAddress;
- PFILE_OBJECT fileObject;
- PDEVICE_EXTENSION deviceExtension;
- PIO_STACK_LOCATION irpStack;
- PIO_STACK_LOCATION nextStack;
- PVBOXUSB_RW_CONTEXT rwContext;
- PUSBD_PIPE_INFORMATION pipeInformation;
+ /* should never be here ! since all communication is performed via IOCTL */
+ AssertFailed();
- //
- // initialize variables
- //
- urb = NULL;
- mdl = NULL;
- rwContext = NULL;
- totalLength = 0;
- irpStack = IoGetCurrentIrpStackLocation(Irp);
- fileObject = irpStack->FileObject;
- read = (irpStack->MajorFunction == IRP_MJ_READ) ? TRUE : FALSE;
- deviceExtension = (PDEVICE_EXTENSION) DeviceObject->DeviceExtension;
+ NTSTATUS Status = STATUS_ACCESS_DENIED;
+ PDEVICE_EXTENSION deviceExtension = (PDEVICE_EXTENSION) DeviceObject->DeviceExtension;
dprintf(("VBoxUSB_DispatchReadWrite - begins\n"));
if(deviceExtension->DeviceState != Working) {
-
dprintf(("Invalid device state\n"));
-
- ntStatus = STATUS_INVALID_DEVICE_STATE;
- goto VBoxUSB_DispatchReadWrite_Exit;
- }
-
- //
- // It is true that the client driver cancelled the selective suspend
- // request in the dispatch routine for create Irps.
- // But there is no guarantee that it has indeed completed.
- // so wait on the NoIdleReqPendEvent and proceed only if this event
- // is signalled.
- //
- dprintf(("Waiting on the IdleReqPendEvent\n"));
-
- //
- // make sure that the selective suspend request has been completed.
- //
-
- if(deviceExtension->SSEnable) {
-
- KeWaitForSingleObject(&deviceExtension->NoIdleReqPendEvent,
- Executive,
- KernelMode,
- FALSE,
- NULL);
- }
-
- if(fileObject && fileObject->FsContext) {
-
- pipeInformation = (PUSBD_PIPE_INFORMATION)fileObject->FsContext;
-
- if((UsbdPipeTypeBulk != pipeInformation->PipeType) &&
- (UsbdPipeTypeInterrupt != pipeInformation->PipeType)) {
-
- dprintf(("Usbd pipe type is not bulk or interrupt\n"));
-
- ntStatus = STATUS_INVALID_HANDLE;
- goto VBoxUSB_DispatchReadWrite_Exit;
- }
- }
- else {
-
- dprintf(("Invalid handle\n"));
-
- ntStatus = STATUS_INVALID_HANDLE;
- goto VBoxUSB_DispatchReadWrite_Exit;
- }
-
- rwContext = (PVBOXUSB_RW_CONTEXT)
- ExAllocatePool(NonPagedPool,
- sizeof(VBOXUSB_RW_CONTEXT));
-
- if(rwContext == NULL) {
-
- dprintf(("Failed to alloc mem for rwContext\n"));
-
- ntStatus = STATUS_INSUFFICIENT_RESOURCES;
- goto VBoxUSB_DispatchReadWrite_Exit;
- }
-
- if(Irp->MdlAddress) {
-
- totalLength = MmGetMdlByteCount(Irp->MdlAddress);
- }
-
- if(totalLength > VBOXUSB_TEST_BOARD_TRANSFER_BUFFER_SIZE) {
-
- dprintf(("Transfer length > circular buffer\n"));
-
- ntStatus = STATUS_INVALID_PARAMETER;
-
- ExFreePool(rwContext);
-
- goto VBoxUSB_DispatchReadWrite_Exit;
- }
-
- if(totalLength == 0) {
-
- dprintf(("Transfer data length = 0\n"));
-
- ntStatus = STATUS_SUCCESS;
-
- ExFreePool(rwContext);
-
- goto VBoxUSB_DispatchReadWrite_Exit;
- }
-
- urbFlags = USBD_SHORT_TRANSFER_OK;
- virtualAddress = (ULONG_PTR) MmGetMdlVirtualAddress(Irp->MdlAddress);
-
- if(read) {
-
- urbFlags |= USBD_TRANSFER_DIRECTION_IN;
- dprintf(("Read operation\n"));
+ Status = STATUS_INVALID_DEVICE_STATE;
}
- else {
-
- urbFlags |= USBD_TRANSFER_DIRECTION_OUT;
- dprintf(("Write operation\n"));
- }
-
- //
- // the transfer request is for totalLength.
- // we can perform a max of VBoxUSB_MAX_TRANSFER_SIZE
- // in each stage.
- //
- if(totalLength > VBOXUSB_MAX_TRANSFER_SIZE) {
-
- stageLength = VBOXUSB_MAX_TRANSFER_SIZE;
- }
- else {
-
- stageLength = totalLength;
- }
-
- mdl = IoAllocateMdl((PVOID) virtualAddress,
- totalLength,
- FALSE,
- FALSE,
- NULL);
-
- if(mdl == NULL) {
-
- dprintf(("Failed to alloc mem for mdl\n"));
-
- ntStatus = STATUS_INSUFFICIENT_RESOURCES;
-
- ExFreePool(rwContext);
-
- goto VBoxUSB_DispatchReadWrite_Exit;
- }
-
- //
- // map the portion of user-buffer described by an mdl to another mdl
- //
- IoBuildPartialMdl(Irp->MdlAddress,
- mdl,
- (PVOID) virtualAddress,
- stageLength);
-
- urb = (PURB)ExAllocatePool(NonPagedPool,sizeof(struct _URB_BULK_OR_INTERRUPT_TRANSFER));
-
- if(urb == NULL) {
-
- dprintf(("Failed to alloc mem for urb\n"));
-
- ntStatus = STATUS_INSUFFICIENT_RESOURCES;
-
- ExFreePool(rwContext);
- IoFreeMdl(mdl);
-
- goto VBoxUSB_DispatchReadWrite_Exit;
- }
-
- UsbBuildInterruptOrBulkTransferRequest(
- urb,
- sizeof(struct _URB_BULK_OR_INTERRUPT_TRANSFER),
- pipeInformation->PipeHandle,
- NULL,
- mdl,
- stageLength,
- urbFlags,
- NULL);
-
- //
- // set VBOXUSB_RW_CONTEXT parameters.
- //
- rwContext->Urb = urb;
- rwContext->Mdl = mdl;
- rwContext->Length = totalLength - stageLength;
- rwContext->Numxfer = 0;
- rwContext->VirtualAddress = virtualAddress + stageLength;
- rwContext->DeviceExtension = deviceExtension;
-
- //
- // use the original read/write irp as an internal device control irp
- //
-
- nextStack = IoGetNextIrpStackLocation(Irp);
- nextStack->MajorFunction = IRP_MJ_INTERNAL_DEVICE_CONTROL;
- nextStack->Parameters.Others.Argument1 = (PVOID) urb;
- nextStack->Parameters.DeviceIoControl.IoControlCode =
- IOCTL_INTERNAL_USB_SUBMIT_URB;
-
- IoSetCompletionRoutine(Irp,
- (PIO_COMPLETION_ROUTINE)VBoxUSB_ReadWriteCompletion,
- rwContext,
- TRUE,
- TRUE,
- TRUE);
-
- //
- // since we return STATUS_PENDING call IoMarkIrpPending.
- // This is the boiler plate code.
- // This may cause extra overhead of an APC for the Irp completion
- // but this is the correct thing to do.
- //
-
- IoMarkIrpPending(Irp);
-
- dprintf(("VBoxUSB_DispatchReadWrite::"));
- VBoxUSB_IoIncrement(deviceExtension);
-
- ntStatus = IoCallDriver(deviceExtension->TopOfStackDeviceObject,
- Irp);
-
- if(!NT_SUCCESS(ntStatus)) {
-
- dprintf(("IoCallDriver fails with status %X\n", ntStatus));
-
- //
- // if the device was yanked out, then the pipeInformation
- // field is invalid.
- // similarly if the request was cancelled, then we need not
- // invoked reset pipe/device.
- //
- if((ntStatus != STATUS_CANCELLED) &&
- (ntStatus != STATUS_DEVICE_NOT_CONNECTED)) {
-
- ntStatus = VBoxUSB_ResetPipe(DeviceObject,
- pipeInformation->PipeHandle);
-
- if(!NT_SUCCESS(ntStatus)) {
-
- dprintf(("VBoxUSB_ResetPipe failed\n"));
-
- ntStatus = VBoxUSB_ResetDevice(DeviceObject);
- }
- }
- else {
-
- dprintf(("ntStatus is STATUS_CANCELLED or "
- "STATUS_DEVICE_NOT_CONNECTED\n"));
- }
- }
-
- //
- // we return STATUS_PENDING and not the status returned by the lower layer.
- //
- return STATUS_PENDING;
-
-VBoxUSB_DispatchReadWrite_Exit:
-
- Irp->IoStatus.Status = ntStatus;
+ Irp->IoStatus.Status = Status;
Irp->IoStatus.Information = 0;
IoCompleteRequest(Irp, IO_NO_INCREMENT);
-
- dprintf(("VBoxUSB_DispatchReadWrite - ends\n"));
-
- return ntStatus;
+ return Status;
}
NTSTATUS
diff --git a/src/VBox/HostDrivers/VBoxUSB/win/Monitor/USBMon.cpp b/src/VBox/HostDrivers/VBoxUSB/win/Monitor/USBMon.cpp
index f768aeb6c..ac35fc1df 100644
--- a/src/VBox/HostDrivers/VBoxUSB/win/Monitor/USBMon.cpp
+++ b/src/VBox/HostDrivers/VBoxUSB/win/Monitor/USBMon.cpp
@@ -312,25 +312,22 @@ NTSTATUS _stdcall VBoxUSBMonCreate(PDEVICE_OBJECT pDevObj, PIRP pIrp)
RtlFreeUnicodeString(&UnicodeName);
}
- if (InterlockedCompareExchange(&pDevExt->fRemoveLockInitialized, 1, 0) == 0)
- {
- //
- // Let us use remove lock to keep count of IRPs so that we don't
- // detach and delete our deviceobject until all pending I/Os in our
- // devstack are completed. Remlock is required to protect us from
- // various race conditions where our driver can get unloaded while we
- // are still running dispatch or completion code.
- //
-
- IoInitializeRemoveLock (&pDevExt->RemoveLock , POOL_TAG,
- 1, // MaxLockedMinutes
- 100); // HighWatermark, this parameter is
- // used only on checked build. Specifies
- // the maximum number of outstanding
- // acquisitions allowed on the lock
-
- DebugPrint(("VBoxUSBMon: remove lock = %x\n", pDevExt->RemoveLock.Common.RemoveEvent));
- }
+ //
+ // Let us use remove lock to keep count of IRPs so that we don't
+ // detach and delete our deviceobject until all pending I/Os in our
+ // devstack are completed. Remlock is required to protect us from
+ // various race conditions where our driver can get unloaded while we
+ // are still running dispatch or completion code.
+ //
+
+ IoInitializeRemoveLock (&pDevExt->RemoveLock , POOL_TAG,
+ 1, // MaxLockedMinutes
+ 100); // HighWatermark, this parameter is
+ // used only on checked build. Specifies
+ // the maximum number of outstanding
+ // acquisitions allowed on the lock
+
+ DebugPrint(("VBoxUSBMon: remove lock = %x\n", pDevExt->RemoveLock.Common.RemoveEvent));
}
status = IoAcquireRemoveLock(&pDevExt->RemoveLock, ControlDeviceObject);
diff --git a/src/VBox/HostDrivers/VBoxUSB/win/Monitor/USBMon.h b/src/VBox/HostDrivers/VBoxUSB/win/Monitor/USBMon.h
index 2136dda5c..619a46d6e 100644
--- a/src/VBox/HostDrivers/VBoxUSB/win/Monitor/USBMon.h
+++ b/src/VBox/HostDrivers/VBoxUSB/win/Monitor/USBMon.h
@@ -82,8 +82,6 @@ typedef struct _DEVICE_EXTENSION
//
IO_REMOVE_LOCK RemoveLock;
- /* Whether the lock has been initialized. */
- LONG fRemoveLockInitialized;
/* Number of times the device was opened. */
LONG cOpened;
diff --git a/src/VBox/HostDrivers/VBoxUSB/win/Monitor/USBMonFlt.cpp b/src/VBox/HostDrivers/VBoxUSB/win/Monitor/USBMonFlt.cpp
index 2260062f6..451a983c3 100644
--- a/src/VBox/HostDrivers/VBoxUSB/win/Monitor/USBMonFlt.cpp
+++ b/src/VBox/HostDrivers/VBoxUSB/win/Monitor/USBMonFlt.cpp
@@ -730,6 +730,16 @@ fail:
return status;
}
+static VOID VBoxUSBStringDescriptorToUnicodeString(PUSB_STRING_DESCRIPTOR pDr, PUNICODE_STRING pUnicode)
+{
+ /* for some reason the string dr sometimes contains a non-null terminated string
+ * although we zeroed up the complete descriptor buffer
+ * this is why RtlInitUnicodeString won't work
+ * we need to init the scting length based on dr length */
+ pUnicode->Buffer = pDr->bString;
+ pUnicode->Length = pUnicode->MaximumLength = pDr->bLength - RT_OFFSETOF(USB_STRING_DESCRIPTOR, bString);
+}
+
NTSTATUS VBoxUSBGetStringDescriptor(PDEVICE_OBJECT pDevObj, char *dest, unsigned size, int index, int lang_id)
{
NTSTATUS status;
@@ -765,11 +775,17 @@ NTSTATUS VBoxUSBGetStringDescriptor(PDEVICE_OBJECT pDevObj, char *dest, unsigned
}
if (pstrdescr->bLength > sizeof(USB_STRING_DESCRIPTOR))
{
- RtlInitUnicodeString(&ustr, pstrdescr->bString);
- RtlInitAnsiString(&astr, NULL);
- RtlUnicodeStringToAnsiString(&astr, &ustr, TRUE);
- strncpy(dest, astr.Buffer, size);
- RtlFreeAnsiString(&astr);
+ VBoxUSBStringDescriptorToUnicodeString(pstrdescr, &ustr);
+ astr.Buffer = dest;
+ astr.Length = 0;
+ astr.MaximumLength = (USHORT)size - 1;
+ memset(dest, 0, size);
+ status = RtlUnicodeStringToAnsiString(&astr, &ustr, FALSE);
+ if (!NT_SUCCESS(status))
+ {
+ AssertMsgFailed((__FUNCTION__": RtlUnicodeStringToAnsiString Failed status (0x%x)\n", status));
+ goto fail;
+ }
}
}
status = STATUS_SUCCESS;
diff --git a/src/VBox/Installer/linux/install.sh b/src/VBox/Installer/linux/install.sh
index cb9c5c139..96198089f 100755
--- a/src/VBox/Installer/linux/install.sh
+++ b/src/VBox/Installer/linux/install.sh
@@ -462,13 +462,13 @@ if [ "$ACTION" = "install" ]; then
# Write udev rules
echo "KERNEL=${udev_fix}\"vboxdrv\", NAME=\"vboxdrv\", OWNER=\"root\", GROUP=\"$VBOXDRV_GRP\", MODE=\"$VBOXDRV_MODE\"" \
> /etc/udev/rules.d/10-vboxdrv.rules
- echo "SUBSYSTEM=${udev_fix}\"usb_device\", ACTION=${udev_fix}\"add\", RUN=\"$INSTALLATION_DIR/VBoxCreateUSBNode.sh \$major \$minor \$attr{bDeviceClass}\"" \
+ echo "SUBSYSTEM=${udev_fix}\"usb_device\", ACTION=${udev_fix}\"add\", RUN+=\"$INSTALLATION_DIR/VBoxCreateUSBNode.sh \$major \$minor \$attr{bDeviceClass}\"" \
>> /etc/udev/rules.d/10-vboxdrv.rules
- echo "SUBSYSTEM=${udev_fix}\"usb\", ACTION=${udev_fix}\"add\", ENV{DEVTYPE}==\"usb_device\", RUN=\"$INSTALLATION_DIR/VBoxCreateUSBNode.sh \$major \$minor \$attr{bDeviceClass}\"" \
+ echo "SUBSYSTEM=${udev_fix}\"usb\", ACTION=${udev_fix}\"add\", ENV{DEVTYPE}==\"usb_device\", RUN+=\"$INSTALLATION_DIR/VBoxCreateUSBNode.sh \$major \$minor \$attr{bDeviceClass}\"" \
>> /etc/udev/rules.d/10-vboxdrv.rules
- echo "SUBSYSTEM=${udev_fix}\"usb_device\", ACTION=${udev_fix}\"remove\", RUN=\"$INSTALLATION_DIR/VBoxCreateUSBNode.sh --remove \$major \$minor\"" \
+ echo "SUBSYSTEM=${udev_fix}\"usb_device\", ACTION=${udev_fix}\"remove\", RUN+=\"$INSTALLATION_DIR/VBoxCreateUSBNode.sh --remove \$major \$minor\"" \
>> /etc/udev/rules.d/10-vboxdrv.rules
- echo "SUBSYSTEM=${udev_fix}\"usb\", ACTION=${udev_fix}\"remove\", ENV{DEVTYPE}==\"usb_device\", RUN=\"$INSTALLATION_DIR/VBoxCreateUSBNode.sh --remove \$major \$minor\"" \
+ echo "SUBSYSTEM=${udev_fix}\"usb\", ACTION=${udev_fix}\"remove\", ENV{DEVTYPE}==\"usb_device\", RUN+=\"$INSTALLATION_DIR/VBoxCreateUSBNode.sh --remove \$major \$minor\"" \
>> /etc/udev/rules.d/10-vboxdrv.rules
fi
# Remove old udev description file
diff --git a/src/VBox/Installer/linux/rpm/VirtualBox.tmpl.spec b/src/VBox/Installer/linux/rpm/VirtualBox.tmpl.spec
index 8062eec5f..ac55e3583 100644
--- a/src/VBox/Installer/linux/rpm/VirtualBox.tmpl.spec
+++ b/src/VBox/Installer/linux/rpm/VirtualBox.tmpl.spec
@@ -252,13 +252,13 @@ if [ -d /etc/udev/rules.d -a "$INSTALL_NO_UDEV" != "1" ]; then
usb_createnode="/usr/share/virtualbox/VBoxCreateUSBNode.sh"
echo "KERNEL=${udev_fix}\"vboxdrv\", NAME=\"vboxdrv\", OWNER=\"root\", GROUP=\"root\", MODE=\"0600\"" \
> /etc/udev/rules.d/10-vboxdrv.rules
- echo "SUBSYSTEM=${udev_fix}\"usb_device\", ACTION=${udev_fix}\"add\", RUN=\"${usb_createnode} \$major \$minor \$attr{bDeviceClass}\"" \
+ echo "SUBSYSTEM=${udev_fix}\"usb_device\", ACTION=${udev_fix}\"add\", RUN+=\"${usb_createnode} \$major \$minor \$attr{bDeviceClass}\"" \
>> /etc/udev/rules.d/10-vboxdrv.rules
- echo "SUBSYSTEM=${udev_fix}\"usb\", ACTION=${udev_fix}\"add\", ENV{DEVTYPE}==\"usb_device\", RUN=\"${usb_createnode} \$major \$minor \$attr{bDeviceClass}\"" \
+ echo "SUBSYSTEM=${udev_fix}\"usb\", ACTION=${udev_fix}\"add\", ENV{DEVTYPE}==\"usb_device\", RUN+=\"${usb_createnode} \$major \$minor \$attr{bDeviceClass}\"" \
>> /etc/udev/rules.d/10-vboxdrv.rules
- echo "SUBSYSTEM=${udev_fix}\"usb_device\", ACTION=${udev_fix}\"remove\", RUN=\"${usb_createnode} --remove \$major \$minor\"" \
+ echo "SUBSYSTEM=${udev_fix}\"usb_device\", ACTION=${udev_fix}\"remove\", RUN+=\"${usb_createnode} --remove \$major \$minor\"" \
>> /etc/udev/rules.d/10-vboxdrv.rules
- echo "SUBSYSTEM=${udev_fix}\"usb\", ACTION=${udev_fix}\"remove\", ENV{DEVTYPE}==\"usb_device\", RUN=\"${usb_createnode} --remove \$major \$minor\"" \
+ echo "SUBSYSTEM=${udev_fix}\"usb\", ACTION=${udev_fix}\"remove\", ENV{DEVTYPE}==\"usb_device\", RUN+=\"${usb_createnode} --remove \$major \$minor\"" \
>> /etc/udev/rules.d/10-vboxdrv.rules
fi
# Remove old udev description file
@@ -407,8 +407,6 @@ if [ "$1" = 0 ]; then
rm -f /etc/udev/rules.d/10-vboxdrv.rules
rm -f /etc/vbox/license_agreed
rm -f /etc/vbox/module_not_compiled
- # remove our USB device tree
- rm -rf /dev/vboxusb 2> /dev/null
fi
DKMS=`which dkms 2>/dev/null`
if [ -n "$DKMS" ]; then
diff --git a/src/VBox/Installer/linux/vboxdrv.sh.in b/src/VBox/Installer/linux/vboxdrv.sh.in
index dc29eedae..a80746544 100755
--- a/src/VBox/Installer/linux/vboxdrv.sh.in
+++ b/src/VBox/Installer/linux/vboxdrv.sh.in
@@ -208,7 +208,7 @@ start()
# Create the /dev/vboxusb directory if the host supports that method
# of USB access. The USB code checks for the existance of that path.
if grep -q usb_device /proc/devices; then
- mkdir -p -m 0640 /dev/vboxusb 2>/dev/null
+ mkdir -p -m 0750 /dev/vboxusb 2>/dev/null
chown root:vboxusers /dev/vboxusb 2>/dev/null
fi
succ_msg
diff --git a/src/VBox/Installer/win/Makefile.kmk b/src/VBox/Installer/win/Makefile.kmk
index 898b5e324..df7ff83b1 100644
--- a/src/VBox/Installer/win/Makefile.kmk
+++ b/src/VBox/Installer/win/Makefile.kmk
@@ -4,7 +4,7 @@
#
#
-# Copyright (C) 2006-2010 Oracle Corporation
+# Copyright (C) 2006-2011 Oracle Corporation
#
# This file is part of VirtualBox Open Source Edition (OSE), as
# available from http://www.virtualbox.org. This file is free software;
@@ -355,6 +355,7 @@ $(VBOX_WIN_INST_OUT_DIR)/VirtualBox_$(lang).wixobj: \
-E 'VBOX_PRODUCT=$(VBOX_PRODUCT)' \
-E 'VBOX_C_YEAR=$(VBOX_C_YEAR)' \
-E 'VBOX_VERSION_STRING=$(VBOX_VERSION_STRING)' \
+ -E 'VBOX_VERSION_STRING_RAW=$(VBOX_VERSION_STRING_RAW)' \
-E 'VBOX_VERSION_MAJOR_INST=$(VBOX_VERSION_MAJOR)' \
-E 'VBOX_VERSION_MINOR_INST=$(VBOX_VERSION_MINOR)' \
-E 'VBOX_SIGNING_MODE=$(strip $(if $(VBOX_SIGNING_MODE),$(VBOX_SIGNING_MODE),none))' \
@@ -426,7 +427,8 @@ $(VBOX_WIN_INST_OUT_DIR)/VBoxGuiNLS.wxi: $(PATH_ROOT)/src/VBox/Frontends/Virtual
# Edit the version stored in the registry.
#
$(VBOX_WIN_INST_OUT_DIR)/VBoxKey.wxi: $(PATH_SUB_CURRENT)/VBoxKey.wxi $(VBOX_VERSION_STAMP) | $$(dir $$@)
- $(SED) -e 's/%VER%/$(VBOX_VERSION_STRING)/' --output $@ $<
+ $(SED) -e 's/%VER%/$(VBOX_VERSION_STRING_RAW)/' --output $@ $<
+ $(SED) -e 's/%VER_EXT%/$(VBOX_VERSION_STRING)/' --output $@ $<
#
# Build the multi-language version of the .MSI installer (final installer).
diff --git a/src/VBox/Installer/win/VBoxKey.wxi b/src/VBox/Installer/win/VBoxKey.wxi
index bab77b57d..e77a25590 100644
--- a/src/VBox/Installer/win/VBoxKey.wxi
+++ b/src/VBox/Installer/win/VBoxKey.wxi
@@ -1,4 +1,5 @@
<Include>
<Registry Root="HKLM" Key="$(var.Property_RegKey)" Name="Version" Value="%VER%" Type="string" />
+ <Registry Root="HKLM" Key="$(var.Property_RegKey)" Name="VersionExt" Value="%VER_EXT%" Type="string" />
<Registry Root="HKLM" Key="$(var.Property_RegKey)" Name="InstallDir" Value="[INSTALLDIR]" Type="string" />
</Include>
diff --git a/src/VBox/Installer/win/VirtualBox.wxs b/src/VBox/Installer/win/VirtualBox.wxs
index 93d4cde34..a52f4310e 100644
--- a/src/VBox/Installer/win/VirtualBox.wxs
+++ b/src/VBox/Installer/win/VirtualBox.wxs
@@ -2,7 +2,7 @@
<!--
VirtualBox Windows Installation Script (WiX)
- Copyright (C) 2006-2010 Oracle Corporation
+ Copyright (C) 2006-2011 Oracle Corporation
This file is part of VirtualBox Open Source Edition (OSE), as
available from http://www.virtualbox.org. This file is free software;
@@ -14,7 +14,8 @@
-->
<?define Property_RegKey ="Software\$(env.VBOX_VENDOR_SHORT)\VirtualBox" ?>
-<?define Property_Version = "$(env.VBOX_VERSION_STRING)" ?>
+<?define Property_Version = "$(env.VBOX_VERSION_STRING_RAW)" ?>
+<?define Property_VersionExt = "$(env.VBOX_VERSION_STRING)" ?>
<?define Property_Upgrade = "yes" ?>
<?if $(env.BUILD_TARGET_ARCH) = "amd64" ?>
@@ -73,7 +74,7 @@
<!-- Package GUIDs must be different for each package. The "???" directs WiX to create one. -->
<Package Id="????????-????-????-????-????????????" Keywords="Installer"
- Description="$(env.VBOX_PRODUCT) $(var.Property_Version) installation package"
+ Description="$(env.VBOX_PRODUCT) $(var.Property_VersionExt) installation package"
Comments="$(env.VBOX_PRODUCT) installation package"
Manufacturer="$(env.VBOX_VENDOR)"
InstallerVersion="200"
diff --git a/src/VBox/Main/idl/VirtualBox.xidl b/src/VBox/Main/idl/VirtualBox.xidl
index 16ed12321..e3d38f267 100644
--- a/src/VBox/Main/idl/VirtualBox.xidl
+++ b/src/VBox/Main/idl/VirtualBox.xidl
@@ -550,8 +550,8 @@
When the virtual machine is in one of the online VM states (that is, being
executed), only a few machine settings can be modified. Methods working
with such settings contain an explicit note about that. An attempt to
- change any oter setting or perform a modifying operation during this time
- will result in the <link to="VBOX_E_INVALID_VM_STATE"/> error.
+ change any other setting or perform a modifying operation during this time
+ will result in the @c VBOX_E_INVALID_VM_STATE error.
All online states except Running, Paused and Stuck are transitional: they
represent temporary conditions of the virtual machine that will last as
diff --git a/src/VBox/Main/include/USBGetDevices.h b/src/VBox/Main/include/USBGetDevices.h
index 026a9ebb7..65f9e6651 100644
--- a/src/VBox/Main/include/USBGetDevices.h
+++ b/src/VBox/Main/include/USBGetDevices.h
@@ -74,29 +74,37 @@ static inline void deviceListFree(PUSBDEVICE *ppHead)
RT_C_DECLS_BEGIN
-/** List of well-known USB device tree locations */
-typedef struct USBDEVTREELOCATION
-{
- /** The root of the device tree for this location. */
- char szDevicesRoot[256];
- /** Whether this location requires device enumeration using sysfs. */
- bool fUseSysfs;
-} USBDEVTREELOCATION, *PUSBDEVTREELOCATION;
-typedef const USBDEVTREELOCATION *PCUSBDEVTREELOCATION;
+/**
+ * Check whether a USB device tree root is usable
+ * @param pcszRoot the path to the root of the device tree
+ * @param fIsDeviceNodes whether this is a device node (or usbfs) tree
+ * @note returns a pointer into a static array so it will stay valid
+ */
+extern bool USBProxyLinuxCheckDeviceRoot(const char *pcszRoot,
+ bool fIsDeviceNodes);
+#ifdef UNIT_TEST
+/**
+ * Specify the list of devices that will appear to be available through
+ * usbfs during unit testing (of USBProxyLinuxGetDevices)
+ * @param pacszDeviceAddresses NULL terminated array of usbfs device addresses
+ */
+extern void TestUSBSetAvailableUsbfsDevices(const char **pacszDeviceAddresses);
/**
- * Get the USB device tree root
- * @param fPreferSysfs whether we wish to use sysfs over usbfs for
- * enumeration if we have the choice
- * @note returns a pointer into a static array so it will stay valid
+ * Specify the list of files that access will report as accessible (at present
+ * we only do accessible or not accessible) during unit testing (of
+ * USBProxyLinuxGetDevices)
+ * @param pacszAccessibleFiles NULL terminated array of file paths to be
+ * reported accessible
*/
-extern PCUSBDEVTREELOCATION USBProxyLinuxGetDeviceRoot(bool fPreferSysfs);
+extern void TestUSBSetAccessibleFiles(const char **pacszAccessibleFiles);
+#endif
/**
* Get the list of USB devices supported by the system. Should be freed using
* @a deviceFree or something equivalent.
* @param pcszDevicesRoot the path to the root of the device tree
- * @param fUseSysfs whether to use sysfs (or usbfs) for enumeration
+ * @param fUseSysfs whether to use sysfs (or usbfs) for enumeration
*/
extern PUSBDEVICE USBProxyLinuxGetDevices(const char *pcszDevicesRoot,
bool fUseSysfs);
diff --git a/src/VBox/Main/include/USBProxyService.h b/src/VBox/Main/include/USBProxyService.h
index b8c8d4d05..296c11932 100644
--- a/src/VBox/Main/include/USBProxyService.h
+++ b/src/VBox/Main/include/USBProxyService.h
@@ -210,14 +210,37 @@ public:
virtual int captureDevice(HostUSBDevice *aDevice);
virtual int releaseDevice(HostUSBDevice *aDevice);
+# ifdef UNIT_TEST
+ /* Functions for setting our unit test mock functions. Not quite sure if
+ * it is good form to mix test and production code like this, but it seems
+ * cleaner to me than tying the unit test to implementation details of the
+ * class. */
+ /** Select which access methods will be available to the @a init method
+ * during unit testing, and (hack!) what return code it will see from
+ * the access method-specific initialisation. */
+ void testSetupInit(const char *pcszUsbfsRoot, bool fUsbfsAccessible,
+ const char *pcszDevicesRoot, bool fDevicesAccessible,
+ int rcMethodInitResult)
+ {
+ mpcszTestUsbfsRoot = pcszUsbfsRoot;
+ mfTestUsbfsAccessible = fUsbfsAccessible;
+ mpcszTestDevicesRoot = pcszDevicesRoot;
+ mfTestDevicesAccessible = fDevicesAccessible;
+ mrcTestMethodInitResult = rcMethodInitResult;
+ }
+ /** Specify the environment that the @a init method will see during unit
+ * testing. */
+ void testSetEnv(const char *pcszEnvUsb, const char *pcszEnvUsbRoot)
+ {
+ mpcszTestEnvUsb = pcszEnvUsb;
+ mpcszTestEnvUsbRoot = pcszEnvUsbRoot;
+ }
+ bool testGetUsingUsbfs(void) { return mUsingUsbfsDevices; }
+ const char *testGetDevicesRoot(void) { return mDevicesRoot.c_str(); }
+# endif
+
protected:
-#ifdef TESTCASE
- virtual
-#endif
int initUsbfs(void);
-#ifdef TESTCASE
- virtual
-#endif
int initSysfs(void);
void doUsbfsCleanupAsNeeded(void);
virtual int wait(RTMSINTERVAL aMillies);
@@ -247,6 +270,22 @@ private:
/** Object used for polling for hotplug events from hal. */
VBoxMainHotplugWaiter *mpWaiter;
# endif
+# ifdef UNIT_TEST
+ /** The path we pretend the usbfs root is located at, or NULL. */
+ const char *mpcszTestUsbfsRoot;
+ /** Should usbfs be accessible to the current user? */
+ bool mfTestUsbfsAccessible;
+ /** The path we pretend the device node tree root is located at, or NULL. */
+ const char *mpcszTestDevicesRoot;
+ /** Should the device node tree be accessible to the current user? */
+ bool mfTestDevicesAccessible;
+ /** The result of the usbfs/inotify-specific init */
+ int mrcTestMethodInitResult;
+ /** The value of the VBOX_USB environment variable. */
+ const char *mpcszTestEnvUsb;
+ /** The value of the VBOX_USB_ROOT environment variable. */
+ const char *mpcszTestEnvUsbRoot;
+# endif
};
# endif /* RT_OS_LINUX */
diff --git a/src/VBox/Main/src-all/Global.cpp b/src/VBox/Main/src-all/Global.cpp
index 1f648eccb..2483d6046 100644
--- a/src/VBox/Main/src-all/Global.cpp
+++ b/src/VBox/Main/src-all/Global.cpp
@@ -149,11 +149,11 @@ const Global::OSType Global::sOSTypes[SchemaDefs::OSTypeId_COUNT] =
StorageControllerType_IntelAhci, StorageBus_SATA, ChipsetType_PIIX3, AudioControllerType_AC97 },
{ "Linux", "Linux", SchemaDefs_OSTypeId_Fedora, "Fedora",
VBOXOSTYPE_FedoraCore, VBOXOSHINT_RTCUTC | VBOXOSHINT_USBTABLET,
- 512, 12, 8 * _1G64, NetworkAdapterType_I82540EM, 0, StorageControllerType_PIIX4, StorageBus_IDE,
+ 768, 12, 8 * _1G64, NetworkAdapterType_I82540EM, 0, StorageControllerType_PIIX4, StorageBus_IDE,
StorageControllerType_IntelAhci, StorageBus_SATA, ChipsetType_PIIX3, AudioControllerType_AC97 },
{ "Linux", "Linux", SchemaDefs_OSTypeId_Fedora_64, "Fedora (64 bit)",
VBOXOSTYPE_FedoraCore_x64, VBOXOSHINT_64BIT | VBOXOSHINT_HWVIRTEX | VBOXOSHINT_IOAPIC | VBOXOSHINT_RTCUTC | VBOXOSHINT_USBTABLET,
- 512, 12, 8 * _1G64, NetworkAdapterType_I82540EM, 0, StorageControllerType_PIIX4, StorageBus_IDE,
+ 768, 12, 8 * _1G64, NetworkAdapterType_I82540EM, 0, StorageControllerType_PIIX4, StorageBus_IDE,
StorageControllerType_IntelAhci, StorageBus_SATA, ChipsetType_PIIX3, AudioControllerType_AC97 },
{ "Linux", "Linux", SchemaDefs_OSTypeId_Gentoo, "Gentoo",
VBOXOSTYPE_Gentoo, VBOXOSHINT_RTCUTC | VBOXOSHINT_USBTABLET,
diff --git a/src/VBox/Main/src-client/ConsoleImpl.cpp b/src/VBox/Main/src-client/ConsoleImpl.cpp
index 6516567ef..c3d2025b7 100644
--- a/src/VBox/Main/src-client/ConsoleImpl.cpp
+++ b/src/VBox/Main/src-client/ConsoleImpl.cpp
@@ -7911,10 +7911,8 @@ DECLCALLBACK(int) Console::powerUpThread(RTTHREAD Thread, void *pvUser)
ErrorInfoKeeper eik;
setVMRuntimeErrorCallbackF(pVM, pConsole, 0, "BrokenSharedFolder",
N_("The shared folder '%s' could not be set up: %ls.\n"
- "The shared folder setup will not be complete. It is recommended to power down the virtual machine and "
- "fix the shared folder settings while the machine is not running."),
+ "The shared folder setup will not be complete. It is recommended to power down the virtual machine and fix the shared folder settings while the machine is not running"),
it->first.c_str(), eik.getText().raw());
- break;
}
}
if (FAILED(rc))
diff --git a/src/VBox/Main/src-client/ConsoleImpl2.cpp b/src/VBox/Main/src-client/ConsoleImpl2.cpp
index 06f8763bf..b81c39423 100644
--- a/src/VBox/Main/src-client/ConsoleImpl2.cpp
+++ b/src/VBox/Main/src-client/ConsoleImpl2.cpp
@@ -9,7 +9,7 @@
*/
/*
- * Copyright (C) 2006-2010 Oracle Corporation
+ * Copyright (C) 2006-2011 Oracle Corporation
*
* This file is part of VirtualBox Open Source Edition (OSE), as
* available from http://www.virtualbox.org. This file is free software;
@@ -4524,8 +4524,13 @@ int configSetGlobalPropertyFlags(VMMDev * const pVMMDev,
* from the machine XML, to ensure that properties saved in the XML
* will override them.
*/
- /* Set the VBox version string as a guest property */
+ /* Set the raw VBox version string as a guest property. Used for host/guest
+ * version comparison. */
configSetProperty(pConsole->m_pVMMDev, "/VirtualBox/HostInfo/VBoxVer",
+ VBOX_VERSION_STRING_RAW, "TRANSIENT, RDONLYGUEST");
+ /* Set the full VBox version string as a guest property. Can contain vendor-specific
+ * information/branding and/or pre-release tags. */
+ configSetProperty(pConsole->m_pVMMDev, "/VirtualBox/HostInfo/VBoxVerExt",
VBOX_VERSION_STRING, "TRANSIENT, RDONLYGUEST");
/* Set the VBox SVN revision as a guest property */
configSetProperty(pConsole->m_pVMMDev, "/VirtualBox/HostInfo/VBoxRev",
diff --git a/src/VBox/Main/src-client/DisplayImpl.cpp b/src/VBox/Main/src-client/DisplayImpl.cpp
index 23108a84e..117dd6b53 100644
--- a/src/VBox/Main/src-client/DisplayImpl.cpp
+++ b/src/VBox/Main/src-client/DisplayImpl.cpp
@@ -2548,16 +2548,20 @@ STDMETHODIMP Display::TakeScreenShotPNGToArray (ULONG aScreenId, ULONG width, UL
int Display::drawToScreenEMT(Display *pDisplay, ULONG aScreenId, BYTE *address, ULONG x, ULONG y, ULONG width, ULONG height)
{
- int rc;
+ int rc = VINF_SUCCESS;
pDisplay->vbvaLock();
+
+ DISPLAYFBINFO *pFBInfo = &pDisplay->maFramebuffers[aScreenId];
+
if (aScreenId == VBOX_VIDEO_PRIMARY_SCREEN)
{
- rc = pDisplay->mpDrv->pUpPort->pfnDisplayBlt(pDisplay->mpDrv->pUpPort, address, x, y, width, height);
+ if (pFBInfo->u32ResizeStatus == ResizeStatus_Void)
+ {
+ rc = pDisplay->mpDrv->pUpPort->pfnDisplayBlt(pDisplay->mpDrv->pUpPort, address, x, y, width, height);
+ }
}
else if (aScreenId < pDisplay->mcMonitors)
{
- DISPLAYFBINFO *pFBInfo = &pDisplay->maFramebuffers[aScreenId];
-
/* Copy the bitmap to the guest VRAM. */
const uint8_t *pu8Src = address;
int32_t xSrc = 0;
diff --git a/src/VBox/Main/src-server/ApplianceImplImport.cpp b/src/VBox/Main/src-server/ApplianceImplImport.cpp
index 4533acc1f..58990066a 100644
--- a/src/VBox/Main/src-server/ApplianceImplImport.cpp
+++ b/src/VBox/Main/src-server/ApplianceImplImport.cpp
@@ -2582,17 +2582,18 @@ void Appliance::importVBoxMachine(ComObjPtr<VirtualSystemDescription> &vsdescThi
++it3)
{
settings::AttachedDevicesList &llAttachments = it3->llAttachedDevices;
- settings::AttachedDevicesList::iterator it4;
- for (it4 = llAttachments.begin();
- it4 != llAttachments.end();
- ++it4)
+ settings::AttachedDevicesList::iterator it4 = llAttachments.begin();
+ while (it4 != llAttachments.end())
{
if ( ( !fDVD
&& it4->deviceType == DeviceType_DVD)
||
( !fFloppy
&& it4->deviceType == DeviceType_Floppy))
- llAttachments.erase(it4++);
+ {
+ it4 = llAttachments.erase(it4);
+ continue;
+ }
else if (it4->deviceType == DeviceType_HardDisk)
{
const Guid &thisUuid = it4->uuid;
@@ -2612,6 +2613,7 @@ void Appliance::importVBoxMachine(ComObjPtr<VirtualSystemDescription> &vsdescThi
fRepairDuplicate = true;
}
}
+ ++it4;
}
}
/* paranoia... */
diff --git a/src/VBox/Main/src-server/HostImpl.cpp b/src/VBox/Main/src-server/HostImpl.cpp
index f0793b095..6bba2ac66 100644
--- a/src/VBox/Main/src-server/HostImpl.cpp
+++ b/src/VBox/Main/src-server/HostImpl.cpp
@@ -1647,9 +1647,8 @@ HRESULT Host::getDrives(DeviceType_T mediumType,
// list was built, and this was a subsequent call: then compare the old and the new lists
// remove drives from the cached list which are no longer present
- for (MediaList::iterator itCached = pllCached->begin();
- itCached != pllCached->end();
- ++itCached)
+ MediaList::iterator itCached = pllCached->begin();
+ while (itCached != pllCached->end())
{
Medium *pCached = *itCached;
const Utf8Str strLocationCached = pCached->getLocationFull();
@@ -1668,6 +1667,8 @@ HRESULT Host::getDrives(DeviceType_T mediumType,
}
if (!fFound)
itCached = pllCached->erase(itCached);
+ else
+ ++itCached;
}
// add drives to the cached list that are not on there yet
@@ -2724,26 +2725,25 @@ HRESULT Host::checkUSBProxyService()
/* disable the USB controller completely to avoid assertions if the
* USB proxy service could not start. */
- if (m->pUSBProxyService->getLastError() == VERR_FILE_NOT_FOUND)
- return setWarning(E_FAIL,
- tr("Could not load the Host USB Proxy Service (%Rrc). The service might not be installed on the host computer"),
- m->pUSBProxyService->getLastError());
- if (m->pUSBProxyService->getLastError() == VINF_SUCCESS)
-#ifdef RT_OS_LINUX
- return setWarning (VBOX_E_HOST_ERROR,
-# ifdef VBOX_WITH_DBUS
- tr ("The USB Proxy Service could not be started, because neither the USB file system (usbfs) nor the hardware information service (hal) is available")
-# else
- tr ("The USB Proxy Service could not be started, because the USB file system (usbfs) is not available")
-# endif
- );
-#else /* !RT_OS_LINUX */
- return setWarning (E_FAIL,
- tr ("The USB Proxy Service has not yet been ported to this host"));
-#endif /* !RT_OS_LINUX */
- return setWarning (E_FAIL,
- tr ("Could not load the Host USB Proxy service (%Rrc)"),
- m->pUSBProxyService->getLastError());
+ switch (m->pUSBProxyService->getLastError())
+ {
+ case VERR_FILE_NOT_FOUND: /** @todo what does this mean? */
+ return setWarning(E_FAIL,
+ tr("Could not load the Host USB Proxy Service (VERR_FILE_NOT_FOUND). The service might not be installed on the host computer"));
+ case VERR_VUSB_USB_DEVICE_PERMISSION:
+ return setWarning(E_FAIL,
+ tr("VirtualBox is not currently allowed to access USB devices. You can change this by adding your user to the 'vboxusers' group. Please see the user manual for a more detailed explanation"));
+ case VERR_VUSB_USBFS_PERMISSION:
+ return setWarning(E_FAIL,
+ tr("VirtualBox is not currently allowed to access USB devices. You can change this by allowing your user to access the 'usbfs' folder and files. Please see the user manual for a more detailed explanation"));
+ case VINF_SUCCESS:
+ return setWarning(E_FAIL,
+ tr("The USB Proxy Service has not yet been ported to this host"));
+ default:
+ return setWarning (E_FAIL, "%s: %Rrc",
+ tr ("Could not load the Host USB Proxy service"),
+ m->pUSBProxyService->getLastError());
+ }
}
return S_OK;
diff --git a/src/VBox/Main/src-server/MachineImpl.cpp b/src/VBox/Main/src-server/MachineImpl.cpp
index ed86b9c2e..bb88c937b 100644
--- a/src/VBox/Main/src-server/MachineImpl.cpp
+++ b/src/VBox/Main/src-server/MachineImpl.cpp
@@ -8944,7 +8944,8 @@ HRESULT Machine::createImplicitDiffs(IProgress *aProgress,
// (this cannot fail here because we can't create implicit diffs for
// unregistered images)
Guid uuidRegistryParent;
- Assert(pMedium->getFirstRegistryMachineId(uuidRegistryParent));
+ bool fInRegistry = pMedium->getFirstRegistryMachineId(uuidRegistryParent);
+ Assert(fInRegistry); NOREF(fInRegistry);
rc = diff->init(mParent,
pMedium->getPreferredDiffFormat(),
strFullSnapshotFolder.append(RTPATH_SLASH_STR),
diff --git a/src/VBox/Main/src-server/USBProxyService.cpp b/src/VBox/Main/src-server/USBProxyService.cpp
index cfb9a61f8..d6cbefe62 100644
--- a/src/VBox/Main/src-server/USBProxyService.cpp
+++ b/src/VBox/Main/src-server/USBProxyService.cpp
@@ -24,6 +24,7 @@
#include "AutoCaller.h"
#include "Logging.h"
+#include <VBox/com/array.h>
#include <VBox/err.h>
#include <iprt/asm.h>
#include <iprt/semaphore.h>
diff --git a/src/VBox/Main/src-server/linux/USBGetDevices.cpp b/src/VBox/Main/src-server/linux/USBGetDevices.cpp
index b2e2b70b3..02e684aa0 100644
--- a/src/VBox/Main/src-server/linux/USBGetDevices.cpp
+++ b/src/VBox/Main/src-server/linux/USBGetDevices.cpp
@@ -94,15 +94,6 @@ static const USBSUFF s_aIntervalSuff[] =
{ "", 0, 0, 0 } /* term */
};
-/**
- * List of well-known USB device tree locations.
- */
-static const USBDEVTREELOCATION s_aTreeLocations[] =
-{
- { "/dev/vboxusb", true },
- { "/proc/bus/usb", false },
-};
-
/**
* "reads" the number suffix. It's more like validating it and
@@ -1398,9 +1389,36 @@ static PUSBDEVICE getDevicesFromSysfs(const char *pcszDevicesRoot, bool testfs)
#endif /* !VBOX_USB_WITH_SYSFS */
}
+#ifdef UNIT_TEST
+/* Set up mock functions for USBProxyLinuxCheckDeviceRoot - here dlsym and close
+ * for the inotify presence check. */
+static int testInotifyInitGood(void) { return 0; }
+static int testInotifyInitBad(void) { return -1; }
+static bool s_fHaveInotifyLibC = true;
+static bool s_fHaveInotifyKernel = true;
+
+static void *testDLSym(void *handle, const char *symbol)
+{
+ Assert(handle == RTLD_DEFAULT);
+ Assert(!RTStrCmp(symbol, "inotify_init"));
+ if (!s_fHaveInotifyLibC)
+ return NULL;
+ if (s_fHaveInotifyKernel)
+ return (void *)testInotifyInitGood;
+ return (void *)testInotifyInitBad;
+}
+
+void TestUSBSetInotifyAvailable(bool fHaveInotifyLibC, bool fHaveInotifyKernel)
+{
+ s_fHaveInotifyLibC = fHaveInotifyLibC;
+ s_fHaveInotifyKernel = fHaveInotifyKernel;
+}
+# define dlsym testDLSym
+# define close(a) do {} while(0)
+#endif
+
/** Is inotify available and working on this system? This is a requirement
* for using USB with sysfs */
-/** @todo test the "inotify in glibc but not in the kernel" case. */
static bool inotifyAvailable(void)
{
int (*inotify_init)(void);
@@ -1415,40 +1433,96 @@ static bool inotifyAvailable(void)
return true;
}
-PCUSBDEVTREELOCATION USBProxyLinuxGetDeviceRoot(bool fPreferSysfs)
+#ifdef UNIT_TEST
+# undef dlsym
+# undef close
+#endif
+
+#ifdef UNIT_TEST
+/** Unit test list of usbfs addresses of connected devices. */
+static const char **s_pacszUsbfsDeviceAddresses = NULL;
+
+static PUSBDEVICE testGetUsbfsDevices(const char *pcszUsbfsRoot, bool testfs)
+{
+ const char **pcsz;
+ PUSBDEVICE pList = NULL, pTail = NULL;
+ for (pcsz = s_pacszUsbfsDeviceAddresses; pcsz && *pcsz; ++pcsz)
+ {
+ PUSBDEVICE pNext = (PUSBDEVICE)RTMemAllocZ(sizeof(USBDEVICE));
+ if (pNext)
+ pNext->pszAddress = RTStrDup(*pcsz);
+ if (!pNext || !pNext->pszAddress)
+ {
+ deviceListFree(&pList);
+ return NULL;
+ }
+ if (pTail)
+ pTail->pNext = pNext;
+ else
+ pList = pNext;
+ pTail = pNext;
+ }
+ return pList;
+}
+# define getDevicesFromUsbfs testGetUsbfsDevices
+
+void TestUSBSetAvailableUsbfsDevices(const char **pacszDeviceAddresses)
+{
+ s_pacszUsbfsDeviceAddresses = pacszDeviceAddresses;
+}
+
+/** Unit test list of files reported as accessible by access(3). We only do
+ * accessible or not accessible. */
+static const char **s_pacszAccessibleFiles = NULL;
+
+static int testAccess(const char *pcszPath, int mode)
+{
+ const char **pcsz;
+ for (pcsz = s_pacszAccessibleFiles; pcsz && *pcsz; ++pcsz)
+ if (!RTStrCmp(pcszPath, *pcsz))
+ return 0;
+ return -1;
+}
+# define access testAccess
+
+void TestUSBSetAccessibleFiles(const char **pacszAccessibleFiles)
+{
+ s_pacszAccessibleFiles = pacszAccessibleFiles;
+}
+#endif
+
+bool USBProxyLinuxCheckDeviceRoot(const char *pcszRoot, bool fIsDeviceNodes)
{
- PCUSBDEVTREELOCATION pcBestUsbfs = NULL;
- PCUSBDEVTREELOCATION pcBestSysfs = NULL;
+ bool fOK = false;
+ if (!fIsDeviceNodes) /* usbfs */
+ {
+ PUSBDEVICE pDevices;
- bool fHaveInotify = inotifyAvailable();
- for (unsigned i = 0; i < RT_ELEMENTS(s_aTreeLocations); ++i)
- if (!s_aTreeLocations[i].fUseSysfs)
+ if (!access(pcszRoot, R_OK | X_OK))
{
- if (!pcBestUsbfs)
+ fOK = true;
+ pDevices = getDevicesFromUsbfs(pcszRoot, true);
+ if (pDevices)
{
- PUSBDEVICE pDevices;
+ PUSBDEVICE pDevice;
- pDevices = getDevicesFromUsbfs(s_aTreeLocations[i].szDevicesRoot,
- true);
- if (pDevices)
- {
- pcBestUsbfs = &s_aTreeLocations[i];
- deviceListFree(&pDevices);
- }
+ for (pDevice = pDevices; pDevice && fOK; pDevice = pDevice->pNext)
+ if (access(pDevice->pszAddress, R_OK | W_OK))
+ fOK = false;
+ deviceListFree(&pDevices);
}
}
- else
- {
- if ( fHaveInotify
- && !pcBestSysfs
- && RTPathExists(s_aTreeLocations[i].szDevicesRoot))
- pcBestSysfs = &s_aTreeLocations[i];
- }
- if (pcBestUsbfs && !fPreferSysfs)
- return pcBestUsbfs;
- return pcBestSysfs;
+ }
+ else /* device nodes */
+ if (inotifyAvailable() && !access(pcszRoot, R_OK | X_OK))
+ fOK = true;
+ return fOK;
}
+#ifdef UNIT_TEST
+# undef getDevicesFromUsbfs
+# undef access
+#endif
PUSBDEVICE USBProxyLinuxGetDevices(const char *pcszDevicesRoot,
bool fUseSysfs)
diff --git a/src/VBox/Main/src-server/linux/USBProxyServiceLinux.cpp b/src/VBox/Main/src-server/linux/USBProxyServiceLinux.cpp
index eab255187..2a0efc06e 100644
--- a/src/VBox/Main/src-server/linux/USBProxyServiceLinux.cpp
+++ b/src/VBox/Main/src-server/linux/USBProxyServiceLinux.cpp
@@ -31,6 +31,7 @@
#include <iprt/alloc.h>
#include <iprt/assert.h>
#include <iprt/ctype.h>
+#include <iprt/dir.h>
#include <iprt/env.h>
#include <iprt/file.h>
#include <iprt/err.h>
@@ -61,10 +62,38 @@ USBProxyServiceLinux::USBProxyServiceLinux(Host *aHost)
: USBProxyService(aHost), mFile(NIL_RTFILE), mWakeupPipeR(NIL_RTFILE),
mWakeupPipeW(NIL_RTFILE), mUsingUsbfsDevices(true /* see init */),
mUdevPolls(0), mpWaiter(NULL)
+#ifdef UNIT_TEST
+ , mpcszTestUsbfsRoot(NULL), mfTestUsbfsAccessible(false),
+ mpcszTestDevicesRoot(NULL), mfTestDevicesAccessible(false),
+ mrcTestMethodInitResult(VINF_SUCCESS), mpcszTestEnvUsb(NULL),
+ mpcszTestEnvUsbRoot(NULL)
+#endif
{
LogFlowThisFunc(("aHost=%p\n", aHost));
}
+#ifdef UNIT_TEST
+/* For testing we redefine anything that accesses the outside world to
+ * return test values. */
+# define RTEnvGet(a) \
+ ( !RTStrCmp(a, "VBOX_USB") ? mpcszTestEnvUsb \
+ : !RTStrCmp(a, "VBOX_USB_ROOT") ? mpcszTestEnvUsbRoot \
+ : NULL)
+# define USBProxyLinuxCheckDeviceRoot(pcszPath, fUseNodes) \
+ ( ((fUseNodes) && mfTestDevicesAccessible \
+ && !RTStrCmp(pcszPath, mpcszTestDevicesRoot)) \
+ || (!(fUseNodes) && mfTestUsbfsAccessible \
+ && !RTStrCmp(pcszPath, mpcszTestUsbfsRoot)))
+# define RTDirExists(pcszDir) \
+ ( (pcszDir) \
+ && ( !RTStrCmp(pcszDir, mpcszTestDevicesRoot) \
+ || !RTStrCmp(pcszDir, mpcszTestUsbfsRoot)))
+# define RTFileExists(pcszFile) \
+ ( (pcszFile) \
+ && mpcszTestUsbfsRoot \
+ && !RTStrNCmp(pcszFile, mpcszTestUsbfsRoot, strlen(mpcszTestUsbfsRoot)) \
+ && !RTStrCmp(pcszFile + strlen(mpcszTestUsbfsRoot), "/devices"))
+#endif
/**
* Initializes the object (called right after construction).
@@ -81,17 +110,14 @@ HRESULT USBProxyServiceLinux::init(void)
/*
* We have two methods available for getting host USB device data - using
- * USBFS and using sysfs/hal. The default choice depends on build-time
- * settings and an environment variable; if the default is not available
- * we fall back to the second.
- * In the event of both failing, the error from the second method tried
- * will be presented to the user.
+ * USBFS and using sysfs. The default choice is sysfs; if that is not
+ * available we fall back to USBFS.
+ * In the event of both failing, an appropriate error will be returned.
+ * The user may also specify a method and root using the VBOX_USB and
+ * VBOX_USB_ROOT environment variables. In this case we don't check
+ * the root they provide for validity.
*/
-#ifdef VBOX_WITH_SYSFS_BY_DEFAULT
- bool fUseSysfs = true;
-#else
- bool fUseSysfs = false;
-#endif
+ bool fUsbfsChosen = false, fSysfsChosen = false;
const char *pcszUsbFromEnv = RTEnvGet("VBOX_USB");
const char *pcszUsbRoot = NULL;
if (pcszUsbFromEnv)
@@ -102,37 +128,49 @@ HRESULT USBProxyServiceLinux::init(void)
if (!RTStrICmp(pcszUsbFromEnv, "USBFS"))
{
LogRel(("Default USB access method set to \"usbfs\" from environment\n"));
- fUseSysfs = false;
+ fUsbfsChosen = true;
}
else if (!RTStrICmp(pcszUsbFromEnv, "SYSFS"))
{
LogRel(("Default USB method set to \"sysfs\" from environment\n"));
- fUseSysfs = true;
+ fSysfsChosen = true;
}
else
{
LogRel(("Invalid VBOX_USB environment variable setting \"%s\"\n",
pcszUsbFromEnv));
fValidVBoxUSB = false;
+ pcszUsbFromEnv = NULL;
}
if (!fValidVBoxUSB && pcszUsbRoot)
pcszUsbRoot = NULL;
}
if (!pcszUsbRoot)
{
- PCUSBDEVTREELOCATION pcLocation;
- pcLocation = USBProxyLinuxGetDeviceRoot(fUseSysfs);
- if (pcLocation)
+ if ( !fUsbfsChosen
+ && USBProxyLinuxCheckDeviceRoot("/dev/vboxusb", true))
{
- pcszUsbRoot = pcLocation->szDevicesRoot;
- fUseSysfs = pcLocation->fUseSysfs;
+ fSysfsChosen = true;
+ pcszUsbRoot = "/dev/vboxusb";
+ }
+ else if ( !fSysfsChosen
+ && USBProxyLinuxCheckDeviceRoot("/proc/bus/usb", false))
+ {
+ fUsbfsChosen = true;
+ pcszUsbRoot = "/proc/bus/usb";
}
}
+ else if (!USBProxyLinuxCheckDeviceRoot(pcszUsbRoot, fSysfsChosen))
+ pcszUsbRoot = NULL;
if (pcszUsbRoot)
{
- mUsingUsbfsDevices = !fUseSysfs;
+ mUsingUsbfsDevices = fUsbfsChosen;
mDevicesRoot = pcszUsbRoot;
+#ifndef UNIT_TEST /* Hack for now */
int rc = mUsingUsbfsDevices ? initUsbfs() : initSysfs();
+#else
+ int rc = mrcTestMethodInitResult;
+#endif
/* For the day when we have VBoxSVC release logging... */
LogRel((RT_SUCCESS(rc) ? "Successfully initialised host USB using %s\n"
: "Failed to initialise host USB using %s\n",
@@ -140,10 +178,19 @@ HRESULT USBProxyServiceLinux::init(void)
mLastError = rc;
}
else
- mLastError = VERR_NOT_FOUND;
+ mLastError = pcszUsbFromEnv ? VERR_NOT_FOUND
+ : RTDirExists("/dev/vboxusb") ? VERR_VUSB_USB_DEVICE_PERMISSION
+ : RTFileExists("/proc/bus/usb/devices") ? VERR_VUSB_USBFS_PERMISSION
+ : VERR_NOT_FOUND;
return S_OK;
}
+#ifdef UNIT_TEST
+# undef RTEnvGet
+# undef USBProxyLinuxCheckDeviceRoot
+# undef RTDirExists
+# undef RTFileExists
+#endif
/**
* Initialization routine for the usbfs based operation.
diff --git a/src/VBox/Main/src-server/solaris/NetIf-solaris.cpp b/src/VBox/Main/src-server/solaris/NetIf-solaris.cpp
index 29dbaed34..b9bb415ba 100644
--- a/src/VBox/Main/src-server/solaris/NetIf-solaris.cpp
+++ b/src/VBox/Main/src-server/solaris/NetIf-solaris.cpp
@@ -90,6 +90,7 @@ static void vboxSolarisAddHostIface(char *pszIface, int Instance, void *pvHostNe
SolarisNICMap.insert(NICPair("skge", "SksKonnect Gigabit Ethernet"));
SolarisNICMap.insert(NICPair("spwr", "SMC EtherPower II 10/100 (9432) Ethernet"));
SolarisNICMap.insert(NICPair("vboxnet", "VirtualBox Host Ethernet"));
+ SolarisNICMap.insert(NICPair("vboxvnic_template", "VirtualBox Virtual Network Interface Template"));
SolarisNICMap.insert(NICPair("vlan", "Virtual LAN Ethernet"));
SolarisNICMap.insert(NICPair("vnic", "Virtual Network Interface Ethernet"));
SolarisNICMap.insert(NICPair("xge", "Neterior Xframe 10Gigabit Ethernet"));
@@ -211,6 +212,14 @@ static boolean_t vboxSolarisAddLinkHostIface(const char *pszIface, void *pvHostN
return _B_FALSE;
/*
+ * Skip our own dynamic VNICs but don't skip VNIC templates.
+ * These names originate from VBoxNetFltBow-solaris.c, hardcoded here for now.
+ */
+ if ( strncmp(pszIface, "vboxvnic_template", 17)
+ && !strncmp(pszIface, "vboxvnic", 8))
+ return _B_FALSE;
+
+ /*
* Clip off the zone instance number from the interface name (if any).
*/
char szIfaceName[128];
diff --git a/src/VBox/Main/src-server/xpcom/server_module.cpp b/src/VBox/Main/src-server/xpcom/server_module.cpp
index f2cf4c5b8..a7cb1835f 100644
--- a/src/VBox/Main/src-server/xpcom/server_module.cpp
+++ b/src/VBox/Main/src-server/xpcom/server_module.cpp
@@ -4,7 +4,7 @@
*/
/*
- * Copyright (C) 2006-2007 Oracle Corporation
+ * Copyright (C) 2006-2011 Oracle Corporation
*
* This file is part of VirtualBox Open Source Edition (OSE), as
* available from http://www.virtualbox.org. This file is free software;
@@ -139,7 +139,12 @@ static nsresult vboxsvcSpawnDaemon(void)
memset(msg, '\0', sizeof(msg));
if ( PR_Read(readable, msg, sizeof(msg)-1) != 5
|| strcmp(msg, "READY"))
+ {
+ /* If several clients start VBoxSVC simultaneously only one can
+ * succeed. So treat this as success as well. */
+ rv = NS_OK;
goto end;
+ }
rv = NS_OK;
diff --git a/src/VBox/Main/testcase/Makefile.kmk b/src/VBox/Main/testcase/Makefile.kmk
index 69fd10337..aca0c05a4 100644
--- a/src/VBox/Main/testcase/Makefile.kmk
+++ b/src/VBox/Main/testcase/Makefile.kmk
@@ -171,7 +171,8 @@ tstHostHardwareLinux_LIBS += \
tstUSBProxyLinux_TEMPLATE = VBOXR3TSTNPEXE
tstUSBProxyLinux_SOURCES = \
tstUSBProxyLinux.cpp \
- ../src-server/linux/USBProxyServiceLinux.cpp
+ ../src-server/linux/USBProxyServiceLinux.cpp \
+ ../src-server/linux/USBGetDevices.cpp
tstUSBProxyLinux_INCS = \
. \
../include \
@@ -179,12 +180,14 @@ tstUSBProxyLinux_INCS = \
$(VBOX_PATH_SDK)/bindings/xpcom/include/nsprpub \
$(VBOX_PATH_SDK)/bindings/xpcom/include/xpcom
tstUSBProxyLinux_DEFS = \
- TESTCASE \
+ UNIT_TEST \
+ VBOX_WITH_USB \
VBOX_USB_WITH_SYSFS \
- VBOX_WITH_SYSFS_BY_DEFAULT \
VBOX_WITH_XPCOM
tstUSBProxyLinux_DEPS = \
$(VBOX_PATH_SDK)/bindings/xpcom/include/VirtualBox_XPCOM.h
+tstUSBProxyLinux_LIBS += \
+ $(PATH_OUT)/lib/USBLib.a
# generate rules.
diff --git a/src/VBox/Main/testcase/tstHostHardwareLinux.cpp b/src/VBox/Main/testcase/tstHostHardwareLinux.cpp
index a030dfd1f..33069242c 100644
--- a/src/VBox/Main/testcase/tstHostHardwareLinux.cpp
+++ b/src/VBox/Main/testcase/tstHostHardwareLinux.cpp
@@ -119,24 +119,28 @@ int main()
RTPrintf (", description: %s", it->mDescription.c_str());
RTPrintf ("\n");
}
- PCUSBDEVTREELOCATION pcLocation = USBProxyLinuxGetDeviceRoot(false);
- if (pcLocation && !pcLocation->fUseSysfs)
+ RTPrintf("NOTE: checking for usbfs at /dev/bus/usb, not /proc/bus/usb!!!\n");
+ if (USBProxyLinuxCheckDeviceRoot("/dev/bus/usb", false))
{
- PUSBDEVICE pDevice = USBProxyLinuxGetDevices(pcLocation->szDevicesRoot,
+ PUSBDEVICE pDevice = USBProxyLinuxGetDevices("/dev/bus/usb",
false);
- printDevices(pDevice, pcLocation->szDevicesRoot, "usbfs");
+ printDevices(pDevice, "/dev/bus/usb", "usbfs");
freeDevices(pDevice);
}
+ else
+ RTPrintf("-> not found\n");
#ifdef VBOX_USB_WITH_SYSFS
- pcLocation = USBProxyLinuxGetDeviceRoot(true);
- if (pcLocation && pcLocation->fUseSysfs)
+ RTPrintf("Testing for USB devices at /dev/vboxusb\n");
+ if (USBProxyLinuxCheckDeviceRoot("/dev/vboxusb", true))
{
- PUSBDEVICE pDevice = USBProxyLinuxGetDevices(pcLocation->szDevicesRoot,
+ PUSBDEVICE pDevice = USBProxyLinuxGetDevices("/dev/vboxusb",
true);
- printDevices(pDevice, pcLocation->szDevicesRoot, "sysfs");
+ printDevices(pDevice, "/dev/vboxusb", "sysfs");
freeDevices(pDevice);
}
- VBoxMainHotplugWaiter waiter(pcLocation->szDevicesRoot);
+ else
+ RTPrintf("-> not found\n");
+ VBoxMainHotplugWaiter waiter("/dev/vboxusb");
RTPrintf ("Waiting for a hotplug event for five seconds...\n");
doHotplugEvent(&waiter, 5000);
RTPrintf ("Waiting for a hotplug event, Ctrl-C to abort...\n");
diff --git a/src/VBox/Main/testcase/tstUSBProxyLinux.cpp b/src/VBox/Main/testcase/tstUSBProxyLinux.cpp
index d674eb836..4f7802ad0 100644
--- a/src/VBox/Main/testcase/tstUSBProxyLinux.cpp
+++ b/src/VBox/Main/testcase/tstUSBProxyLinux.cpp
@@ -22,9 +22,10 @@
#include "USBProxyService.h"
#include "USBGetDevices.h"
+#include <VBox/err.h>
#include <iprt/assert.h>
-#include <iprt/err.h>
#include <iprt/env.h>
+#include <iprt/string.h>
#include <iprt/test.h>
/*** BEGIN STUBS ***/
@@ -61,27 +62,9 @@ com::Utf8Str HostUSBDevice::getName()
return Utf8Str();
}
-static USBDEVTREELOCATION s_deviceRoot = { "", false };
-static bool s_fGetDeviceRootPreferSysfs = false;
-
-PCUSBDEVTREELOCATION USBProxyLinuxGetDeviceRoot(bool fPreferSysfs)
-{
- s_fGetDeviceRootPreferSysfs = fPreferSysfs;
- return &s_deviceRoot;
-}
-
-static struct
-{
- const char *pcszDevicesRoot;
- bool fUseSysfs;
-} s_getDevices;
-
-PUSBDEVICE USBProxyLinuxGetDevices(const char *pcszDevicesRoot,
- bool fUseSysfs)
+int USBProxyService::getLastError(void)
{
- s_getDevices.pcszDevicesRoot = pcszDevicesRoot;
- s_getDevices.fUseSysfs = fUseSysfs;
- return NULL;
+ return mLastError;
}
void SysFreeString(BSTR bstr)
@@ -89,82 +72,146 @@ void SysFreeString(BSTR bstr)
Assert(0);
}
-/*** END STUBS ***/
+static struct
+{
+ const char *pcszEnvUsb;
+ const char *pcszEnvUsbRoot;
+ const char *pcszDevicesRoot;
+ bool fDevicesAccessible;
+ const char *pcszUsbfsRoot;
+ bool fUsbfsAccessible;
+ int rcMethodInit;
+ const char *pcszDevicesRootExpected;
+ bool fUsingUsbfsExpected;
+ int rcExpected;
+} s_testEnvironment[] =
+{
+ /* "sysfs" and valid root in the environment */
+ { "sysfs", "/dev/bus/usb", "/dev/bus/usb", true, NULL, false, VINF_SUCCESS, "/dev/bus/usb", false, VINF_SUCCESS },
+ /* "sysfs" and valid root in the environment, method-specific init failed */
+ { "sysfs", "/dev/bus/usb", "/dev/bus/usb", true, NULL, false, VERR_NO_MEMORY, "/dev/bus/usb", false, VERR_NO_MEMORY },
+ /* "sysfs" and bad root in the environment */
+ { "sysfs", "/dev/bus/usb", "/dev/vboxusb", false, "/proc/usb/bus", false, VINF_SUCCESS, "", true, VERR_NOT_FOUND },
+ /* "sysfs" and no root in the environment */
+ { "sysfs", NULL, "/dev/vboxusb", true, NULL, false, VINF_SUCCESS, "/dev/vboxusb", false, VINF_SUCCESS },
+ /* "usbfs" and valid root in the environment */
+ { "usbfs", "/dev/bus/usb", NULL, false, "/dev/bus/usb", true, VINF_SUCCESS, "/dev/bus/usb", true, VINF_SUCCESS },
+ /* "usbfs" and valid root in the environment, method-specific init failed */
+ { "usbfs", "/dev/bus/usb", NULL, false, "/dev/bus/usb", true, VERR_NO_MEMORY, "/dev/bus/usb", true, VERR_NO_MEMORY },
+ /* "usbfs" and bad root in the environment */
+ { "usbfs", "/dev/bus/usb", "/dev/vboxusb", false, "/proc/usb/bus", false, VINF_SUCCESS, "", true, VERR_NOT_FOUND },
+ /* "usbfs" and no root in the environment */
+ { "usbfs", NULL, NULL, false, "/proc/bus/usb", true, VINF_SUCCESS, "/proc/bus/usb", true, VINF_SUCCESS },
+ /* invalid method in the environment, sysfs available */
+ { "invalid", "/dev/bus/usb", "/dev/vboxusb", true, NULL, false, VINF_SUCCESS, "/dev/vboxusb", false, VINF_SUCCESS },
+ /* invalid method in the environment, usbfs available */
+ { "invalid", "/dev/bus/usb", NULL, true, "/proc/bus/usb", true, VINF_SUCCESS, "/proc/bus/usb", true, VINF_SUCCESS },
+ /* invalid method in the environment, sysfs inaccessible */
+ { "invalid", "/dev/bus/usb", "/dev/vboxusb", false, NULL, false, VINF_SUCCESS, "", true, VERR_VUSB_USB_DEVICE_PERMISSION },
+ /* invalid method in the environment, usbfs inaccessible */
+ { "invalid", "/dev/bus/usb", NULL, false, "/proc/bus/usb", false, VINF_SUCCESS, "", true, VERR_VUSB_USBFS_PERMISSION },
+ /* No environment, sysfs and usbfs available but without access permissions. */
+ { NULL, NULL, "/dev/vboxusb", false, "/proc/bus/usb", false, VERR_NO_MEMORY, "", true, VERR_VUSB_USB_DEVICE_PERMISSION },
+ /* No environment, sysfs and usbfs available, access permissions for sysfs. */
+ { NULL, NULL, "/dev/vboxusb", true, "/proc/bus/usb", false, VINF_SUCCESS, "/dev/vboxusb", false, VINF_SUCCESS },
+ /* No environment, sysfs and usbfs available, access permissions for usbfs. */
+ { NULL, NULL, "/dev/vboxusb", false, "/proc/bus/usb", true, VINF_SUCCESS, "/proc/bus/usb", true, VINF_SUCCESS },
+ /* No environment, sysfs available but without access permissions. */
+ { NULL, NULL, "/dev/vboxusb", false, NULL, false, VERR_NO_MEMORY, "", true, VERR_VUSB_USB_DEVICE_PERMISSION },
+ /* No environment, sysfs available with access permissions, method-specific init failed. */
+ { NULL, NULL, "/dev/vboxusb", true, NULL, false, VERR_NO_MEMORY, "/dev/vboxusb", false, VERR_NO_MEMORY },
+ /* No environment, usbfs available but without access permissions. */
+ { NULL, NULL, NULL, false, "/proc/bus/usb", false, VERR_NO_MEMORY, "", true, VERR_VUSB_USBFS_PERMISSION },
+ /* No environment, usbfs available with access permissions, method-specific
+ * init failed. */
+ { NULL, NULL, NULL, false, "/proc/bus/usb", true, VERR_NO_MEMORY, "/proc/bus/usb", true, VERR_NO_MEMORY }
+};
-class tstUSBProxyLinux : public USBProxyServiceLinux
+static void testInit(RTTEST hTest)
{
-protected:
- virtual int initUsbfs(void) { return VINF_SUCCESS; }
- virtual int initSysfs(void) { return VINF_SUCCESS; }
-public:
- tstUSBProxyLinux(void) : USBProxyServiceLinux(NULL) {}
- PUSBDEVICE getDevices(void)
+ RTTestSub(hTest, "Testing USBProxyServiceLinux initialisation");
+ for (unsigned i = 0; i < RT_ELEMENTS(s_testEnvironment); ++i)
{
- return USBProxyServiceLinux::getDevices();
+ USBProxyServiceLinux test(NULL);
+ test.testSetEnv(s_testEnvironment[i].pcszEnvUsb,
+ s_testEnvironment[i].pcszEnvUsbRoot);
+ test.testSetupInit(s_testEnvironment[i].pcszUsbfsRoot,
+ s_testEnvironment[i].fUsbfsAccessible,
+ s_testEnvironment[i].pcszDevicesRoot,
+ s_testEnvironment[i].fDevicesAccessible,
+ s_testEnvironment[i].rcMethodInit);
+ HRESULT hrc = test.init();
+ RTTESTI_CHECK_MSG(hrc == S_OK,
+ ("init() returned 0x%x (test index %i)!\n", hrc, i));
+ int rc = test.getLastError();
+ RTTESTI_CHECK_MSG(rc == s_testEnvironment[i].rcExpected,
+ ("getLastError() returned %Rrc (test index %i) instead of %Rrc!\n",
+ rc, i, s_testEnvironment[i].rcExpected));
+ const char *pcszDevicesRoot = test.testGetDevicesRoot();
+ RTTESTI_CHECK_MSG(!RTStrCmp(pcszDevicesRoot,
+ s_testEnvironment[i].pcszDevicesRootExpected),
+ ("testGetDevicesRoot() returned %s (test index %i) instead of %s!\n",
+ pcszDevicesRoot, i,
+ s_testEnvironment[i].pcszDevicesRootExpected));
+ bool fUsingUsbfs = test.testGetUsingUsbfs();
+ RTTESTI_CHECK_MSG( fUsingUsbfs
+ == s_testEnvironment[i].fUsingUsbfsExpected,
+ ("testGetUsingUsbfs() returned %RTbool (test index %i) instead of %RTbool!\n",
+ fUsingUsbfs, i,
+ s_testEnvironment[i].fUsingUsbfsExpected));
}
-};
+}
static struct
{
- const char *pcszVBOX_USB;
- const char *pcszVBOX_USB_ROOT;
- const char *pcszReturnedRoot;
- bool fReturnedUseSysfs;
- bool fRequestedUseSysfs;
- const char *pcszFinalRoot;
- bool fFinalUseSysfs;
-} s_testEnvironment[] =
+ const char *pacszDeviceAddresses[16];
+ const char *pacszAccessibleFiles[16];
+ const char *pcszRoot;
+ bool fIsDeviceNodes;
+ bool fAvailableExpected;
+} s_testCheckDeviceRoot[] =
{
- { "sysfs", "/dev/bus/usb", "/proc/bus/usb", false, true, "/dev/bus/usb", true },
- { "sysfs", "/dev/bus/usb", "/dev/vboxusb", true, true, "/dev/bus/usb", true },
- { "sysfs", NULL, "/proc/bus/usb", false, true, "/proc/bus/usb", false },
- { "sysfs", NULL, "/dev/vboxusb", true, true, "/dev/vboxusb", true },
- { "usbfs", "/dev/bus/usb", "/proc/bus/usb", false, false, "/dev/bus/usb", false },
- { "usbfs", "/dev/bus/usb", "/dev/vboxusb", true, false, "/dev/bus/usb", false },
- { "usbfs", NULL, "/proc/bus/usb", false, false, "/proc/bus/usb", false },
- { "usbfs", NULL, "/dev/vboxusb", true, false, "/dev/vboxusb", true },
- { "nofs", "/dev/bus/usb", "/proc/bus/usb", false, true, "/proc/bus/usb", false },
- { "nofs", "/dev/bus/usb", "/dev/vboxusb", true, true, "/dev/vboxusb", true },
- { "nofs", NULL, "/proc/bus/usb", false, true, "/proc/bus/usb", false },
- { "nofs", NULL, "/dev/vboxusb", true, true, "/dev/vboxusb", true },
- { "", "/dev/bus/usb", "/proc/bus/usb", false, true, "/proc/bus/usb", false },
- { "", "/dev/bus/usb", "/dev/vboxusb", true, true, "/dev/vboxusb", true },
- { "", NULL, "/proc/bus/usb", false, true, "/proc/bus/usb", false },
- { "", NULL, "/dev/vboxusb", true, true, "/dev/vboxusb", true },
- { NULL, "/dev/bus/usb", "/proc/bus/usb", false, true, "/proc/bus/usb", false },
- { NULL, "/dev/bus/usb", "/dev/vboxusb", true, true, "/dev/vboxusb", true }
+ /* /dev/vboxusb accessible -> device nodes method available */
+ { { NULL }, { "/dev/vboxusb" }, "/dev/vboxusb", true, true },
+ /* /dev/vboxusb present but not accessible -> device nodes method not
+ * available */
+ { { NULL }, { NULL }, "/dev/vboxusb", true, false },
+ /* /proc/bus/usb available but empty -> usbfs method available (we can't
+ * really check in this case) */
+ { { NULL }, { "/proc/bus/usb" }, "/proc/bus/usb", false, true },
+ /* /proc/bus/usb not available or not accessible -> usbfs method not available */
+ { { NULL }, { NULL }, "/proc/bus/usb", false, false },
+ /* /proc/bus/usb available, one inaccessible device -> usbfs method not
+ * available */
+ { { "/proc/bus/usb/001/001" }, { "/proc/bus/usb" }, "/proc/bus/usb", false, false },
+ /* /proc/bus/usb available, one device of two inaccessible -> usbfs method
+ * not available */
+ { { "/proc/bus/usb/001/001", "/proc/bus/usb/002/002" },
+ { "/proc/bus/usb", "/proc/bus/usb/001/001" }, "/proc/bus/usb", false, false },
+ /* /proc/bus/usb available, two accessible devices -> usbfs method
+ * available */
+ { { "/proc/bus/usb/001/001", "/proc/bus/usb/002/002" },
+ { "/proc/bus/usb", "/proc/bus/usb/001/001", "/proc/bus/usb/002/002" },
+ "/proc/bus/usb", false, true }
};
-/** @note Fiddling with the real environment for this is not nice, in my
- * opinion at least. */
-static void testEnvironment(RTTEST hTest)
+static void testCheckDeviceRoot(RTTEST hTest)
{
- RTTestSub(hTest, "Testing environment variable handling");
- for (unsigned i = 0; i < RT_ELEMENTS(s_testEnvironment); ++i)
+ RTTestSub(hTest, "Testing the USBProxyLinuxCheckDeviceRoot API");
+ for (unsigned i = 0; i < RT_ELEMENTS(s_testCheckDeviceRoot); ++i)
{
- tstUSBProxyLinux test;
- if (s_testEnvironment[i].pcszVBOX_USB)
- RTEnvSet("VBOX_USB", s_testEnvironment[i].pcszVBOX_USB);
- else
- RTEnvUnset("VBOX_USB");
- if (s_testEnvironment[i].pcszVBOX_USB_ROOT)
- RTEnvSet("VBOX_USB_ROOT",
- s_testEnvironment[i].pcszVBOX_USB_ROOT);
- else
- RTEnvUnset("VBOX_USB_ROOT");
- strcpy(s_deviceRoot.szDevicesRoot,
- s_testEnvironment[i].pcszReturnedRoot);
- s_deviceRoot.fUseSysfs = s_testEnvironment[i].fReturnedUseSysfs;
- RTTESTI_CHECK(test.init() == S_OK);
- test.getDevices();
- RTTESTI_CHECK_MSG(!strcmp(s_getDevices.pcszDevicesRoot,
- s_testEnvironment[i].pcszFinalRoot),
- ("i=%u: %s, %s\n", i, s_getDevices.pcszDevicesRoot,
- s_testEnvironment[i].pcszFinalRoot));
- RTTESTI_CHECK_MSG( s_getDevices.fUseSysfs
- == s_testEnvironment[i].fFinalUseSysfs,
- ("i=%u, %d, %d\n", i, s_getDevices.fUseSysfs,
- s_testEnvironment[i].fFinalUseSysfs));
+ TestUSBSetAvailableUsbfsDevices(s_testCheckDeviceRoot[i]
+ .pacszDeviceAddresses);
+ TestUSBSetAccessibleFiles(s_testCheckDeviceRoot[i]
+ .pacszAccessibleFiles);
+ bool fAvailable = USBProxyLinuxCheckDeviceRoot
+ (s_testCheckDeviceRoot[i].pcszRoot,
+ s_testCheckDeviceRoot[i].fIsDeviceNodes);
+ RTTESTI_CHECK_MSG( fAvailable
+ == s_testCheckDeviceRoot[i].fAvailableExpected,
+ ("USBProxyLinuxCheckDeviceRoot() returned %RTbool (test index %i) instead of %RTbool!\n",
+ fAvailable, i,
+ s_testCheckDeviceRoot[i].fAvailableExpected));
}
}
@@ -182,11 +229,11 @@ int main(void)
/*
* Run the tests.
*/
- testEnvironment(hTest);
+ testInit(hTest);
+ testCheckDeviceRoot(hTest);
/*
* Summary
*/
return RTTestSummaryAndDestroy(hTest);
}
-
diff --git a/src/VBox/RDP/client/vrdp/rdpusb.c b/src/VBox/RDP/client/vrdp/rdpusb.c
index cf7b47c3f..1152cef76 100644
--- a/src/VBox/RDP/client/vrdp/rdpusb.c
+++ b/src/VBox/RDP/client/vrdp/rdpusb.c
@@ -884,9 +884,17 @@ rdpusb_check_fds(fd_set * rfds, fd_set * wfds)
RD_BOOL
rdpusb_init(void)
{
- PCUSBDEVTREELOCATION pcLocation = USBProxyLinuxGetDeviceRoot(false);
- g_fUseSysfs = pcLocation->fUseSysfs;
- g_pcszDevicesRoot = pcLocation->szDevicesRoot;
+ /** @todo re-use the proxy service code */
+ if (USBProxyLinuxCheckDeviceRoot("/dev/vboxusb", true))
+ {
+ g_fUseSysfs = true;
+ g_pcszDevicesRoot = "/dev/vboxusb";
+ }
+ else
+ {
+ g_fUseSysfs = false;
+ g_pcszDevicesRoot = "/proc/bus/usb";
+ }
rdpusb_channel =
channel_register("vrdpusb", CHANNEL_OPTION_INITIALIZED | CHANNEL_OPTION_ENCRYPT_RDP,
rdpusb_process);
diff --git a/src/VBox/Runtime/common/ldr/ldrPE.cpp b/src/VBox/Runtime/common/ldr/ldrPE.cpp
index ba70c2d48..82f610b55 100644
--- a/src/VBox/Runtime/common/ldr/ldrPE.cpp
+++ b/src/VBox/Runtime/common/ldr/ldrPE.cpp
@@ -312,10 +312,10 @@ static DECLCALLBACK(int) rtldrPEResolveImports32(PRTLDRMODPE pModPe, const void
else if ( pThunk->u1.Ordinal > 0
&& pThunk->u1.Ordinal < pModPe->cbImage)
{
- rc = pfnGetImport(&pModPe->Core, pszModName, PE_RVA2TYPE(pvBitsR, (char*)pThunk->u1.AddressOfData + 2, const char *),
+ rc = pfnGetImport(&pModPe->Core, pszModName, PE_RVA2TYPE(pvBitsR, (char*)(uintptr_t)pThunk->u1.AddressOfData + 2, const char *),
~0, &Value, pvUser);
Log4((RT_SUCCESS(rc) ? "RTLdrPE: %RTptr %s\n" : "RTLdrPE: %08RX32 %s rc=%Rrc\n",
- (uint32_t)Value, PE_RVA2TYPE(pvBitsR, (char*)pThunk->u1.AddressOfData + 2, const char *), rc));
+ (uint32_t)Value, PE_RVA2TYPE(pvBitsR, (char*)(uintptr_t)pThunk->u1.AddressOfData + 2, const char *), rc));
}
else
{
diff --git a/src/VBox/Runtime/r0drv/darwin/mp-r0drv-darwin.cpp b/src/VBox/Runtime/r0drv/darwin/mp-r0drv-darwin.cpp
index e3a89e093..8ba0dd710 100644
--- a/src/VBox/Runtime/r0drv/darwin/mp-r0drv-darwin.cpp
+++ b/src/VBox/Runtime/r0drv/darwin/mp-r0drv-darwin.cpp
@@ -41,12 +41,6 @@
/*******************************************************************************
-* Defined Constants And Macros *
-*******************************************************************************/
-#define MY_DARWIN_MAX_CPUS (0xf + 1) /* see MAX_CPUS */
-
-
-/*******************************************************************************
* Global Variables *
*******************************************************************************/
static int32_t volatile g_cMaxCpus = -1;
@@ -60,7 +54,7 @@ static int rtMpDarwinInitMaxCpus(void)
if (rc)
{
printf("IPRT: sysctlbyname(hw.ncpu) failed with rc=%d!\n", rc);
- cCpus = MY_DARWIN_MAX_CPUS;
+ cCpus = 64; /* whatever */
}
ASMAtomicWriteS32(&g_cMaxCpus, cCpus);
@@ -85,13 +79,13 @@ RTDECL(RTCPUID) RTMpCpuId(void)
RTDECL(int) RTMpCpuIdToSetIndex(RTCPUID idCpu)
{
- return idCpu < RTCPUSET_MAX_CPUS && idCpu < MY_DARWIN_MAX_CPUS ? (int)idCpu : -1;
+ return idCpu < RTCPUSET_MAX_CPUS ? (int)idCpu : -1;
}
RTDECL(RTCPUID) RTMpCpuIdFromSetIndex(int iCpu)
{
- return (unsigned)iCpu < MY_DARWIN_MAX_CPUS ? (RTCPUID)iCpu : NIL_RTCPUID;
+ return (unsigned)iCpu < RTCPUSET_MAX_CPUS ? (RTCPUID)iCpu : NIL_RTCPUID;
}
@@ -103,7 +97,7 @@ RTDECL(RTCPUID) RTMpGetMaxCpuId(void)
RTDECL(bool) RTMpIsCpuPossible(RTCPUID idCpu)
{
- return idCpu < MY_DARWIN_MAX_CPUS
+ return idCpu < RTCPUSET_MAX_CPUS
&& idCpu < (RTCPUID)rtMpDarwinMaxCpus();
}
diff --git a/src/VBox/Runtime/r0drv/darwin/the-darwin-kernel.h b/src/VBox/Runtime/r0drv/darwin/the-darwin-kernel.h
index 8ffb29238..9d6a9efe2 100644
--- a/src/VBox/Runtime/r0drv/darwin/the-darwin-kernel.h
+++ b/src/VBox/Runtime/r0drv/darwin/the-darwin-kernel.h
@@ -110,6 +110,30 @@ extern kern_return_t thread_terminate(thread_t);
extern void mp_rendezvous(void (*)(void *), void (*)(void *), void (*)(void *), void *);
extern void mp_rendezvous_no_intrs(void (*)(void *), void *);
+/* osfmk/i386/cpu_data.h */
+struct my_cpu_data_x86
+{
+ struct my_cpu_data_x86 *cpu_this;
+ thread_t cpu_active_thread;
+ void *cpu_int_state;
+ vm_offset_t cpu_active_stack;
+ vm_offset_t cpu_kernel_stack;
+ vm_offset_t cpu_int_stack_top;
+ int cpu_preemption_level;
+ int cpu_simple_lock_count;
+ int cpu_interrupt_level;
+ int cpu_number;
+ int cpu_phys_number;
+ cpu_id_t cpu_id;
+ int cpu_signals;
+ int cpu_mcount_off;
+ /*ast_t*/uint32_t cpu_pending_ast;
+ int cpu_type;
+ int cpu_subtype;
+ int cpu_threadtype;
+ int cpu_running;
+};
+
/* osfmk/i386/cpu_number.h */
extern int cpu_number(void);
diff --git a/src/VBox/Runtime/r0drv/darwin/threadpreempt-r0drv-darwin.cpp b/src/VBox/Runtime/r0drv/darwin/threadpreempt-r0drv-darwin.cpp
index 80fe1a611..60d125584 100644
--- a/src/VBox/Runtime/r0drv/darwin/threadpreempt-r0drv-darwin.cpp
+++ b/src/VBox/Runtime/r0drv/darwin/threadpreempt-r0drv-darwin.cpp
@@ -36,6 +36,7 @@
# include <iprt/asm-amd64-x86.h>
#endif
#include <iprt/assert.h>
+#include <iprt/cpuset.h>
#include <iprt/err.h>
#include <iprt/mp.h>
@@ -56,7 +57,7 @@ typedef RTDARWINPREEMPTHACK *PRTDARWINPREEMPTHACK;
/*******************************************************************************
* Global Variables *
*******************************************************************************/
-static RTDARWINPREEMPTHACK g_aPreemptHacks[16]; /* see MAX_CPUS in i386/mp.h */
+static RTDARWINPREEMPTHACK g_aPreemptHacks[RTCPUSET_MAX_CPUS];
/**
@@ -107,14 +108,12 @@ RTDECL(bool) RTThreadPreemptIsPending(RTTHREAD hThread)
/* HACK ALERT! This ASSUMES that the cpu_pending_ast member of cpu_data_t doesn't move. */
uint32_t ast_pending;
-#if 1
+#if defined(RT_ARCH_X86) || defined(RT_ARCH_AMD64)
__asm__ volatile("movl %%gs:%P1,%0\n\t"
: "=r" (ast_pending)
- : "i" (7*sizeof(void*) + 7*sizeof(int)));
+ : "i" (__builtin_offsetof(struct my_cpu_data_x86, cpu_pending_ast)) );
#else
- cpu_data_t *pCpu = current_cpu_datap(void);
- AssertCompileMemberOffset(cpu_data_t, cpu_pending_ast, 7*sizeof(void*) + 7*sizeof(int));
- cpu_pending_ast = pCpu->cpu_pending_ast;
+# error "Port me"
#endif
AssertMsg(!(ast_pending & UINT32_C(0xfffff000)),("%#x\n", ast_pending));
return (ast_pending & (AST_PREEMPT | AST_URGENT)) != 0;
@@ -123,7 +122,7 @@ RTDECL(bool) RTThreadPreemptIsPending(RTTHREAD hThread)
RTDECL(bool) RTThreadPreemptIsPendingTrusty(void)
{
- /* yes, we think thaat RTThreadPreemptIsPending is reliable... */
+ /* yes, we think that RTThreadPreemptIsPending is reliable... */
return true;
}
diff --git a/src/VBox/Runtime/r0drv/linux/mp-r0drv-linux.c b/src/VBox/Runtime/r0drv/linux/mp-r0drv-linux.c
index 19aaffc18..8545960ed 100644
--- a/src/VBox/Runtime/r0drv/linux/mp-r0drv-linux.c
+++ b/src/VBox/Runtime/r0drv/linux/mp-r0drv-linux.c
@@ -361,6 +361,7 @@ RTDECL(int) RTMpPokeCpu(RTCPUID idCpu)
# else /* older kernels */
# error oops
# endif /* older kernels */
+ NOREF(rc);
Assert(rc == 0);
return VINF_SUCCESS;
diff --git a/src/VBox/Runtime/r3/linux/sched-linux.cpp b/src/VBox/Runtime/r3/linux/sched-linux.cpp
index 8b9dd13e9..b1d19093c 100644
--- a/src/VBox/Runtime/r3/linux/sched-linux.cpp
+++ b/src/VBox/Runtime/r3/linux/sched-linux.cpp
@@ -450,7 +450,7 @@ static void *rtSchedNativeProberThread(void *pvUser)
&& !setpriority(PRIO_PROCESS, 0, g_iMinPriority)
&& iStart != g_iMinPriority)
{
- if (rtSchedRunThread(rtSchedNativeSubProberThread, (void *)iStart) == 0)
+ if (rtSchedRunThread(rtSchedNativeSubProberThread, (void *)(intptr_t)iStart) == 0)
g_fScrewedUpMaxPriorityLimitInheritance = false;
}
@@ -535,7 +535,7 @@ static void *rtSchedNativeValidatorThread(void *pvUser)
/* done */
rtSchedNativeRestore(&SavedPriority);
- return (void *)rc;
+ return (void *)(intptr_t)rc;
}
diff --git a/src/VBox/Runtime/r3/posix/thread-posix.cpp b/src/VBox/Runtime/r3/posix/thread-posix.cpp
index 6243ced86..c7158f4cb 100644
--- a/src/VBox/Runtime/r3/posix/thread-posix.cpp
+++ b/src/VBox/Runtime/r3/posix/thread-posix.cpp
@@ -258,8 +258,8 @@ static void *rtThreadNativeMain(void *pvArgs)
rc = rtThreadMain(pThread, (uintptr_t)Self, &pThread->szName[0]);
pthread_setspecific(g_SelfKey, NULL);
- pthread_exit((void *)rc);
- return (void *)rc;
+ pthread_exit((void *)(intptr_t)rc);
+ return (void *)(intptr_t)rc;
}
diff --git a/src/VBox/Runtime/testcase/tstRTStrVersion.cpp b/src/VBox/Runtime/testcase/tstRTStrVersion.cpp
index 42cd02bf9..6f7ee8209 100644
--- a/src/VBox/Runtime/testcase/tstRTStrVersion.cpp
+++ b/src/VBox/Runtime/testcase/tstRTStrVersion.cpp
@@ -4,7 +4,7 @@
*/
/*
- * Copyright (C) 2009 Oracle Corporation
+ * Copyright (C) 2011 Oracle Corporation
*
* This file is part of VirtualBox Open Source Edition (OSE), as
* available from http://www.virtualbox.org. This file is free software;
@@ -96,7 +96,7 @@ int main()
{ "3.1.0_BETA1-r12345", "3.1.0_BETA1-r12345", 0 },
{ "3.1.0_BETA2-r12345", "3.1.0_BETA1-r12345", 1 },
{ "3.1.0_BETA2-r12345", "3.1.0_BETA999-r12345", -1 },
- { "3.1.0_BETA2", "3.1.0_ABC", -1 }, /* ABC isn't indicating a prerelease, BETA does */
+ { "3.1.0_BETA2", "3.1.0_ABC", -1 }, /* ABC isn't indicating a prerelease, BETA does. */
{ "3.1.0_BETA", "3.1.0_ATEB", -1 },
{ "4.0.0_ALPHAr68482", "4.0.0_ALPHAr68483", -1 },
{ "4.0.0_ALPHA1r68482", "4.0.0_ALPHAr68482", 0 },
@@ -105,6 +105,8 @@ int main()
{ "4.0.0_ALPHAr68483", "4.0.0_BETA1r68783", -1 },
{ "4.0.0_ALPHAr68483", "4.0.0_BETA2r68783", -1 },
{ "4.0.0_ALPHAr68483", "4.0.0_BETA2r68784", -1 },
+ { "4.0.6", "4.0.6_Ubuntu", -1 }, /* Without stripped guest OS string (Ubuntu). */
+ { "4.0.6_Windows", "4.0.6", 1 } /* Without stripped guest OS string (Windows). */
};
for (unsigned iTest = 0; iTest < RT_ELEMENTS(aTests); iTest++)
{
diff --git a/src/VBox/Storage/VD.cpp b/src/VBox/Storage/VD.cpp
index 60d8664e3..2bf68d0c5 100644
--- a/src/VBox/Storage/VD.cpp
+++ b/src/VBox/Storage/VD.cpp
@@ -1713,7 +1713,7 @@ static int vdSetModifiedFlagAsync(PVBOXHDD pDisk, PVDIOCTX pIoCtx)
rc = vdIoCtxProcess(pIoCtxFlush);
if (rc == VINF_VD_ASYNC_IO_FINISHED)
{
- vdIoCtxUnlockDisk(pDisk, pIoCtxFlush, false /* fProcessDeferredReqs */);
+ vdIoCtxUnlockDisk(pDisk, pIoCtx, false /* fProcessDeferredReqs */);
vdIoCtxFree(pDisk, pIoCtxFlush);
}
else if (rc == VERR_VD_ASYNC_IO_IN_PROGRESS)
diff --git a/src/VBox/VMM/VMMR0/HWACCMR0.cpp b/src/VBox/VMM/VMMR0/HWACCMR0.cpp
index c48b367c7..03352180e 100644
--- a/src/VBox/VMM/VMMR0/HWACCMR0.cpp
+++ b/src/VBox/VMM/VMMR0/HWACCMR0.cpp
@@ -299,7 +299,7 @@ VMMR0DECL(int) HWACCMR0Init(void)
/* We need to check if VT-x has been properly initialized on all CPUs. Some BIOSes do a lousy job. */
HWACCMR0FIRSTRC FirstRc;
hwaccmR0FirstRcInit(&FirstRc);
- HWACCMR0Globals.lLastError = RTMpOnAll(hwaccmR0InitCpu, (void *)u32VendorEBX, &FirstRc);
+ HWACCMR0Globals.lLastError = RTMpOnAll(hwaccmR0InitCpu, (void *)(uintptr_t)u32VendorEBX, &FirstRc);
if (RT_SUCCESS(HWACCMR0Globals.lLastError))
HWACCMR0Globals.lLastError = hwaccmR0FirstRcGetStatus(&FirstRc);
}
@@ -443,7 +443,7 @@ VMMR0DECL(int) HWACCMR0Init(void)
/* We need to check if AMD-V has been properly initialized on all CPUs. Some BIOSes might do a poor job. */
HWACCMR0FIRSTRC FirstRc;
hwaccmR0FirstRcInit(&FirstRc);
- rc = RTMpOnAll(hwaccmR0InitCpu, (void *)u32VendorEBX, &FirstRc); AssertRC(rc);
+ rc = RTMpOnAll(hwaccmR0InitCpu, (void *)(uintptr_t)u32VendorEBX, &FirstRc); AssertRC(rc);
if (RT_SUCCESS(rc))
rc = hwaccmR0FirstRcGetStatus(&FirstRc);
#ifndef DEBUG_bird
diff --git a/src/VBox/VMM/VMMR3/CSAM.cpp b/src/VBox/VMM/VMMR3/CSAM.cpp
index 57057e00b..c265ce737 100644
--- a/src/VBox/VMM/VMMR3/CSAM.cpp
+++ b/src/VBox/VMM/VMMR3/CSAM.cpp
@@ -778,7 +778,7 @@ inline int CSAMR3DISInstr(PVM pVM, DISCPUSTATE *pCpu, RTRCPTR InstrGC, uint8_t *
(pCpu)->pfnReadBytes = CSAMR3ReadBytes;
(pCpu)->apvUserData[0] = pVM;
(pCpu)->apvUserData[1] = InstrHC;
- (pCpu)->apvUserData[2] = (void *)InstrGC; Assert(sizeof(InstrGC) <= sizeof(pCpu->apvUserData[0]));
+ (pCpu)->apvUserData[2] = (void *)(uintptr_t)InstrGC; Assert(sizeof(InstrGC) <= sizeof(pCpu->apvUserData[0]));
#ifdef DEBUG
return DISInstrEx(pCpu, InstrGC, 0, pOpsize, pszOutput, OPTYPE_ALL);
#else
@@ -1601,7 +1601,7 @@ static int csamFlushPage(PVM pVM, RTRCPTR addr, bool fRemovePage)
if (rc != VERR_PAGE_NOT_PRESENT && rc != VERR_PAGE_TABLE_NOT_PRESENT)
AssertMsgFailed(("PGMR3GetPage %RRv failed with %Rrc\n", addr, rc));
- pPageRec = (PCSAMPAGEREC)RTAvlPVGet(&pVM->csam.s.pPageTree, (AVLPVKEY)addr);
+ pPageRec = (PCSAMPAGEREC)RTAvlPVGet(&pVM->csam.s.pPageTree, (AVLPVKEY)(uintptr_t)addr);
if (pPageRec)
{
if ( GCPhys == pPageRec->page.GCPhys
@@ -1680,7 +1680,7 @@ VMMR3DECL(int) CSAMR3RemovePage(PVM pVM, RTRCPTR addr)
addr = addr & PAGE_BASE_GC_MASK;
- pPageRec = (PCSAMPAGEREC)RTAvlPVGet(&pVM->csam.s.pPageTree, (AVLPVKEY)addr);
+ pPageRec = (PCSAMPAGEREC)RTAvlPVGet(&pVM->csam.s.pPageTree, (AVLPVKEY)(uintptr_t)addr);
if (pPageRec)
{
rc = csamRemovePageRecord(pVM, addr);
@@ -1705,7 +1705,7 @@ int csamR3CheckPageRecord(PVM pVM, RTRCPTR pInstrGC)
pInstrGC = pInstrGC & PAGE_BASE_GC_MASK;
- pPageRec = (PCSAMPAGEREC)RTAvlPVGet(&pVM->csam.s.pPageTree, (AVLPVKEY)pInstrGC);
+ pPageRec = (PCSAMPAGEREC)RTAvlPVGet(&pVM->csam.s.pPageTree, (AVLPVKEY)(uintptr_t)pInstrGC);
if (pPageRec)
{
u64hash = csamR3CalcPageHash(pVM, pInstrGC);
@@ -1763,7 +1763,7 @@ static PCSAMPAGE csamCreatePageRecord(PVM pVM, RTRCPTR GCPtr, CSAMTAG enmTag, bo
}
/* Round down to page boundary. */
GCPtr = (GCPtr & PAGE_BASE_GC_MASK);
- pPage->Core.Key = (AVLPVKEY)GCPtr;
+ pPage->Core.Key = (AVLPVKEY)(uintptr_t)GCPtr;
pPage->page.pPageGC = GCPtr;
pPage->page.fCode32 = fCode32;
pPage->page.fMonitorInvalidation = fMonitorInvalidation;
@@ -1869,7 +1869,7 @@ VMMR3DECL(int) CSAMR3MonitorPage(PVM pVM, RTRCPTR pPageAddrGC, CSAMTAG enmTag)
/** @todo implicit assumption */
fMonitorInvalidation = (enmTag == CSAM_TAG_PATM);
- pPageRec = (PCSAMPAGEREC)RTAvlPVGet(&pVM->csam.s.pPageTree, (AVLPVKEY)pPageAddrGC);
+ pPageRec = (PCSAMPAGEREC)RTAvlPVGet(&pVM->csam.s.pPageTree, (AVLPVKEY)(uintptr_t)pPageAddrGC);
if (pPageRec == NULL)
{
uint64_t fFlags;
@@ -1886,7 +1886,7 @@ VMMR3DECL(int) CSAMR3MonitorPage(PVM pVM, RTRCPTR pPageAddrGC, CSAMTAG enmTag)
csamCreatePageRecord(pVM, pPageAddrGC, enmTag, true /* 32 bits code */, fMonitorInvalidation);
- pPageRec = (PCSAMPAGEREC)RTAvlPVGet(&pVM->csam.s.pPageTree, (AVLPVKEY)pPageAddrGC);
+ pPageRec = (PCSAMPAGEREC)RTAvlPVGet(&pVM->csam.s.pPageTree, (AVLPVKEY)(uintptr_t)pPageAddrGC);
Assert(pPageRec);
}
/** @todo reference count */
@@ -1983,7 +1983,7 @@ VMMR3DECL(int) CSAMR3UnmonitorPage(PVM pVM, RTRCPTR pPageAddrGC, CSAMTAG enmTag)
#ifdef VBOX_STRICT
PCSAMPAGEREC pPageRec;
- pPageRec = (PCSAMPAGEREC)RTAvlPVGet(&pVM->csam.s.pPageTree, (AVLPVKEY)pPageAddrGC);
+ pPageRec = (PCSAMPAGEREC)RTAvlPVGet(&pVM->csam.s.pPageTree, (AVLPVKEY)(uintptr_t)pPageAddrGC);
Assert(pPageRec && pPageRec->page.enmTag == enmTag);
#endif
return CSAMR3RemovePage(pVM, pPageAddrGC);
@@ -2003,7 +2003,7 @@ static int csamRemovePageRecord(PVM pVM, RTRCPTR GCPtr)
PVMCPU pVCpu = VMMGetCpu0(pVM);
Log(("csamRemovePageRecord %RRv\n", GCPtr));
- pPageRec = (PCSAMPAGEREC)RTAvlPVRemove(&pVM->csam.s.pPageTree, (AVLPVKEY)GCPtr);
+ pPageRec = (PCSAMPAGEREC)RTAvlPVRemove(&pVM->csam.s.pPageTree, (AVLPVKEY)(uintptr_t)GCPtr);
if (pPageRec)
{
@@ -2163,7 +2163,7 @@ bool csamIsCodeScanned(PVM pVM, RTRCPTR pInstr, PCSAMPAGE *pPage)
return false;
}
- pPageRec = (PCSAMPAGEREC)RTAvlPVGet(&pVM->csam.s.pPageTree, (AVLPVKEY)pInstr);
+ pPageRec = (PCSAMPAGEREC)RTAvlPVGet(&pVM->csam.s.pPageTree, (AVLPVKEY)(uintptr_t)pInstr);
if (pPageRec)
{
if (pPage) *pPage= &pPageRec->page;
@@ -2346,7 +2346,7 @@ static int csamR3FlushDirtyPages(PVM pVM)
Log(("CSAMR3FlushDirtyPages: flush %RRv (modifypage rc=%Rrc)\n", pVM->csam.s.pvDirtyBasePage[i], rc));
- pPageRec = (PCSAMPAGEREC)RTAvlPVGet(&pVM->csam.s.pPageTree, (AVLPVKEY)GCPtr);
+ pPageRec = (PCSAMPAGEREC)RTAvlPVGet(&pVM->csam.s.pPageTree, (AVLPVKEY)(uintptr_t)GCPtr);
if (pPageRec && pPageRec->page.enmTag == CSAM_TAG_REM)
{
uint64_t fFlags;
diff --git a/src/VBox/VMM/VMMR3/HWACCM.cpp b/src/VBox/VMM/VMMR3/HWACCM.cpp
index 76f85f686..fa2e5daef 100644
--- a/src/VBox/VMM/VMMR3/HWACCM.cpp
+++ b/src/VBox/VMM/VMMR3/HWACCM.cpp
@@ -1711,7 +1711,7 @@ DECLCALLBACK(VBOXSTRICTRC) hwaccmR3RemovePatches(PVM pVM, PVMCPU pVCpu, void *pv
*/
int hwaccmR3EnablePatching(PVM pVM, VMCPUID idCpu, RTRCPTR pPatchMem, unsigned cbPatchMem)
{
- int rc = VMMR3EmtRendezvous(pVM, VMMEMTRENDEZVOUS_FLAGS_TYPE_ONE_BY_ONE, hwaccmR3RemovePatches, (void *)idCpu);
+ int rc = VMMR3EmtRendezvous(pVM, VMMEMTRENDEZVOUS_FLAGS_TYPE_ONE_BY_ONE, hwaccmR3RemovePatches, (void *)(uintptr_t)idCpu);
AssertRC(rc);
pVM->hwaccm.s.pGuestPatchMem = pPatchMem;
@@ -1758,7 +1758,7 @@ VMMR3DECL(int) HWACMMR3DisablePatching(PVM pVM, RTGCPTR pPatchMem, unsigned cbP
Assert(pVM->hwaccm.s.cbGuestPatchMem == cbPatchMem);
/* @todo Potential deadlock when other VCPUs are waiting on the IOM lock (we own it)!! */
- int rc = VMMR3EmtRendezvous(pVM, VMMEMTRENDEZVOUS_FLAGS_TYPE_ONE_BY_ONE, hwaccmR3RemovePatches, (void *)VMMGetCpuId(pVM));
+ int rc = VMMR3EmtRendezvous(pVM, VMMEMTRENDEZVOUS_FLAGS_TYPE_ONE_BY_ONE, hwaccmR3RemovePatches, (void *)(uintptr_t)VMMGetCpuId(pVM));
AssertRC(rc);
pVM->hwaccm.s.pGuestPatchMem = 0;
@@ -2179,7 +2179,7 @@ DECLCALLBACK(VBOXSTRICTRC) hwaccmR3PatchTprInstr(PVM pVM, PVMCPU pVCpu, void *pv
*/
VMMR3DECL(int) HWACCMR3PatchTprInstr(PVM pVM, PVMCPU pVCpu, PCPUMCTX pCtx)
{
- int rc = VMMR3EmtRendezvous(pVM, VMMEMTRENDEZVOUS_FLAGS_TYPE_ONE_BY_ONE, (pVM->hwaccm.s.pGuestPatchMem) ? hwaccmR3PatchTprInstr : hwaccmR3ReplaceTprInstr, (void *)pVCpu->idCpu);
+ int rc = VMMR3EmtRendezvous(pVM, VMMEMTRENDEZVOUS_FLAGS_TYPE_ONE_BY_ONE, (pVM->hwaccm.s.pGuestPatchMem) ? hwaccmR3PatchTprInstr : hwaccmR3ReplaceTprInstr, (void *)(uintptr_t)pVCpu->idCpu);
AssertRC(rc);
return rc;
}
diff --git a/src/VBox/VMM/VMMR3/PATM.cpp b/src/VBox/VMM/VMMR3/PATM.cpp
index 68094920f..5e01c244e 100644
--- a/src/VBox/VMM/VMMR3/PATM.cpp
+++ b/src/VBox/VMM/VMMR3/PATM.cpp
@@ -1128,7 +1128,7 @@ static void patmAddIllegalInstrRecord(PVM pVM, PPATCHINFO pPatch, RTRCPTR pInstr
pRec = (PAVLPVNODECORE)MMR3HeapAllocZ(pVM, MM_TAG_PATM_PATCH, sizeof(*pRec));
Assert(pRec);
- pRec->Key = (AVLPVKEY)pInstrGC;
+ pRec->Key = (AVLPVKEY)(uintptr_t)pInstrGC;
bool ret = RTAvlPVInsert(&pPatch->pTempInfo->IllegalInstrTree, pRec);
Assert(ret); NOREF(ret);
@@ -1139,7 +1139,7 @@ static bool patmIsIllegalInstr(PPATCHINFO pPatch, RTRCPTR pInstrGC)
{
PAVLPVNODECORE pRec;
- pRec = RTAvlPVGet(&pPatch->pTempInfo->IllegalInstrTree, (AVLPVKEY)pInstrGC);
+ pRec = RTAvlPVGet(&pPatch->pTempInfo->IllegalInstrTree, (AVLPVKEY)(uintptr_t)pInstrGC);
if (pRec)
return true;
else
@@ -2008,7 +2008,7 @@ static void patmPatchAddDisasmJump(PVM pVM, PPATCHINFO pPatch, RTRCPTR pInstrGC)
pRec = (PAVLPVNODECORE)MMR3HeapAllocZ(pVM, MM_TAG_PATM_PATCH, sizeof(*pRec));
Assert(pRec);
- pRec->Key = (AVLPVKEY)pInstrGC;
+ pRec->Key = (AVLPVKEY)(uintptr_t)pInstrGC;
int ret = RTAvlPVInsert(&pPatch->pTempInfo->DisasmJumpTree, pRec);
Assert(ret);
@@ -2026,7 +2026,7 @@ static bool patmIsKnownDisasmJump(PPATCHINFO pPatch, RTRCPTR pInstrGC)
{
PAVLPVNODECORE pRec;
- pRec = RTAvlPVGet(&pPatch->pTempInfo->DisasmJumpTree, (AVLPVKEY)pInstrGC);
+ pRec = RTAvlPVGet(&pPatch->pTempInfo->DisasmJumpTree, (AVLPVKEY)(uintptr_t)pInstrGC);
if (pRec)
return true;
return false;
diff --git a/src/VBox/VMM/VMMR3/PDMBlkCache.cpp b/src/VBox/VMM/VMMR3/PDMBlkCache.cpp
index fe322ec63..895e48637 100644
--- a/src/VBox/VMM/VMMR3/PDMBlkCache.cpp
+++ b/src/VBox/VMM/VMMR3/PDMBlkCache.cpp
@@ -2568,6 +2568,8 @@ VMMR3DECL(int) PDMR3BlkCacheSuspend(PPDMBLKCACHE pBlkCache)
AssertPtrReturn(pBlkCache, VERR_INVALID_POINTER);
+ if (!ASMAtomicReadBool(&pBlkCache->pCache->fIoErrorVmSuspended))
+ pdmBlkCacheCommit(pBlkCache); /* Can issue new I/O requests. */
ASMAtomicXchgBool(&pBlkCache->fSuspended, true);
/* Wait for all I/O to complete. */
diff --git a/src/VBox/VMM/VMMR3/PGMSavedState.cpp b/src/VBox/VMM/VMMR3/PGMSavedState.cpp
index 18d1c3738..36973495e 100644
--- a/src/VBox/VMM/VMMR3/PGMSavedState.cpp
+++ b/src/VBox/VMM/VMMR3/PGMSavedState.cpp
@@ -2218,7 +2218,13 @@ static int pgmR3LoadPageBitsOld(PVM pVM, PSSMHANDLE pSSM, uint8_t uType, PPGMPAG
* Match up the type, dealing with MMIO2 aliases (dropped).
*/
AssertLogRelMsgReturn( PGM_PAGE_GET_TYPE(pPage) == uType
- || uType == PGMPAGETYPE_INVALID,
+ || uType == PGMPAGETYPE_INVALID
+ /* kudge for the expanded PXE bios (r67885) - #5687: */
+ || ( uType == PGMPAGETYPE_RAM
+ && GCPhys >= 0xed000
+ && GCPhys <= 0xeffff
+ && PGM_PAGE_GET_TYPE(pPage) == PGMPAGETYPE_ROM)
+ ,
("pPage=%R[pgmpage] GCPhys=%#x %s\n", pPage, GCPhys, pRam->pszDesc),
VERR_SSM_UNEXPECTED_DATA);
diff --git a/src/VBox/VMM/VMMR3/SSM.cpp b/src/VBox/VMM/VMMR3/SSM.cpp
index 90cf3744a..a6034176c 100644
--- a/src/VBox/VMM/VMMR3/SSM.cpp
+++ b/src/VBox/VMM/VMMR3/SSM.cpp
@@ -6293,32 +6293,36 @@ VMMR3DECL(int) SSMR3GetStruct(PSSMHANDLE pSSM, void *pvStruct, PCSSMFIELD paFiel
*/
DECLINLINE(int) ssmR3GetHCPtrNI(PSSMHANDLE pSSM, void **ppv, uint32_t fFlags)
{
- int rc;
+ uintptr_t uPtrNI;
if (fFlags & SSMSTRUCT_FLAGS_DONT_IGNORE)
{
if (ssmR3GetHostBits(pSSM) == 64)
{
uint64_t u;
- rc = ssmR3DataRead(pSSM, &u, sizeof(u));
- if (RT_SUCCESS(rc))
- *ppv = (void *)(u ? 1 : 0);
+ int rc = ssmR3DataRead(pSSM, &u, sizeof(u));
+ if (RT_FAILURE(rc))
+ return rc;
+ uPtrNI = u ? 1 : 0;
}
else
{
uint32_t u;
- rc = ssmR3DataRead(pSSM, &u, sizeof(u));
- if (RT_SUCCESS(rc))
- *ppv = (void *)(u ? 1 : 0);
+ int rc = ssmR3DataRead(pSSM, &u, sizeof(u));
+ if (RT_FAILURE(rc))
+ return rc;
+ uPtrNI = u ? 1 : 0;
}
}
else
{
bool f;
- rc = SSMR3GetBool(pSSM, &f);
- if (RT_SUCCESS(rc))
- *ppv = (void *)(f ? 1 : 0);
+ int rc = SSMR3GetBool(pSSM, &f);
+ if (RT_FAILURE(rc))
+ return rc;
+ uPtrNI = f ? 1 : 0;
}
- return rc;
+ *ppv = (void *)uPtrNI;
+ return VINF_SUCCESS;
}