[Pkg-virtualbox-commits] [virtualbox] 02/06: Imported Upstream version 4.3.6-dfsg
Felix Geyer
fgeyer at moszumanska.debian.org
Mon Feb 3 18:35:30 UTC 2014
This is an automated email from the git hooks/post-receive script.
fgeyer pushed a commit to branch master
in repository virtualbox.
commit a0f18d47861c16d7dc3a1b7b8f177a076b14051e
Author: Felix Geyer <fgeyer at debian.org>
Date: Mon Feb 3 18:21:55 2014 +0100
Imported Upstream version 4.3.6-dfsg
---
Config.kmk | 13 +-
doc/manual/docbook2latex.xsl | 39 +-
doc/manual/en_US/SDKRef.xml | 39 +-
doc/manual/en_US/user_AdvancedTopics.xml | 9 +-
doc/manual/en_US/user_BasicConcepts.xml | 4 +-
doc/manual/en_US/user_GuestAdditions.xml | 2 +-
doc/manual/en_US/user_Introduction.xml | 23 +-
doc/manual/fr_FR/user_AdvancedTopics.xml | 69 +-
doc/manual/fr_FR/user_ChangeLog.xml | 383 +++-
doc/manual/fr_FR/user_GuestAdditions.xml | 7 +-
doc/manual/fr_FR/user_VBoxManage.xml | 242 ++-
doc/manual/user_ChangeLogImpl.xml | 331 +++-
include/VBox/DevPCNet.h | 99 -
include/VBox/RemoteDesktop/VRDEInput.h | 1 +
include/VBox/VMMDev.h | 4 +
include/VBox/settings.h | 6 +-
include/VBox/sup.h | 7 +
include/VBox/usblib-darwin.h | 2 +-
include/VBox/vd-ifs-internal.h | 2 +-
include/VBox/vmm/cpum.h | 4 +-
include/VBox/vmm/hm.h | 65 -
include/VBox/vmm/hm_vmx.h | 6 +-
include/VBox/vmm/pdmapi.h | 3 +-
include/VBox/vmm/pdmifs.h | 7 +-
include/VBox/vmm/pgm.h | 2 +-
include/iprt/asm.h | 176 ++
include/iprt/avl.h | 66 +-
include/iprt/mangling.h | 8 +
src/VBox/Additions/common/VBoxGuest/VBoxGuest.cpp | 41 +-
.../Additions/common/VBoxService/VBoxService.cpp | 33 +-
src/VBox/Additions/common/crOpenGL/fakedri_drv.c | 4 +-
src/VBox/Additions/common/crOpenGL/load.c | 10 +-
src/VBox/Additions/linux/drm/vboxvideo_drm.c | 8 +-
src/VBox/Additions/x11/vboxmouse/undefined | 1 +
src/VBox/Additions/x11/vboxvideo/undefined | 2 +
src/VBox/Additions/x11/vboxvideo/vboxvideo_dri.c | 17 +-
.../VBoxDebugAgentLib/VBoxDebugAgentLib.inf | 2 +-
.../VBoxPeCoffExtraActionLib.inf | 2 +-
src/VBox/Devices/EFI/FirmwareBin/VBoxEFI32.fd | Bin 1048576 -> 1048576 bytes
src/VBox/Devices/EFI/FirmwareBin/VBoxEFI64.fd | Bin 1048576 -> 1048576 bytes
.../Graphics/BIOS/VBoxVgaBiosAlternative.asm | 6 +-
.../Graphics/BIOS/VBoxVgaBiosAlternative.md5sum | 2 +-
src/VBox/Devices/Graphics/DevVGA.cpp | 39 +-
src/VBox/Devices/Graphics/DevVGA.h | 29 +
src/VBox/Devices/Graphics/DevVGASavedState.h | 3 +-
src/VBox/Devices/Graphics/DevVGA_VBVA.cpp | 267 ++-
src/VBox/Devices/Graphics/HGSMI/HGSMIHost.cpp | 7 -
src/VBox/Devices/Input/DevPS2.cpp | 17 +-
src/VBox/Devices/Input/PS2Dev.h | 1 +
src/VBox/Devices/Input/PS2K.cpp | 77 +-
src/VBox/Devices/Makefile.kmk | 5 +-
src/VBox/Devices/Network/DevE1000.cpp | 130 +-
src/VBox/Devices/Network/DevPCNet.cpp | 288 +--
src/VBox/Devices/Network/DevVirtioNet.cpp | 85 +-
.../Devices/Network/slirp/libalias/alias_mod.c | 10 +-
src/VBox/Devices/PC/BIOS/VBoxBiosAlternative.asm | 4 +-
.../Devices/PC/BIOS/VBoxBiosAlternative.md5sum | 2 +-
src/VBox/Devices/PC/DevAPIC.cpp | 6 +-
src/VBox/Devices/Storage/DevBusLogic.cpp | 7 +-
src/VBox/Devices/VMMDev/VMMDev.cpp | 17 +
src/VBox/Devices/VMMDev/VMMDevHGCM.cpp | 203 +-
.../Devices/testcase/tstDeviceStructSizeRC.cpp | 4 -
src/VBox/Frontends/VBoxManage/Makefile.kmk | 8 +-
.../Frontends/VBoxManage/VBoxInternalManage.cpp | 6 +-
src/VBox/Frontends/VBoxManage/VBoxManage.cpp | 6 +-
src/VBox/Frontends/VBoxManage/VBoxManage.h | 31 +-
.../VBoxManage/VBoxManageBandwidthControl.cpp | 7 +-
.../Frontends/VBoxManage/VBoxManageGuestCtrl.cpp | 593 +++---
src/VBox/Frontends/VBoxManage/VBoxManageHelp.cpp | 143 +-
src/VBox/Frontends/VBoxManage/VBoxManageInfo.cpp | 4 +-
src/VBox/Frontends/VBoxShell/vboxshell.py | 6 +-
src/VBox/Frontends/VirtualBox/Makefile.kmk | 84 +-
.../Frontends/VirtualBox/images/os_linux26.png | Bin 4957 -> 4665 bytes
.../Frontends/VirtualBox/nls/ApprovedLanguages.kmk | 1 +
src/VBox/Frontends/VirtualBox/nls/VirtualBox_bg.ts | 26 +-
src/VBox/Frontends/VirtualBox/nls/VirtualBox_ca.ts | 26 +-
.../Frontends/VirtualBox/nls/VirtualBox_ca_VA.ts | 26 +-
src/VBox/Frontends/VirtualBox/nls/VirtualBox_cs.ts | 26 +-
src/VBox/Frontends/VirtualBox/nls/VirtualBox_da.ts | 26 +-
src/VBox/Frontends/VirtualBox/nls/VirtualBox_de.ts | 10 +-
src/VBox/Frontends/VirtualBox/nls/VirtualBox_es.ts | 48 +-
src/VBox/Frontends/VirtualBox/nls/VirtualBox_eu.ts | 26 +-
.../Frontends/VirtualBox/nls/VirtualBox_fa_IR.ts | 26 +-
src/VBox/Frontends/VirtualBox/nls/VirtualBox_fi.ts | 26 +-
src/VBox/Frontends/VirtualBox/nls/VirtualBox_fr.ts | 711 +++----
.../Frontends/VirtualBox/nls/VirtualBox_gl_ES.ts | 26 +-
src/VBox/Frontends/VirtualBox/nls/VirtualBox_hu.ts | 40 +-
src/VBox/Frontends/VirtualBox/nls/VirtualBox_id.ts | 2050 ++++++++++----------
src/VBox/Frontends/VirtualBox/nls/VirtualBox_it.ts | 34 +-
src/VBox/Frontends/VirtualBox/nls/VirtualBox_ja.ts | 959 ++++-----
.../Frontends/VirtualBox/nls/VirtualBox_km_KH.ts | 26 +-
src/VBox/Frontends/VirtualBox/nls/VirtualBox_ko.ts | 26 +-
src/VBox/Frontends/VirtualBox/nls/VirtualBox_lt.ts | 26 +-
src/VBox/Frontends/VirtualBox/nls/VirtualBox_nl.ts | 37 +-
src/VBox/Frontends/VirtualBox/nls/VirtualBox_pl.ts | 26 +-
src/VBox/Frontends/VirtualBox/nls/VirtualBox_pt.ts | 26 +-
.../Frontends/VirtualBox/nls/VirtualBox_pt_BR.ts | 40 +-
src/VBox/Frontends/VirtualBox/nls/VirtualBox_ro.ts | 26 +-
src/VBox/Frontends/VirtualBox/nls/VirtualBox_ru.ts | 10 +-
src/VBox/Frontends/VirtualBox/nls/VirtualBox_sk.ts | 28 +-
src/VBox/Frontends/VirtualBox/nls/VirtualBox_sr.ts | 26 +-
src/VBox/Frontends/VirtualBox/nls/VirtualBox_sv.ts | 26 +-
src/VBox/Frontends/VirtualBox/nls/VirtualBox_tr.ts | 28 +-
src/VBox/Frontends/VirtualBox/nls/VirtualBox_uk.ts | 26 +-
.../Frontends/VirtualBox/nls/VirtualBox_xx_YY.ts | 28 +-
.../Frontends/VirtualBox/nls/VirtualBox_zh_CN.ts | 34 +-
.../Frontends/VirtualBox/nls/VirtualBox_zh_TW.ts | 72 +-
src/VBox/Frontends/VirtualBox/nls/qt_it.ts | 64 +-
src/VBox/Frontends/VirtualBox/nls/qt_zh_CN.ts | 9 +-
.../Frontends/VirtualBox/src/VBoxFBOverlay.cpp | 544 +++---
src/VBox/Frontends/VirtualBox/src/VBoxFBOverlay.h | 327 +---
.../src/converter/UIConverterBackendGlobal.cpp | 12 +
.../VirtualBox/src/extensions/QIRichTextLabel.cpp | 11 +-
.../VirtualBox/src/globals/UIActionPool.cpp | 4 +
.../VirtualBox/src/globals/UIActionPool.h | 2 +
.../Frontends/VirtualBox/src/globals/UIDefs.cpp | 5 +-
src/VBox/Frontends/VirtualBox/src/globals/UIDefs.h | 34 +-
.../VirtualBox/src/globals/UIMainEventListener.cpp | 4 +-
.../VirtualBox/src/globals/UIMainEventListener.h | 2 +
.../VirtualBox/src/globals/UIMessageCenter.cpp | 26 +-
.../VirtualBox/src/globals/UIMessageCenter.h | 6 +-
.../src/globals/UIModalWindowManager.cpp | 8 +-
.../VirtualBox/src/globals/UIModalWindowManager.h | 2 +
.../VirtualBox/src/globals/UIPopupCenter.cpp | 13 +-
.../VirtualBox/src/globals/VBoxGlobal.cpp | 48 +-
.../Frontends/VirtualBox/src/globals/VBoxGlobal.h | 9 +-
.../Frontends/VirtualBox/src/medium/UIMedium.cpp | 15 +
.../Frontends/VirtualBox/src/medium/UIMedium.h | 5 +
.../VirtualBox/src/medium/UIMediumEnumerator.cpp | 404 +++-
.../VirtualBox/src/medium/UIMediumEnumerator.h | 19 +-
.../VirtualBox/src/medium/UIMediumManager.cpp | 288 ++-
.../VirtualBox/src/medium/UIMediumManager.h | 15 +-
.../src/platform/darwin/DarwinKeyboard.cpp | 540 ++++--
.../src/platform/darwin/UICocoaApplication.h | 1 +
.../src/platform/darwin/UICocoaApplication.mm | 5 +
.../VirtualBox/src/runtime/UIFrameBufferQImage.cpp | 2 +-
.../src/runtime/UIFrameBufferQuartz2D.cpp | 2 +-
.../Frontends/VirtualBox/src/runtime/UIMachine.cpp | 353 +---
.../Frontends/VirtualBox/src/runtime/UIMachine.h | 20 +-
.../VirtualBox/src/runtime/UIMachineLogic.cpp | 70 +-
.../VirtualBox/src/runtime/UIMachineLogic.h | 19 +-
.../VirtualBox/src/runtime/UIMachineMenuBar.cpp | 68 +-
.../VirtualBox/src/runtime/UIMachineMenuBar.h | 49 +-
.../VirtualBox/src/runtime/UIMachineView.cpp | 76 +-
.../VirtualBox/src/runtime/UIMachineWindow.cpp | 48 +-
.../Frontends/VirtualBox/src/runtime/UISession.cpp | 218 ++-
.../Frontends/VirtualBox/src/runtime/UISession.h | 102 +-
.../VirtualBox/src/runtime/UIVMCloseDialog.cpp | 33 +-
.../VirtualBox/src/runtime/UIVMCloseDialog.h | 17 +-
.../fullscreen/UIMachineLogicFullscreen.cpp | 56 +-
.../runtime/fullscreen/UIMachineLogicFullscreen.h | 12 +-
.../fullscreen/UIMachineWindowFullscreen.cpp | 2 +-
.../src/runtime/normal/UIMachineLogicNormal.cpp | 61 +-
.../src/runtime/normal/UIMachineLogicNormal.h | 17 +-
.../src/runtime/scale/UIMachineLogicScale.cpp | 63 +-
.../src/runtime/scale/UIMachineLogicScale.h | 14 +-
.../src/runtime/scale/UIMachineWindowScale.cpp | 2 +-
.../runtime/seamless/UIMachineLogicSeamless.cpp | 75 +-
.../src/runtime/seamless/UIMachineLogicSeamless.h | 15 +-
.../runtime/seamless/UIMachineWindowSeamless.cpp | 2 +-
.../VirtualBox/src/selector/UISelectorWindow.cpp | 42 +-
.../VirtualBox/src/selector/UISelectorWindow.h | 4 +-
.../VirtualBox/src/selector/UIVMDesktop.cpp | 17 +-
.../VirtualBox/src/selector/UIVMDesktop.h | 5 +
.../src/selector/UIVirtualBoxEventHandler.cpp | 8 +
.../src/selector/UIVirtualBoxEventHandler.h | 2 +
.../VirtualBox/src/selector/VBoxSnapshotsWgt.cpp | 3 +-
.../selector/graphics/chooser/UIGChooserModel.cpp | 6 +-
.../selector/graphics/details/UIGDetailsSet.cpp | 2 +
.../src/settings/UISettingsDialogSpecific.cpp | 16 +-
.../settings/machine/UIMachineSettingsStorage.cpp | 6 +-
.../settings/machine/UIMachineSettingsStorage.h | 2 +-
.../settings/machine/UIMachineSettingsSystem.cpp | 2 +-
.../src/widgets/UIApplianceEditorWidget.cpp | 4 +
.../VirtualBox/src/widgets/UILineTextEdit.cpp | 4 +
.../VirtualBox/src/widgets/UILineTextEdit.h | 5 +
.../VirtualBox/src/widgets/VBoxMediaComboBox.cpp | 6 +-
.../VirtualBox/src/widgets/VBoxMediaComboBox.h | 2 +-
src/VBox/HostDrivers/Support/SUPDrv.c | 56 +-
src/VBox/HostDrivers/Support/SUPDrvIOC.h | 16 +-
src/VBox/HostDrivers/Support/SUPDrvInternal.h | 5 +
src/VBox/HostDrivers/Support/SUPLib.cpp | 23 +
.../HostDrivers/Support/darwin/SUPDrv-darwin.cpp | 69 +
src/VBox/HostDrivers/Support/darwin/load.sh | 154 ++
.../HostDrivers/Support/freebsd/SUPDrv-freebsd.c | 2 +-
.../HostDrivers/Support/solaris/SUPLib-solaris.cpp | 16 +-
.../VBoxNetAdp/darwin/VBoxNetAdp-darwin.cpp | 53 +
.../HostDrivers/VBoxUSB/darwin/USBLib-darwin.cpp | 2 +-
src/VBox/HostDrivers/VBoxUSB/darwin/VBoxUSB.cpp | 2 +-
.../HostDrivers/VBoxUSB/darwin/VBoxUSBInterface.h | 2 +-
.../SharedOpenGL/crserverlib/server_presenter.cpp | 5 +-
.../SharedOpenGL/render/renderspu_cocoa_helper.m | 30 +-
.../darwin/VBoxKEXTs/VirtualBoxStartup.sh | 4 +-
src/VBox/Installer/darwin/VirtualBox/postflight | 2 +-
.../darwin/VirtualBox_mpkg/distribution.dist | 2 +-
src/VBox/Installer/solaris/VBoxZoneAccess.c | 17 +-
src/VBox/Installer/solaris/vboxconfig.sh | 17 +-
src/VBox/Installer/win/NLS/de_DE.wxl | 1 +
src/VBox/Installer/win/NLS/en_US.wxl | 1 +
src/VBox/Installer/win/NLS/fa_IR.wxl | 1 +
src/VBox/Installer/win/NLS/fr_FR.wxl | 1 +
src/VBox/Installer/win/NLS/it_IT.wxl | 1 +
src/VBox/Installer/win/NLS/zh_TW.wxl | 1 +
src/VBox/Installer/win/UserInterface.wxi | 4 +
src/VBox/Installer/win/VirtualBox.wxs | 27 +-
src/VBox/Main/cbinding/Makefile.kmk | 17 -
src/VBox/Main/cbinding/VBoxCAPI_v4_2.h | 153 +-
src/VBox/Main/cbinding/VBoxXPCOMC.cpp | 311 ++-
src/VBox/Main/cbinding/VBoxXPCOMCGlue.c | 17 +-
src/VBox/Main/cbinding/makefile.tstXPCOMCGlue | 16 +-
src/VBox/Main/cbinding/tstXPCOMCEvent.c | 745 -------
src/VBox/Main/cbinding/tstXPCOMCGlue.c | 599 +++++-
src/VBox/Main/cbinding/xpcidl.xsl | 126 +-
src/VBox/Main/glue/vboxapi.py | 4 +-
src/VBox/Main/idl/VirtualBox.xidl | 9 +-
src/VBox/Main/idl/comimpl.xsl | 12 +-
src/VBox/Main/include/DHCPServerImpl.h | 4 +
src/VBox/Main/include/DisplayImpl.h | 16 +-
src/VBox/Main/include/GuestCtrlImplPrivate.h | 5 +
src/VBox/Main/include/GuestDirectoryImpl.h | 1 +
src/VBox/Main/include/GuestFileImpl.h | 1 +
src/VBox/Main/include/GuestProcessImpl.h | 1 +
src/VBox/Main/include/GuestSessionImpl.h | 3 +-
src/VBox/Main/include/MachineImpl.h | 2 -
src/VBox/Main/include/NATNetworkImpl.h | 2 +-
src/VBox/Main/include/NetworkServiceRunner.h | 59 +-
src/VBox/Main/include/Wrapper.h | 2 +-
src/VBox/Main/src-client/ConsoleImpl.cpp | 2 +-
src/VBox/Main/src-client/ConsoleImpl2.cpp | 76 +-
src/VBox/Main/src-client/DisplayImpl.cpp | 108 +-
src/VBox/Main/src-client/GuestCtrlImpl.cpp | 31 +-
src/VBox/Main/src-client/GuestCtrlPrivate.cpp | 98 +-
src/VBox/Main/src-client/GuestDirectoryImpl.cpp | 32 +-
src/VBox/Main/src-client/GuestFileImpl.cpp | 172 +-
src/VBox/Main/src-client/GuestFsObjInfoImpl.cpp | 3 +-
src/VBox/Main/src-client/GuestImpl.cpp | 2 +-
src/VBox/Main/src-client/GuestProcessImpl.cpp | 276 +--
src/VBox/Main/src-client/GuestSessionImpl.cpp | 240 ++-
src/VBox/Main/src-client/GuestSessionImplTasks.cpp | 20 +-
src/VBox/Main/src-client/SessionImpl.cpp | 9 +-
src/VBox/Main/src-server/ApplianceImpl.cpp | 4 +-
src/VBox/Main/src-server/ApplianceImplExport.cpp | 6 +-
src/VBox/Main/src-server/ApplianceImplImport.cpp | 142 +-
src/VBox/Main/src-server/ClientWatcher.cpp | 40 +-
src/VBox/Main/src-server/DHCPServerImpl.cpp | 23 +-
src/VBox/Main/src-server/HostDnsService.cpp | 165 +-
src/VBox/Main/src-server/HostDnsService.h | 113 +-
.../Main/src-server/HostDnsServiceResolvConf.cpp | 17 +-
src/VBox/Main/src-server/HostImpl.cpp | 8 +-
.../Main/src-server/HostNetworkInterfaceImpl.cpp | 2 +-
src/VBox/Main/src-server/MachineImpl.cpp | 32 +-
src/VBox/Main/src-server/NATNetworkImpl.cpp | 78 +-
src/VBox/Main/src-server/NetworkAdapterImpl.cpp | 9 +-
src/VBox/Main/src-server/NetworkServiceRunner.cpp | 93 +-
src/VBox/Main/src-server/SnapshotImpl.cpp | 5 +
src/VBox/Main/src-server/freebsd/NetIf-freebsd.cpp | 3 +-
.../Main/src-server/freebsd/PerformanceFreeBSD.cpp | 5 +
.../Main/src-server/linux/HostDnsServiceLinux.cpp | 6 +-
src/VBox/Main/src-server/win/HostDnsServiceWin.cpp | 20 +-
src/VBox/Main/xml/Settings.cpp | 18 +-
src/VBox/NetworkServices/DHCP/Config.cpp | 159 +-
src/VBox/NetworkServices/DHCP/Config.h | 34 +-
src/VBox/NetworkServices/DHCP/VBoxNetDHCP.cpp | 574 +++---
src/VBox/NetworkServices/NAT/VBoxNetLwipNAT.cpp | 7 +-
.../NetworkServices/NetLib/VBoxNetBaseService.cpp | 49 +-
.../NetworkServices/NetLib/VBoxNetBaseService.h | 4 +-
src/VBox/Runtime/Makefile.kmk | 24 +
src/VBox/Runtime/common/asm/ASMAtomicUoAndU32.asm | 58 +
src/VBox/Runtime/common/asm/ASMAtomicUoAndU64.asm | 77 +
src/VBox/Runtime/common/asm/ASMAtomicUoOrU32.asm | 57 +
src/VBox/Runtime/common/asm/ASMAtomicUoOrU64.asm | 76 +
src/VBox/Runtime/common/table/avl_Destroy.cpp.h | 8 +-
src/VBox/Runtime/common/table/avl_DoWithAll.cpp.h | 12 +-
src/VBox/Runtime/common/table/avlgcphys.cpp | 1 +
src/VBox/Runtime/common/table/avlgcptr.cpp | 2 +-
src/VBox/Runtime/common/table/avlhcphys.cpp | 1 +
src/VBox/Runtime/common/table/avllu32.cpp | 1 +
src/VBox/Runtime/common/table/avlogcphys.cpp | 1 +
src/VBox/Runtime/common/table/avlogcptr.cpp | 1 +
src/VBox/Runtime/common/table/avlohcphys.cpp | 1 +
src/VBox/Runtime/common/table/avloioport.cpp | 1 +
src/VBox/Runtime/common/table/avlou32.cpp | 1 +
src/VBox/Runtime/common/table/avlpv.cpp | 2 +-
src/VBox/Runtime/common/table/avlrfoff.cpp | 1 +
src/VBox/Runtime/common/table/avlrgcptr.cpp | 1 +
src/VBox/Runtime/common/table/avlrogcphys.cpp | 1 +
src/VBox/Runtime/common/table/avlrogcptr.cpp | 1 +
src/VBox/Runtime/common/table/avlroioport.cpp | 1 +
src/VBox/Runtime/common/table/avlroogcptr.cpp | 1 +
src/VBox/Runtime/common/table/avlrpv.cpp | 2 +-
src/VBox/Runtime/common/table/avlru64.cpp | 2 +-
src/VBox/Runtime/common/table/avlruintptr.cpp | 1 +
src/VBox/Runtime/common/table/avlu32.cpp | 1 +
src/VBox/Runtime/common/table/avluintptr.cpp | 1 +
src/VBox/Runtime/common/table/avlul.cpp | 1 +
.../Runtime/r0drv/freebsd/alloc-r0drv-freebsd.c | 5 +
.../Runtime/r0drv/freebsd/memobj-r0drv-freebsd.c | 63 +
src/VBox/Runtime/r0drv/freebsd/mp-r0drv-freebsd.c | 5 +
.../Runtime/r0drv/freebsd/the-freebsd-kernel.h | 3 +
src/VBox/Runtime/r0drv/linux/memobj-r0drv-linux.c | 6 +-
.../Runtime/r3/posix/process-creation-posix.cpp | 12 +
src/VBox/Runtime/testcase/Makefile.kmk | 2 +-
src/VBox/Storage/ISCSI.cpp | 7 +-
src/VBox/Storage/VD.cpp | 3 +-
src/VBox/VMM/VMMAll/CPUMAllRegs.cpp | 21 +-
src/VBox/VMM/VMMAll/IEMAll.cpp | 2 +-
src/VBox/VMM/VMMAll/IEMAllCImpl.cpp.h | 71 +-
src/VBox/VMM/VMMAll/IEMAllInstructions.cpp.h | 60 +-
src/VBox/VMM/VMMAll/PDMAll.cpp | 16 +-
src/VBox/VMM/VMMAll/PGMAllPhys.cpp | 16 +-
src/VBox/VMM/VMMR0/GMMR0.cpp | 2 +-
src/VBox/VMM/VMMR0/HMR0.cpp | 19 +-
src/VBox/VMM/VMMR0/HMSVMR0.cpp | 273 +--
src/VBox/VMM/VMMR0/HMVMXR0.cpp | 347 ++--
src/VBox/VMM/VMMR3/CPUM.cpp | 2 +-
src/VBox/VMM/VMMR3/DBGFDisas.cpp | 5 +-
src/VBox/VMM/VMMR3/HM.cpp | 8 +-
src/VBox/VMM/VMMR3/PATMSSM.cpp | 201 +-
src/VBox/VMM/VMMR3/PDMDevHlp.cpp | 2 +-
src/VBox/VMM/VMMR3/SSM.cpp | 265 +--
src/VBox/VMM/VMMSwitcher/LegacyandAMD64.mac | 6 +-
src/VBox/VMM/include/HMInternal.h | 66 +-
src/VBox/VMM/include/PATMInternal.h | 5 +-
.../testcase/Instructions/InstructionTestGen.py | 266 ++-
src/VBox/VMM/testcase/Instructions/env-common.mac | 1 +
src/VBox/VMM/testcase/Instructions/itgTableDaa.py | 1105 +++++++++++
src/VBox/VMM/testcase/Instructions/itgTableDas.py | 1105 +++++++++++
327 files changed, 14696 insertions(+), 7304 deletions(-)
diff --git a/Config.kmk b/Config.kmk
index f11b262..8125b2d 100644
--- a/Config.kmk
+++ b/Config.kmk
@@ -162,7 +162,7 @@ if $(KBUILD_VERSION_MAJOR) == 0 \
&& ( $(KBUILD_VERSION_MINOR) >= 2 \
|| ( $(KBUILD_VERSION_MINOR) == 1 \
&& $(KBUILD_VERSION_PATCH) >= 999))
- if $(KMK_REVISION) >= 2577
+ if $(KMK_REVISION) >= 2689
# OK.
else
$(error You must update kBuild! Requires kBuild revision 2577 or later, found $(KMK_REVISION) ($(KBUILD_VERSION)))
@@ -206,7 +206,7 @@ VBOX_VERSION_MINOR = 3
# 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 = 2
+VBOX_VERSION_BUILD = 6
# 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.
@@ -3774,8 +3774,8 @@ ifeq ($(KBUILD_TARGET),win)
$(PATH_TOOL_$(TEMPLATE_VBOXR3STATIC_TOOL.win.amd64)_LIB)/libcmt$(VBOX_VCC_CRT_TYPE).lib \
$(PATH_TOOL_$(TEMPLATE_VBOXR3STATIC_TOOL.win.amd64)_LIB)/libcpmt$(VBOX_VCC_CRT_TYPE).lib \
$(PATH_TOOL_$(TEMPLATE_VBOXR3STATIC_TOOL.win.amd64)_LIB)/oldnames.lib
-else ifn1of ($(KBUILD_TARGET), darwin solaris)
- # The gcc guys sans darwin and solaris.
+else ifn1of ($(KBUILD_TARGET), darwin linux solaris)
+ # The gcc guys sans darwin, linux and solaris (don't depend on statically compiled system libs there)
TEMPLATE_VBOXR3STATIC_CFLAGS = $(TEMPLATE_VBOXR3EXE_CFLAGS) -static
TEMPLATE_VBOXR3STATIC_CXXFLAGS = $(TEMPLATE_VBOXR3EXE_CXXFLAGS) -static
TEMPLATE_VBOXR3STATIC_OBJCFLAGS = $(TEMPLATE_VBOXR3EXE_OBJCFLAGS) -static
@@ -3783,6 +3783,9 @@ else ifn1of ($(KBUILD_TARGET), darwin solaris)
TEMPLATE_VBOXR3STATIC_LDFLAGS = $(TEMPLATE_VBOXR3EXE_LDFLAGS) -static
else ifeq ($(KBUILD_TARGET),solaris)
TEMPLATE_VBOXR3STATIC_LIBS = $(TEMPLATE_VBOXR3EXE_LIBS) nsl
+ TEMPLATE_VBOXR3STATIC_LDFLAGS = $(filter-out '$(VBOX_GCC_RPATH_OPT)$(VBOX_WITH_RUNPATH)' '$(VBOX_GCC_RPATH_OPT)$(VBOX_WITH_RELATIVE_RUNPATH)',$(TEMPLATE_VBOXR3EXE_LDFLAGS))
+else
+ TEMPLATE_VBOXR3STATIC_LDFLAGS = $(filter-out '$(VBOX_GCC_RPATH_OPT)$(VBOX_WITH_RUNPATH)' '$(VBOX_GCC_RPATH_OPT)$(VBOX_WITH_RELATIVE_RUNPATH)',$(TEMPLATE_VBOXR3EXE_LDFLAGS))
endif
#
@@ -5587,7 +5590,7 @@ endif
SVN ?= svn$(HOSTSUFF_EXE)
VBOX_SVN_REV_KMK = $(PATH_OUT)/revision.kmk
ifndef VBOX_SVN_REV
- VBOX_SVN_REV_FALLBACK := $(patsubst %:,, $Rev: 90405 $ )
+ VBOX_SVN_REV_FALLBACK := $(patsubst %:,, $Rev: 91406 $ )
VBOX_SVN_DEP := $(firstword $(wildcard $(PATH_ROOT)/.svn/wc.db $(abspath $(PATH_ROOT)/../.svn/wc.db) $(abspath $(PATH_ROOT)/../../.svn/wc.db) $(PATH_ROOT)/.svn/entries))
ifeq ($(which $(SVN)),)
VBOX_SVN_DEP :=
diff --git a/doc/manual/docbook2latex.xsl b/doc/manual/docbook2latex.xsl
index bfe8cbc..07045ef 100644
--- a/doc/manual/docbook2latex.xsl
+++ b/doc/manual/docbook2latex.xsl
@@ -239,7 +239,14 @@
{\fontsize{16pt}{20pt}\selectfont\rmfamily%
\begin{center}
-\docbooktitleedition
+</xsl:text>
+ <xsl:if test="//bookinfo/othercredit">
+ <xsl:text>\docbookbookinfoothercreditcontrib{}: \docbookbookinfoothercreditfirstname{} \docbookbookinfoothercreditsurname
+
+\vspace{8mm}
+</xsl:text>
+ </xsl:if>
+ <xsl:text>\docbooktitleedition
\vspace{2mm}
@@ -373,6 +380,36 @@
</xsl:choose>
</xsl:template>
+ <xsl:template match="firstname">
+ <xsl:choose>
+ <xsl:when test="name(..)='othercredit'">
+ <xsl:text>\newcommand\docbookbookinfoothercreditfirstname{</xsl:text>
+ <xsl:apply-templates />
+ <xsl:text>}
</xsl:text>
+ </xsl:when>
+ </xsl:choose>
+ </xsl:template>
+
+ <xsl:template match="surname">
+ <xsl:choose>
+ <xsl:when test="name(..)='othercredit'">
+ <xsl:text>\newcommand\docbookbookinfoothercreditsurname{</xsl:text>
+ <xsl:apply-templates />
+ <xsl:text>}
</xsl:text>
+ </xsl:when>
+ </xsl:choose>
+ </xsl:template>
+
+ <xsl:template match="contrib">
+ <xsl:choose>
+ <xsl:when test="name(..)='othercredit'">
+ <xsl:text>\newcommand\docbookbookinfoothercreditcontrib{</xsl:text>
+ <xsl:apply-templates />
+ <xsl:text>}
</xsl:text>
+ </xsl:when>
+ </xsl:choose>
+ </xsl:template>
+
<xsl:template match="glossary">
<xsl:text>

\backmatter
\chapter{Glossary}
</xsl:text>
<xsl:apply-templates />
diff --git a/doc/manual/en_US/SDKRef.xml b/doc/manual/en_US/SDKRef.xml
index 4ab6186..42f40ff 100644
--- a/doc/manual/en_US/SDKRef.xml
+++ b/doc/manual/en_US/SDKRef.xml
@@ -1721,7 +1721,8 @@ print "Machine '%s' logs in '%s'" %(m.name, m.logFolder)
<title>C binding to XPCOM API</title>
<note>
- <para>This section currently applies to Linux hosts only.</para>
+ <para>This section currently applies to Linux, Mac OS X and Solaris
+ hosts only.</para>
</note>
<para>Starting with version 2.2, VirtualBox offers a C binding for the
@@ -1736,11 +1737,12 @@ print "Machine '%s' logs in '%s'" %(m.name, m.logFolder)
<para>The following sections describe how to use the C binding in a
C program.</para>
- <para>For Linux, a sample program is provided which demonstrates use
- of the C binding to initialize XPCOM, get handles for VirtualBox and
- Session objects, make calls to list and start virtual machines, and
- uninitialize resources when done. The program uses the VBoxGlue
- library to open the C binding layer during runtime.</para>
+ <para>As part of the SDK, a sample program is provided which
+ demonstrates using the C binding to initialize XPCOM, get handles for
+ VirtualBox and Session objects, make calls to list and start virtual
+ machines, monitor events, and uninitialize resources when done. The
+ program uses the VBoxGlue library to open the C binding layer during
+ runtime.</para>
<para>The sample program
<computeroutput>tstXPCOMCGlue</computeroutput> is located in the bin
@@ -1757,11 +1759,11 @@ print "Machine '%s' logs in '%s'" %(m.name, m.logFolder)
<title>XPCOM initialization</title>
<para>Just like in C++, XPCOM needs to be initialized before it can
- be used. The <computeroutput>VBoxCAPI_v2_5.h</computeroutput> header
+ be used. The <computeroutput>VBoxCAPI_v4_3.h</computeroutput> header
provides the interface to the C binding. Here's how to initialize
XPCOM:</para>
- <screen>#include "VBoxCAPI_v2_5.h"
+ <screen>#include "VBoxCAPI_v4_3.h"
...
PCVBOXXPCOM g_pVBoxFuncs = NULL;
IVirtualBox *vbox = NULL;
@@ -1783,12 +1785,21 @@ ISession *session = NULL;
*/
g_pVBoxFuncs = VBoxGetXPCOMCFunctions(VBOX_XPCOMC_VERSION);
-g_pVBoxFuncs->pfnComInitialize(&vbox, &session);</screen>
+g_pVBoxFuncs->pfnComInitialize(IVIRTUALBOX_IID_STR, &vbox,
+ ISESSION_IID_STR, &session);</screen>
<para>If either <computeroutput>vbox</computeroutput> or
<computeroutput>session</computeroutput> is still
<computeroutput>NULL</computeroutput>, initialization failed and the
XPCOM API cannot be used.</para>
+
+ <para>There is now also a way to use the
+ <xref linkend="IVirtualBoxClient" xreflabel="IVirtualBoxClient" />
+ helper interface, which in comparison to the original (and still
+ available) initialization method above simplifies creating multiple
+ sessions, and also allows handling termination and crashes of the API
+ server (VBoxSVC) in a graceful way. See the sample program how this
+ is used.</para>
</sect3>
<sect3 id="c-invocation">
@@ -1885,7 +1896,7 @@ if (NS_SUCCEEDED(rc))
characters are arrays of that type. Most string handling functions
take pointers to that type. Prototypes for the following conversion
functions are declared in
- <computeroutput>VBoxCAPI_v2_5.h</computeroutput>.</para>
+ <computeroutput>VBoxCAPI_v4_3.h</computeroutput>.</para>
<sect4>
<title>Conversion of UTF-16 to and from UTF-8</title>
@@ -1945,14 +1956,12 @@ if (atexit(g_pVBoxFuncs->pfnComUninitialize()) != 0) {
handler setting a flag noting that a signal was sent and then
calling
<computeroutput>g_pVBoxFuncs->pfnComUninitialize()</computeroutput>
- later on (usually <emphasis>not</emphasis> from the handler itself
- .)</para>
+ later on, <emphasis>not</emphasis> from the handler itself.</para>
<para>That said, if a client program forgets to call
<computeroutput>g_pVBoxFuncs->pfnComUninitialize()</computeroutput>
before it terminates, there is a mechanism in place which will
- eventually release references held by the client. You should not
- rely on this, however.</para>
+ eventually release references held by the client.</para>
</sect3>
<sect3 id="c-linking">
@@ -1975,7 +1984,7 @@ VBoxXPCOMCGlue.o: $(GLUE_DIR)/VBoxXPCOMCGlue.c
$(CC) $(CFLAGS) $(INCS_XPCOM) $(GLUE_INC) -o $@ -c $<
# Compile.
-program.o: program.c VBoxCAPI_v2_5.h
+program.o: program.c VBoxCAPI_v4_3.h
$(CC) $(CFLAGS) $(INCS_XPCOM) $(GLUE_INC) -o $@ -c $<
# Link.
diff --git a/doc/manual/en_US/user_AdvancedTopics.xml b/doc/manual/en_US/user_AdvancedTopics.xml
index 4770439..3a607cb 100644
--- a/doc/manual/en_US/user_AdvancedTopics.xml
+++ b/doc/manual/en_US/user_AdvancedTopics.xml
@@ -873,7 +873,11 @@ VBoxManage controlvm "VM name" unplugcpu 3</screen></para>
linkend="intro-installing" /> for more information.</para>
</note>
- <para>The VBoxManage command line tool must be used to enable webcam passthrough.
+ <para>The host webcam can be attached to the VM using "Devices" menu in the VM menu bar.
+ The "Webcams" menu contains a list of available video input devices on the host.
+ Clicking on a webcam name attaches or detaches the corresponding host device.</para>
+
+ <para>The VBoxManage command line tool can be used to enable webcam passthrough.
Please see the host-specific sections below for additional details.
The following commands are available:
<itemizedlist>
@@ -1470,7 +1474,8 @@ VBoxManage setextradata "VM name" \
<para>The DMI data VirtualBox provides to guests can be changed for a
specific VM. Use the following commands to configure the DMI BIOS
- information:</para>
+ information. In case your VM is configured to use EFI firmware you need to
+ replace <code>pcbios</code> by <code>efi</code> in the keys.</para>
<sect2>
<title>DMI BIOS information (type 0)</title>
diff --git a/doc/manual/en_US/user_BasicConcepts.xml b/doc/manual/en_US/user_BasicConcepts.xml
index ad5c8c9..d6afb21 100644
--- a/doc/manual/en_US/user_BasicConcepts.xml
+++ b/doc/manual/en_US/user_BasicConcepts.xml
@@ -1370,8 +1370,8 @@
<para>To control GOP, use the following
<computeroutput>VBoxManage</computeroutput> command: <screen>VBoxManage setextradata "VM name" VBoxInternal2/EfiGopMode N</screen>
- Where N can be one of 0,1,2,3,4 referring to the 640x480, 800x600,
- 1024x768, 1280x1024, 1440x900 screen resolution respectively.</para>
+ Where N can be one of 0,1,2,3,4,5 referring to the 640x480, 800x600,
+ 1024x768, 1280x1024, 1440x900, 1920x1200 screen resolution respectively.</para>
<para>To change the UGA resolution: <screen>VBoxManage setextradata "VM name" VBoxInternal2/UgaHorizontalResolution 1440
VBoxManage setextradata "VM name" VBoxInternal2/UgaVerticalResolution 900</screen></para>
diff --git a/doc/manual/en_US/user_GuestAdditions.xml b/doc/manual/en_US/user_GuestAdditions.xml
index 7f8dd6a..740ee74 100644
--- a/doc/manual/en_US/user_GuestAdditions.xml
+++ b/doc/manual/en_US/user_GuestAdditions.xml
@@ -231,7 +231,7 @@
<title>Installation</title>
<para>In the "Devices" menu in the virtual machine's menu bar,
- VirtualBox has a handy menu item named "Install guest additions",
+ VirtualBox has a handy menu item named "Insert Guest Additions CD image",
which mounts the Guest Additions ISO file inside your virtual machine.
A Windows guest should then automatically start the Guest Additions
installer, which installs the Guest Additions into your Windows
diff --git a/doc/manual/en_US/user_Introduction.xml b/doc/manual/en_US/user_Introduction.xml
index f52663f..a91e4f7 100644
--- a/doc/manual/en_US/user_Introduction.xml
+++ b/doc/manual/en_US/user_Introduction.xml
@@ -452,6 +452,10 @@
<para>10.8 (Mountain Lion, 64-bit)</para>
</listitem>
+ <listitem>
+ <para>10.9 (Mavericks, 64-bit)</para>
+ </listitem>
+
</itemizedlist>
<para>Intel hardware is required; please see <xref
@@ -468,7 +472,7 @@
<para>10.04 ("Lucid Lynx"), 10.10 ("Maverick Meerkat),
11.04 ("Natty Narwhal"), 11.10 ("Oneiric Oncelot"),
12.04 ("Precise Pangolin"), 12.10 ("Quantal Quetzal"),
- 13.04 ("Raring Ringtail")</para>
+ 13.04 ("Raring Ringtail"), 13.10 ("Saucy Salamander")</para>
</listitem>
<listitem>
@@ -484,7 +488,7 @@
</listitem>
<listitem>
- <para>Fedora Core 6 to 17</para>
+ <para>Fedora Core 6 to 19</para>
</listitem>
<listitem>
@@ -566,8 +570,12 @@
</listitem>
<listitem>
- <para>Intel PXE boot ROM with support for the E1000 network
- card.</para>
+ <para>Host webcam passthrough; see chapter <xref
+ linkend="webcam-passthrough" />.</para>
+ </listitem>
+
+ <listitem>
+ <para>Intel PXE boot ROM.</para>
</listitem>
<listitem>
@@ -979,7 +987,12 @@
will go to the guest instead. After you press the host key to
re-enable the host keyboard, all key presses will go through the
host again, so that sequences like Alt-Tab will no longer reach
- the guest.</para>
+ the guest. For technical reasons it may not be possible for the
+ VM to get all keyboard input even when it does own the keyboard.
+ Examples of this are the Ctrl-Alt-Del sequence on Windows hosts
+ or single keys grabbed by other applications on X11 hosts like
+ the GNOME desktop's "Control key highlights mouse pointer"
+ functionality.</para>
</listitem>
<listitem>
diff --git a/doc/manual/fr_FR/user_AdvancedTopics.xml b/doc/manual/fr_FR/user_AdvancedTopics.xml
index 1c7aaff..317bbae 100644
--- a/doc/manual/fr_FR/user_AdvancedTopics.xml
+++ b/doc/manual/fr_FR/user_AdvancedTopics.xml
@@ -897,7 +897,7 @@ VBoxManage controlvm "nom VM" unplugcpu 3</screen></para>
<sect1>
<title>Webcam passthrough</title>
- <sect2>
+ <sect2 id="webcam-passthrough">
<title>Utilisation d'une webcam hôte dans l'invité</title>
<para>VirtualBox 4.3 inclut une fonction expérimentale permettant à un
@@ -913,9 +913,14 @@ VBoxManage controlvm "nom VM" unplugcpu 3</screen></para>
linkend="intro-installing" /> pour plus d'informations.</para>
</note>
+ <para>Vous pouvez connecter la webcam de l'hôte à la VM en utilisant le
+ menu "Périphériques" dans la barre de menus de la VM. Le menu "Webcams"
+ contient une liste des périphériques d'entrée vidéo disponibles sur l'hôte.
+ Un clic sur le nom d'une webcam connecte ou déconnecte le périphérique
+ de l'hôte correspondant.</para>
+
<para>Il faut utiliser l'outil en ligne de commandes VBoxManage pour
- activer le passthrough webcam. A ce jour, certaines commandes ne sont
- pas supportées sur to% les hôtes ; merci de voir les
+ activer le passthrough webcam. Merci de voir les
sections ci-dessous spécifiques aux hôtes pour des détails complémentaires.
Les commandes suivantes sont disponibles :
<itemizedlist>
@@ -931,8 +936,31 @@ VBoxManage controlvm "nom VM" unplugcpu 3</screen></para>
l'hôte.
</para></listitem>
<listitem><para>Connecter une webcam à une VM en fonction :
- <screen>VBoxManage controlvm "nom VM" webcam attach [chemin_hôte_|alias]</screen>
- Ceci connectera une webcam à l'invité.
+ <screen>VBoxManage controlvm "nom VM" webcam attach [chemin_hôte_|alias [paramètres]]</screen>
+ Ceci connectera une webcam à l'invité. Le paramètre
+ <computeroutput>settings</computeroutput> est une chaîne
+ <computeroutput>Paramètre1=Valer1;Paramètre2=Valeur2</computeroutput>, qui
+ permet de configurer la webcam émulée. Les paramètres suivants
+ sont supportés :
+ <itemizedlist>
+ <listitem>
+ <computeroutput>MaxFramerate</computeroutput> La vitesse maximale
+ d'envoi des plans graphiques à l'invité. Une vitesse élevée
+ demande beaucoup de puissance de processeur. Donc, parfois, il
+ vaut mieux mettre une limite plus basse. Par défaut, il n'y a
+ aucune limite et l'invité peut utiliser tous les ratios graphiques
+ supportés par la webcam de l'hôte.
+ </listitem>
+ <listitem>
+ <computeroutput>MaxPayloadTransferSize</computeroutput> Combien d'octets
+ à la fois peut envoyer la webcam à l'invité. La valeur par défaut
+ est de 3060 octets, ce qu'utilisent certaines
+ webcams. Des valeurs supérieures réduisent légèrement la charge du
+ processeur si l'invité peut utiliser des tampons plus gros. Cependant,
+ il se pourrait qu'un <computeroutput>MaxPayloadTransferSize</computeroutput>
+ ne soit pas supporté par certains invités.
+ </listitem>
+ </itemizedlist>
</para></listitem>
<listitem><para>Déconnecter une webcam d'une VM en fonction :
<screen>VBoxManage controlvm "nom VM" webcam detach [chemin_hôte|alias]</screen>
@@ -949,8 +977,6 @@ VBoxManage controlvm "nom VM" unplugcpu 3</screen></para>
<sect2>
<title>Hôtes Windows</title>
- <para>Toutes les commandes de VBoxManage sont implémentées.</para>
-
<para>Quand on déconnecte la webcam de l'hôte, la webcam émulée est
automatiquement déconnectée de l'invité.</para>
</sect2>
@@ -958,7 +984,7 @@ VBoxManage controlvm "nom VM" unplugcpu 3</screen></para>
<sect2>
<title>Hôtes Mac OS X</title>
- <para><computeroutput>VBoxManage list webcams</computeroutput> n'est pa´; enc*¨;e implémentée.</para>
+ <para>OS X version 10.7 ou supérieur est requis.</para>
<para>Quand on déconnecte la webcam de l'hôte, la webcam émulée
reste connectée à l'invité et vous devez la déconnecter à la main en
@@ -968,16 +994,16 @@ VBoxManage controlvm "nom VM" unplugcpu 3</screen></para>
<sect2>
<title>Hôtes Linux</title>
- <para><computeroutput>VBoxManage list webcams</computeroutput> n'est pas encore
- implémentée.</para>
-
- <para>Les alias ne fonctionnent pas. Le chemin de l'hôte de la webcam tel
- que <computeroutput>/dev/video0</computeroutput> doit être utilisé dans les
- commandes attach et detach.</para>
-
- <para>Quand on déconnecte la webcam de l'hôte, la webcam émulée reste connectée
- à l'invité et il faut la déconnecter à la main en utilisant la commande
+ <para>Quand on déconnecte la webcam de l'hôte, la webcam émulée n'est automatiquement
+ déconnectée de de l'invité que si la webcam est en train de transmettre
+ de l'image. Si la webcam est inactive, vous devrez la déconnecter à la
+ main en utilisant la commande
<computeroutput>VBoxManage controlvm "nom VM" webcam detach ...</computeroutput>.</para>
+
+ <para>Les aliases <computeroutput>.0</computeroutput> et
+ <computeroutput>.1</computeroutput> sont associés à <computeroutput>/dev/video0</computeroutput>
+ l'alias <computeroutput>.2</computeroutput> est associé à
+ <computeroutput>/dev/video1</computeroutput> et ainsi de suite.</para>
</sect2>
</sect1>
@@ -1854,8 +1880,7 @@ VBoxManage setextradata "nom VM"
configurer un VLAN pour des VMs. Créez un échantillon VNIC de VirtualBox en
exécutant, en tant qu'administrateur :</para>
- <screen>dladm create-vnic -t -l nge0 -v 23 vboxvnic_template0
-</screen>
+ <screen>dladm create-vnic -t -l nge0 -v 23 vboxvnic_template0</screen>
<para>Cela créera un VNIC temporaire par l'interface "nge0" avec l'ID de VLAN
23. Pour créer des échantillons VNIC résistant aux redémarrages de l'hôte,
@@ -1870,8 +1895,7 @@ vboxvnic_template0 vnic 1500 up -- nge0
$ dladm show-vnic
LINK OVER SPEED MACADDRESS MACADDRTYPE VID
-vboxvnic_template0 nge0 1000 2:8:20:25:12:75 random 23
-</screen></para>
+vboxvnic_template0 nge0 1000 2:8:20:25:12:75 random 23</screen></para>
<para>Une fois que l'échantillon VNIC est créé, toutes les VMs ayant besoin
de faire partie du VLAN 23 par l'interface physique "nge0" pourront utiliser
@@ -3122,8 +3146,7 @@ alice = {
<para>Vous pouvez activer le mode de gestion experte du stockage pour chaque
VM en exécuting :</para>
- <screen>VBoxManage setextradata "nom VM" "VBoxInternal2/SilentReconfigureWhilePaused" 1
-</screen>
+ <screen>VBoxManage setextradata "nom VM" "VBoxInternal2/SilentReconfigureWhilePaused" 1</screen>
<para>Vous pouvez reconfigurer les connexions de supports de stockage pendant
que la VM est en pause en utilisant :</para>
diff --git a/doc/manual/fr_FR/user_ChangeLog.xml b/doc/manual/fr_FR/user_ChangeLog.xml
index fd7fce2..fecc279 100644
--- a/doc/manual/fr_FR/user_ChangeLog.xml
+++ b/doc/manual/fr_FR/user_ChangeLog.xml
@@ -16,7 +16,388 @@
construction contient un numéro de révision.</para>
<sect1>
- <title>Version 4.3.0 (15-10-2013)</title>
+ <title>Version 4.3.4 (2013-xx-xx)</title>
+
+ <para>C'est une version de maintenance. Les éléments suivants ont été
+ corrigés et/ou ajoutés :</para>
+
+ <itemizedlist>
+
+ <listitem>
+ <para>VMM : correction d'un bogue dans l'émulation de Local APIC qui
+ provoquait un BSOD lors du démarrage de certains invités (régression
+ 4.3.0 ; bogue #12240)</para>
+ </listitem>
+
+ <listitem>
+ <para>VMM : correction du chargement des états sauvegardés si
+ VT-x/AMD-V a été désactivé (régression 4.3.0 ; bogue #12291)</para>
+ </listitem>
+
+ <listitem>
+ <para>VMM : correction d'un single-stepping dans l'invité pour certaines
+ instructions (VT-x seulement ; bogue #10947)</para>
+ </listitem>
+
+ <listitem>
+ <para>VMM : correction d'un problème de performance des accès APIC
+ au redémarrage d'une VM (régression 4.#.0 ; VT-x seulement ; bogue #12296)</para>
+ </listitem>
+
+ <listitem>
+ <para>VMM : correction d'une correction TPR qui s'activait pour les
+ invités 32 bits quand le type d'invité choisi est 64 bits (régression
+ 4.3.0 ; AMD-V seulement)</para>
+ </listitem>
+
+ <listitem>
+ <para>VMM : correction d'erreurs <emphasis>VINF_EM_TRIPLE_FAULT</emphasis>
+ occassionnelles sur les hôtes n'ayant pas la fonction d'exécution de
+ l'invité sans restriction (bogue #12198)</para>
+ </listitem>
+
+ <listitem>
+ <para>GUI : on n'ennuie pas l'utilisateur avec un avertissement BPP
+ s'il n'y a pas de suppléments invité installés</para>
+ </listitem>
+
+ <listitem>
+ <para>GUI : correction de dessins d'artifacts dans la fenêtre de la machine
+ au redémarrage de la VM ou au redimensionnement de l'écran de l'invité</para>
+ </listitem>
+
+ <listitem>
+ <para>GUI : on s'assure que la licence et la description affectées
+ sont rattachées à l'applicatif exporté.</para>
+ </listitem>
+
+ <listitem>
+ <para>GUI : correction de bogues dans la gestion des restrictions de laa ferin de la VM
+ (bogue #12333)</para>
+ </listitem>
+
+ <listitem>
+ <para>GUI : correction de mauvaises couleurs du texte des assistant pour
+ des apparences inhabituelles (bogue #11743)</para>
+ </listitem>
+
+ <listitem>
+ <para>GUI : devrait restaurer le mode transparent dès que possible après
++ le redémarrage ou l'extinction de la VM</para>
+ </listitem>
+
+ <listitem>
+ <para>GUI : corrections de plus de numéros de médias</para>
+ </listitem>
+
+ <listitem>
+ <para>GUI : cache le gestionnaire de VM au lieu de fermer la fenêtre quand
+ on appuie sur le bouton Fermer la fenêtre (hôtes Max OS X seulement ; bogue #1772)</para>
+ </listitem>
+
+ <listitem>
+ <para>GUI : les angles chauds d'OS X n'étaient pas accessibles quand
+ VirtualBox VM était ouvert (hôtes Mac OS X seulement ; bogue #4139)</para>
+ </listitem>
+
+ <listitem>
+ <para>Réseau Host-only : correction de la création d'interfaces réseaux host-only
+ (régression 4.3.0 ; bogue #12182)</para>
+ </listitem>
+
+ <listitem>
+ <para>NAT : ne pas faire une boucle infinie si l'hôte ne peut pas
+ accéder à un serveur DNS (régression 4.3.0 ; bogue #12300)</para>
+ </listitem>
+
+ <listitem>
+ <para>NAT : ne reconnecte pas le caâle si les informations de DNS changent
+ et si le câble a été déconnecté auparavant (régression 4.3.0 ; bogue #12225)</para>
+ </listitem>
+
+ <listitem>
+ <para>NAT : correction de plusieurs problèmes au démarrage/fin
+ automatique des réseaux NAT au démarrage/arrêt d'une VM ou lors d'un
+ changement de configuration</para>
+ </listitem>
+
+ <listitem>
+ <para>VBoxNetDHCP : n'empêche pas VBoxSVC de se terminer
+ (bogue #12264)</para>
+ </listitem>
+
+ <listitem>
+ <para>Accélération graphique 2D : correction de plantages lors des bascules
+ entre les modes de présentation
+ (bogue #9194)</para>
+ </listitem>
+
+ <listitem>
+ <para>BusLogic : possibilité de lancer des VMs ayant plus d'un
+ contrôleur SCSI BusLogic activé</para>
+ </listitem>
+
+ <listitem>
+ <para>Clavier : correction d'un plantage de VM si elle est réveillée d'un
+ état sauvegardé et si on a appuyé sur au moins une touche (bogue #11289)</para>
+ </listitem>
+
+ <listitem>
+ <para>VBoxSVC : correction d'une corruption heap$$ dans certaines conditions
+ (régression 4.3.0)</para>
+ </listitem>
+
+ <listitem>
+ <para>VBoxSVC : correction d'un conflit facteur d'accrocs à l'initialisation
+ (bogue #12349)</para>
+ </listitem>
+
+ <listitem>
+ <para>OVF : correction de l'import logique pour les applicatifs OVF qui
+ contiennent plusieurs VMs</para>
+ </listitem>
+
+ <listitem>
+ <para>OVF : amélioration de la logique permettant de trouver un format d'image
+ adéquat à l'import d'un OVF</para>
+ </listitem>
+
+ <listitem>
+ <para>API : correction des informations sur certains événements générés
+ automatiquement (seulement avec XPCOM, seul l'hôte Windows était concerné),
++ qui provoquaient des erreurs lors de la définition d'attributs par le
+ service web
+ (bogue #12379)</para>
+ </listitem>
+
+ <listitem>
+ <para>SDK : extension de la fonctionnalité aux bindings C</para>
+ </listitem>
+
+ <listitem>
+ <para>Contrôle d'invité : diverses correcions (bogues #8072, #11044, #12336, #12338,
+ #12346, #12371)</para>
+ </listitem>
+
+ <listitem>
+ <para>Hôtes Windows : nouvelle tentative de correction de la forte latence
+ de DPC (bogue #6242)</para>
+ </listitem>
+
+ <listitem>
+ <para>Installeur hôte Windows : l'enregistrement des extensions de
+ fichiers est facultatif, depuis une contribution de Tal Aloni (bogue #8009)</para>
+ </listitem>
+
+ <listitem>
+ <para>Hôtes Mac OS X : bonne signature des extensions du noyau pour les
+ hôtes Mavericks (bogue #12256)</para>
+ </listitem>
+
+ <listitem>
+ <para>Hôtes Mac OS X : correction d'un bogue où l'icône VirtualBox restait
+ dans le dock, empêchant l'hôte de s'éteindre (bogue #12241)</para>
+ </listitem>
+
+ <listitem>
+ <para>Hôtes Mac OS X : correction d'un petit problème de l'installeur (bogue #12275)</para>
+ </listitem>
+
+ <listitem>
+ <para>Hôtes / invités Linux : corrections de la compilation avec Linux
+ 3.13 (bogue #12358)</para>
+ </listitem>
+
+ <listitem>
+ <para>Invités Linux : bonne construction du module vboxvideo du noyau
+ sur les invités OL/RHEL 6.1 (bogue #11996)</para>
+ </listitem>
+
+ <listitem>
+ <para>Invités Linux : la 3D fonctionne sur Slackware 14.1
+ (bogue #12320 commentaires 3 et 4)</para>
+ </listitem>
+
+ <listitem>
+ <para>Suppléments invité/3D : correction de dead-lock occasionnel
+ (bogue #12319)</para>
+ </listitem>
+
+ <listitem>
+ <para>Suppléments Windows/3D : correction d'une fuite de mémoire possible (bogue #12228)</para>
+ </listitem>
+
+ <listitem>
+ <para>Suppléments Windows/XPDM : utilisation de tables distinctes contenant
+ les modes graphiques valides de chaque écran virtuel</para>
+ </listitem>
+
+ </itemizedlist>
+ </sect1>
+
+ <sect1>
+ <title>Version 4.3.2 (01-11-2013)</title>
+
+ <para>C'est une version de maintenance. Les éléments suivants ont çté
+ corrigés et/ou ajoutés :</para>
+
+ <itemizedlist>
+
+ <listitem>
+ <para>VMM : correction de la restauration du TSC MSR auxiliaire avec
+ VT-x, qui provoquait des BSODs de l'hôte sur les hôtes Windows 8.1 et
+ un comportement imprévisible sur les autres hôtes
+ (bogue #12237)</para>
+ </listitem>
+
+ <listitem>
+ <para>VMM : fourniture de fausses valeurs pour deux MSRs pour mieux
+ satisfaire l'invité sur certains hôtes</para>
+ </listitem>
+
+ <listitem>
+ <para>VMM : correction de la détection de VT-x sur certaines machines où
+ le BIOS ne définit pas le bit de la fonction VMX LOCK, ce qui touchait
+ les paramètres de la VM dans la GUI</para>
+ </listitem>
+
+ <listitem>
+ <para>VMM : correction d'un $$ TPR threshold qui provoquait des BSODs sur
+les invités Windows XP utilisant l'APIC E/S (VT-x seulement ; bogue #12227)</para>
+ </listitem>
+
+ <listitem>
+ <para>VMM : correction d'une incompatibilité de l'état sauvegardé PATM
+ pour les VMs en virtualisationlogicielle (bogue #12222)</para>
+ </listitem>
+
+ <listitem>
+ <para>VMM : n'échoue pas si AMD-V n'est pas disponible si la VM est
+ configurée pour utiliser la virtualisation logicielle</para>
+ </listitem>
+
+ <listitem>
+ <para>GUI : correction du redimensionnement de l'invité qui se brisait
+ au changement de mode de représentation visuelle
+ (en passant de normal à plein-écran etc)</para>
+ </listitem>
+
+ <listitem>
+ <para>GUI : on s'assure que l'écran de l'invité se redimensionne après la
+ restauration d'une VM d'un état sauvegardé si la taille de l'écran de l'hôte
+ a changé</para>
+ </listitem>
+
+ <listitem>
+ <para>GUI : désactivation de la synchronisation de la led de défilement
+ de la synchronisation des LEDs HID
+ (hôtes Mac OS X seulement)</para>
+ </listitem>
+
+ <listitem>
+ <para>Amélioration du support du webcam passthrough avec le support GUI (voir
+ <xref linkend="webcam-passthrough" />)</para>
+ </listitem>
+
+ <listitem>
+ <para>Contrôle invité : implémentation de davantage de méthodes
+ <computeroutput>IGuestSession</computeroutput></para>
+ </listitem>
+
+ <listitem>
+ <para>Contrôle invité : ajout du support de l'effacement et du renommage
+ des fichiers et des répertoires de l'invité dans
+ VBoxManage</para>
+ </listitem>
+
+ <listitem>
+ <para>Contrôle invité : diverses corrections de bogues</para>
+ </listitem>
+
+ <listitem>
+ <para>API : mauvaise gestion de la valeur par défaut de l'UUID du matériel,
+ si bien que tous les UUIDs DMI/SMBIOS sont de zéro, ce qui amène Windows
+ à demander la ré-activation (régression 4.3 ; bogue #12244)</para>
+ </listitem>
+
+ <listitem>
+ <para>Support 3D : correction d'un plantge à l'extinction si l'accélération
+ graphique 2D est activée (hôtes Mac OS X seulement)</para>
+ </listitem>
+
+ <listitem>
+ <para>Support 3D : corrections de généralités</para>
+ </listitem>
+
+ <listitem>
+ <para>Stockage : correction de la détection d'un CD/DVD quand on vient
+ d'un lecteur vide à celui de l'hôte quand passthrough est activé</para>
+ </listitem>
+
+ <listitem>
+ <para>Stockage : correction d'un accroc du processus de VM quand le disque
+ est plein dans certaines circonstances</para>
+ </listitem>
+
+ <listitem>
+ <para>NAT : écoute des changements de paramétrages du réseau NAT au moment
+ de l'exécution.</para>
+ </listitem>
+
+ <listitem>
+ <para>NAT : le serveur DHCP du réseau NAT enregistre maintenant les baux
+ de façon permanente</para>
+ </listitem>
+
+ <listitem>
+ <para>Principal : modifications du moniteur dans la configuration du
+ DNS de l'hôte</para>
+ </listitem>
+
+ <listitem>
+ <para>Hôte Mac OS X : on a retravaillé un mécanisme d'ajout d'une icône
+ de bureau d'une VM à partir du sélecteur de VM</para>
+ </listitem>
+
+ <listitem>
+ <para>Installeur Mac OS X : suppression des anciennes extensions du noyau
+ à la mise à jour (bogue #12258)</para>
+ </listitem>
+
+ <listitem>
+ <para>Suppléments Linux : bon réglage de l'umask avant l'-installation
+ (bogue #12166)</para>
+ </listitem>
+
+ <listitem>
+ <para>Suppléments X11/3D : correction de gels au démarrage d'un bureau 3D
+ (bogue #11503, merci à Sam Spilsbury)</para>
+ </listitem>
+
+ <listitem>
+ <para>Suppléments X11/3D : correctin de la largeur du support de tampon
+ (bogue #11905)</para>
+ </listitem>
+
+ <listitem>
+ <para>Suppléments X11/3D : correction du thème Age Of Empires 3 (l'âge des
+ Empires 3 (bogue #11331)</para>
+ </listitem>
+
+ <listitem>
+ <para>Suppléments Windows/3D : correction de l'affichage du greffon
+ Google Earth</para>
+ </listitem>
+
+ <listitem>
+ <para>Suppléments Windows/WDDM : corrections du redimensionnement automatique</para>
+ </listitem>
+
+ </itemizedlist>
+ </sect1>
+
+ <sect1>
+ <title>Version 4.3.0 (2013-10-15)</title>
<para>C'est une mise à jour majeure. Les nouvelles fonctions suivantes ont
été ajoutées :</para>
diff --git a/doc/manual/fr_FR/user_GuestAdditions.xml b/doc/manual/fr_FR/user_GuestAdditions.xml
index ddbf7de..be852a3 100644
--- a/doc/manual/fr_FR/user_GuestAdditions.xml
+++ b/doc/manual/fr_FR/user_GuestAdditions.xml
@@ -241,8 +241,8 @@
<title>Installation</title>
<para>Dans le menu "Périphériques" de la barre de menu de la machine
- virtuelle, VirtualBox a un élément de menu tout prêt nommé "Installer
- les suppléments invité", qui monte le fichier ISO des suppléments invité
+ virtuelle, VirtualBox a un élément de menu tout prêt nommé "Insérer l'image
+ du CD des suppléments invité", qui monte le fichier ISO des suppléments invité
dans votre machine virtuelle. L'invité Windows devrait alors démarrer
automatiquement l'installeur des suppléments invité qui installe les
suppléments invité dans votre invité Windows. Les autres systèmes
@@ -1591,8 +1591,7 @@ VirtualBox Command Line Management Interface Version $VBOX_VERSION_MAJOR.$VBOX_V
(C) 2005-$VBOX_C_YEAR $VBOX_VENDOR
All rights reserved.
-Value: Windows Vista Business Edition
-</screen></para>
+Value: Windows Vista Business Edition</screen></para>
<para>Pour ajouter ou modifier des propriétés invité depuis l'invité, utilisez l'outil
<computeroutput>VBoxControl</computeroutput>. Cet outil est inclu dans les
diff --git a/doc/manual/fr_FR/user_VBoxManage.xml b/doc/manual/fr_FR/user_VBoxManage.xml
index b15fcf2..c0344ed 100644
--- a/doc/manual/fr_FR/user_VBoxManage.xml
+++ b/doc/manual/fr_FR/user_VBoxManage.xml
@@ -84,8 +84,7 @@ All rights reserved.
Virtual machine 'SUSE 10.2' is created.
UUID: c89fc351-8ec6-4f02-a048-57f4d25288e5
-Settings file: '/home/nomutilisateur/.config/VirtualBox/Machines/SUSE 10.2/SUSE 10.2.xml'
-</screen>
+Settings file: '/home/nomutilisateur/.config/VirtualBox/Machines/SUSE 10.2/SUSE 10.2.xml'</screen>
<para>Comme vous pouvez le voir dans la sortie ci-dessus, une nouvelle
machine virtuelle a été créée avec le nouvel UUID et un nouveau fichier
@@ -366,8 +365,7 @@ USB Device Filters:
Shared folders:
<none>
-Statistics update: disabled
-</screen></para>
+Statistics update: disabled</screen></para>
</sect1>
<sect1 id="vboxmanage-registervm">
@@ -1721,8 +1719,7 @@ Virtual system 0:
[--username <username>]
[--password <password>]
[--initiator <initiator>]
- [--intnet]
-</screen>
+ [--intnet]</screen>
<para>Un certain nombre de paramètres sont requis classiquement ; ceux
à la fin de la liste ne sont requis que pour les cibles iSCSI (voir ci-dessous).</para>
@@ -2007,7 +2004,7 @@ Virtual system 0:
[--add <ide/sata/scsi/floppy>]
[--controller <LsiLogic|LSILogicSAS|BusLogic|
IntelAhci|PIIX3|PIIX4|ICH6|I82078>]
- [--sataportcount <1-30>]
+ [--portcount <1-30>]
[--hostiocache on|off]
[--bootable on|off]
[--remove]</screen>
@@ -2048,7 +2045,7 @@ Virtual system 0:
</glossentry>
<glossentry>
- <glossterm>sataportcount</glossterm>
+ <glossterm>--portcount</glossterm>
<glossdef>
<para>Ceci détermine le nombre de ports que le contrôleur SATA
@@ -3196,6 +3193,235 @@ Value: 2006.01.01</screen>
</glosslist></para>
</listitem>
+ <listitem>
+ <para><emphasis role="bold"><computeroutput>removedirectory</computeroutput></emphasis>,
+ qui permet d'effacer des répertoires dans l'invité (seulement ceux où
+ sont installés les suppléments invité 4.3.2 et supérieur).</para>
+
+ <screen>VBoxManage guestcontrol <uuid|nomvm> removedir[ectory]|rmdir
+ <répertoire invité>... --username <nom>
+ [--passwordfile <fichier> | --password <mot_de_passe>]
+ [--recursive|-R|-r] [--verbose]</screen>
+
+ <para>où les paramètres signifient : <glosslist>
+ <glossentry>
+ <glossterm><computeroutput>uuid|nomvm</computeroutput></glossterm>
+
+ <glossdef>
+ <para>L'UUID ou le nom de la VM. Obligatoire.</para>
+ </glossdef>
+ </glossentry>
+
+ <glossentry>
+ <glossterm><computeroutput>répertoire à supprimer dans l'invité</computeroutput></glossterm>
+
+ <glossdef>
+ <para>Chemin absolu du/des répertoire(s) à supprimer sur
+ l'invité, par exemple <computeroutput>D:\Foo\Bar</computeroutput>.
+ L'utilisateur spécifié doit avoir les bons droits pour effacer
+ le(s) répertoire(s) de l'invité spécifié(s).</para>
+ </glossdef>
+ </glossentry>
+
+ <glossentry>
+ <glossterm><computeroutput>--username <nom></computeroutput></glossterm>
+
+ <glossdef>
+ <para>Nom d'utilisateur sous lequel devrait fonctionner le
+ processus de copie. Cet utilisateur doit exister sur l'OS invité.</para>
+ </glossdef>
+ </glossentry>
+
+ <glossentry>
+ <glossterm><computeroutput>--passwordfile <fichier></computeroutput></glossterm>
+
+ <glossdef>
+ <para>Mot de passe du compte utilisateur spécifié qui lit le
+ fichier donné. Si vous n'en mettez pas, on supposera un mot de
+ passe vide.</para>
+ </glossdef>
+ </glossentry>
+
+ <glossentry>
+ <glossterm><computeroutput>--password <mot_de_passe></computeroutput></glossterm>
+
+ <glossdef>
+ <para>Mot de passe du compte utilisateur spécifié par
+ <computeroutput>--username</computeroutput>. Si vous n'en donnez pas, on supposera un mot de
+ passe vide.</para>
+ </glossdef>
+ </glossentry>
+
+ <glossentry>
+ <glossterm><computeroutput>--recursive</computeroutput></glossterm>
+
+ <glossdef>
+ <para>Supprime des répertoires et, récursivement, leur contenu.</para>
+ </glossdef>
+ </glossentry>
+
+ <glossentry>
+ <glossterm><computeroutput>--verbose</computeroutput></glossterm>
+ <glossdef>
+ <para>Dit à VBoxManage d'être plus bavard.</para>
+ </glossdef>
+ </glossentry>
+ </glosslist></para>
+ </listitem>
+
+ <listitem>
+ <para><emphasis role="bold"><computeroutput>removefile</computeroutput></emphasis>,
+ qui permet d'effacer des fichiers sur l'invité (seulement là où sont
+ installés les suppléments invité 4.3.2 et supérieur).</para>
+
+ <screen>VBoxManage guestcontrol <uuid|nomvm> removefile|rm
+ <fichier_d_invité>... --username <nom>
+ [--passwordfile <fichier> | --password <mot_de_passe>]
+ [--verbose]</screen>
+
+ <para>où les paramètres signifient : <glosslist>
+ <glossentry>
+ <glossterm><computeroutput>uuid|nomvm</computeroutput></glossterm>
+
+ <glossdef>
+ <para>L'UUID ou le nom de la VM. Obligatoire.</para>
+ </glossdef>
+ </glossentry>
+
+ <glossentry>
+ <glossterm><computeroutput>fichier à supprimer dans l'invité</computeroutput></glossterm>
+
+ <glossdef>
+ <para>Chemin absolu du/des fichier(s) à supprimer sur
+ l'invité, comme <computeroutput>D:\Foo\Bar\text.txt</computeroutput>.
+ L'utilisateur spécifié doit avoir les bons droits pour effacer
+ les fichiers spécifiés sur l'invité.</para>
+ </glossdef>
+ </glossentry>
+
+ <glossentry>
+ <glossterm><computeroutput>--username <nom></computeroutput></glossterm>
+
+ <glossdef>
+ <para>Nom d'utilisateur sous lequel devrait fonctionner le
+ processus de copie. Cet utilisateur doit exister sur l'OS invité.</para>
+ </glossdef>
+ </glossentry>
+
+ <glossentry>
+ <glossterm><computeroutput>--passwordfile <fichier></computeroutput></glossterm>
+
+ <glossdef>
+ <para>Mot de passe du compte utilisateur spécifié qui lit le
+ fichier donné. Si vous n'en mettez pas, on supposera un mot de
+ passe vide.</para>
+
+ </glossdef>
+ </glossentry>
+
+ <glossentry>
+ <glossterm><computeroutput>--password <mot_de_passe></computeroutput></glossterm>
+
+ <glossdef>
+ <para>Mot de passe du compte utilisateur spécifié avec
+ <computeroutput>--username</computeroutput>. Si vous n'en
+ donnez pas, un mot de passe vierge est supposé.</para>
+ </glossdef>
+ </glossentry>
+
+ <glossentry>
+ <glossterm><computeroutput>--verbose</computeroutput></glossterm>
+
+ <glossdef>
+ <para>Dit à VBoxManage d'être plus bavard.</para>
+ </glossdef>
+ </glossentry>
+ </glosslist></para>
+ </listitem>
+
+ <listitem>
+ <para><emphasis role="bold"><computeroutput>ren[ame]|mv</computeroutput></emphasis>,
+ qui permet de renommer des fichiers (ou des répertoires) dans l'invité
+ (seulement là où sont installés les suppléments invité 4.3.2 et
+ supérieur).</para>
+
+ <screen>VBoxManage guestcontrol <uuid|nomvm> ren[ame]|mv
+ <source>... <dest> --username <nom>
+ [--passwordfile <fichier> | --password <mot_de_passe>]
+ [--verbose]</screen>
+
+ <para>où les paramètres signifient : <glosslist>
+ <glossentry>
+ <glossterm><computeroutput>uuid|nomvm</computeroutput></glossterm>
+
+ <glossdef>
+ <para>L'UUID ou le nom de la VM.</para>
+ </glossdef>
+ </glossentry>
+
+ <glossentry>
+ <glossterm><computeroutput>source</computeroutput></glossterm>
+
+ <glossdef>
+ <para>Chemin absolu d'une ou plusieurs sources à déplacer
+ quelque part. Si vous spécifiez plus d'une source, la destination
+ doit être un répertoire existant sur la VM. L'utilisateur
+ spécifié doit avoir les bons droits d'accès aux fichiers et
+ aux répertoires sources et de destination.</para>
+ </glossdef>
+ </glossentry>
+
+ <glossentry>
+ <glossterm><computeroutput>dest</computeroutput></glossterm>
+
+ <glossdef>
+ <para>Chemin absolu de la destination où déplacer le/les
+ source(s). Il peut s'agir d'un répertoire ou d'un fichier, selon
+ que vous spécifiez une ou plusieurs sources. L'utilisateur
+ spécifié doit avoir les bons droits d'accès au fichier et au
+ répertoire de.</para>
+ </glossdef>
+ </glossentry>
+
+ <glossentry>
+ <glossterm><computeroutput>--username <nom></computeroutput></glossterm>
+
+ <glossdef>
+ <para>Nom de l'utilisateur sous lequel fonctionne le processus
+ de copie. Cet utilisateur doit exister sur l'OS invité.</para>
+ </glossdef>
+ </glossentry>
+
+ <glossentry>
+ <glossterm><computeroutput>--passwordfile <fichier></computeroutput></glossterm>
+
+ <glossdef>
+ <para>Mot de passe du compte utilisateur spécifié d'où lire
+ l'invité donné. Si vous n'en donnez pas, on suppose un mot de
+ paasse vide.</para>
+ </glossdef>
+ </glossentry>
+
+ <glossentry>
+ <glossterm><computeroutput>--password <mot_de_passe></computeroutput></glossterm>
+
+ <glossdef>
+ <para>Mot de passe du compte utilisateur spécifié avec
+ <computeroutput>--username</computeroutput>. Si vous n'en
+ donnez pas, on suppose un mot de passe vide.</para>
+ </glossdef>
+ </glossentry>
+
+ <glossentry>
+ <glossterm><computeroutput>--verbose</computeroutput></glossterm>
+
+ <glossdef>
+ <para>Dit à VBoxManage d'être plus bavard.</para>
+ </glossdef>
+ </glossentry>
+ </glosslist></para>
+ </listitem>
+
<listitem>
<para><emphasis role="bold"><computeroutput>createtemporary</computeroutput></emphasis>,
qui permet de copier des fichiers de l'hôte sur l'invité (seulement
diff --git a/doc/manual/user_ChangeLogImpl.xml b/doc/manual/user_ChangeLogImpl.xml
index 0e5a78f..453ff0f 100644
--- a/doc/manual/user_ChangeLogImpl.xml
+++ b/doc/manual/user_ChangeLogImpl.xml
@@ -1,6 +1,335 @@
<?xml version="1.0" encoding="UTF-8"?>
<sect1>
+ <title>Version 4.3.6 (2013-12-18)</title>
+
+ <para>This is a maintenance release. The following items were fixed and/or
+ added:</para>
+
+ <itemizedlist>
+
+ <listitem>
+ <para>VMM: fixed a Guru Meditation <emphasis>VINF_EM_TRIPLE_FAULT</emphasis>
+ caused by VMCB caching with nested paging on certain AMD CPUs (bug #12451)</para>
+ </listitem>
+
+ <listitem>
+ <para>VMM: fixed a Guru Meditation <emphasis>VERR_VMX_UNEXPECTED_INTERRUPTION_EXIT_TYPE</emphasis>
+ while intercepting debug exceptions (VT-x only; bug #12410)</para>
+ </listitem>
+
+ <listitem>
+ <para>VMM: fixed a Guru Meditation <emphasis>VERR_SVM_UNEXPECTED_EXIT</emphasis>
+ while intercepting debug register accesses (AMD-V only; bug #12481)</para>
+ </listitem>
+
+ <listitem>
+ <para>VMM: fixed a <emphasis>VERR_SSM_STRUCTURE_MAGIC</emphasis> error when trying
+ to load a saved state made with VBox 4.3.4 when VT-x/AMD-V is disabled. Unfortunately,
+ VBox 4.3.4 produced broken saved states for this configuration so you have to discard
+ these states (bug #12414)</para>
+ </listitem>
+
+ <listitem>
+ <para>VMM: added a few more MSRs to the whitelist required by certain guests
+ (bug #12245)</para>
+ </listitem>
+
+ <listitem>
+ <para>GUI: fixed deleting of inaccessible VMs (4.3 regression, bug
+ #12205)</para>
+ </listitem>
+
+ <listitem>
+ <para>GUI: fixed warnings in VM settings / number of guest processors
+ (bug #12480)</para>
+ </listitem>
+
+ <listitem>
+ <para>Main: don't automatically enable 64-bit guests on 64-bit hosts if
+ VT-x/AMD-V is not available (bug #12424)</para>
+ </listitem>
+
+ <listitem>
+ <para>Main: always expose the DMI memory information to Windows 2012 guests
+ (bug #12017)</para>
+ </listitem>
+
+ <listitem>
+ <para>Main: fixed occasional crashes on guest display resolution change
+ (bug #7063)</para>
+ </listitem>
+
+ <listitem>
+ <para>Main: fixed reporting back temporary name when calling
+ <emphasis>IGuestSession::DirectoryCreateTemp()</emphasis> (bug #12498)</para>
+ </listitem>
+
+ <listitem>
+ <para>API: fix for a hang when launching a GUI VM through the API, which crashes
+ due to GUI unavailability</para>
+ </listitem>
+
+ <listitem>
+ <para>Storage: fix for <emphasis>BLKCACHE_IOERR</emphasis> runtime errors under
+ rare circumstances (bug #11030)</para>
+ </listitem>
+
+ <listitem>
+ <para>Network: allow to start more than 5 PCNet instances (bug #12426)</para>
+ </listitem>
+
+ <listitem>
+ <para>E1000: if the cable was disconnected before the guest initialized
+ the device, the link status was not properly set to 'down' after the
+ initialization completed despite the fact that there was no connection</para>
+ </listitem>
+
+ <listitem>
+ <para>3D support: fixed offset of guest 3D image elements (Mac OS X Retina
+ hosts only; bug #11021)</para>
+ </listitem>
+
+ <listitem>
+ <para>Solaris hosts: fixed accessing the host driver from non-global zones
+ (4.3 regression, bug #12271)</para>
+ </listitem>
+
+ </itemizedlist>
+
+ </sect1>
+
+ <sect1>
+ <title>Version 4.3.4 (2013-11-29)</title>
+
+ <para>This is a maintenance release. The following items were fixed and/or
+ added:</para>
+
+ <itemizedlist>
+
+ <listitem>
+ <para>VMM: fix for a bug in the Local APIC emulation causing a BSOD when
+ booting certain guests (4.3.0 regression; bug #12240)</para>
+ </listitem>
+
+ <listitem>
+ <para>VMM: fixed loading of saved states if VT-x/AMD-V was disabled
+ (4.3.2 regression; bug #12291)</para>
+ </listitem>
+
+ <listitem>
+ <para>VMM: fixed single-stepping inside the guest for certain
+ instructions (VT-x only; bug #10947)</para>
+ </listitem>
+
+ <listitem>
+ <para>VMM: fixed a performance issue involving APIC accesses after rebooting
+ a VM (4.3.0 regression; VT-x only; bug #12296)</para>
+ </listitem>
+
+ <listitem>
+ <para>VMM: fixed TPR patching to be enabled for 32-bit guests even when
+ the chosen guest type is 64-bit (4.3.0 regression; AMD-V only)</para>
+ </listitem>
+
+ <listitem>
+ <para>VMM: fixed occassional <emphasis>VINF_EM_TRIPLE_FAULT</emphasis> errors on
+ hosts without the unrestricted guest execution feature (bug #12198)</para>
+ </listitem>
+
+ <listitem>
+ <para>GUI: don't bother the user with the BPP warning if no
+ Guest Additions are installed</para>
+ </listitem>
+
+ <listitem>
+ <para>GUI: fixed machine-window paint artifacts on VM reboot / guest-screen
+ resize</para>
+ </listitem>
+
+ <listitem>
+ <para>GUI: make sure the assigned license and description are attached to
+ the exported appliance</para>
+ </listitem>
+
+ <listitem>
+ <para>GUI: fixed bugs in close VM action restrictions handling (bug #12333)</para>
+ </listitem>
+
+ <listitem>
+ <para>GUI: fixed incorrect wizards text colors for some unusual
+ look and feel styles (bug #11743)</para>
+ </listitem>
+
+ <listitem>
+ <para>GUI: should restore seamless mode as soon as possible after
+ VM reboot or shutdown</para>
+ </listitem>
+
+ <listitem>
+ <para>GUI: fixes for medium enumeration</para>
+ </listitem>
+
+ <listitem>
+ <para>GUI: the OS X hot corners were not accessible while a VirtualBox VM
+ is running (Mac OS X hosts only; bug #4139)</para>
+ </listitem>
+
+ <listitem>
+ <para>GUI: fixed an old bug which bared the host from cleanly shutdown / reboot
+ if the VM selector window is open (Mac OS X hosts only; bug #8254)</para>
+ </listitem>
+
+ <listitem>
+ <para>Host-only Networking: fixed creating of host-only network interfaces
+ (4.3.0 regression; bug #12182)</para>
+ </listitem>
+
+ <listitem>
+ <para>NAT: don't run into an infinite loop in case the host cannot
+ access any DNS server (4.3.0 regression; bug #12300)</para>
+ </listitem>
+
+ <listitem>
+ <para>NAT: don't re-connect the cable if the DNS information changes
+ and the cable was disconnected before (4.3.0 regression; bug #12225)</para>
+ </listitem>
+
+ <listitem>
+ <para>NAT: fixed several issues with automatically starting /
+ terminating of NAT networks on VM start / stop and configuration
+ changes</para>
+ </listitem>
+
+ <listitem>
+ <para>VBoxNetDHCP: don't block prevent VBoxSVC from terminating
+ (bug #12264)</para>
+ </listitem>
+
+ <listitem>
+ <para>2D Video acceleration: fix crashes on presentation mode switches
+ (bug #9194)</para>
+ </listitem>
+
+ <listitem>
+ <para>BusLogic: allow to run VMs with more than one BusLogic SCSI
+ controller enabled</para>
+ </listitem>
+
+ <listitem>
+ <para>Keyboard: fixed a VM crash if a VM was resumed from a saved state
+ where at least one key was pressed (bug #11289)</para>
+ </listitem>
+
+ <listitem>
+ <para>VBoxSVC: fixed a heap corruption under certain conditions (4.3.0
+ regression)</para>
+ </listitem>
+
+ <listitem>
+ <para>VBoxSVC: fixed a race leading to a hang during initialization
+ (bug #12349)</para>
+ </listitem>
+
+ <listitem>
+ <para>OVF: fixed import logic for OVF appliances containing multiple
+ VMs</para>
+ </listitem>
+
+ <listitem>
+ <para>OVF: improved logic for finding an appropriate image format
+ during OVF import</para>
+ </listitem>
+
+ <listitem>
+ <para>API: block the removal of the current snapshot if it has child
+ snapshots (only relevant for VMs without snapshottable hard disks,
+ their presence always prevented removal), which resulted in VM
+ config corruption</para>
+ </listitem>
+
+ <listitem>
+ <para>API: mark VM configs with snapshots but without current snapshot
+ as inaccessible, as this combination is nonsense</para>
+ </listitem>
+
+ <listitem>
+ <para>API: fixed information for some automatically generated events
+ (only with XPCOM, Windows host was not affected), which caused
+ errors when getting some of the attributes over the webservice
+ (bug #12379)</para>
+ </listitem>
+
+ <listitem>
+ <para>SDK: extended the functionality coverage for the C bindings</para>
+ </listitem>
+
+ <listitem>
+ <para>Guest Control: various bugfixes and improved VBoxManage help
+ (bugs #8072, #11044, #12336, #12338, #12346, #12371)</para>
+ </listitem>
+
+ <listitem>
+ <para>Windows hosts: another attempt to fix the massive DPC latency
+ (bug #6242)</para>
+ </listitem>
+
+ <listitem>
+ <para>Windows host installer: make registering file extensions optional,
+ contributed by Tal Aloni (bug #8009)</para>
+ </listitem>
+
+ <listitem>
+ <para>Mac OS X hosts: properly sign the kernel extensions for Mavericks
+ hosts (bug #12256)</para>
+ </listitem>
+
+ <listitem>
+ <para>Mac OS X hosts: fixed a bug where the VirtualBox dock icon was
+ not properly removed from the dock after a VM terminated preventing
+ Mavericks hosts from shutting down (bug #12241)</para>
+ </listitem>
+
+ <listitem>
+ <para>Mac OS X hosts: fixed minor installer issue (bug #12275)</para>
+ </listitem>
+
+ <listitem>
+ <para>Linux hosts / guests: Linux 3.13 compile fixes (bug #12358)</para>
+ </listitem>
+
+ <listitem>
+ <para>Linux guests: build the vboxvideo kernel module correctly on
+ OL/RHEL 6.1 guests (bug #11996)</para>
+ </listitem>
+
+ <listitem>
+ <para>Linux guests: make 3D work on Slackware 14.1
+ (bug #12320 comments 3 and 4)</para>
+ </listitem>
+
+ <listitem>
+ <para>Guest Additions/3D: fixed an occasional dead-lock (bug #12319)</para>
+ </listitem>
+
+ <listitem>
+ <para>Windows Additions/3D: fixed possible memory leaking (bug #12228)</para>
+ </listitem>
+
+ <listitem>
+ <para>Windows Additions/XPDM: use separate tables containing valid video
+ modes for each virtual monitor</para>
+ </listitem>
+
+ <listitem>
+ <para>Windows Additions: fixed automatic logins for Vista and newer Windows
+ guests (bug #12332)</para>
+ </listitem>
+
+ </itemizedlist>
+ </sect1>
+
+ <sect1>
<title>Version 4.3.2 (2013-11-01)</title>
<para>This is a maintenance release. The following items were fixed and/or
@@ -41,7 +370,7 @@
<listitem>
<para>GUI: fixed guest resize breakage on visual representation mode change
- (when switching from normal to fullscreen etc)</para>
+ (when switching from normal to fullscreen etc)</para>
</listitem>
<listitem>
diff --git a/include/VBox/DevPCNet.h b/include/VBox/DevPCNet.h
deleted file mode 100644
index 1729b37..0000000
--- a/include/VBox/DevPCNet.h
+++ /dev/null
@@ -1,99 +0,0 @@
-/** @file
- * DevPCNet - Private guest interface for the PCNet device. (DEV)
- */
-
-/*
- * Copyright (C) 2008-2010 Oracle Corporation
- *
- * This file is part of VirtualBox Open Source Edition (OSE), as
- * available from http://www.virtualbox.org. This file is free software;
- * you can redistribute it and/or modify it under the terms of the GNU
- * General Public License (GPL) as published by the Free Software
- * Foundation, in version 2 as it comes in the "COPYING" file of the
- * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
- * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
- *
- * The contents of this file may alternatively be used under the terms
- * of the Common Development and Distribution License Version 1.0
- * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
- * VirtualBox OSE distribution, in which case the provisions of the
- * CDDL are applicable instead of those of the GPL.
- *
- * You may elect to license modified versions of this file under the
- * terms and conditions of either the GPL or the CDDL or both.
- */
-
-#ifndef ___VBox_DevPCNet_h
-#define ___VBox_DevPCNet_h
-
-#include <iprt/types.h>
-
-/** @defgroup grp_devpcnet AMD PCnet-PCI II / PCnet-FAST III (Am79C970A / Am79C973) Ethernet Controller Emulation.
- * {
- */
-
-#define PCNET_GUEST_INTERFACE_VERSION (1)
-#define PCNET_GUEST_SHARED_MEMORY_SIZE _512K
-#define PCNET_GUEST_TX_DESCRIPTOR_SIZE 16
-#define PCNET_GUEST_RX_DESCRIPTOR_SIZE 16
-#define PCNET_GUEST_MAX_TX_DESCRIPTORS 128
-#define PCNET_GUEST_MAX_RX_DESCRIPTORS 256
-#define PCNET_GUEST_NIC_BUFFER_SIZE 1536
-
-/* 256*16 + 128*16 + 256*1536 + 128*1536 = 582KB */
-
-/**
- * The header of the PCNet shared memory (VBox specific).
- */
-#pragma pack(1) /* paranoia */
-typedef struct
-{
- /** The size of the shared memory that's being used.
- * (This is <= PCNET_GUEST_SHARED_MEMORY_SIZE.) */
- uint32_t cbUsed;
- /** Version (PCNET_GUEST_INTERFACE_VERSION). */
- uint32_t u32Version;
- /** Flags (See PCNET_GUEST_FLAGS_*). */
- uint32_t fFlags;
- /** Align the following members to 64 bit. */
- uint32_t u32Alignment;
-
- union
- {
- struct
- {
- /** The size (in bytes) of the transmit descriptor array. */
- uint32_t cbTxDescriptors;
- /** The size (in bytes) of the receive descriptor array. */
- uint32_t cbRxDescriptors;
- /** Offset of the transmit descriptors relative to this header. */
- uint32_t offTxDescriptors;
- /** Offset of the receive descriptors relative to this header. */
- uint32_t offRxDescriptors;
- /** Offset of the transmit buffers relative to this header. */
- uint32_t offTxBuffers;
- /** Offset of the receive buffers relative to this header. */
- uint32_t offRxBuffers;
- } V1;
- } V;
-
-} PCNETGUESTSHAREDMEMORY;
-#pragma pack()
-/** Pointer to the PCNet shared memory header. */
-typedef PCNETGUESTSHAREDMEMORY *PPCNETGUESTSHAREDMEMORY;
-/** Const pointer to the PCNet shared memory header. */
-typedef const PCNETGUESTSHAREDMEMORY *PCPCNETGUESTSHAREDMEMORY;
-
-/** @name fFlags definitions
- * @{
- */
-/** Host admits existence private PCNet interface. */
-#define PCNET_GUEST_FLAGS_ADMIT_HOST RT_BIT(0)
-/** Guest admits using the private PCNet interface. */
-#define PCNET_GUEST_FLAGS_ADMIT_GUEST RT_BIT(1)
-/** @} */
-
-/** @} */
-
-#endif
-
diff --git a/include/VBox/RemoteDesktop/VRDEInput.h b/include/VBox/RemoteDesktop/VRDEInput.h
index 15d217c..093591e 100644
--- a/include/VBox/RemoteDesktop/VRDEInput.h
+++ b/include/VBox/RemoteDesktop/VRDEInput.h
@@ -138,6 +138,7 @@ typedef struct VRDEINPUT_SC_READY_PDU
} VRDEINPUT_SC_READY_PDU;
#define VRDEINPUT_PROTOCOL_V1 0x00010000
+#define VRDEINPUT_PROTOCOL_V101 0x00010001
/* RDPINPUT_CS_READY_PDU */
typedef struct VRDEINPUT_CS_READY_PDU
diff --git a/include/VBox/VMMDev.h b/include/VBox/VMMDev.h
index 5fe1d1d..d010cc6 100644
--- a/include/VBox/VMMDev.h
+++ b/include/VBox/VMMDev.h
@@ -116,6 +116,10 @@ RT_C_DECLS_BEGIN
/** Maximum request packet size. */
#define VMMDEV_MAX_VMMDEVREQ_SIZE _1M
+/** Maximum number of HGCM parameters. */
+#define VMMDEV_MAX_HGCM_PARMS 1024
+/** Maximum total size of hgcm buffers in one call. */
+#define VMMDEV_MAX_HGCM_DATA_SIZE UINT32_C(0x7FFFFFFF)
/**
* VMMDev request types.
diff --git a/include/VBox/settings.h b/include/VBox/settings.h
index eaf55b1..96fc8ba 100644
--- a/include/VBox/settings.h
+++ b/include/VBox/settings.h
@@ -367,9 +367,9 @@ struct NATNetwork
bool fNeedDhcpServer;
NATRuleList llPortForwardRules4;
NATRuleList llPortForwardRules6;
- NATNetwork():fEnabled(false),
+ NATNetwork():fEnabled(true),
fAdvertiseDefaultIPv6Route(false),
- fNeedDhcpServer(false)
+ fNeedDhcpServer(true)
{}
bool operator==(const NATNetwork &n) const
{
@@ -1273,7 +1273,7 @@ private:
void readDebugging(const xml::ElementNode *pElmDbg, Debugging *pDbg);
void readAutostart(const xml::ElementNode *pElmAutostart, Autostart *pAutostart);
void readGroups(const xml::ElementNode *elmGroups, StringsList *pllGroups);
- void readSnapshot(uint32_t depth, const xml::ElementNode &elmSnapshot, Snapshot &snap);
+ bool readSnapshot(const com::Guid &curSnapshotUuid, uint32_t depth, const xml::ElementNode &elmSnapshot, Snapshot &snap);
void convertOldOSType_pre1_5(com::Utf8Str &str);
void readMachine(const xml::ElementNode &elmMachine);
diff --git a/include/VBox/sup.h b/include/VBox/sup.h
index ef3027a..7f94cca 100644
--- a/include/VBox/sup.h
+++ b/include/VBox/sup.h
@@ -1294,6 +1294,13 @@ SUPR3DECL(int) SUPR3TracerDeregisterModule(struct VTGOBJHDR *pVtgHdr);
*/
SUPDECL(void) SUPTracerFireProbe(struct VTGPROBELOC *pVtgProbeLoc, uintptr_t uArg0, uintptr_t uArg1, uintptr_t uArg2,
uintptr_t uArg3, uintptr_t uArg4);
+/**
+ * Resume built-in keyboard on MacBook Air and Pro hosts.
+ *
+ * @returns VBox status code.
+ */
+SUPR3DECL(int) SUPR3ResumeSuspendedKeyboards(void);
+
/** @} */
#endif /* IN_RING3 */
diff --git a/include/VBox/usblib-darwin.h b/include/VBox/usblib-darwin.h
index a767cc0..d46a9e2 100644
--- a/include/VBox/usblib-darwin.h
+++ b/include/VBox/usblib-darwin.h
@@ -4,7 +4,7 @@
*/
/*
- * Copyright (C) 2007-2010 Oracle Corporation
+ * Copyright (C) 2007-2013 Oracle Corporation
*
* This file is part of VirtualBox Open Source Edition (OSE), as
* available from http://www.virtualbox.org. This file is free software;
diff --git a/include/VBox/vd-ifs-internal.h b/include/VBox/vd-ifs-internal.h
index 22f0c9f..41c551f 100644
--- a/include/VBox/vd-ifs-internal.h
+++ b/include/VBox/vd-ifs-internal.h
@@ -557,7 +557,7 @@ DECLINLINE(size_t) vdIfIoIntIoCtxCopyTo(PVDINTERFACEIOINT pIfIoInt, PVDIOCTX pIo
DECLINLINE(size_t) vdIfIoIntIoCtxCopyFrom(PVDINTERFACEIOINT pIfIoInt, PVDIOCTX pIoCtx,
void *pvBuffer, size_t cbBuffer)
{
- return pIfIoInt->pfnIoCtxCopyTo(pIfIoInt->Core.pvUser, pIoCtx, pvBuffer, cbBuffer);
+ return pIfIoInt->pfnIoCtxCopyFrom(pIfIoInt->Core.pvUser, pIoCtx, pvBuffer, cbBuffer);
}
DECLINLINE(size_t) vdIfIoIntIoCtxSet(PVDINTERFACEIOINT pIfIoInt, PVDIOCTX pIoCtx,
diff --git a/include/VBox/vmm/cpum.h b/include/VBox/vmm/cpum.h
index 8a11eb2..73ecd1c 100644
--- a/include/VBox/vmm/cpum.h
+++ b/include/VBox/vmm/cpum.h
@@ -293,9 +293,11 @@ DECLINLINE(bool) CPUMIsGuestInPAEModeEx(PCPUMCTX pCtx)
&& CPUMIsGuestInPagedProtectedModeEx(pCtx)
&& !CPUMIsGuestInLongModeEx(pCtx));
#else
+ /* Intel mentions EFER.LMA and EFER.LME in different parts of their spec. We shall use EFER.LMA rather
+ than EFER.LME as it reflects if the CPU has entered paging with EFER.LME set. */
return ( (pCtx->cr4 & X86_CR4_PAE)
&& CPUMIsGuestPagingEnabledEx(pCtx)
- && !(pCtx->msrEFER & MSR_K6_EFER_LME));
+ && !(pCtx->msrEFER & MSR_K6_EFER_LMA));
#endif
}
diff --git a/include/VBox/vmm/hm.h b/include/VBox/vmm/hm.h
index e943174..12b9416 100644
--- a/include/VBox/vmm/hm.h
+++ b/include/VBox/vmm/hm.h
@@ -38,71 +38,6 @@
RT_C_DECLS_BEGIN
-/** @def VMCPU_HMCF_CLEAR
- * Clears a HM-context flag for the given VCPU.
- *
- * @param pVCpu Pointer to the VMCPU.
- * @param fFlag The flag to clear.
- */
-#define VMCPU_HMCF_CLEAR(pVCpu, fFlag) ((pVCpu)->hm.s.fContextUseFlags &= ~(fFlag))
-
-/** @def VMCPU_FF_SET
- * Sets a HM-context flag for the given VCPU.
- *
- * @param pVCpu Pointer to the VMCPU.
- * @param fFlag The flag to set.
- */
-#define VMCPU_HMCF_SET(pVCpu, fFlag) ((pVCpu)->hm.s.fContextUseFlags |= (fFlag))
-
-/** @def VMCPU_HMCF_IS_SET
- * Checks if all the flags in the specified HM-context set is pending.
- *
- * @param pVCpu Pointer to the VMCPU.
- * @param fFlag The flag to check.
- */
-#define VMCPU_HMCF_IS_SET(pVCpu, fFlag) (((pVCpu)->hm.s.fContextUseFlags & (fFlag)) == (fFlag))
-
-/** @def VMCPU_HMCF_IS_PENDING
- * Checks if one or more of the flags in the specified HM-context set is
- * pending.
- *
- * @param pVCpu Pointer to the VMCPU.
- * @param fFlags The flags to check for.
- */
-#define VMCPU_HMCF_IS_PENDING(pVCpu, fFlags) RT_BOOL((pVCpu)->hm.s.fContextUseFlags & (fFlags))
-
-/** @def VMCPU_HMCF_IS_PENDING_ONLY
- * Checks if -only- one or more of the specified HM-context flags is pending.
- *
- * @param pVCpu Pointer to the VMCPU.
- * @param fFlags The flags to check for.
- */
-#define VMCPU_HMCF_IS_PENDING_ONLY(pVCpu, fFlags) !RT_BOOL((pVCpu)->hm.s.fContextUseFlags & ~(fFlags))
-
-/** @def VMCPU_HMCF_IS_SET_ONLY
- * Checks if -only- all the flags in the specified HM-context set is pending.
- *
- * @param pVCpu Pointer to the VMCPU.
- * @param fFlags The flags to check for.
- */
-#define VMCPU_HMCF_IS_SET_ONLY(pVCpu, fFlags) ((pVCpu)->hm.s.fContextUseFlags == (fFlags))
-
-/** @def VMCPU_HMCF_RESET_TO
- * Resets the HM-context flags to the specified value.
- *
- * @param pVCpu Pointer to the VMCPU.
- * @param fFlags The new value.
- */
-#define VMCPU_HMCF_RESET_TO(pVCpu, fFlags) ((pVCpu)->hm.s.fContextUseFlags = (fFlags))
-
-/** @def VMCPU_HMCF_VALUE
- * Returns the current HM-context flags value.
- *
- * @param pVCpu Pointer to the VMCPU.
- */
-#define VMCPU_HMCF_VALUE(pVCpu) ((pVCpu)->hm.s.fContextUseFlags)
-
-
/**
* Checks whether HM (VT-x/AMD-V) is being used by this VM.
*
diff --git a/include/VBox/vmm/hm_vmx.h b/include/VBox/vmm/hm_vmx.h
index e878e2e..ab0f777 100644
--- a/include/VBox/vmm/hm_vmx.h
+++ b/include/VBox/vmm/hm_vmx.h
@@ -372,6 +372,8 @@ AssertCompileSize(VMXRESTOREHOST, 56);
#define VMX_IGS_CS_ATTR_S_INVALID 120
/** CS.Attr.DPL invalid. */
#define VMX_IGS_CS_ATTR_DPL_INVALID 121
+/** PAE PDPTE reserved bits not set to 0. */
+#define VMX_IGS_PAE_PDPTE_RESERVED 123
/** @} */
/** @name VMX VMCS-Read cache indices.
@@ -1506,8 +1508,8 @@ typedef VMXMSRS *PVMXMSRS;
#define VMX_EXIT_INTERRUPTION_INFO_TYPE_EXT_INT 0
#define VMX_EXIT_INTERRUPTION_INFO_TYPE_NMI 2
#define VMX_EXIT_INTERRUPTION_INFO_TYPE_HW_XCPT 3
-#define VMX_EXIT_INTERRUPTION_INFO_TYPE_SW_INT 4 /**< int xx */
-#define VMX_EXIT_INTERRUPTION_INFO_TYPE_DB_XCPT 5 /**< Why are we getting this one?? */
+#define VMX_EXIT_INTERRUPTION_INFO_TYPE_SW_INT 4
+#define VMX_EXIT_INTERRUPTION_INFO_TYPE_PRIV_SW_XCPT 5
#define VMX_EXIT_INTERRUPTION_INFO_TYPE_SW_XCPT 6
/** @} */
diff --git a/include/VBox/vmm/pdmapi.h b/include/VBox/vmm/pdmapi.h
index 346b240..321865a 100644
--- a/include/VBox/vmm/pdmapi.h
+++ b/include/VBox/vmm/pdmapi.h
@@ -42,9 +42,10 @@ RT_C_DECLS_BEGIN
VMMDECL(int) PDMGetInterrupt(PVMCPU pVCpu, uint8_t *pu8Interrupt);
VMMDECL(int) PDMIsaSetIrq(PVM pVM, uint8_t u8Irq, uint8_t u8Level, uint32_t uTagSrc);
+VMM_INT_DECL(bool) PDMHasIoApic(PVM pVM);
VMM_INT_DECL(int) PDMIoApicSetIrq(PVM pVM, uint8_t u8Irq, uint8_t u8Level, uint32_t uTagSrc);
VMM_INT_DECL(int) PDMIoApicSendMsi(PVM pVM, RTGCPHYS GCAddr, uint32_t uValue, uint32_t uTagSrc);
-VMM_INT_DECL(bool) PDMHasIoApic(PVM pVM);
+VMM_INT_DECL(bool) PDMHasApic(PVM pVM);
VMM_INT_DECL(int) PDMApicHasPendingIrq(PVM pVM, bool *pfPending);
VMMDECL(int) PDMApicSetBase(PVMCPU pVCpu, uint64_t u64Base);
VMMDECL(int) PDMApicGetBase(PVMCPU pVCpu, uint64_t *pu64Base);
diff --git a/include/VBox/vmm/pdmifs.h b/include/VBox/vmm/pdmifs.h
index 2e34a1a..684f4c2 100644
--- a/include/VBox/vmm/pdmifs.h
+++ b/include/VBox/vmm/pdmifs.h
@@ -629,6 +629,7 @@ typedef struct VBVAHOSTFLAGS *PVBVAHOSTFLAGS;
typedef struct VBOXVDMACMD_CHROMIUM_CMD *PVBOXVDMACMD_CHROMIUM_CMD; /* <- chromium [hgsmi] command */
typedef struct VBOXVDMACMD_CHROMIUM_CTL *PVBOXVDMACMD_CHROMIUM_CTL; /* <- chromium [hgsmi] command */
+
/** Pointer to a display connector interface. */
typedef struct PDMIDISPLAYCONNECTOR *PPDMIDISPLAYCONNECTOR;
/**
@@ -734,9 +735,12 @@ typedef struct PDMIDISPLAYCONNECTOR
*
* @param pInterface Pointer to this interface.
* @param pCmd Video HW Acceleration Command to be processed.
+ * @returns VINF_SUCCESS - command is completed,
+ * VINF_CALLBACK_RETURN - command will by asynchronously completed via complete callback
+ * VERR_INVALID_STATE - the command could not be processed (most likely because the framebuffer was disconnected) - the post should be retried later
* @thread The emulation thread.
*/
- DECLR3CALLBACKMEMBER(void, pfnVHWACommandProcess, (PPDMIDISPLAYCONNECTOR pInterface, PVBOXVHWACMD pCmd));
+ DECLR3CALLBACKMEMBER(int, pfnVHWACommandProcess, (PPDMIDISPLAYCONNECTOR pInterface, PVBOXVHWACMD pCmd));
/**
* Process the guest chromium command.
@@ -756,7 +760,6 @@ typedef struct PDMIDISPLAYCONNECTOR
*/
DECLR3CALLBACKMEMBER(void, pfnCrHgsmiControlProcess, (PPDMIDISPLAYCONNECTOR pInterface, PVBOXVDMACMD_CHROMIUM_CTL pCtl, uint32_t cbCtl));
-
/**
* The specified screen enters VBVA mode.
*
diff --git a/include/VBox/vmm/pgm.h b/include/VBox/vmm/pgm.h
index 7beb1c1..7e397b2 100644
--- a/include/VBox/vmm/pgm.h
+++ b/include/VBox/vmm/pgm.h
@@ -384,7 +384,7 @@ VMMDECL(int) PGMPhysSimpleDirtyWriteGCPtr(PVMCPU pVCpu, RTGCPTR GCPtrDst,
VMMDECL(int) PGMPhysInterpretedRead(PVMCPU pVCpu, PCPUMCTXCORE pCtxCore, void *pvDst, RTGCPTR GCPtrSrc, size_t cb);
VMMDECL(int) PGMPhysInterpretedReadNoHandlers(PVMCPU pVCpu, PCPUMCTXCORE pCtxCore, void *pvDst, RTGCUINTPTR GCPtrSrc, size_t cb, bool fRaiseTrap);
VMMDECL(int) PGMPhysInterpretedWriteNoHandlers(PVMCPU pVCpu, PCPUMCTXCORE pCtxCore, RTGCPTR GCPtrDst, void const *pvSrc, size_t cb, bool fRaiseTrap);
-VMM_INT_DECL(int) PGMPhysIemGCPhys2Ptr(PVM pVM, RTGCPHYS GCPhys, bool fWritable, bool fByPassHandlers, void **ppv, PPGMPAGEMAPLOCK pLock);
+VMM_INT_DECL(int) PGMPhysIemGCPhys2Ptr(PVM pVM, PVMCPU pVCpu, RTGCPHYS GCPhys, bool fWritable, bool fByPassHandlers, void **ppv, PPGMPAGEMAPLOCK pLock);
VMM_INT_DECL(int) PGMPhysIemQueryAccess(PVM pVM, RTGCPHYS GCPhys, bool fWritable, bool fByPassHandlers);
#ifdef VBOX_STRICT
diff --git a/include/iprt/asm.h b/include/iprt/asm.h
index fb3a344..92db948 100644
--- a/include/iprt/asm.h
+++ b/include/iprt/asm.h
@@ -2992,6 +2992,8 @@ DECLINLINE(void) ASMAtomicOrS64(int64_t volatile *pi64, int64_t i64)
{
ASMAtomicOrU64((uint64_t volatile *)pi64, i64);
}
+
+
/**
* Atomically And an unsigned 32-bit value, ordered.
*
@@ -3085,6 +3087,180 @@ DECLINLINE(void) ASMAtomicAndS64(int64_t volatile *pi64, int64_t i64)
}
+/**
+ * Atomically OR an unsigned 32-bit value, unordered but interrupt safe.
+ *
+ * @param pu32 Pointer to the pointer variable to OR u32 with.
+ * @param u32 The value to OR *pu32 with.
+ */
+#if RT_INLINE_ASM_EXTERNAL
+DECLASM(void) ASMAtomicUoOrU32(uint32_t volatile *pu32, uint32_t u32);
+#else
+DECLINLINE(void) ASMAtomicUoOrU32(uint32_t volatile *pu32, uint32_t u32)
+{
+# if RT_INLINE_ASM_GNU_STYLE
+ __asm__ __volatile__("orl %1, %0\n\t"
+ : "=m" (*pu32)
+ : "ir" (u32),
+ "m" (*pu32));
+# else
+ __asm
+ {
+ mov eax, [u32]
+# ifdef RT_ARCH_AMD64
+ mov rdx, [pu32]
+ or [rdx], eax
+# else
+ mov edx, [pu32]
+ or [edx], eax
+# endif
+ }
+# endif
+}
+#endif
+
+
+/**
+ * Atomically OR a signed 32-bit value, unordered.
+ *
+ * @param pi32 Pointer to the pointer variable to OR u32 with.
+ * @param i32 The value to OR *pu32 with.
+ */
+DECLINLINE(void) ASMAtomicUoOrS32(int32_t volatile *pi32, int32_t i32)
+{
+ ASMAtomicUoOrU32((uint32_t volatile *)pi32, i32);
+}
+
+
+/**
+ * Atomically OR an unsigned 64-bit value, unordered.
+ *
+ * @param pu64 Pointer to the pointer variable to OR u64 with.
+ * @param u64 The value to OR *pu64 with.
+ */
+#if RT_INLINE_ASM_EXTERNAL
+DECLASM(void) ASMAtomicUoOrU64(uint64_t volatile *pu64, uint64_t u64);
+#else
+DECLINLINE(void) ASMAtomicUoOrU64(uint64_t volatile *pu64, uint64_t u64)
+{
+# if RT_INLINE_ASM_GNU_STYLE && defined(RT_ARCH_AMD64)
+ __asm__ __volatile__("orq %1, %q0\n\t"
+ : "=m" (*pu64)
+ : "r" (u64),
+ "m" (*pu64));
+# else
+ for (;;)
+ {
+ uint64_t u64Old = ASMAtomicUoReadU64(pu64);
+ uint64_t u64New = u64Old | u64;
+ if (ASMAtomicCmpXchgU64(pu64, u64New, u64Old))
+ break;
+ ASMNopPause();
+ }
+# endif
+}
+#endif
+
+
+/**
+ * Atomically Or a signed 64-bit value, unordered.
+ *
+ * @param pi64 Pointer to the pointer variable to OR u64 with.
+ * @param i64 The value to OR *pu64 with.
+ */
+DECLINLINE(void) ASMAtomicUoOrS64(int64_t volatile *pi64, int64_t i64)
+{
+ ASMAtomicUoOrU64((uint64_t volatile *)pi64, i64);
+}
+
+
+/**
+ * Atomically And an unsigned 32-bit value, unordered.
+ *
+ * @param pu32 Pointer to the pointer variable to AND u32 with.
+ * @param u32 The value to AND *pu32 with.
+ */
+#if RT_INLINE_ASM_EXTERNAL
+DECLASM(void) ASMAtomicUoAndU32(uint32_t volatile *pu32, uint32_t u32);
+#else
+DECLINLINE(void) ASMAtomicUoAndU32(uint32_t volatile *pu32, uint32_t u32)
+{
+# if RT_INLINE_ASM_GNU_STYLE
+ __asm__ __volatile__("andl %1, %0\n\t"
+ : "=m" (*pu32)
+ : "ir" (u32),
+ "m" (*pu32));
+# else
+ __asm
+ {
+ mov eax, [u32]
+# ifdef RT_ARCH_AMD64
+ mov rdx, [pu32]
+ and [rdx], eax
+# else
+ mov edx, [pu32]
+ and [edx], eax
+# endif
+ }
+# endif
+}
+#endif
+
+
+/**
+ * Atomically And a signed 32-bit value, unordered.
+ *
+ * @param pi32 Pointer to the pointer variable to AND i32 with.
+ * @param i32 The value to AND *pi32 with.
+ */
+DECLINLINE(void) ASMAtomicUoAndS32(int32_t volatile *pi32, int32_t i32)
+{
+ ASMAtomicUoAndU32((uint32_t volatile *)pi32, (uint32_t)i32);
+}
+
+
+/**
+ * Atomically And an unsigned 64-bit value, unordered.
+ *
+ * @param pu64 Pointer to the pointer variable to AND u64 with.
+ * @param u64 The value to AND *pu64 with.
+ */
+#if RT_INLINE_ASM_EXTERNAL
+DECLASM(void) ASMAtomicUoAndU64(uint64_t volatile *pu64, uint64_t u64);
+#else
+DECLINLINE(void) ASMAtomicUoAndU64(uint64_t volatile *pu64, uint64_t u64)
+{
+# if RT_INLINE_ASM_GNU_STYLE && defined(RT_ARCH_AMD64)
+ __asm__ __volatile__("andq %1, %0\n\t"
+ : "=m" (*pu64)
+ : "r" (u64),
+ "m" (*pu64));
+# else
+ for (;;)
+ {
+ uint64_t u64Old = ASMAtomicUoReadU64(pu64);
+ uint64_t u64New = u64Old & u64;
+ if (ASMAtomicCmpXchgU64(pu64, u64New, u64Old))
+ break;
+ ASMNopPause();
+ }
+# endif
+}
+#endif
+
+
+/**
+ * Atomically And a signed 64-bit value, unordered.
+ *
+ * @param pi64 Pointer to the pointer variable to AND i64 with.
+ * @param i64 The value to AND *pi64 with.
+ */
+DECLINLINE(void) ASMAtomicUoAndS64(int64_t volatile *pi64, int64_t i64)
+{
+ ASMAtomicUoAndU64((uint64_t volatile *)pi64, (uint64_t)i64);
+}
+
+
/** @def RT_ASM_PAGE_SIZE
* We try avoid dragging in iprt/param.h here.
diff --git a/include/iprt/avl.h b/include/iprt/avl.h
index 6506e8b..2347b80 100644
--- a/include/iprt/avl.h
+++ b/include/iprt/avl.h
@@ -62,7 +62,8 @@ typedef PAVLPVNODECORE AVLPVTREE;
/** Pointer to a tree with void pointer keys. */
typedef PPAVLPVNODECORE PAVLPVTREE;
-/** Callback function for AVLPVDoWithAll(). */
+/** Callback function for AVLPVDoWithAll().
+ * @returns IPRT status codes. */
typedef DECLCALLBACK(int) AVLPVCALLBACK(PAVLPVNODECORE, void *);
/** Pointer to callback function for AVLPVDoWithAll(). */
typedef AVLPVCALLBACK *PAVLPVCALLBACK;
@@ -102,7 +103,8 @@ typedef struct _AVLULNodeCore
} AVLULNODECORE, *PAVLULNODECORE, **PPAVLULNODECORE;
-/** Callback function for AVLULDoWithAll(). */
+/** Callback function for AVLULDoWithAll().
+ * @returns IPRT status codes. */
typedef DECLCALLBACK(int) AVLULCALLBACK(PAVLULNODECORE, void*);
/** Pointer to callback function for AVLULDoWithAll(). */
typedef AVLULCALLBACK *PAVLULCALLBACK;
@@ -149,7 +151,8 @@ typedef PAVLRPVNODECORE AVLRPVTREE;
/** Pointer to a tree with void pointer keys. */
typedef PPAVLRPVNODECORE PAVLRPVTREE;
-/** Callback function for AVLPVDoWithAll(). */
+/** Callback function for AVLPVDoWithAll().
+ * @returns IPRT status codes. */
typedef DECLCALLBACK(int) AVLRPVCALLBACK(PAVLRPVNODECORE, void *);
/** Pointer to callback function for AVLPVDoWithAll(). */
typedef AVLRPVCALLBACK *PAVLRPVCALLBACK;
@@ -192,7 +195,8 @@ typedef PAVLU32NODECORE AVLU32TREE;
/** Pointer to a tree with void pointer keys. */
typedef PPAVLU32NODECORE PAVLU32TREE;
-/** Callback function for AVLU32DoWithAll() & AVLU32Destroy(). */
+/** Callback function for AVLU32DoWithAll() & AVLU32Destroy().
+ * @returns IPRT status codes. */
typedef DECLCALLBACK(int) AVLU32CALLBACK(PAVLU32NODECORE, void*);
/** Pointer to callback function for AVLU32DoWithAll() & AVLU32Destroy(). */
typedef AVLU32CALLBACK *PAVLU32CALLBACK;
@@ -242,7 +246,8 @@ typedef AVLOU32TREE *PAVLOU32TREE;
* In this case it's a pointer to a relative offset. */
typedef AVLOU32TREE *PPAVLOU32NODECORE;
-/** Callback function for RTAvloU32DoWithAll(). */
+/** Callback function for RTAvloU32DoWithAll().
+ * @returns IPRT status codes. */
typedef DECLCALLBACK(int) AVLOU32CALLBACK(PAVLOU32NODECORE pNode, void *pvUser);
/** Pointer to callback function for RTAvloU32DoWithAll(). */
typedef AVLOU32CALLBACK *PAVLOU32CALLBACK;
@@ -275,7 +280,8 @@ typedef struct _AVLLU32NodeCore
struct _AVLLU32NodeCore *pList; /**< Pointer to next node with the same key. */
} AVLLU32NODECORE, *PAVLLU32NODECORE, **PPAVLLU32NODECORE;
-/** Callback function for RTAvllU32DoWithAll() & RTAvllU32Destroy(). */
+/** Callback function for RTAvllU32DoWithAll() & RTAvllU32Destroy().
+ * @returns IPRT status codes. */
typedef DECLCALLBACK(int) AVLLU32CALLBACK(PAVLLU32NODECORE, void*);
/** Pointer to callback function for RTAvllU32DoWithAll() & RTAvllU32Destroy(). */
typedef AVLLU32CALLBACK *PAVLLU32CALLBACK;
@@ -323,7 +329,8 @@ typedef PAVLRU64NODECORE AVLRU64TREE;
/** Pointer to a tree with void pointer keys. */
typedef PPAVLRU64NODECORE PAVLRU64TREE;
-/** Callback function for AVLRU64DoWithAll(). */
+/** Callback function for AVLRU64DoWithAll().
+ * @returns IPRT status codes. */
typedef DECLCALLBACK(int) AVLRU64CALLBACK(PAVLRU64NODECORE, void *);
/** Pointer to callback function for AVLU64DoWithAll(). */
typedef AVLRU64CALLBACK *PAVLRU64CALLBACK;
@@ -380,7 +387,8 @@ typedef AVLOGCPHYSTREE *PAVLOGCPHYSTREE;
* In this case it's a pointer to a relative offset. */
typedef AVLOGCPHYSTREE *PPAVLOGCPHYSNODECORE;
-/** Callback function for RTAvloGCPhysDoWithAll() and RTAvloGCPhysDestroy(). */
+/** Callback function for RTAvloGCPhysDoWithAll() and RTAvloGCPhysDestroy().
+ * @returns IPRT status codes. */
typedef DECLCALLBACK(int) AVLOGCPHYSCALLBACK(PAVLOGCPHYSNODECORE pNode, void *pvUser);
/** Pointer to callback function for RTAvloGCPhysDoWithAll() and RTAvloGCPhysDestroy(). */
typedef AVLOGCPHYSCALLBACK *PAVLOGCPHYSCALLBACK;
@@ -433,7 +441,8 @@ typedef AVLROGCPHYSTREE *PAVLROGCPHYSTREE;
* In this case it's a pointer to a relative offset. */
typedef AVLROGCPHYSTREE *PPAVLROGCPHYSNODECORE;
-/** Callback function for RTAvlroGCPhysDoWithAll() and RTAvlroGCPhysDestroy(). */
+/** Callback function for RTAvlroGCPhysDoWithAll() and RTAvlroGCPhysDestroy().
+ * @returns IPRT status codes. */
typedef DECLCALLBACK(int) AVLROGCPHYSCALLBACK(PAVLROGCPHYSNODECORE pNode, void *pvUser);
/** Pointer to callback function for RTAvlroGCPhysDoWithAll() and RTAvlroGCPhysDestroy(). */
typedef AVLROGCPHYSCALLBACK *PAVLROGCPHYSCALLBACK;
@@ -477,7 +486,8 @@ typedef PAVLGCPTRNODECORE AVLGCPTRTREE;
/** Pointer to a tree of RTGCPTR keys. */
typedef PPAVLGCPTRNODECORE PAVLGCPTRTREE;
-/** Callback function for RTAvlGCPtrDoWithAll(). */
+/** Callback function for RTAvlGCPtrDoWithAll().
+ * @returns IPRT status codes. */
typedef DECLCALLBACK(int) AVLGCPTRCALLBACK(PAVLGCPTRNODECORE pNode, void *pvUser);
/** Pointer to callback function for RTAvlGCPtrDoWithAll(). */
typedef AVLGCPTRCALLBACK *PAVLGCPTRCALLBACK;
@@ -527,7 +537,8 @@ typedef AVLOGCPTRTREE *PAVLOGCPTRTREE;
* In this case it's a pointer to a relative offset. */
typedef AVLOGCPTRTREE *PPAVLOGCPTRNODECORE;
-/** Callback function for RTAvloGCPtrDoWithAll(). */
+/** Callback function for RTAvloGCPtrDoWithAll().
+ * @returns IPRT status codes. */
typedef DECLCALLBACK(int) AVLOGCPTRCALLBACK(PAVLOGCPTRNODECORE pNode, void *pvUser);
/** Pointer to callback function for RTAvloGCPtrDoWithAll(). */
typedef AVLOGCPTRCALLBACK *PAVLOGCPTRCALLBACK;
@@ -573,7 +584,8 @@ typedef AVLRGCPTRTREE *PAVLRGCPTRTREE;
* In this case it's a pointer to a relative offset. */
typedef AVLRGCPTRTREE *PPAVLRGCPTRNODECORE;
-/** Callback function for RTAvlrGCPtrDoWithAll() and RTAvlrGCPtrDestroy(). */
+/** Callback function for RTAvlrGCPtrDoWithAll() and RTAvlrGCPtrDestroy().
+ * @returns IPRT status codes. */
typedef DECLCALLBACK(int) AVLRGCPTRCALLBACK(PAVLRGCPTRNODECORE pNode, void *pvUser);
/** Pointer to callback function for RTAvlrGCPtrDoWithAll() and RTAvlrGCPtrDestroy(). */
typedef AVLRGCPTRCALLBACK *PAVLRGCPTRCALLBACK;
@@ -629,7 +641,8 @@ typedef AVLROGCPTRTREE *PAVLROGCPTRTREE;
* In this case it's a pointer to a relative offset. */
typedef AVLROGCPTRTREE *PPAVLROGCPTRNODECORE;
-/** Callback function for RTAvlroGCPtrDoWithAll() and RTAvlroGCPtrDestroy(). */
+/** Callback function for RTAvlroGCPtrDoWithAll() and RTAvlroGCPtrDestroy().
+ * @returns IPRT status codes. */
typedef DECLCALLBACK(int) AVLROGCPTRCALLBACK(PAVLROGCPTRNODECORE pNode, void *pvUser);
/** Pointer to callback function for RTAvlroGCPtrDoWithAll() and RTAvlroGCPtrDestroy(). */
typedef AVLROGCPTRCALLBACK *PAVLROGCPTRCALLBACK;
@@ -686,7 +699,8 @@ typedef AVLROOGCPTRTREE *PAVLROOGCPTRTREE;
* In this case it's a pointer to a relative offset. */
typedef AVLROOGCPTRTREE *PPAVLROOGCPTRNODECORE;
-/** Callback function for RTAvlrooGCPtrDoWithAll() and RTAvlrooGCPtrDestroy(). */
+/** Callback function for RTAvlrooGCPtrDoWithAll() and RTAvlrooGCPtrDestroy().
+ * @returns IPRT status codes. */
typedef DECLCALLBACK(int) AVLROOGCPTRCALLBACK(PAVLROOGCPTRNODECORE pNode, void *pvUser);
/** Pointer to callback function for RTAvlrooGCPtrDoWithAll() and RTAvlrooGCPtrDestroy(). */
typedef AVLROOGCPTRCALLBACK *PAVLROOGCPTRCALLBACK;
@@ -737,7 +751,8 @@ typedef AVLUINTPTRTREE *PAVLUINTPTRTREE;
* In this case it's a pointer to a pointer. */
typedef AVLUINTPTRTREE *PPAVLUINTPTRNODECORE;
-/** Callback function for RTAvlUIntPtrDoWithAll() and RTAvlUIntPtrDestroy(). */
+/** Callback function for RTAvlUIntPtrDoWithAll() and RTAvlUIntPtrDestroy().
+ * @returns IPRT status codes. */
typedef DECLCALLBACK(int) AVLUINTPTRCALLBACK(PAVLUINTPTRNODECORE pNode, void *pvUser);
/** Pointer to callback function for RTAvlUIntPtrDoWithAll() and RTAvlUIntPtrDestroy(). */
typedef AVLUINTPTRCALLBACK *PAVLUINTPTRCALLBACK;
@@ -787,7 +802,8 @@ typedef AVLRUINTPTRTREE *PAVLRUINTPTRTREE;
* In this case it's a pointer to a pointer. */
typedef AVLRUINTPTRTREE *PPAVLRUINTPTRNODECORE;
-/** Callback function for RTAvlrUIntPtrDoWithAll() and RTAvlrUIntPtrDestroy(). */
+/** Callback function for RTAvlrUIntPtrDoWithAll() and RTAvlrUIntPtrDestroy().
+ * @returns IPRT status codes. */
typedef DECLCALLBACK(int) AVLRUINTPTRCALLBACK(PAVLRUINTPTRNODECORE pNode, void *pvUser);
/** Pointer to callback function for RTAvlrUIntPtrDoWithAll() and RTAvlrUIntPtrDestroy(). */
typedef AVLRUINTPTRCALLBACK *PAVLRUINTPTRCALLBACK;
@@ -843,7 +859,8 @@ typedef AVLOHCPHYSTREE *PAVLOHCPHYSTREE;
* In this case it's a pointer to a relative offset. */
typedef AVLOHCPHYSTREE *PPAVLOHCPHYSNODECORE;
-/** Callback function for RTAvloHCPhysDoWithAll() and RTAvloHCPhysDestroy(). */
+/** Callback function for RTAvloHCPhysDoWithAll() and RTAvloHCPhysDestroy().
+ * @returns IPRT status codes. */
typedef DECLCALLBACK(int) AVLOHCPHYSCALLBACK(PAVLOHCPHYSNODECORE pNode, void *pvUser);
/** Pointer to callback function for RTAvloHCPhysDoWithAll() and RTAvloHCPhysDestroy(). */
typedef AVLOHCPHYSCALLBACK *PAVLOHCPHYSCALLBACK;
@@ -893,7 +910,8 @@ typedef AVLOIOPORTTREE *PAVLOIOPORTTREE;
* In this case it's a pointer to a relative offset. */
typedef AVLOIOPORTTREE *PPAVLOIOPORTNODECORE;
-/** Callback function for RTAvloIOPortDoWithAll() and RTAvloIOPortDestroy(). */
+/** Callback function for RTAvloIOPortDoWithAll() and RTAvloIOPortDestroy().
+ * @returns IPRT status codes. */
typedef DECLCALLBACK(int) AVLOIOPORTCALLBACK(PAVLOIOPORTNODECORE pNode, void *pvUser);
/** Pointer to callback function for RTAvloIOPortDoWithAll() and RTAvloIOPortDestroy(). */
typedef AVLOIOPORTCALLBACK *PAVLOIOPORTCALLBACK;
@@ -944,7 +962,8 @@ typedef AVLROIOPORTTREE *PAVLROIOPORTTREE;
* In this case it's a pointer to a relative offset. */
typedef AVLROIOPORTTREE *PPAVLROIOPORTNODECORE;
-/** Callback function for RTAvlroIOPortDoWithAll() and RTAvlroIOPortDestroy(). */
+/** Callback function for RTAvlroIOPortDoWithAll() and RTAvlroIOPortDestroy().
+ * @returns IPRT status codes. */
typedef DECLCALLBACK(int) AVLROIOPORTCALLBACK(PAVLROIOPORTNODECORE pNode, void *pvUser);
/** Pointer to callback function for RTAvlroIOPortDoWithAll() and RTAvlroIOPortDestroy(). */
typedef AVLROIOPORTCALLBACK *PAVLROIOPORTCALLBACK;
@@ -993,7 +1012,8 @@ typedef AVLHCPHYSTREE *PAVLHCPHYSTREE;
* In this case it's a pointer to a relative offset. */
typedef AVLHCPHYSTREE *PPAVLHCPHYSNODECORE;
-/** Callback function for RTAvlHCPhysDoWithAll() and RTAvlHCPhysDestroy(). */
+/** Callback function for RTAvlHCPhysDoWithAll() and RTAvlHCPhysDestroy().
+ * @returns IPRT status codes. */
typedef DECLCALLBACK(int) AVLHCPHYSCALLBACK(PAVLHCPHYSNODECORE pNode, void *pvUser);
/** Pointer to callback function for RTAvlHCPhysDoWithAll() and RTAvlHCPhysDestroy(). */
typedef AVLHCPHYSCALLBACK *PAVLHCPHYSCALLBACK;
@@ -1041,7 +1061,8 @@ typedef AVLGCPHYSTREE *PAVLGCPHYSTREE;
* In this case it's a pointer to a relative offset. */
typedef AVLGCPHYSTREE *PPAVLGCPHYSNODECORE;
-/** Callback function for RTAvlGCPhysDoWithAll() and RTAvlGCPhysDestroy(). */
+/** Callback function for RTAvlGCPhysDoWithAll() and RTAvlGCPhysDestroy().
+ * @returns IPRT status codes. */
typedef DECLCALLBACK(int) AVLGCPHYSCALLBACK(PAVLGCPHYSNODECORE pNode, void *pvUser);
/** Pointer to callback function for RTAvlGCPhysDoWithAll() and RTAvlGCPhysDestroy(). */
typedef AVLGCPHYSCALLBACK *PAVLGCPHYSCALLBACK;
@@ -1087,7 +1108,8 @@ typedef AVLRFOFFTREE *PAVLRFOFFTREE;
* In this case it's a pointer to a relative offset. */
typedef AVLRFOFFTREE *PPAVLRFOFFNODECORE;
-/** Callback function for RTAvlrGCPtrDoWithAll() and RTAvlrGCPtrDestroy(). */
+/** Callback function for RTAvlrGCPtrDoWithAll() and RTAvlrGCPtrDestroy().
+ * @returns IPRT status codes. */
typedef DECLCALLBACK(int) AVLRFOFFCALLBACK(PAVLRFOFFNODECORE pNode, void *pvUser);
/** Pointer to callback function for RTAvlrGCPtrDoWithAll() and RTAvlrGCPtrDestroy(). */
typedef AVLRFOFFCALLBACK *PAVLRFOFFCALLBACK;
diff --git a/include/iprt/mangling.h b/include/iprt/mangling.h
index 958ce0a..34c02f3 100644
--- a/include/iprt/mangling.h
+++ b/include/iprt/mangling.h
@@ -55,6 +55,14 @@
# define ASMAtomicReadU64_EndProc RT_MANGLER(ASMAtomicReadU64_EndProc)
# define ASMAtomicUoReadU64 RT_MANGLER(ASMAtomicUoReadU64) /* not-some-systems... */
# define ASMAtomicUoReadU64_EndProc RT_MANGLER(ASMAtomicUoReadU64_EndProc)
+# define ASMAtomicUoAndU64 RT_MANGLER(ASMAtomicUoAndU64) /* not-some-systems... */
+# define ASMAtomicUoAndU64_EndProc RT_MANGLER(ASMAtomicUoAndU64_EndProc)
+# define ASMAtomicUoAndU32 RT_MANGLER(ASMAtomicUoAndU32) /* not-some-systems... */
+# define ASMAtomicUoAndU32_EndProc RT_MANGLER(ASMAtomicUoAndU32_EndProc)
+# define ASMAtomicUoOrU64 RT_MANGLER(ASMAtomicUoOrU64) /* not-some-systems... */
+# define ASMAtomicUoOrU64_EndProc RT_MANGLER(ASMAtomicUoOrU64_EndProc)
+# define ASMAtomicUoOrU32 RT_MANGLER(ASMAtomicUoOrU32) /* not-some-systems... */
+# define ASMAtomicUoOrU32_EndProc RT_MANGLER(ASMAtomicUoOrU32_EndProc)
# define ASMAtomicXchgU64 RT_MANGLER(ASMAtomicXchgU64) /* not-some-systems... */
# define ASMAtomicXchgU64_EndProc RT_MANGLER(ASMAtomicXchgU64_EndProc)
# define RTAssertAreQuiet RT_MANGLER(RTAssertAreQuiet)
diff --git a/src/VBox/Additions/common/VBoxGuest/VBoxGuest.cpp b/src/VBox/Additions/common/VBoxGuest/VBoxGuest.cpp
index 9ff25c9..b1ffd3b 100644
--- a/src/VBox/Additions/common/VBoxGuest/VBoxGuest.cpp
+++ b/src/VBox/Additions/common/VBoxGuest/VBoxGuest.cpp
@@ -76,7 +76,7 @@ static int VBoxGuestCommonGuestCapsAcquire(PVBOXGUESTDEVEXT pDevExt, PVBOXGUESTS
DECLINLINE(uint32_t) VBoxGuestCommonGetHandledEventsLocked(PVBOXGUESTDEVEXT pDevExt, PVBOXGUESTSESSION pSession)
{
- if(!pDevExt->u32AcquireModeGuestCaps)
+ if (!pDevExt->u32AcquireModeGuestCaps)
return VMMDEV_EVENT_VALID_EVENT_MASK;
uint32_t u32AllowedGuestCaps = pSession->u32AquiredGuestCaps | (VMMDEV_EVENT_VALID_EVENT_MASK & ~pDevExt->u32AcquireModeGuestCaps);
@@ -462,7 +462,7 @@ static int vboxGuestSetBalloonSizeKernel(PVBOXGUESTDEVEXT pDevExt, uint32_t cBal
pDevExt->MemBalloon.paMemObj = (PRTR0MEMOBJ)RTMemAllocZ(sizeof(RTR0MEMOBJ) * pDevExt->MemBalloon.cMaxChunks);
if (!pDevExt->MemBalloon.paMemObj)
{
- LogRel(("VBoxGuestSetBalloonSizeKernel: no memory for paMemObj!\n"));
+ LogRel(("vboxGuestSetBalloonSizeKernel: no memory for paMemObj!\n"));
return VERR_NO_MEMORY;
}
}
@@ -2073,7 +2073,7 @@ static int VBoxGuestCommonIOCtl_HGCMCall(PVBOXGUESTDEVEXT pDevExt,
if (cbData < cbActual)
{
LogRel(("VBoxGuestCommonIOCtl: HGCM_CALL: cbData=%#zx (%zu) required size is %#zx (%zu)\n",
- cbData, cbActual));
+ cbData, cbData, cbActual, cbActual));
return VERR_INVALID_PARAMETER;
}
@@ -2522,10 +2522,8 @@ static int VBoxGuestCommonIOCtl_Log(PVBOXGUESTDEVEXT pDevExt, const char *pch, s
static bool VBoxGuestCommonGuestCapsValidateValues(uint32_t fCaps)
{
if (fCaps & (~(VMMDEV_GUEST_SUPPORTS_SEAMLESS | VMMDEV_GUEST_SUPPORTS_GUEST_HOST_WINDOW_MAPPING | VMMDEV_GUEST_SUPPORTS_GRAPHICS)))
- {
- LogRel(("VBoxGuestCommonGuestCapsValidateValues: invalid guest caps 0x%x\n", fCaps));
return false;
- }
+
return true;
}
@@ -2570,29 +2568,32 @@ static int VBoxGuestCommonGuestCapsAcquire(PVBOXGUESTDEVEXT pDevExt, PVBOXGUESTS
{
uint32_t fSetCaps = 0;
- LogRel(("VBoxGuest: VBoxGuestCommonGuestCapsAcquire: pSession(0x%p), OR(0x%x), NOT(0x%x), flags(0x%x)\n", pSession, fOrMask, fNotMask, enmFlags));
-
if (!VBoxGuestCommonGuestCapsValidateValues(fOrMask))
{
- LogRel(("invalid fOrMask 0x%x\n", fOrMask));
+ LogRel(("VBoxGuestCommonGuestCapsAcquire: pSession(0x%p), OR(0x%x), NOT(0x%x), flags(0x%x) -- invalid fOrMask\n",
+ pSession, fOrMask, fNotMask, enmFlags));
return VERR_INVALID_PARAMETER;
}
- if (enmFlags != VBOXGUESTCAPSACQUIRE_FLAGS_CONFIG_ACQUIRE_MODE
- && enmFlags != VBOXGUESTCAPSACQUIRE_FLAGS_NONE)
+ if ( enmFlags != VBOXGUESTCAPSACQUIRE_FLAGS_CONFIG_ACQUIRE_MODE
+ && enmFlags != VBOXGUESTCAPSACQUIRE_FLAGS_NONE)
{
- LogRel(("invalid enmFlags %d\n", enmFlags));
+ LogRel(("VBoxGuestCommonGuestCapsAcquire: pSession(0x%p), OR(0x%x), NOT(0x%x), flags(0x%x) -- invalid enmFlags %d\n",
+ pSession, fOrMask, fNotMask, enmFlags));
return VERR_INVALID_PARAMETER;
}
+
if (!VBoxGuestCommonGuestCapsModeSet(pDevExt, fOrMask, true, &fSetCaps))
{
- LogRel(("calling caps acquire for set caps %d\n", fOrMask));
+ LogRel(("VBoxGuestCommonGuestCapsAcquire: pSession(0x%p), OR(0x%x), NOT(0x%x), flags(0x%x) -- calling caps acquire for set caps\n",
+ pSession, fOrMask, fNotMask, enmFlags));
return VERR_INVALID_STATE;
}
if (enmFlags & VBOXGUESTCAPSACQUIRE_FLAGS_CONFIG_ACQUIRE_MODE)
{
- Log(("Configured Acquire caps: 0x%x\n", fOrMask));
+ Log(("VBoxGuestCommonGuestCapsAcquire: pSession(0x%p), OR(0x%x), NOT(0x%x), flags(0x%x) -- configured acquire caps: 0x%x\n",
+ pSession, fOrMask, fNotMask, enmFlags));
return VINF_SUCCESS;
}
@@ -2644,9 +2645,9 @@ static int VBoxGuestCommonGuestCapsAcquire(PVBOXGUESTDEVEXT pDevExt, PVBOXGUESTS
}
int rc = VBoxGuestSetGuestCapabilities(fSessionOrCaps, fSessionNotCaps);
- if (!RT_SUCCESS(rc))
+ if (RT_FAILURE(rc))
{
- LogRel(("VBoxGuest: VBoxGuestCommonGuestCapsAcquire: VBoxGuestSetGuestCapabilities failed, rc %d\n", rc));
+ LogRel(("VBoxGuestCommonGuestCapsAcquire: VBoxGuestSetGuestCapabilities failed, rc=%Rrc\n", rc));
/* Failure branch
* this is generally bad since e.g. failure to release the caps may result in other sessions not being able to use it
@@ -2676,8 +2677,8 @@ static int VBoxGuestCommonGuestCapsAcquire(PVBOXGUESTDEVEXT pDevExt, PVBOXGUESTS
static int VBoxGuestCommonIOCTL_GuestCapsAcquire(PVBOXGUESTDEVEXT pDevExt, PVBOXGUESTSESSION pSession, VBoxGuestCapsAquire *pAcquire)
{
int rc = VBoxGuestCommonGuestCapsAcquire(pDevExt, pSession, pAcquire->u32OrMask, pAcquire->u32NotMask, pAcquire->enmFlags);
- if (!RT_SUCCESS(rc))
- LogRel(("VBoxGuestCommonGuestCapsAcquire: failed rc %d\n", rc));
+ if (RT_FAILURE(rc))
+ LogRel(("VBoxGuestCommonGuestCapsAcquire: failed rc=%Rrc\n", rc));
pAcquire->rc = rc;
return VINF_SUCCESS;
}
@@ -2914,8 +2915,8 @@ int VBoxGuestCommonIOCtl(unsigned iFunction, PVBOXGUESTDEVEXT pDevExt, PVBOXGUES
default:
{
- LogRel(("VBoxGuestCommonIOCtl: Unknown request iFunction=%#x Stripped size=%#x\n", iFunction,
- VBOXGUEST_IOCTL_STRIP_SIZE(iFunction)));
+ LogRel(("VBoxGuestCommonIOCtl: Unknown request iFunction=%#x stripped size=%#x\n",
+ iFunction, VBOXGUEST_IOCTL_STRIP_SIZE(iFunction)));
rc = VERR_NOT_SUPPORTED;
break;
}
diff --git a/src/VBox/Additions/common/VBoxService/VBoxService.cpp b/src/VBox/Additions/common/VBoxService/VBoxService.cpp
index e8dec49..8ce44da 100644
--- a/src/VBox/Additions/common/VBoxService/VBoxService.cpp
+++ b/src/VBox/Additions/common/VBoxService/VBoxService.cpp
@@ -222,9 +222,6 @@ static void VBoxServiceLogHeaderFooter(PRTLOGGER pLoggerRelease, RTLOGPHASE enmP
*/
int VBoxServiceLogCreate(const char *pszLogFile)
{
- if (!pszLogFile) /* No logging wanted? Take a shortcut. */
- return VINF_SUCCESS;
-
/* Create release logger (stdout + file). */
static const char * const s_apszGroups[] = VBOX_LOGGROUP_NAMES;
RTUINT fFlags = RTLOGFLAGS_PREFIX_THREAD | RTLOGFLAGS_PREFIX_TIME_PROG;
@@ -756,6 +753,7 @@ void VBoxServiceMainWait(void)
int main(int argc, char **argv)
{
RTEXITCODE rcExit;
+ bool fUserSession = false;
/*
* Init globals and such.
@@ -780,14 +778,32 @@ int main(int argc, char **argv)
return rcExit;
#endif
+#ifdef VBOX_WITH_GUEST_CONTROL
+ /*
+ * Check if we're the specially spawned VBoxService.exe process that
+ * handles a guest control session.
+ */
+ if ( argc >= 2
+ && !RTStrICmp(argv[1], "guestsession"))
+ fUserSession = true;
+#endif
+
/*
* Connect to the kernel part before daemonizing so we can fail and
* complain if there is some kind of problem. We need to initialize the
* guest lib *before* we do the pre-init just in case one of services needs
* do to some initial stuff with it.
*/
- VBoxServiceVerbose(2, "Calling VbgR3Init()\n");
- rc = VbglR3Init();
+ if (fUserSession)
+ {
+ VBoxServiceVerbose(2, "Calling VbgR3InitUser()\n");
+ rc = VbglR3InitUser();
+ }
+ else
+ {
+ VBoxServiceVerbose(2, "Calling VbgR3Init()\n");
+ rc = VbglR3Init();
+ }
if (RT_FAILURE(rc))
{
if (rc == VERR_ACCESS_DENIED)
@@ -801,8 +817,8 @@ int main(int argc, char **argv)
* Check if we're the specially spawned VBoxService.exe process that
* handles page fusion. This saves an extra executable.
*/
- if ( argc == 2
- && !RTStrICmp(argv[1], "pagefusion"))
+ if ( argc == 2
+ && !RTStrICmp(argv[1], "pagefusion"))
return VBoxServicePageSharingInitFork();
#endif
@@ -811,8 +827,7 @@ int main(int argc, char **argv)
* Check if we're the specially spawned VBoxService.exe process that
* handles a guest control session.
*/
- if ( argc >= 2
- && !RTStrICmp(argv[1], "guestsession"))
+ if (fUserSession)
return VBoxServiceControlSessionForkInit(argc, argv);
#endif
diff --git a/src/VBox/Additions/common/crOpenGL/fakedri_drv.c b/src/VBox/Additions/common/crOpenGL/fakedri_drv.c
index 67186f2..03b537e 100644
--- a/src/VBox/Additions/common/crOpenGL/fakedri_drv.c
+++ b/src/VBox/Additions/common/crOpenGL/fakedri_drv.c
@@ -63,7 +63,7 @@ typedef enum {
# define DRI_DEFAULT_DRIVER_DIR "/usr/local/lib/dri"
# define DRI_XORG_DRV_DIR "/usr/local/lib/xorg/modules/drivers/"
# else
-# define DRI_DEFAULT_DRIVER_DIR "/usr/lib64/dri:/usr/lib/dri:/usr/lib/x86_64-linux-gnu/dri"
+# define DRI_DEFAULT_DRIVER_DIR "/usr/lib64/dri:/usr/lib/dri:/usr/lib/x86_64-linux-gnu/dri:/usr/lib/xorg/modules/dri"
# define DRI_XORG_DRV_DIR "/usr/lib/xorg/modules/drivers/"
# endif
#else
@@ -71,7 +71,7 @@ typedef enum {
# define DRI_DEFAULT_DRIVER_DIR "/usr/local/lib/dri"
# define DRI_XORG_DRV_DIR "/usr/local/lib/xorg/modules/drivers/"
# else
-# define DRI_DEFAULT_DRIVER_DIR "/usr/lib/dri:/usr/lib/i386-linux-gnu/dri"
+# define DRI_DEFAULT_DRIVER_DIR "/usr/lib/dri:/usr/lib/i386-linux-gnu/dri:/usr/lib/xorg/modules/dri"
# define DRI_XORG_DRV_DIR "/usr/lib/xorg/modules/drivers/"
# endif
#endif
diff --git a/src/VBox/Additions/common/crOpenGL/load.c b/src/VBox/Additions/common/crOpenGL/load.c
index bb10075..35d1f72 100644
--- a/src/VBox/Additions/common/crOpenGL/load.c
+++ b/src/VBox/Additions/common/crOpenGL/load.c
@@ -209,16 +209,19 @@ static void stubCheckWindowsState(void)
return;
#endif
+ /* Try to keep a consistent locking order. */
+ crHashtableLock(stub.windowTable);
#if defined(CR_NEWWINTRACK) && !defined(WINDOWS)
crLockMutex(&stub.mutex);
#endif
stubCheckWindowState(context->currentDrawable, GL_TRUE);
- crHashtableWalk(stub.windowTable, stubCheckWindowsCB, context);
+ crHashtableWalkUnlocked(stub.windowTable, stubCheckWindowsCB, context);
#if defined(CR_NEWWINTRACK) && !defined(WINDOWS)
crUnlockMutex(&stub.mutex);
#endif
+ crHashtableUnlock(stub.windowTable);
}
@@ -891,9 +894,12 @@ static DECLCALLBACK(int) stubSyncThreadProc(RTTHREAD ThreadSelf, void *pvUser)
}
}
#else
+ /* Try to keep a consistent locking order. */
+ crHashtableLock(stub.windowTable);
crLockMutex(&stub.mutex);
- crHashtableWalk(stub.windowTable, stubSyncTrCheckWindowsCB, NULL);
+ crHashtableWalkUnlocked(stub.windowTable, stubSyncTrCheckWindowsCB, NULL);
crUnlockMutex(&stub.mutex);
+ crHashtableUnlock(stub.windowTable);
RTThreadSleep(50);
#endif
}
diff --git a/src/VBox/Additions/linux/drm/vboxvideo_drm.c b/src/VBox/Additions/linux/drm/vboxvideo_drm.c
index 7ac299e..37b9df7 100644
--- a/src/VBox/Additions/linux/drm/vboxvideo_drm.c
+++ b/src/VBox/Additions/linux/drm/vboxvideo_drm.c
@@ -155,7 +155,7 @@ static struct drm_driver driver =
#else /* LINUX_VERSION_CODE >= KERNEL_VERSION(3, 3, 0) || defined(DRM_FOPS_AS_POINTER) */
.fops = &driver_fops,
#endif
-#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 39) && !defined(DRM_RHEL61)
+#ifndef DRIVER_BUS_PCI
.pci_driver =
{
.name = DRIVER_NAME,
@@ -170,7 +170,7 @@ static struct drm_driver driver =
.patchlevel = DRIVER_PATCHLEVEL,
};
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 39) || defined(DRM_RHEL61)
+#ifdef DRIVER_BUS_PCI
static struct pci_driver pci_driver =
{
.name = DRIVER_NAME,
@@ -180,7 +180,7 @@ static struct pci_driver pci_driver =
static int __init vboxvideo_init(void)
{
-#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 39) && !defined(DRM_RHEL61)
+#ifndef DRIVER_BUS_PCI
return drm_init(&driver);
#else
return drm_pci_init(&driver, &pci_driver);
@@ -189,7 +189,7 @@ static int __init vboxvideo_init(void)
static void __exit vboxvideo_exit(void)
{
-#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 39) && !defined(DRM_RHEL61)
+#ifndef DRIVER_BUS_PCI
drm_exit(&driver);
#else
drm_pci_exit(&driver, &pci_driver);
diff --git a/src/VBox/Additions/x11/vboxmouse/undefined b/src/VBox/Additions/x11/vboxmouse/undefined
index 5a8f7b6..864f0a0 100644
--- a/src/VBox/Additions/x11/vboxmouse/undefined
+++ b/src/VBox/Additions/x11/vboxmouse/undefined
@@ -87,6 +87,7 @@ unlink
unsetenv
utimes
vfprintf
+__vfprintf_chk
write
xf86AddEnabledDevice
xf86AddInputDriver
diff --git a/src/VBox/Additions/x11/vboxvideo/undefined b/src/VBox/Additions/x11/vboxvideo/undefined
index c0d5d44..1a7c825 100644
--- a/src/VBox/Additions/x11/vboxvideo/undefined
+++ b/src/VBox/Additions/x11/vboxvideo/undefined
@@ -25,6 +25,7 @@ chdir
chmod
chown
close
+drmClose
drmFreeVersion
drmGetVersion
fbPictureInit
@@ -118,6 +119,7 @@ unlink
unsetenv
utimes
vfprintf
+__vfprintf_chk
vgaHWFreeHWRec
vgaHWGetHWRec
vgaHWGetIOBase
diff --git a/src/VBox/Additions/x11/vboxvideo/vboxvideo_dri.c b/src/VBox/Additions/x11/vboxvideo/vboxvideo_dri.c
index 4c0c861..1471a1b 100644
--- a/src/VBox/Additions/x11/vboxvideo/vboxvideo_dri.c
+++ b/src/VBox/Additions/x11/vboxvideo/vboxvideo_dri.c
@@ -270,10 +270,16 @@ Bool VBOXDRIScreenInit(ScrnInfoPtr pScrn, ScreenPtr pScreen, VBOXPtr pVBox)
pDRIInfo->bufferRequests = DRI_ALL_WINDOWS;
TRACE_LOG("Calling DRIScreenInit\n");
if (!DRIScreenInit(pScreen, pDRIInfo, &pVBox->drmFD))
+ {
rc = FALSE;
- if (!rc)
xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
"DRIScreenInit failed, disabling DRI.\n");
+ if (pVBox->drmFD)
+ {
+ drmClose(pVBox->drmFD);
+ pVBox->drmFD = -1;
+ }
+ }
}
if (rc && !VBOXInitVisualConfigs(pScrn, pVBox))
{
@@ -281,7 +287,8 @@ Bool VBOXDRIScreenInit(ScrnInfoPtr pScrn, ScreenPtr pScreen, VBOXPtr pVBox)
"VBOXInitVisualConfigs failed, disabling DRI.\n");
rc = FALSE;
}
- xf86DrvMsg(pScrn->scrnIndex, X_INFO, "visual configurations initialized\n");
+ else
+ xf86DrvMsg(pScrn->scrnIndex, X_INFO, "visual configurations initialized\n");
/* Check the DRM version */
if (rc)
@@ -304,12 +311,12 @@ Bool VBOXDRIScreenInit(ScrnInfoPtr pScrn, ScreenPtr pScreen, VBOXPtr pVBox)
/* Clean up on failure. */
if (!rc)
{
- if (pVBox->pDRIInfo)
- DRIDestroyInfoRec(pVBox->pDRIInfo);
- pVBox->pDRIInfo = NULL;
if (pVBox->drmFD >= 0)
VBOXDRICloseScreen(pScreen, pVBox);
pVBox->drmFD = -1;
+ if (pVBox->pDRIInfo)
+ DRIDestroyInfoRec(pVBox->pDRIInfo);
+ pVBox->pDRIInfo = NULL;
}
TRACE_LOG("returning %s\n", BOOL_STR(rc));
return rc;
diff --git a/src/VBox/Devices/EFI/Firmware/VBoxPkg/Library/VBoxDebugAgentLib/VBoxDebugAgentLib.inf b/src/VBox/Devices/EFI/Firmware/VBoxPkg/Library/VBoxDebugAgentLib/VBoxDebugAgentLib.inf
index 8f8ab05..1ab8828 100644
--- a/src/VBox/Devices/EFI/Firmware/VBoxPkg/Library/VBoxDebugAgentLib/VBoxDebugAgentLib.inf
+++ b/src/VBox/Devices/EFI/Firmware/VBoxPkg/Library/VBoxDebugAgentLib/VBoxDebugAgentLib.inf
@@ -1,6 +1,6 @@
# $Id: VBoxDebugAgentLib.inf $
## @file
-# VBox implementation of DebugAgentLib that reports EFI state transitions
+# VBox implementation of DebugAgentLib that reports EFI state transitions
# to DevEFI (for debugging purposes).
#
diff --git a/src/VBox/Devices/EFI/Firmware/VBoxPkg/Library/VBoxPeCoffExtraActionLib/VBoxPeCoffExtraActionLib.inf b/src/VBox/Devices/EFI/Firmware/VBoxPkg/Library/VBoxPeCoffExtraActionLib/VBoxPeCoffExtraActionLib.inf
index 9424241..d8cf9eb 100644
--- a/src/VBox/Devices/EFI/Firmware/VBoxPkg/Library/VBoxPeCoffExtraActionLib/VBoxPeCoffExtraActionLib.inf
+++ b/src/VBox/Devices/EFI/Firmware/VBoxPkg/Library/VBoxPeCoffExtraActionLib/VBoxPeCoffExtraActionLib.inf
@@ -1,6 +1,6 @@
# $Id: VBoxPeCoffExtraActionLib.inf $
## @file
-# VBox implementation of PeCoffExtraAction that reports EFI image load and
+# VBox implementation of PeCoffExtraAction that reports EFI image load and
# unload activies to the the VBox debugger via DevEFI.
#
diff --git a/src/VBox/Devices/EFI/FirmwareBin/VBoxEFI32.fd b/src/VBox/Devices/EFI/FirmwareBin/VBoxEFI32.fd
index ed79e9a..9040878 100644
Binary files a/src/VBox/Devices/EFI/FirmwareBin/VBoxEFI32.fd and b/src/VBox/Devices/EFI/FirmwareBin/VBoxEFI32.fd differ
diff --git a/src/VBox/Devices/EFI/FirmwareBin/VBoxEFI64.fd b/src/VBox/Devices/EFI/FirmwareBin/VBoxEFI64.fd
index fc58d6d..fd73b84 100644
Binary files a/src/VBox/Devices/EFI/FirmwareBin/VBoxEFI64.fd and b/src/VBox/Devices/EFI/FirmwareBin/VBoxEFI64.fd differ
diff --git a/src/VBox/Devices/Graphics/BIOS/VBoxVgaBiosAlternative.asm b/src/VBox/Devices/Graphics/BIOS/VBoxVgaBiosAlternative.asm
index ae277b1..14aab00 100644
--- a/src/VBox/Devices/Graphics/BIOS/VBoxVgaBiosAlternative.asm
+++ b/src/VBox/Devices/Graphics/BIOS/VBoxVgaBiosAlternative.asm
@@ -6781,7 +6781,7 @@ vesa_pm_end: ; 0xc4714 LB 0x1
section _DATA progbits vstart=0x4800 align=1 ; size=0x36e0 class=DATA group=DGROUP
_msg_vga_init: ; 0xc4800 LB 0x2e
- db 'Oracle VM VirtualBox Version 4.3.2 VGA BIOS', 00dh, 00ah, 000h
+ db 'Oracle VM VirtualBox Version 4.3.6 VGA BIOS', 00dh, 00ah, 000h
_vga_modes: ; 0xc482e LB 0x80
db 000h, 000h, 000h, 004h, 000h, 0b8h, 0ffh, 002h, 001h, 000h, 000h, 004h, 000h, 0b8h, 0ffh, 002h
db 002h, 000h, 000h, 004h, 000h, 0b8h, 0ffh, 002h, 003h, 000h, 000h, 004h, 000h, 0b8h, 0ffh, 002h
@@ -7669,7 +7669,7 @@ _vbebios_vendor_name: ; 0xc7e35 LB 0x13
_vbebios_product_name: ; 0xc7e48 LB 0x21
db 'Oracle VM VirtualBox VBE Adapter', 000h
_vbebios_product_revision: ; 0xc7e69 LB 0x23
- db 'Oracle VM VirtualBox Version 4.3.2', 000h
+ db 'Oracle VM VirtualBox Version 4.3.6', 000h
_vbebios_info_string: ; 0xc7e8c LB 0x2b
db 'VirtualBox VBE Display Adapter enabled', 00dh, 00ah, 00dh, 00ah, 000h
_no_vbebios_info_string: ; 0xc7eb7 LB 0x29
@@ -7697,4 +7697,4 @@ section CONST2 progbits vstart=0x7ee0 align=1 ; size=0x0 class=DATA group=DGROUP
db 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
db 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
db 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
- db 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 022h
+ db 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 01ah
diff --git a/src/VBox/Devices/Graphics/BIOS/VBoxVgaBiosAlternative.md5sum b/src/VBox/Devices/Graphics/BIOS/VBoxVgaBiosAlternative.md5sum
index 0595815..74cbcaa 100644
--- a/src/VBox/Devices/Graphics/BIOS/VBoxVgaBiosAlternative.md5sum
+++ b/src/VBox/Devices/Graphics/BIOS/VBoxVgaBiosAlternative.md5sum
@@ -1 +1 @@
-1c2f7c49886d552f181399b0323788a1 *VBoxVgaBios.rom
+91ea1d88bf4f3e90ef38a1983674c9db *VBoxVgaBios.rom
diff --git a/src/VBox/Devices/Graphics/DevVGA.cpp b/src/VBox/Devices/Graphics/DevVGA.cpp
index 19762e8..ee7de1b 100644
--- a/src/VBox/Devices/Graphics/DevVGA.cpp
+++ b/src/VBox/Devices/Graphics/DevVGA.cpp
@@ -1833,14 +1833,16 @@ static int vga_draw_text(PVGASTATE pThis, bool full_update, bool fFailOnResize,
bgcol = palette[cattr >> 4];
fgcol = palette[cattr & 0x0f];
if (cw != 9) {
- vga_draw_glyph8(d1, linesize,
- font_ptr, cheight, fgcol, bgcol, dscan);
+ if (pThis->fRenderVRAM)
+ vga_draw_glyph8(d1, linesize,
+ font_ptr, cheight, fgcol, bgcol, dscan);
} else {
dup9 = 0;
if (ch >= 0xb0 && ch <= 0xdf && (pThis->ar[0x10] & 0x04))
dup9 = 1;
- vga_draw_glyph9(d1, linesize,
- font_ptr, cheight, fgcol, bgcol, dup9);
+ if (pThis->fRenderVRAM)
+ vga_draw_glyph9(d1, linesize,
+ font_ptr, cheight, fgcol, bgcol, dup9);
}
if (src == cursor_ptr &&
!(pThis->cr[0x0a] & 0x20)) {
@@ -1855,11 +1857,13 @@ static int vga_draw_text(PVGASTATE pThis, bool full_update, bool fFailOnResize,
h = line_last - line_start + 1;
d = d1 + (linesize * line_start << dscan);
if (cw != 9) {
- vga_draw_glyph8(d, linesize,
- cursor_glyph, h, fgcol, bgcol, dscan);
+ if (pThis->fRenderVRAM)
+ vga_draw_glyph8(d, linesize,
+ cursor_glyph, h, fgcol, bgcol, dscan);
} else {
- vga_draw_glyph9(d, linesize,
- cursor_glyph, h, fgcol, bgcol, 1);
+ if (pThis->fRenderVRAM)
+ vga_draw_glyph9(d, linesize,
+ cursor_glyph, h, fgcol, bgcol, 1);
}
}
}
@@ -2268,9 +2272,12 @@ static void vga_draw_blank(PVGASTATE pThis, int full_update)
val = 0;
w = pThis->last_scr_width * ((pThis->pDrv->cBits + 7) >> 3);
d = pThis->pDrv->pu8Data;
- for(i = 0; i < (int)pThis->last_scr_height; i++) {
- memset(d, val, w);
- d += cbScanline;
+ if (pThis->fRenderVRAM)
+ {
+ for(i = 0; i < (int)pThis->last_scr_height; i++) {
+ memset(d, val, w);
+ d += cbScanline;
+ }
}
pThis->pDrv->pfnUpdateRect(pThis->pDrv, 0, 0, pThis->last_scr_width, pThis->last_scr_height);
}
@@ -4945,7 +4952,12 @@ static DECLCALLBACK(void) vgaPortSetRenderVRAM(PPDMIDISPLAYPORT pInterface, bool
LogFlow(("vgaPortSetRenderVRAM: fRender = %d\n", fRender));
+ int rc = PDMCritSectEnter(&pThis->CritSect, VERR_SEM_BUSY);
+ AssertRC(rc);
+
pThis->fRenderVRAM = fRender;
+
+ PDMCritSectLeave(&pThis->CritSect);
}
@@ -4964,6 +4976,11 @@ static DECLCALLBACK(void) vgaTimerRefresh(PPDMDEVINS pDevIns, PTMTIMER pTimer, v
if (pThis->cMilliesRefreshInterval)
TMTimerSetMillies(pTimer, pThis->cMilliesRefreshInterval);
+
+#ifdef VBOX_WITH_VIDEOHWACCEL
+ vbvaTimerCb(pThis);
+#endif
+
}
diff --git a/src/VBox/Devices/Graphics/DevVGA.h b/src/VBox/Devices/Graphics/DevVGA.h
index 6a18e50..530e943 100644
--- a/src/VBox/Devices/Graphics/DevVGA.h
+++ b/src/VBox/Devices/Graphics/DevVGA.h
@@ -64,6 +64,8 @@
#endif /* VBOX_WITH_HGSMI */
#include "DevVGASavedState.h"
+# include <iprt/list.h>
+
#define MSR_COLOR_EMULATION 0x01
#define MSR_PAGE_SELECT 0x20
@@ -195,6 +197,16 @@ typedef void FNCURSORDRAWLINE(struct VGAState *s, uint8_t *d, int y);
typedef struct VBOXVDMAHOST *PVBOXVDMAHOST;
#endif
+#ifdef VBOX_WITH_VIDEOHWACCEL
+#define VBOX_VHWA_MAX_PENDING_COMMANDS 1000
+
+typedef struct _VBOX_VHWA_PENDINGCMD
+{
+ RTLISTNODE Node;
+ PVBOXVHWACMD pCommand;
+} VBOX_VHWA_PENDINGCMD;
+#endif
+
typedef struct VGAState {
#ifndef VBOX
VGA_STATE_COMMON
@@ -419,6 +431,21 @@ typedef struct VGAState {
uint8_t Padding10[14];
# endif
# endif /* VBOX_WITH_HGSMI */
+
+ struct {
+ volatile uint32_t cPending;
+ uint32_t Padding1;
+ union
+ {
+ RTLISTNODE PendingList;
+ /* make sure the structure sized cross different contexts correctly */
+ struct
+ {
+ R3PTRTYPE(void *) dummy1;
+ R3PTRTYPE(void *) dummy2;
+ } dummy;
+ };
+ } pendingVhwaCommands;
#endif /* VBOX */
} VGAState;
#ifdef VBOX
@@ -495,6 +522,8 @@ int vbvaVHWACommandCompleteAsynch(PPDMIDISPLAYVBVACALLBACKS pInterface, PVBOXVHW
int vbvaVHWAConstruct (PVGASTATE pVGAState);
int vbvaVHWAReset (PVGASTATE pVGAState);
+void vbvaTimerCb(PVGASTATE pVGAState);
+
int vboxVBVASaveStatePrep (PPDMDEVINS pDevIns, PSSMHANDLE pSSM);
int vboxVBVASaveStateDone (PPDMDEVINS pDevIns, PSSMHANDLE pSSM);
# endif
diff --git a/src/VBox/Devices/Graphics/DevVGASavedState.h b/src/VBox/Devices/Graphics/DevVGASavedState.h
index 75facfc..377a807 100644
--- a/src/VBox/Devices/Graphics/DevVGASavedState.h
+++ b/src/VBox/Devices/Graphics/DevVGASavedState.h
@@ -22,7 +22,8 @@
#ifndef Graphics_DevVGASavedState_h
#define Graphics_DevVGASavedState_h
-#define VGA_SAVEDSTATE_VERSION 9
+#define VGA_SAVEDSTATE_VERSION 10
+#define VGA_SAVEDSTATE_VERSION_WITH_PENDVHWA 10
#define VGA_SAVEDSTATE_VERSION_INV_GCMDFIFO 8 /* <- states upto and including this version may contain invalid completed Guest Commands fifo entries */
#define VGA_SAVEDSTATE_VERSION_INV_VHEIGHT 8 /* <- states upto and including this version may contain invalid vbe_regs[VBE_DISPI_INDEX_VIRT_HEIGHT] value */
#define VGA_SAVEDSTATE_VERSION_WDDM 7
diff --git a/src/VBox/Devices/Graphics/DevVGA_VBVA.cpp b/src/VBox/Devices/Graphics/DevVGA_VBVA.cpp
index 10c8e5e..b37fcd2 100644
--- a/src/VBox/Devices/Graphics/DevVGA_VBVA.cpp
+++ b/src/VBox/Devices/Graphics/DevVGA_VBVA.cpp
@@ -629,6 +629,13 @@ static int vbvaMousePointerShape (PVGASTATE pVGAState, VBVACONTEXT *pCtx, const
if (fShape)
{
+ if (pShape->u32Width > 8192 || pShape->u32Height > 8192)
+ {
+ Log(("vbvaMousePointerShape: unsupported size %ux%u\n",
+ pShape->u32Width, pShape->u32Height));
+ return VERR_INVALID_PARAMETER;
+ }
+
cbPointerData = ((((pShape->u32Width + 7) / 8) * pShape->u32Height + 3) & ~3)
+ pShape->u32Width * 4 * pShape->u32Height;
}
@@ -766,7 +773,7 @@ static void vbvaVHWAHHCommandReinit(VBOXVHWACMD* pHdr, VBOXVHWACMD_TYPE enmCmd,
static VBOXVHWACMD* vbvaVHWAHHCommandCreate (PVGASTATE pVGAState, VBOXVHWACMD_TYPE enmCmd, int32_t iDisplay, VBOXVHWACMD_LENGTH cbCmd)
{
- VBOXVHWACMD* pHdr = (VBOXVHWACMD*)RTMemAlloc(cbCmd + VBOXVHWACMD_HEADSIZE());
+ VBOXVHWACMD* pHdr = (VBOXVHWACMD*)RTMemAllocZ(cbCmd + VBOXVHWACMD_HEADSIZE());
Assert(pHdr);
if (pHdr)
vbvaVHWAHHCommandReinit(pHdr, enmCmd, iDisplay);
@@ -788,15 +795,237 @@ DECLINLINE(void) vbvaVHWAHHCommandRetain (VBOXVHWACMD* pCmd)
ASMAtomicIncU32(&pCmd->cRefs);
}
-static unsigned vbvaVHWAHandleCommand (PVGASTATE pVGAState, VBVACONTEXT *pCtx, PVBOXVHWACMD pCmd)
+static void vbvaVHWACommandComplete(PVGASTATE pVGAState, PVBOXVHWACMD pCommand, bool fAsyncCommand)
+{
+ if (fAsyncCommand)
+ {
+ Assert(pCommand->Flags & VBOXVHWACMD_FLAG_HG_ASYNCH);
+ vbvaVHWACommandCompleteAsynch(&pVGAState->IVBVACallbacks, pCommand);
+ }
+ else
+ {
+ Log(("VGA Command <<< Sync rc %d %#p, %d\n", pCommand->rc, pCommand, pCommand->enmCmd));
+ pCommand->Flags &= (~VBOXVHWACMD_FLAG_HG_ASYNCH);
+ }
+
+}
+
+static void vbvaVHWACommandCompleteAllPending(PVGASTATE pVGAState, int rc)
+{
+ if (!ASMAtomicUoReadU32(&pVGAState->pendingVhwaCommands.cPending))
+ return;
+
+ VBOX_VHWA_PENDINGCMD *pIter, *pNext;
+
+ PDMCritSectEnter(&pVGAState->CritSect, VERR_SEM_BUSY);
+
+ RTListForEachSafe(&pVGAState->pendingVhwaCommands.PendingList, pIter, pNext, VBOX_VHWA_PENDINGCMD, Node)
+ {
+ pIter->pCommand->rc = rc;
+ vbvaVHWACommandComplete(pVGAState, pIter->pCommand, true);
+
+ /* the command is submitted/processed, remove from the pend list */
+ RTListNodeRemove(&pIter->Node);
+ ASMAtomicDecU32(&pVGAState->pendingVhwaCommands.cPending);
+ RTMemFree(pIter);
+ }
+
+ PDMCritSectLeave(&pVGAState->CritSect);
+}
+
+static void vbvaVHWACommandClearAllPending(PVGASTATE pVGAState)
+{
+ if (!ASMAtomicUoReadU32(&pVGAState->pendingVhwaCommands.cPending))
+ return;
+
+ VBOX_VHWA_PENDINGCMD *pIter, *pNext;
+
+ PDMCritSectEnter(&pVGAState->CritSect, VERR_SEM_BUSY);
+
+ RTListForEachSafe(&pVGAState->pendingVhwaCommands.PendingList, pIter, pNext, VBOX_VHWA_PENDINGCMD, Node)
+ {
+ RTListNodeRemove(&pIter->Node);
+ ASMAtomicDecU32(&pVGAState->pendingVhwaCommands.cPending);
+ RTMemFree(pIter);
+ }
+
+ PDMCritSectLeave(&pVGAState->CritSect);
+}
+
+static void vbvaVHWACommandPend(PVGASTATE pVGAState, PVBOXVHWACMD pCommand)
+{
+ int rc = VERR_BUFFER_OVERFLOW;
+
+ if (ASMAtomicUoReadU32(&pVGAState->pendingVhwaCommands.cPending) < VBOX_VHWA_MAX_PENDING_COMMANDS)
+ {
+ VBOX_VHWA_PENDINGCMD *pPend = (VBOX_VHWA_PENDINGCMD*)RTMemAlloc(sizeof (*pPend));
+ if (pPend)
+ {
+ pCommand->Flags |= VBOXVHWACMD_FLAG_HG_ASYNCH;
+ pPend->pCommand = pCommand;
+ PDMCritSectEnter(&pVGAState->CritSect, VERR_SEM_BUSY);
+ if (ASMAtomicUoReadU32(&pVGAState->pendingVhwaCommands.cPending) < VBOX_VHWA_MAX_PENDING_COMMANDS)
+ {
+ RTListAppend(&pVGAState->pendingVhwaCommands.PendingList, &pPend->Node);
+ ASMAtomicIncU32(&pVGAState->pendingVhwaCommands.cPending);
+ PDMCritSectLeave(&pVGAState->CritSect);
+ return;
+ }
+ PDMCritSectLeave(&pVGAState->CritSect);
+ LogRel(("Pending command count has reached its threshold.. completing them all.."));
+ RTMemFree(pPend);
+ }
+ else
+ rc = VERR_NO_MEMORY;
+ }
+ else
+ LogRel(("Pending command count has reached its threshold, completing them all.."));
+
+ vbvaVHWACommandCompleteAllPending(pVGAState, rc);
+
+ pCommand->rc = rc;
+
+ vbvaVHWACommandComplete(pVGAState, pCommand, false);
+}
+
+static bool vbvaVHWACommandCanPend(PVBOXVHWACMD pCommand)
{
+ switch (pCommand->enmCmd)
+ {
+ case VBOXVHWACMD_TYPE_HH_CONSTRUCT:
+ case VBOXVHWACMD_TYPE_HH_SAVESTATE_SAVEBEGIN:
+ case VBOXVHWACMD_TYPE_HH_SAVESTATE_SAVEEND:
+ case VBOXVHWACMD_TYPE_HH_SAVESTATE_SAVEPERFORM:
+ case VBOXVHWACMD_TYPE_HH_SAVESTATE_LOADPERFORM:
+ return false;
+ default:
+ return true;
+ }
+}
+
+static int vbvaVHWACommandSavePending(PVGASTATE pVGAState, PSSMHANDLE pSSM)
+{
+ int rc = SSMR3PutU32(pSSM, pVGAState->pendingVhwaCommands.cPending);
+ AssertRCReturn(rc, rc);
+ VBOX_VHWA_PENDINGCMD *pIter;
+ RTListForEach(&pVGAState->pendingVhwaCommands.PendingList, pIter, VBOX_VHWA_PENDINGCMD, Node)
+ {
+ rc = SSMR3PutU32(pSSM, (uint32_t)(((uint8_t*)pIter->pCommand) - ((uint8_t*)pVGAState->vram_ptrR3)));
+ AssertRCReturn(rc, rc);
+ }
+ return rc;
+}
+
+static int vbvaVHWACommandLoadPending(PVGASTATE pVGAState, PSSMHANDLE pSSM, uint32_t u32Version)
+{
+ if (u32Version < VGA_SAVEDSTATE_VERSION_WITH_PENDVHWA)
+ return VINF_SUCCESS;
+
+ int rc;
+ uint32_t u32;
+ rc = SSMR3GetU32(pSSM, &u32);
+ AssertRCReturn(rc, rc);
+ for (uint32_t i = 0; i < u32; ++i)
+ {
+ uint32_t off32;
+ rc = SSMR3GetU32(pSSM, &off32);
+ AssertRCReturn(rc, rc);
+ PVBOXVHWACMD pCommand = (PVBOXVHWACMD)(((uint8_t*)pVGAState->vram_ptrR3) + off32);
+ vbvaVHWACommandPend(pVGAState, pCommand);
+ }
+ return rc;
+}
+
+
+static bool vbvaVHWACommandSubmit(PVGASTATE pVGAState, PVBOXVHWACMD pCommand, bool fAsyncCommand)
+{
+ unsigned id = (unsigned)pCommand->iDisplay;
+ bool fPend = false;
+
if (pVGAState->pDrv->pfnVHWACommandProcess)
- pVGAState->pDrv->pfnVHWACommandProcess(pVGAState->pDrv, pCmd);
-#ifdef DEBUG_misha
+ {
+ Log(("VGA Command >>> %#p, %d\n", pCommand, pCommand->enmCmd));
+ int rc = pVGAState->pDrv->pfnVHWACommandProcess(pVGAState->pDrv, pCommand);
+ if (rc == VINF_CALLBACK_RETURN)
+ {
+ Log(("VGA Command --- Going Async %#p, %d\n", pCommand, pCommand->enmCmd));
+ return true; /* command will be completed asynchronously, return right away */
+ }
+ else if (rc == VERR_INVALID_STATE)
+ {
+ Log(("VGA Command --- Trying Pend %#p, %d\n", pCommand, pCommand->enmCmd));
+ fPend = vbvaVHWACommandCanPend(pCommand);
+ if (!fPend)
+ {
+ Log(("VGA Command --- Can NOT Pend %#p, %d\n", pCommand, pCommand->enmCmd));
+ pCommand->rc = rc;
+ }
+ else
+ Log(("VGA Command --- Can Pend %#p, %d\n", pCommand, pCommand->enmCmd));
+ }
+ else
+ {
+ Log(("VGA Command --- Going Complete Sync rc %d %#p, %d\n", rc, pCommand, pCommand->enmCmd));
+ pCommand->rc = rc;
+ }
+
+ /* the command was completed, take a special care about it (seee below) */
+ }
else
+ {
AssertFailed();
-#endif
- return 0;
+ pCommand->rc = VERR_INVALID_STATE;
+ }
+
+ if (fPend)
+ return false;
+
+ vbvaVHWACommandComplete(pVGAState, pCommand, fAsyncCommand);
+
+ return true;
+}
+
+static bool vbvaVHWACheckPendingCommands(PVGASTATE pVGAState)
+{
+ if (!ASMAtomicUoReadU32(&pVGAState->pendingVhwaCommands.cPending))
+ return true;
+
+ VBOX_VHWA_PENDINGCMD *pIter, *pNext;
+
+ PDMCritSectEnter(&pVGAState->CritSect, VERR_SEM_BUSY);
+
+ RTListForEachSafe(&pVGAState->pendingVhwaCommands.PendingList, pIter, pNext, VBOX_VHWA_PENDINGCMD, Node)
+ {
+ if (!vbvaVHWACommandSubmit(pVGAState, pIter->pCommand, true))
+ {
+ PDMCritSectLeave(&pVGAState->CritSect);
+ return false; /* the command should be pended still */
+ }
+
+ /* the command is submitted/processed, remove from the pend list */
+ RTListNodeRemove(&pIter->Node);
+ ASMAtomicDecU32(&pVGAState->pendingVhwaCommands.cPending);
+ RTMemFree(pIter);
+ }
+
+ PDMCritSectLeave(&pVGAState->CritSect);
+
+ return true;
+}
+
+void vbvaTimerCb(PVGASTATE pVGAState)
+{
+ vbvaVHWACheckPendingCommands(pVGAState);
+}
+static void vbvaVHWAHandleCommand(PVGASTATE pVGAState, PVBOXVHWACMD pCmd)
+{
+ if (vbvaVHWACheckPendingCommands(pVGAState))
+ {
+ if (vbvaVHWACommandSubmit(pVGAState, pCmd, false))
+ return;
+ }
+
+ vbvaVHWACommandPend(pVGAState, pCmd);
}
static DECLCALLBACK(void) vbvaVHWAHHCommandSetEventCallback(void * pContext)
@@ -814,7 +1043,7 @@ static int vbvaVHWAHHCommandPost(PVGASTATE pVGAState, VBOXVHWACMD* pCmd)
/* ensure the cmd is not deleted until we process it */
vbvaVHWAHHCommandRetain (pCmd);
VBOXVHWA_HH_CALLBACK_SET(pCmd, vbvaVHWAHHCommandSetEventCallback, (void*)hComplEvent);
- vbvaVHWAHandleCommand(pVGAState, NULL, pCmd);
+ vbvaVHWAHandleCommand(pVGAState, pCmd);
if((ASMAtomicReadU32((volatile uint32_t *)&pCmd->Flags) & VBOXVHWACMD_FLAG_HG_ASYNCH) != 0)
{
rc = RTSemEventWaitNoResume(hComplEvent, RT_INDEFINITE_WAIT);
@@ -836,6 +1065,9 @@ static int vbvaVHWAHHCommandPost(PVGASTATE pVGAState, VBOXVHWACMD* pCmd)
int vbvaVHWAConstruct (PVGASTATE pVGAState)
{
+ pVGAState->pendingVhwaCommands.cPending = 0;
+ RTListInit(&pVGAState->pendingVhwaCommands.PendingList);
+
VBOXVHWACMD *pCmd = vbvaVHWAHHCommandCreate(pVGAState, VBOXVHWACMD_TYPE_HH_CONSTRUCT, 0, sizeof(VBOXVHWACMD_HH_CONSTRUCT));
Assert(pCmd);
if(pCmd)
@@ -889,6 +1121,8 @@ int vbvaVHWAConstruct (PVGASTATE pVGAState)
int vbvaVHWAReset (PVGASTATE pVGAState)
{
+ vbvaVHWACommandClearAllPending(pVGAState);
+
/* ensure we have all pending cmds processed and h->g cmds disabled */
VBOXVHWACMD *pCmd = vbvaVHWAHHCommandCreate(pVGAState, VBOXVHWACMD_TYPE_HH_RESET, 0, 0);
Assert(pCmd);
@@ -1008,6 +1242,8 @@ int vboxVBVASaveStateDone (PPDMDEVINS pDevIns, PSSMHANDLE pSSM)
int vbvaVHWACommandCompleteAsynch(PPDMIDISPLAYVBVACALLBACKS pInterface, PVBOXVHWACMD pCmd)
{
int rc;
+ Log(("VGA Command <<< Async rc %d %#p, %d\n", pCmd->rc, pCmd, pCmd->enmCmd));
+
if((pCmd->Flags & VBOXVHWACMD_FLAG_HH_CMD) == 0)
{
PVGASTATE pVGAState = PPDMIDISPLAYVBVACALLBACKS_2_PVGASTATE(pInterface);
@@ -1393,6 +1629,9 @@ int vboxVBVASaveStateExec (PPDMDEVINS pDevIns, PSSMHANDLE pSSM)
AssertRC(rc);
if (RT_SUCCESS(rc))
{
+ rc = vbvaVHWACommandSavePending(pVGAState, pSSM);
+ AssertRCReturn(rc, rc);
+
vbvaVHWAHHCommandReinit(pCmd, VBOXVHWACMD_TYPE_HH_SAVESTATE_SAVEEND, 0);
vbvaVHWAHHPost (pVGAState, pCmd, vboxVBVASaveStateEndPreCb, NULL, &VhwaData);
rc = VhwaData.rc;
@@ -1587,8 +1826,11 @@ int vboxVBVALoadStateExec (PPDMDEVINS pDevIns, PSSMHANDLE pSSM, uint32_t u32Vers
pLoad->pSSM = pSSM;
vbvaVHWAHHPost (pVGAState, pCmd, vboxVBVALoadStatePerformPreCb, vboxVBVALoadStatePerformPostCb, &VhwaData);
rc = VhwaData.rc;
- AssertRC(rc);
vbvaVHWAHHCommandRelease(pCmd);
+ AssertRCReturn(rc, rc);
+
+ rc = vbvaVHWACommandLoadPending(pVGAState, pSSM, u32Version);
+ AssertRCReturn(rc, rc);
}
else
{
@@ -1972,7 +2214,14 @@ static DECLCALLBACK(int) vbvaChannelHandler (void *pvHandler, uint16_t u16Channe
#ifdef VBOX_WITH_VIDEOHWACCEL
case VBVA_VHWA_CMD:
{
- rc = vbvaVHWAHandleCommand (pVGAState, pCtx, (PVBOXVHWACMD)pvBuffer);
+ if (cbBuffer < sizeof (VBOXVHWACMD))
+ {
+ rc = VERR_INVALID_PARAMETER;
+ break;
+ }
+ vbvaVHWAHandleCommand(pVGAState, (PVBOXVHWACMD)pvBuffer);
+ rc = VINF_SUCCESS;
+ break;
} break;
#endif
diff --git a/src/VBox/Devices/Graphics/HGSMI/HGSMIHost.cpp b/src/VBox/Devices/Graphics/HGSMI/HGSMIHost.cpp
index abf4580..b28efa0 100644
--- a/src/VBox/Devices/Graphics/HGSMI/HGSMIHost.cpp
+++ b/src/VBox/Devices/Graphics/HGSMI/HGSMIHost.cpp
@@ -1039,19 +1039,12 @@ int HGSMIHostCommandProcessAndFreeAsynch (PHGSMIINSTANCE pIns,
{
LogFlowFunc(("pIns = %p, pvMem = %p\n", pIns, pvMem));
- VM_ASSERT_OTHER_THREAD(pIns->pVM);
-
#if 0
void *pvContext = NULL;
#endif
HGSMIOFFSET offBuffer = HGSMIHeapBufferOffset (&pIns->hostHeap, pvMem);
-// /* Have to forward to EMT because FIFO processing is there. */
-// int rc = VMR3ReqCallVoid (pIns->pVM, &pReq, RT_INDEFINITE_WAIT,
-// (PFNRT) hgsmiHostCommandProcess,
-// 3, pIns, offBuffer, &pvContext);
-
int rc = hgsmiHostCommandProcess (pIns, offBuffer,
#if 0
hgsmiHostCommandFreeCallback, &pvContext,
diff --git a/src/VBox/Devices/Input/DevPS2.cpp b/src/VBox/Devices/Input/DevPS2.cpp
index 6b8580f..12d58bf 100644
--- a/src/VBox/Devices/Input/DevPS2.cpp
+++ b/src/VBox/Devices/Input/DevPS2.cpp
@@ -1424,6 +1424,18 @@ static DECLCALLBACK(int) kbdLoadExec(PPDMDEVINS pDevIns, PSSMHANDLE pSSM, uint32
}
/**
+ * @callback_method_impl{FNSSMDEVLOADDONE, Key state fix-up after loading
+ */
+static DECLCALLBACK(int) kbdLoadDone(PPDMDEVINS pDevIns, PSSMHANDLE pSSM)
+{
+ KBDState *pThis = PDMINS_2_DATA(pDevIns, KBDState *);
+ int rc;
+
+ rc = PS2KLoadDone(&pThis->Kbd, pSSM);
+ return rc;
+}
+
+/**
* Reset notification.
*
* @returns VBox status.
@@ -1707,7 +1719,10 @@ fGCEnabled = fR0Enabled = false;
if (RT_FAILURE(rc))
return rc;
}
- rc = PDMDevHlpSSMRegister(pDevIns, PCKBD_SAVED_STATE_VERSION, sizeof(*pThis), kbdSaveExec, kbdLoadExec);
+ rc = PDMDevHlpSSMRegisterEx(pDevIns, PCKBD_SAVED_STATE_VERSION, sizeof(*pThis), NULL,
+ NULL, NULL, NULL,
+ NULL, kbdSaveExec, NULL,
+ NULL, kbdLoadExec, kbdLoadDone);
if (RT_FAILURE(rc))
return rc;
diff --git a/src/VBox/Devices/Input/PS2Dev.h b/src/VBox/Devices/Input/PS2Dev.h
index be31f1e..bdb3243 100644
--- a/src/VBox/Devices/Input/PS2Dev.h
+++ b/src/VBox/Devices/Input/PS2Dev.h
@@ -50,6 +50,7 @@ void PS2KReset(PPS2K pThis);
void PS2KRelocate(PPS2K pThis, RTGCINTPTR offDelta, PPDMDEVINS pDevIns);
void PS2KSaveState(PPS2K pThis, PSSMHANDLE pSSM);
int PS2KLoadState(PPS2K pThis, PSSMHANDLE pSSM, uint32_t uVersion);
+int PS2KLoadDone(PPS2K pThis, PSSMHANDLE pSSM);
PS2K *KBDGetPS2KFromDevIns(PPDMDEVINS pDevIns);
diff --git a/src/VBox/Devices/Input/PS2K.cpp b/src/VBox/Devices/Input/PS2K.cpp
index 68d8dc2..e933fbc 100644
--- a/src/VBox/Devices/Input/PS2K.cpp
+++ b/src/VBox/Devices/Input/PS2K.cpp
@@ -74,7 +74,7 @@
#define KRSP_ID1 0xAB
#define KRSP_ID2 0x83
#define KRSP_BAT_OK 0xAA
-#define KRSP_BAT_FAIL 0xFC
+#define KRSP_BAT_FAIL 0xFC /* Also a 'release keys' signal. */
#define KRSP_ECHO 0xEE
#define KRSP_ACK 0xFA
#define KRSP_RESEND 0xFE
@@ -1140,6 +1140,25 @@ static DECLCALLBACK(void) ps2kDelayTimer(PPDMDEVINS pDevIns, PTMTIMER pTimer, vo
KBCUpdateInterrupts(pThis->pParent);
}
+/* Release any and all currently depressed keys. Used whenever the guest keyboard
+ * is likely to be out of sync with the host, such as when loading a saved state
+ * or resuming a suspended host.
+ */
+static void ps2kReleaseKeys(PPS2K pThis)
+{
+ LogFlowFunc(("Releasing keys...\n"));
+ LogRel(("Releasing keys...\n"));
+
+ for (unsigned uKey = 0; uKey < sizeof(pThis->abDepressedKeys); ++uKey)
+ if (pThis->abDepressedKeys[uKey])
+ {
+ LogRel(("Releasing key %02X\n", uKey));
+ psk2ProcessKeyEvent(pThis, uKey, false /* key up */);
+ pThis->abDepressedKeys[uKey] = 0;
+ }
+ LogFlowFunc(("Done releasing keys\n"));
+}
+
/**
* Debug device info handler. Prints basic keyboard state.
@@ -1239,17 +1258,34 @@ static DECLCALLBACK(int) ps2kPutEventWrapper(PPDMIKEYBOARDPORT pInterface, uint8
{
PPS2K pThis = RT_FROM_MEMBER(pInterface, PS2K, Keyboard.IPort);
uint32_t u32Usage = 0;
+ int rc;
LogFlowFunc(("key code %02X\n", u8KeyCode));
- pThis->XlatState = ScancodeToHidUsage(pThis->XlatState, u8KeyCode, &u32Usage);
- if (pThis->XlatState == SS_IDLE)
+ /* The 'BAT fail' scancode is reused as a signal to release keys. No actual
+ * key is allowed to use this scancode.
+ */
+ if (RT_UNLIKELY(u8KeyCode == KRSP_BAT_FAIL))
{
- /* Stupid Korean key hack: convert a lone break key into a press/release sequence. */
- if (u32Usage == 0x80000090 || u32Usage == 0x80000091)
- ps2kPutEventWorker(pThis, u32Usage & ~0x80000000);
+ rc = PDMCritSectEnter(pThis->pCritSectR3, VERR_SEM_BUSY);
+ AssertReleaseRC(rc);
+
+ ps2kReleaseKeys(pThis);
- ps2kPutEventWorker(pThis, u32Usage);
+ PDMCritSectLeave(pThis->pCritSectR3);
+ }
+ else
+ {
+ pThis->XlatState = ScancodeToHidUsage(pThis->XlatState, u8KeyCode, &u32Usage);
+
+ if (pThis->XlatState == SS_IDLE)
+ {
+ /* Stupid Korean key hack: convert a lone break key into a press/release sequence. */
+ if (u32Usage == 0x80000090 || u32Usage == 0x80000091)
+ ps2kPutEventWorker(pThis, u32Usage & ~0x80000000);
+
+ ps2kPutEventWorker(pThis, u32Usage);
+ }
}
return VINF_SUCCESS;
@@ -1340,9 +1376,9 @@ void PS2KSaveState(PPS2K pThis, PSSMHANDLE pSSM)
SSMR3PutU32(pSSM, cPressed);
- for (unsigned i = 0; i < sizeof(pThis->abDepressedKeys); ++i)
- if (pThis->abDepressedKeys[i])
- SSMR3PutU8(pSSM, pThis->abDepressedKeys[i]);
+ for (unsigned uKey = 0; uKey < sizeof(pThis->abDepressedKeys); ++uKey)
+ if (pThis->abDepressedKeys[uKey])
+ SSMR3PutU8(pSSM, uKey);
/* Save the typematic settings for Scan Set 3. */
SSMR3PutU32(pSSM, cbTMSSize);
@@ -1388,11 +1424,15 @@ int PS2KLoadState(PPS2K pThis, PSSMHANDLE pSSM, uint32_t uVersion)
rc = SSMR3GetU32(pSSM, &cPressed);
AssertRCReturn(rc, rc);
- while (cPressed--)
+ /* If any keys were down, load and then release them. */
+ if (cPressed)
{
- rc = SSMR3GetU8(pSSM, &u8);
- AssertRCReturn(rc, rc);
- psk2ProcessKeyEvent(pThis, u8, false /* key up */);
+ for (unsigned i = 0; i < cPressed; ++i)
+ {
+ rc = SSMR3GetU8(pSSM, &u8);
+ AssertRCReturn(rc, rc);
+ pThis->abDepressedKeys[u8] = 1;
+ }
}
/* Load typematic settings for Scan Set 3. */
@@ -1408,6 +1448,15 @@ int PS2KLoadState(PPS2K pThis, PSSMHANDLE pSSM, uint32_t uVersion)
return rc;
}
+int PS2KLoadDone(PPS2K pThis, PSSMHANDLE pSSM)
+{
+ /* This *must* be done after the inital load because it may trigger
+ * interrupts and change the interrupt controller state.
+ */
+ ps2kReleaseKeys(pThis);
+ return VINF_SUCCESS;
+}
+
void PS2KReset(PPS2K pThis)
{
LogFlowFunc(("Resetting PS2K\n"));
diff --git a/src/VBox/Devices/Makefile.kmk b/src/VBox/Devices/Makefile.kmk
index 477336e..b643851 100644
--- a/src/VBox/Devices/Makefile.kmk
+++ b/src/VBox/Devices/Makefile.kmk
@@ -893,7 +893,10 @@ if !defined(VBOX_ONLY_EXTPACKS) # Goes on almost to the end of the file.
VBoxDD2_LIBS = \
$(PATH_STAGE_LIB)/PcBiosBin$(VBOX_SUFF_LIB) \
$(PATH_STAGE_LIB)/VgaBiosBin$(VBOX_SUFF_LIB) \
- $(if $(VBOX_WITH_PXE_ROM),$(PATH_STAGE_LIB)/iPxeBiosBin$(VBOX_SUFF_LIB),) \
+ $(if $(VBOX_WITH_PXE_ROM),\
+ $(if $(VBOX_WITH_INTEL_PXE),\
+ $(PATH_STAGE_LIB)/NetBiosBin$(VBOX_SUFF_LIB),\
+ $(PATH_STAGE_LIB)/iPxeBiosBin$(VBOX_SUFF_LIB)),) \
$(LIB_VMM) \
$(LIB_RUNTIME)
VBoxDD2_LIBS.darwin += $(LIB_REM)
diff --git a/src/VBox/Devices/Network/DevE1000.cpp b/src/VBox/Devices/Network/DevE1000.cpp
index b9e1eea..b8f9ebf 100644
--- a/src/VBox/Devices/Network/DevE1000.cpp
+++ b/src/VBox/Devices/Network/DevE1000.cpp
@@ -1526,6 +1526,8 @@ DECLINLINE(const char *) e1kGetTimerName(PE1KSTATE pThis, PTMTIMER pTimer)
return "Int";
if (pTimer == pThis->CTX_SUFF(pTXDTimer))
return "TXD";
+ if (pTimer == pThis->CTX_SUFF(pLUTimer))
+ return "LinkUp";
return "unknown";
}
@@ -2517,6 +2519,60 @@ DECLINLINE(void) e1kBringLinkUpDelayed(PE1KSTATE pThis)
e1kArmTimer(pThis, pThis->CTX_SUFF(pLUTimer), pThis->cMsLinkUpDelay * 1000);
}
+#ifdef IN_RING3
+/**
+ * Bring up the link immediately.
+ *
+ * @param pThis The device state structure.
+ */
+DECLINLINE(void) e1kR3LinkUp(PE1KSTATE pThis)
+{
+ E1kLog(("%s Link is up\n", pThis->szPrf));
+ STATUS |= STATUS_LU;
+ Phy::setLinkStatus(&pThis->phy, true);
+ e1kRaiseInterrupt(pThis, VERR_SEM_BUSY, ICR_LSC);
+ if (pThis->pDrvR3)
+ pThis->pDrvR3->pfnNotifyLinkChanged(pThis->pDrvR3, PDMNETWORKLINKSTATE_UP);
+}
+
+/**
+ * Bring down the link immediately.
+ *
+ * @param pThis The device state structure.
+ */
+DECLINLINE(void) e1kR3LinkDown(PE1KSTATE pThis)
+{
+ E1kLog(("%s Link is down\n", pThis->szPrf));
+ STATUS &= ~STATUS_LU;
+ e1kRaiseInterrupt(pThis, VERR_SEM_BUSY, ICR_LSC);
+ if (pThis->pDrvR3)
+ pThis->pDrvR3->pfnNotifyLinkChanged(pThis->pDrvR3, PDMNETWORKLINKSTATE_DOWN);
+}
+
+/**
+ * Bring down the link temporarily.
+ *
+ * @param pThis The device state structure.
+ */
+DECLINLINE(void) e1kR3LinkDownTemp(PE1KSTATE pThis)
+{
+ E1kLog(("%s Link is down temporarily\n", pThis->szPrf));
+ STATUS &= ~STATUS_LU;
+ Phy::setLinkStatus(&pThis->phy, false);
+ e1kRaiseInterrupt(pThis, VERR_SEM_BUSY, ICR_LSC);
+ /*
+ * Notifying the associated driver that the link went down (even temporarily)
+ * seems to be the right thing, but it was not done before. This may cause
+ * a regression if the driver does not expect the link to go down as a result
+ * of sending PDMNETWORKLINKSTATE_DOWN_RESUME to this device. Earlier versions
+ * of code notified the driver that the link was up! See @bugref{7057}.
+ */
+ if (pThis->pDrvR3)
+ pThis->pDrvR3->pfnNotifyLinkChanged(pThis->pDrvR3, PDMNETWORKLINKSTATE_DOWN);
+ e1kBringLinkUpDelayed(pThis);
+}
+#endif /* IN_RING3 */
+
#if 0 /* unused */
/**
* Read handler for Device Status register.
@@ -3277,10 +3333,7 @@ static DECLCALLBACK(void) e1kLinkUpTimer(PPDMDEVINS pDevIns, PTMTIMER pTimer, vo
if (!pThis->fCableConnected)
return;
- E1kLog(("%s e1kLinkUpTimer: Link is up\n", pThis->szPrf));
- STATUS |= STATUS_LU;
- Phy::setLinkStatus(&pThis->phy, true);
- e1kRaiseInterrupt(pThis, VERR_SEM_BUSY, ICR_LSC);
+ e1kR3LinkUp(pThis);
}
#endif /* IN_RING3 */
@@ -6423,45 +6476,35 @@ static DECLCALLBACK(PDMNETWORKLINKSTATE) e1kR3GetLinkState(PPDMINETWORKCONFIG pI
static DECLCALLBACK(int) e1kR3SetLinkState(PPDMINETWORKCONFIG pInterface, PDMNETWORKLINKSTATE enmState)
{
PE1KSTATE pThis = RT_FROM_MEMBER(pInterface, E1KSTATE, INetworkConfig);
- bool fOldUp = !!(STATUS & STATUS_LU);
- bool fNewUp = enmState == PDMNETWORKLINKSTATE_UP || enmState == PDMNETWORKLINKSTATE_DOWN_RESUME;
- /* old state was connected but STATUS not yet written by guest */
- if ( fNewUp != fOldUp
- || (!fNewUp && pThis->fCableConnected)
- || (pThis->fCableConnected && enmState == PDMNETWORKLINKSTATE_DOWN_RESUME))
+ E1kLog(("%s e1kR3SetLinkState: enmState=%d\n", pThis->szPrf, enmState));
+ switch (enmState)
{
- if (fNewUp)
- {
- E1kLog(("%s Link will be up in approximately %d secs\n",
- pThis->szPrf, pThis->cMsLinkUpDelay / 1000));
+ case PDMNETWORKLINKSTATE_UP:
pThis->fCableConnected = true;
- STATUS &= ~STATUS_LU;
- Phy::setLinkStatus(&pThis->phy, false);
- e1kRaiseInterrupt(pThis, VERR_SEM_BUSY, ICR_LSC);
- /* Restore the link back in 5 seconds (by default). */
- e1kBringLinkUpDelayed(pThis);
- }
- else
- {
- E1kLog(("%s Link is down\n", pThis->szPrf));
+ /* If link was down, bring it up after a while. */
+ if (!(STATUS & STATUS_LU))
+ e1kBringLinkUpDelayed(pThis);
+ break;
+ case PDMNETWORKLINKSTATE_DOWN:
pThis->fCableConnected = false;
- STATUS &= ~STATUS_LU;
+ /* Always set the phy link state to down, regardless of the STATUS_LU bit.
+ * We might have to set the link state before the driver initializes us. */
Phy::setLinkStatus(&pThis->phy, false);
- e1kRaiseInterrupt(pThis, VERR_SEM_BUSY, ICR_LSC);
- }
-
- if (pThis->pDrvR3)
- {
+ /* If link was up, bring it down. */
+ if (STATUS & STATUS_LU)
+ e1kR3LinkDown(pThis);
+ break;
+ case PDMNETWORKLINKSTATE_DOWN_RESUME:
/*
- * Send a UP link state to the driver below if the network adapter is only
- * temproarily disconnected due to resume event.
+ * There is not much sense in bringing down the link if it has not come up yet.
+ * If it is up though, we bring it down temporarely, then bring it up again.
*/
- if (enmState == PDMNETWORKLINKSTATE_DOWN_RESUME)
- pThis->pDrvR3->pfnNotifyLinkChanged(pThis->pDrvR3, PDMNETWORKLINKSTATE_UP);
- else
- pThis->pDrvR3->pfnNotifyLinkChanged(pThis->pDrvR3, enmState);
- }
+ if (STATUS & STATUS_LU)
+ e1kR3LinkDownTemp(pThis);
+ break;
+ default:
+ ;
}
return VINF_SUCCESS;
}
@@ -6752,12 +6795,7 @@ static DECLCALLBACK(int) e1kLoadDone(PPDMDEVINS pDevIns, PSSMHANDLE pSSM)
&& !PDMDevHlpVMTeleportedAndNotFullyResumedYet(pDevIns)
&& pThis->cMsLinkUpDelay)
{
- E1kLog(("%s Link is down temporarily\n", pThis->szPrf));
- STATUS &= ~STATUS_LU;
- Phy::setLinkStatus(&pThis->phy, false);
- e1kRaiseInterrupt(pThis, VERR_SEM_BUSY, ICR_LSC);
- /* Restore the link back in five seconds (default). */
- e1kBringLinkUpDelayed(pThis);
+ e1kR3LinkDownTemp(pThis);
}
return VINF_SUCCESS;
}
@@ -7160,13 +7198,7 @@ static DECLCALLBACK(int) e1kR3Attach(PPDMDEVINS pDevIns, unsigned iLUN, uint32_t
* network card
*/
if ((STATUS & STATUS_LU) && RT_SUCCESS(rc))
- {
- STATUS &= ~STATUS_LU;
- Phy::setLinkStatus(&pThis->phy, false);
- e1kRaiseInterrupt(pThis, VERR_SEM_BUSY, ICR_LSC);
- /* Restore the link back in 5 seconds (default). */
- e1kBringLinkUpDelayed(pThis);
- }
+ e1kR3LinkDownTemp(pThis);
PDMCritSectLeave(&pThis->cs);
return rc;
diff --git a/src/VBox/Devices/Network/DevPCNet.cpp b/src/VBox/Devices/Network/DevPCNet.cpp
index cf5be8c..481267e 100644
--- a/src/VBox/Devices/Network/DevPCNet.cpp
+++ b/src/VBox/Devices/Network/DevPCNet.cpp
@@ -54,7 +54,7 @@
#include <VBox/vmm/pdmdev.h>
#include <VBox/vmm/pdmnetifs.h>
#include <VBox/vmm/pgm.h>
-#include <VBox/DevPCNet.h>
+#include <VBox/version.h>
#include <iprt/asm.h>
#include <iprt/assert.h>
#include <iprt/critsect.h>
@@ -272,8 +272,6 @@ typedef struct PCNETSTATE
PDMINETWORKDOWN INetworkDown;
/** LUN\#0: The network config port interface. */
PDMINETWORKCONFIG INetworkConfig;
- /** The shared memory used for the private interface - R3. */
- R3PTRTYPE(PPCNETGUESTSHAREDMEMORY) pSharedMMIOR3;
/** Software Interrupt timer - R3. */
PTMTIMERR3 pTimerSoftIntR3;
#ifndef PCNET_NO_POLLING
@@ -292,8 +290,6 @@ typedef struct PCNETSTATE
R0PTRTYPE(PPDMQUEUE) pXmitQueueR0;
/** Pointer to the connector of the attached network driver - R0. */
PPDMINETWORKUPR0 pDrvR0;
- /** The shared memory used for the private interface - R0. */
- R0PTRTYPE(PPCNETGUESTSHAREDMEMORY) pSharedMMIOR0;
/** Software Interrupt timer - R0. */
PTMTIMERR0 pTimerSoftIntR0;
#ifndef PCNET_NO_POLLING
@@ -309,8 +305,6 @@ typedef struct PCNETSTATE
RCPTRTYPE(PPDMQUEUE) pXmitQueueRC;
/** Pointer to the connector of the attached network driver - RC. */
PPDMINETWORKUPRC pDrvRC;
- /** The shared memory used for the private interface - RC. */
- RCPTRTYPE(PPCNETGUESTSHAREDMEMORY) pSharedMMIORC;
/** Software Interrupt timer - RC. */
PTMTIMERRC pTimerSoftIntRC;
#ifndef PCNET_NO_POLLING
@@ -318,10 +312,8 @@ typedef struct PCNETSTATE
PTMTIMERRC pTimerPollRC;
#endif
-//#if HC_ARCH_BITS == 64
+ /** Alignment padding. */
uint32_t Alignment1;
-//#endif
-
/** Register Address Pointer */
uint32_t u32RAP;
/** Internal interrupt service */
@@ -341,7 +333,6 @@ typedef struct PCNETSTATE
* guest to clear any of these bits (by writing a ONE) before a bit was
* seen by the guest. */
uint16_t u16CSR0LastSeenByGuest;
- uint16_t Alignment2[HC_ARCH_BITS == 32 ? 2 : 2];
/** Last time we polled the queues */
uint64_t u64LastPoll;
@@ -350,8 +341,8 @@ typedef struct PCNETSTATE
/** The recv buffer. */
uint8_t abRecvBuf[4096];
- /** Unused / padding. */
- uint32_t u32Unused;
+ /** Alignment padding. */
+ uint32_t Alignment2;
/** Size of a RX/TX descriptor (8 or 16 bytes according to SWSTYLE */
int iLog2DescSize;
@@ -372,7 +363,7 @@ typedef struct PCNETSTATE
/** The configured MAC address. */
RTMAC MacConfigured;
/** Alignment padding. */
- uint8_t Alignment4[HC_ARCH_BITS == 64 ? 2 : 2];
+ uint8_t Alignment3[2];
/** The LED. */
PDMLED Led;
@@ -389,7 +380,8 @@ typedef struct PCNETSTATE
bool volatile fMaybeOutOfSpace;
/** True if we signal the guest that RX packets are missing. */
bool fSignalRxMiss;
- uint8_t Alignment5[HC_ARCH_BITS == 64 ? 2 : 6];
+ /** Alignment padding. */
+ uint8_t Alignment4[HC_ARCH_BITS == 64 ? 2 : 6];
#ifdef PCNET_NO_POLLING
RTGCPHYS32 TDRAPhysOld;
@@ -404,14 +396,19 @@ typedef struct PCNETSTATE
/** Error counter for bad receive descriptors. */
uint32_t uCntBadRMD;
-
- /** True if host and guest admitted to use the private interface. */
- bool fPrivIfEnabled;
+ /* True if raw context is enabled. */
bool fGCEnabled;
+ /* True if R0 context is enabled. */
bool fR0Enabled;
+ /* True: Emulate Am79C973. False: Emulate 79C970A. */
bool fAm79C973;
+ /* Link speed to be reported through CSR68. */
+ bool fSharedRegion;
+ /* Alignment padding. */
uint32_t u32LinkSpeed;
+ /* MS to wait before we enable the link. */
uint32_t cMsLinkUpDelay;
+ /* Alignment padding. */
uint32_t Alignment6;
STAMCOUNTER StatReceiveBytes;
@@ -662,18 +659,7 @@ DECLINLINE(bool) pcnetTmdLoad(PPCNETSTATE pThis, TMD *tmd, RTGCPHYS32 addr, bool
PPDMDEVINS pDevIns = PCNETSTATE_2_DEVINS(pThis);
uint8_t ownbyte;
- if (pThis->fPrivIfEnabled)
- {
- /* RX/TX descriptors shared between host and guest => direct copy */
- uint8_t *pv = (uint8_t*)pThis->CTX_SUFF(pSharedMMIO)
- + (addr - pThis->GCTDRA)
- + pThis->CTX_SUFF(pSharedMMIO)->V.V1.offTxDescriptors;
- if (!(pv[7] & 0x80) && fRetIfNotOwn)
- return false;
- memcpy(tmd, pv, 16);
- return true;
- }
- else if (RT_UNLIKELY(BCR_SWSTYLE(pThis) == 0))
+ if (RT_UNLIKELY(BCR_SWSTYLE(pThis) == 0))
{
uint16_t xda[4];
@@ -724,16 +710,7 @@ DECLINLINE(void) pcnetTmdStorePassHost(PPCNETSTATE pThis, TMD *tmd, RTGCPHYS32 a
{
STAM_PROFILE_ADV_START(&pThis->CTX_SUFF_Z(StatTmdStore), a);
PPDMDEVINS pDevIns = PCNETSTATE_2_DEVINS(pThis);
- if (pThis->fPrivIfEnabled)
- {
- /* RX/TX descriptors shared between host and guest => direct copy */
- uint8_t *pv = (uint8_t*)pThis->CTX_SUFF(pSharedMMIO)
- + (addr - pThis->GCTDRA)
- + pThis->CTX_SUFF(pSharedMMIO)->V.V1.offTxDescriptors;
- memcpy(pv, tmd, 16);
- pv[7] &= ~0x80;
- }
- else if (RT_UNLIKELY(BCR_SWSTYLE(pThis) == 0))
+ if (RT_UNLIKELY(BCR_SWSTYLE(pThis) == 0))
{
uint16_t xda[4];
xda[0] = ((uint32_t *)tmd)[0] & 0xffff;
@@ -781,18 +758,7 @@ DECLINLINE(int) pcnetRmdLoad(PPCNETSTATE pThis, RMD *rmd, RTGCPHYS32 addr, bool
PPDMDEVINS pDevIns = PCNETSTATE_2_DEVINS(pThis);
uint8_t ownbyte;
- if (pThis->fPrivIfEnabled)
- {
- /* RX/TX descriptors shared between host and guest => direct copy */
- uint8_t *pb = (uint8_t*)pThis->CTX_SUFF(pSharedMMIO)
- + (addr - pThis->GCRDRA)
- + pThis->CTX_SUFF(pSharedMMIO)->V.V1.offRxDescriptors;
- if (!(pb[7] & 0x80) && fRetIfNotOwn)
- return false;
- memcpy(rmd, pb, 16);
- return true;
- }
- else if (RT_UNLIKELY(BCR_SWSTYLE(pThis) == 0))
+ if (RT_UNLIKELY(BCR_SWSTYLE(pThis) == 0))
{
uint16_t rda[4];
PDMDevHlpPhysRead(pDevIns, addr+3, &ownbyte, 1);
@@ -842,16 +808,7 @@ DECLINLINE(int) pcnetRmdLoad(PPCNETSTATE pThis, RMD *rmd, RTGCPHYS32 addr, bool
DECLINLINE(void) pcnetRmdStorePassHost(PPCNETSTATE pThis, RMD *rmd, RTGCPHYS32 addr)
{
PPDMDEVINS pDevIns = PCNETSTATE_2_DEVINS(pThis);
- if (pThis->fPrivIfEnabled)
- {
- /* RX/TX descriptors shared between host and guest => direct copy */
- uint8_t *pv = (uint8_t*)pThis->CTX_SUFF(pSharedMMIO)
- + (addr - pThis->GCRDRA)
- + pThis->CTX_SUFF(pSharedMMIO)->V.V1.offRxDescriptors;
- memcpy(pv, rmd, 16);
- pv[7] &= ~0x80;
- }
- else if (RT_UNLIKELY(BCR_SWSTYLE(pThis) == 0))
+ if (RT_UNLIKELY(BCR_SWSTYLE(pThis) == 0))
{
uint16_t rda[4];
rda[0] = ((uint32_t *)rmd)[0] & 0xffff;
@@ -892,18 +849,14 @@ DECLINLINE(void) pcnetRmdStorePassHost(PPCNETSTATE pThis, RMD *rmd, RTGCPHYS32 a
static void pcnetDescTouch(PPCNETSTATE pThis, RTGCPHYS32 addr)
{
PPDMDEVINS pDevIns = PCNETSTATE_2_DEVINS(pThis);
-
- if (!pThis->fPrivIfEnabled)
- {
- uint8_t aBuf[16];
- size_t cbDesc;
- if (RT_UNLIKELY(BCR_SWSTYLE(pThis) == 0))
- cbDesc = 8;
- else
- cbDesc = 16;
- PDMDevHlpPhysRead(pDevIns, addr, aBuf, cbDesc);
- PDMDevHlpPCIPhysWrite(pDevIns, addr, aBuf, cbDesc);
- }
+ uint8_t aBuf[16];
+ size_t cbDesc;
+ if (RT_UNLIKELY(BCR_SWSTYLE(pThis) == 0))
+ cbDesc = 8;
+ else
+ cbDesc = 16;
+ PDMDevHlpPhysRead(pDevIns, addr, aBuf, cbDesc);
+ PDMDevHlpPCIPhysWrite(pDevIns, addr, aBuf, cbDesc);
}
#endif /* IN_RING3 */
@@ -945,52 +898,6 @@ struct ether_header /** @todo Use RTNETETHERHDR */
} while (0)
-#ifdef IN_RING3
-/**
- * Initialize the shared memory for the private guest interface.
- *
- * @note Changing this layout will break SSM for guests using the private guest interface!
- */
-static void pcnetInitSharedMemory(PPCNETSTATE pThis)
-{
- /* Clear the entire block for pcnetReset usage. */
- memset(pThis->pSharedMMIOR3, 0, PCNET_GUEST_SHARED_MEMORY_SIZE);
-
- pThis->pSharedMMIOR3->u32Version = PCNET_GUEST_INTERFACE_VERSION;
- uint32_t off = 2048; /* Leave some space for more fields within the header */
-
- /*
- * The Descriptor arrays.
- */
- pThis->pSharedMMIOR3->V.V1.offTxDescriptors = off;
- off = RT_ALIGN(off + PCNET_GUEST_TX_DESCRIPTOR_SIZE * PCNET_GUEST_MAX_TX_DESCRIPTORS, 32);
-
- pThis->pSharedMMIOR3->V.V1.offRxDescriptors = off;
- off = RT_ALIGN(off + PCNET_GUEST_RX_DESCRIPTOR_SIZE * PCNET_GUEST_MAX_RX_DESCRIPTORS, 32);
-
- /* Make sure all the descriptors are mapped into HMA space (and later ring-0). The 8192
- bytes limit is hardcoded in the PDMDevHlpMMHyperMapMMIO2 call down in pcnetConstruct. */
- AssertRelease(off <= 8192);
-
- /*
- * The buffer arrays.
- */
-#if 0
- /* Don't allocate TX buffers since Windows guests cannot use it */
- pThis->pSharedMMIOR3->V.V1.offTxBuffers = off;
- off = RT_ALIGN(off + PCNET_GUEST_NIC_BUFFER_SIZE * PCNET_GUEST_MAX_TX_DESCRIPTORS, 32);
-#endif
-
- pThis->pSharedMMIOR3->V.V1.offRxBuffers = off;
- pThis->pSharedMMIOR3->fFlags = PCNET_GUEST_FLAGS_ADMIT_HOST;
- off = RT_ALIGN(off + PCNET_GUEST_NIC_BUFFER_SIZE * PCNET_GUEST_MAX_RX_DESCRIPTORS, 32);
- AssertRelease(off <= PCNET_GUEST_SHARED_MEMORY_SIZE);
-
- /* Update the header with the final size. */
- pThis->pSharedMMIOR3->cbUsed = off;
-}
-#endif /* IN_RING3 */
-
#define MULTICAST_FILTER_LEN 8
DECLINLINE(uint32_t) lnc_mchash(const uint8_t *ether_addr)
@@ -1430,20 +1337,6 @@ static void pcnetUpdateIrq(PPCNETSTATE pThis)
STAM_PROFILE_ADV_STOP(&pThis->StatInterrupt, a);
}
-/**
- * Enable/disable the private guest interface.
- */
-static void pcnetEnablePrivateIf(PPCNETSTATE pThis)
-{
- bool fPrivIfEnabled = pThis->pSharedMMIOR3
- && !!(pThis->CTX_SUFF(pSharedMMIO)->fFlags & PCNET_GUEST_FLAGS_ADMIT_GUEST);
- if (fPrivIfEnabled != pThis->fPrivIfEnabled)
- {
- pThis->fPrivIfEnabled = fPrivIfEnabled;
- LogRel(("PCNet#%d: %s private interface\n", PCNET_INST_NR, fPrivIfEnabled ? "Enabling" : "Disabling"));
- }
-}
-
#ifdef IN_RING3
#ifdef PCNET_NO_POLLING
static void pcnetUpdateRingHandlers(PPCNETSTATE pThis)
@@ -1559,8 +1452,6 @@ static void pcnetInit(PPCNETSTATE pThis)
pThis->GCTDRA = PHYSADDR(pThis, initblk.tdra); \
} while (0)
- pcnetEnablePrivateIf(pThis);
-
if (BCR_SSIZE32(pThis))
{
struct INITBLK32 initblk;
@@ -1646,7 +1537,6 @@ static void pcnetStart(PPCNETSTATE pThis)
pThis->aCSR[0] |= 0x0010; /* set TXON */
if (!CSR_DRX(pThis))
pThis->aCSR[0] |= 0x0020; /* set RXON */
- pcnetEnablePrivateIf(pThis);
pThis->aCSR[0] &= ~0x0004; /* clear STOP bit */
pThis->aCSR[0] |= 0x0002; /* STRT */
pcnetPollTimerStart(pThis); /* start timer if it was stopped */
@@ -1662,7 +1552,6 @@ static void pcnetStop(PPCNETSTATE pThis)
pThis->aCSR[0] |= 0x0014;
pThis->aCSR[4] &= ~0x02c2;
pThis->aCSR[5] &= ~0x0011;
- pcnetEnablePrivateIf(pThis);
pcnetPollTimer(pThis);
}
@@ -4025,20 +3914,6 @@ static DECLCALLBACK(int) pcnetMMIOMap(PPCIDEVICE pPciDev, /*unsigned*/ int iRegi
}
-/**
- * @callback_method_impl{FNPCIIOREGIONMAP, VBox specific MMIO2 interface.}
- */
-static DECLCALLBACK(int) pcnetMMIOSharedMap(PPCIDEVICE pPciDev, /*unsigned*/ int iRegion,
- RTGCPHYS GCPhysAddress, uint32_t cb, PCIADDRESSSPACE enmType)
-{
- if (GCPhysAddress != NIL_RTGCPHYS)
- return PDMDevHlpMMIO2Map(pPciDev->pDevIns, iRegion, GCPhysAddress);
-
- /* nothing to clean up */
- return VINF_SUCCESS;
-}
-
-
/* -=-=-=-=-=- Debug Info Handler -=-=-=-=-=- */
/**
@@ -4345,7 +4220,7 @@ static DECLCALLBACK(int) pcnetSaveExec(PPDMDEVINS pDevIns, PSSMHANDLE pSSM)
SSMR3PutU32(pSSM, pThis->u32RAP);
SSMR3PutS32(pSSM, pThis->iISR);
SSMR3PutU32(pSSM, pThis->u32Lnkst);
- SSMR3PutBool(pSSM, pThis->fPrivIfEnabled); /* >= If version 0.9 */
+ SSMR3PutBool(pSSM, false/* was ffPrivIfEnabled */); /* >= If version 0.9 */
SSMR3PutBool(pSSM, pThis->fSignalRxMiss); /* >= If version 0.10 */
SSMR3PutGCPhys32(pSSM, pThis->GCRDRA);
SSMR3PutGCPhys32(pSSM, pThis->GCTDRA);
@@ -4370,7 +4245,7 @@ static DECLCALLBACK(int) pcnetSaveExec(PPDMDEVINS pDevIns, PSSMHANDLE pSSM)
/**
- * @callback_method_impl{FNSSMDEVLOADPREP,
+ * @callback_method_impl{FNSSMDEVLOADPREP},
* Serializes the receive thread, it may be working inside the critsect.}
*/
static DECLCALLBACK(int) pcnetLoadPrep(PPDMDEVINS pDevIns, PSSMHANDLE pSSM)
@@ -4379,9 +4254,23 @@ static DECLCALLBACK(int) pcnetLoadPrep(PPDMDEVINS pDevIns, PSSMHANDLE pSSM)
int rc = PDMCritSectEnter(&pThis->CritSect, VERR_SEM_BUSY);
AssertRC(rc);
+
+ uint32_t uVer = SSMR3HandleVersion(pSSM);
+ if ( uVer < VBOX_FULL_VERSION_MAKE(4, 3, 6)
+ || ( uVer >= VBOX_FULL_VERSION_MAKE(4, 3, 51)
+ && uVer < VBOX_FULL_VERSION_MAKE(4, 3, 53)))
+ {
+ /* older saved states contain the shared memory region which was never used for ages. */
+ void *pvSharedMMIOR3;
+ rc = PDMDevHlpMMIO2Register(pDevIns, 2, _512K, 0, (void **)&pvSharedMMIOR3, "PCNetSh");
+ if (RT_FAILURE(rc))
+ rc = PDMDevHlpVMSetError(pDevIns, rc, RT_SRC_POS,
+ N_("Failed to allocate the dummy shmem region for the PCNet device"));
+ pThis->fSharedRegion = true;
+ }
PDMCritSectLeave(&pThis->CritSect);
- return VINF_SUCCESS;
+ return rc;
}
@@ -4406,9 +4295,14 @@ static DECLCALLBACK(int) pcnetLoadExec(PPDMDEVINS pDevIns, PSSMHANDLE pSSM, uint
if ( SSM_VERSION_MAJOR(uVersion) > 0
|| SSM_VERSION_MINOR(uVersion) >= 9)
{
- SSMR3GetBool(pSSM, &pThis->fPrivIfEnabled);
- if (pThis->fPrivIfEnabled)
- LogRel(("PCNet#%d: Enabling private interface\n", PCNET_INST_NR));
+ bool fPrivIfEnabled = false;
+ SSMR3GetBool(pSSM, &fPrivIfEnabled);
+ if (fPrivIfEnabled)
+ {
+ /* no longer implemented */
+ LogRel(("PCNet#%d: Cannot enabling private interface!\n", PCNET_INST_NR));
+ return VERR_SSM_UNSUPPORTED_DATA_UNIT_VERSION;
+ }
}
if ( SSM_VERSION_MAJOR(uVersion) > 0
|| SSM_VERSION_MINOR(uVersion) >= 10)
@@ -4483,6 +4377,21 @@ static DECLCALLBACK(int) pcnetLoadExec(PPDMDEVINS pDevIns, PSSMHANDLE pSSM, uint
return VINF_SUCCESS;
}
+/**
+ * @callback_method_impl{FNSSMDEVLOADDONE}
+ */
+static DECLCALLBACK(int) pcnetLoadDone(PPDMDEVINS pDevIns, PSSMHANDLE pSSM)
+{
+ PPCNETSTATE pThis = PDMINS_2_DATA(pDevIns, PPCNETSTATE);
+ int rc = VINF_SUCCESS;
+ if (pThis->fSharedRegion)
+ {
+ /* drop this dummy region */
+ rc = PDMDevHlpMMIO2Deregister(pDevIns, 2);
+ pThis->fSharedRegion = false;
+ }
+ return rc;
+}
/* -=-=-=-=-=- PCNETSTATE::INetworkDown -=-=-=-=-=- */
@@ -4669,10 +4578,19 @@ static DECLCALLBACK(int) pcnetSetLinkState(PPDMINETWORKCONFIG pInterface, PDMNET
AssertMsgReturn(enmState > PDMNETWORKLINKSTATE_INVALID && enmState <= PDMNETWORKLINKSTATE_DOWN_RESUME,
("Invalid link state: enmState=%d\n", enmState), VERR_INVALID_PARAMETER);
+ if (enmState == PDMNETWORKLINKSTATE_DOWN_RESUME)
+ {
+ pcnetTempLinkDown(pThis);
+ /*
+ * Note that we do not notify the driver about the link state change because
+ * the change is only temporary and can be disregarded from the driver's
+ * point of view (see @bugref{7057}).
+ */
+ return VINF_SUCCESS;
+ }
/* has the state changed? */
- fLinkUp = enmState == PDMNETWORKLINKSTATE_UP || enmState == PDMNETWORKLINKSTATE_DOWN_RESUME;
- if ( pThis->fLinkUp != fLinkUp
- || enmState == PDMNETWORKLINKSTATE_DOWN_RESUME)
+ fLinkUp = enmState == PDMNETWORKLINKSTATE_UP;
+ if (pThis->fLinkUp != fLinkUp)
{
pThis->fLinkUp = fLinkUp;
if (fLinkUp)
@@ -4694,16 +4612,7 @@ static DECLCALLBACK(int) pcnetSetLinkState(PPDMINETWORKCONFIG pInterface, PDMNET
}
Assert(!PDMCritSectIsOwner(&pThis->CritSect));
if (pThis->pDrvR3)
- {
- /*
- * Send a UP link state to the driver below if the network adapter is only
- * temproarily disconnected due to resume event.
- */
- if (enmState == PDMNETWORKLINKSTATE_DOWN_RESUME)
- pThis->pDrvR3->pfnNotifyLinkChanged(pThis->pDrvR3, PDMNETWORKLINKSTATE_UP);
- else
- pThis->pDrvR3->pfnNotifyLinkChanged(pThis->pDrvR3, enmState);
- }
+ pThis->pDrvR3->pfnNotifyLinkChanged(pThis->pDrvR3, enmState);
}
return VINF_SUCCESS;
}
@@ -4864,8 +4773,6 @@ static DECLCALLBACK(void) pcnetReset(PPDMDEVINS pDevIns)
TMTimerStop(pThis->pTimerRestore);
pcnetTimerRestore(pDevIns, pThis->pTimerRestore, pThis);
}
- if (pThis->pSharedMMIOR3)
- pcnetInitSharedMemory(pThis);
/** @todo How to flush the queues? */
pcnetR3HardReset(pThis);
@@ -4881,8 +4788,6 @@ static DECLCALLBACK(void) pcnetRelocate(PPDMDEVINS pDevIns, RTGCINTPTR offDelta)
pThis->pDevInsRC = PDMDEVINS_2_RCPTR(pDevIns);
pThis->pXmitQueueRC = PDMQueueRCPtr(pThis->pXmitQueueR3);
pThis->pCanRxQueueRC = PDMQueueRCPtr(pThis->pCanRxQueueR3);
- if (pThis->pSharedMMIOR3)
- pThis->pSharedMMIORC += offDelta;
#ifdef PCNET_NO_POLLING
pThis->pfnEMInterpretInstructionRC += offDelta;
#else
@@ -5066,37 +4971,6 @@ static DECLCALLBACK(int) pcnetConstruct(PPDMDEVINS pDevIns, int iInstance, PCFGM
if (RT_FAILURE(rc))
return rc;
- bool fPrivIfEnabled;
- rc = CFGMR3QueryBool(pCfg, "PrivIfEnabled", &fPrivIfEnabled);
- if (rc == VERR_CFGM_VALUE_NOT_FOUND)
- fPrivIfEnabled = true;
- else if (RT_FAILURE(rc))
- return PDMDEV_SET_ERROR(pDevIns, rc,
- N_("Configuration error: Failed to get the \"PrivIfEnabled\" value"));
-
- if (fPrivIfEnabled)
- {
- /*
- * Initialize shared memory between host and guest for descriptors and RX buffers. Most guests
- * should not care if there is an additional PCI resource but just in case we made this configurable.
- */
- rc = PDMDevHlpMMIO2Register(pDevIns, 2, PCNET_GUEST_SHARED_MEMORY_SIZE, 0, (void **)&pThis->pSharedMMIOR3, "PCNetShMem");
- if (RT_FAILURE(rc))
- return PDMDevHlpVMSetError(pDevIns, rc, RT_SRC_POS,
- N_("Failed to allocate %u bytes of memory for the PCNet device"), PCNET_GUEST_SHARED_MEMORY_SIZE);
- rc = PDMDevHlpMMHyperMapMMIO2(pDevIns, 2, 0, 8192, "PCNetShMem", &pThis->pSharedMMIORC);
- if (RT_FAILURE(rc))
- return PDMDevHlpVMSetError(pDevIns, rc, RT_SRC_POS,
- N_("Failed to map 8192 bytes of memory for the PCNet device into the hyper memory"));
- pThis->pSharedMMIOR0 = (uintptr_t)pThis->pSharedMMIOR3; /** @todo @bugref{1865}: Map MMIO2 into ring-0. */
-
- pcnetInitSharedMemory(pThis);
- rc = PDMDevHlpPCIIORegionRegister(pDevIns, 2, PCNET_GUEST_SHARED_MEMORY_SIZE,
- PCI_ADDRESS_SPACE_MEM, pcnetMMIOSharedMap);
- if (RT_FAILURE(rc))
- return rc;
- }
-
#ifdef PCNET_NO_POLLING
/*
* Resolve the R0 and RC handlers.
@@ -5133,7 +5007,7 @@ static DECLCALLBACK(int) pcnetConstruct(PPDMDEVINS pDevIns, int iInstance, PCFGM
rc = PDMDevHlpSSMRegisterEx(pDevIns, PCNET_SAVEDSTATE_VERSION, sizeof(*pThis), NULL,
NULL, pcnetLiveExec, NULL,
pcnetSavePrep, pcnetSaveExec, NULL,
- pcnetLoadPrep, pcnetLoadExec, NULL);
+ pcnetLoadPrep, pcnetLoadExec, pcnetLoadDone);
if (RT_FAILURE(rc))
return rc;
diff --git a/src/VBox/Devices/Network/DevVirtioNet.cpp b/src/VBox/Devices/Network/DevVirtioNet.cpp
index fddac4d..729ae65 100644
--- a/src/VBox/Devices/Network/DevVirtioNet.cpp
+++ b/src/VBox/Devices/Network/DevVirtioNet.cpp
@@ -461,6 +461,7 @@ static DECLCALLBACK(int) vnetIoCb_Reset(void *pvState)
STATUS = VNET_S_LINK_UP;
else
STATUS = 0;
+ Log(("%s vnetIoCb_Reset: Link is %s\n", INSTANCE(pThis), pThis->fCableConnected ? "up" : "down"));
/*
* By default we pass all packets up since the older guests cannot control
@@ -500,6 +501,31 @@ static void vnetWakeupReceive(PPDMDEVINS pDevIns)
/**
+ * Takes down the link temporarily if it's current status is up.
+ *
+ * This is used during restore and when replumbing the network link.
+ *
+ * The temporary link outage is supposed to indicate to the OS that all network
+ * connections have been lost and that it for instance is appropriate to
+ * renegotiate any DHCP lease.
+ *
+ * @param pThis The Virtual I/O network device state.
+ */
+static void vnetTempLinkDown(PVNETSTATE pThis)
+{
+ if (STATUS & VNET_S_LINK_UP)
+ {
+ STATUS &= ~VNET_S_LINK_UP;
+ vpciRaiseInterrupt(&pThis->VPCI, VERR_SEM_BUSY, VPCI_ISR_CONFIG);
+ /* Restore the link back in 5 seconds. */
+ int rc = TMTimerSetMillies(pThis->pLinkUpTimer, pThis->cMsLinkUpDelay);
+ AssertRC(rc);
+ Log(("%s vnetTempLinkDown: Link is down temporarily\n", INSTANCE(pThis)));
+ }
+}
+
+
+/**
* @callback_method_impl{FNTMTIMERDEV, Link Up Timer handler.}
*/
static DECLCALLBACK(void) vnetLinkUpTimer(PPDMDEVINS pDevIns, PTMTIMER pTimer, void *pvUser)
@@ -513,6 +539,9 @@ static DECLCALLBACK(void) vnetLinkUpTimer(PPDMDEVINS pDevIns, PTMTIMER pTimer, v
vpciRaiseInterrupt(&pThis->VPCI, VERR_SEM_BUSY, VPCI_ISR_CONFIG);
vnetWakeupReceive(pDevIns);
vnetCsLeave(pThis);
+ Log(("%s vnetLinkUpTimer: Link is up\n", INSTANCE(pThis)));
+ if (pThis->pDrv)
+ pThis->pDrv->pfnNotifyLinkChanged(pThis->pDrv, PDMNETWORKLINKSTATE_UP);
}
@@ -997,10 +1026,23 @@ static DECLCALLBACK(int) vnetSetLinkState(PPDMINETWORKCONFIG pInterface, PDMNETW
{
PVNETSTATE pThis = RT_FROM_MEMBER(pInterface, VNETSTATE, INetworkConfig);
bool fOldUp = !!(STATUS & VNET_S_LINK_UP);
- bool fNewUp = enmState == PDMNETWORKLINKSTATE_UP || enmState == PDMNETWORKLINKSTATE_DOWN_RESUME;
+ bool fNewUp = enmState == PDMNETWORKLINKSTATE_UP;
- if ( fNewUp != fOldUp
- || enmState == PDMNETWORKLINKSTATE_DOWN_RESUME)
+ Log(("%s vnetSetLinkState: enmState=%d\n", INSTANCE(pThis), enmState));
+ if (enmState == PDMNETWORKLINKSTATE_DOWN_RESUME)
+ {
+ if (fOldUp)
+ {
+ /*
+ * We bother to bring the link down only if it was up previously. The UP link state
+ * notification will be sent when the link actually goes up in vnetLinkUpTimer().
+ */
+ vnetTempLinkDown(pThis);
+ if (pThis->pDrv)
+ pThis->pDrv->pfnNotifyLinkChanged(pThis->pDrv, enmState);
+ }
+ }
+ else if (fNewUp != fOldUp)
{
if (fNewUp)
{
@@ -1010,21 +1052,14 @@ static DECLCALLBACK(int) vnetSetLinkState(PPDMINETWORKCONFIG pInterface, PDMNETW
}
else
{
+ /* The link was brought down explicitly, make sure it won't come up by timer. */
+ TMTimerStop(pThis->pLinkUpTimer);
Log(("%s Link is down\n", INSTANCE(pThis)));
STATUS &= ~VNET_S_LINK_UP;
vpciRaiseInterrupt(&pThis->VPCI, VERR_SEM_BUSY, VPCI_ISR_CONFIG);
}
if (pThis->pDrv)
- {
- /*
- * Send a UP link state to the driver below if the network adapter is only
- * temproarily disconnected due to resume event.
- */
- if (enmState == PDMNETWORKLINKSTATE_DOWN_RESUME)
- pThis->pDrv->pfnNotifyLinkChanged(pThis->pDrv, PDMNETWORKLINKSTATE_UP);
- else
- pThis->pDrv->pfnNotifyLinkChanged(pThis->pDrv, enmState);
- }
+ pThis->pDrv->pfnNotifyLinkChanged(pThis->pDrv, enmState);
}
return VINF_SUCCESS;
}
@@ -1650,30 +1685,6 @@ static DECLCALLBACK(int) vnetLoadPrep(PPDMDEVINS pDevIns, PSSMHANDLE pSSM)
/**
- * Takes down the link temporarily if it's current status is up.
- *
- * This is used during restore and when replumbing the network link.
- *
- * The temporary link outage is supposed to indicate to the OS that all network
- * connections have been lost and that it for instance is appropriate to
- * renegotiate any DHCP lease.
- *
- * @param pThis The Virtual I/O network device state.
- */
-static void vnetTempLinkDown(PVNETSTATE pThis)
-{
- if (STATUS & VNET_S_LINK_UP)
- {
- STATUS &= ~VNET_S_LINK_UP;
- vpciRaiseInterrupt(&pThis->VPCI, VERR_SEM_BUSY, VPCI_ISR_CONFIG);
- /* Restore the link back in 5 seconds. */
- int rc = TMTimerSetMillies(pThis->pLinkUpTimer, pThis->cMsLinkUpDelay);
- AssertRC(rc);
- }
-}
-
-
-/**
* @callback_method_impl{FNSSMDEVLOADEXEC}
*/
static DECLCALLBACK(int) vnetLoadExec(PPDMDEVINS pDevIns, PSSMHANDLE pSSM, uint32_t uVersion, uint32_t uPass)
diff --git a/src/VBox/Devices/Network/slirp/libalias/alias_mod.c b/src/VBox/Devices/Network/slirp/libalias/alias_mod.c
index 2c4fda3..4da9939 100644
--- a/src/VBox/Devices/Network/slirp/libalias/alias_mod.c
+++ b/src/VBox/Devices/Network/slirp/libalias/alias_mod.c
@@ -141,7 +141,7 @@ _attach_handler(PNATState pData, struct proto_handler *p)
_attach_handler(struct proto_handler *p)
#endif
{
- struct proto_handler *b = NULL;
+ struct proto_handler *b = NULL, *handler_chain_tail = NULL;
LIBALIAS_WLOCK_ASSERT();
LIST_FOREACH(b, &handler_chain, entries) {
@@ -153,10 +153,14 @@ _attach_handler(struct proto_handler *p)
LIST_INSERT_BEFORE(b, p, entries);
return (0);
}
+
+ /* If the conditions above do not work, we should keep the last
+ * element of the list in order to insert *p right after it. */
+ handler_chain_tail = b;
}
/* End of list or found right position, inserts here. */
- if (b)
- LIST_INSERT_AFTER(b, p, entries);
+ if (handler_chain_tail)
+ LIST_INSERT_AFTER(handler_chain_tail, p, entries);
else
LIST_INSERT_HEAD(&handler_chain, p, entries);
return (0);
diff --git a/src/VBox/Devices/PC/BIOS/VBoxBiosAlternative.asm b/src/VBox/Devices/PC/BIOS/VBoxBiosAlternative.asm
index cad1865..82dc3be 100644
--- a/src/VBox/Devices/PC/BIOS/VBoxBiosAlternative.asm
+++ b/src/VBox/Devices/PC/BIOS/VBoxBiosAlternative.asm
@@ -964,7 +964,7 @@ section CONST progbits vstart=0xb0 align=1 ; size=0xce0 class=DATA group=DGROUP
section CONST2 progbits vstart=0xd90 align=1 ; size=0x3fa class=DATA group=DGROUP
_bios_cvs_version_string: ; 0xf0d90 LB 0x12
- db 'VirtualBox 4.3.2', 000h, 000h
+ db 'VirtualBox 4.3.6', 000h, 000h
_bios_prefix_string: ; 0xf0da2 LB 0x8
db 'BIOS: ', 000h, 000h
_isotag: ; 0xf0daa LB 0x6
@@ -15974,4 +15974,4 @@ dummy_iret: ; 0xfff53 LB 0x9d
db 'XM'
cpu_reset: ; 0xffff0 LB 0x10
jmp far 0f000h:0e05bh ; ea 5b e0 00 f0
- db 030h, 036h, 02fh, 032h, 033h, 02fh, 039h, 039h, 000h, 0fch, 0c0h
+ db 030h, 036h, 02fh, 032h, 033h, 02fh, 039h, 039h, 000h, 0fch, 0bch
diff --git a/src/VBox/Devices/PC/BIOS/VBoxBiosAlternative.md5sum b/src/VBox/Devices/PC/BIOS/VBoxBiosAlternative.md5sum
index 12a92e7..a73fe10 100644
--- a/src/VBox/Devices/PC/BIOS/VBoxBiosAlternative.md5sum
+++ b/src/VBox/Devices/PC/BIOS/VBoxBiosAlternative.md5sum
@@ -1 +1 @@
-0b06cf721eb2286c51b25166a43edc9a *VBoxPcBios.rom
+1e94033e74f4e723b1d8e9bd22396dcc *VBoxPcBios.rom
diff --git a/src/VBox/Devices/PC/DevAPIC.cpp b/src/VBox/Devices/PC/DevAPIC.cpp
index c11f6c7..73b4a16 100644
--- a/src/VBox/Devices/PC/DevAPIC.cpp
+++ b/src/VBox/Devices/PC/DevAPIC.cpp
@@ -606,7 +606,11 @@ PDMBOTHCBDECL(void) apicSetBase(PPDMDEVINS pDevIns, VMCPUID idCpu, uint64_t val)
pApic->spurious_vec &= ~APIC_SV_ENABLE;
/* Clear any pending APIC interrupt action flag. */
apicCpuClearInterrupt(pDev, pApic);
- /** @todo: why do we do that? */
+ /* See @bugref{7097}. Intel IA-32/64 Spec 10.4.3:
+ * "When IA32_APIC_BASE[11] is 0, the processor is functionally equivalent to
+ * an IA-32 processor without an on-chip APIC. The CPUID feature flag for the
+ * APIC (see Section 10.4.2, 'Presence of the Local APIC') is also set to 0."
+ */
pDev->CTX_SUFF(pApicHlp)->pfnChangeFeature(pDevIns, PDMAPICVERSION_NONE);
break;
}
diff --git a/src/VBox/Devices/Storage/DevBusLogic.cpp b/src/VBox/Devices/Storage/DevBusLogic.cpp
index 81001d4..b0b52a1 100644
--- a/src/VBox/Devices/Storage/DevBusLogic.cpp
+++ b/src/VBox/Devices/Storage/DevBusLogic.cpp
@@ -3933,7 +3933,12 @@ static DECLCALLBACK(int) buslogicR3Construct(PPDMDEVINS pDevIns, int iInstance,
return PDMDEV_SET_ERROR(pDevIns, rc,
N_("BusLogic configuration error: failed to read Bootable as boolean"));
Log(("%s: fBootable=%RTbool\n", __FUNCTION__, fBootable));
- rc = CFGMR3QueryStringDef(pCfg, "ISACompat", achISACompat, sizeof(achISACompat), "Alternate");
+
+ /* Only the first instance defaults to having the ISA compatibility ports enabled. */
+ if (iInstance == 0)
+ rc = CFGMR3QueryStringDef(pCfg, "ISACompat", achISACompat, sizeof(achISACompat), "Alternate");
+ else
+ rc = CFGMR3QueryStringDef(pCfg, "ISACompat", achISACompat, sizeof(achISACompat), "Disabled");
if (RT_FAILURE(rc))
return PDMDEV_SET_ERROR(pDevIns, rc,
N_("BusLogic configuration error: failed to read ISACompat as string"));
diff --git a/src/VBox/Devices/VMMDev/VMMDev.cpp b/src/VBox/Devices/VMMDev/VMMDev.cpp
index 03620e3..918b5b0 100644
--- a/src/VBox/Devices/VMMDev/VMMDev.cpp
+++ b/src/VBox/Devices/VMMDev/VMMDev.cpp
@@ -835,6 +835,19 @@ static int vmmdevReqHandler_SetMouseStatus(PVMMDEV pThis, VMMDevRequestHeader *p
return VINF_SUCCESS;
}
+static int vmmdevVerifyPointerShape(VMMDevReqMousePointer *pReq)
+{
+ /* Should be enough for most mouse pointers. */
+ if (pReq->width > 8192 || pReq->height > 8192)
+ return VERR_INVALID_PARAMETER;
+
+ uint32_t cbShape = (pReq->width + 7) / 8 * pReq->height; /* size of the AND mask */
+ cbShape = ((cbShape + 3) & ~3) + pReq->width * 4 * pReq->height; /* + gap + size of the XOR mask */
+ if (RT_UOFFSETOF(VMMDevReqMousePointer, pointerData) + cbShape > pReq->header.size)
+ return VERR_INVALID_PARAMETER;
+
+ return VINF_SUCCESS;
+}
/**
* Handles VMMDevReq_SetPointerShape.
@@ -870,6 +883,10 @@ static int vmmdevReqHandler_SetPointerShape(PVMMDEV pThis, VMMDevRequestHeader *
/* forward call to driver */
if (fShape)
{
+ int rc = vmmdevVerifyPointerShape(pReq);
+ if (RT_FAILURE(rc))
+ return rc;
+
pThis->pDrv->pfnUpdatePointerShape(pThis->pDrv,
fVisible,
fAlpha,
diff --git a/src/VBox/Devices/VMMDev/VMMDevHGCM.cpp b/src/VBox/Devices/VMMDev/VMMDevHGCM.cpp
index f3217b9..8ee189c 100644
--- a/src/VBox/Devices/VMMDev/VMMDevHGCM.cpp
+++ b/src/VBox/Devices/VMMDev/VMMDevHGCM.cpp
@@ -106,6 +106,9 @@ struct VBOXHGCMCMD
*/
VBOXHGCMSVCPARM *paHostParms;
+ /* Number of elements in paHostParms */
+ uint32_t cHostParms;
+
/** Linear pointer parameters information. */
int cLinPtrs;
@@ -261,8 +264,6 @@ static int vmmdevHGCMSaveLinPtr (PPDMDEVINS pDevIns,
{
int rc = VINF_SUCCESS;
- AssertRelease (u32Size > 0);
-
VBOXHGCMLINPTR *pLinPtr = &paLinPtrs[iLinPtr];
/* Take the offset into the current page also into account! */
@@ -305,8 +306,6 @@ static int vmmdevHGCMSaveLinPtr (PPDMDEVINS pDevIns,
GCPtr += PAGE_SIZE;
}
- AssertRelease (iPage == cPages);
-
return rc;
}
@@ -321,7 +320,7 @@ static int vmmdevHGCMWriteLinPtr (PPDMDEVINS pDevIns,
VBOXHGCMLINPTR *pLinPtr = &paLinPtrs[iLinPtr];
- AssertRelease (u32Size > 0 && iParm == (uint32_t)pLinPtr->iParm);
+ AssertLogRelReturn(u32Size > 0 && iParm == (uint32_t)pLinPtr->iParm, VERR_INVALID_PARAMETER);
RTGCPHYS GCPhysDst = pLinPtr->paPages[0] + pLinPtr->offFirstPage;
uint8_t *pu8Src = (uint8_t *)pvHost;
@@ -343,12 +342,17 @@ static int vmmdevHGCMWriteLinPtr (PPDMDEVINS pDevIns,
if (cbWrite >= u32Size)
{
- PDMDevHlpPhysWrite(pDevIns, GCPhysDst, pu8Src, u32Size);
+ rc = PDMDevHlpPhysWrite(pDevIns, GCPhysDst, pu8Src, u32Size);
+ if (RT_FAILURE(rc))
+ break;
+
u32Size = 0;
break;
}
- PDMDevHlpPhysWrite(pDevIns, GCPhysDst, pu8Src, cbWrite);
+ rc = PDMDevHlpPhysWrite(pDevIns, GCPhysDst, pu8Src, cbWrite);
+ if (RT_FAILURE(rc))
+ break;
/* next */
u32Size -= cbWrite;
@@ -357,8 +361,10 @@ static int vmmdevHGCMWriteLinPtr (PPDMDEVINS pDevIns,
GCPhysDst = pLinPtr->paPages[iPage];
}
- AssertRelease (iPage == pLinPtr->cPages);
- Assert(u32Size == 0);
+ if (RT_SUCCESS(rc))
+ {
+ AssertLogRelReturn(iPage == pLinPtr->cPages, VERR_INVALID_PARAMETER);
+ }
return rc;
}
@@ -634,6 +640,20 @@ int vmmdevHGCMCall (PVMMDEV pThis, VMMDevHGCMCall *pHGCMCall, uint32_t cbHGCMCal
Log(("vmmdevHGCMCall: cParms = %d\n", cParms));
/*
+ * Sane upper limit.
+ */
+ if (cParms > VMMDEV_MAX_HGCM_PARMS)
+ {
+ static int s_cRelWarn;
+ if (s_cRelWarn < 50)
+ {
+ s_cRelWarn++;
+ LogRel(("VMMDev: request packet with too many parameters (%d). Refusing operation.\n", cParms));
+ }
+ return VERR_INVALID_PARAMETER;
+ }
+
+ /*
* Compute size of required memory buffer.
*/
@@ -665,6 +685,12 @@ int vmmdevHGCMCall (PVMMDEV pThis, VMMDevHGCMCall *pHGCMCall, uint32_t cbHGCMCal
if (pGuestParm->u.Pointer.size > 0)
{
/* Only pointers with some actual data are counted. */
+ if (pGuestParm->u.Pointer.size > VMMDEV_MAX_HGCM_DATA_SIZE - cbCmdSize)
+ {
+ rc = VERR_INVALID_PARAMETER;
+ break;
+ }
+
cbCmdSize += pGuestParm->u.Pointer.size;
cLinPtrs++;
@@ -678,6 +704,12 @@ int vmmdevHGCMCall (PVMMDEV pThis, VMMDevHGCMCall *pHGCMCall, uint32_t cbHGCMCal
case VMMDevHGCMParmType_PageList:
{
+ if (pGuestParm->u.PageList.size > VMMDEV_MAX_HGCM_DATA_SIZE - cbCmdSize)
+ {
+ rc = VERR_INVALID_PARAMETER;
+ break;
+ }
+
cbCmdSize += pGuestParm->u.PageList.size;
Log(("vmmdevHGCMCall: pagelist size = %d\n", pGuestParm->u.PageList.size));
} break;
@@ -717,6 +749,12 @@ int vmmdevHGCMCall (PVMMDEV pThis, VMMDevHGCMCall *pHGCMCall, uint32_t cbHGCMCal
if (pGuestParm->u.Pointer.size > 0)
{
/* Only pointers with some actual data are counted. */
+ if (pGuestParm->u.Pointer.size > VMMDEV_MAX_HGCM_DATA_SIZE - cbCmdSize)
+ {
+ rc = VERR_INVALID_PARAMETER;
+ break;
+ }
+
cbCmdSize += pGuestParm->u.Pointer.size;
cLinPtrs++;
@@ -730,6 +768,12 @@ int vmmdevHGCMCall (PVMMDEV pThis, VMMDevHGCMCall *pHGCMCall, uint32_t cbHGCMCal
case VMMDevHGCMParmType_PageList:
{
+ if (pGuestParm->u.PageList.size > VMMDEV_MAX_HGCM_DATA_SIZE - cbCmdSize)
+ {
+ rc = VERR_INVALID_PARAMETER;
+ break;
+ }
+
cbCmdSize += pGuestParm->u.PageList.size;
Log(("vmmdevHGCMCall: pagelist size = %d\n", pGuestParm->u.PageList.size));
} break;
@@ -798,6 +842,7 @@ int vmmdevHGCMCall (PVMMDEV pThis, VMMDevHGCMCall *pHGCMCall, uint32_t cbHGCMCal
uint8_t *pcBuf = (uint8_t *)pHostParm + cParms * sizeof (VBOXHGCMSVCPARM);
pCmd->paHostParms = pHostParm;
+ pCmd->cHostParms = cParms;
uint32_t iLinPtr = 0;
RTGCPHYS *pPages = (RTGCPHYS *)((uint8_t *)pCmd->paLinPtrs + sizeof (VBOXHGCMLINPTR) *cLinPtrs);
@@ -1146,6 +1191,20 @@ static int vmmdevHGCMCallSaved (PVMMDEV pThis, VMMDevHGCMCall *pHGCMCall, RTGCPH
Log(("vmmdevHGCMCall: cParms = %d\n", cParms));
/*
+ * Sane upper limit.
+ */
+ if (cParms > VMMDEV_MAX_HGCM_PARMS)
+ {
+ static int s_cRelWarn;
+ if (s_cRelWarn < 50)
+ {
+ s_cRelWarn++;
+ LogRel(("VMMDev: request packet with too many parameters (%d). Refusing operation.\n", cParms));
+ }
+ return VERR_INVALID_PARAMETER;
+ }
+
+ /*
* Compute size of required memory buffer.
*/
@@ -1300,6 +1359,7 @@ static int vmmdevHGCMCallSaved (PVMMDEV pThis, VMMDevHGCMCall *pHGCMCall, RTGCPH
uint8_t *pu8Buf = (uint8_t *)pHostParm + cParms * sizeof (VBOXHGCMSVCPARM);
pCmd->paHostParms = pHostParm;
+ pCmd->cHostParms = cParms;
uint32_t iParm;
int iLinPtr = 0;
@@ -1769,6 +1829,88 @@ static int vmmdevHGCMCmdVerify (PVBOXHGCMCMD pCmd, VMMDevHGCMRequestHeader *pHea
return VERR_INVALID_PARAMETER;
}
+#ifdef VBOX_WITH_64_BITS_GUESTS
+static int vmmdevHGCMParmVerify64(HGCMFunctionParameter64 *pGuestParm, VBOXHGCMSVCPARM *pHostParm)
+{
+ int rc = VERR_INVALID_PARAMETER;
+
+ switch (pGuestParm->type)
+ {
+ case VMMDevHGCMParmType_32bit:
+ if (pHostParm->type == VBOX_HGCM_SVC_PARM_32BIT)
+ rc = VINF_SUCCESS;
+ break;
+
+ case VMMDevHGCMParmType_64bit:
+ if (pHostParm->type == VBOX_HGCM_SVC_PARM_64BIT)
+ rc = VINF_SUCCESS;
+ break;
+
+ case VMMDevHGCMParmType_LinAddr_In: /* In (read) */
+ case VMMDevHGCMParmType_LinAddr_Out: /* Out (write) */
+ case VMMDevHGCMParmType_LinAddr: /* In & Out */
+ if ( pHostParm->type == VBOX_HGCM_SVC_PARM_PTR
+ && pGuestParm->u.Pointer.size >= pHostParm->u.pointer.size)
+ rc = VINF_SUCCESS;
+ break;
+
+ case VMMDevHGCMParmType_PageList:
+ if ( pHostParm->type == VBOX_HGCM_SVC_PARM_PTR
+ && pGuestParm->u.PageList.size >= pHostParm->u.pointer.size)
+ rc = VINF_SUCCESS;
+ break;
+
+ default:
+ AssertLogRelMsgFailed(("hgcmCompleted: invalid parameter type %08X\n", pGuestParm->type));
+ break;
+ }
+
+ return rc;
+}
+#endif /* VBOX_WITH_64_BITS_GUESTS */
+
+#ifdef VBOX_WITH_64_BITS_GUESTS
+static int vmmdevHGCMParmVerify32(HGCMFunctionParameter32 *pGuestParm, VBOXHGCMSVCPARM *pHostParm)
+#else
+static int vmmdevHGCMParmVerify32(HGCMFunctionParameter *pGuestParm, VBOXHGCMSVCPARM *pHostParm)
+#endif
+{
+ int rc = VERR_INVALID_PARAMETER;
+
+ switch (pGuestParm->type)
+ {
+ case VMMDevHGCMParmType_32bit:
+ if (pHostParm->type == VBOX_HGCM_SVC_PARM_32BIT)
+ rc = VINF_SUCCESS;
+ break;
+
+ case VMMDevHGCMParmType_64bit:
+ if (pHostParm->type == VBOX_HGCM_SVC_PARM_64BIT)
+ rc = VINF_SUCCESS;
+ break;
+
+ case VMMDevHGCMParmType_LinAddr_In: /* In (read) */
+ case VMMDevHGCMParmType_LinAddr_Out: /* Out (write) */
+ case VMMDevHGCMParmType_LinAddr: /* In & Out */
+ if ( pHostParm->type == VBOX_HGCM_SVC_PARM_PTR
+ && pGuestParm->u.Pointer.size >= pHostParm->u.pointer.size)
+ rc = VINF_SUCCESS;
+ break;
+
+ case VMMDevHGCMParmType_PageList:
+ if ( pHostParm->type == VBOX_HGCM_SVC_PARM_PTR
+ && pGuestParm->u.PageList.size >= pHostParm->u.pointer.size)
+ rc = VINF_SUCCESS;
+ break;
+
+ default:
+ AssertLogRelMsgFailed(("hgcmCompleted: invalid parameter type %08X\n", pGuestParm->type));
+ break;
+ }
+
+ return rc;
+}
+
DECLCALLBACK(void) hgcmCompletedWorker (PPDMIHGCMPORT pInterface, int32_t result, PVBOXHGCMCMD pCmd)
{
PVMMDEV pThis = RT_FROM_MEMBER(pInterface, VMMDevState, IHGCMPort);
@@ -1866,6 +2008,8 @@ DECLCALLBACK(void) hgcmCompletedWorker (PPDMIHGCMPORT pInterface, int32_t result
VMMDevHGCMCall *pHGCMCall = (VMMDevHGCMCall *)pHeader;
uint32_t cParms = pHGCMCall->cParms;
+ if (cParms != pCmd->cHostParms)
+ rc = VERR_INVALID_PARAMETER;
VBOXHGCMSVCPARM *pHostParm = pCmd->paHostParms;
@@ -1874,8 +2018,12 @@ DECLCALLBACK(void) hgcmCompletedWorker (PPDMIHGCMPORT pInterface, int32_t result
HGCMFunctionParameter64 *pGuestParm = VMMDEV_HGCM_CALL_PARMS64(pHGCMCall);
- for (i = 0; i < cParms; i++, pGuestParm++, pHostParm++)
+ for (i = 0; i < cParms && RT_SUCCESS(rc); i++, pGuestParm++, pHostParm++)
{
+ rc = vmmdevHGCMParmVerify64(pGuestParm, pHostParm);
+ if (RT_FAILURE(rc))
+ break;
+
switch (pGuestParm->type)
{
case VMMDevHGCMParmType_32bit:
@@ -1902,7 +2050,6 @@ DECLCALLBACK(void) hgcmCompletedWorker (PPDMIHGCMPORT pInterface, int32_t result
/* Use the saved page list to write data back to the guest RAM. */
rc = vmmdevHGCMWriteLinPtr (pThis->pDevIns, i, pHostParm->u.pointer.addr,
size, iLinPtr, pCmd->paLinPtrs);
- AssertReleaseRC(rc);
}
/* All linptrs with size > 0 were saved. Advance the index to the next linptr. */
@@ -1953,7 +2100,8 @@ DECLCALLBACK(void) hgcmCompletedWorker (PPDMIHGCMPORT pInterface, int32_t result
default:
{
/* This indicates that the guest request memory was corrupted. */
- AssertReleaseMsgFailed(("hgcmCompleted: invalid parameter type %08X\n", pGuestParm->type));
+ rc = VERR_INVALID_PARAMETER;
+ break;
}
}
}
@@ -1969,6 +2117,8 @@ DECLCALLBACK(void) hgcmCompletedWorker (PPDMIHGCMPORT pInterface, int32_t result
VMMDevHGCMCall *pHGCMCall = (VMMDevHGCMCall *)pHeader;
uint32_t cParms = pHGCMCall->cParms;
+ if (cParms != pCmd->cHostParms)
+ rc = VERR_INVALID_PARAMETER;
VBOXHGCMSVCPARM *pHostParm = pCmd->paHostParms;
@@ -1977,8 +2127,12 @@ DECLCALLBACK(void) hgcmCompletedWorker (PPDMIHGCMPORT pInterface, int32_t result
HGCMFunctionParameter32 *pGuestParm = VMMDEV_HGCM_CALL_PARMS32(pHGCMCall);
- for (i = 0; i < cParms; i++, pGuestParm++, pHostParm++)
+ for (i = 0; i < cParms && RT_SUCCESS(rc); i++, pGuestParm++, pHostParm++)
{
+ rc = vmmdevHGCMParmVerify32(pGuestParm, pHostParm);
+ if (RT_FAILURE(rc))
+ break;
+
switch (pGuestParm->type)
{
case VMMDevHGCMParmType_32bit:
@@ -2004,7 +2158,6 @@ DECLCALLBACK(void) hgcmCompletedWorker (PPDMIHGCMPORT pInterface, int32_t result
{
/* Use the saved page list to write data back to the guest RAM. */
rc = vmmdevHGCMWriteLinPtr (pThis->pDevIns, i, pHostParm->u.pointer.addr, size, iLinPtr, pCmd->paLinPtrs);
- AssertReleaseRC(rc);
}
/* All linptrs with size > 0 were saved. Advance the index to the next linptr. */
@@ -2055,7 +2208,8 @@ DECLCALLBACK(void) hgcmCompletedWorker (PPDMIHGCMPORT pInterface, int32_t result
default:
{
/* This indicates that the guest request memory was corrupted. */
- AssertReleaseMsgFailed(("hgcmCompleted: invalid parameter type %08X\n", pGuestParm->type));
+ rc = VERR_INVALID_PARAMETER;
+ break;
}
}
}
@@ -2071,6 +2225,8 @@ DECLCALLBACK(void) hgcmCompletedWorker (PPDMIHGCMPORT pInterface, int32_t result
VMMDevHGCMCall *pHGCMCall = (VMMDevHGCMCall *)pHeader;
uint32_t cParms = pHGCMCall->cParms;
+ if (cParms != pCmd->cHostParms)
+ rc = VERR_INVALID_PARAMETER;
VBOXHGCMSVCPARM *pHostParm = pCmd->paHostParms;
@@ -2079,8 +2235,12 @@ DECLCALLBACK(void) hgcmCompletedWorker (PPDMIHGCMPORT pInterface, int32_t result
HGCMFunctionParameter *pGuestParm = VMMDEV_HGCM_CALL_PARMS(pHGCMCall);
- for (i = 0; i < cParms; i++, pGuestParm++, pHostParm++)
+ for (i = 0; i < cParms && RT_SUCCESS(rc); i++, pGuestParm++, pHostParm++)
{
+ rc = vmmdevHGCMParmVerify32(pGuestParm, pHostParm);
+ if (RT_FAILURE(rc))
+ break;
+
switch (pGuestParm->type)
{
case VMMDevHGCMParmType_32bit:
@@ -2106,7 +2266,6 @@ DECLCALLBACK(void) hgcmCompletedWorker (PPDMIHGCMPORT pInterface, int32_t result
{
/* Use the saved page list to write data back to the guest RAM. */
rc = vmmdevHGCMWriteLinPtr (pThis->pDevIns, i, pHostParm->u.pointer.addr, size, iLinPtr, pCmd->paLinPtrs);
- AssertReleaseRC(rc);
}
/* All linptrs with size > 0 were saved. Advance the index to the next linptr. */
@@ -2157,7 +2316,8 @@ DECLCALLBACK(void) hgcmCompletedWorker (PPDMIHGCMPORT pInterface, int32_t result
default:
{
/* This indicates that the guest request memory was corrupted. */
- AssertReleaseMsgFailed(("hgcmCompleted: invalid parameter type %08X\n", pGuestParm->type));
+ rc = VERR_INVALID_PARAMETER;
+ break;
}
}
}
@@ -2183,10 +2343,11 @@ DECLCALLBACK(void) hgcmCompletedWorker (PPDMIHGCMPORT pInterface, int32_t result
break;
}
}
- else
+
+ if (RT_FAILURE(rc))
{
- /* Command type is wrong. Return error to the guest. */
- pHeader->header.rc = rc;
+ /* Command is wrong. Return HGCM error result to the guest. */
+ pHeader->result = rc;
}
/* Mark request as processed. */
diff --git a/src/VBox/Devices/testcase/tstDeviceStructSizeRC.cpp b/src/VBox/Devices/testcase/tstDeviceStructSizeRC.cpp
index 94707e4..a185563 100644
--- a/src/VBox/Devices/testcase/tstDeviceStructSizeRC.cpp
+++ b/src/VBox/Devices/testcase/tstDeviceStructSizeRC.cpp
@@ -524,10 +524,6 @@ int main()
GEN_CHECK_OFF(PCNETSTATE, pfnEMInterpretInstructionGC
GEN_CHECK_OFF(PCNETSTATE, pfnEMInterpretInstructionR0
#endif
- GEN_CHECK_OFF(PCNETSTATE, pSharedMMIOR3);
- GEN_CHECK_OFF(PCNETSTATE, pSharedMMIOR0);
- GEN_CHECK_OFF(PCNETSTATE, pSharedMMIORC);
- GEN_CHECK_OFF(PCNETSTATE, fPrivIfEnabled);
GEN_CHECK_OFF(PCNETSTATE, fGCEnabled);
GEN_CHECK_OFF(PCNETSTATE, fR0Enabled);
GEN_CHECK_OFF(PCNETSTATE, fAm79C973);
diff --git a/src/VBox/Frontends/VBoxManage/Makefile.kmk b/src/VBox/Frontends/VBoxManage/Makefile.kmk
index 5b644ad..9957b3e 100644
--- a/src/VBox/Frontends/VBoxManage/Makefile.kmk
+++ b/src/VBox/Frontends/VBoxManage/Makefile.kmk
@@ -22,8 +22,10 @@ ifdef VBOX_WITH_DOCS
PROGRAMS += VBoxManageHelp
endif
VBoxManageHelp_TEMPLATE = VBoxAdvBldProg
-VBoxManageHelp_DEFS += VBOX_ONLY_DOCS
-VBoxManageHelp_SOURCES = \
+VBoxManageHelp_DEFS += \
+ VBOX_ONLY_DOCS \
+ $(if $(VBOX_WITH_GUEST_CONTROL),VBOX_WITH_GUEST_CONTROL)
+VBoxManageHelp_SOURCES = \
VBoxManage.cpp \
VBoxManageHelp.cpp \
$(if $(VBOX_WITH_GUEST_PROPS),VBoxManageGuestProp.cpp) \
@@ -34,7 +36,7 @@ ifndef VBOX_ONLY_DOCS
endif
VBoxManage_TEMPLATE = VBOXMAINCLIENTEXE
VBoxManage_DEFS.win = _WIN32_WINNT=0x0500
-VBoxManage_SOURCES = \
+VBoxManage_SOURCES = \
VBoxManage.cpp \
VBoxInternalManage.cpp \
VBoxManageAppliance.cpp \
diff --git a/src/VBox/Frontends/VBoxManage/VBoxInternalManage.cpp b/src/VBox/Frontends/VBoxManage/VBoxInternalManage.cpp
index fe2e1ea..f4033f7 100644
--- a/src/VBox/Frontends/VBoxManage/VBoxInternalManage.cpp
+++ b/src/VBox/Frontends/VBoxManage/VBoxInternalManage.cpp
@@ -2383,7 +2383,7 @@ int CmdDebugLog(int argc, char **argv, ComPtr<IVirtualBox> aVirtualBox, ComPtr<I
break;
default:
- return errorGetOpt(USAGE_DEBUGLOG , ch, &ValueUnion);
+ return errorGetOpt(USAGE_DEBUGLOG, ch, &ValueUnion);
}
}
@@ -2453,7 +2453,7 @@ int CmdGuestStats(int argc, char **argv, ComPtr<IVirtualBox> aVirtualBox, ComPtr
break;
default:
- return errorGetOpt(USAGE_GUESTSTATS , ch, &ValueUnion);
+ return errorGetOpt(USAGE_GUESTSTATS, ch, &ValueUnion);
}
}
@@ -2522,7 +2522,7 @@ int handleInternalCommands(HandlerArg *a)
if (!strcmp(pszCmd, "loadsyms"))
return CmdLoadSyms(a->argc - 1, &a->argv[1], a->virtualBox, a->session);
//if (!strcmp(pszCmd, "unloadsyms"))
- // return CmdUnloadSyms(argc - 1 , &a->argv[1]);
+ // return CmdUnloadSyms(argc - 1, &a->argv[1]);
if (!strcmp(pszCmd, "sethduuid") || !strcmp(pszCmd, "sethdparentuuid"))
return CmdSetHDUUID(a->argc, &a->argv[0], a->virtualBox, a->session);
if (!strcmp(pszCmd, "dumphdinfo"))
diff --git a/src/VBox/Frontends/VBoxManage/VBoxManage.cpp b/src/VBox/Frontends/VBoxManage/VBoxManage.cpp
index 2229897..533b30f 100644
--- a/src/VBox/Frontends/VBoxManage/VBoxManage.cpp
+++ b/src/VBox/Frontends/VBoxManage/VBoxManage.cpp
@@ -332,7 +332,7 @@ int main(int argc, char *argv[])
if (i >= argc - 1)
{
showLogo(g_pStdOut);
- printUsage(USAGE_ALL, g_pStdOut);
+ printUsage(USAGE_ALL, ~0U, g_pStdOut);
return 0;
}
fShowLogo = true;
@@ -356,7 +356,7 @@ int main(int argc, char *argv[])
{
/* Special option to dump really all commands,
* even the ones not understood on this platform. */
- printUsage(USAGE_DUMPOPTS, g_pStdOut);
+ printUsage(USAGE_DUMPOPTS, ~0U, g_pStdOut);
return 0;
}
@@ -554,7 +554,7 @@ int main(int argc, char *argv[])
|| ( argc - iCmdArg == 0
&& s_commandHandlers[commandIndex].help))
{
- printUsage(s_commandHandlers[commandIndex].help, g_pStdOut);
+ printUsage(s_commandHandlers[commandIndex].help, ~0U, g_pStdOut);
rcExit = RTEXITCODE_FAILURE; /* error */
}
else
diff --git a/src/VBox/Frontends/VBoxManage/VBoxManage.h b/src/VBox/Frontends/VBoxManage/VBoxManage.h
index c4fc914..f2c23ee 100644
--- a/src/VBox/Frontends/VBoxManage/VBoxManage.h
+++ b/src/VBox/Frontends/VBoxManage/VBoxManage.h
@@ -29,6 +29,7 @@
#include <iprt/types.h>
#include <iprt/message.h>
#include <iprt/stream.h>
+#include <iprt/getopt.h>
////////////////////////////////////////////////////////////////////////////////
//
@@ -105,6 +106,24 @@
#define USAGE_ALL (~(uint64_t)0)
/** @} */
+#ifdef VBOX_WITH_GUEST_CONTROL
+# define USAGE_GSTCTRL_EXEC RT_BIT(0)
+# define USAGE_GSTCTRL_COPYFROM RT_BIT(1)
+# define USAGE_GSTCTRL_COPYTO RT_BIT(2)
+# define USAGE_GSTCTRL_CREATEDIR RT_BIT(3)
+# define USAGE_GSTCTRL_REMOVEDIR RT_BIT(4)
+# define USAGE_GSTCTRL_REMOVEFILE RT_BIT(5)
+# define USAGE_GSTCTRL_RENAME RT_BIT(6)
+# define USAGE_GSTCTRL_CREATETEMP RT_BIT(7)
+# define USAGE_GSTCTRL_LIST RT_BIT(8)
+# define USAGE_GSTCTRL_PROCESS RT_BIT(9)
+# define USAGE_GSTCTRL_KILL RT_BIT(10)
+# define USAGE_GSTCTRL_SESSION RT_BIT(11)
+# define USAGE_GSTCTRL_STAT RT_BIT(12)
+# define USAGE_GSTCTRL_UPDATEADDS RT_BIT(13)
+# define USAGE_GSTCTRL_WATCH RT_BIT(14)
+#endif
+
typedef uint64_t USAGECATEGORY;
/** command handler argument */
@@ -147,12 +166,14 @@ extern bool g_fDetailedProgress; // in VBoxManage.cpp
////////////////////////////////////////////////////////////////////////////////
/* VBoxManageHelp.cpp */
-void printUsage(USAGECATEGORY u64Cmd, PRTSTREAM pStrm);
-RTEXITCODE errorSyntax(USAGECATEGORY u64Cmd, const char *pszFormat, ...);
-RTEXITCODE errorGetOpt(USAGECATEGORY u64Cmd, int rc, union RTGETOPTUNION const *pValueUnion);
+void printUsage(USAGECATEGORY fCategory, uint32_t fSubCategory, PRTSTREAM pStrm);
+RTEXITCODE errorSyntax(USAGECATEGORY fCategory, const char *pszFormat, ...);
+RTEXITCODE errorSyntaxEx(USAGECATEGORY fCategory, uint32_t fSubCategory, const char *pszFormat, ...);
+RTEXITCODE errorGetOpt(USAGECATEGORY fCategory, int rc, union RTGETOPTUNION const *pValueUnion);
+RTEXITCODE errorGetOptEx(USAGECATEGORY fCategory, uint32_t fSubCategory, int rc, union RTGETOPTUNION const *pValueUnion);
RTEXITCODE errorArgument(const char *pszFormat, ...);
-void printUsageInternal(USAGECATEGORY u64Cmd, PRTSTREAM pStrm);
+void printUsageInternal(USAGECATEGORY fCategory, PRTSTREAM pStrm);
#ifndef VBOX_ONLY_DOCS
HRESULT showProgress(ComPtr<IProgress> progress);
@@ -186,7 +207,7 @@ int handleDebugVM(HandlerArg *a);
extern void usageGuestProperty(PRTSTREAM pStrm, const char *pcszSep1, const char *pcszSep2);
/* VBoxManageGuestCtrl.cpp */
-extern void usageGuestControl(PRTSTREAM pStrm, const char *pcszSep1, const char *pcszSep2);
+extern void usageGuestControl(PRTSTREAM pStrm, const char *pcszSep1, const char *pcszSep2, uint32_t fSubCategory);
#ifndef VBOX_ONLY_DOCS
/* VBoxManageGuestProp.cpp */
diff --git a/src/VBox/Frontends/VBoxManage/VBoxManageBandwidthControl.cpp b/src/VBox/Frontends/VBoxManage/VBoxManageBandwidthControl.cpp
index 332612b..46cf199 100644
--- a/src/VBox/Frontends/VBoxManage/VBoxManageBandwidthControl.cpp
+++ b/src/VBox/Frontends/VBoxManage/VBoxManageBandwidthControl.cpp
@@ -274,8 +274,11 @@ static RTEXITCODE handleBandwidthControlList(HandlerArg *pArgs, ComPtr<IBandwidt
{
switch (c)
{
- case 'M': enmDetails = VMINFO_MACHINEREADABLE; break;
- default: return errorGetOpt(USAGE_BANDWIDTHCONTROL, c, &ValueUnion);
+ case 'M':
+ enmDetails = VMINFO_MACHINEREADABLE;
+ break;
+ default:
+ return errorGetOpt(USAGE_BANDWIDTHCONTROL, c, &ValueUnion);
}
}
diff --git a/src/VBox/Frontends/VBoxManage/VBoxManageGuestCtrl.cpp b/src/VBox/Frontends/VBoxManage/VBoxManageGuestCtrl.cpp
index 7a76ce4..ced18c1 100644
--- a/src/VBox/Frontends/VBoxManage/VBoxManageGuestCtrl.cpp
+++ b/src/VBox/Frontends/VBoxManage/VBoxManageGuestCtrl.cpp
@@ -62,11 +62,9 @@
using namespace com;
-/** Set by the signal handler. */
-static volatile bool g_fGuestCtrlCanceled = false;
-/** Our global session object which is also used in the
- * signal handler to abort operations properly. */
-static ComPtr<IGuestSession> g_pGuestSession;
+/** Set by the signal handler when current guest control
+ * action shall be aborted. */
+static volatile bool g_fGuestCtrlCanceled = false;
/**
* Listener declarations.
@@ -302,90 +300,121 @@ static int ctrlCopyDirExists(PCOPYCONTEXT pContext, bool bGuest, const char *psz
#endif /* VBOX_ONLY_DOCS */
-void usageGuestControl(PRTSTREAM pStrm, const char *pcszSep1, const char *pcszSep2)
+void usageGuestControl(PRTSTREAM pStrm, const char *pcszSep1, const char *pcszSep2, uint32_t uSubCmd)
{
RTStrmPrintf(pStrm,
- "%s guestcontrol %s <uuid|vmname>\n"
- " exec[ute]\n"
- " --image <path to program> --username <name>\n"
- " [--passwordfile <file> | --password <password>]\n"
- " [--domain <domain>] [--verbose] [--timeout <msec>]\n"
- " [--environment \"<NAME>=<VALUE> [<NAME>=<VALUE>]\"]\n"
- " [--wait-exit] [--wait-stdout] [--wait-stderr]\n"
- " [--dos2unix] [--unix2dos]\n"
- " [-- [<argument1>] ... [<argumentN>]]\n"
- /** @todo Add a "--" parameter (has to be last parameter) to directly execute
- * stuff, e.g. "VBoxManage guestcontrol execute <VMName> --username <> ... -- /bin/rm -Rf /foo". */
- "\n"
- " copyfrom\n"
- " <guest source> <host dest> --username <name>\n"
- " [--passwordfile <file> | --password <password>]\n"
- " [--domain <domain>] [--verbose]\n"
- " [--dryrun] [--follow] [--recursive]\n"
- "\n"
- " copyto|cp\n"
- " <host source> <guest dest> --username <name>\n"
- " [--passwordfile <file> | --password <password>]\n"
- " [--domain <domain>] [--verbose]\n"
- " [--dryrun] [--follow] [--recursive]\n"
- "\n"
- " createdir[ectory]|mkdir|md\n"
- " <guest directory>... --username <name>\n"
- " [--passwordfile <file> | --password <password>]\n"
- " [--domain <domain>] [--verbose]\n"
- " [--parents] [--mode <mode>]\n"
- "\n"
- " removedir[ectory]|rmdir\n"
- " <guest directory>... --username <name>\n"
- " [--passwordfile <file> | --password <password>]\n"
- " [--domain <domain>] [--verbose]\n"
- " [--recursive|-R|-r]\n"
- "\n"
- " removefile|rm\n"
- " <guest file>... --username <name>\n"
- " [--passwordfile <file> | --password <password>]\n"
- " [--domain <domain>] [--verbose]\n"
- "\n"
- " ren[ame]|mv\n"
- " <source>... <dest> --username <name>\n"
- " [--passwordfile <file> | --password <password>]\n"
- " [--domain <domain>] [--verbose]\n"
- "\n"
- " createtemp[orary]|mktemp\n"
- " <template> --username <name>\n"
- " [--passwordfile <file> | --password <password>]\n"
- " [--directory] [--secure] [--tmpdir <directory>]\n"
- " [--domain <domain>] [--mode <mode>] [--verbose]\n"
- "\n"
- " list <all|sessions|processes|files> [--verbose]\n"
- "\n"
- /** @todo Add an own help group for "session" and "process" sub commands. */
- " process kill --session-id <ID>\n"
+ "%s guestcontrol %s <uuid|vmname>\n%s",
+ pcszSep1, pcszSep2,
+ uSubCmd == ~0U ? "\n" : "");
+ if (uSubCmd & USAGE_GSTCTRL_EXEC)
+ RTStrmPrintf(pStrm,
+ " exec[ute]\n"
+ " --image <path to program> --username <name>\n"
+ " [--passwordfile <file> | --password <password>]\n"
+ " [--domain <domain>] [--verbose] [--timeout <msec>]\n"
+ " [--environment \"<NAME>=<VALUE> [<NAME>=<VALUE>]\"]\n"
+ " [--wait-exit] [--wait-stdout] [--wait-stderr]\n"
+ " [--dos2unix] [--unix2dos]\n"
+ " [-- [<argument1>] ... [<argumentN>]]\n"
+ "\n");
+ if (uSubCmd & USAGE_GSTCTRL_COPYFROM)
+ RTStrmPrintf(pStrm,
+ " copyfrom\n"
+ " <guest source> <host dest> --username <name>\n"
+ " [--passwordfile <file> | --password <password>]\n"
+ " [--domain <domain>] [--verbose]\n"
+ " [--dryrun] [--follow] [--recursive]\n"
+ "\n");
+ if (uSubCmd & USAGE_GSTCTRL_COPYTO)
+ RTStrmPrintf(pStrm,
+ " copyto|cp\n"
+ " <host source> <guest dest> --username <name>\n"
+ " [--passwordfile <file> | --password <password>]\n"
+ " [--domain <domain>] [--verbose]\n"
+ " [--dryrun] [--follow] [--recursive]\n"
+ "\n");
+ if (uSubCmd & USAGE_GSTCTRL_CREATEDIR)
+ RTStrmPrintf(pStrm,
+ " createdir[ectory]|mkdir|md\n"
+ " <guest directory>... --username <name>\n"
+ " [--passwordfile <file> | --password <password>]\n"
+ " [--domain <domain>] [--verbose]\n"
+ " [--parents] [--mode <mode>]\n"
+ "\n");
+ if (uSubCmd & USAGE_GSTCTRL_REMOVEDIR)
+ RTStrmPrintf(pStrm,
+ " removedir[ectory]|rmdir\n"
+ " <guest directory>... --username <name>\n"
+ " [--passwordfile <file> | --password <password>]\n"
+ " [--domain <domain>] [--verbose]\n"
+ " [--recursive|-R|-r]\n"
+ "\n");
+ if (uSubCmd & USAGE_GSTCTRL_REMOVEFILE)
+ RTStrmPrintf(pStrm,
+ " removefile|rm\n"
+ " <guest file>... --username <name>\n"
+ " [--passwordfile <file> | --password <password>]\n"
+ " [--domain <domain>] [--verbose]\n"
+ "\n");
+ if (uSubCmd & USAGE_GSTCTRL_RENAME)
+ RTStrmPrintf(pStrm,
+ " ren[ame]|mv\n"
+ " <source>... <dest> --username <name>\n"
+ " [--passwordfile <file> | --password <password>]\n"
+ " [--domain <domain>] [--verbose]\n"
+ "\n");
+ if (uSubCmd & USAGE_GSTCTRL_CREATETEMP)
+ RTStrmPrintf(pStrm,
+ " createtemp[orary]|mktemp\n"
+ " <template> --username <name>\n"
+ " [--passwordfile <file> | --password <password>]\n"
+ " [--directory] [--secure] [--tmpdir <directory>]\n"
+ " [--domain <domain>] [--mode <mode>] [--verbose]\n"
+ "\n");
+ if (uSubCmd & USAGE_GSTCTRL_LIST)
+ RTStrmPrintf(pStrm,
+ " list <all|sessions|processes|files> [--verbose]\n"
+ "\n");
+ /** @todo Add an own help group for "session" and "process" sub commands. */
+ if (uSubCmd & USAGE_GSTCTRL_PROCESS)
+ RTStrmPrintf(pStrm,
+ " process kill --session-id <ID>\n"
+ " | --session-name <name or pattern>\n"
+ " [--verbose]\n"
+ " <PID> ... <PID n>\n"
+ "\n");
+ if (uSubCmd & USAGE_GSTCTRL_KILL)
+ RTStrmPrintf(pStrm,
+ " [p[s]]kill --session-id <ID>\n"
" | --session-name <name or pattern>\n"
" [--verbose]\n"
" <PID> ... <PID n>\n"
- "\n"
- " [p[s]]kill --session-id <ID>\n"
- " | --session-name <name or pattern>\n"
- " [--verbose]\n"
- " <PID> ... <PID n>\n"
- "\n"
- " session close --session-id <ID>\n"
- " | --session-name <name or pattern>\n"
- " | --all\n"
- " [--verbose]\n"
- " stat\n"
- " <file>... --username <name>\n"
- " [--passwordfile <file> | --password <password>]\n"
- " [--domain <domain>] [--verbose]\n"
- "\n"
- " updateadditions\n"
- " [--source <guest additions .ISO>] [--verbose]\n"
- " [--wait-start]\n"
- " [-- [<argument1>] ... [<argumentN>]]\n"
- "\n"
- " watch [--verbose]\n"
- "\n", pcszSep1, pcszSep2);
+ "\n");
+ if (uSubCmd & USAGE_GSTCTRL_SESSION)
+ RTStrmPrintf(pStrm,
+ " session close --session-id <ID>\n"
+ " | --session-name <name or pattern>\n"
+ " | --all\n"
+ " [--verbose]\n"
+ "\n");
+ if (uSubCmd & USAGE_GSTCTRL_STAT)
+ RTStrmPrintf(pStrm,
+ " stat\n"
+ " <file>... --username <name>\n"
+ " [--passwordfile <file> | --password <password>]\n"
+ " [--domain <domain>] [--verbose]\n"
+ "\n");
+ if (uSubCmd & USAGE_GSTCTRL_UPDATEADDS)
+ RTStrmPrintf(pStrm,
+ " updateadditions\n"
+ " [--source <guest additions .ISO>] [--verbose]\n"
+ " [--wait-start]\n"
+ " [-- [<argument1>] ... [<argumentN>]]\n"
+ "\n");
+ if (uSubCmd & USAGE_GSTCTRL_WATCH)
+ RTStrmPrintf(pStrm,
+ " watch [--verbose]\n"
+ "\n");
}
#ifndef VBOX_ONLY_DOCS
@@ -402,8 +431,6 @@ static BOOL WINAPI guestCtrlSignalHandler(DWORD dwCtrlType)
case CTRL_CLOSE_EVENT:
case CTRL_C_EVENT:
ASMAtomicWriteBool(&g_fGuestCtrlCanceled, true);
- if (!g_pGuestSession.isNull())
- g_pGuestSession->Close();
fEventHandled = TRUE;
break;
default:
@@ -418,15 +445,13 @@ static BOOL WINAPI guestCtrlSignalHandler(DWORD dwCtrlType)
* Signal handler that sets g_fGuestCtrlCanceled.
*
* This can be executed on any thread in the process, on Windows it may even be
- * a thread dedicated to delivering this signal. Do not doing anything
+ * a thread dedicated to delivering this signal. Don't do anything
* unnecessary here.
*/
static void guestCtrlSignalHandler(int iSignal)
{
NOREF(iSignal);
ASMAtomicWriteBool(&g_fGuestCtrlCanceled, true);
- if (!g_pGuestSession.isNull())
- g_pGuestSession->Close();
}
#endif
@@ -558,6 +583,34 @@ static int ctrlExecProcessStatusToExitCode(ProcessStatus_T enmStatus, ULONG uExi
return vrc;
}
+const char *ctrlProcessWaitResultToText(ProcessWaitResult_T enmWaitResult)
+{
+ switch (enmWaitResult)
+ {
+ case ProcessWaitResult_Start:
+ return "started";
+ case ProcessWaitResult_Terminate:
+ return "terminated";
+ case ProcessWaitResult_Status:
+ return "status changed";
+ case ProcessWaitResult_Error:
+ return "error";
+ case ProcessWaitResult_Timeout:
+ return "timed out";
+ case ProcessWaitResult_StdIn:
+ return "stdin ready";
+ case ProcessWaitResult_StdOut:
+ return "data on stdout";
+ case ProcessWaitResult_StdErr:
+ return "data on stderr";
+ case ProcessWaitResult_WaitFlagNotSupported:
+ return "waiting flag not supported";
+ default:
+ break;
+ }
+ return "unknown";
+}
+
/**
* Translates a guest session status to a human readable
* string.
@@ -695,11 +748,11 @@ static void ctrlUninitVM(PGCTLCMDCTX pCtx, uint32_t uFlags)
/* Keep going - don't break here. Try to unlock the
* machine down below. */
}
- else if (pCtx->fVerbose)
+ else if ( (pCtx->uFlags & CTLCMDCTX_FLAGS_SESSION_DETACH)
+ && pCtx->fVerbose)
RTPrintf("Guest session detached\n");
pCtx->pGuestSession.setNull();
- g_pGuestSession.setNull();
}
if (pCtx->handlerArg.session)
@@ -710,6 +763,7 @@ static void ctrlUninitVM(PGCTLCMDCTX pCtx, uint32_t uFlags)
for (int i = 0; i < pCtx->iArgc; i++)
RTStrFree(pCtx->ppaArgv[i]);
RTMemFree(pCtx->ppaArgv);
+ pCtx->iArgc = 0;
}
/**
@@ -725,7 +779,7 @@ static void ctrlUninitVM(PGCTLCMDCTX pCtx, uint32_t uFlags)
* @param uFlags Command context flags.
*/
static RTEXITCODE ctrlInitVM(HandlerArg *pArg,
- PGCTLCMDCTX pCtx, uint32_t uFlags)
+ PGCTLCMDCTX pCtx, uint32_t uFlags, uint32_t uUsage)
{
AssertPtrReturn(pArg, RTEXITCODE_FAILURE);
AssertReturn(pArg->argc > 1, RTEXITCODE_FAILURE);
@@ -836,6 +890,10 @@ static RTEXITCODE ctrlInitVM(HandlerArg *pArg,
iArgIdx = GetState.iNext;
break;
+ case 'h': /* Help */
+ errorGetOptEx(USAGE_GUESTCONTROL, uUsage, ch, &ValueUnion);
+ return RTEXITCODE_SYNTAX;
+
default:
/* Simply skip; might be handled in a specific command
* handler later. */
@@ -885,7 +943,7 @@ static RTEXITCODE ctrlInitVM(HandlerArg *pArg,
if (!(uFlags & CTLCMDCTX_FLAGS_SESSION_ANONYMOUS))
{
if (pCtx->strUsername.isEmpty())
- rcExit = errorSyntax(USAGE_GUESTCONTROL, "No user name specified!");
+ rcExit = errorSyntaxEx(USAGE_GUESTCONTROL, uUsage, "No user name specified!");
}
}
@@ -961,10 +1019,6 @@ static RTEXITCODE ctrlInitVM(HandlerArg *pArg,
if ( SUCCEEDED(rc)
&& !(uFlags & CTLCMDCTX_FLAGS_NO_SIGNAL_HANDLER))
{
- /* Add session to global for being accessible by the
- * signal handler. */
- g_pGuestSession = pCtx->pGuestSession;
-
ctrlSignalHandlerInstall();
}
@@ -1140,7 +1194,8 @@ static DECLCALLBACK(RTEXITCODE) handleCtrlProcessExec(PGCTLCMDCTX pCtx)
{
case GETOPTDEF_EXEC_DOS2UNIX:
if (eOutputType != OUTPUTTYPE_UNDEFINED)
- return errorSyntax(USAGE_GUESTCONTROL, "More than one output type (dos2unix/unix2dos) specified!");
+ return errorSyntaxEx(USAGE_GUESTCONTROL, USAGE_GSTCTRL_EXEC,
+ "More than one output type (dos2unix/unix2dos) specified!");
eOutputType = OUTPUTTYPE_DOS2UNIX;
break;
@@ -1151,7 +1206,8 @@ static DECLCALLBACK(RTEXITCODE) handleCtrlProcessExec(PGCTLCMDCTX pCtx)
vrc = RTGetOptArgvFromString(&papszArg, &cArgs, ValueUnion.psz, NULL);
if (RT_FAILURE(vrc))
- return errorSyntax(USAGE_GUESTCONTROL, "Failed to parse environment value, rc=%Rrc", vrc);
+ return errorSyntaxEx(USAGE_GUESTCONTROL, USAGE_GSTCTRL_EXEC,
+ "Failed to parse environment value, rc=%Rrc", vrc);
for (int j = 0; j < cArgs; j++)
aEnv.push_back(Bstr(papszArg[j]).raw());
@@ -1179,7 +1235,8 @@ static DECLCALLBACK(RTEXITCODE) handleCtrlProcessExec(PGCTLCMDCTX pCtx)
case GETOPTDEF_EXEC_UNIX2DOS:
if (eOutputType != OUTPUTTYPE_UNDEFINED)
- return errorSyntax(USAGE_GUESTCONTROL, "More than one output type (dos2unix/unix2dos) specified!");
+ return errorSyntaxEx(USAGE_GUESTCONTROL, USAGE_GSTCTRL_EXEC,
+ "More than one output type (dos2unix/unix2dos) specified!");
eOutputType = OUTPUTTYPE_UNIX2DOS;
break;
@@ -1213,7 +1270,7 @@ static DECLCALLBACK(RTEXITCODE) handleCtrlProcessExec(PGCTLCMDCTX pCtx)
if (GetState.argc == GetState.iNext)
aArgs.push_back(Bstr(ValueUnion.psz).raw());
else
- return RTGetOptPrintError(ch, &ValueUnion);
+ return errorGetOptEx(USAGE_GUESTCONTROL, USAGE_GSTCTRL_EXEC, ch, &ValueUnion);
break;
} /* switch */
@@ -1228,11 +1285,13 @@ static DECLCALLBACK(RTEXITCODE) handleCtrlProcessExec(PGCTLCMDCTX pCtx)
return RTMsgErrorExit(RTEXITCODE_FAILURE, "Failed to initialize, rc=%Rrc\n", vrc);
if (strCmd.isEmpty())
- return errorSyntax(USAGE_GUESTCONTROL, "No command to execute specified!");
+ return errorSyntaxEx(USAGE_GUESTCONTROL, USAGE_GSTCTRL_EXEC,
+ "No command to execute specified!");
/** @todo Any output conversion not supported yet! */
if (eOutputType != OUTPUTTYPE_UNDEFINED)
- return errorSyntax(USAGE_GUESTCONTROL, "Output conversion not implemented yet!");
+ return errorSyntaxEx(USAGE_GUESTCONTROL, USAGE_GSTCTRL_EXEC,
+ "Output conversion not implemented yet!");
RTEXITCODE rcExit = RTEXITCODE_SUCCESS;
HRESULT rc;
@@ -1251,9 +1310,9 @@ static DECLCALLBACK(RTEXITCODE) handleCtrlProcessExec(PGCTLCMDCTX pCtx)
if (pCtx->fVerbose)
{
if (cMsTimeout == 0)
- RTPrintf("Waiting for guest process to start ...\n");
+ RTPrintf("Starting guest process ...\n");
else
- RTPrintf("Waiting for guest process to start (within %ums)\n", cMsTimeout);
+ RTPrintf("Starting guest process (within %ums)\n", cMsTimeout);
}
/*
@@ -1264,10 +1323,33 @@ static DECLCALLBACK(RTEXITCODE) handleCtrlProcessExec(PGCTLCMDCTX pCtx)
ComSafeArrayAsInParam(aArgs),
ComSafeArrayAsInParam(aEnv),
ComSafeArrayAsInParam(aCreateFlags),
- cMsTimeout,
+ ctrlExecGetRemainingTime(u64StartMS, cMsTimeout),
pProcess.asOutParam()));
- /** @todo does this need signal handling? there's no progress object etc etc */
+ /*
+ * Explicitly wait for the guest process to be in a started
+ * state.
+ */
+ com::SafeArray<ProcessWaitForFlag_T> aWaitStartFlags;
+ aWaitStartFlags.push_back(ProcessWaitForFlag_Start);
+ ProcessWaitResult_T waitResult;
+ CHECK_ERROR_BREAK(pProcess, WaitForArray(ComSafeArrayAsInParam(aWaitStartFlags),
+ ctrlExecGetRemainingTime(u64StartMS, cMsTimeout), &waitResult));
+ bool fCompleted = false;
+
+ ULONG uPID = 0;
+ CHECK_ERROR_BREAK(pProcess, COMGETTER(PID)(&uPID));
+ if (!fDetached && pCtx->fVerbose)
+ {
+ RTPrintf("Process '%s' (PID %RU32) started\n",
+ strCmd.c_str(), uPID);
+ }
+ else if (fDetached) /** @todo Introduce a --quiet option for not printing this. */
+ {
+ /* Just print plain PID to make it easier for scripts
+ * invoking VBoxManage. */
+ RTPrintf("[%RU32 - Session %RU32]\n", uPID, pCtx->uSessionID);
+ }
vrc = RTStrmSetMode(g_pStdOut, 1 /* Binary mode */, -1 /* Code set, unchanged */);
if (RT_FAILURE(vrc))
@@ -1277,35 +1359,21 @@ static DECLCALLBACK(RTEXITCODE) handleCtrlProcessExec(PGCTLCMDCTX pCtx)
RTMsgError("Unable to set stderr's binary mode, rc=%Rrc\n", vrc);
/* Wait for process to exit ... */
- RTMSINTERVAL cMsTimeLeft = 1;
+ RTMSINTERVAL cMsTimeLeft = 1; /* Will be calculated. */
bool fReadStdOut, fReadStdErr;
fReadStdOut = fReadStdErr = false;
- bool fCompleted = false;
- while (!fCompleted && cMsTimeLeft != 0)
+ while ( !fCompleted
+ && !fDetached
+ && cMsTimeLeft != 0)
{
cMsTimeLeft = ctrlExecGetRemainingTime(u64StartMS, cMsTimeout);
- ProcessWaitResult_T waitResult;
CHECK_ERROR_BREAK(pProcess, WaitForArray(ComSafeArrayAsInParam(aWaitFlags),
- cMsTimeLeft, &waitResult));
+ 500 /* ms */, &waitResult));
switch (waitResult)
{
case ProcessWaitResult_Start:
{
- ULONG uPID = 0;
- CHECK_ERROR_BREAK(pProcess, COMGETTER(PID)(&uPID));
- if (pCtx->fVerbose)
- {
- RTPrintf("Process '%s' (PID %RU32) started\n",
- strCmd.c_str(), uPID);
- }
- else /** @todo Introduce a --quiet option for not printing this. */
- {
- /* Just print plain PID to make it easier for scripts
- * invoking VBoxManage. */
- RTPrintf("%RU32, session ID %RU32\n", uPID, pCtx->uSessionID);
- }
-
/* We're done here if we don't want to wait for termination. */
if (fDetached)
fCompleted = true;
@@ -1319,7 +1387,9 @@ static DECLCALLBACK(RTEXITCODE) handleCtrlProcessExec(PGCTLCMDCTX pCtx)
fReadStdErr = true;
break;
case ProcessWaitResult_Terminate:
- /* Process terminated, we're done */
+ if (pCtx->fVerbose)
+ RTPrintf("Process terminated\n");
+ /* Process terminated, we're done. */
fCompleted = true;
break;
case ProcessWaitResult_WaitFlagNotSupported:
@@ -1332,6 +1402,8 @@ static DECLCALLBACK(RTEXITCODE) handleCtrlProcessExec(PGCTLCMDCTX pCtx)
fReadStdOut = fReadStdErr = true;
break;
}
+ case ProcessWaitResult_Timeout:
+ /* Fall through is intentional. */
default:
/* Ignore all other results, let the timeout expire */
break;
@@ -1369,33 +1441,39 @@ static DECLCALLBACK(RTEXITCODE) handleCtrlProcessExec(PGCTLCMDCTX pCtx)
} /* while */
- /* Report status back to the user. */
- if ( fCompleted
- && !g_fGuestCtrlCanceled)
+ if (!fDetached)
{
- ProcessStatus_T procStatus;
- CHECK_ERROR_BREAK(pProcess, COMGETTER(Status)(&procStatus));
- if ( procStatus == ProcessStatus_TerminatedNormally
- || procStatus == ProcessStatus_TerminatedAbnormally
- || procStatus == ProcessStatus_TerminatedSignal)
+ /* Report status back to the user. */
+ if ( fCompleted
+ && !g_fGuestCtrlCanceled)
{
- LONG exitCode;
- CHECK_ERROR_BREAK(pProcess, COMGETTER(ExitCode)(&exitCode));
- if (pCtx->fVerbose)
- RTPrintf("Exit code=%u (Status=%u [%s])\n",
- exitCode, procStatus, ctrlProcessStatusToText(procStatus));
- rcExit = (RTEXITCODE)ctrlExecProcessStatusToExitCode(procStatus, exitCode);
+ {
+ ProcessStatus_T procStatus;
+ CHECK_ERROR_BREAK(pProcess, COMGETTER(Status)(&procStatus));
+ if ( procStatus == ProcessStatus_TerminatedNormally
+ || procStatus == ProcessStatus_TerminatedAbnormally
+ || procStatus == ProcessStatus_TerminatedSignal)
+ {
+ LONG exitCode;
+ CHECK_ERROR_BREAK(pProcess, COMGETTER(ExitCode)(&exitCode));
+ if (pCtx->fVerbose)
+ RTPrintf("Exit code=%u (Status=%u [%s])\n",
+ exitCode, procStatus, ctrlProcessStatusToText(procStatus));
+
+ rcExit = (RTEXITCODE)ctrlExecProcessStatusToExitCode(procStatus, exitCode);
+ }
+ else if (pCtx->fVerbose)
+ RTPrintf("Process now is in status [%s]\n", ctrlProcessStatusToText(procStatus));
+ }
}
- else if (pCtx->fVerbose)
- RTPrintf("Process now is in status [%s]\n", ctrlProcessStatusToText(procStatus));
- }
- else
- {
- if (pCtx->fVerbose)
- RTPrintf("Process execution aborted!\n");
+ else
+ {
+ if (pCtx->fVerbose)
+ RTPrintf("Process execution aborted!\n");
- rcExit = (RTEXITCODE)EXITCODEEXEC_TERM_ABEND;
+ rcExit = (RTEXITCODE)EXITCODEEXEC_TERM_ABEND;
+ }
}
} while (0);
@@ -1405,6 +1483,11 @@ static DECLCALLBACK(RTEXITCODE) handleCtrlProcessExec(PGCTLCMDCTX pCtx)
rc = E_OUTOFMEMORY;
}
+ /*
+ * Decide what to do with the guest session. If we started a
+ * detached guest process (that is, without waiting for it to exit),
+ * don't close the guest session it is part of.
+ */
bool fCloseSession = false;
if (SUCCEEDED(rc))
{
@@ -1414,6 +1497,13 @@ static DECLCALLBACK(RTEXITCODE) handleCtrlProcessExec(PGCTLCMDCTX pCtx)
* access and/or kill detached guest process lateron.
*/
fCloseSession = !fDetached;
+
+ /*
+ * If execution was aborted from the host side (signal handler),
+ * close the guest session in any case.
+ */
+ if (g_fGuestCtrlCanceled)
+ fCloseSession = true;
}
else /* Close session on error. */
fCloseSession = true;
@@ -2343,6 +2433,7 @@ static RTEXITCODE handleCtrlCopy(PGCTLCMDCTX pCtx, bool fHostToGuest)
uint32_t fFlags = CopyFileFlag_None;
bool fCopyRecursive = false;
bool fDryRun = false;
+ uint32_t uUsage = fHostToGuest ? USAGE_GSTCTRL_COPYTO : USAGE_GSTCTRL_COPYFROM;
SOURCEVEC vecSources;
@@ -2387,18 +2478,17 @@ static RTEXITCODE handleCtrlCopy(PGCTLCMDCTX pCtx, bool fHostToGuest)
}
default:
- return RTGetOptPrintError(ch, &ValueUnion);
- break;
+ return errorGetOptEx(USAGE_GUESTCONTROL, uUsage, ch, &ValueUnion);
}
}
if (!vecSources.size())
- return errorSyntax(USAGE_GUESTCONTROL,
- "No source(s) specified!");
+ return errorSyntaxEx(USAGE_GUESTCONTROL, uUsage,
+ "No source(s) specified!");
if (strDest.isEmpty())
- return errorSyntax(USAGE_GUESTCONTROL,
- "No destination specified!");
+ return errorSyntaxEx(USAGE_GUESTCONTROL, uUsage,
+ "No destination specified!");
/*
* Done parsing arguments, do some more preparations.
@@ -2612,14 +2702,14 @@ static DECLCALLBACK(RTEXITCODE) handleCtrlCreateDirectory(PGCTLCMDCTX pCtx)
break;
default:
- return RTGetOptPrintError(ch, &ValueUnion);
- break;
+ return errorGetOptEx(USAGE_GUESTCONTROL, USAGE_GSTCTRL_CREATEDIR, ch, &ValueUnion);
}
}
uint32_t cDirs = mapDirs.size();
if (!cDirs)
- return errorSyntax(USAGE_GUESTCONTROL, "No directory to create specified!");
+ return errorSyntaxEx(USAGE_GUESTCONTROL, USAGE_GSTCTRL_CREATEDIR,
+ "No directory to create specified!");
/*
* Create the directories.
@@ -2675,14 +2765,14 @@ static DECLCALLBACK(RTEXITCODE) handleCtrlRemoveDirectory(PGCTLCMDCTX pCtx)
break;
default:
- return RTGetOptPrintError(ch, &ValueUnion);
- break;
+ return errorGetOptEx(USAGE_GUESTCONTROL, USAGE_GSTCTRL_REMOVEDIR, ch, &ValueUnion);
}
}
uint32_t cDirs = mapDirs.size();
if (!cDirs)
- return errorSyntax(USAGE_GUESTCONTROL, "No directory to remove specified!");
+ return errorSyntaxEx(USAGE_GUESTCONTROL, USAGE_GSTCTRL_REMOVEDIR,
+ "No directory to remove specified!");
/*
* Remove the directories.
@@ -2758,14 +2848,14 @@ static DECLCALLBACK(RTEXITCODE) handleCtrlRemoveFile(PGCTLCMDCTX pCtx)
break;
default:
- return RTGetOptPrintError(ch, &ValueUnion);
- break;
+ return errorGetOptEx(USAGE_GUESTCONTROL, USAGE_GSTCTRL_REMOVEFILE, ch, &ValueUnion);
}
}
uint32_t cFiles = mapDirs.size();
if (!cFiles)
- return errorSyntax(USAGE_GUESTCONTROL, "No file to remove specified!");
+ return errorSyntaxEx(USAGE_GUESTCONTROL, USAGE_GSTCTRL_REMOVEFILE,
+ "No file to remove specified!");
/*
* Create the directories.
@@ -2828,8 +2918,7 @@ static DECLCALLBACK(RTEXITCODE) handleCtrlRename(PGCTLCMDCTX pCtx)
break;
default:
- return RTGetOptPrintError(ch, &ValueUnion);
- break;
+ return errorGetOptEx(USAGE_GUESTCONTROL, USAGE_GSTCTRL_RENAME, ch, &ValueUnion);
}
}
}
@@ -2843,9 +2932,11 @@ static DECLCALLBACK(RTEXITCODE) handleCtrlRename(PGCTLCMDCTX pCtx)
uint32_t cSources = vecSources.size();
if (!cSources)
- return errorSyntax(USAGE_GUESTCONTROL, "No source(s) to move specified!");
+ return errorSyntaxEx(USAGE_GUESTCONTROL, USAGE_GSTCTRL_RENAME,
+ "No source(s) to move specified!");
if (cSources < 2)
- return errorSyntax(USAGE_GUESTCONTROL, "No destination specified!");
+ return errorSyntaxEx(USAGE_GUESTCONTROL, USAGE_GSTCTRL_RENAME,
+ "No destination specified!");
/* Delete last element, which now is the destination. */
vecSources.pop_back();
@@ -2858,7 +2949,7 @@ static DECLCALLBACK(RTEXITCODE) handleCtrlRename(PGCTLCMDCTX pCtx)
ComPtr<IGuestFsObjInfo> pFsObjInfo;
rc = pCtx->pGuestSession->DirectoryQueryInfo(Bstr(strDest).raw(), pFsObjInfo.asOutParam());
if (FAILED(rc))
- return RTMsgErrorExit(RTEXITCODE_FAILURE, "Destination must be a directory\n");
+ return RTMsgErrorExit(RTEXITCODE_FAILURE, "Destination must be a directory when specifying multiple sources\n");
}
/*
@@ -2894,28 +2985,6 @@ static DECLCALLBACK(RTEXITCODE) handleCtrlRename(PGCTLCMDCTX pCtx)
continue; /* Skip. */
}
- if (!fSourceIsDirectory)
- {
- char *pszFileName = RTPathFilename(strCurSource.c_str());
- if (!pszFileName)
- {
- RTMsgError("Unable to extract file name from source \"%s\"",
- strCurSource.c_str());
- break;
- }
-
- char szFileDest[RTPATH_MAX];
- vrc = RTPathJoin(szFileDest, sizeof(szFileDest), strDest.c_str(), pszFileName);
- if (RT_FAILURE(vrc))
- {
- RTMsgError("Unable to build destination name for source \"%s\", rc=%Rrc",
- strCurSource.c_str(), vrc);
- break;
- }
-
- strCurDest = szFileDest;
- }
-
if (pCtx->fVerbose)
RTPrintf("Renaming %s \"%s\" to \"%s\" ...\n",
fSourceIsDirectory ? "directory" : "file",
@@ -3004,22 +3073,23 @@ static DECLCALLBACK(RTEXITCODE) handleCtrlCreateTemp(PGCTLCMDCTX pCtx)
if (strTemplate.isEmpty())
strTemplate = ValueUnion.psz;
else
- return errorSyntax(USAGE_GUESTCONTROL,
- "More than one template specified!\n");
+ return errorSyntaxEx(USAGE_GUESTCONTROL, USAGE_GSTCTRL_CREATETEMP,
+ "More than one template specified!\n");
break;
}
default:
- return RTGetOptPrintError(ch, &ValueUnion);
- break;
+ return errorGetOptEx(USAGE_GUESTCONTROL, USAGE_GSTCTRL_CREATETEMP, ch, &ValueUnion);
}
}
if (strTemplate.isEmpty())
- return errorSyntax(USAGE_GUESTCONTROL, "No template specified!");
+ return errorSyntaxEx(USAGE_GUESTCONTROL, USAGE_GSTCTRL_CREATETEMP,
+ "No template specified!");
if (!fDirectory)
- return errorSyntax(USAGE_GUESTCONTROL, "Creating temporary files is currently not supported!");
+ return errorSyntaxEx(USAGE_GUESTCONTROL, USAGE_GSTCTRL_CREATETEMP,
+ "Creating temporary files is currently not supported!");
/*
* Create the directories.
@@ -3085,23 +3155,22 @@ static DECLCALLBACK(RTEXITCODE) handleCtrlStat(PGCTLCMDCTX pCtx)
case 'f': /* File-system */
case 'c': /* Format */
case 't': /* Terse */
- return errorSyntax(USAGE_GUESTCONTROL, "Command \"%s\" not implemented yet!",
- ValueUnion.psz);
- break; /* Never reached. */
+ return errorSyntaxEx(USAGE_GUESTCONTROL, USAGE_GSTCTRL_STAT,
+ "Command \"%s\" not implemented yet!", ValueUnion.psz);
case VINF_GETOPT_NOT_OPTION:
mapObjs[ValueUnion.psz]; /* Add element to check to map. */
break;
default:
- return RTGetOptPrintError(ch, &ValueUnion);
- break;
+ return errorGetOptEx(USAGE_GUESTCONTROL, USAGE_GSTCTRL_STAT, ch, &ValueUnion);
}
}
uint32_t cObjs = mapObjs.size();
if (!cObjs)
- return errorSyntax(USAGE_GUESTCONTROL, "No element(s) to check specified!");
+ return errorSyntaxEx(USAGE_GUESTCONTROL, USAGE_GSTCTRL_STAT,
+ "No element(s) to check specified!");
HRESULT rc;
@@ -3206,8 +3275,7 @@ static DECLCALLBACK(RTEXITCODE) handleCtrlUpdateAdditions(PGCTLCMDCTX pCtx)
break;
default:
- return RTGetOptPrintError(ch, &ValueUnion);
- break;
+ return errorGetOptEx(USAGE_GUESTCONTROL, USAGE_GSTCTRL_UPDATEADDS, ch, &ValueUnion);
}
}
@@ -3284,7 +3352,8 @@ static DECLCALLBACK(RTEXITCODE) handleCtrlList(PGCTLCMDCTX pCtx)
AssertPtrReturn(pCtx, RTEXITCODE_FAILURE);
if (pCtx->iArgc < 1)
- return errorSyntax(USAGE_GUESTCONTROL, "Must specify a listing category");
+ return errorSyntaxEx(USAGE_GUESTCONTROL, USAGE_GSTCTRL_LIST,
+ "Must specify a listing category");
RTEXITCODE rcExit = RTEXITCODE_SUCCESS;
@@ -3408,7 +3477,8 @@ static DECLCALLBACK(RTEXITCODE) handleCtrlList(PGCTLCMDCTX pCtx)
rcExit = RTEXITCODE_FAILURE;
}
else
- return errorSyntax(USAGE_GUESTCONTROL, "Invalid listing category '%s", pCtx->ppaArgv[0]);
+ return errorSyntaxEx(USAGE_GUESTCONTROL, USAGE_GSTCTRL_LIST,
+ "Invalid listing category '%s", pCtx->ppaArgv[0]);
return rcExit;
}
@@ -3418,7 +3488,8 @@ static DECLCALLBACK(RTEXITCODE) handleCtrlProcessClose(PGCTLCMDCTX pCtx)
AssertPtrReturn(pCtx, RTEXITCODE_FAILURE);
if (pCtx->iArgc < 1)
- return errorSyntax(USAGE_GUESTCONTROL, "Must specify at least a PID to close");
+ return errorSyntaxEx(USAGE_GUESTCONTROL, USAGE_GSTCTRL_PROCESS,
+ "Must specify at least a PID to close");
static const RTGETOPTDEF s_aOptions[] =
{
@@ -3473,26 +3544,27 @@ static DECLCALLBACK(RTEXITCODE) handleCtrlProcessClose(PGCTLCMDCTX pCtx)
break;
default:
- return RTGetOptPrintError(ch, &ValueUnion);
- break;
+ return errorGetOptEx(USAGE_GUESTCONTROL, USAGE_GSTCTRL_PROCESS, ch, &ValueUnion);
}
}
if (vecPID.empty())
- return errorSyntax(USAGE_GUESTCONTROL, "At least one PID must be specified to kill!");
- else if ( strSessionName.isEmpty()
- && ulSessionID == UINT32_MAX)
- {
- return errorSyntax(USAGE_GUESTCONTROL, "No session ID specified!");
- }
- else if ( !strSessionName.isEmpty()
- && ulSessionID != UINT32_MAX)
- {
- return errorSyntax(USAGE_GUESTCONTROL, "Either session ID or name (pattern) must be specified");
- }
+ return errorSyntaxEx(USAGE_GUESTCONTROL, USAGE_GSTCTRL_PROCESS,
+ "At least one PID must be specified to kill!");
+
+ if ( strSessionName.isEmpty()
+ && ulSessionID == UINT32_MAX)
+ return errorSyntaxEx(USAGE_GUESTCONTROL, USAGE_GSTCTRL_PROCESS,
+ "No session ID specified!");
+
+ if ( !strSessionName.isEmpty()
+ && ulSessionID != UINT32_MAX)
+ return errorSyntaxEx(USAGE_GUESTCONTROL, USAGE_GSTCTRL_PROCESS,
+ "Either session ID or name (pattern) must be specified");
if (RT_FAILURE(vrc))
- return errorSyntax(USAGE_GUESTCONTROL, "Invalid parameters specified");
+ return errorSyntaxEx(USAGE_GUESTCONTROL, USAGE_GSTCTRL_PROCESS,
+ "Invalid parameters specified");
HRESULT rc = S_OK;
@@ -3595,7 +3667,8 @@ static DECLCALLBACK(RTEXITCODE) handleCtrlProcess(PGCTLCMDCTX pCtx)
AssertPtrReturn(pCtx, RTEXITCODE_FAILURE);
if (pCtx->iArgc < 1)
- return errorSyntax(USAGE_GUESTCONTROL, "Must specify an action");
+ return errorSyntaxEx(USAGE_GUESTCONTROL, USAGE_GSTCTRL_PROCESS,
+ "Must specify an action");
/** Use RTGetOpt here when handling command line args gets more complex. */
@@ -3607,7 +3680,8 @@ static DECLCALLBACK(RTEXITCODE) handleCtrlProcess(PGCTLCMDCTX pCtx)
return handleCtrlProcessClose(pCtx);
}
- return errorSyntax(USAGE_GUESTCONTROL, "Invalid process action '%s'", pCtx->ppaArgv[0]);
+ return errorSyntaxEx(USAGE_GUESTCONTROL, USAGE_GSTCTRL_PROCESS,
+ "Invalid process action '%s'", pCtx->ppaArgv[0]);
}
static DECLCALLBACK(RTEXITCODE) handleCtrlSessionClose(PGCTLCMDCTX pCtx)
@@ -3615,7 +3689,8 @@ static DECLCALLBACK(RTEXITCODE) handleCtrlSessionClose(PGCTLCMDCTX pCtx)
AssertPtrReturn(pCtx, RTEXITCODE_FAILURE);
if (pCtx->iArgc < 1)
- return errorSyntax(USAGE_GUESTCONTROL, "Must specify at least a session to close");
+ return errorSyntaxEx(USAGE_GUESTCONTROL, USAGE_GSTCTRL_SESSION,
+ "Must specify at least a session to close");
static const RTGETOPTDEF s_aOptions[] =
{
@@ -3655,25 +3730,22 @@ static DECLCALLBACK(RTEXITCODE) handleCtrlSessionClose(PGCTLCMDCTX pCtx)
break;
default:
- return RTGetOptPrintError(ch, &ValueUnion);
- break;
+ return errorGetOptEx(USAGE_GUESTCONTROL, USAGE_GSTCTRL_SESSION, ch, &ValueUnion);
}
}
if ( strSessionName.isEmpty()
&& ulSessionID == UINT32_MAX)
- {
- return errorSyntax(USAGE_GUESTCONTROL, "No session ID specified!");
- }
- else if ( !strSessionName.isEmpty()
- && ulSessionID != UINT32_MAX)
- {
- return errorSyntax(USAGE_GUESTCONTROL, "Either session ID or name (pattern) must be specified");
- }
+ return errorSyntaxEx(USAGE_GUESTCONTROL, USAGE_GSTCTRL_SESSION,
+ "No session ID specified!");
+
+ if ( !strSessionName.isEmpty()
+ && ulSessionID != UINT32_MAX)
+ return errorSyntaxEx(USAGE_GUESTCONTROL, USAGE_GSTCTRL_SESSION,
+ "Either session ID or name (pattern) must be specified");
HRESULT rc = S_OK;
- ComPtr<IGuestSession> pSession;
do
{
bool fSessionFound = false;
@@ -3685,7 +3757,7 @@ static DECLCALLBACK(RTEXITCODE) handleCtrlSessionClose(PGCTLCMDCTX pCtx)
for (size_t i = 0; i < cSessions; i++)
{
- pSession = collSessions[i];
+ ComPtr<IGuestSession> pSession = collSessions[i];
Assert(!pSession.isNull());
ULONG uID; /* Session ID */
@@ -3716,7 +3788,7 @@ static DECLCALLBACK(RTEXITCODE) handleCtrlSessionClose(PGCTLCMDCTX pCtx)
if (pCtx->fVerbose)
RTPrintf("Guest session successfully closed\n");
- pSession->Release();
+ pSession.setNull();
}
}
@@ -3736,7 +3808,8 @@ static DECLCALLBACK(RTEXITCODE) handleCtrlSession(PGCTLCMDCTX pCtx)
AssertPtrReturn(pCtx, RTEXITCODE_FAILURE);
if (pCtx->iArgc < 1)
- return errorSyntax(USAGE_GUESTCONTROL, "Must specify an action");
+ return errorSyntaxEx(USAGE_GUESTCONTROL, USAGE_GSTCTRL_SESSION,
+ "Must specify an action");
/** Use RTGetOpt here when handling command line args gets more complex. */
@@ -3748,7 +3821,8 @@ static DECLCALLBACK(RTEXITCODE) handleCtrlSession(PGCTLCMDCTX pCtx)
return handleCtrlSessionClose(pCtx);
}
- return errorSyntax(USAGE_GUESTCONTROL, "Invalid session action '%s'", pCtx->ppaArgv[0]);
+ return errorSyntaxEx(USAGE_GUESTCONTROL, USAGE_GSTCTRL_SESSION,
+ "Invalid session action '%s'", pCtx->ppaArgv[0]);
}
static DECLCALLBACK(RTEXITCODE) handleCtrlWatch(PGCTLCMDCTX pCtx)
@@ -3775,8 +3849,7 @@ static DECLCALLBACK(RTEXITCODE) handleCtrlWatch(PGCTLCMDCTX pCtx)
break;
default:
- return RTGetOptPrintError(ch, &ValueUnion);
- break;
+ return errorGetOptEx(USAGE_GUESTCONTROL, USAGE_GSTCTRL_WATCH, ch, &ValueUnion);
}
}
@@ -3858,35 +3931,60 @@ int handleGuestControl(HandlerArg *pArg)
return errorSyntax(USAGE_GUESTCONTROL, "No sub command specified!");
uint32_t uCmdCtxFlags = 0;
+ uint32_t uUsage;
GCTLCMD gctlCmd;
if ( !RTStrICmp(pArg->argv[1], "exec")
|| !RTStrICmp(pArg->argv[1], "execute"))
+ {
gctlCmd.pfnHandler = handleCtrlProcessExec;
+ uUsage = USAGE_GSTCTRL_EXEC;
+ }
else if (!RTStrICmp(pArg->argv[1], "copyfrom"))
+ {
gctlCmd.pfnHandler = handleCtrlCopyFrom;
+ uUsage = USAGE_GSTCTRL_COPYFROM;
+ }
else if ( !RTStrICmp(pArg->argv[1], "copyto")
|| !RTStrICmp(pArg->argv[1], "cp"))
+ {
gctlCmd.pfnHandler = handleCtrlCopyTo;
+ uUsage = USAGE_GSTCTRL_COPYTO;
+ }
else if ( !RTStrICmp(pArg->argv[1], "createdirectory")
|| !RTStrICmp(pArg->argv[1], "createdir")
|| !RTStrICmp(pArg->argv[1], "mkdir")
|| !RTStrICmp(pArg->argv[1], "md"))
+ {
gctlCmd.pfnHandler = handleCtrlCreateDirectory;
+ uUsage = USAGE_GSTCTRL_CREATEDIR;
+ }
else if ( !RTStrICmp(pArg->argv[1], "removedirectory")
|| !RTStrICmp(pArg->argv[1], "removedir")
|| !RTStrICmp(pArg->argv[1], "rmdir"))
+ {
gctlCmd.pfnHandler = handleCtrlRemoveDirectory;
+ uUsage = USAGE_GSTCTRL_REMOVEDIR;
+ }
else if ( !RTStrICmp(pArg->argv[1], "rm")
|| !RTStrICmp(pArg->argv[1], "removefile"))
+ {
gctlCmd.pfnHandler = handleCtrlRemoveFile;
+ uUsage = USAGE_GSTCTRL_REMOVEFILE;
+ }
else if ( !RTStrICmp(pArg->argv[1], "ren")
|| !RTStrICmp(pArg->argv[1], "rename")
|| !RTStrICmp(pArg->argv[1], "mv"))
+ {
gctlCmd.pfnHandler = handleCtrlRename;
+ uUsage = USAGE_GSTCTRL_RENAME;
+ }
else if ( !RTStrICmp(pArg->argv[1], "createtemporary")
|| !RTStrICmp(pArg->argv[1], "createtemp")
|| !RTStrICmp(pArg->argv[1], "mktemp"))
+ {
gctlCmd.pfnHandler = handleCtrlCreateTemp;
+ uUsage = USAGE_GSTCTRL_CREATETEMP;
+ }
else if ( !RTStrICmp(pArg->argv[1], "kill") /* Linux. */
|| !RTStrICmp(pArg->argv[1], "pkill") /* Solaris / *BSD. */
|| !RTStrICmp(pArg->argv[1], "pskill")) /* SysInternals version. */
@@ -3895,40 +3993,49 @@ int handleGuestControl(HandlerArg *pArg)
uCmdCtxFlags = CTLCMDCTX_FLAGS_SESSION_ANONYMOUS
| CTLCMDCTX_FLAGS_NO_SIGNAL_HANDLER;
gctlCmd.pfnHandler = handleCtrlProcessClose;
+ uUsage = USAGE_GSTCTRL_KILL;
}
/** @todo Implement "killall"? */
else if ( !RTStrICmp(pArg->argv[1], "stat"))
+ {
gctlCmd.pfnHandler = handleCtrlStat;
+ uUsage = USAGE_GSTCTRL_STAT;
+ }
else if ( !RTStrICmp(pArg->argv[1], "updateadditions")
|| !RTStrICmp(pArg->argv[1], "updateadds"))
{
uCmdCtxFlags = CTLCMDCTX_FLAGS_SESSION_ANONYMOUS
| CTLCMDCTX_FLAGS_NO_SIGNAL_HANDLER;
gctlCmd.pfnHandler = handleCtrlUpdateAdditions;
+ uUsage = USAGE_GSTCTRL_UPDATEADDS;
}
else if ( !RTStrICmp(pArg->argv[1], "list"))
{
uCmdCtxFlags = CTLCMDCTX_FLAGS_SESSION_ANONYMOUS
| CTLCMDCTX_FLAGS_NO_SIGNAL_HANDLER;
gctlCmd.pfnHandler = handleCtrlList;
+ uUsage = USAGE_GSTCTRL_LIST;
}
else if ( !RTStrICmp(pArg->argv[1], "session"))
{
uCmdCtxFlags = CTLCMDCTX_FLAGS_SESSION_ANONYMOUS
| CTLCMDCTX_FLAGS_NO_SIGNAL_HANDLER;
gctlCmd.pfnHandler = handleCtrlSession;
+ uUsage = USAGE_GSTCTRL_SESSION;
}
else if ( !RTStrICmp(pArg->argv[1], "process"))
{
uCmdCtxFlags = CTLCMDCTX_FLAGS_SESSION_ANONYMOUS
| CTLCMDCTX_FLAGS_NO_SIGNAL_HANDLER;
gctlCmd.pfnHandler = handleCtrlProcess;
+ uUsage = USAGE_GSTCTRL_PROCESS;
}
else if ( !RTStrICmp(pArg->argv[1], "watch"))
{
uCmdCtxFlags = CTLCMDCTX_FLAGS_SESSION_ANONYMOUS
| CTLCMDCTX_FLAGS_NO_SIGNAL_HANDLER;
gctlCmd.pfnHandler = handleCtrlWatch;
+ uUsage = USAGE_GSTCTRL_WATCH;
}
else
return errorSyntax(USAGE_GUESTCONTROL, "Unknown sub command '%s' specified!", pArg->argv[1]);
@@ -3936,7 +4043,7 @@ int handleGuestControl(HandlerArg *pArg)
GCTLCMDCTX cmdCtx;
RT_ZERO(cmdCtx);
- RTEXITCODE rcExit = ctrlInitVM(pArg, &cmdCtx, uCmdCtxFlags);
+ RTEXITCODE rcExit = ctrlInitVM(pArg, &cmdCtx, uCmdCtxFlags, uUsage);
if (rcExit == RTEXITCODE_SUCCESS)
{
/* Kick off the actual command handler. */
diff --git a/src/VBox/Frontends/VBoxManage/VBoxManageHelp.cpp b/src/VBox/Frontends/VBoxManage/VBoxManageHelp.cpp
index a0432e1..187fd45 100644
--- a/src/VBox/Frontends/VBoxManage/VBoxManageHelp.cpp
+++ b/src/VBox/Frontends/VBoxManage/VBoxManageHelp.cpp
@@ -46,7 +46,7 @@ void showLogo(PRTSTREAM pStrm)
}
}
-void printUsage(USAGECATEGORY u64Cmd, PRTSTREAM pStrm)
+void printUsage(USAGECATEGORY fCategory, uint32_t fSubCategory, PRTSTREAM pStrm)
{
bool fDumpOpts = false;
#ifdef RT_OS_LINUX
@@ -80,7 +80,7 @@ void printUsage(USAGECATEGORY u64Cmd, PRTSTREAM pStrm)
bool fVBoxSDL = false;
#endif
- if (u64Cmd == USAGE_DUMPOPTS)
+ if (fCategory == USAGE_DUMPOPTS)
{
fDumpOpts = true;
fLinux = true;
@@ -89,14 +89,14 @@ void printUsage(USAGECATEGORY u64Cmd, PRTSTREAM pStrm)
fFreeBSD = true;
fDarwin = true;
fVBoxSDL = true;
- u64Cmd = USAGE_ALL;
+ fCategory = USAGE_ALL;
}
RTStrmPrintf(pStrm,
"Usage:\n"
"\n");
- if (u64Cmd == USAGE_ALL)
+ if (fCategory == USAGE_ALL)
RTStrmPrintf(pStrm,
" VBoxManage [<general option>] <command>\n"
" \n \n"
@@ -110,7 +110,7 @@ void printUsage(USAGECATEGORY u64Cmd, PRTSTREAM pStrm)
const char *pcszSep1 = " ";
const char *pcszSep2 = " ";
- if (u64Cmd != USAGE_ALL)
+ if (fCategory != USAGE_ALL)
{
pcszSep1 = "VBoxManage";
pcszSep2 = "";
@@ -118,7 +118,7 @@ void printUsage(USAGECATEGORY u64Cmd, PRTSTREAM pStrm)
#define SEP pcszSep1, pcszSep2
- if (u64Cmd & USAGE_LIST)
+ if (fCategory & USAGE_LIST)
RTStrmPrintf(pStrm,
"%s list [--long|-l]%s vms|runningvms|ostypes|hostdvds|hostfloppies|\n"
#if defined(VBOX_WITH_NETFLT)
@@ -131,24 +131,24 @@ void printUsage(USAGECATEGORY u64Cmd, PRTSTREAM pStrm)
" groups|webcams\n"
"\n", SEP);
- if (u64Cmd & USAGE_SHOWVMINFO)
+ if (fCategory & USAGE_SHOWVMINFO)
RTStrmPrintf(pStrm,
"%s showvminfo %s <uuid|vmname> [--details]\n"
" [--machinereadable]\n"
"%s showvminfo %s <uuid|vmname> --log <idx>\n"
"\n", SEP, SEP);
- if (u64Cmd & USAGE_REGISTERVM)
+ if (fCategory & USAGE_REGISTERVM)
RTStrmPrintf(pStrm,
"%s registervm %s <filename>\n"
"\n", SEP);
- if (u64Cmd & USAGE_UNREGISTERVM)
+ if (fCategory & USAGE_UNREGISTERVM)
RTStrmPrintf(pStrm,
"%s unregistervm %s <uuid|vmname> [--delete]\n"
"\n", SEP);
- if (u64Cmd & USAGE_CREATEVM)
+ if (fCategory & USAGE_CREATEVM)
RTStrmPrintf(pStrm,
"%s createvm %s --name <name>\n"
" [--groups <group>, ...]\n"
@@ -158,7 +158,7 @@ void printUsage(USAGECATEGORY u64Cmd, PRTSTREAM pStrm)
" [--uuid <uuid>]\n"
"\n", SEP);
- if (u64Cmd & USAGE_MODIFYVM)
+ if (fCategory & USAGE_MODIFYVM)
{
RTStrmPrintf(pStrm,
"%s modifyvm %s <uuid|vmname>\n"
@@ -381,7 +381,7 @@ void printUsage(USAGECATEGORY u64Cmd, PRTSTREAM pStrm)
"\n");
}
- if (u64Cmd & USAGE_CLONEVM)
+ if (fCategory & USAGE_CLONEVM)
RTStrmPrintf(pStrm,
"%s clonevm %s <uuid|vmname>\n"
" [--snapshot <uuid>|<name>]\n"
@@ -395,7 +395,7 @@ void printUsage(USAGECATEGORY u64Cmd, PRTSTREAM pStrm)
" [--register]\n"
"\n", SEP);
- if (u64Cmd & USAGE_IMPORTAPPLIANCE)
+ if (fCategory & USAGE_IMPORTAPPLIANCE)
RTStrmPrintf(pStrm,
"%s import %s <ovfname/ovaname>\n"
" [--dry-run|-n]\n"
@@ -404,7 +404,7 @@ void printUsage(USAGECATEGORY u64Cmd, PRTSTREAM pStrm)
" (run with -n to have options displayed\n"
" for a particular OVF)\n\n", SEP);
- if (u64Cmd & USAGE_EXPORTAPPLIANCE)
+ if (fCategory & USAGE_EXPORTAPPLIANCE)
RTStrmPrintf(pStrm,
"%s export %s <machines> --output|-o <name>.<ovf/ova>\n"
" [--legacy09|--ovf09|--ovf10|--ovf20]\n"
@@ -421,7 +421,7 @@ void printUsage(USAGECATEGORY u64Cmd, PRTSTREAM pStrm)
" [--eulafile <filename>]\n"
"\n", SEP);
- if (u64Cmd & USAGE_STARTVM)
+ if (fCategory & USAGE_STARTVM)
{
RTStrmPrintf(pStrm,
"%s startvm %s <uuid|vmname>...\n"
@@ -433,7 +433,7 @@ void printUsage(USAGECATEGORY u64Cmd, PRTSTREAM pStrm)
"\n");
}
- if (u64Cmd & USAGE_CONTROLVM)
+ if (fCategory & USAGE_CONTROLVM)
{
RTStrmPrintf(pStrm,
"%s controlvm %s <uuid|vmname>\n"
@@ -486,17 +486,17 @@ void printUsage(USAGECATEGORY u64Cmd, PRTSTREAM pStrm)
"\n", SEP);
}
- if (u64Cmd & USAGE_DISCARDSTATE)
+ if (fCategory & USAGE_DISCARDSTATE)
RTStrmPrintf(pStrm,
"%s discardstate %s <uuid|vmname>\n"
"\n", SEP);
- if (u64Cmd & USAGE_ADOPTSTATE)
+ if (fCategory & USAGE_ADOPTSTATE)
RTStrmPrintf(pStrm,
"%s adoptstate %s <uuid|vmname> <state_file>\n"
"\n", SEP);
- if (u64Cmd & USAGE_SNAPSHOT)
+ if (fCategory & USAGE_SNAPSHOT)
RTStrmPrintf(pStrm,
"%s snapshot %s <uuid|vmname>\n"
" take <name> [--description <desc>] [--live] |\n"
@@ -510,13 +510,13 @@ void printUsage(USAGECATEGORY u64Cmd, PRTSTREAM pStrm)
" showvminfo <uuid|snapname>\n"
"\n", SEP);
- if (u64Cmd & USAGE_CLOSEMEDIUM)
+ if (fCategory & USAGE_CLOSEMEDIUM)
RTStrmPrintf(pStrm,
"%s closemedium %s disk|dvd|floppy <uuid|filename>\n"
" [--delete]\n"
"\n", SEP);
- if (u64Cmd & USAGE_STORAGEATTACH)
+ if (fCategory & USAGE_STORAGEATTACH)
RTStrmPrintf(pStrm,
"%s storageattach %s <uuid|vmname>\n"
" --storagectl <name>\n"
@@ -547,7 +547,7 @@ void printUsage(USAGECATEGORY u64Cmd, PRTSTREAM pStrm)
" [--intnet]\n"
"\n", SEP);
- if (u64Cmd & USAGE_STORAGECONTROLLER)
+ if (fCategory & USAGE_STORAGECONTROLLER)
RTStrmPrintf(pStrm,
"%s storagectl %s <uuid|vmname>\n"
" --name <name>\n"
@@ -560,7 +560,7 @@ void printUsage(USAGECATEGORY u64Cmd, PRTSTREAM pStrm)
" [--remove]\n"
"\n", SEP);
- if (u64Cmd & USAGE_BANDWIDTHCONTROL)
+ if (fCategory & USAGE_BANDWIDTHCONTROL)
RTStrmPrintf(pStrm,
"%s bandwidthctl %s <uuid|vmname>\n"
" add <name> --type disk|network\n"
@@ -573,12 +573,12 @@ void printUsage(USAGECATEGORY u64Cmd, PRTSTREAM pStrm)
" K=kilobyte, M=megabyte, G=gigabyte)\n"
"\n", SEP);
- if (u64Cmd & USAGE_SHOWHDINFO)
+ if (fCategory & USAGE_SHOWHDINFO)
RTStrmPrintf(pStrm,
"%s showhdinfo %s <uuid|filename>\n"
"\n", SEP);
- if (u64Cmd & USAGE_CREATEHD)
+ if (fCategory & USAGE_CREATEHD)
RTStrmPrintf(pStrm,
"%s createhd %s --filename <filename>\n"
" [--size <megabytes>|--sizebyte <bytes>]\n"
@@ -587,7 +587,7 @@ void printUsage(USAGECATEGORY u64Cmd, PRTSTREAM pStrm)
" [--variant Standard,Fixed,Split2G,Stream,ESX]\n"
"\n", SEP);
- if (u64Cmd & USAGE_MODIFYHD)
+ if (fCategory & USAGE_MODIFYHD)
RTStrmPrintf(pStrm,
"%s modifyhd %s <uuid|filename>\n"
" [--type normal|writethrough|immutable|shareable|\n"
@@ -598,7 +598,7 @@ void printUsage(USAGECATEGORY u64Cmd, PRTSTREAM pStrm)
" [--resize <megabytes>|--resizebyte <bytes>]\n"
"\n", SEP);
- if (u64Cmd & USAGE_CLONEHD)
+ if (fCategory & USAGE_CLONEHD)
RTStrmPrintf(pStrm,
"%s clonehd %s <uuid|inputfile> <uuid|outputfile>\n"
" [--format VDI|VMDK|VHD|RAW|<other>]\n"
@@ -606,7 +606,7 @@ void printUsage(USAGECATEGORY u64Cmd, PRTSTREAM pStrm)
" [--existing]\n"
"\n", SEP);
- if (u64Cmd & USAGE_CONVERTFROMRAW)
+ if (fCategory & USAGE_CONVERTFROMRAW)
RTStrmPrintf(pStrm,
"%s convertfromraw %s <filename> <outputfile>\n"
" [--format VDI|VMDK|VHD]\n"
@@ -618,20 +618,20 @@ void printUsage(USAGECATEGORY u64Cmd, PRTSTREAM pStrm)
" [--uuid <uuid>]\n"
"\n", SEP, SEP);
- if (u64Cmd & USAGE_GETEXTRADATA)
+ if (fCategory & USAGE_GETEXTRADATA)
RTStrmPrintf(pStrm,
"%s getextradata %s global|<uuid|vmname>\n"
" <key>|enumerate\n"
"\n", SEP);
- if (u64Cmd & USAGE_SETEXTRADATA)
+ if (fCategory & USAGE_SETEXTRADATA)
RTStrmPrintf(pStrm,
"%s setextradata %s global|<uuid|vmname>\n"
" <key>\n"
" [<value>] (no value deletes key)\n"
"\n", SEP);
- if (u64Cmd & USAGE_SETPROPERTY)
+ if (fCategory & USAGE_SETPROPERTY)
RTStrmPrintf(pStrm,
"%s setproperty %s machinefolder default|<folder> |\n"
" hwvirtexclusive on|off |\n"
@@ -643,7 +643,7 @@ void printUsage(USAGECATEGORY u64Cmd, PRTSTREAM pStrm)
" defaultfrontend default|<name>\n"
"\n", SEP);
- if (u64Cmd & USAGE_USBFILTER_ADD)
+ if (fCategory & USAGE_USBFILTER_ADD)
RTStrmPrintf(pStrm,
"%s usbfilter %s add <index,0-N>\n"
" --target <uuid|vmname>|global\n"
@@ -660,7 +660,7 @@ void printUsage(USAGECATEGORY u64Cmd, PRTSTREAM pStrm)
" [--maskedinterfaces <XXXXXXXX>]\n"
"\n", SEP);
- if (u64Cmd & USAGE_USBFILTER_MODIFY)
+ if (fCategory & USAGE_USBFILTER_MODIFY)
RTStrmPrintf(pStrm,
"%s usbfilter %s modify <index,0-N>\n"
" --target <uuid|vmname>|global\n"
@@ -677,36 +677,36 @@ void printUsage(USAGECATEGORY u64Cmd, PRTSTREAM pStrm)
" [--maskedinterfaces <XXXXXXXX>]\n"
"\n", SEP);
- if (u64Cmd & USAGE_USBFILTER_REMOVE)
+ if (fCategory & USAGE_USBFILTER_REMOVE)
RTStrmPrintf(pStrm,
"%s usbfilter %s remove <index,0-N>\n"
" --target <uuid|vmname>|global\n"
"\n", SEP);
- if (u64Cmd & USAGE_SHAREDFOLDER_ADD)
+ if (fCategory & USAGE_SHAREDFOLDER_ADD)
RTStrmPrintf(pStrm,
"%s sharedfolder %s add <uuid|vmname>\n"
" --name <name> --hostpath <hostpath>\n"
" [--transient] [--readonly] [--automount]\n"
"\n", SEP);
- if (u64Cmd & USAGE_SHAREDFOLDER_REMOVE)
+ if (fCategory & USAGE_SHAREDFOLDER_REMOVE)
RTStrmPrintf(pStrm,
"%s sharedfolder %s remove <uuid|vmname>\n"
" --name <name> [--transient]\n"
"\n", SEP);
#ifdef VBOX_WITH_GUEST_PROPS
- if (u64Cmd & USAGE_GUESTPROPERTY)
+ if (fCategory & USAGE_GUESTPROPERTY)
usageGuestProperty(pStrm, SEP);
#endif /* VBOX_WITH_GUEST_PROPS defined */
#ifdef VBOX_WITH_GUEST_CONTROL
- if (u64Cmd & USAGE_GUESTCONTROL)
- usageGuestControl(pStrm, SEP);
+ if (fCategory & USAGE_GUESTCONTROL)
+ usageGuestControl(pStrm, SEP, fSubCategory);
#endif /* VBOX_WITH_GUEST_CONTROL defined */
- if (u64Cmd & USAGE_DEBUGVM)
+ if (fCategory & USAGE_DEBUGVM)
{
RTStrmPrintf(pStrm,
"%s debugvm %s <uuid|vmname>\n"
@@ -728,7 +728,7 @@ void printUsage(USAGECATEGORY u64Cmd, PRTSTREAM pStrm)
" [--descriptions]\n"
"\n", SEP);
}
- if (u64Cmd & USAGE_METRICS)
+ if (fCategory & USAGE_METRICS)
RTStrmPrintf(pStrm,
"%s metrics %s list [*|host|<vmname> [<metric_list>]]\n"
" (comma-separated)\n\n"
@@ -753,7 +753,7 @@ void printUsage(USAGECATEGORY u64Cmd, PRTSTREAM pStrm)
"\n", SEP, SEP, SEP, SEP, SEP, SEP);
#if defined(VBOX_WITH_NAT_SERVICE)
- if (u64Cmd & USAGE_NATNETWORK)
+ if (fCategory & USAGE_NATNETWORK)
{
RTStrmPrintf(pStrm,
"%s natnetwork %s add --netname <name>\n"
@@ -784,7 +784,7 @@ void printUsage(USAGECATEGORY u64Cmd, PRTSTREAM pStrm)
#endif
#if defined(VBOX_WITH_NETFLT)
- if (u64Cmd & USAGE_HOSTONLYIFS)
+ if (fCategory & USAGE_HOSTONLYIFS)
{
RTStrmPrintf(pStrm,
"%s hostonlyif %s ipconfig <name>\n"
@@ -799,7 +799,7 @@ void printUsage(USAGECATEGORY u64Cmd, PRTSTREAM pStrm)
}
#endif
- if (u64Cmd & USAGE_DHCPSERVER)
+ if (fCategory & USAGE_DHCPSERVER)
{
RTStrmPrintf(pStrm,
"%s dhcpserver %s add|modify --netname <network_name> |\n"
@@ -817,7 +817,7 @@ void printUsage(USAGECATEGORY u64Cmd, PRTSTREAM pStrm)
#endif
"\n", SEP, SEP);
}
- if (u64Cmd & USAGE_EXTPACK)
+ if (fCategory & USAGE_EXTPACK)
{
RTStrmPrintf(pStrm,
"%s extpack %s install [--replace] <tarball> |\n"
@@ -831,15 +831,35 @@ void printUsage(USAGECATEGORY u64Cmd, PRTSTREAM pStrm)
* Print a usage synopsis and the syntax error message.
* @returns RTEXITCODE_SYNTAX.
*/
-RTEXITCODE errorSyntax(USAGECATEGORY u64Cmd, const char *pszFormat, ...)
+RTEXITCODE errorSyntax(USAGECATEGORY fCategory, const char *pszFormat, ...)
{
va_list args;
showLogo(g_pStdErr); // show logo even if suppressed
#ifndef VBOX_ONLY_DOCS
if (g_fInternalMode)
- printUsageInternal(u64Cmd, g_pStdErr);
+ printUsageInternal(fCategory, g_pStdErr);
else
- printUsage(u64Cmd, g_pStdErr);
+ printUsage(fCategory, ~0U, g_pStdErr);
+#endif /* !VBOX_ONLY_DOCS */
+ va_start(args, pszFormat);
+ RTStrmPrintf(g_pStdErr, "\nSyntax error: %N\n", pszFormat, &args);
+ va_end(args);
+ return RTEXITCODE_SYNTAX;
+}
+
+/**
+ * Print a usage synopsis and the syntax error message.
+ * @returns RTEXITCODE_SYNTAX.
+ */
+RTEXITCODE errorSyntaxEx(USAGECATEGORY fCategory, uint32_t fSubCategory, const char *pszFormat, ...)
+{
+ va_list args;
+ showLogo(g_pStdErr); // show logo even if suppressed
+#ifndef VBOX_ONLY_DOCS
+ if (g_fInternalMode)
+ printUsageInternal(fCategory, g_pStdErr);
+ else
+ printUsage(fCategory, fSubCategory, g_pStdErr);
#endif /* !VBOX_ONLY_DOCS */
va_start(args, pszFormat);
RTStrmPrintf(g_pStdErr, "\nSyntax error: %N\n", pszFormat, &args);
@@ -852,11 +872,12 @@ RTEXITCODE errorSyntax(USAGECATEGORY u64Cmd, const char *pszFormat, ...)
*
* @returns RTEXITCODE_SYNTAX.
*
- * @param fUsageCategory The usage category of the command.
+ * @param fCategory The usage category of the command.
+ * @param fSubCategory The usage sub-category of the command.
* @param rc The RTGetOpt return code.
* @param pValueUnion The value union.
*/
-RTEXITCODE errorGetOpt(USAGECATEGORY fUsageCategory, int rc, union RTGETOPTUNION const *pValueUnion)
+RTEXITCODE errorGetOptEx(USAGECATEGORY fCategory, uint32_t fSubCategory, int rc, union RTGETOPTUNION const *pValueUnion)
{
/*
* Check if it is an unhandled standard option.
@@ -872,9 +893,9 @@ RTEXITCODE errorGetOpt(USAGECATEGORY fUsageCategory, int rc, union RTGETOPTUNION
showLogo(g_pStdErr);
#ifndef VBOX_ONLY_DOCS
if (g_fInternalMode)
- printUsageInternal(fUsageCategory, g_pStdOut);
+ printUsageInternal(fCategory, g_pStdOut);
else
- printUsage(fUsageCategory, g_pStdOut);
+ printUsage(fCategory, fSubCategory, g_pStdOut);
#endif
return RTEXITCODE_SUCCESS;
}
@@ -885,9 +906,9 @@ RTEXITCODE errorGetOpt(USAGECATEGORY fUsageCategory, int rc, union RTGETOPTUNION
showLogo(g_pStdErr); // show logo even if suppressed
#ifndef VBOX_ONLY_DOCS
if (g_fInternalMode)
- printUsageInternal(fUsageCategory, g_pStdErr);
+ printUsageInternal(fCategory, g_pStdErr);
else
- printUsage(fUsageCategory, g_pStdErr);
+ printUsage(fCategory, fSubCategory, g_pStdErr);
#endif /* !VBOX_ONLY_DOCS */
if (rc == VINF_GETOPT_NOT_OPTION)
@@ -908,6 +929,20 @@ RTEXITCODE errorGetOpt(USAGECATEGORY fUsageCategory, int rc, union RTGETOPTUNION
}
/**
+ * errorSyntax for RTGetOpt users.
+ *
+ * @returns RTEXITCODE_SYNTAX.
+ *
+ * @param fUsageCategory The usage category of the command.
+ * @param rc The RTGetOpt return code.
+ * @param pValueUnion The value union.
+ */
+RTEXITCODE errorGetOpt(USAGECATEGORY fCategory, int rc, union RTGETOPTUNION const *pValueUnion)
+{
+ return errorGetOptEx(fCategory, ~0U, rc, pValueUnion);
+}
+
+/**
* Print an error message without the syntax stuff.
*
* @returns RTEXITCODE_SYNTAX.
diff --git a/src/VBox/Frontends/VBoxManage/VBoxManageInfo.cpp b/src/VBox/Frontends/VBoxManage/VBoxManageInfo.cpp
index 9b0f89a..789bc79 100644
--- a/src/VBox/Frontends/VBoxManage/VBoxManageInfo.cpp
+++ b/src/VBox/Frontends/VBoxManage/VBoxManageInfo.cpp
@@ -1020,13 +1020,13 @@ HRESULT showVMInfo(ComPtr<IVirtualBox> virtualBox,
RTPrintf("natnet%d=\"%ls\"\n", currentNIC + 1, strNetwork.length() ? strNetwork.raw(): Bstr("nat").raw());
strAttachment = "nat";
strNatSettings = Utf8StrFmt("mtu=\"%d\"\nsockSnd=\"%d\"\nsockRcv=\"%d\"\ntcpWndSnd=\"%d\"\ntcpWndRcv=\"%d\"\n",
- mtu, sockSnd ? sockSnd : 64, sockRcv ? sockRcv : 64 , tcpSnd ? tcpSnd : 64, tcpRcv ? tcpRcv : 64);
+ mtu, sockSnd ? sockSnd : 64, sockRcv ? sockRcv : 64, tcpSnd ? tcpSnd : 64, tcpRcv ? tcpRcv : 64);
}
else
{
strAttachment = "NAT";
strNatSettings = Utf8StrFmt("NIC %d Settings: MTU: %d, Socket (send: %d, receive: %d), TCP Window (send:%d, receive: %d)\n",
- currentNIC + 1, mtu, sockSnd ? sockSnd : 64, sockRcv ? sockRcv : 64 , tcpSnd ? tcpSnd : 64, tcpRcv ? tcpRcv : 64);
+ currentNIC + 1, mtu, sockSnd ? sockSnd : 64, sockRcv ? sockRcv : 64, tcpSnd ? tcpSnd : 64, tcpRcv ? tcpRcv : 64);
}
break;
}
diff --git a/src/VBox/Frontends/VBoxShell/vboxshell.py b/src/VBox/Frontends/VBoxShell/vboxshell.py
index bbb22e9..75ab887 100755
--- a/src/VBox/Frontends/VBoxShell/vboxshell.py
+++ b/src/VBox/Frontends/VBoxShell/vboxshell.py
@@ -30,7 +30,7 @@ Foundation, in version 2 as it comes in the "COPYING" file of the
VirtualBox OSE distribution. VirtualBox OSE is distributed in the
hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
"""
-__version__ = "$Revision: 88719 $"
+__version__ = "$Revision: 90995 $"
import os, sys
@@ -348,6 +348,10 @@ def monitorSource(ctx, eventSource, active, dur):
scev = ctx['global'].queryInterface(event, 'IMachineStateChangedEvent')
if scev:
print "machine state event: mach=%s state=%s" % (scev.machineId, scev.state)
+ elif evtype == ctx['global'].constants.VBoxEventType_OnSnapshotTaken:
+ stev = ctx['global'].queryInterface(event, 'ISnapshotTakenEvent')
+ if stev:
+ print "snapshot taken event: mach=%s snap=%s" % (stev.machineId, stev.snapshotId)
elif evtype == ctx['global'].constants.VBoxEventType_OnGuestPropertyChanged:
gpcev = ctx['global'].queryInterface(event, 'IGuestPropertyChangedEvent')
if gpcev:
diff --git a/src/VBox/Frontends/VirtualBox/Makefile.kmk b/src/VBox/Frontends/VirtualBox/Makefile.kmk
index 144cc01..fa7b872 100644
--- a/src/VBox/Frontends/VirtualBox/Makefile.kmk
+++ b/src/VBox/Frontends/VirtualBox/Makefile.kmk
@@ -122,6 +122,10 @@ ifdef VBOX_WITH_VIDEOHWACCEL
else ifdef VBOX_GUI_USE_QGL
VirtualBox_DEFS += VBOX_GUI_USE_QGL
endif
+ifdef VBOX_WITH_LIBCURL
+ VirtualBox_DEFS += VBOX_GUI_WITH_NETWORK_MANAGER
+ VBOX_GUI_WITH_NETWORK_MANAGER := 1
+endif
ifdef VBOX_BLEEDING_EDGE
VirtualBox_src/selector/UISelectorWindow.cpp_DEFS += \
VBOX_BLEEDING_EDGE=\"$(VBOX_BLEEDING_EDGE)\"
@@ -140,7 +144,6 @@ VBOX_GUI_INC_DIRS = \
./src/extensions \
./src/extensions/graphics \
./src/globals \
- ./src/net \
./src/medium \
./src/platform \
./src/platform/darwin \
@@ -168,6 +171,11 @@ VBOX_GUI_INC_DIRS = \
./src/wizards/importappliance \
./src/wizards/firstrun
+ifdef VBOX_GUI_WITH_NETWORK_MANAGER
+VBOX_GUI_INC_DIRS += \
+ ./src/net
+endif
+
VirtualBox_INCS = \
$(VBOX_GUI_INC_DIRS) \
$(VirtualBox_0_OUTDIR)/include
@@ -278,18 +286,6 @@ VirtualBox_QT_MOCHDRS = \
src/globals/UIThreadPool.h \
src/globals/VBoxGlobal.h \
src/globals/VBoxUtils.h \
- src/net/UINetworkManager.h \
- src/net/UINetworkManagerDialog.h \
- src/net/UINetworkManagerIndicator.h \
- src/net/UINetworkRequest.h \
- src/net/UINetworkRequestWidget.h \
- src/net/UINetworkReply.h \
- src/net/UINetworkCustomer.h \
- src/net/UIUpdateManager.h \
- src/net/UIDownloader.h \
- src/net/UIDownloaderAdditions.h \
- src/net/UIDownloaderExtensionPack.h \
- src/net/UIDownloaderUserManual.h \
src/medium/UIMediumEnumerator.h \
src/medium/UIMediumManager.h \
src/runtime/UIActionPoolRuntime.h \
@@ -357,8 +353,6 @@ VirtualBox_QT_MOCHDRS = \
src/settings/global/UIGlobalSettingsNetworkDetailsNAT.h \
src/settings/global/UIGlobalSettingsNetworkDetailsHost.h \
src/settings/global/UIGlobalSettingsPortForwardingDlg.h \
- src/settings/global/UIGlobalSettingsProxy.h \
- src/settings/global/UIGlobalSettingsUpdate.h \
src/settings/machine/UIMachineSettingsAudio.h \
src/settings/machine/UIMachineSettingsDisplay.h \
src/settings/machine/UIMachineSettingsGeneral.h \
@@ -437,6 +431,24 @@ VirtualBox_QT_MOCHDRS = \
src/wizards/firstrun/UIWizardFirstRun.h \
src/wizards/firstrun/UIWizardFirstRunPageBasic.h
+ifdef VBOX_GUI_WITH_NETWORK_MANAGER
+VirtualBox_QT_MOCHDRS += \
+ src/net/UINetworkManager.h \
+ src/net/UINetworkManagerDialog.h \
+ src/net/UINetworkManagerIndicator.h \
+ src/net/UINetworkRequest.h \
+ src/net/UINetworkRequestWidget.h \
+ src/net/UINetworkReply.h \
+ src/net/UINetworkCustomer.h \
+ src/net/UIUpdateManager.h \
+ src/net/UIDownloader.h \
+ src/net/UIDownloaderAdditions.h \
+ src/net/UIDownloaderExtensionPack.h \
+ src/net/UIDownloaderUserManual.h \
+ src/settings/global/UIGlobalSettingsProxy.h \
+ src/settings/global/UIGlobalSettingsUpdate.h
+endif
+
VirtualBox_QT_MOCHDRS.darwin += \
src/platform/darwin/UIWindowMenuManager.h
@@ -450,8 +462,6 @@ VirtualBox_QT_MOCSRCS = \
src/globals/UIThreadPool.cpp \
src/medium/UIMediumEnumerator.cpp \
src/medium/UIMediumManager.cpp \
- src/net/UINetworkReply.cpp \
- src/net/UIUpdateManager.cpp \
src/runtime/UIActionPoolRuntime.cpp \
src/runtime/UIIndicatorsPool.cpp \
src/runtime/UIMachine.cpp \
@@ -465,6 +475,12 @@ VirtualBox_QT_MOCSRCS = \
src/widgets/UIPortForwardingTable.cpp \
src/wizards/importappliance/UIWizardImportApp.cpp
+ifdef VBOX_GUI_WITH_NETWORK_MANAGER
+VirtualBox_QT_MOCSRCS += \
+ src/net/UINetworkReply.cpp \
+ src/net/UIUpdateManager.cpp
+endif
+
VirtualBox_QT_MOCSRCS.darwin += \
src/platform/darwin/UIWindowMenuManager.cpp
VirtualBox_QT_MOCSRCS.win += \
@@ -532,19 +548,6 @@ VirtualBox_SOURCES = \
src/medium/UIMedium.cpp \
src/medium/UIMediumEnumerator.cpp \
src/medium/UIMediumManager.cpp \
- src/net/UINetworkManager.cpp \
- src/net/UINetworkManagerDialog.cpp \
- src/net/UINetworkManagerIndicator.cpp \
- src/net/UINetworkRequest.cpp \
- src/net/UINetworkRequestWidget.cpp \
- src/net/UINetworkReply.cpp \
- src/net/UINetworkCustomer.cpp \
- src/net/UIDownloader.cpp \
- src/net/UIDownloaderAdditions.cpp \
- src/net/UIDownloaderExtensionPack.cpp \
- src/net/UIDownloaderUserManual.cpp \
- src/net/UIUpdateDefs.cpp \
- src/net/UIUpdateManager.cpp \
src/runtime/UIActionPoolRuntime.cpp \
src/runtime/UIConsoleEventHandler.cpp \
src/runtime/UIFrameBuffer.cpp \
@@ -613,8 +616,6 @@ VirtualBox_SOURCES = \
src/settings/global/UIGlobalSettingsNetworkDetailsNAT.cpp \
src/settings/global/UIGlobalSettingsNetworkDetailsHost.cpp \
src/settings/global/UIGlobalSettingsPortForwardingDlg.cpp \
- src/settings/global/UIGlobalSettingsProxy.cpp \
- src/settings/global/UIGlobalSettingsUpdate.cpp \
src/settings/machine/UIMachineSettingsAudio.cpp \
src/settings/machine/UIMachineSettingsDisplay.cpp \
src/settings/machine/UIMachineSettingsGeneral.cpp \
@@ -694,6 +695,25 @@ VirtualBox_SOURCES = \
src/wizards/firstrun/UIWizardFirstRun.cpp \
src/wizards/firstrun/UIWizardFirstRunPageBasic.cpp
+ifdef VBOX_GUI_WITH_NETWORK_MANAGER
+VirtualBox_SOURCES += \
+ src/net/UINetworkManager.cpp \
+ src/net/UINetworkManagerDialog.cpp \
+ src/net/UINetworkManagerIndicator.cpp \
+ src/net/UINetworkRequest.cpp \
+ src/net/UINetworkRequestWidget.cpp \
+ src/net/UINetworkReply.cpp \
+ src/net/UINetworkCustomer.cpp \
+ src/net/UIDownloader.cpp \
+ src/net/UIDownloaderAdditions.cpp \
+ src/net/UIDownloaderExtensionPack.cpp \
+ src/net/UIDownloaderUserManual.cpp \
+ src/net/UIUpdateDefs.cpp \
+ src/net/UIUpdateManager.cpp \
+ src/settings/global/UIGlobalSettingsProxy.cpp \
+ src/settings/global/UIGlobalSettingsUpdate.cpp
+endif
+
VirtualBox_SOURCES.darwin += \
src/platform/darwin/UIAbstractDockIconPreview.cpp \
src/platform/darwin/UICocoaDockIconPreview.mm \
diff --git a/src/VBox/Frontends/VirtualBox/images/os_linux26.png b/src/VBox/Frontends/VirtualBox/images/os_linux26.png
index 9c35df6..0b8d526 100644
Binary files a/src/VBox/Frontends/VirtualBox/images/os_linux26.png and b/src/VBox/Frontends/VirtualBox/images/os_linux26.png differ
diff --git a/src/VBox/Frontends/VirtualBox/nls/ApprovedLanguages.kmk b/src/VBox/Frontends/VirtualBox/nls/ApprovedLanguages.kmk
index ed15680..9c43eaf 100644
--- a/src/VBox/Frontends/VirtualBox/nls/ApprovedLanguages.kmk
+++ b/src/VBox/Frontends/VirtualBox/nls/ApprovedLanguages.kmk
@@ -28,6 +28,7 @@ VBOX_APPROVED_GUI_LANGUAGES := \
fa_IR \
fr \
hu \
+ id \
it \
ja \
ko \
diff --git a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_bg.ts b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_bg.ts
index b1258d8..e7a3477 100644
--- a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_bg.ts
+++ b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_bg.ts
@@ -948,6 +948,10 @@
<comment>new</comment>
<translation type="obsolete">Монтиране на инсталационното изображение Виртуални Добавки</translation>
</message>
+ <message>
+ <source>&Webcams</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIApplianceEditorWidget</name>
@@ -4495,6 +4499,14 @@ p, li { white-space: pre-wrap; }
<source>Select a filename for the screenshot ...</source>
<translation>Избор на име за файла със снимка ...</translation>
</message>
+ <message>
+ <source>No Webcams Connected</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>No supported webcams connected to the host PC</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIMachineSettingsAudio</name>
@@ -6865,7 +6877,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source><p>The virtual machine window is optimized to work in <b>%1 bit</b> color mode but the virtual display is currently set to <b>%2 bit</b>.</p><p>Please open the display properties dialog of the guest OS and select a <b>%3 bit</b> color mode, if it is available, for best possible performance of the virtual video subsystem.</p><p><b>Note</b>. Some operating systems, like [...]
- <translation><p>Прозорецът на виртуалната машина е оптимизиран за работа в цветови режим <b>%1 бита</b>, но качеството на цветовете за виртуалния екран е зададено на <b>%2 бита</b>.</p><p>Моля, отворете диалога за предпочитанията за екрана във виртуалната ОС и изберете цветови режим <b>%3 бита</b>, ако е достъпен, за възможно най-добра производителност на виртуалната видео подсистема.</p><p& [...]
+ <translation type="obsolete"><p>Прозорецът на виртуалната машина е оптимизиран за работа в цветови режим <b>%1 бита</b>, но качеството на цветовете за виртуалния екран е зададено на <b>%2 бита</b>.</p><p>Моля, отворете диалога за предпочитанията за екрана във виртуалната ОС и изберете цветови режим <b>%3 бита</b>, ако е достъпен, за възможно най-добра производителност на виртуалната видео подсистема. [...]
</message>
<message>
<source><p>You didn'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 window or the First Run Wizard.</p><p>Do you wish to continue?</p></source>
@@ -8218,6 +8230,18 @@ p, li { white-space: pre-wrap; }
<comment>additions-new</comment>
<translation type="obsolete">Монтиране</translation>
</message>
+ <message>
+ <source>Failed to attach the webcam <b>%1</b> to the virtual machine <b>%2</b>.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to detach the webcam <b>%1</b> from the virtual machine <b>%2</b>.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p>The virtual screen is currently set to a <b>%1 bit</b> color mode. For better performance please change this to <b>%2 bit</b>. This can usually be done from the <b>Display</b> section of the guest operating system's Control Panel or System Settings.</p></source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIMiniProcessWidgetAdditions</name>
diff --git a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_ca.ts b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_ca.ts
index 15cb7a1..d661829 100644
--- a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_ca.ts
+++ b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_ca.ts
@@ -1004,6 +1004,10 @@
<comment>new</comment>
<translation type="obsolete">Munta la imatge d'instal·lació de les Guest Additions</translation>
</message>
+ <message>
+ <source>&Webcams</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIApplianceEditorWidget</name>
@@ -4568,6 +4572,14 @@ p, li { white-space: pre-wrap; }
<source>Select a filename for the screenshot ...</source>
<translation>Seleccioneu un nom de fitxer per a la captura...</translation>
</message>
+ <message>
+ <source>No Webcams Connected</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>No supported webcams connected to the host PC</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIMachineSettingsAudio</name>
@@ -7209,7 +7221,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source><p>The virtual machine window is optimized to work in <b>%1 bit</b> color mode but the virtual display is currently set to <b>%2 bit</b>.</p><p>Please open the display properties dialog of the guest OS and select a <b>%3 bit</b> color mode, if it is available, for best possible performance of the virtual video subsystem.</p><p><b>Note</b>. Some operating systems, like [...]
- <translation><p>La finestra de la màquina virtual està optimitzada per treballar en el mode de color <b>%1 bit</b> però la qualitat del color que es mostra actualment està establerta a <b>%2 bit</b>.</p><p>. Obriu el diàleg de propietats de la pantalla del sistema client i seleccioneu el mode de color <b>%3 bit</b>, si és disponible, per obtenir el millor funcionament possible del subsistema de vídeo [...]
+ <translation type="obsolete"><p>La finestra de la màquina virtual està optimitzada per treballar en el mode de color <b>%1 bit</b> però la qualitat del color que es mostra actualment està establerta a <b>%2 bit</b>.</p><p>. Obriu el diàleg de propietats de la pantalla del sistema client i seleccioneu el mode de color <b>%3 bit</b>, si és disponible, per obtenir el millor funcionament possible del sub [...]
</message>
<message>
<source><p>The virtual machine window will be now switched to <b>fullscreen</b> mode. You can go back to windowed mode at any time by pressing <b>%1</b>. Note that the <i>Host</i> key is currently defined as <b>%1</b>.</p><p>Note that the main menu bar is hidden in fullscreen mode. You can access it by pressing <b>Host+Home</b>.</p></source>
@@ -8662,6 +8674,18 @@ p, li { white-space: pre-wrap; }
<comment>additions-new</comment>
<translation type="obsolete">Munta</translation>
</message>
+ <message>
+ <source>Failed to attach the webcam <b>%1</b> to the virtual machine <b>%2</b>.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to detach the webcam <b>%1</b> from the virtual machine <b>%2</b>.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p>The virtual screen is currently set to a <b>%1 bit</b> color mode. For better performance please change this to <b>%2 bit</b>. This can usually be done from the <b>Display</b> section of the guest operating system's Control Panel or System Settings.</p></source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIMiniProcessWidgetAdditions</name>
diff --git a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_ca_VA.ts b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_ca_VA.ts
index 3854bb7..297a8e1 100644
--- a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_ca_VA.ts
+++ b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_ca_VA.ts
@@ -1004,6 +1004,10 @@
<comment>new</comment>
<translation type="obsolete">Munta la imatge d'instal·lació de les Guest Additions</translation>
</message>
+ <message>
+ <source>&Webcams</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIApplianceEditorWidget</name>
@@ -4568,6 +4572,14 @@ p, li { white-space: pre-wrap; }
<source>Select a filename for the screenshot ...</source>
<translation>Seleccioneu un nom de fitxer per a la captura...</translation>
</message>
+ <message>
+ <source>No Webcams Connected</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>No supported webcams connected to the host PC</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIMachineSettingsAudio</name>
@@ -7209,7 +7221,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source><p>The virtual machine window is optimized to work in <b>%1 bit</b> color mode but the virtual display is currently set to <b>%2 bit</b>.</p><p>Please open the display properties dialog of the guest OS and select a <b>%3 bit</b> color mode, if it is available, for best possible performance of the virtual video subsystem.</p><p><b>Note</b>. Some operating systems, like [...]
- <translation><p>La finestra de la màquina virtual està optimitzada per treballar en el mode de color <b>%1 bit</b> però la qualitat del color que es mostra actualment està establerta a <b>%2 bit</b>.</p><p>. Obriu el diàleg de propietats de la pantalla del sistema client i seleccioneu el mode de color <b>%3 bit</b>, si és disponible, per obtindre el millor funcionament possible del subsistema de víde [...]
+ <translation type="obsolete"><p>La finestra de la màquina virtual està optimitzada per treballar en el mode de color <b>%1 bit</b> però la qualitat del color que es mostra actualment està establerta a <b>%2 bit</b>.</p><p>. Obriu el diàleg de propietats de la pantalla del sistema client i seleccioneu el mode de color <b>%3 bit</b>, si és disponible, per obtindre el millor funcionament possible del su [...]
</message>
<message>
<source><p>The virtual machine window will be now switched to <b>fullscreen</b> mode. You can go back to windowed mode at any time by pressing <b>%1</b>. Note that the <i>Host</i> key is currently defined as <b>%1</b>.</p><p>Note that the main menu bar is hidden in fullscreen mode. You can access it by pressing <b>Host+Home</b>.</p></source>
@@ -8662,6 +8674,18 @@ p, li { white-space: pre-wrap; }
<comment>additions-new</comment>
<translation type="obsolete">Munta</translation>
</message>
+ <message>
+ <source>Failed to attach the webcam <b>%1</b> to the virtual machine <b>%2</b>.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to detach the webcam <b>%1</b> from the virtual machine <b>%2</b>.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p>The virtual screen is currently set to a <b>%1 bit</b> color mode. For better performance please change this to <b>%2 bit</b>. This can usually be done from the <b>Display</b> section of the guest operating system's Control Panel or System Settings.</p></source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIMiniProcessWidgetAdditions</name>
diff --git a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_cs.ts b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_cs.ts
index 8d6591d..4bcf154 100644
--- a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_cs.ts
+++ b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_cs.ts
@@ -1011,6 +1011,10 @@
<comment>new</comment>
<translation type="obsolete">Připojí obraz s instalací Přídavků pro hosta</translation>
</message>
+ <message>
+ <source>&Webcams</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIActonPool</name>
@@ -4525,6 +4529,14 @@ p, li { white-space: pre-wrap; }
<source>Select a filename for the screenshot ...</source>
<translation>Vyberte soubor pro uložení snímku obrazovky...</translation>
</message>
+ <message>
+ <source>No Webcams Connected</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>No supported webcams connected to the host PC</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIMachineSettingsAudio</name>
@@ -7229,7 +7241,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source><p>The virtual machine window is optimized to work in <b>%1 bit</b> color mode but the virtual display is currently set to <b>%2 bit</b>.</p><p>Please open the display properties dialog of the guest OS and select a <b>%3 bit</b> color mode, if it is available, for best possible performance of the virtual video subsystem.</p><p><b>Note</b>. Some operating systems, like [...]
- <translation><p>Okno virtuálního počítače je optimalizováno pro použití v <b>%1 bitové</b> barevné hloubce, ale barevná kvalita virtuální obrazovky je právě nastavena na <b>%2 bitů</b>.</p><p>Prosím otevřete dialog vlastností obrazovky hostovaného OS a vyberte <b>%3 bitový</b> barevný režim, pokud je dostupný, pro nejlepší možný výkon virtuálního video subsytému.</p><p><b>Poznámka&l [...]
+ <translation type="obsolete"><p>Okno virtuálního počítače je optimalizováno pro použití v <b>%1 bitové</b> barevné hloubce, ale barevná kvalita virtuální obrazovky je právě nastavena na <b>%2 bitů</b>.</p><p>Prosím otevřete dialog vlastností obrazovky hostovaného OS a vyberte <b>%3 bitový</b> barevný režim, pokud je dostupný, pro nejlepší možný výkon virtuálního video subsytému.</p><p>< [...]
</message>
<message>
<source><p>A critical error has occurred while running the virtual machine and the machine execution has been stopped.</p><p>For help, please see the Community section on <a href=http://www.virtualbox.org>http://www.virtualbox.org</a> or your support contract. Please provide the contents of the log file <tt>VBox.log</tt> and the image file <tt>VBox.png</tt>, which you can find in the <nobr><b>%1</b></nobr& [...]
@@ -8633,6 +8645,18 @@ p, li { white-space: pre-wrap; }
<comment>additions-new</comment>
<translation type="obsolete">Připojit</translation>
</message>
+ <message>
+ <source>Failed to attach the webcam <b>%1</b> to the virtual machine <b>%2</b>.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to detach the webcam <b>%1</b> from the virtual machine <b>%2</b>.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p>The virtual screen is currently set to a <b>%1 bit</b> color mode. For better performance please change this to <b>%2 bit</b>. This can usually be done from the <b>Display</b> section of the guest operating system's Control Panel or System Settings.</p></source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIMiniProcessWidgetAdditions</name>
diff --git a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_da.ts b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_da.ts
index a99ea4a..5bf0c24 100644
--- a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_da.ts
+++ b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_da.ts
@@ -959,6 +959,10 @@
<comment>new</comment>
<translation type="obsolete">Monterer CD'en med Gæstetilføjelser</translation>
</message>
+ <message>
+ <source>&Webcams</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIApplianceEditorWidget</name>
@@ -4506,6 +4510,14 @@ p, li { white-space: pre-wrap; }
<source>Select a filename for the screenshot ...</source>
<translation>Vælg et filnavn til skærmbilledet ...</translation>
</message>
+ <message>
+ <source>No Webcams Connected</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>No supported webcams connected to the host PC</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIMachineSettingsAudio</name>
@@ -6721,7 +6733,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source><p>The virtual machine window is optimized to work in <b>%1 bit</b> color mode but the virtual display is currently set to <b>%2 bit</b>.</p><p>Please open the display properties dialog of the guest OS and select a <b>%3 bit</b> color mode, if it is available, for best possible performance of the virtual video subsystem.</p><p><b>Note</b>. Some operating systems, like [...]
- <translation><p>Visning af virtuelle maskiner fungerer bedst ved <b>%1 bit</b> farver men den virtuelle maskines skærm er sat til <b>%2 bit</b>.</p><p>Åbn egenskaber for skærm i gæsteoperativsystemet og vælg <b>%3 bit</b> farver (hvis tilgængelig) for at opnå bedst mulig grafikydelse.</p><p><b>Bemærk</b>. Nogle operativsystemer, såsom OS/2, arbejder muligvis med 32 bi [...]
+ <translation type="obsolete"><p>Visning af virtuelle maskiner fungerer bedst ved <b>%1 bit</b> farver men den virtuelle maskines skærm er sat til <b>%2 bit</b>.</p><p>Åbn egenskaber for skærm i gæsteoperativsystemet og vælg <b>%3 bit</b> farver (hvis tilgængelig) for at opnå bedst mulig grafikydelse.</p><p><b>Bemærk</b>. Nogle operativsystemer, såsom OS/2, arbejder muligvis me [...]
</message>
<message>
<source><p>You didn'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 window or the First Run Wizard.</p><p>Do you wish to continue?</p></source>
@@ -8068,6 +8080,18 @@ p, li { white-space: pre-wrap; }
<comment>additions-new</comment>
<translation type="obsolete">Montér</translation>
</message>
+ <message>
+ <source>Failed to attach the webcam <b>%1</b> to the virtual machine <b>%2</b>.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to detach the webcam <b>%1</b> from the virtual machine <b>%2</b>.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p>The virtual screen is currently set to a <b>%1 bit</b> color mode. For better performance please change this to <b>%2 bit</b>. This can usually be done from the <b>Display</b> section of the guest operating system's Control Panel or System Settings.</p></source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIMiniProcessWidgetAdditions</name>
diff --git a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_de.ts b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_de.ts
index b7624ad..a2f1d6a 100644
--- a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_de.ts
+++ b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_de.ts
@@ -1632,7 +1632,7 @@
</message>
<message>
<source>%1 (renamed from %2)</source>
- <translation>%1 (umbenannt zu %2)</translation>
+ <translation>%1 (umbenannt von %2)</translation>
</message>
<message>
<source>Old Network Name</source>
@@ -4002,10 +4002,6 @@
<translation>Callee RC:</translation>
</message>
<message>
- <source><p>The virtual machine window is optimized to work in <b>%1 bit</b> color mode but the virtual display is currently set to <b>%2 bit</b>.</p><p>Please open the display properties dialog of the guest OS and select a <b>%3 bit</b> color mode, if it is available, for best possible performance of the virtual video subsystem.</p><p><b>Note</b>. Some operating systems, like [...]
- <translation><p>Das Fenster der virtuellen Maschine ist optimiert für eine Anzeige im <b>%1-Bit</b>-Farbmodus, der aktuelle Modus des virtuellen Bildschirms ist aber auf <b>%2- Bit</b> gesetzt.</p><p>Bitte öffnen Sie die Einstellungen für die Anzeige im Gast und wählen Sie den <b>%3-Bit</b>-Farbmodus, falls verfügbar, um die beste Performance der Anzeige zu erreichen.</p><p><b>Beachten Sie</b>: [...]
- </message>
- <message>
<source>Failed to open the license file <nobr><b>%1</b></nobr>. Check file permissions.</source>
<translation>Die Lizenzdatei <nobr><b>%1</b></nobr> konnte nicht geöffnet werden. Bitte überprüfen Sie die Zugriffsrechte.</translation>
</message>
@@ -4805,6 +4801,10 @@
<source>Failed to detach the webcam <b>%1</b> from the virtual machine <b>%2</b>.</source>
<translation>Die Zuordnung der Webcam <b>%1</b> an die virtuelle Maschine <b>%2</b> konnte nicht aufgehoben werden.</translation>
</message>
+ <message>
+ <source><p>The virtual screen is currently set to a <b>%1 bit</b> color mode. For better performance please change this to <b>%2 bit</b>. This can usually be done from the <b>Display</b> section of the guest operating system's Control Panel or System Settings.</p></source>
+ <translation><p>Der virtuelle Bildschirm ist momentan auf eine Farbtiefe von <b>%1 Bit</b> eingestellt. Für eine bestmögliche Performance sollten Sie die Farbtiefe auf <b>%2 Bit</b> ändern. Benutzen Sie dafür die Anzeigeeinstellungen des Gast-Betriebssystems.</p></translation>
+ </message>
</context>
<context>
<name>UIMiniToolBar</name>
diff --git a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_es.ts b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_es.ts
index bf75263..18c98b0 100644
--- a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_es.ts
+++ b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_es.ts
@@ -382,8 +382,8 @@
<translation type="obsolete">Diálogo i&nformación de sesión</translation>
</message>
<message>
- <source>Show Session Information Window</source>
- <translation type="unfinished">Mostrar el diálogo de información de sesión</translation>
+ <source>Show Session Information Dialog</source>
+ <translation type="obsolete">Mostrar el diálogo de información de sesión</translation>
</message>
<message>
<source>&Pause</source>
@@ -471,11 +471,11 @@
</message>
<message>
<source>&Insert Guest Additions CD image...</source>
- <translation type="unfinished">&Instalar «Guest Additions»...</translation>
+ <translation>&Insertar imagen de CD de las«Guest Additions»...</translation>
</message>
<message>
<source>Insert the Guest Additions disk file into the virtual drive</source>
- <translation type="unfinished">Montar la imagen de las «Guest Additions»</translation>
+ <translation>Insertar el archivo de disco de las «Guest Additions» en la unidad virtual</translation>
</message>
<message>
<source>De&bug</source>
@@ -1047,6 +1047,14 @@
<comment>new</comment>
<translation type="obsolete">Montar la imagen de las «Guest Additions»</translation>
</message>
+ <message>
+ <source>Show Session Information Window</source>
+ <translation>Mostrar la ventana de información de sesión</translation>
+ </message>
+ <message>
+ <source>&Webcams</source>
+ <translation>&Cámaras web</translation>
+ </message>
</context>
<context>
<name>UIActonPool</name>
@@ -4686,6 +4694,14 @@ p, li { white-space: pre-wrap; }
<source>Select a filename for the screenshot ...</source>
<translation>Seleccionar un nombre de archivo para la captura de pantalla...</translation>
</message>
+ <message>
+ <source>No Webcams Connected</source>
+ <translation>No hay cámaras web conectadas</translation>
+ </message>
+ <message>
+ <source>No supported webcams connected to the host PC</source>
+ <translation>No hay cámaras web soportadas conectadas al PC anfitrión</translation>
+ </message>
</context>
<context>
<name>UIMachineSettingsAudio</name>
@@ -5720,7 +5736,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>Window</source>
- <translation type="unfinished"></translation>
+ <translation>Ventana</translation>
</message>
</context>
<context>
@@ -7371,7 +7387,7 @@ p, li { white-space: pre-wrap; }
<message>
<source>Insert</source>
<comment>additions</comment>
- <translation type="unfinished">Montar</translation>
+ <translation>Insertar</translation>
</message>
<message>
<source><p>Host key is currently defined as <b>%1</b>.</p></source>
@@ -8102,7 +8118,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source><p>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 <b>Insert Guest Additions CD image</b> from the <b>Devices</b> menu. If they are installed but the machine is not yet fully starte [...]
- <translation type="unfinished"><p>Las «Guest Additions» de VirtualBox no parecen estar disponibles en esta máquina virtual y las carpetas compartidas no pueden ser usadas sin ellas. Para usar las carpetas compartidas dentro de la máquina virtual instale las «Guest Additions» si no están instaladas o reinstalelas si no están funcionando correctamente seleccionando <b>Instalar «Guest Additions»</b> del menú <b>Dispositivos</b>. Si están instaladas las [...]
+ <translation><p>Las «Guest Additions» de VirtualBox no parecen estar disponibles en esta máquina virtual y las carpetas compartidas no pueden ser usadas sin ellas. Para usar las carpetas compartidas dentro de la máquina virtual instale las «Guest Additions» si no están instaladas o reinstálelas si no están funcionando correctamente seleccionando <b>Insertar imagen de CD de las«Guest Additions»</b> del menú <b>Dispositivos</b>. Si están instaladas las [...]
</message>
<message>
<source><p>The virtual machine window will be now switched to <b>fullscreen</b> mode. You can go back to windowed mode at any time by pressing <b>%1</b>.</p><p>Note that the <i>Host</i> key is currently defined as <b>%2</b>.</p><p>Note that the main menu bar is hidden in fullscreen mode. You can access it by pressing <b>Host+Home</b>.</p></source>
@@ -8730,7 +8746,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source><p>The virtual machine window is optimized to work in <b>%1 bit</b> color mode but the virtual display is currently set to <b>%2 bit</b>.</p><p>Please open the display properties dialog of the guest OS and select a <b>%3 bit</b> color mode, if it is available, for best possible performance of the virtual video subsystem.</p><p><b>Note</b>. Some operating systems, like [...]
- <translation><p>La pantalla de la máquina virtual está optimizada para trabajar en modo de color <b>%1 bit</b>, sin embargo, el modo del pantalla de la máquina virtual está configurada como <b>%2 bit</b>.</p><p>Abra el diálogo de las propiedades de pantalla en el SO invitado y seleccione un modo de color de <b>%3 bit</b>, si está disponible, para obtener el mejor rendimiento posible en el subsistema [...]
+ <translation type="obsolete"><p>La pantalla de la máquina virtual está optimizada para trabajar en modo de color <b>%1 bit</b>, sin embargo, el modo del pantalla de la máquina virtual está configurada como <b>%2 bit</b>.</p><p>Abra el diálogo de las propiedades de pantalla en el SO invitado y seleccione un modo de color de <b>%3 bit</b>, si está disponible, para obtener el mejor rendimiento posible e [...]
</message>
<message>
<source><p>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 <b>Insert Guest Additions CD image</b> from the <b>Devices</b> menu. If they are installed but the machine is not yet fully starte [...]
@@ -8742,6 +8758,18 @@ p, li { white-space: pre-wrap; }
<comment>additions-new</comment>
<translation type="obsolete">Montar</translation>
</message>
+ <message>
+ <source>Failed to attach the webcam <b>%1</b> to the virtual machine <b>%2</b>.</source>
+ <translation>Fallo al conectar la cámara web <b>%1</b> a la máquina virtual <b>%2</b>.</translation>
+ </message>
+ <message>
+ <source>Failed to detach the webcam <b>%1</b> from the virtual machine <b>%2</b>.</source>
+ <translation>Fallo al desconectar la cámara web <b>%1</b> de la máquina virtual <b>%2</b>.</translation>
+ </message>
+ <message>
+ <source><p>The virtual screen is currently set to a <b>%1 bit</b> color mode. For better performance please change this to <b>%2 bit</b>. This can usually be done from the <b>Display</b> section of the guest operating system's Control Panel or System Settings.</p></source>
+ <translation><p>La pantalla virtual actualmente está establecida a un modo de color de <b>%1 bit</b>. Para mejor rendimiento cambielo a <b>%2 bit</b>. Esto puede hacerse desde la sección <b>Pantalla</b> del Panel de control o Preferencias del sistema del sistema operativo invitado.</p></translation>
+ </message>
</context>
<context>
<name>UIMiniProcessWidgetAdditions</name>
@@ -11919,7 +11947,7 @@ Versión %1</translation>
<translation type="obsolete">Diálogo i&nformación de sesión</translation>
</message>
<message>
- <source>Show Session Information Window</source>
+ <source>Show Session Information Dialog</source>
<translation type="obsolete">Mostrar el diálogo de información de sesión</translation>
</message>
<message>
@@ -12430,7 +12458,7 @@ Versión %1</translation>
</message>
<message>
<source>The actual default path value will be displayed after accepting the changes and opening this window again.</source>
- <translation type="unfinished">El valor de la ruta predeterminada será mostrada después de aceptar los cambios y abrir nuevamente este diálogo.</translation>
+ <translation>El valor actual predeterminado de la ruta será mostrado después de aceptar los cambios y abrir de nuevo este diálogo.</translation>
</message>
<message>
<source><not selected></source>
diff --git a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_eu.ts b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_eu.ts
index a7b7289..c9f15af 100644
--- a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_eu.ts
+++ b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_eu.ts
@@ -857,6 +857,10 @@
<source>Show Session Information Window</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>&Webcams</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIApplianceEditorWidget</name>
@@ -3222,6 +3226,14 @@
<source>Select a filename for the screenshot ...</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>No Webcams Connected</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>No supported webcams connected to the host PC</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIMachineSettingsAudio</name>
@@ -5309,7 +5321,7 @@
</message>
<message>
<source><p>The virtual machine window is optimized to work in <b>%1 bit</b> color mode but the virtual display is currently set to <b>%2 bit</b>.</p><p>Please open the display properties dialog of the guest OS and select a <b>%3 bit</b> color mode, if it is available, for best possible performance of the virtual video subsystem.</p><p><b>Note</b>. Some operating systems, like [...]
- <translation><p>Makina birtualaren leihoa <b>%1 bit</b> kolore moduan funtzionatzeko garatua izan da baina pantaila birtualaren kalitatea <b>%2 bitera</b> ezarririk dago.</p><p>Mesedez ireki bezero sistema eragileko pantaila propietateak eta hautatu <b>%3 bit</b> duen modu bat, erabilgarri badago, bideo birtual azpisistemak ahal den hobekien funtzionatzeko.</p><p><b>Kontutan izan< [...]
+ <translation type="obsolete"><p>Makina birtualaren leihoa <b>%1 bit</b> kolore moduan funtzionatzeko garatua izan da baina pantaila birtualaren kalitatea <b>%2 bitera</b> ezarririk dago.</p><p>Mesedez ireki bezero sistema eragileko pantaila propietateak eta hautatu <b>%3 bit</b> duen modu bat, erabilgarri badago, bideo birtual azpisistemak ahal den hobekien funtzionatzeko.</p><p><b> [...]
</message>
<message>
<source><p>You didn'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 window or the First Run Wizard.</p><p>Do you wish to continue?</p></source>
@@ -6230,6 +6242,18 @@
<source><p>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 <b>Insert Guest Additions CD image</b> from the <b>Devices</b> menu. If they are installed but the machine is not yet fully starte [...]
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Failed to attach the webcam <b>%1</b> to the virtual machine <b>%2</b>.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to detach the webcam <b>%1</b> from the virtual machine <b>%2</b>.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p>The virtual screen is currently set to a <b>%1 bit</b> color mode. For better performance please change this to <b>%2 bit</b>. This can usually be done from the <b>Display</b> section of the guest operating system's Control Panel or System Settings.</p></source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIMiniProcessWidgetAdditions</name>
diff --git a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_fa_IR.ts b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_fa_IR.ts
index a875bfe..8605ace 100644
--- a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_fa_IR.ts
+++ b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_fa_IR.ts
@@ -760,6 +760,10 @@
<comment>new</comment>
<translation type="obsolete">بارگیری ایمیج نصب افزونه مهمان</translation>
</message>
+ <message>
+ <source>&Webcams</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIApplianceEditorWidget</name>
@@ -2885,6 +2889,14 @@
<source>Select a filename for the screenshot ...</source>
<translation>یک نام فایل برای ضبط وضعیت انتخاب کنید...</translation>
</message>
+ <message>
+ <source>No Webcams Connected</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>No supported webcams connected to the host PC</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIMachineSettingsAudio</name>
@@ -4835,7 +4847,7 @@
</message>
<message>
<source><p>The virtual machine window is optimized to work in <b>%1 bit</b> color mode but the virtual display is currently set to <b>%2 bit</b>.</p><p>Please open the display properties dialog of the guest OS and select a <b>%3 bit</b> color mode, if it is available, for best possible performance of the virtual video subsystem.</p><p><b>Note</b>. Some operating systems, like [...]
- <translation><p>پنجره ماشین مجازی برای کار در حالت رنگی <b>%1 بیت</b> بهسازی شده است اما نمایشگر مجازی اکنون روی <b>%2 بیت</b> تنظیم شده است.</p><p>لطفا پنجره مشخصات نمایش سیستم عامل مهمان را باز کنید و حالت رنگی <b>%3 بیت</b> را انتخاب کنید، اگر آن موجود است، آن بهترین کارایی ممکن را برای ویدیو مجازی سیستم فرعی دارد.</p><p><b>توجه</b>. برخی سیستم عامل ها، مانند OS/2، ممکن است [...]
+ <translation type="obsolete"><p>پنجره ماشین مجازی برای کار در حالت رنگی <b>%1 بیت</b> بهسازی شده است اما نمایشگر مجازی اکنون روی <b>%2 بیت</b> تنظیم شده است.</p><p>لطفا پنجره مشخصات نمایش سیستم عامل مهمان را باز کنید و حالت رنگی <b>%3 بیت</b> را انتخاب کنید، اگر آن موجود است، آن بهترین کارایی ممکن را برای ویدیو مجازی سیستم فرعی دارد.</p><p><b>توجه</b>. برخی سیستم عامل ها، مانن [...]
</message>
<message>
<source>Failed to find license files in <nobr><b>%1</b></nobr>.</source>
@@ -5877,6 +5889,18 @@
<comment>additions-new</comment>
<translation type="obsolete">بارگیری</translation>
</message>
+ <message>
+ <source>Failed to attach the webcam <b>%1</b> to the virtual machine <b>%2</b>.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to detach the webcam <b>%1</b> from the virtual machine <b>%2</b>.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p>The virtual screen is currently set to a <b>%1 bit</b> color mode. For better performance please change this to <b>%2 bit</b>. This can usually be done from the <b>Display</b> section of the guest operating system's Control Panel or System Settings.</p></source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIMiniToolBar</name>
diff --git a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_fi.ts b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_fi.ts
index 2ce9570..1fd5556 100644
--- a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_fi.ts
+++ b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_fi.ts
@@ -888,6 +888,10 @@
<comment>new</comment>
<translation type="obsolete">Liitä asiakaslisäosien asennuslevykuva</translation>
</message>
+ <message>
+ <source>&Webcams</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIApplianceEditorWidget</name>
@@ -3777,6 +3781,14 @@ p, li { white-space: pre-wrap; }
<source>Select a filename for the screenshot ...</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>No Webcams Connected</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>No supported webcams connected to the host PC</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIMachineSettingsAudio</name>
@@ -6240,7 +6252,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source><p>The virtual machine window is optimized to work in <b>%1 bit</b> color mode but the virtual display is currently set to <b>%2 bit</b>.</p><p>Please open the display properties dialog of the guest OS and select a <b>%3 bit</b> color mode, if it is available, for best possible performance of the virtual video subsystem.</p><p><b>Note</b>. Some operating systems, like [...]
- <translation><p>Virtuaalikoneen ikkuna on optimoitu toimimaan <b>%1 bittisessä</b> väritilassa, mutta virtuaalinäytön värimäärä on asetettu nyt arvoon <b>%2 bittiä</b>.</p><p>Avaa virtuaalikoneen näyttöasetukset ja valitse värien määräksi <b>%3 bittinen</b> tila, jos saatavilla, jotta saat parhaan laatuisen videokuvan virtuaalikoneestasi.</p><p><b>Huomautus:</b> joissain käytt [...]
+ <translation type="obsolete"><p>Virtuaalikoneen ikkuna on optimoitu toimimaan <b>%1 bittisessä</b> väritilassa, mutta virtuaalinäytön värimäärä on asetettu nyt arvoon <b>%2 bittiä</b>.</p><p>Avaa virtuaalikoneen näyttöasetukset ja valitse värien määräksi <b>%3 bittinen</b> tila, jos saatavilla, jotta saat parhaan laatuisen videokuvan virtuaalikoneestasi.</p><p><b>Huomautus:</b> [...]
</message>
<message>
<source><p>You didn'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 window or the First Run Wizard.</p><p>Do you wish to continue?</p></source>
@@ -7342,6 +7354,18 @@ p, li { white-space: pre-wrap; }
<source><p>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 <b>Insert Guest Additions CD image</b> from the <b>Devices</b> menu. If they are installed but the machine is not yet fully starte [...]
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Failed to attach the webcam <b>%1</b> to the virtual machine <b>%2</b>.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to detach the webcam <b>%1</b> from the virtual machine <b>%2</b>.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p>The virtual screen is currently set to a <b>%1 bit</b> color mode. For better performance please change this to <b>%2 bit</b>. This can usually be done from the <b>Display</b> section of the guest operating system's Control Panel or System Settings.</p></source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIMiniProcessWidgetAdditions</name>
diff --git a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_fr.ts b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_fr.ts
index 20045c3..68fdabb 100644
--- a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_fr.ts
+++ b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_fr.ts
@@ -91,6 +91,10 @@
<source>The VirtualBox Linux kernel driver (vboxdrv) is either not loaded or there is a permission problem with /dev/vboxdrv. Please reinstall the kernel module by executing<br/><br/> <font color=blue>'/etc/init.d/vboxdrv setup'</font><br/><br/>as root. If it is available in your distribution, you should install the DKMS package first. This package keeps track of Linux kernel changes and recompiles the vboxdrv kernel module if necess [...]
<translation>Le pilote du noyau Linux de VirtualBox (vboxdrv) n'est soit pas chargé ou il y a un problème de permission sur /dev/vboxdrv. Veuillez réinstaller le module noyau en éxécutant<br><br/> <font color=blue>'/etc/init.d/vboxdrv setup'</font><br/><br/> en tant qu'administrateur. S'il n'est pas disponible pour votre distribution, vous devriez installer d'abord le paquet DKMS. Ce paquet garde la trace des [...]
</message>
+ <message>
+ <source>Frame Size: %1x%2, Frame Rate: %3fps, Bit Rate: %4kbps</source>
+ <translation type="obsolete">Taille de l'image : %1x%2, Taux de raffraîchissement de l'image : %3 ips, Taux de débit : %4kbps</translation>
+ </message>
</context>
<context>
<name>QIArrowSplitter</name>
@@ -272,8 +276,8 @@
<translation type="obsolete">Fenêtre &Session</translation>
</message>
<message>
- <source>Show Session Information Window</source>
- <translation type="unfinished">Afficher la fenêtre Session</translation>
+ <source>Show Session Information Dialog</source>
+ <translation type="obsolete">Afficher la fenêtre Session</translation>
</message>
<message>
<source>&Pause</source>
@@ -356,12 +360,12 @@
<translation>Créer ou modifier des dossiers partagés</translation>
</message>
<message>
- <source>&Insert Guest Additions CD image...</source>
- <translation type="unfinished">&Installer les Additions invité...</translation>
+ <source>&Install Guest Additions...</source>
+ <translation type="obsolete">&Installer les Additions invité...</translation>
</message>
<message>
- <source>Insert the Guest Additions disk file into the virtual drive</source>
- <translation type="unfinished">Insérer le disque d'installation des Additions invité</translation>
+ <source>Mount the Guest Additions installation image</source>
+ <translation type="obsolete">Insérer le disque d'installation des Additions invité</translation>
</message>
<message>
<source>De&bug</source>
@@ -865,62 +869,75 @@
</message>
<message>
<source>Save the machine state of the virtual machine</source>
- <translation type="unfinished"></translation>
+ <translation>Sauvegarder l'état de la machine virtuelle</translation>
</message>
<message>
<source>Power off the virtual machine</source>
- <translation type="unfinished"></translation>
+ <translation>Éteindre la machine virtuelle</translation>
</message>
<message>
<source>&Network Settings...</source>
- <translation type="unfinished"></translation>
+ <translation>Réglages &réseau...</translation>
</message>
<message>
<source>&Shared Folders Settings...</source>
- <translation type="unfinished"></translation>
+ <translation>Réglages des dossier&s partagés...</translation>
</message>
<message>
<source>R&emote Display</source>
- <translation type="unfinished"></translation>
+ <translation>Affichag&e distant</translation>
</message>
<message>
<source>Toggle remote desktop (RDP) connections to this machine</source>
- <translation type="unfinished"></translation>
+ <translation>Permuter les connexions de bureau distant (RDP) à cette machine</translation>
</message>
<message>
<source>&Video Capture</source>
- <translation type="unfinished"></translation>
+ <translation>Capture &vidéo</translation>
</message>
<message>
<source>Toggle video capture</source>
- <translation type="unfinished"></translation>
+ <translation>Permuter la capture vidéo</translation>
</message>
<message>
<source>&Video Capture Settings...</source>
- <translation type="unfinished"></translation>
+ <translation>Réglages de la capture &vidéo...</translation>
</message>
<message>
<source>Configure video capture settings</source>
- <translation type="unfinished"></translation>
+ <translation>Configurer les réglages de capture vidéo</translation>
</message>
<message>
<source>&Logging...</source>
<comment>debug action</comment>
- <translation type="unfinished"></translation>
+ <translation>Journa&lisation...</translation>
</message>
<message>
<source>Popup Menu</source>
- <translation type="unfinished"></translation>
+ <translation>Menu contextuel</translation>
+ </message>
+ <message>
+ <source>Show Session Information Window</source>
+ <translation>Afficher la fenêtre d'information de session</translation>
+ </message>
+ <message>
+ <source>&Webcams</source>
+ <translation>&Webcams</translation>
</message>
<message>
<source>&Insert Guest Additions CD image...</source>
- <comment>new</comment>
- <translation type="obsolete">&Installer les Additions invité...</translation>
+ <translation>&Insérer l'image CD des Additions Invité...</translation>
</message>
<message>
<source>Insert the Guest Additions disk file into the virtual drive</source>
- <comment>new</comment>
- <translation type="obsolete">Insérer le disque d'installation des Additions invité</translation>
+ <translation>Insère le fichier d'image disque des Additions Invité dans le lecteur virtuel</translation>
+ </message>
+</context>
+<context>
+ <name>UIActonPool</name>
+ <message>
+ <source>Popup Menu</source>
+ <translation type="obsolete">Menu contextuel</translation>
</message>
</context>
<context>
@@ -955,7 +972,7 @@
</message>
<message>
<source>Description</source>
- <translation>Description</translation>
+ <translation>Déscription</translation>
</message>
<message>
<source>License</source>
@@ -2426,31 +2443,31 @@
<message>
<source>Video Capture File</source>
<comment>details (display/video capture)</comment>
- <translation type="unfinished"></translation>
+ <translation>Fichier de capture vidéo</translation>
</message>
<message>
<source>Video Capture Attributes</source>
<comment>details (display/video capture)</comment>
- <translation type="unfinished"></translation>
+ <translation>Attributs de la capture vidéo</translation>
</message>
<message>
<source>Video Capture</source>
<comment>details (display/video capture)</comment>
- <translation type="unfinished"></translation>
+ <translation>Capture vidéo</translation>
</message>
<message>
<source>Disabled</source>
<comment>details (display/video capture)</comment>
- <translation type="unfinished"></translation>
+ <translation>Désactivée</translation>
</message>
<message>
<source>NAT Network, '%1'</source>
<comment>details (network)</comment>
- <translation type="unfinished"></translation>
+ <translation>Réseau NAT, '%1'</translation>
</message>
<message>
<source>Frame Size: %1x%2, Frame Rate: %3fps, Bit Rate: %4kbps</source>
- <translation type="unfinished"></translation>
+ <translation>Taille de l'image : %1x%2, Taux de raffraîchissement de l'image : %3 ips, Taux de débit : %4kbps</translation>
</message>
</context>
<context>
@@ -2699,7 +2716,7 @@
</message>
<message>
<source>&Extension Packages</source>
- <translation type="unfinished"></translation>
+ <translation>Paquetages d'&extension</translation>
</message>
</context>
<context>
@@ -2750,27 +2767,28 @@
</message>
<message>
<source>&Dock and Menubar:</source>
- <translation type="unfinished"></translation>
+ <translation>&Dock et Barre de menu :</translation>
</message>
<message>
<source>Auto-Show in Fullscreen</source>
- <translation type="unfinished"></translation>
+ <translatorcomment>[BM]Needs to be checked</translatorcomment>
+ <translation>Plein écran automatique</translation>
</message>
<message>
<source>When checked, the host dock and menu bar will be shown when the virtual machine is in fullscreen mode.</source>
- <translation type="unfinished"></translation>
+ <translation>Si cochée, le dock et la barre de menu de l'hôte seront affichés lorsque la machine virtuelle est mode plein écran.</translation>
</message>
<message>
<source>&Host Screensaver:</source>
- <translation type="unfinished"></translation>
+ <translation>Economiseur d'écran de l'&hôte :</translation>
</message>
<message>
<source>When checked, the host screensaver will be disabled whenever a virtual machine is running.</source>
- <translation type="unfinished"></translation>
+ <translation>Si cochée, l'économiseur d'écran de l'hôte sera désactivé lorsque qu'une machine virtuelle est en fonctionnement.</translation>
</message>
<message>
<source>Disable When Running Virtual Machines</source>
- <translation type="unfinished"></translation>
+ <translation>Désactiver pendant le fonctionnement de machines virtuelles</translation>
</message>
</context>
<context>
@@ -2809,27 +2827,27 @@
</message>
<message>
<source>Host Key Combination</source>
- <translation type="unfinished"></translation>
+ <translation>Combinaison de touches hôte</translation>
</message>
<message>
<source>Some items have the same shortcuts assigned.</source>
- <translation type="unfinished"></translation>
+ <translation>Plusieurs éléments ont les mêmes raccourci assignés.</translation>
</message>
<message>
<source>&VirtualBox Manager</source>
- <translation type="unfinished"></translation>
+ <translation>Gestionnaire &VirtualBox</translation>
</message>
<message>
<source>Virtual &Machine</source>
- <translation type="unfinished"></translation>
+ <translation>&Machine virtuelle</translation>
</message>
<message>
<source>Lists all the available shortcuts which can be configured.</source>
- <translation type="unfinished"></translation>
+ <translation>Liste tous les raccourcis disponibles qui peuvent être configurés.</translation>
</message>
<message>
<source>Enter a sequence to filter the shortcut list.</source>
- <translation type="unfinished"></translation>
+ <translation>Entrer une séquence de filtrage de la liste de raccourcis.</translation>
</message>
</context>
<context>
@@ -2888,7 +2906,7 @@
</message>
<message>
<source>&Interface Languages</source>
- <translation type="unfinished"></translation>
+ <translation>Langues de l'&interface</translation>
</message>
</context>
<context>
@@ -3045,128 +3063,131 @@
</message>
<message>
<source>&NAT Networks</source>
- <translation type="unfinished"></translation>
+ <translation>Réseaux &NAT</translation>
</message>
<message>
<source>Lists all available NAT networks.</source>
- <translation type="unfinished"></translation>
+ <translation>Liste tous les réseaux NAT disponibles.</translation>
</message>
<message>
<source>&Host-only Networks</source>
- <translation type="unfinished"></translation>
+ <translatorcomment>[BM]Must match with other translation of host-only elsewhere, yet to be checked.</translatorcomment>
+ <translation>Réseau &hôte uniquement</translation>
</message>
<message>
<source>No new name specified for the NAT network previously called <b>%1</b>.</source>
- <translation type="unfinished"></translation>
+ <translation>Aucun nouveau nom spécifié pour le réseau NAT précédemment nommé <b>%1</b>.</translation>
</message>
<message>
<source>No CIDR specified for the NAT network <b>%1</b>.</source>
- <translation type="unfinished"></translation>
+ <translation>Aucun CIDR spécifié pour le réseau NAT <b>%1</b>.</translation>
</message>
<message>
<source>No CIDR specified for the NAT network previously called <b>%1</b>.</source>
- <translation type="unfinished"></translation>
+ <translation>Aucun CIDR spécifié pour le réseau NAT précédemment nommé <b>%1</b>.</translation>
</message>
<message>
<source>Invalid CIDR specified (<i>%1</i>) for the NAT network <b>%2</b>.</source>
- <translation type="unfinished"></translation>
+ <translation>Le CIDR spécifié (<i>%1</i>) pour le réseau NAT <b>%2</> est invalide.</translation>
</message>
<message>
<source>Invalid CIDR specified (<i>%1</i>) for the NAT network previously called <b>%2</b>.</source>
- <translation type="unfinished"></translation>
+ <translatorcomment>[BM]Called as in named could be then translated by nommé. Actual translation makes sense at this stage.</translatorcomment>
+ <translation>Le CIDR spécifié (<i>%1</i>) pour le réseau NAT appelé auparavant <b>%2</> est invalide.</translation>
</message>
<message>
<source>Network Name</source>
- <translation type="unfinished"></translation>
+ <translatorcomment>[BM]Or Nom de réseau, if context is a network settings dialog for example.</translatorcomment>
+ <translation>Nom du réseau</translation>
</message>
<message>
<source>[empty]</source>
- <translation type="unfinished"></translation>
+ <translation>[vide]</translation>
</message>
<message>
<source>%1 (renamed from %2)</source>
- <translation type="unfinished"></translation>
+ <translation>%1 (renommé depuis %2)</translation>
</message>
<message>
<source>Old Network Name</source>
- <translation type="unfinished"></translation>
+ <translation>Précédent nom de réseau</translation>
</message>
<message>
<source>New Network Name</source>
- <translation type="unfinished"></translation>
+ <translation>Nouveau nom de réseau</translation>
</message>
<message>
<source>Network CIDR</source>
- <translation type="unfinished"></translation>
+ <translation>Réseau CIDR</translation>
</message>
<message>
<source>Supports DHCP</source>
- <translation type="unfinished"></translation>
+ <translation>Supporte le DHCP</translation>
</message>
<message>
<source>yes</source>
- <translation type="unfinished"></translation>
+ <translation>oui</translation>
</message>
<message>
<source>no</source>
- <translation type="unfinished"></translation>
+ <translation>non</translation>
</message>
<message>
<source>Supports IPv6</source>
- <translation type="unfinished"></translation>
+ <translation>Supporte l'IPv6</translation>
</message>
<message>
<source>Default IPv6 route</source>
- <translation type="unfinished"></translation>
+ <translation>Route IPv6 par défaut</translation>
</message>
<message>
<source>Host interface <b>%1</b> does not currently have a valid IPv4 address.</source>
- <translation type="unfinished"></translation>
+ <translation>L'interface hôte <b>%1</b> ne dispose pas actuellement d'adresse IPv4 valide.</translation>
</message>
<message>
<source>Host interface <b>%1</b> does not currently have a valid IPv4 network mask.</source>
- <translation type="unfinished"></translation>
+ <translation>L'interface hôte <b>%1</b> n'a pas actuellement de masque de réseau IPv4 valide.</translation>
</message>
<message>
<source>Host interface <b>%1</b> does not currently have a valid IPv6 address.</source>
- <translation type="unfinished"></translation>
+ <translation>L'interface hôte <b>%1</b> ne dispose pas actuellement d'adresse IPv6 valide.</translation>
</message>
<message>
<source>Host interface <b>%1</b> does not currently have a valid DHCP server address.</source>
- <translation type="unfinished"></translation>
+ <translation>L'interface hôte <b>%1</b> n'a pas actuellement d'adresse de serveur DHCP valide.</translation>
</message>
<message>
<source>Host interface <b>%1</b> does not currently have a valid DHCP server mask.</source>
- <translation type="unfinished"></translation>
+ <translation>L'interface hôte <b>%1</b> n'a pas actuellement de masque d'adresse de serveur DHCP valide.</translation>
</message>
<message>
<source>Host interface <b>%1</b> does not currently have a valid DHCP server lower address bound.</source>
- <translation type="unfinished"></translation>
+ <translation>L'interface hôte <b>%1</b> ne dispose pas actuellement de limite inférieure d'adresse de serveur DHCP valide.</translation>
</message>
<message>
<source>Host interface <b>%1</b> does not currently have a valid DHCP server upper address bound.</source>
- <translation type="unfinished"></translation>
+ <translation>L'interface hôte <b>%1</b> ne dispose pas actuellement de limite supérieure d'adresse de serveur DHCP valide.</translation>
</message>
<message>
<source>The name <b>%1</b> is being used for several NAT networks.</source>
- <translation type="unfinished"></translation>
+ <translation>Le nom <b>%1</b> est actuellement utilisé pour plusieurs réseaux NAT.</translation>
</message>
<message>
<source>Active</source>
<comment>NAT network</comment>
- <translation type="unfinished">Active</translation>
+ <translation>Actif</translation>
</message>
<message>
<source>&Add NAT network</source>
- <translation type="unfinished"></translation>
+ <translation>&Ajouter un réseau NAT</translation>
</message>
<message>
<source>&Remove NAT network</source>
- <translation type="unfinished"></translation>
+ <translation>&Retirer le réseau NAT</translation>
</message>
<message>
<source>&Edit NAT network</source>
- <translation type="unfinished"></translation>
+ <translation>&Éditer le réseau NAT</translation>
</message>
</context>
<context>
@@ -3268,177 +3289,177 @@
<name>UIGlobalSettingsNetworkDetailsHost</name>
<message>
<source>Host-only Network Details</source>
- <translation type="unfinished">Détails du réseau privé hôte</translation>
+ <translation>Détails du réseau privé hôte</translation>
</message>
<message>
<source>&Adapter</source>
- <translation type="unfinished">&Interface</translation>
+ <translation>C&arte</translation>
</message>
<message>
<source>Manual &Configuration</source>
- <translation type="unfinished">&Configuration manuelle</translation>
+ <translation>&Configuration manuelle</translation>
</message>
<message>
<source>Use manual configuration for this host-only network adapter.</source>
- <translation type="unfinished">Utiliser la configuration manuelle pour cette interface de réseau privé hôte.</translation>
+ <translation>Utiliser la configuration manuelle pour cette interface de réseau privé hôte.</translation>
</message>
<message>
<source>&IPv4 Address:</source>
- <translation type="unfinished">Adresse &IPv4 :</translation>
+ <translation>Adresse &IPv4 :</translation>
</message>
<message>
<source>Holds the host IPv4 address for this adapter.</source>
- <translation type="unfinished">Affiche l'adresse IPv4 hôte pour cette interface.</translation>
+ <translation>Affiche l'adresse IPv4 hôte pour cette carte.</translation>
</message>
<message>
<source>IPv4 Network &Mask:</source>
- <translation type="unfinished">&Masque réseau IPv4 :</translation>
+ <translation>&Masque réseau IPv4 :</translation>
</message>
<message>
<source>Holds the host IPv4 network mask for this adapter.</source>
- <translation type="unfinished">Affiche le masque réseau IPv4 hôte pour cette interface.</translation>
+ <translation>Affiche le masque réseau IPv4 hôte pour cette carte.</translation>
</message>
<message>
<source>I&Pv6 Address:</source>
- <translation type="unfinished">Adresse I&Pv6 :</translation>
+ <translation>Adresse I&Pv6 :</translation>
</message>
<message>
<source>Holds the host IPv6 address for this adapter if IPv6 is supported.</source>
- <translation type="unfinished">Affiche l'adresse IPv6 hôte pour cette interface si l'IPv6 est supporté.</translation>
+ <translation>Affiche l'adresse IPv6 hôte pour cette carte si l'IPv6 est supporté.</translation>
</message>
<message>
<source>IPv6 Network Mask &Length:</source>
- <translation type="unfinished">&Longueur du masque réseau IPv6 :</translation>
+ <translation>&Longueur du masque réseau IPv6 :</translation>
</message>
<message>
<source>Holds the host IPv6 network mask prefix length for this adapter if IPv6 is supported.</source>
- <translation type="unfinished">Affiche la longueur du préfixe du masque réseau IPv6 pour cette interface si l'IPv6 est supporté.</translation>
+ <translation>Affiche la longueur du préfixe du masque réseau IPv6 pour cette carte si l'IPv6 est supporté.</translation>
</message>
<message>
<source>&DHCP Server</source>
- <translation type="unfinished">Serveur &DHCP</translation>
+ <translation>Serveur &DHCP</translation>
</message>
<message>
<source>&Enable Server</source>
- <translation type="unfinished">&Activer le serveur</translation>
+ <translation>&Activer le serveur</translation>
</message>
<message>
<source>Indicates whether the DHCP Server is enabled on machine startup or not.</source>
- <translation type="unfinished">Indique si le serveur DHCP est activé au démarrage de la machine.</translation>
+ <translation>Indique si le serveur DHCP est activé au démarrage de la machine ou non.</translation>
</message>
<message>
<source>Server Add&ress:</source>
- <translation type="unfinished">Ad&resse du serveur :</translation>
+ <translation>Ad&resse du serveur :</translation>
</message>
<message>
<source>Holds the address of the DHCP server servicing the network associated with this host-only adapter.</source>
- <translation type="unfinished">Affiche l'adresse du serveur DHCP du réseau associé à cette interface de réseau privé hôte.</translation>
+ <translation>Affiche l'adresse du serveur DHCP du réseau associé à cette carte de réseau privé hôte.</translation>
</message>
<message>
<source>Server &Mask:</source>
- <translation type="unfinished">&Masque serveur :</translation>
+ <translation>&Masque serveur :</translation>
</message>
<message>
<source>Holds the network mask of the DHCP server servicing the network associated with this host-only adapter.</source>
- <translation type="unfinished">Affiche le masque réseau du serveur DHCP du réseau associé à cette interface de réseau privé hôte.</translation>
+ <translation>Affiche le masque réseau du serveur DHCP du réseau associé à cette carte de réseau privé hôte.</translation>
</message>
<message>
<source>&Lower Address Bound:</source>
- <translation type="unfinished">&Limite inférieure des adresses :</translation>
+ <translation>&Limite inférieure des adresses :</translation>
</message>
<message>
<source>Holds the lower address bound offered by the DHCP server servicing the network associated with this host-only adapter.</source>
- <translation type="unfinished">Affiche la limite inférieure de la plage d'adresses du serveur DHCP du réseau associé à cette interface de réseau privé hôte.</translation>
+ <translation>Affiche la limite inférieure de la plage d'adresses du serveur DHCP du réseau associé à cette carte de réseau privé hôte.</translation>
</message>
<message>
<source>&Upper Address Bound:</source>
- <translation type="unfinished">Limite s&upérieure des adresses :</translation>
+ <translation>Limite s&upérieure des adresses :</translation>
</message>
<message>
<source>Holds the upper address bound offered by the DHCP server servicing the network associated with this host-only adapter.</source>
- <translation type="unfinished">Affiche la limite supérieure de la plage d'adresses du serveur DHCP du réseau associé à cette interface de réseau privé hôte.</translation>
+ <translation>Affiche la limite supérieure de la plage d'adresses du serveur DHCP du réseau associé à cette carte de réseau privé hôte.</translation>
</message>
</context>
<context>
<name>UIGlobalSettingsNetworkDetailsNAT</name>
<message>
<source>NAT Network Details</source>
- <translation type="unfinished"></translation>
+ <translation>Détails de réseau NAT</translation>
</message>
<message>
<source>&Enable Network</source>
- <translation type="unfinished"></translation>
+ <translation>Activ&er le réseau</translation>
</message>
<message>
<source>Enable this NAT network.</source>
- <translation type="unfinished"></translation>
+ <translation>Activer ce réseau NAT.</translation>
</message>
<message>
<source>Network &Name:</source>
- <translation type="unfinished"></translation>
+ <translation>&Nom de réseau :</translation>
</message>
<message>
<source>Holds the name for this network.</source>
- <translation type="unfinished"></translation>
+ <translation>Contient le nom de ce réseau.</translation>
</message>
<message>
<source>Network &CIDR:</source>
- <translation type="unfinished"></translation>
+ <translation>&CIDR du réseau :</translation>
</message>
<message>
<source>Holds the CIDR for this network.</source>
- <translation type="unfinished"></translation>
+ <translation>Contient le CIDR pour ce réseau.</translation>
</message>
<message>
<source>Network Options:</source>
- <translation type="unfinished"></translation>
+ <translation>Options réseau :</translation>
</message>
<message>
<source>Supports &DHCP</source>
- <translation type="unfinished"></translation>
+ <translation>Supporte le &DHCP</translation>
</message>
<message>
<source>Determines whether this network supports DHCP.</source>
- <translation type="unfinished"></translation>
+ <translation>Détermine si ce réseau supporte le DHCP.</translation>
</message>
<message>
<source>Supports &IPv6</source>
- <translation type="unfinished"></translation>
+ <translation>Supporte l'&IPv6</translation>
</message>
<message>
<source>Determines whether this network supports IPv6.</source>
- <translation type="unfinished"></translation>
+ <translation>Détermine si ce réseau supporte l'IPv6.</translation>
</message>
<message>
<source>Advertise Default IPv6 &Route</source>
- <translation type="unfinished"></translation>
+ <translation>Annoncer la &route IPv6 par défaut</translation>
</message>
<message>
<source>Determines whether this network should be advertised as the default IPv6 route.</source>
- <translation type="unfinished"></translation>
+ <translation>Détermine si ce réseau doit être annoncé comme la route IPv6 par défaut.</translation>
</message>
<message>
<source>Opens a window to manage port forwarding rules.</source>
- <translation type="unfinished">Ouvre une fenêtre pour gérer les règles de redirection de ports.</translation>
+ <translation>Ouvre une fenêtre pour gérer les règles de redirection de ports.</translation>
</message>
<message>
<source>&Port Forwarding</source>
- <translation type="unfinished">Redirection de &ports</translation>
+ <translation>Redirection de &ports</translation>
</message>
</context>
<context>
<name>UIGlobalSettingsPortForwardingDlg</name>
<message>
<source>Port Forwarding Rules</source>
- <translation type="unfinished">Règles de redirection de ports</translation>
+ <translation>Règles de redirection de ports</translation>
</message>
<message>
<source>IPv4</source>
- <translation type="unfinished"></translation>
+ <translation>IPv4</translation>
</message>
<message>
<source>IPv6</source>
- <translation type="unfinished"></translation>
+ <translation>IPv6</translation>
</message>
</context>
<context>
@@ -3493,11 +3514,11 @@
</message>
<message>
<source>No proxy host is currently specified.</source>
- <translation type="unfinished"></translation>
+ <translation>Aucun hôte proxy actuellement spécifié.</translation>
</message>
<message>
<source>No proxy port is currently specified.</source>
- <translation type="unfinished"></translation>
+ <translation>Aucun port proxy actuellement spécifié.</translation>
</message>
</context>
<context>
@@ -3562,71 +3583,71 @@
<name>UIHostComboEditor</name>
<message>
<source><key_%1></source>
- <translation type="unfinished"><Touche_%1></translation>
+ <translation><touche_%1></translation>
</message>
<message>
<source>Left </source>
- <translation type="unfinished">Gauche </translation>
+ <translation>Gauche </translation>
</message>
<message>
<source>Right </source>
- <translation type="unfinished">Droite </translation>
+ <translation>Droite </translation>
</message>
<message>
<source>Left Shift</source>
- <translation type="unfinished">Maj gauche</translation>
+ <translation>Maj. gauche</translation>
</message>
<message>
<source>Right Shift</source>
- <translation type="unfinished">Maj droite</translation>
+ <translation>Maj. droite</translation>
</message>
<message>
<source>Left Ctrl</source>
- <translation type="unfinished">Ctrl gauche</translation>
+ <translation>Ctrl gauche</translation>
</message>
<message>
<source>Right Ctrl</source>
- <translation type="unfinished">Ctrl droite</translation>
+ <translation>Ctrl droite</translation>
</message>
<message>
<source>Left Alt</source>
- <translation type="unfinished">Alt gauche</translation>
+ <translation>Alt gauche</translation>
</message>
<message>
<source>Right Alt</source>
- <translation type="unfinished">Alt droite</translation>
+ <translation>Alt droite</translation>
</message>
<message>
<source>Left WinKey</source>
- <translation type="unfinished">Windows gauche</translation>
+ <translation>Windows gauche</translation>
</message>
<message>
<source>Right WinKey</source>
- <translation type="unfinished">Windows droite</translation>
+ <translation>Windows droite</translation>
</message>
<message>
<source>Menu key</source>
- <translation type="unfinished">Touche menu</translation>
+ <translation>Touche menu</translation>
</message>
<message>
<source>Alt Gr</source>
- <translation type="unfinished">Alt Gr</translation>
+ <translation>Alt Gr</translation>
</message>
<message>
<source>Caps Lock</source>
- <translation type="unfinished">Verr Maj</translation>
+ <translation>Verrouillage Majuscules</translation>
</message>
<message>
<source>Scroll Lock</source>
- <translation type="unfinished">Arrêt défil</translation>
+ <translation>Arrêt défilement</translation>
</message>
<message>
<source>Host+</source>
- <translation type="unfinished"></translation>
+ <translation>Hôte+</translation>
</message>
<message>
<source>None</source>
- <translation type="unfinished"></translation>
+ <translation>Aucun(e)</translation>
</message>
</context>
<context>
@@ -3814,22 +3835,23 @@
</message>
<message>
<source>Reset shortcut to default</source>
- <translation type="unfinished"></translation>
+ <translation>Réinitialiser le raccourci par défaut</translation>
</message>
<message>
<source>Unset shortcut</source>
- <translation type="unfinished"></translation>
+ <translation>Supprimer le raccourci</translation>
</message>
</context>
<context>
<name>UIHotKeyTableModel</name>
<message>
<source>Name</source>
- <translation type="unfinished"></translation>
+ <translation>Nom</translation>
</message>
<message>
<source>Shortcut</source>
- <translation type="unfinished"></translation>
+ <translatorcomment>Kept as Latin Alias on Macs ;-)</translatorcomment>
+ <translation>Raccourci</translation>
</message>
</context>
<context>
@@ -4020,20 +4042,20 @@
</message>
<message>
<source><nobr>Indicates video capturing activity:</nobr><br>%1</source>
- <translation type="unfinished"></translation>
+ <translation><nobr>Indique l'activité de la capture vidéo : </nobr><br>%1</translation>
</message>
<message>
<source><nobr><b>Video capture disabled</b></nobr></source>
- <translation type="unfinished"></translation>
+ <translation><nobr><b>Capture vidéo désactivée</b></nobr></translation>
</message>
<message>
<source><nobr><b>Video capture file:</b> %1</nobr></source>
- <translation type="unfinished"></translation>
+ <translation><nobr><b>Fichier de capture vidéo : </b>%1</nobr></translation>
</message>
<message>
<source>Additional feature status:<br><nobr><b>%1:</b> %2</nobr><br><nobr><b>%3:</b> %4</nobr><br><nobr><b>%5:</b> %6</nobr><br><nobr><b>%7:</b> %8%</nobr></source>
<comment>Virtualization Stuff LED</comment>
- <translation type="unfinished"></translation>
+ <translation>Status de la fonctionalité supplémentaire : <br><nobr><b>%1:</b> %2</nobr><br><nobr><b>%3:</b> %4</nobr><br><nobr><b>%5:</b> %6</nobr><br><nobr><b>%7:</b> %8%</nobr></translation>
</message>
</context>
<context>
@@ -4105,6 +4127,14 @@
<source>Select a filename for the screenshot ...</source>
<translation>Choisissez un nom de fichier pour la capture d'écran ...</translation>
</message>
+ <message>
+ <source>No Webcams Connected</source>
+ <translation>Aucune Webcam connectée</translation>
+ </message>
+ <message>
+ <source>No supported webcams connected to the host PC</source>
+ <translation>Aucune Webcam supportée connectée</translation>
+ </message>
</context>
<context>
<name>UIMachineSettingsAudio</name>
@@ -4258,130 +4288,130 @@
</message>
<message>
<source>Video &Capture</source>
- <translation type="unfinished"></translation>
+ <translation>&Capture vidéo</translation>
</message>
<message>
<source>When checked, VirtualBox will record the virtual machine session as a video file.</source>
- <translation type="unfinished"></translation>
+ <translation>Si cochée, VirtualBox enregistrera la session de machine virtuelle dans un fichier vidéo.</translation>
</message>
<message>
<source>&Enable Video Capture</source>
- <translation type="unfinished"></translation>
+ <translation>Activ&er la capture vidéo</translation>
</message>
<message>
<source>File &Path:</source>
- <translation type="unfinished"></translation>
+ <translation>&Chemin du fichier :</translation>
</message>
<message>
<source>This setting determines the filename VirtualBox uses to save the recorded content.</source>
- <translation type="unfinished"></translation>
+ <translation>Ce paramètre détermine le nom du fichier que VirtualBox utilise pour le contenu enregistré.</translation>
</message>
<message>
<source>Frame &Size:</source>
- <translation type="unfinished"></translation>
+ <translation>&Taille de l'image :</translation>
</message>
<message>
<source>This setting determines the resolution (frame size) of the recorded video.</source>
- <translation type="unfinished"></translation>
+ <translation>Ce paramètre détermine la résolution (taille d'image) de la vidéo enregistrée.</translation>
</message>
<message>
<source>This setting determines the <b>horizontal</b> resolution (frame width) of the recorded video.</source>
- <translation type="unfinished"></translation>
+ <translation>Ce paramètre détermine la résolution <b>horizontale</b> (largeur d'image) de la vidéo enregistrée.</translation>
</message>
<message>
<source>This setting determines the <b>vertical</b> resolution (frame height) of the recorded video.</source>
- <translation type="unfinished"></translation>
+ <translation>Ce paramètre détermine la résolution <b>verticale</b> (hauteur d'image) de la vidéo enregistrée.</translation>
</message>
<message>
<source>&Frame Rate:</source>
- <translation type="unfinished"></translation>
+ <translation>&Images par seconde :</translation>
</message>
<message>
<source>This setting determines the maximum number of <b>frames per second</b>. Additional frames will be skipped. Reducing this value will increase the number of skipped frames and reduce the file size.</source>
- <translation type="unfinished"></translation>
+ <translation>Ce paramètre détermine le nombre maximum d'<b>images par seconde</b>. Les images supplémentaires seront ignorées. La réduction de cette valeur augmentera le nombre d'images ignorées et réduira la taille du fichier.</translation>
</message>
<message>
<source>&Quality:</source>
- <translation type="unfinished"></translation>
+ <translation>&Qualité :</translation>
</message>
<message>
<source>This setting determines the <b>quality</b>. Increasing this value will make the video look better at the cost of an increased file size.</source>
- <translation type="unfinished"></translation>
+ <translation>Ce paramètre détermine la <b>qualité</b>. L'augementation de cette valeur améliorera le rendu de la vidéo au prix d'une taille de fichier plus grande.</translation>
</message>
<message>
<source>This setting determines the bitrate in <b>kilobits per second</b>. Increasing this value will make the video look better at the cost of an increased file size.</source>
- <translation type="unfinished"></translation>
+ <translation>Ce paramètre détermine le débit en <b>kilobits par seconde</b>. L'augementation de cette valeur améliorera le rendu de la vidéo au prix d'une taille de fichier plus grande.</translation>
</message>
<message>
<source>&Screens:</source>
- <translation type="unfinished"></translation>
+ <translation>Ecran&s :</translation>
</message>
<message>
<source>The virtual machine is set up to use hardware graphics acceleration. However the host system does not currently provide this, so you will not be able to start the machine.</source>
- <translation type="unfinished"></translation>
+ <translation>La machine virtuelle est paramètrée pour utiliser l'accélaration graphique matérielle. Cependant le système hôte ne propose actuellement pas cette fonctionnalité. Vous ne pourrez donc pas démarrer la machine.</translation>
</message>
<message>
<source>The virtual machine is currently assigned less than <b>%1</b> of video memory which is the minimum amount required to switch to fullscreen or seamless mode.</source>
- <translation type="unfinished"></translation>
+ <translation>Moins de <b>%1</b> de la mémoire vidéo est actuellement alloué à la machine virtuelle, ce qui est le minimum nécessaire pour basculer en mode plein écran ou en mode intégré.</translation>
</message>
<message>
<source>The virtual machine is currently assigned less than <b>%1</b> of video memory which is the minimum amount required for High Definition Video to be played efficiently.</source>
- <translation type="unfinished"></translation>
+ <translation>Moins de <b>%1</b> de la mémoire vidéo est actuellement alloué à la machine virtuelle, ce qui est le minimum recquis pour la reproduction efficace de la vidéo HD.</translation>
</message>
<message>
<source>The virtual machine is set up to use hardware graphics acceleration and the operating system hint is set to Windows Vista or later. For best performance you should set the machine's video memory to at least b>%1</b>.</source>
- <translation type="unfinished"></translation>
+ <translation>La machine virtuelle est paramétrée pour utiliser l'accélération graphique et l'indicateur de système d'exploitation est réglé sur Windows Vista ou ultérieur. Pour de meilleures performances, vous devriez régler la mémoire vidéo de la machine à au moins <b>%1</b>.</translation>
</message>
<message>
<source>The virtual machine is set up to use Video Stream Acceleration. As this feature only works with Windows guest systems it will be disabled.</source>
- <translation type="unfinished"></translation>
+ <translation>La machine virtuelle est paramètrée pour utiliser l'accélération des flux vidéo. Dans le mesure où cette fonctionnalité ne s'applique qu'aux systèmes invités Windows, elle sera désactivée.</translation>
</message>
<message>
<source>The VRDE server port value is not currently specified.</source>
- <translation type="unfinished"></translation>
+ <translation>La valeur du port du serveur VRDE n'est actuellement pas spécifiée.</translation>
</message>
<message>
<source>The VRDE authentication timeout value is not currently specified.</source>
- <translation type="unfinished"></translation>
+ <translation>La valeur du délai d'authentification n'est actuellement pas spécifiée.</translation>
</message>
<message>
<source>User Defined</source>
- <translation type="unfinished"></translation>
+ <translation>Défini par l'utilisateur</translation>
</message>
<message>
<source>%1 fps</source>
- <translation type="unfinished"></translation>
+ <translation>%1 ips</translation>
</message>
<message>
<source>fps</source>
- <translation type="unfinished"></translation>
+ <translation>ips</translation>
</message>
<message>
<source>low</source>
<comment>quality</comment>
- <translation type="unfinished"></translation>
+ <translation>basse</translation>
</message>
<message>
<source>medium</source>
<comment>quality</comment>
- <translation type="unfinished"></translation>
+ <translation>moyenne</translation>
</message>
<message>
<source>high</source>
<comment>quality</comment>
- <translation type="unfinished"></translation>
+ <translation>haute</translation>
</message>
<message>
<source>kbps</source>
- <translation type="unfinished"></translation>
+ <translation>kbps</translation>
</message>
<message>
<source>Screen %1</source>
- <translation type="unfinished"></translation>
+ <translation>Ecran %1</translation>
</message>
<message>
<source>Enable video recording for screen %1.</source>
- <translation type="unfinished"></translation>
+ <translation>Activer l'enregistrement vidéo pour l'écran %1.</translation>
</message>
</context>
<context>
@@ -4472,11 +4502,11 @@
</message>
<message>
<source>No name specified for the virtual machine.</source>
- <translation type="unfinished"></translation>
+ <translation>Aucun nom spécifié pour la machine virtuelle.</translation>
</message>
<message>
<source>The virtual machine operating system hint is set to a 64-bit type. 64-bit guest systems require hardware virtualization, so this will be enabled automatically if you confirm the changes.</source>
- <translation type="unfinished"></translation>
+ <translation>L'indicateur de système d'exploitation virtuel est défini sur le type 64 bits. Les systèmes invités 64 bits nécessitent la virtualisation matérielle, elle sera donc automatiquement activée si vous confirmez les modifications.</translation>
</message>
</context>
<context>
@@ -4616,35 +4646,35 @@
</message>
<message>
<source>No bridged network adapter is currently selected.</source>
- <translation type="unfinished"></translation>
+ <translation>Aucun adaptateur de réseau ponté actuellement sélectionné.</translation>
</message>
<message>
<source>No internal network name is currently specified.</source>
- <translation type="unfinished"></translation>
+ <translation>Aucun nom de réseau interne actuellement spécifié.</translation>
</message>
<message>
<source>No host-only network adapter is currently selected.</source>
- <translation type="unfinished"></translation>
+ <translation>Aucun nom d'adaptateur réseau hôte uniquement actuellement spécifié.</translation>
</message>
<message>
<source>No generic driver is currently selected.</source>
- <translation type="unfinished"></translation>
+ <translation>Aucun pilote générique actuellement spécifié.</translation>
</message>
<message>
<source>The MAC address must be 12 hexadecimal digits long.</source>
- <translation type="unfinished"></translation>
+ <translation>L'adresse MAC doit avoir 12 chiffres héxadécimaux de longueur.</translation>
</message>
<message>
<source>The second digit in the MAC address may not be odd as only unicast addresses are allowed.</source>
- <translation type="unfinished"></translation>
+ <translation>Le deuxième chiffre dans l'adresse MAC ne peut être impair car seules les adresses unicast sont autorisées.</translation>
</message>
<message>
<source>No NAT network name is currently specified.</source>
- <translation type="unfinished"></translation>
+ <translation>Aucun nom de réseau NAT actuellement spécifié.</translation>
</message>
<message>
<source>Holds the name of the NAT network that this network card will be connected to. You can create and remove networks using the global network settings in the virtual machine manager window.</source>
- <translation type="unfinished"></translation>
+ <translation>Contient le nom du réseau NAT auquel cette carte réseau sera connectée. Vous pouvez créer et supprimer des réseau en utilisant les paramètres globaux de réseau dans la fenêtre du gestionnaire de machine virtuelle.</translation>
</message>
</context>
<context>
@@ -4711,23 +4741,24 @@
</message>
<message>
<source>No IRQ is currently specified.</source>
- <translation type="unfinished"></translation>
+ <translatorcomment>[BM]Interuption is femine in French</translatorcomment>
+ <translation>Aucune IRQ actuellement spécifiée.</translation>
</message>
<message>
<source>No I/O port is currently specified.</source>
- <translation type="unfinished"></translation>
+ <translation>Aucun port E/S actuellement spécifié.</translation>
</message>
<message>
<source>Two or more ports have the same settings.</source>
- <translation type="unfinished"></translation>
+ <translation>Plusieurs ports ont les mêmes paramètres.</translation>
</message>
<message>
<source>No port path is currently specified.</source>
- <translation type="unfinished"></translation>
+ <translation>Aucun chemin de port actuellement spécifié.</translation>
</message>
<message>
<source>There are currently duplicate port paths specified.</source>
- <translation type="unfinished"></translation>
+ <translation>Plusieurs chemins de port sont actuellement en double.</translation>
</message>
</context>
<context>
@@ -4889,7 +4920,7 @@
</message>
<message>
<source>Window</source>
- <translation type="unfinished"></translation>
+ <translation>Fenêtre</translation>
</message>
</context>
<context>
@@ -4972,23 +5003,23 @@
</message>
<message>
<source>No IRQ is currently specified.</source>
- <translation type="unfinished"></translation>
+ <translation>Aucune IRQ actuellement spécifiée.</translation>
</message>
<message>
<source>No I/O port is currently specified.</source>
- <translation type="unfinished"></translation>
+ <translation>Aucun port E/S actuellement spécifié.</translation>
</message>
<message>
<source>Two or more ports have the same settings.</source>
- <translation type="unfinished"></translation>
+ <translation>Plusieurs ports ont les mêmes paramètres.</translation>
</message>
<message>
<source>No port path is currently specified.</source>
- <translation type="unfinished"></translation>
+ <translation>Aucun chemin de port actuellement spécifié.</translation>
</message>
<message>
<source>There are currently duplicate port paths specified.</source>
- <translation type="unfinished"></translation>
+ <translation>Les chemins de port spécifié sont actuellement en double.</translation>
</message>
</context>
<context>
@@ -5019,7 +5050,7 @@
</message>
<message>
<source>No hard disk is selected for <i>%1</i>.</source>
- <translation type="unfinished">Aucun disque dur n'est affecté à <i>%1</i>.</translation>
+ <translation>Aucun disque dur n'est affecté à <i>%1</i>.</translation>
</message>
<message>
<source><i>%1</i> uses a medium that is already attached to <i>%2</i>.</source>
@@ -5354,19 +5385,19 @@
</message>
<message>
<source>No name is currently specified for the controller at position <b>%1</b>.</source>
- <translation type="unfinished"></translation>
+ <translation>Aucun nom n'est actuellement spécifié pour le contrôleur à la position <b>%1</b>.</translation>
</message>
<message>
<source>The controller at position <b>%1</b> has the same name as the controller at position <b>%2</b>.</source>
- <translation type="unfinished"></translation>
+ <translation>Le contrôleur à la position <b>%1</b> a le même nom que le contrôleur à la position <b>%2</b>.</translation>
</message>
<message>
<source><i>%1</i> is using a disk that is already attached to <i>%2</i>.</source>
- <translation type="unfinished"></translation>
+ <translation><i>%1</i> utilise un disque qui déjà attaché à <i>%2</i>.</translation>
</message>
<message>
<source>The machine currently has more storage controllers assigned than a %1 chipset supports. Please change the chipset type on the System settings page or reduce the number of the following storage controllers on the Storage settings page: %2</source>
- <translation type="unfinished"></translation>
+ <translation>La machine dispose actuellement de plus de contrôleurs de stockage assigné qu'un chipset %1 ne le supporte. Veuillez changer le type de chipset dans les paramètres Système ou réduire le nombre de contrôleurs de stockage suivants dans la page des paramètres Stockage : %2</translation>
</message>
</context>
<context>
@@ -5573,47 +5604,47 @@
</message>
<message>
<source>&Pointing Device:</source>
- <translation type="unfinished"></translation>
+ <translation>Système de &pointage : </translation>
</message>
<message>
<source>Determines whether the emulated pointing device is a standard PS/2 mouse, a USB tablet or a USB multi-touch tablet.</source>
- <translation type="unfinished"></translation>
+ <translation>Détermine si le système de pointage émulé est une souris PS/2 standard, une tablette USB ou une tablette multi-touch.</translation>
</message>
<message>
<source>More than <b>%1%</b> of the host computer's memory (<b>%2</b>) is assigned to the virtual machine. Not enough memory is left for the host operating system. Please select a smaller amount.</source>
- <translation type="unfinished"></translation>
+ <translation>Plus de <b>%1%</b> de mémoire de l'ordinateur hôte (<b>%2</b>) est assigné à la machine virtuelle. Il ne reste plus assez de mémoire pour le système d'exploitation hôte. Veuillez choisir une quantité moins élevée.</translation>
</message>
<message>
<source>More than <b>%1%</b> of the host computer's memory (<b>%2</b>) is assigned to the virtual machine. There might not be enough memory left for the host operating system. Please consider selecting a smaller amount.</source>
- <translation type="unfinished"></translation>
+ <translation>Plus de <b>%1%</b> de mémoire de l'ordinateur hôte (<b>%2</b>) est assigné à la machine virtuelle. Il pourrait ne plus rester assez de mémoire pour le système d'exploitation hôte. Veuillez choisir une quantité moins élevée.</translation>
</message>
<message>
<source>The I/O APIC feature is not currently enabled in the Motherboard section of the System page. This is needed in order to support a chip set of type ICH9. It will be done automatically if you confirm your changes.</source>
- <translation type="unfinished"></translation>
+ <translation>La fonctionnalité E/S APIC n'est actuellement pas activée dans la section Carte-mère de la page Système. Cela est nécessaire afin de pouvoir supporter un chipset de type ICH9. Cela sera fait automatiquement si vous confirmez vos changements.</translation>
</message>
<message>
<source>USB controller emulation is not currently enabled on the USB page. This is needed to support an emulated USB input device. It will be done automatically if you confirm your changes.</source>
- <translation type="unfinished"></translation>
+ <translation>L'émulation de contrôleur USB n'est actuellement pas activée sur la page des réglages USB. Cela est nécessaire afin de pouvoir supporter un système d'entrée USB émulé. Cela sera fait automatiquement si vous confirmez vos changements.</translation>
</message>
<message>
<source>For performance reasons, the number of virtual CPUs attached to the virtual machine may not be more than twice the number of physical CPUs on the host (<b>%1</b>). Please reduce the number of virtual CPUs.</source>
- <translation type="unfinished"></translation>
+ <translation>Pour des raisons de performance, le nombre de processeurs virtuels alloués à la machine virtuelle ne peut être supérieure au double du nombre de processeurs physiques sur l'hôte (<b>%1</b>). Veuillez réduire le nombre de processeurs virtuels.</translation>
</message>
<message>
<source>More virtual CPUs are assigned to the virtual machine than the number of physical CPUs on the host system (<b>%1</b>). This is likely to degrade the performance of your virtual machine. Please consider reducing the number of virtual CPUs.</source>
- <translation type="unfinished"></translation>
+ <translation>Le nombre de processeurs virtuels alloués à la machine virtuelle est supérieure au nombre de processeurs physiques sur l'hôte (<b>%1</b>). Veuillez considérer la réduction du nombre de processeurs virtuels.</translation>
</message>
<message>
<source>The I/O APIC feature is not currently enabled in the Motherboard section of the System page. This is needed in order to support more than one virtual processor. It will be done automatically if you confirm your changes.</source>
- <translation type="unfinished"></translation>
+ <translation>La fonctionnalité E/S APIC n'est actuellement pas activée dans la section Carte-mère de la page Système. Cela est nécessaire afin de pouvoir supporter un chipset de type ICH9. Cela sera fait automatiquement si vous confirmez vos changements.</translation>
</message>
<message>
<source>Hardware virtualization is not currently enabled in the Acceleration section of the System page. This is needed in order to support more than one virtual processor. It will be done automatically if you confirm your changes.</source>
- <translation type="unfinished"></translation>
+ <translation>La virtualisation matérielle n'est actuellement pas activée dans la section Accélération de la page de réglages Système. Cela sera fait automatiquement si vous confirmez vos changements.</translation>
</message>
<message>
<source>The processor execution cap is set to a low value. This may make the machine feel slow to respond.</source>
- <translation type="unfinished"></translation>
+ <translation>Le limiteur d'exécution du procésseur est réglé sur une valeur basse. Cela pourrait rendre la machine peu répondante.</translation>
</message>
</context>
<context>
@@ -5750,7 +5781,7 @@
</message>
<message>
<source>USB 2.0 is currently enabled for this virtual machine. However, this requires the <b>%1</b> to be installed. Please install the Extension Pack from the VirtualBox download site or disable USB 2.0 to be able to start the machine.</source>
- <translation type="unfinished"></translation>
+ <translation>L'USB 2.0 est actuellement activé pour cette machine virtuelle. L'installation de <b>%1</b> est cependant requise. Veuillez installer le pack d'extension depuis le site de téléchargement VirtualBox ou desactiver l'USB 2.0 afin de pouvoir démarrer la machine.</translation>
</message>
</context>
<context>
@@ -6145,15 +6176,15 @@
<p>La langue est remise de façon temporaire à l'anglais (natif). Vous pouvez choisir une autre langue dans la fenêtre <b>Paramètres</b> du menu Fichier de la fenêtre principale.</P></translation>
</message>
<message>
- <source><p>The VirtualBox Guest Additions installed in the Guest OS are too old: the installed version is %1, the expected version is %2. Some features that require Guest Additions (mouse integration, guest display auto-resize) will most likely stop working properly.</p><p>Please update the Guest Additions to the current version by choosing <b>Insert Guest Additions CD image</b> from the <b>Devices</b> menu.</p></source>
+ <source><p>The VirtualBox Guest Additions installed in the Guest OS are too old: the installed version is %1, the expected version is %2. Some features that require Guest Additions (mouse integration, guest display auto-resize) will most likely stop working properly.</p><p>Please update the Guest Additions to the current version by choosing <b>Install Guest Additions</b> from the <b>Devices</b> menu.</p></source>
<translation type="obsolete"><p>Les Additions invités installées dans la machine virtuelle sont trop anciennes : la version installée est %1, la version requise est %2. Certaines fonctions (intégration de la souris, redimensionnement automatique de la fenêtre) ne marcheront pas.</p><p>Veuillez mettre à jour les additions en choisissant <b>Installer les Additions invité...</b> à partir du menu Périphériques.</p></translation>
</message>
<message>
- <source><p>The VirtualBox Guest Additions installed in the Guest OS are outdated: the installed version is %1, the expected version is %2. Some features that require Guest Additions (mouse integration, guest display auto-resize) may not work as expected.</p><p>It is recommended to update the Guest Additions to the current version by choosing <b>Insert Guest Additions CD image</b> from the <b>Devices</b> menu.</p></source>
+ <source><p>The VirtualBox Guest Additions installed in the Guest OS are outdated: the installed version is %1, the expected version is %2. Some features that require Guest Additions (mouse integration, guest display auto-resize) may not work as expected.</p><p>It is recommended to update the Guest Additions to the current version by choosing <b>Install Guest Additions</b> from the <b>Devices</b> menu.</p></source>
<translation type="obsolete"><p>Les Additions invités installées dans la machine virtuelle ne sont pas à jour : la version installée est %1, la version requise est %2. Certaines fonctions (intégration de la souris, redimensionnement automatique de la fenêtre) ne marcheront peut-être pas convenablement.</p><p>Vous pouvez mettre à jour les additions en choisissant <b>Installer les Additions invité...</b> à partir du menu Périphériques.</p></translation>
</message>
<message>
- <source><p>The VirtualBox Guest Additions installed in the Guest OS are too recent for this version of VirtualBox: the installed version is %1, the expected version is %2.</p><p>Using a newer version of Additions with an older version of VirtualBox is not supported. Please install the current version of the Guest Additions by choosing <b>Insert Guest Additions CD image</b> from the <b>Devices</b> menu.</p></source>
+ <source><p>The VirtualBox Guest Additions installed in the Guest OS are too recent for this version of VirtualBox: the installed version is %1, the expected version is %2.</p><p>Using a newer version of Additions with an older version of VirtualBox is not supported. Please install the current version of the Guest Additions by choosing <b>Install Guest Additions</b> from the <b>Devices</b> menu.</p></source>
<translation type="obsolete"><p>Les Additions invités installées dans la machine virtuelle sont trop récentes pour cette version de VirtualBox : la version installée est %1, la version attendue est %2. Utiliser une version trop récente des additions n'est pas supporté. Veuillez installer la bonne version des Additions invité en choisissant <b>Installer les Additions invité...</b> à partir du menu Périphériques.</p></translation>
</message>
<message>
@@ -6182,7 +6213,7 @@
</message>
<message>
<source><p>The virtual machine window is optimized to work in <b>%1 bit</b> color mode but the virtual display is currently set to <b>%2 bit</b>.</p><p>Please open the display properties dialog of the guest OS and select a <b>%3 bit</b> color mode, if it is available, for best possible performance of the virtual video subsystem.</p><p><b>Note</b>. Some operating systems, like [...]
- <translation><p>La fenêtre de la machine virtuelle est optimisée pour le mode couleur <b>%1 bits</b> alors que le mode de l'écran virtuel est <b>%2 bits</b>.</p><p>Si possible, configurez l'affichage dans le système invité pour utiliser le mode <b>%3 bits</b>.</p><p><b>Note :</b> Certains systèmes d'exploitations (OS/2 par exemple) peuvent parfois fonct [...]
+ <translation type="obsolete"><p>La fenêtre de la machine virtuelle est optimisée pour le mode couleur <b>%1 bits</b> alors que le mode de l'écran virtuel est <b>%2 bits</b>.</p><p>Si possible, configurez l'affichage dans le système invité pour utiliser le mode <b>%3 bits</b>.</p><p><b>Note :</b> Certains systèmes d'exploitations (OS/2 par exemple) peuve [...]
</message>
<message>
<source><p>You didn'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 window or the First Run Wizard.</p><p>Do you wish to continue?</p></source>
@@ -6250,9 +6281,9 @@
<translation type="obsolete">Téléchargement</translation>
</message>
<message>
- <source>Insert</source>
+ <source>Mount</source>
<comment>additions</comment>
- <translation type="unfinished">Insérer</translation>
+ <translation type="obsolete">Insérer</translation>
</message>
<message>
<source><p>The host key is currently defined as <b>%1</b>.</p></source>
@@ -6891,8 +6922,8 @@
<translation><p>Le fichier contenant le disque virtuel ne sera pas effacé et il sera possible de le réutiliser ultérieurement.</p></translation>
</message>
<message>
- <source><p>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 <b>Insert Guest Additions CD image</b> from the <b>Devices</b> menu. If they are installed but the machine is not yet fully starte [...]
- <translation type="unfinished"><p>Les Additions Invités VirtualBox semblent ne pas être actives sur cette machine virtuelle et de ce fait les dossiers partagés ne peuvent pas être utilisés.Pour utiliser les dossiers partagés dans cette machine virtuelle, installez les Additions Invités, ou bien réinstallez-les si elles ne fonctionnent pas correctement en choisissant <b>Installer les Additions Invités...</b> dans le menu <b>Périphériques</b>. Si elles [...]
+ <source><p>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 <b>Install Guest Additions</b> from the <b>Devices</b> menu. If they are installed but the machine is not yet fully started then s [...]
+ <translation type="obsolete"><p>Les Additions Invités VirtualBox semblent ne pas être actives sur cette machine virtuelle et de ce fait les dossiers partagés ne peuvent pas être utilisés.Pour utiliser les dossiers partagés dans cette machine virtuelle, installez les Additions Invités, ou bien réinstallez-les si elles ne fonctionnent pas correctement en choisissant <b>Installer les Additions Invités...</b> dans le menu <b>Périphériques</b>. Si elles s [...]
</message>
<message>
<source><p>The virtual machine window will be now switched to <b>fullscreen</b> mode. You can go back to windowed mode at any time by pressing <b>%1</b>.</p><p>Note that the <i>Host</i> key is currently defined as <b>%2</b>.</p><p>Note that the main menu bar is hidden in fullscreen mode. You can access it by pressing <b>Host+Home</b>.</p></source>
@@ -7199,229 +7230,240 @@
</message>
<message>
<source><p>Cannot start the VirtualBox Manager due to local restrictions.</p><p>The application will now terminate.</p></source>
- <translation type="unfinished"></translation>
+ <translation><p>Impossible de démarrer le Gestionnaire VirtualBox en raisons de restrictions locales.</p><p>Cette application va maintenant s'arrêter.</p></translation>
</message>
<message>
<source><p>Could not find a language file for the language <b>%1</b> in the directory <b><nobr>%2</nobr></b>.</p><p>The language will be temporarily reset to the system default language. Please go to the <b>Preferences</b> window which you can open from the <b>File</b> menu of the VirtualBox Manager window, and select one of the existing languages on the <b>Language</b> page.</p></source>
- <translation type="unfinished"></translation>
+ <translation><p> Impossible de trouver le fichier de langue pour la langue <b>%1</b> dans le dossier <b><nobr>%2</b>.</p><p>La langue va temporairement être remise à la langue par défaut du système. Veuillez sélectionner une des langues disponibles sur la page <b>Langue</b> dans la fenêtre des <b>Préférences</b> accessible depuis le menu <b>Fichier</b> de la fenêtre du Gestionnaire VirtualBox.< [...]
</message>
<message>
<source><p>Could not load the language file <b><nobr>%1</nobr></b>. <p>The language will be temporarily reset to English (built-in). Please go to the <b>Preferences</b> window which you can open from the <b>File</b> menu of the VirtualBox Manager window, and select one of the existing languages on the <b>Language</b> page.</p></source>
- <translation type="unfinished"></translation>
+ <translation><p> Impossible de charger le fichier de langue pour la langue <b><nobr>%1</nobr></b>.</p><p>La langue va temporairement être réglée sur Anglais (intégré). Veuillez sélectionner une des langues disponibles sur la page <b>Langue</b> dans la fenêtre des <b>Préférences</b> accessible depuis le menu <b>Fichier</b> de la fenêtre du Gestionnaire VirtualBox.</p></translation>
</message>
<message>
<source>There is no virtual machine with the identifier <b>%1</b>.</source>
- <translation type="unfinished"></translation>
+ <translation>Aucune machine virtuelle pour l'identifiant <b>%1</b>.</translation>
</message>
<message>
<source>Ignore</source>
- <translation type="unfinished">Ignorer</translation>
+ <translation>Ignorer</translation>
</message>
<message>
<source>Failed to create NAT network.</source>
- <translation type="unfinished"></translation>
+ <translation>Echec de la création du réseau NAT.</translation>
</message>
<message>
<source>Failed to remove NAT network <b>%1</b>.</source>
- <translation type="unfinished"></translation>
+ <translation>Echec la suppresion du réseau NAT <b>%1</b>.</translation>
</message>
<message>
<source>Failed to create DHCP server.</source>
- <translation type="unfinished"></translation>
+ <translation>Echec de la création du serveur DHCP.</translation>
</message>
<message>
<source>Failed to remove DHCP server for network interface <b>%1</b>.</source>
- <translation type="unfinished"></translation>
+ <translation>Echec de la suppresion du serveur DHCP pour l'interface réseau <b>%1</b>.</translation>
</message>
<message>
<source>Failed to create the host network interface.</source>
- <translation type="unfinished"></translation>
+ <translation>Echec de la création de l'interface du réseau hôte.</translation>
</message>
<message>
<source>Create &new disk</source>
- <translation type="unfinished">Créer un &nouveau disque</translation>
+ <translation>Créer un &nouveau disque</translation>
</message>
<message>
<source>&Choose existing disk</source>
- <translation type="unfinished">&Choisir un disque existant</translation>
+ <translation>&Choisir un disque existant</translation>
</message>
<message>
<source>Leave &empty</source>
- <translation type="unfinished">Laisser &vide</translation>
+ <translation>Laisser &vide</translation>
</message>
<message>
<source>&Choose disk</source>
- <translation type="unfinished">&Choisir un disque</translation>
+ <translation>&Choisir un disque</translation>
</message>
<message>
<source><p>Are you sure you want to release the virtual hard disk <nobr><b>%1</b></nobr>?</p><p>This will detach it from the following virtual machine(s): <b>%2</b>.</p></source>
- <translation type="unfinished"></translation>
+ <translation><p>Êtes-vous sûr de vouloir libérer le disque dur virtuel <nobr><b>%1</b></nobr> ?</p><p>Celà le libérera de la ou des machine(s) virtuelle(s) suivante(s) : <b>%2</b>.</p></translation>
</message>
<message>
<source><p>Are you sure you want to release the virtual optical disk <nobr><b>%1</b></nobr>?</p><p>This will detach it from the following virtual machine(s): <b>%2</b>.</p></source>
- <translation type="unfinished"></translation>
+ <translation><p>Êtes-vous sûr de vouloir libérer le lecteur de disque optique virtuel <nobr><b>%1</b></nobr> ?</p><p>Celà le libérera de la ou des machine(s) virtuelle(s) suivante(s) : <b>%2</b>.</p></translation>
</message>
<message>
<source><p>Are you sure you want to release the virtual floppy disk <nobr><b>%1</b></nobr>?</p><p>This will detach it from the following virtual machine(s): <b>%2</b>.</p></source>
- <translation type="unfinished"></translation>
+ <translation><p>Êtes-vous sûr de vouloir libérer le lecteur de disquette virtuel <nobr><b>%1</b></nobr> ?</p><p>Celà le libérera de la ou des machine(s) virtuelle(s) suivante(s) : <b>%2</b>.</p></translation>
</message>
<message>
<source><p>Are you sure you want to remove the virtual hard disk <nobr><b>%1</b></nobr> from the list of known disk image files?</p></source>
- <translation type="unfinished"></translation>
+ <translation><p>Êtes-vous sûr de vouloir libérer le disque dur virtuel <nobr><b>%1</b></nobr> de liste des fichiers d'image disque connus ?</p></translation>
</message>
<message>
<source><p>As this hard disk is inaccessible its image file can not be deleted.</p></source>
- <translation type="unfinished"></translation>
+ <translation><p>Ce disque dur étant inaccessible, son fichier image ne peut être effacé.</p></translation>
</message>
<message>
<source><p>Are you sure you want to remove the virtual optical disk <nobr><b>%1</b></nobr> from the list of known disk image files?</p></source>
- <translation type="unfinished"></translation>
+ <translation><p>Êtes-vous sûr de vouloir libérer le disque optique virtuel <nobr><b>%1</b></nobr> de liste des fichiers d'image disque connus ?</p></translation>
</message>
<message>
<source><p>Are you sure you want to remove the virtual floppy disk <nobr><b>%1</b></nobr> from the list of known disk image files?</p></source>
- <translation type="unfinished"></translation>
+ <translation><p>Êtes-vous sûr de vouloir libérer le lecteur de disquette virtuel <nobr><b>%1</b></nobr> de liste des fichiers d'image disque connus ?</p></translation>
</message>
<message>
<source><p>Unable to insert the virtual optical disk <nobr><b>%1</b></nobr> into the machine <b>%2</b>.</p></source>
- <translation type="unfinished"></translation>
+ <translation><p>Impossible d'insérer le disque optique virtuel <nobr><b>%1</b>dans la machine <b>%2</b>.</p></translation>
</message>
<message>
<source><p>Would you like to try to force insertion of this disk?</p></source>
- <translation type="unfinished"></translation>
+ <translation><p>Souhaitez-vous essayer de forcer l'insertion du disque ?</p></translation>
</message>
<message>
<source><p>Unable to eject the virtual optical disk <nobr><b>%1</b></nobr> from the machine <b>%2</b>.</p></source>
- <translation type="unfinished"></translation>
+ <translation><p>Impossible d'éjecter le disque optique virtuel <nobr><b>%1</b></nobr> de la machine <b>%2</b>.</p></translation>
</message>
<message>
<source><p>Would you like to try to force ejection of this disk?</p></source>
- <translation type="unfinished"></translation>
+ <translation><p>Souhaitez-vous essayer l'éjection de force du disque ?</p></translation>
</message>
<message>
<source><p>Unable to insert the virtual floppy disk <nobr><b>%1</b></nobr> into the machine <b>%2</b>.</p></source>
- <translation type="unfinished"></translation>
+ <translation><p>Impossible d'insérer la disquette virtuelle <nobr><b>%1</b>dans la machine <b>%2</b>.</p></translation>
</message>
<message>
<source><p>Unable to eject the virtual floppy disk <nobr><b>%1</b></nobr> from the machine <b>%2</b>.</p></source>
- <translation type="unfinished"></translation>
+ <translation><p>Impossible d'éjecter la disquette virtuelle <nobr><b>%1</b></nobr> de la machine <b>%2</b>.</p></translation>
</message>
<message>
<source>Failed to open the hard disk file <nobr><b>%1</b></nobr>.</source>
- <translation type="unfinished"></translation>
+ <translation>Echec de l'ouverture du fichier de disque dur <nobr><b>%1</b></nobr>.</translation>
</message>
<message>
<source>Failed to open the optical disk file <nobr><b>%1</b></nobr>.</source>
- <translation type="unfinished"></translation>
+ <translation>Echec de l'ouverture du fichier de disque optique <nobr><b>%1</b></nobr>.</translation>
</message>
<message>
<source>Failed to open the floppy disk file <nobr><b>%1</b></nobr>.</source>
- <translation type="unfinished"></translation>
+ <translation>Echec de l'ouverture du fichier de disquette <nobr><b>%1</b></nobr>.</translation>
</message>
<message>
<source>Failed to close the hard disk file <nobr><b>%2</b></nobr>.</source>
- <translation type="unfinished"></translation>
+ <translation>Echec de la fermeture du fichier de disque dur <nobr><b>%2</b></nobr>.</translation>
</message>
<message>
<source>Failed to close the optical disk file <nobr><b>%2</b></nobr>.</source>
- <translation type="unfinished"></translation>
+ <translation>Echec de la fermeture du fichier de disque optique <nobr><b>%2</b></nobr>.</translation>
</message>
<message>
<source>Failed to close the floppy disk file <nobr><b>%2</b></nobr>.</source>
- <translation type="unfinished"></translation>
+ <translation>Echec de la fermeture du fichier de disquette virtuelle <nobr><b>%2</b></nobr>.</translation>
</message>
<message numerus="yes">
<source><p>The %n following virtual machine(s) are currently in a saved state: <b>%1</b></p><p>If you continue the runtime state of the exported machine(s) will be discarded. The other machine(s) will not be changed.</p></source>
<comment>This text is never used with n == 0. Feel free to drop the %n where possible, we only included it because of problems with Qt Linguist (but the user can see how many machines are in the list and doesn't need to be told).</comment>
- <translation type="unfinished">
- <numerusform></numerusform>
- <numerusform></numerusform>
+ <translation>
+ <numerusform><p>La machine virtuelle suivante est actuellement en état sauvegardé : <b>%1</b></p><p>Si vous continuez, l'état d'exécution de la machine exportée sera supprimé. La ou les autres machines ne seront pas modifiées.</p></numerusform>
+ <numerusform><p>Les %n machines virtuelles suivantes sont actuellement en état sauvegardé : <b>%1</b></p><p>Si vous continuez, l'état d'exécution des machines exportées sera supprimé. La ou les autres machines ne seront pas modifiées.</p></numerusform>
</translation>
</message>
<message>
<source>Switch</source>
- <translation type="unfinished">Basculer</translation>
+ <translation>Permuter</translation>
</message>
<message>
<source>Failed to enable the remote desktop server for the virtual machine <b>%1</b>.</source>
- <translation type="unfinished"></translation>
+ <translation>Echec de l'activation du serveur de bureau distant pour la machine virtuelle <b>%1</b>.</translation>
</message>
<message>
<source>Failed to disable the remote desktop server for the virtual machine <b>%1</b>.</source>
- <translation type="unfinished"></translation>
+ <translation>Echec de la désactivation du serveur de bureau distant pour la machine virtuelle <b>%1</b>.</translation>
</message>
<message>
<source>Failed to enable video capturing for the virtual machine <b>%1</b>.</source>
- <translation type="unfinished"></translation>
+ <translation>Echec de l'activation de la capture vidéo pour la machine virtuelle <b>%1</b>.</translation>
</message>
<message>
<source>Failed to disable video capturing for the virtual machine <b>%1</b>.</source>
- <translation type="unfinished"></translation>
+ <translation>Echec de la désactivation de la capture vidéo pour la machine virtuelle <b>%1</b>.</translation>
</message>
<message>
<source><p>Could not find the <b>VirtualBox Guest Additions</b> disk image file.</p><p>Do you wish to download this disk image file from the Internet?</p></source>
- <translation type="unfinished"></translation>
+ <translation><p>Impossible de trouver le fichier d'image disque des <b>Additions Invités VirtualBox</b>.</p>Souhaitez-vous télécharger ce fichier depuis l'Internet ?</p></translation>
</message>
<message>
<source>Download</source>
- <translation type="unfinished">Téléchargement</translation>
+ <translation>Télécharger</translation>
</message>
<message>
<source><p>Are you sure you want to download the <b>VirtualBox Guest Additions</b> disk image file from <nobr><a href="%1">%1</a></nobr> (size %2 bytes)?</p></source>
- <translation type="unfinished"></translation>
+ <translation><p>Êtes-vous sûr de vouloir télécharger l'image disque des <b>Additions Invité VirtualBox</b> depuis <nobr><a href="%1">%1</a></nobr> (taille %2 octets) ?</p></translation>
</message>
<message>
<source><p>The <b>VirtualBox Guest Additions</b> disk image file has been successfully downloaded from <nobr><a href="%1">%1</a></nobr> but can't be saved locally as <nobr><b>%2</b>.</nobr></p><p>Please choose another location for that file.</p></source>
- <translation type="unfinished"></translation>
+ <translation><p>Le fichier d'image disque <b>Additions Invité VirtualBox</b> a bien été téléchargé depuis <nobr><a href="%1">%1</a></nobr> mais n'a pas être enregistré localement en tant que <nobr><b>%2</b>.</nobr></p><p>Veuillez choisir un autre emplacement pour ce fichier.</p></translation>
</message>
<message>
<source><p>The <b>VirtualBox Guest Additions</b> disk image file has been successfully downloaded from <nobr><a href="%1">%1</a></nobr> and saved locally as <nobr><b>%2</b>.</nobr></p><p>Do you wish to register this disk image file and insert it into the virtual CD/DVD drive?</p></source>
- <translation type="unfinished"></translation>
+ <translation><p>Le fichier d'image disque <b>Additions Invité VirtualBox</b> a bien été téléchargé depuis <nobr><a href="%1">%1</a></nobr> et enregistré localement en tant que <nobr><b>%2</b>.</nobr></p><p>Souhaitez-vous consigner ce fichier d'image disque et l'insérer dans le lecteur de CD/DVD virtuel ?</p></translation>
</message>
<message>
<source><p>Could not insert the <b>VirtualBox Guest Additions</b> disk image file into the virtual machine <b>%1</b>, as the machine has no CD/DVD drives. Please add a drive using the storage page of the virtual machine settings window.</p></source>
- <translation type="unfinished"></translation>
+ <translation><p>Impossible d'insérer le fichier d'image disque <b>Additions Invité VirtualBox</b> dans la machine virtuelle <b>%1</b> : la machine n'a pas de lecteur CD/DVD. Veuillez ajouter un lecteur en utilisant la page stockage de la fenêtre des réglages de la machine virtuelle.</p></translation>
</message>
<message>
<source><p>Could not find the <b>VirtualBox User Manual</b> <nobr><b>%1</b>.</nobr></p><p>Do you wish to download this file from the Internet?</p></source>
- <translation type="unfinished"></translation>
+ <translation><p>Impossible de trouver le <b>Manuel de l'utilisateur de VirtualBox</b>.<nobr><b>%1</b> Souhaitez-vous le télécharger depuis l'Internet ?</p></translation>
</message>
<message>
<source><p>Are you sure you want to download the <b>VirtualBox User Manual</b> from <nobr><a href="%1">%1</a></nobr> (size %2 bytes)?</p></source>
- <translation type="unfinished"></translation>
+ <translation><p>Êtes-vous sûr de vouloir télécharger le <b>Manuel de l'Utilisateur VirtualBox</b> depuis <a href="%1">%1</a></nobr> (taille %2 octets) ?</p></translation>
</message>
<message>
<source><p>The VirtualBox User Manual has been successfully downloaded from <nobr><a href="%1">%1</a></nobr> but can't be saved locally as <nobr><b>%2</b>.</nobr></p><p>Please choose another location for that file.</p></source>
- <translation type="unfinished"><p>Le guide de l'utilisateur de VirtualBox a été téléchargé a partir de <nobr><a href="%1">%2</a></nobr> mais ne peut pas être enregistré sous <nobr><b>%3</b>.</nobr></p><p>Veuillez choisir un autre emplacement pour le fichier.</p> {1"?} {1<?} {2<?}</translation>
+ <translation><p>Le guide de l'utilisateur de VirtualBox a été téléchargé à partir de <nobr><a href="%1">%1</a></nobr> mais ne peut pas être enregistré sous <nobr><b>%2</b>.</nobr></p><p>Veuillez choisir un autre emplacement pour le fichier.</p></translation>
</message>
<message>
<source><p>The VirtualBox User Manual has been successfully downloaded from <nobr><a href="%1">%1</a></nobr> and saved locally as <nobr><b>%2</b>.</nobr></p></source>
- <translation type="unfinished"><p>Le guide de l'utilisateur de VirtualBox a été téléchargé a partir de <nobr><a href="%1">%2</a></nobr> et enregistré sous <nobr><b>%3</b>.</nobr></p> {1"?} {1<?} {2<?}</translation>
+ <translation><p>Le guide de l'utilisateur de VirtualBox a été téléchargé à partir de <nobr><a href="%1">%1</a></nobr> et enregistré sous <nobr><b>%2b>.</nobr></p></translation>
</message>
<message>
<source>Close</source>
- <translation type="unfinished">Fermer</translation>
+ <translation>Fermer</translation>
</message>
<message>
<source>Ok</source>
- <translation type="unfinished">Ok</translation>
+ <translation>Ok</translation>
</message>
<message>
<source>Do not show this message again</source>
- <translation type="unfinished">Ne plus afficher ce message</translation>
+ <translation>Ne plus afficher ce message</translation>
</message>
<message>
<source><p>Do you want to remove the NAT network <nobr><b>%1</b>?</nobr></p><p>If this network is in use by one or more virtual machine network adapters these adapters will no longer be usable until you correct their settings by either choosing a different network name or a different adapter attachment type.</p></source>
- <translation type="unfinished"></translation>
+ <translation><p>Souhaitez-vous hôter le réseau NAT <nobr><b>%1</b> ?</nobr></p><p>Si ce réseau en cours d'utilisation par une ou plusieurs adaptateurs réseau de machine virtuelle, ces adaptateurs ne seront plus utilisable tant que vous ne saisissez pas des paramètres corects ou ne choisissiez un nom d'adaptateur ou un type d'adaptateur réseau.</p></translation>
+ </message>
+ <message>
+ <source>Failed to attach the webcam <b>%1</b> to the virtual machine <b>%2</b>.</source>
+ <translation>Échec de la connexion de la webcam <b>%1</b> à la machine virtuelle <b>%2</b>.</translation>
+ </message>
+ <message>
+ <source>Failed to detach the webcam <b>%1</b> from the virtual machine <b>%2</b>.</source>
+ <translation>Échec de la déconnexion de la webcam <b>%1</b> à la machine virtuelle <b>%2</b>.</translation>
</message>
<message>
<source><p>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 <b>Insert Guest Additions CD image</b> from the <b>Devices</b> menu. If they are installed but the machine is not yet fully starte [...]
- <comment>new</comment>
- <translation type="obsolete"><p>Les Additions Invités VirtualBox semblent ne pas être actives sur cette machine virtuelle et de ce fait les dossiers partagés ne peuvent pas être utilisés.Pour utiliser les dossiers partagés dans cette machine virtuelle, installez les Additions Invités, ou bien réinstallez-les si elles ne fonctionnent pas correctement en choisissant <b>Installer les Additions Invités...</b> dans le menu <b>Périphériques</b>. Si elles s [...]
+ <translation><p>Les Additions Invités VirtualBox semblent ne pas être actives sur cette machine virtuelle. De ce fait les dossiers partagés ne peuvent pas être utilisés. Pour utiliser les dossiers partagés dans cette machine virtuelle, installez les Additions Invités, ou bien réinstallez-les si elles ne fonctionnent pas correctement en choisissant <b>Installer les Additions Invités...</b> dans le menu <b>Périphériques</b>. Si elles sont installés et [...]
</message>
<message>
<source>Insert</source>
- <comment>additions-new</comment>
- <translation type="obsolete">Insérer</translation>
+ <comment>additions</comment>
+ <translation>Insérer</translation>
+ </message>
+ <message>
+ <source><p>The virtual screen is currently set to a <b>%1 bit</b> color mode. For better performance please change this to <b>%2 bit</b>. This can usually be done from the <b>Display</b> section of the guest operating system's Control Panel or System Settings.</p></source>
+ <translation><p>L'écran virtuel est actuellement réglé sur un mode coleur <b>%1 bit</b>. Pour de meilleures performances, veuillez l'ajuster sur <b>%2 bit</b>. Cela peut généralement être fait depuis la section <b>Affichage</b> du paneau de configuration ou des préférences systemes du système d'exploitation hôte.</p></translation>
</message>
</context>
<context>
@@ -7484,19 +7526,19 @@
<name>UIMiniToolBar</name>
<message>
<source>Always show the toolbar</source>
- <translation type="unfinished">Toujours afficher la barre d'outils</translation>
+ <translation>Toujours afficher la barre d'outils</translation>
</message>
<message>
<source>Minimize Window</source>
- <translation type="unfinished">Minimiser la fenêtre</translation>
+ <translation>Minimiser la fenêtre</translation>
</message>
<message>
<source>Exit Full Screen or Seamless Mode</source>
- <translation type="unfinished">Quitter le mode plein écran ou intégré</translation>
+ <translation>Quitter le mode plein écran ou intégré</translation>
</message>
<message>
<source>Close VM</source>
- <translation type="unfinished">Fermer la machine</translation>
+ <translation>Fermer la machine</translation>
</message>
</context>
<context>
@@ -7573,7 +7615,7 @@
</message>
<message>
<source>The network operation failed with the following error: %1.</source>
- <translation type="unfinished"></translation>
+ <translation>L'opération réseau a échoué avec l'erreur suivante : %1.</translation>
</message>
</context>
<context>
@@ -7600,27 +7642,27 @@
<name>UINetworkReplyPrivate</name>
<message>
<source>Host not found</source>
- <translation type="unfinished"></translation>
+ <translation>Hôte introuvable</translation>
</message>
<message>
<source>Content access denied</source>
- <translation type="unfinished"></translation>
+ <translation>Accès au contenu refusé</translation>
</message>
<message>
<source>Protocol failure</source>
- <translation type="unfinished"></translation>
+ <translation>Défaillance de protocole</translation>
</message>
<message>
<source>Wrong SSL certificate format</source>
- <translation type="unfinished"></translation>
+ <translation>Mauvais format de certificat SSL</translation>
</message>
<message>
<source>SSL authentication failed</source>
- <translation type="unfinished"></translation>
+ <translation>Défaillance d'authentification SSL</translation>
</message>
<message>
<source>Unknown reason</source>
- <translation type="unfinished"></translation>
+ <translation>Raison inconnue</translation>
</message>
</context>
<context>
@@ -8079,7 +8121,7 @@ And the size is not necessarily "in megabytes", the slider chooses the
<name>UIPopupCenter</name>
<message>
<source>Click for full details</source>
- <translation type="unfinished"></translation>
+ <translation>Cliquez pour afficher tous les détails</translation>
</message>
</context>
<context>
@@ -8201,11 +8243,11 @@ And the size is not necessarily "in megabytes", the slider chooses the
</message>
<message>
<source><b>%1</b> page:</source>
- <translation type="unfinished"></translation>
+ <translation>Page <b>%1</b> :</translation>
</message>
<message>
<source><b>%1: %2</b> page:</source>
- <translation type="unfinished"></translation>
+ <translation>Page <b>%1:%2</b> :</translation>
</message>
</context>
<context>
@@ -8991,39 +9033,39 @@ And the size is not necessarily "in megabytes", the slider chooses the
</message>
<message>
<source>Storage settings</source>
- <translation type="unfinished"></translation>
+ <translation>Paramètres de stockage</translation>
</message>
<message>
<source>Please choose a file to export the virtual appliance to</source>
- <translation type="unfinished"></translation>
+ <translation>Veuillez choisir un fichier vers lequel exporter l'application virtuelle</translation>
</message>
<message>
<source>F&ormat:</source>
- <translation type="unfinished"></translation>
+ <translation>F&ormat :</translation>
</message>
<message>
<source>OVF 0.9</source>
- <translation type="unfinished"></translation>
+ <translation>OVF 0.9</translation>
</message>
<message>
<source>OVF 1.0</source>
- <translation type="unfinished"></translation>
+ <translation>OVF 1.0</translation>
</message>
<message>
<source>OVF 2.0</source>
- <translation type="unfinished"></translation>
+ <translation>OVF 2.0</translation>
</message>
<message>
<source>Write in standard OVF 1.0 format.</source>
- <translation type="unfinished"></translation>
+ <translation>Enregistrer au format OVF 1.0 standard.</translation>
</message>
<message>
<source>Write in new experimental OVF 2.0 format.</source>
- <translation type="unfinished"></translation>
+ <translation>Enregistrer dans le nouveau format expérimental OVF 2.0.</translation>
</message>
<message>
<source>&Storage settings</source>
- <translation type="unfinished"></translation>
+ <translation>Paramètres de &stockage</translation>
</message>
</context>
<context>
@@ -9042,14 +9084,15 @@ And the size is not necessarily "in megabytes", the slider chooses the
</message>
<message>
<source>Choose a file to export the virtual appliance to...</source>
- <translation type="unfinished"></translation>
+ <translation>Choisissez un fichier vers lequel exporter l'application virtuelle...</translation>
</message>
</context>
<context>
<name>UIWizardExportAppPageExpert</name>
<message>
<source>Choose a file to export the virtual appliance to...</source>
- <translation type="unfinished"></translation>
+ <translatorcomment>[BM]Appliance has several translations in French (Appareil, Instrument, Application). None is actually fully satisfying.</translatorcomment>
+ <translation>Choisissez un fichier sur lequel exporter l'application virtuelle...</translation>
</message>
</context>
<context>
@@ -9119,15 +9162,15 @@ And the size is not necessarily "in megabytes", the slider chooses the
</message>
<message>
<source>Import Virtual Appliance</source>
- <translation type="unfinished"></translation>
+ <translation>Importer l'application virtuelle</translation>
</message>
<message>
<source>Choose a virtual appliance file to import...</source>
- <translation type="unfinished"></translation>
+ <translation>Choisir un fichier d'application virtuelle à importer...</translation>
</message>
<message>
<source>Please choose a virtual appliance file to import</source>
- <translation type="unfinished"></translation>
+ <translation>Veuillez choisir un fichier d'application virtuelle à importer</translation>
</message>
</context>
<context>
@@ -9358,7 +9401,7 @@ And the size is not necessarily "in megabytes", the slider chooses the
</message>
<message>
<source>Choose...</source>
- <translation type="unfinished"></translation>
+ <translation>Choisir...</translation>
</message>
</context>
<context>
@@ -9368,8 +9411,8 @@ And the size is not necessarily "in megabytes", the slider chooses the
<translation><réinitialiser le chemin></translation>
</message>
<message>
- <source>The actual default path value will be displayed after accepting the changes and opening this window again.</source>
- <translation type="unfinished">Le chemin par défaut sera affiché si vous acceptez les modifications et rouvrez cette fenêtre.</translation>
+ <source>The actual default path value will be displayed after accepting the changes and opening this dialog again.</source>
+ <translation type="obsolete">Le chemin par défaut sera affiché si vous acceptez les modifications et rouvrez cette fenêtre.</translation>
</message>
<message>
<source><not selected></source>
@@ -9417,8 +9460,7 @@ And the size is not necessarily "in megabytes", the slider chooses the
</message>
<message>
<source>The actual default path value will be displayed after accepting the changes and opening this window again.</source>
- <comment>new</comment>
- <translation type="obsolete">Le chemin par défaut sera affiché si vous acceptez les modifications et rouvrez cette fenêtre.</translation>
+ <translation>La valeur du chemin par défaut actuelle sera affichée une fois les changements acceptés et cette fenêtre réouverte.</translation>
</message>
</context>
<context>
@@ -10968,7 +11010,7 @@ And the size is not necessarily "in megabytes", the slider chooses the
<message>
<source>Description</source>
<comment>DetailsElementType</comment>
- <translation>Description</translation>
+ <translation>Déscription</translation>
</message>
<message>
<source>Please choose a virtual hard drive file</source>
@@ -11025,65 +11067,70 @@ And the size is not necessarily "in megabytes", the slider chooses the
<message>
<source>Enabled</source>
<comment>details report (Unrestricted Execution)</comment>
- <translation type="unfinished"></translation>
+ <translation>Activée</translation>
</message>
<message>
<source>Disabled</source>
<comment>details report (Unrestricted Execution)</comment>
- <translation type="unfinished"></translation>
+ <translation>Désactivée</translation>
</message>
<message>
<source>Unrestricted Execution</source>
<comment>details report</comment>
- <translation type="unfinished"></translation>
+ <translation>Exécution sans restriction</translation>
</message>
<message>
<source>PS/2 Mouse</source>
<comment>PointingHIDType</comment>
- <translation type="unfinished"></translation>
+ <translation>Souris PS/2</translation>
</message>
<message>
<source>USB Mouse</source>
<comment>PointingHIDType</comment>
- <translation type="unfinished"></translation>
+ <translation>Souris USB</translation>
</message>
<message>
<source>PS/2 and USB Mouse</source>
<comment>PointingHIDType</comment>
- <translation type="unfinished"></translation>
+ <translation>Souris PS/2 et USB</translation>
+ </message>
+ <message>
+ <source>Enabled</source>
+ <comment>unrestricted execution</comment>
+ <translation type="obsolete">Activée</translation>
+ </message>
+ <message>
+ <source>Disabled</source>
+ <comment>unrestricted execution</comment>
+ <translation type="obsolete">Désactivée</translation>
</message>
<message>
<source>Unrestricted Execution</source>
- <translation type="unfinished"></translation>
+ <translation>Exécution sans restriction</translation>
</message>
<message>
<source>USB Tablet</source>
<comment>PointingHIDType</comment>
- <translation type="unfinished"></translation>
+ <translation>Tablette USB</translation>
</message>
<message>
<source>USB Multi-Touch Tablet</source>
<comment>PointingHIDType</comment>
- <translation type="unfinished"></translation>
+ <translation>Tablette USB Multi-Touch</translation>
</message>
<message>
<source>NAT Network</source>
<comment>NetworkAttachmentType</comment>
- <translation type="unfinished"></translation>
+ <translation>Réseau NAT</translation>
</message>
<message>
<source>NAT network, '%1'</source>
<comment>details report (network)</comment>
- <translation type="unfinished"></translation>
+ <translation>Réseau NAT, '%1'</translation>
</message>
<message>
<source>You can create or add disk image files in the virtual machine settings.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>USB</source>
- <comment>StorageControllerType</comment>
- <translation type="obsolete">USB</translation>
+ <translation>Vous pouvez créer ou ajouter des fichiers d'image disque dans les réglages de la machine virtuelle.</translation>
</message>
</context>
<context>
@@ -12057,11 +12104,11 @@ And the size is not necessarily "in megabytes", the slider chooses the
</message>
<message>
<source>Configuration &Details</source>
- <translation type="unfinished"></translation>
+ <translation>&Détails de configuration</translation>
</message>
<message>
<source>&Runtime Information</source>
- <translation type="unfinished"></translation>
+ <translation>Info&rmations d'exécution</translation>
</message>
</context>
<context>
diff --git a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_gl_ES.ts b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_gl_ES.ts
index cedd5e9..97358f3 100644
--- a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_gl_ES.ts
+++ b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_gl_ES.ts
@@ -859,6 +859,10 @@
<comment>new</comment>
<translation type="obsolete">Montar a imaxe de instalación dos aplicativos para o sistema operativo convidado</translation>
</message>
+ <message>
+ <source>&Webcams</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIApplianceEditorWidget</name>
@@ -3956,6 +3960,14 @@ p, li { white-space: pre-wrap; }
<source>Select a filename for the screenshot ...</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>No Webcams Connected</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>No supported webcams connected to the host PC</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIMachineSettingsAudio</name>
@@ -6018,7 +6030,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source><p>The virtual machine window is optimized to work in <b>%1 bit</b> color mode but the virtual display is currently set to <b>%2 bit</b>.</p><p>Please open the display properties dialog of the guest OS and select a <b>%3 bit</b> color mode, if it is available, for best possible performance of the virtual video subsystem.</p><p><b>Note</b>. Some operating systems, like [...]
- <translation><p>A xanela da máquina virtual está optimizada para traballar no modo de cor de <b>%1 bit</b> pero o modo de cor da pantalla virtual está definida a <b>%2 bit</b>.</p><p>Abre o diálogo de propiedades da pantalla do sistema operativo convidado e seleccione un modo de cor de <b>%3 bit</b>, se este está dispoñíbel, para obter un mellor rendemento do subsistema de vídeo virtual.</p>< [...]
+ <translation type="obsolete"><p>A xanela da máquina virtual está optimizada para traballar no modo de cor de <b>%1 bit</b> pero o modo de cor da pantalla virtual está definida a <b>%2 bit</b>.</p><p>Abre o diálogo de propiedades da pantalla do sistema operativo convidado e seleccione un modo de cor de <b>%3 bit</b>, se este está dispoñíbel, para obter un mellor rendemento do subsistema de vídeo virtu [...]
</message>
<message>
<source><p>You didn'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 window or the First Run Wizard.</p><p>Do you wish to continue?</p></source>
@@ -7166,6 +7178,18 @@ p, li { white-space: pre-wrap; }
<source><p>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 <b>Insert Guest Additions CD image</b> from the <b>Devices</b> menu. If they are installed but the machine is not yet fully starte [...]
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Failed to attach the webcam <b>%1</b> to the virtual machine <b>%2</b>.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to detach the webcam <b>%1</b> from the virtual machine <b>%2</b>.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p>The virtual screen is currently set to a <b>%1 bit</b> color mode. For better performance please change this to <b>%2 bit</b>. This can usually be done from the <b>Display</b> section of the guest operating system's Control Panel or System Settings.</p></source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIMiniProcessWidgetAdditions</name>
diff --git a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_hu.ts b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_hu.ts
index d0afb7e..08522bf 100644
--- a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_hu.ts
+++ b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_hu.ts
@@ -365,7 +365,7 @@
</message>
<message>
<source>Show Session Information Window</source>
- <translation type="unfinished">Munkamenet információk megjelenítése</translation>
+ <translation>Munkamenet információk megjelenítése</translation>
</message>
<message>
<source>&Pause</source>
@@ -457,11 +457,11 @@
</message>
<message>
<source>&Insert Guest Additions CD image...</source>
- <translation type="unfinished">&Integrációs szolgáltatások telepítése...</translation>
+ <translation>&Integrációs szolgáltatások telepítése...</translation>
</message>
<message>
<source>Insert the Guest Additions disk file into the virtual drive</source>
- <translation type="unfinished">Integrációs szolgáltatások telepítő CD-kép felcsatolása</translation>
+ <translation>Integrációs szolgáltatások telepítő CD-kép felcsatolása</translation>
</message>
<message>
<source>De&bug</source>
@@ -1010,6 +1010,10 @@
<comment>new</comment>
<translation type="obsolete">Munkamenet információk megjelenítése</translation>
</message>
+ <message>
+ <source>&Webcams</source>
+ <translation>&Webkamerák</translation>
+ </message>
</context>
<context>
<name>UIApplianceEditorWidget</name>
@@ -4611,6 +4615,14 @@ p, li { white-space: pre-wrap; }
<source>Select a filename for the screenshot ...</source>
<translation>Válassz nevet a képernyőmentésnek ...</translation>
</message>
+ <message>
+ <source>No Webcams Connected</source>
+ <translation>Nincs webkamera csatlakoztatva</translation>
+ </message>
+ <message>
+ <source>No supported webcams connected to the host PC</source>
+ <translation>Nincs támogatott webkamera a gazda PC-hez csatlakoztatva</translation>
+ </message>
</context>
<context>
<name>UIMachineSettingsAudio</name>
@@ -5683,7 +5695,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>Window</source>
- <translation type="unfinished"></translation>
+ <translation>Ablak</translation>
</message>
</context>
<context>
@@ -7082,7 +7094,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source><p>The virtual machine window is optimized to work in <b>%1 bit</b> color mode but the virtual display is currently set to <b>%2 bit</b>.</p><p>Please open the display properties dialog of the guest OS and select a <b>%3 bit</b> color mode, if it is available, for best possible performance of the virtual video subsystem.</p><p><b>Note</b>. Some operating systems, like [...]
- <translation><p>A virtuális gép ablaka <b>%1 bites</b> színmélységű munkára van optimalizálva, de a virtuális megjelenítő jelenlegi színmélysége <b>%2 bit</b>.</p><p>Nyisd meg a vendég OS megjelenítési tulajdonságait és válassz egy <b>%3 bites</b> módot, ha elérhető, a virtuális videóalrendszer legjobb teljesítménye érdekében.</p><p><b>Megjegyzés</b>. Néhány operációs rendszer [...]
+ <translation type="obsolete"><p>A virtuális gép ablaka <b>%1 bites</b> színmélységű munkára van optimalizálva, de a virtuális megjelenítő jelenlegi színmélysége <b>%2 bit</b>.</p><p>Nyisd meg a vendég OS megjelenítési tulajdonságait és válassz egy <b>%3 bites</b> módot, ha elérhető, a virtuális videóalrendszer legjobb teljesítménye érdekében.</p><p><b>Megjegyzés</b>. Néhány op [...]
</message>
<message>
<source><p>You didn'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 window or the First Run Wizard.</p><p>Do you wish to continue?</p></source>
@@ -7171,7 +7183,7 @@ p, li { white-space: pre-wrap; }
<message>
<source>Insert</source>
<comment>additions</comment>
- <translation type="unfinished">Csatolás</translation>
+ <translation>Csatolás</translation>
</message>
<message>
<source><p>The host key is currently defined as <b>%1</b>.</p></source>
@@ -7933,7 +7945,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source><p>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 <b>Insert Guest Additions CD image</b> from the <b>Devices</b> menu. If they are installed but the machine is not yet fully starte [...]
- <translation type="unfinished"><p>Ú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 <b>Eszközök</b> menüben az <b>Integrációs szolgáltatások telepítése...</b> választásával. Ha telepítve vannak, de a gép [...]
+ <translation><p>Ú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 <b>Eszközök</b> menüben az <b>Integrációs szolgáltatások telepítése...</b> választásával. Ha telepítve vannak, a megosztott mappák elérhe [...]
</message>
<message>
<source><p>The virtual machine window will be now switched to <b>fullscreen</b> mode. You can go back to windowed mode at any time by pressing <b>%1</b>.</p><p>Note that the <i>Host</i> key is currently defined as <b>%2</b>.</p><p>Note that the main menu bar is hidden in fullscreen mode. You can access it by pressing <b>Host+Home</b>.</p></source>
@@ -8462,6 +8474,18 @@ p, li { white-space: pre-wrap; }
<comment>additions-new</comment>
<translation type="obsolete">Csatolás</translation>
</message>
+ <message>
+ <source>Failed to attach the webcam <b>%1</b> to the virtual machine <b>%2</b>.</source>
+ <translation>Webkamera (<b>%1</b>) csatlakoztatása sikertelen a virtuális géphez: <b>%2</b>.</translation>
+ </message>
+ <message>
+ <source>Failed to detach the webcam <b>%1</b> from the virtual machine <b>%2</b>.</source>
+ <translation>Webkamera (<b>%1</b>) leválasztása sikertelen a virtuális gépről: <b>%2</b>.</translation>
+ </message>
+ <message>
+ <source><p>The virtual screen is currently set to a <b>%1 bit</b> color mode. For better performance please change this to <b>%2 bit</b>. This can usually be done from the <b>Display</b> section of the guest operating system's Control Panel or System Settings.</p></source>
+ <translation><p>A virtuális képernyő jelenleg <b>%1 bit</b> színmódra van beállítva. A jobb teljesítmény érdekében, állítsd át <b>%2 bitre</b>. Ez alapesetben megtehető a vendég operációs rendszer Vezérlőpult vagy Rendszerbeállítások. <b>Képernyő</b> részében.</p></translation>
+ </message>
</context>
<context>
<name>UIMiniProcessWidgetAdditions</name>
@@ -11968,7 +11992,7 @@ Verzió %1</translation>
</message>
<message>
<source>The actual default path value will be displayed after accepting the changes and opening this window again.</source>
- <translation type="unfinished">Az aktuális alapértelmezés akkor lesz kijelezve, ha a változásokat elfogadod, és ezt az ablakot újra megnyitod.</translation>
+ <translation>Az aktuális alapértelmezés akkor lesz kijelezve, ha a változásokat elfogadod, és ezt az ablakot újra megnyitod.</translation>
</message>
<message>
<source><not selected></source>
diff --git a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_id.ts b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_id.ts
index 1d6ea90..620fdcf 100644
--- a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_id.ts
+++ b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_id.ts
@@ -93,7 +93,7 @@
</message>
<message>
<source>Incompatible Qt Library Error</source>
- <translation>Kesalahan inkompatibilitas Qt Library</translation>
+ <translation>Kesalahan inkompatibilitas Pustaka Qt</translation>
</message>
<message>
<source>VirtualBox - Error In %1</source>
@@ -105,7 +105,7 @@
</message>
<message>
<source>Please try reinstalling VirtualBox.</source>
- <translation>Coba instal ulang VirtualBox.</translation>
+ <translation>Harap pasang ulang VirtualBox.</translation>
</message>
<message>
<source>Make sure the kernel module has been loaded successfully.</source>
@@ -129,11 +129,11 @@
</message>
<message>
<source>The VirtualBox kernel modules do not match this version of VirtualBox. The installation of VirtualBox was apparently not successful. Please try completely uninstalling and reinstalling VirtualBox.</source>
- <translation>Modul kernel VirtualBox tak cocok dengan versi VirtualBox ini. Instalasi VirtualBox sepertinya tak sukses. Silakan coba membongkar seluruhnya dan menginstal ulang VirtualBox.</translation>
+ <translation>Modul kernel VirtualBox tak cocok dengan versi VirtualBox ini. Instalasi VirtualBox sepertinya tak sukses. Silakan coba membongkar seluruhnya dan memasang ulang VirtualBox.</translation>
</message>
<message>
<source>The VirtualBox kernel modules do not match this version of VirtualBox. The installation of VirtualBox was apparently not successful. Executing<br/><br/> <font color=blue>'/etc/init.d/vboxdrv setup'</font><br/><br/>may correct this. Make sure that you do not mix the OSE version and the PUEL version of VirtualBox.</source>
- <translation>Modul kernel VirtualBox tak cocok dengan versi VirtualBox ini. Instalasi VirtualBox sepertinya tak sukses. Menjalankan <br/><br/> <font color=blue>'/etc/init.d/vboxdrv setup'</font><br/><br/>mungkin memperbaiki hal ini. Pastikan bahwa Anda tak mencampur VirtualBox versi OSE dan versi PUEL.</translation>
+ <translation>Modul kernel VirtualBox tidak cocok dengan versi VirtualBox ini. Instalasi VirtualBox sepertinya tak sukses. Menjalankan <br/><br/> <font color=blue>'/etc/init.d/vboxdrv setup'</font><br/><br/>mungkin memperbaiki hal ini. Pastikan bahwa Anda tak mencampur VirtualBox versi OSE dan versi PUEL.</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.</source>
@@ -141,7 +141,7 @@
</message>
<message>
<source>The VirtualBox Linux kernel driver (vboxdrv) is either not loaded or there is a permission problem with /dev/vboxdrv. Please reinstall the kernel module by executing<br/><br/> <font color=blue>'/etc/init.d/vboxdrv setup'</font><br/><br/>as root. If it is available in your distribution, you should install the DKMS package first. This package keeps track of Linux kernel changes and recompiles the vboxdrv kernel module if necess [...]
- <translation>Driver VirtualBox untuk kernel Linux (vboxdrv) mungkin tak dimuat atau ada masalah ijin dengan /dev/vboxdrv. Silakan instal ulang modul kernel dengan menjalankan<br/><br/> <font color=blue>'/etc/init.d/vboxdrv setup'</font><br/><br/>sebagai root. Bila tersedia untuk distribusi Anda, Anda mesti terlebih dahulu memasang paket DKMS. Paket ini mencatat perubahan kernel Linux dan mengkompail ulang modul kernel vboxdrv bila di [...]
+ <translation>Driver VirtualBox untuk kernel Linux (vboxdrv) mungkin tidak dimuat atau ada masalah ijin dengan /dev/vboxdrv. Silakan pasang ulang modul kernel dengan menjalankan<br/><br/> <font color=blue>'/etc/init.d/vboxdrv setup'</font><br/><br/>sebagai root. Bila tersedia untuk distribusi Anda, Anda mesti terlebih dahulu memasang paket DKMS. Paket ini mencatat perubahan kernel Linux dan mengkompail ulang modul kernel vboxdrv bila [...]
</message>
</context>
<context>
@@ -163,7 +163,7 @@
</message>
<message>
<source>Select a file</source>
- <translation>Pilih sebuah file</translation>
+ <translation>Pilih sebuah berkas</translation>
</message>
</context>
<context>
@@ -223,7 +223,7 @@
</message>
<message>
<source>Copy all errors to the clipboard</source>
- <translation>Salin semua error ke clipboard</translation>
+ <translation>Salin semua kesalahan ke papan klip</translation>
</message>
<message>
<source>Copy</source>
@@ -293,7 +293,7 @@
</message>
<message>
<source>Automatically resize the guest display when the window is resized (requires Guest Additions)</source>
- <translation>Resize tampilan guest secara otomatis saat window diresize (membutuhkan Guest Additions)</translation>
+ <translation>Ubah ukuran tampilan guest secara otomatis saat jendela diubah ukurannya (membutuhkan Guest Additions)</translation>
</message>
<message>
<source>&Adjust Window Size</source>
@@ -301,15 +301,15 @@
</message>
<message>
<source>Adjust window size and position to best fit the guest display</source>
- <translation>Sesuaikan ukuran dan posisi windows untuk tampilan terbaik pada display guest</translation>
+ <translation>Atur ukuran dan posisi windows agar paling pas dengan tampilan guest</translation>
</message>
<message>
<source>Disable &Mouse Integration</source>
- <translation>Matikan Integrasi &Mouse</translation>
+ <translation>Nonaktifkan Integrasi &Tetikus</translation>
</message>
<message>
<source>Temporarily disable host mouse pointer integration</source>
- <translation>Mematikan sementara integrasi mouse pointer pada host</translation>
+ <translation>Mematikan sementara integrasi penunjuk tetikus pada host</translation>
</message>
<message>
<source>Enable &Mouse Integration</source>
@@ -321,11 +321,11 @@
</message>
<message>
<source>&Insert Ctrl-Alt-Del</source>
- <translation>&Insert Ctrl+Alt+Del</translation>
+ <translation>S&isipkan Ctrl+Alt+Del</translation>
</message>
<message>
<source>Send the Ctrl-Alt-Del sequence to the virtual machine</source>
- <translation>Kirim sekuens Ctrl+Alt+Del pada mesin virtual</translation>
+ <translation>Kirim urutan Ctrl+Alt+Del ke mesin virtual</translation>
</message>
<message>
<source>&Insert Ctrl-Alt-Backspace</source>
@@ -333,7 +333,7 @@
</message>
<message>
<source>Send the Ctrl-Alt-Backspace sequence to the virtual machine</source>
- <translation>Kirim sekuens Ctrl+Alt+Backspace pada mesin virtual</translation>
+ <translation>Kirim urutan Ctrl+Alt+Backspace ke mesin virtual</translation>
</message>
<message>
<source>Take &Snapshot...</source>
@@ -341,7 +341,7 @@
</message>
<message>
<source>Take a snapshot of the virtual machine</source>
- <translation>Ambil Snapshot mesin virtual</translation>
+ <translation>Ambil snapshot mesin virtual</translation>
</message>
<message>
<source>Session I&nformation Dialog</source>
@@ -349,11 +349,11 @@
</message>
<message>
<source>Show Session Information Window</source>
- <translation type="unfinished">Tampilkan Dialog Informasi Sesi </translation>
+ <translation>Tampilkan Jendela Informasi Sesi </translation>
</message>
<message>
<source>&Pause</source>
- <translation>&Pause</translation>
+ <translation>&Istirahat</translation>
</message>
<message>
<source>Suspend the execution of the virtual machine</source>
@@ -377,7 +377,7 @@
</message>
<message>
<source>ACPI Sh&utdown</source>
- <translation></translation>
+ <translation>ACPI Sh&utdown</translation>
</message>
<message>
<source>ACPI S&hutdown</source>
@@ -385,7 +385,7 @@
</message>
<message>
<source>Send the ACPI Power Button press event to the virtual machine</source>
- <translation>Kirim Tombol Power ACPI event pada mesin virtual </translation>
+ <translation>Kirim kejadian penekanan Tombol Power ACPI ke mesin virtual </translation>
</message>
<message>
<source>&Close...</source>
@@ -393,31 +393,31 @@
</message>
<message>
<source>Close the virtual machine</source>
- <translation>Tutup Mesin Virtual</translation>
+ <translation>Tutup mesin virtual</translation>
</message>
<message>
<source>&View</source>
- <translation></translation>
+ <translation>&Tilik</translation>
</message>
<message>
<source>&Devices</source>
- <translation>&Device</translation>
+ <translation>&Perangkat</translation>
</message>
<message>
<source>&CD/DVD Devices</source>
- <translation></translation>
+ <translation>Perangkat &CD/DVD</translation>
</message>
<message>
<source>&Floppy Devices</source>
- <translation></translation>
+ <translation>Device &Floppy</translation>
</message>
<message>
<source>&USB Devices</source>
- <translation>Device &USB</translation>
+ <translation>Perangkat &USB</translation>
</message>
<message>
<source>Change the settings of network adapters</source>
- <translation></translation>
+ <translation>Ubah pengaturan adaptor jaringan</translation>
</message>
<message>
<source>&Shared Folders...</source>
@@ -425,7 +425,7 @@
</message>
<message>
<source>Create or modify shared folders</source>
- <translation>Buka dialog untuk beroperasi pada folder yang di share</translation>
+ <translation>Buat atau ubah folder bersama</translation>
</message>
<message>
<source>Enable or disable remote desktop (RDP) connections to this machine</source>
@@ -433,11 +433,11 @@
</message>
<message>
<source>&Insert Guest Additions CD image...</source>
- <translation type="unfinished">&Insert Guest Additions CD image...</translation>
+ <translation>Masukkan &image CD Guest Addition...</translation>
</message>
<message>
<source>Insert the Guest Additions disk file into the virtual drive</source>
- <translation type="unfinished">Pasang Guest Additions pada image instalasi</translation>
+ <translation>Masukkan berkas disk Guest Addition ke dalam drive virtual</translation>
</message>
<message>
<source>De&bug</source>
@@ -451,12 +451,12 @@
<message>
<source>&Command Line...</source>
<comment>debug action</comment>
- <translation>&Command Line...</translation>
+ <translation>&Baris Perintah...</translation>
</message>
<message>
<source>&Logging...</source>
<comment>debug action</comment>
- <translation type="unfinished">Pencatatan &Log...</translation>
+ <translation>Pencatatan &Log...</translation>
</message>
<message>
<source>&Help</source>
@@ -464,15 +464,15 @@
</message>
<message>
<source>Dock Icon</source>
- <translation></translation>
+ <translation>Ikon Dok</translation>
</message>
<message>
<source>Show Monitor Preview</source>
- <translation></translation>
+ <translation>Tampilkan Pratinjau Monitor</translation>
</message>
<message>
<source>Show Application Icon</source>
- <translation></translation>
+ <translation>Tampilkan Ikon Aplikasi</translation>
</message>
<message>
<source>Enable remote desktop (RDP) connections to this machine</source>
@@ -485,11 +485,11 @@
</message>
<message>
<source>Switch to &Fullscreen</source>
- <translation>Beralih ke &Fullscreen</translation>
+ <translation>Beralih ke &Layar Penuh</translation>
</message>
<message>
<source>Switch between normal and fullscreen mode</source>
- <translation>Bertukar antara mode normal dan fullscreen</translation>
+ <translation>Bertukar antara mode normal dan layar penuh</translation>
</message>
<message>
<source>Switch to Seam&less Mode</source>
@@ -525,130 +525,130 @@
</message>
<message>
<source>Show the log files of the selected virtual machine</source>
- <translation type="unfinished">Tampilkan file log pada mesin virtual terpilih</translation>
+ <translation>Tampilkan berkas log mesin virtual yang dipilih</translation>
</message>
<message>
<source>&Contents...</source>
- <translation type="unfinished">&Isi...</translation>
+ <translation>&Isi...</translation>
</message>
<message>
<source>Show help contents</source>
- <translation type="unfinished"></translation>
+ <translation>Tampilkan isi bantuan</translation>
</message>
<message>
<source>Open the browser and go to the VirtualBox product web site</source>
- <translation type="unfinished">Buka browser dan pergi ke website produk VirtualBox</translation>
+ <translation>Buka peramban dan pergi ke situs web produk VirtualBox</translation>
</message>
<message>
<source>Go back to showing all suppressed warnings and messages</source>
- <translation type="unfinished"></translation>
+ <translation>Kembali menampilkan semua peringatan dan pesan yang disembunyikan</translation>
</message>
<message>
<source>&Network Operations Manager...</source>
- <translation type="unfinished"></translation>
+ <translation>Ma&najer Operasi Jaringan...</translation>
</message>
<message>
<source>Show Network Operations Manager</source>
- <translation type="unfinished"></translation>
+ <translation>Tampilkan Manajer Operasi Jaringan</translation>
</message>
<message>
<source>Check for a new VirtualBox version</source>
- <translation type="unfinished">Periksa keberadaan versi baru VirtualBox</translation>
+ <translation>Periksa keberadaan versi baru VirtualBox</translation>
</message>
<message>
<source>&About VirtualBox...</source>
- <translation type="unfinished"></translation>
+ <translation>Tent&ang VirtualBox...</translation>
</message>
<message>
<source>Show a window with product information</source>
- <translation type="unfinished">Tunjukkan dialog dengan informasi produk</translation>
+ <translation>Tampilkan jendela dengan informasi produk</translation>
</message>
<message>
<source>Take Sn&apshot...</source>
- <translation type="unfinished"></translation>
+ <translation>&Ambil Snapshot...</translation>
</message>
<message>
<source>Take Screensh&ot...</source>
- <translation type="unfinished"></translation>
+ <translation>Ambil Cuplikan &Layar...</translation>
</message>
<message>
<source>Take a screenshot of the virtual machine</source>
- <translation type="unfinished"></translation>
+ <translation>Ambil cuplikan layar dari mesin virtual</translation>
</message>
<message>
<source>Ins&ert Ctrl-Alt-Backspace</source>
- <translation type="unfinished"></translation>
+ <translation>S&isipkan Ctrl+Alt+Backspace</translation>
</message>
<message>
<source>&File</source>
<comment>Mac OS X version</comment>
- <translation type="unfinished">&File</translation>
+ <translation>&Berkas</translation>
</message>
<message>
<source>&File</source>
<comment>Non Mac OS X version</comment>
- <translation type="unfinished">&File</translation>
+ <translation>&Berkas</translation>
</message>
<message>
<source>&Virtual Media Manager...</source>
- <translation type="unfinished">Manajer Media &Virtual...</translation>
+ <translation>Manajer Media &Virtual...</translation>
</message>
<message>
<source>Display the Virtual Media Manager window</source>
- <translation type="unfinished">Menampilkan dialog Manajer Disk Virtual</translation>
+ <translation>Menampilkan jendela Manajer Media Virtual</translation>
</message>
<message>
<source>&Import Appliance...</source>
- <translation type="unfinished">&Impor Appliance...</translation>
+ <translation>&Impor Appliance...</translation>
</message>
<message>
<source>Import an appliance into VirtualBox</source>
- <translation type="unfinished">Mengimpor suatu appliance ke dalam VirtualBox</translation>
+ <translation>Mengimpor suatu appliance ke dalam VirtualBox</translation>
</message>
<message>
<source>&Export Appliance...</source>
- <translation type="unfinished">&Ekspor Appliance...</translation>
+ <translation>&Ekspor Appliance...</translation>
</message>
<message>
<source>Export one or more VirtualBox virtual machines as an appliance</source>
- <translation type="unfinished">Mengekspor satu atau lebih mesin virtual VirtualBox sebagai appliance</translation>
+ <translation>Mengekspor satu atau lebih mesin virtual VirtualBox sebagai appliance</translation>
</message>
<message>
<source>&Preferences...</source>
<comment>global settings</comment>
- <translation type="unfinished">&Preferensi...</translation>
+ <translation>&Preferensi...</translation>
</message>
<message>
<source>Display the global settings window</source>
- <translation type="unfinished">Buka dialog setting global</translation>
+ <translation>Tampilkan jendela pengaturan global</translation>
</message>
<message>
<source>E&xit</source>
- <translation type="unfinished">&Keluar</translation>
+ <translation>&Keluar</translation>
</message>
<message>
<source>Close application</source>
- <translation type="unfinished">Tutup aplikasi</translation>
+ <translation>Tutup aplikasi</translation>
</message>
<message>
<source>&Group</source>
- <translation type="unfinished"></translation>
+ <translation>&Grup</translation>
</message>
<message>
<source>Create a new virtual machine</source>
- <translation type="unfinished">Ciptakan Mesin Virtual Baru</translation>
+ <translation>Ciptakan mesin virtual baru</translation>
</message>
<message>
<source>Add an existing virtual machine</source>
- <translation type="unfinished">Tambahkan mesin virtual yang telah ada</translation>
+ <translation>Tambahkan mesin virtual yang telah ada</translation>
</message>
<message>
<source>Rename the selected virtual machine group</source>
- <translation type="unfinished"></translation>
+ <translation>Ubah nama grup mesin virtual yang dipilih</translation>
</message>
<message>
<source>S&tart</source>
- <translation type="unfinished">M&ulai</translation>
+ <translation>M&ulai</translation>
</message>
<message>
<source>Start the selected virtual machine</source>
@@ -656,7 +656,7 @@
</message>
<message>
<source>S&how</source>
- <translation type="unfinished">T&ilkan</translation>
+ <translation>T&ilkan</translation>
</message>
<message>
<source>Switch to the window of the selected virtual machine</source>
@@ -664,15 +664,15 @@
</message>
<message>
<source>Re&fresh...</source>
- <translation type="unfinished"></translation>
+ <translation>Sega&rkan...</translation>
</message>
<message>
<source>Refresh the accessibility state of the selected virtual machine</source>
- <translation type="unfinished">Me-refresh keadaan akesibilitas pada mesin virtual terpilih</translation>
+ <translation>Menyegarkan keadaan akesibilitas pada mesin virtual yang dipilih</translation>
</message>
<message>
<source>Show in Finder</source>
- <translation type="unfinished">Tampilkan di Finder</translation>
+ <translation>Tampilkan di Finder</translation>
</message>
<message>
<source>Show the VirtualBox Machine Definition file in Finder.</source>
@@ -680,7 +680,7 @@
</message>
<message>
<source>Show in Explorer</source>
- <translation type="unfinished">Tampilkan di Explorer</translation>
+ <translation>Tampilkan di Explorer</translation>
</message>
<message>
<source>Show the VirtualBox Machine Definition file in Explorer.</source>
@@ -688,35 +688,35 @@
</message>
<message>
<source>Show in File Manager</source>
- <translation type="unfinished">Tampilkan di Manajer Berkas</translation>
+ <translation>Tampilkan di Manajer Berkas</translation>
</message>
<message>
<source>Show the VirtualBox Machine Definition file in the File Manager</source>
- <translation type="unfinished">Menampilkan file Definisi Mesin VirtualBox di dalam Manajer Berkas</translation>
+ <translation>Menampilkan berkas Definisi Mesin VirtualBox di dalam Manajer Berkas</translation>
</message>
<message>
<source>&New...</source>
- <translation type="unfinished">&Baru...</translation>
+ <translation>&Baru...</translation>
</message>
<message>
<source>&Add...</source>
- <translation type="unfinished">T&ambah...</translation>
+ <translation>T&ambah...</translation>
</message>
<message>
<source>Add a new group based on the items selected</source>
- <translation type="unfinished"></translation>
+ <translation>Tambahkan grup baru berdasarkan butir-butir yang dipilih</translation>
</message>
<message>
<source>Cl&one...</source>
- <translation type="unfinished">K&lon...</translation>
+ <translation>K&lon...</translation>
</message>
<message>
<source>Clone the selected virtual machine</source>
- <translation type="unfinished">Buat klon dari mesin virtual yang dipilih</translation>
+ <translation>Buat klon dari mesin virtual yang dipilih</translation>
</message>
<message>
<source>&Remove...</source>
- <translation type="unfinished"></translation>
+ <translation>&Hapus...</translation>
</message>
<message>
<source>Remove the selected virtual machine</source>
@@ -724,11 +724,11 @@
</message>
<message>
<source>Discard</source>
- <translation type="unfinished">Abaikan</translation>
+ <translation>Buang</translation>
</message>
<message>
<source>D&iscard saved state...</source>
- <translation type="unfinished"></translation>
+ <translation>Buang keadaan yang d&isimpan...</translation>
</message>
<message>
<source>Discard the saved state of the selected virtual machine</source>
@@ -736,7 +736,7 @@
</message>
<message>
<source>Create Alias on Desktop</source>
- <translation type="unfinished">Buat Alias pada Desktop</translation>
+ <translation>Buat Alias pada Desktop</translation>
</message>
<message>
<source>Creates an Alias file to the VirtualBox Machine Definition file on your Desktop.</source>
@@ -744,7 +744,7 @@
</message>
<message>
<source>Create Shortcut on Desktop</source>
- <translation type="unfinished">Buat Shortcut pada Desktop</translation>
+ <translation>Buat Pintasan pada Desktop</translation>
</message>
<message>
<source>Creates an Shortcut file to the VirtualBox Machine Definition file on your Desktop.</source>
@@ -752,171 +752,171 @@
</message>
<message>
<source>&Close</source>
- <translation type="unfinished">&Tutup</translation>
+ <translation>&Tutup</translation>
</message>
<message>
<source>Show &Log...</source>
- <translation type="unfinished">Tampilkan &Log...</translation>
+ <translation>Tampilkan &Log...</translation>
</message>
<message>
<source>&VirtualBox Web Site...</source>
- <translation type="unfinished">Website &VirtualBox...</translation>
+ <translation>Situs Web &VirtualBox...</translation>
</message>
<message>
<source>&Reset All Warnings</source>
- <translation type="unfinished">&Reset Semua Peringatan</translation>
+ <translation>&Reset Semua Peringatan</translation>
</message>
<message>
<source>C&heck for Updates...</source>
- <translation type="unfinished">&Periksa Update...</translation>
+ <translation>&Periksa Pemutakhiran...</translation>
</message>
<message>
<source>Rena&me Group...</source>
- <translation type="unfinished"></translation>
+ <translation>Ubah Na&ma Grup...</translation>
</message>
<message>
<source>Sort the items of the selected virtual machine group alphabetically</source>
- <translation type="unfinished"></translation>
+ <translation>Urutkan butir-butir grup mesin virtual yang dipilih secara alfabet</translation>
</message>
<message>
<source>Remove the selected virtual machines</source>
- <translation type="unfinished"></translation>
+ <translation>Hapus mesin virtual yang dipilih</translation>
</message>
<message>
<source>Start the selected virtual machines</source>
- <translation type="unfinished"></translation>
+ <translation>Mulai jalankan mesin virtual yang dipilih</translation>
</message>
<message>
<source>Switch to the windows of the selected virtual machines</source>
- <translation type="unfinished"></translation>
+ <translation>Berpindah ke jendela mesin virtual yang dipilih</translation>
</message>
<message>
<source>Suspend the execution of the selected virtual machines</source>
- <translation type="unfinished"></translation>
+ <translation>Tahan eksekusi mesin virtual yang dipilih</translation>
</message>
<message>
<source>Reset the selected virtual machines</source>
- <translation type="unfinished"></translation>
+ <translation>Reset mesin virtual yang dipilih</translation>
</message>
<message>
<source>Discard the saved state of the selected virtual machines</source>
- <translation type="unfinished"></translation>
+ <translation>Buang keadaan tersimpan pada mesin virtual terpilih</translation>
</message>
<message>
<source>Show the VirtualBox Machine Definition file in Finder</source>
- <translation type="unfinished"></translation>
+ <translation>Tampilkan berkas Definisi Mesin VirtualBox di dalam Finder</translation>
</message>
<message>
<source>Show the VirtualBox Machine Definition file in Explorer</source>
- <translation type="unfinished"></translation>
+ <translation>Tampilkan berkas Definisi Mesin VirtualBox di dalam Explorer</translation>
</message>
<message>
<source>Creates an alias file to the VirtualBox Machine Definition file on your desktop</source>
- <translation type="unfinished"></translation>
+ <translation>Membuat berkas alias ke berkas Definisi Mesin VirtualBox pada desktop Anda</translation>
</message>
<message>
<source>Creates an shortcut file to the VirtualBox Machine Definition file on your desktop</source>
- <translation type="unfinished"></translation>
+ <translation>Membuat suatu berkas pintasan ke berkas Definisi Mesin VirtualBox pada desktop Anda</translation>
</message>
<message>
<source>Save State</source>
- <translation type="unfinished"></translation>
+ <translation>Simpan Keadaan</translation>
</message>
<message>
<source>Save the machine state of the selected virtual machines</source>
- <translation type="unfinished"></translation>
+ <translation>Simpan keadaan mesin dari mesin virtual yang dipilih</translation>
</message>
<message>
<source>Send the ACPI Power Button press event to the selected virtual machines</source>
- <translation type="unfinished"></translation>
+ <translation>Kirim kejadian penekanan Tombol Power ACPI ke mesin virtual yang dipilih</translation>
</message>
<message>
<source>Po&wer Off</source>
- <translation type="unfinished"></translation>
+ <translation>Matikan &Daya</translation>
</message>
<message>
<source>Power off the selected virtual machines</source>
- <translation type="unfinished"></translation>
+ <translation>Matikan mesin virtual yang dipilih</translation>
</message>
<message>
<source>&New Machine...</source>
- <translation type="unfinished"></translation>
+ <translation>Mesi&n Baru...</translation>
</message>
<message>
<source>&Add Machine...</source>
- <translation type="unfinished"></translation>
+ <translation>T&ambah Mesin...</translation>
</message>
<message>
<source>&Ungroup...</source>
- <translation type="unfinished"></translation>
+ <translation>Bongkar Gr&up...</translation>
</message>
<message>
<source>Ungroup items of the selected virtual machine group</source>
- <translation type="unfinished"></translation>
+ <translation>Bongkar grup dari mesin virtual yang dipilih</translation>
</message>
<message>
<source>Sort</source>
- <translation type="unfinished"></translation>
+ <translation>Urutkan</translation>
</message>
<message>
<source>Gro&up</source>
- <translation type="unfinished"></translation>
+ <translation>Gr*up</translation>
</message>
<message>
<source>Sort the group of the first selected machine alphabetically</source>
- <translation type="unfinished"></translation>
+ <translation>Urutkan grup dari mesin yang dipilih pertama secara alfabet</translation>
</message>
<message>
<source>Shared &Clipboard</source>
- <translation type="unfinished"></translation>
+ <translation>Papan Klip Ber&sama</translation>
</message>
<message>
<source>Drag'n'Drop</source>
- <translation type="unfinished"></translation>
+ <translation>Drag'n'Drop</translation>
</message>
<message>
<source>Save the machine state of the virtual machine</source>
- <translation type="unfinished"></translation>
+ <translation>Simpan keadaan mesin dari mesin virtual</translation>
</message>
<message>
<source>Power off the virtual machine</source>
- <translation type="unfinished"></translation>
+ <translation>Matikan mesin virtual</translation>
</message>
<message>
<source>&Network Settings...</source>
- <translation type="unfinished"></translation>
+ <translation>Pengatura&n Jaringan...</translation>
</message>
<message>
<source>&Shared Folders Settings...</source>
- <translation type="unfinished"></translation>
+ <translation>Pengaturan Folder Ber&sama...</translation>
</message>
<message>
<source>R&emote Display</source>
- <translation type="unfinished"></translation>
+ <translation>Tamp&ilan Jarak Jauh</translation>
</message>
<message>
<source>Toggle remote desktop (RDP) connections to this machine</source>
- <translation type="unfinished"></translation>
+ <translation></translation>
</message>
<message>
<source>&Video Capture</source>
- <translation type="unfinished"></translation>
+ <translation>Tangkapan &Video</translation>
</message>
<message>
<source>Toggle video capture</source>
- <translation type="unfinished"></translation>
+ <translation></translation>
</message>
<message>
<source>&Video Capture Settings...</source>
- <translation type="unfinished"></translation>
+ <translation>Pengaturan Tangkapan &Video...</translation>
</message>
<message>
<source>Configure video capture settings</source>
- <translation type="unfinished"></translation>
+ <translation>Tata pengaturan penangkapan video</translation>
</message>
<message>
<source>Popup Menu</source>
- <translation type="unfinished"></translation>
+ <translation>Menu Popup</translation>
</message>
<message>
<source>&Insert Guest Additions CD image...</source>
@@ -928,6 +928,10 @@
<comment>new</comment>
<translation type="obsolete">Pasang Guest Additions pada image instalasi</translation>
</message>
+ <message>
+ <source>&Webcams</source>
+ <translation>&Webcam</translation>
+ </message>
</context>
<context>
<name>UIApplianceEditorWidget</name>
@@ -1017,7 +1021,7 @@
</message>
<message>
<source>Unknown Hardware Item</source>
- <translation>Item Hardware Tak Dikenal</translation>
+ <translation>Item Perangkat Keras Yang Tak Dikenal</translation>
</message>
<message>
<source>MB</source>
@@ -1570,7 +1574,7 @@
</message>
<message>
<source>The selected virtual machine is <i>inaccessible</i>. Please inspect the error message shown below and press the <b>Refresh</b> button if you want to repeat the accessibility check:</source>
- <translation>Mesin virtual yang dipilih <i>tidak dapat diakses</i>. Mohon periksa pesan kesalahan yang ditunjukkan di bawah ini dan tekan tombol <b>Refresh</b> bila Anda ingin mengulang pemeriksaan aksesibilitas:</translation>
+ <translation>Mesin virtual yang dipilih <i>tidak dapat diakses</i>. Mohon periksa pesan kesalahan yang ditunjukkan di bawah ini dan tekan tombol <b>Segarkan</b> bila Anda ingin mengulang pemeriksaan aksesibilitas:</translation>
</message>
<message>
<source>General</source>
@@ -1657,14 +1661,14 @@
<name>UIDnDHandler</name>
<message>
<source>Dropping data ...</source>
- <translation type="unfinished"></translation>
+ <translation>Menjatuhkan data ...</translation>
</message>
</context>
<context>
<name>UIDnDMimeData</name>
<message>
<source>Dropping data ...</source>
- <translation type="unfinished"></translation>
+ <translation>Menjatuhkan data ...</translation>
</message>
</context>
<context>
@@ -1703,11 +1707,11 @@
</message>
<message>
<source>Looking for %1...</source>
- <translation type="unfinished"></translation>
+ <translation>Mencari %1...</translation>
</message>
<message>
<source>Downloading %1...</source>
- <translation type="unfinished"></translation>
+ <translation>Mengunduh %1...</translation>
</message>
</context>
<context>
@@ -1734,29 +1738,29 @@
</message>
<message>
<source>VirtualBox Guest Additions</source>
- <translation type="unfinished"></translation>
+ <translation>Guest Additions VirtualBox</translation>
</message>
</context>
<context>
<name>UIDownloaderExtensionPack</name>
<message>
<source>Select folder to save %1 to</source>
- <translation>Pilih folder untuk menyimpan %1</translation>
+ <translation>Pilih folder tempat menyimpan %1</translation>
</message>
<message>
<source>VirtualBox Extension Pack</source>
- <translation type="unfinished"></translation>
+ <translation>Extension Pack VirtualBox</translation>
</message>
</context>
<context>
<name>UIDownloaderUserManual</name>
<message>
<source>Select folder to save User Manual to</source>
- <translation>Pilih folder untuk menyimpan Manual Pengguna</translation>
+ <translation>Pilih folder tempat menyimpan Manual Pengguna</translation>
</message>
<message>
<source>VirtualBox User Manual</source>
- <translation type="unfinished"></translation>
+ <translation>Manual Pengguna VirtualBox</translation>
</message>
</context>
<context>
@@ -2093,66 +2097,66 @@
<message>
<source><b>%1</b></source>
<comment>Group item tool-tip / Group name</comment>
- <translation type="unfinished"></translation>
+ <translation><b>%1</b></translation>
</message>
<message numerus="yes">
<source>%n group(s)</source>
<comment>Group item tool-tip / Group info</comment>
- <translation type="unfinished">
- <numerusform></numerusform>
+ <translation>
+ <numerusform>%n grup</numerusform>
</translation>
</message>
<message>
<source><nobr>%1</nobr></source>
<comment>Group item tool-tip / Group info wrapper</comment>
- <translation type="unfinished"><nobr>%1</nobr></translation>
+ <translation><nobr>%1</nobr></translation>
</message>
<message numerus="yes">
<source>%n machine(s)</source>
<comment>Group item tool-tip / Machine info</comment>
- <translation type="unfinished">
- <numerusform></numerusform>
+ <translation>
+ <numerusform>%n mesin</numerusform>
</translation>
</message>
<message numerus="yes">
<source>(%n running)</source>
<comment>Group item tool-tip / Running machine info</comment>
- <translation type="unfinished">
- <numerusform></numerusform>
+ <translation>
+ <numerusform>(%n berjalan)</numerusform>
</translation>
</message>
<message>
<source><nobr>%1</nobr></source>
<comment>Group item tool-tip / Machine info wrapper</comment>
- <translation type="unfinished"><nobr>%1</nobr></translation>
+ <translation><nobr>%1</nobr></translation>
</message>
<message>
<source><nobr>%1 %2</nobr></source>
<comment>Group item tool-tip / Machine info wrapper, including running</comment>
- <translation type="unfinished"><nobr>%1</nobr> {1 %2<?}</translation>
+ <translation><nobr>%1 %2</nobr></translation>
</message>
<message>
<source>Collapse group</source>
- <translation type="unfinished"></translation>
+ <translation>Runtuhkan grup</translation>
</message>
<message>
<source>Expand group</source>
- <translation type="unfinished"></translation>
+ <translation>Kembangkan grup</translation>
</message>
<message>
<source>Enter group</source>
- <translation type="unfinished"></translation>
+ <translation>Masuk grup</translation>
</message>
<message>
<source>Exit group</source>
- <translation type="unfinished"></translation>
+ <translation>Keluar grup</translation>
</message>
</context>
<context>
<name>UIGChooserModel</name>
<message>
<source>New group</source>
- <translation type="unfinished"></translation>
+ <translation>Grup baru</translation>
</message>
</context>
<context>
@@ -2160,67 +2164,67 @@
<message>
<source>Name</source>
<comment>details (general)</comment>
- <translation type="unfinished">Nama</translation>
+ <translation>Nama</translation>
</message>
<message>
<source>Groups</source>
<comment>details (general)</comment>
- <translation type="unfinished"></translation>
+ <translation>Grup</translation>
</message>
<message>
<source>%1 MB</source>
<comment>details</comment>
- <translation type="unfinished"></translation>
+ <translation>%1 MB</translation>
</message>
<message>
<source>Processors</source>
<comment>details (system)</comment>
- <translation type="unfinished">Prosesor</translation>
+ <translation>Prosesor</translation>
</message>
<message>
<source>%1%</source>
<comment>details</comment>
- <translation type="unfinished">%1%</translation>
+ <translation>%1%</translation>
</message>
<message>
<source>VT-x/AMD-V</source>
<comment>details (system)</comment>
- <translation type="unfinished">VT-x/AMD-V</translation>
+ <translation>VT-x/AMD-V</translation>
</message>
<message>
<source>PAE/NX</source>
<comment>details (system)</comment>
- <translation type="unfinished">PAE/NX</translation>
+ <translation>PAE/NX</translation>
</message>
<message>
<source>Acceleration</source>
<comment>details (system)</comment>
- <translation type="unfinished">Akselerasi</translation>
+ <translation>Akselerasi</translation>
</message>
<message>
<source>Screens</source>
<comment>details (display)</comment>
- <translation type="unfinished">Layar</translation>
+ <translation>Layar</translation>
</message>
<message>
<source>3D</source>
<comment>details (display)</comment>
- <translation type="unfinished">3D</translation>
+ <translation>3D</translation>
</message>
<message>
<source>Acceleration</source>
<comment>details (display)</comment>
- <translation type="unfinished">Akselerasi</translation>
+ <translation>Akselerasi</translation>
</message>
<message>
<source>Disabled</source>
<comment>details (display/vrde/VRDE server)</comment>
- <translation type="unfinished"></translation>
+ <translation>Dinonaktifkan</translation>
</message>
<message>
<source>[CD/DVD]</source>
<comment>details (storage)</comment>
- <translation type="unfinished"></translation>
+ <translation>[CD/DVD]</translation>
</message>
<message>
<source>Not attached</source>
@@ -2230,12 +2234,12 @@
<message>
<source>Controller</source>
<comment>details (audio)</comment>
- <translation type="unfinished">Pengendali</translation>
+ <translation>Pengendali</translation>
</message>
<message>
<source>Disabled</source>
<comment>details (audio)</comment>
- <translation type="unfinished"></translation>
+ <translation>Dinonaktifkan</translation>
</message>
<message>
<source>Bridged adapter, %1</source>
@@ -2265,181 +2269,181 @@
<message>
<source>Adapter %1</source>
<comment>details (network)</comment>
- <translation type="unfinished"></translation>
+ <translation>Adaptor %1</translation>
</message>
<message>
<source>Disabled</source>
<comment>details (network/adapter)</comment>
- <translation type="unfinished"></translation>
+ <translation>Dinonaktifkan</translation>
</message>
<message>
<source>Port %1</source>
<comment>details (serial)</comment>
- <translation type="unfinished">Port %1</translation>
+ <translation>Port %1</translation>
</message>
<message>
<source>Disabled</source>
<comment>details (serial)</comment>
- <translation type="unfinished"></translation>
+ <translation>Dinonaktifkan</translation>
</message>
<message>
<source>Port %1</source>
<comment>details (parallel)</comment>
- <translation type="unfinished">Port %1</translation>
+ <translation>Port %1</translation>
</message>
<message>
<source>Disabled</source>
<comment>details (parallel)</comment>
- <translation type="unfinished"></translation>
+ <translation>Dinonaktifkan</translation>
</message>
<message>
<source>%1 (%2 active)</source>
<comment>details (usb)</comment>
- <translation type="unfinished">%1 (%2 aktif)</translation>
+ <translation>%1 (%2 aktif)</translation>
</message>
<message>
<source>Disabled</source>
<comment>details (usb)</comment>
- <translation type="unfinished"></translation>
+ <translation>Dinonaktifkan</translation>
</message>
<message>
<source>None</source>
<comment>details (shared folders)</comment>
- <translation type="unfinished">Tidak Ada</translation>
+ <translation>Tidak Ada</translation>
</message>
<message>
<source>None</source>
<comment>details (description)</comment>
- <translation type="unfinished">Tidak Ada</translation>
+ <translation>Tidak Ada</translation>
</message>
<message>
<source>Operating System</source>
<comment>details (general)</comment>
- <translation type="unfinished"></translation>
+ <translation>Sistem Operasi</translation>
</message>
<message>
<source>Information Inaccessible</source>
<comment>details</comment>
- <translation type="unfinished"></translation>
+ <translation>Informasi Tidak Bisa Diakses</translation>
</message>
<message>
<source>Base Memory</source>
<comment>details (system)</comment>
- <translation type="unfinished">Memori Dasar</translation>
+ <translation>Memori Dasar</translation>
</message>
<message>
<source>Execution Cap</source>
<comment>details (system)</comment>
- <translation type="unfinished">Cap Eksekusi</translation>
+ <translation>Batas Eksekusi</translation>
</message>
<message>
<source>Boot Order</source>
<comment>details (system)</comment>
- <translation type="unfinished">Urutan Boot</translation>
+ <translation>Urutan Boot</translation>
</message>
<message>
<source>Nested Paging</source>
<comment>details (system)</comment>
- <translation type="unfinished">Paging Bertingkat</translation>
+ <translation>Paging Bertingkat</translation>
</message>
<message>
<source>Video Memory</source>
<comment>details (display)</comment>
- <translation type="unfinished">Memori Video</translation>
+ <translation>Memori Video</translation>
</message>
<message>
<source>2D Video</source>
<comment>details (display)</comment>
- <translation type="unfinished">Video 2D</translation>
+ <translation>Video 2D</translation>
</message>
<message>
<source>Remote Desktop Server Port</source>
<comment>details (display/vrde)</comment>
- <translation type="unfinished">Port Server Remote Desktop</translation>
+ <translation>Port Server Remote Desktop</translation>
</message>
<message>
<source>Remote Desktop Server</source>
<comment>details (display/vrde)</comment>
- <translation type="unfinished">Server Remote Desktop</translation>
+ <translation>Server Remote Desktop</translation>
</message>
<message>
<source>Not Attached</source>
<comment>details (storage)</comment>
- <translation type="unfinished"></translation>
+ <translation></translation>
</message>
<message>
<source>Host Driver</source>
<comment>details (audio)</comment>
- <translation type="unfinished">Driver Host</translation>
+ <translation>Driver Host</translation>
</message>
<message>
<source>Bridged Adapter, %1</source>
<comment>details (network)</comment>
- <translation type="unfinished"></translation>
+ <translation>Adaptor Ter-bridge, %1</translation>
</message>
<message>
<source>Internal Network, '%1'</source>
<comment>details (network)</comment>
- <translation type="unfinished"></translation>
+ <translation>Jaringan Internal, '%1'</translation>
</message>
<message>
<source>Host-only Adapter, '%1'</source>
<comment>details (network)</comment>
- <translation type="unfinished"></translation>
+ <translation>Adaptor Hanya-host, '%1'</translation>
</message>
<message>
<source>Generic Driver, '%1'</source>
<comment>details (network)</comment>
- <translation type="unfinished"></translation>
+ <translation>Driver Generik, '%1'</translation>
</message>
<message>
<source>Generic Driver, '%1' { %2 }</source>
<comment>details (network)</comment>
- <translation type="unfinished"></translation>
+ <translation>Driver Generik, '%1' { %2 }</translation>
</message>
<message>
<source>Device Filters</source>
<comment>details (usb)</comment>
- <translation type="unfinished">Filter Device</translation>
+ <translation>Penyaring Perangkat</translation>
</message>
<message>
<source>USB Controller Inaccessible</source>
<comment>details (usb)</comment>
- <translation type="unfinished"></translation>
+ <translation>Pengendali USB Tidak Bisa Diakses</translation>
</message>
<message>
<source>Shared Folders</source>
<comment>details (shared folders)</comment>
- <translation type="unfinished">Folder yang di Share</translation>
+ <translation>Folder Bersama</translation>
</message>
<message>
<source>Video Capture File</source>
<comment>details (display/video capture)</comment>
- <translation type="unfinished"></translation>
+ <translation>Berkas Tangkapan Video</translation>
</message>
<message>
<source>Video Capture Attributes</source>
<comment>details (display/video capture)</comment>
- <translation type="unfinished"></translation>
+ <translation>Atribut Tangkapan Video</translation>
</message>
<message>
<source>Video Capture</source>
<comment>details (display/video capture)</comment>
- <translation type="unfinished"></translation>
+ <translation>Tangkapan Video</translation>
</message>
<message>
<source>Disabled</source>
<comment>details (display/video capture)</comment>
- <translation type="unfinished"></translation>
+ <translation>Dinonaktifkan</translation>
</message>
<message>
<source>NAT Network, '%1'</source>
<comment>details (network)</comment>
- <translation type="unfinished"></translation>
+ <translation>Jaringan NAT, '%1'</translation>
</message>
<message>
<source>Frame Size: %1x%2, Frame Rate: %3fps, Bit Rate: %4kbps</source>
- <translation type="unfinished"></translation>
+ <translation>Ukuran Frame: %1x%2, Laju Frame: %3fps, Laju Bit: %4kbps</translation>
</message>
</context>
<context>
@@ -2628,23 +2632,23 @@
</message>
<message>
<source>Every 0.5 s</source>
- <translation type="unfinished">Setiap 0,5 d</translation>
+ <translation>Setiap 0,5 d</translation>
</message>
<message>
<source>Every 1 s</source>
- <translation type="unfinished">Setiap 1 d</translation>
+ <translation>Setiap 1 d</translation>
</message>
<message>
<source>Every 2 s</source>
- <translation type="unfinished">Setiap 2 d</translation>
+ <translation>Setiap 2 d</translation>
</message>
<message>
<source>Every 5 s</source>
- <translation type="unfinished">Setiap 5 d</translation>
+ <translation>Setiap 5 d</translation>
</message>
<message>
<source>Every 10 s</source>
- <translation type="unfinished">Setiap 10 d</translation>
+ <translation>Setiap 10 d</translation>
</message>
<message>
<source>No Preview</source>
@@ -2652,61 +2656,61 @@
</message>
<message>
<source>Update disabled</source>
- <translation type="unfinished"></translation>
+ <translation>Pemutakhiran dinonaktifkan</translation>
</message>
<message>
<source>No preview</source>
- <translation type="unfinished"></translation>
+ <translation>Tidak ada pratinjau</translation>
</message>
</context>
<context>
<name>UIGlobalSettingsDisplay</name>
<message>
<source>Maximum Guest Screen &Size:</source>
- <translation type="unfinished"></translation>
+ <translation>Ukuran Layar Guest Mak&simum:</translation>
</message>
<message>
<source>&Width:</source>
- <translation type="unfinished"></translation>
+ <translation>&Lebar:</translation>
</message>
<message>
<source>Specifies the maximum width which we would like the guest to use.</source>
- <translation type="unfinished"></translation>
+ <translation>Menyatakan lebar maksimum yang kita inginkan untuk dipakai oleh guest.</translation>
</message>
<message>
<source>&Height:</source>
- <translation type="unfinished"></translation>
+ <translation>&Tinggi:</translation>
</message>
<message>
<source>Specifies the maximum height which we would like the guest to use.</source>
- <translation type="unfinished"></translation>
+ <translation>Menyatakan tinggi maksimum yang kita inginkan untuk dipakai oleh guest.</translation>
</message>
<message>
<source>Automatic</source>
<comment>Maximum Guest Screen Size</comment>
- <translation type="unfinished"></translation>
+ <translation>Otomatis</translation>
</message>
<message>
<source>Suggest a reasonable maximum screen size to the guest. The guest will only see this suggestion when guest additions are installed.</source>
- <translation type="unfinished"></translation>
+ <translation>Menyarankan ukuran layar maksimum yang layak ke guest. Guest hanya akan melihat saran ini ketika guest addition dipasang.</translation>
</message>
<message>
<source>None</source>
<comment>Maximum Guest Screen Size</comment>
- <translation type="unfinished">Tidak Ada</translation>
+ <translation>Tidak Ada</translation>
</message>
<message>
<source>Do not attempt to limit the size of the guest screen.</source>
- <translation type="unfinished"></translation>
+ <translation>Jangan mencoba membatasi ukuran layar guest.</translation>
</message>
<message>
<source>Hint</source>
<comment>Maximum Guest Screen Size</comment>
- <translation type="unfinished"></translation>
+ <translation>Arahan</translation>
</message>
<message>
<source>Suggest a maximum screen size to the guest. The guest will only see this suggestion when guest additions are installed.</source>
- <translation type="unfinished"></translation>
+ <translation>Menyarankan ukuran layar maksimum ke guest. Guest hanya akan melihat saran ini ketika guest addition dipasang.</translation>
</message>
</context>
<context>
@@ -2717,7 +2721,7 @@
</message>
<message>
<source>Lists all installed packages.</source>
- <translation>Tampilkan semua paket terinstall.</translation>
+ <translation>Tampilkan semua paket terpasang.</translation>
</message>
<message>
<source>Active</source>
@@ -2741,11 +2745,11 @@
</message>
<message>
<source>Select an extension package file</source>
- <translation>Pilih sebuah file paket ekstensi</translation>
+ <translation>Pilih sebuah berkas paket ekstensi</translation>
</message>
<message>
<source>Extension package files (%1)</source>
- <translation>File paket ekstensi (%1)</translation>
+ <translation>Berkas paket ekstensi (%1)</translation>
</message>
<message>
<source>Extensions</source>
@@ -2753,7 +2757,7 @@
</message>
<message>
<source>&Extension Packages</source>
- <translation type="unfinished"></translation>
+ <translation>Paket &Ekstensi</translation>
</message>
</context>
<context>
@@ -2764,19 +2768,19 @@
</message>
<message>
<source>Holds the path to the default virtual machine folder. This folder is used, if not explicitly specified otherwise, when creating new virtual machines.</source>
- <translation>Tampilkan path ke folder default mesin virtual. Folder ini digunakan, bila nilai lain tidak dinyatakan secara eksplisit, saat menciptakan mesin virtual baru.</translation>
+ <translation>Menyimpan path ke folder baku mesin virtual. Folder ini digunakan, bila nilai lain tidak dinyatakan secara eksplisit, saat menciptakan mesin virtual baru.</translation>
</message>
<message>
<source>Holds the path to the library that provides authentication for Remote Display (VRDP) clients.</source>
- <translation>Tampilkan path ke library yang menyediakan otentikasi untuk klien Remote Display (VRDP).</translation>
+ <translation type="unfinished">Menyimpan path ke pustaka yang menyediakan otentikasi untuk klien Tampilan Jarak Jauh (VRDP).</translation>
</message>
<message>
<source>Default &Machine Folder:</source>
- <translation>Folder Default &Mesin:</translation>
+ <translation>Folder Baku &Mesin:</translation>
</message>
<message>
<source>V&RDP Authentication Library:</source>
- <translation>Library Otentikasi V&RDP:</translation>
+ <translation>Pustaka Otentikasi V&RDP:</translation>
</message>
<message>
<source>When checked, the application will provide an icon with the context menu in the system tray.</source>
@@ -2800,27 +2804,27 @@
</message>
<message>
<source>&Dock and Menubar:</source>
- <translation type="unfinished"></translation>
+ <translation>&Dok dan Bilah Menu:</translation>
</message>
<message>
<source>Auto-Show in Fullscreen</source>
- <translation type="unfinished"></translation>
+ <translation>Tampilkan Otomatis dalam Layar Penuh</translation>
</message>
<message>
<source>When checked, the host dock and menu bar will be shown when the virtual machine is in fullscreen mode.</source>
- <translation type="unfinished"></translation>
+ <translation>Saat ditandai, dok host dan bilah menu akan ditampilkan ketika sebuah mesin virtual sedang dalam mode layar penuh.</translation>
</message>
<message>
<source>&Host Screensaver:</source>
- <translation type="unfinished"></translation>
+ <translation>&ScreenSaver Host:</translation>
</message>
<message>
<source>When checked, the host screensaver will be disabled whenever a virtual machine is running.</source>
- <translation type="unfinished"></translation>
+ <translation>Saat ditandai, screensaver host akan dinonaktifkan ketika sebuah mesin virtual sedang berjalan.</translation>
</message>
<message>
<source>Disable When Running Virtual Machines</source>
- <translation type="unfinished"></translation>
+ <translation>Nonaktifkan Ketika Menjalankan Mesin Virtual</translation>
</message>
</context>
<context>
@@ -2835,11 +2839,11 @@
</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>Saat tertandai, keyboard secara otomatis tertangkap setiap kali window VM diaktifkan. Saat keyboard ditangkap, semua tekanan tombol (termasuk untuk sistem seperti Alt+Tab) diarahkan ke VM.</translation>
+ <translation>Saat tertandai, papan tik secara otomatis ditangkap setiap kali jendela VM diaktifkan. Saat papan tik ditangkap, semua ketukan tombol (termasuk untuk sistem seperti Alt+Tab) diarahkan ke VM.</translation>
</message>
<message>
<source>&Auto Capture Keyboard</source>
- <translation>Otom&atis Tangkap Keyboard</translation>
+ <translation>Otom&atis Tangkap Papan Tik</translation>
</message>
<message>
<source>Reset host combination</source>
@@ -2851,27 +2855,27 @@
</message>
<message>
<source>Host Key Combination</source>
- <translation type="unfinished"></translation>
+ <translation>Kombinasi Tombol Host</translation>
</message>
<message>
<source>Some items have the same shortcuts assigned.</source>
- <translation type="unfinished"></translation>
+ <translation>Beberapa butir memiliki pengaturan pintasan yang sama.</translation>
</message>
<message>
<source>&VirtualBox Manager</source>
- <translation type="unfinished"></translation>
+ <translation>Manajer &VirtualBox</translation>
</message>
<message>
<source>Virtual &Machine</source>
- <translation type="unfinished"></translation>
+ <translation>&Mesin Virtual</translation>
</message>
<message>
<source>Lists all the available shortcuts which can be configured.</source>
- <translation type="unfinished"></translation>
+ <translation>Menampilkan daftar semua pintasan yang tersedia, yang dapat ditata.</translation>
</message>
<message>
<source>Enter a sequence to filter the shortcut list.</source>
- <translation type="unfinished"></translation>
+ <translation>Masukkan suatu urutan untuk menyaring daftar pintasan.</translation>
</message>
</context>
<context>
@@ -2879,7 +2883,7 @@
<message>
<source> (built-in)</source>
<comment>Language</comment>
- <translation> (built-in)</translation>
+ <translation> (bawaan)</translation>
</message>
<message>
<source><unavailable></source>
@@ -2894,7 +2898,7 @@
<message>
<source>Default</source>
<comment>Language</comment>
- <translation>Default</translation>
+ <translation>Baku</translation>
</message>
<message>
<source>Language:</source>
@@ -2906,7 +2910,7 @@
</message>
<message>
<source>Lists all available user interface languages. The effective language is written in <b>bold</b>. Select <i>Default</i> to reset to the system default language.</source>
- <translation>Menampilkan daftar semua bahasa antarmuka yang tersedia. Bahasa yang efektif dicetak <b>tebal</b>. Pilih <i>Default</i> untuk me-reset ke bahasa default sistem.</translation>
+ <translation>Menampilkan daftar semua bahasa antarmuka yang tersedia. Bahasa yang efektif dicetak <b>tebal</b>. Pilih <i>Baku</i> untuk mengembalikan ke bahasa baku sistem.</translation>
</message>
<message>
<source>Name</source>
@@ -2922,15 +2926,15 @@
</message>
<message>
<source>Author</source>
- <translation>Pencipta</translation>
+ <translation>Penulis</translation>
</message>
<message>
<source>Author(s):</source>
- <translation>Pencipta:</translation>
+ <translation>Penulis:</translation>
</message>
<message>
<source>&Interface Languages</source>
- <translation type="unfinished"></translation>
+ <translation>Bahasa &Antar Muka</translation>
</message>
</context>
<context>
@@ -3015,12 +3019,12 @@
<message>
<source>Enabled</source>
<comment>server</comment>
- <translation>Diaktifkan</translation>
+ <translation>Difungsikan</translation>
</message>
<message>
<source>Disabled</source>
<comment>server</comment>
- <translation>Dimatikan</translation>
+ <translation>Dinonaktifkan</translation>
</message>
<message>
<source>Address</source>
@@ -3053,7 +3057,7 @@
</message>
<message>
<source>&Edit host-only network</source>
- <translation>&Edit jaringan hanya-host</translation>
+ <translation>&Sunting jaringan hanya-host</translation>
</message>
<message>
<source>&Host-only Networks:</source>
@@ -3069,132 +3073,132 @@
</message>
<message>
<source>Networking</source>
- <translation>Jaringan</translation>
+ <translation>Jejaring</translation>
</message>
<message>
<source>&NAT Networks</source>
- <translation type="unfinished"></translation>
+ <translation>Jaringan &NAT</translation>
</message>
<message>
<source>Lists all available NAT networks.</source>
- <translation type="unfinished"></translation>
+ <translation>Tampilkan semua jaringan NAT yang tersedia.</translation>
</message>
<message>
<source>&Host-only Networks</source>
- <translation type="unfinished"></translation>
+ <translation>Jaringan &Hanya-host</translation>
</message>
<message>
<source>No new name specified for the NAT network previously called <b>%1</b>.</source>
- <translation type="unfinished"></translation>
+ <translation>Tidak ada nama baru yang dinyatakan bagi jaringan NAT yang sebelumnya bernama <b>%1</b>.</translation>
</message>
<message>
<source>No CIDR specified for the NAT network <b>%1</b>.</source>
- <translation type="unfinished"></translation>
+ <translation>Tidak ada CIDR yang dinyatakan bagi jaringan NAT <b>%1</b>.</translation>
</message>
<message>
<source>No CIDR specified for the NAT network previously called <b>%1</b>.</source>
- <translation type="unfinished"></translation>
+ <translation>Tidak ada CIDR yang dinyatakan bagi jaringan NAT yang sebelumnya bernama <b>%1</b>.</translation>
</message>
<message>
<source>Invalid CIDR specified (<i>%1</i>) for the NAT network <b>%2</b>.</source>
- <translation type="unfinished"></translation>
+ <translation>CIDR yang tidak valid (<i>%1</i>) dinyatakan bagi jaringan NAT <b>%2</b>.</translation>
</message>
<message>
<source>Invalid CIDR specified (<i>%1</i>) for the NAT network previously called <b>%2</b>.</source>
- <translation type="unfinished"></translation>
+ <translation>CIDR yang tidak valid (<i>%1</i>) dinyatakan bagi jaringan NAT yang sebelumnya bernama <b>%2</b>.</translation>
</message>
<message>
<source>Network Name</source>
- <translation type="unfinished"></translation>
+ <translation>Nama Jaringan</translation>
</message>
<message>
<source>[empty]</source>
- <translation type="unfinished"></translation>
+ <translation>[kosong]</translation>
</message>
<message>
<source>%1 (renamed from %2)</source>
- <translation type="unfinished"></translation>
+ <translation>%1 (ganti nama dari %2)</translation>
</message>
<message>
<source>Old Network Name</source>
- <translation type="unfinished"></translation>
+ <translation>Nama Jaringan Lama</translation>
</message>
<message>
<source>New Network Name</source>
- <translation type="unfinished"></translation>
+ <translation>Nama Jaringan Baru</translation>
</message>
<message>
<source>Network CIDR</source>
- <translation type="unfinished"></translation>
+ <translation>CIDR Jaringan</translation>
</message>
<message>
<source>Supports DHCP</source>
- <translation type="unfinished"></translation>
+ <translation>Mendukung DHCP</translation>
</message>
<message>
<source>yes</source>
- <translation type="unfinished"></translation>
+ <translation>ya</translation>
</message>
<message>
<source>no</source>
- <translation type="unfinished"></translation>
+ <translation>tidak</translation>
</message>
<message>
<source>Supports IPv6</source>
- <translation type="unfinished"></translation>
+ <translation>Mendukung IPv6</translation>
</message>
<message>
<source>Default IPv6 route</source>
- <translation type="unfinished"></translation>
+ <translation>Rute IPv6 baku</translation>
</message>
<message>
<source>Host interface <b>%1</b> does not currently have a valid IPv4 address.</source>
- <translation type="unfinished"></translation>
+ <translation>Antar muka host <b>%1</b> saat ini tidak memiliki alamat IPv4 yang valid.</translation>
</message>
<message>
<source>Host interface <b>%1</b> does not currently have a valid IPv4 network mask.</source>
- <translation type="unfinished"></translation>
+ <translation>Antar muka host <b>%1</b> saat ini tidak memiliki mask jaringan IPv4 yang valid.</translation>
</message>
<message>
<source>Host interface <b>%1</b> does not currently have a valid IPv6 address.</source>
- <translation type="unfinished"></translation>
+ <translation>Antar muka host <b>%1</b> saat ini tidak memiliki alamat IPv6 yang valid.</translation>
</message>
<message>
<source>Host interface <b>%1</b> does not currently have a valid DHCP server address.</source>
- <translation type="unfinished"></translation>
+ <translation>Antar muka host <b>%1</b> saat ini tidak memiliki alamat server DHCP yang valid.</translation>
</message>
<message>
<source>Host interface <b>%1</b> does not currently have a valid DHCP server mask.</source>
- <translation type="unfinished"></translation>
+ <translation>Antar muka host <b>%1</b> saat ini tidak memiliki mask server DHCP yang valid.</translation>
</message>
<message>
<source>Host interface <b>%1</b> does not currently have a valid DHCP server lower address bound.</source>
- <translation type="unfinished"></translation>
+ <translation>Antar muka host <b>%1</b> saat ini tidak memiliki batas bawah alamat server DHCP yang valid.</translation>
</message>
<message>
<source>Host interface <b>%1</b> does not currently have a valid DHCP server upper address bound.</source>
- <translation type="unfinished"></translation>
+ <translation>Antar muka host <b>%1</b> saat ini tidak memiliki batas atas alamat server DHCP yang valid.</translation>
</message>
<message>
<source>The name <b>%1</b> is being used for several NAT networks.</source>
- <translation type="unfinished"></translation>
+ <translation>Nama <b>%1</b> sedang dipakai oleh beberapa jaringan NAT.</translation>
</message>
<message>
<source>Active</source>
<comment>NAT network</comment>
- <translation type="unfinished">Aktif</translation>
+ <translation>Aktif</translation>
</message>
<message>
<source>&Add NAT network</source>
- <translation type="unfinished"></translation>
+ <translation>T&ambah jaringan NAT</translation>
</message>
<message>
<source>&Remove NAT network</source>
- <translation type="unfinished"></translation>
+ <translation>&Hapus jaringan NAT</translation>
</message>
<message>
<source>&Edit NAT network</source>
- <translation type="unfinished"></translation>
+ <translation>&Sunting jaringan NAT</translation>
</message>
</context>
<context>
@@ -3296,188 +3300,188 @@
<name>UIGlobalSettingsNetworkDetailsHost</name>
<message>
<source>Host-only Network Details</source>
- <translation type="unfinished">Rincian Jaringan Hanya-host</translation>
+ <translation>Rincian Jaringan Hanya-host</translation>
</message>
<message>
<source>&Adapter</source>
- <translation type="unfinished">&Adaptor</translation>
+ <translation>&Adaptor</translation>
</message>
<message>
<source>Manual &Configuration</source>
- <translation type="unfinished">&Konfigurasi Manual</translation>
+ <translation>&Konfigurasi Manual</translation>
</message>
<message>
<source>Use manual configuration for this host-only network adapter.</source>
- <translation type="unfinished">Gunakan konfigurasi manual bagi adaptor jaringan hanya-host ini.</translation>
+ <translation>Gunakan konfigurasi manual bagi adaptor jaringan hanya-host ini.</translation>
</message>
<message>
<source>&IPv4 Address:</source>
- <translation type="unfinished">Alamat &IPv4:</translation>
+ <translation>Alamat &IPv4:</translation>
</message>
<message>
<source>Holds the host IPv4 address for this adapter.</source>
- <translation type="unfinished">Tampilkan alamat IPv4 host bagi adaptor ini.</translation>
+ <translation>Menyimpan alamat IPv4 host bagi adaptor ini.</translation>
</message>
<message>
<source>IPv4 Network &Mask:</source>
- <translation type="unfinished">&Mask Jaringan IPv4:</translation>
+ <translation>&Mask Jaringan IPv4:</translation>
</message>
<message>
<source>Holds the host IPv4 network mask for this adapter.</source>
- <translation type="unfinished">Tampilkan mask jaringan IPv4 host bagi adaptor ini.</translation>
+ <translation>Tampilkan mask jaringan IPv4 host bagi adaptor ini.</translation>
</message>
<message>
<source>I&Pv6 Address:</source>
- <translation type="unfinished">Alamat I&Pv6:</translation>
+ <translation>Alamat I&Pv6:</translation>
</message>
<message>
<source>Holds the host IPv6 address for this adapter if IPv6 is supported.</source>
- <translation type="unfinished">Tampilkan alamat IPv6 host bagi adaptor ini bila IPv6 didukung.</translation>
+ <translation>Menyimpan alamat IPv6 host bagi adaptor ini bila IPv6 didukung.</translation>
</message>
<message>
<source>IPv6 Network Mask &Length:</source>
- <translation type="unfinished">&Panjang Mask Jaringan IPv6:</translation>
+ <translation>&Panjang Mask Jaringan IPv6:</translation>
</message>
<message>
<source>Holds the host IPv6 network mask prefix length for this adapter if IPv6 is supported.</source>
- <translation type="unfinished">Tampilkan panjang prefiks mask jaringan IPv6 host bagi adaptor ini bila IPv6 didukung.</translation>
+ <translation>Menyimpan panjang prefiks mask jaringan IPv6 host bagi adaptor ini bila IPv6 didukung.</translation>
</message>
<message>
<source>&DHCP Server</source>
- <translation type="unfinished">Server &DHCP</translation>
+ <translation>Server &DHCP</translation>
</message>
<message>
<source>&Enable Server</source>
- <translation type="unfinished">Aktifkan S&erver</translation>
+ <translation>Fungsikan S&erver</translation>
</message>
<message>
<source>Indicates whether the DHCP Server is enabled on machine startup or not.</source>
- <translation type="unfinished">Menandakan apakah Server DHCP diaktifkan saat startup mesin atau tidak.</translation>
+ <translation>Menandakan apakah Server DHCP diaktifkan saat startup mesin atau tidak.</translation>
</message>
<message>
<source>Server Add&ress:</source>
- <translation type="unfinished">Alamat Se&rver:</translation>
+ <translation>Alamat Se&rver:</translation>
</message>
<message>
<source>Holds the address of the DHCP server servicing the network associated with this host-only adapter.</source>
- <translation type="unfinished">Tampilkan alamat server DHCP yang melayani jaringan yang diasosiasikan dengan adaptor hanya-host ini.</translation>
+ <translation>Menyimpan alamat server DHCP yang melayani jaringan yang diasosiasikan dengan adaptor hanya-host ini.</translation>
</message>
<message>
<source>Server &Mask:</source>
- <translation type="unfinished">&Mask Server:</translation>
+ <translation>&Mask Server:</translation>
</message>
<message>
<source>Holds the network mask of the DHCP server servicing the network associated with this host-only adapter.</source>
- <translation type="unfinished">Tampilkan mask jaringan dari server DHCP yang melayani jaringan yang diasosiasikan dengan adaptor hanya-host ini.</translation>
+ <translation>Menyimpan mask jaringan dari server DHCP yang melayani jaringan yang diasosiasikan dengan adaptor hanya-host ini.</translation>
</message>
<message>
<source>&Lower Address Bound:</source>
- <translation type="unfinished">Batas Bawah A&lamat:</translation>
+ <translation>Batas Bawah A&lamat:</translation>
</message>
<message>
<source>Holds the lower address bound offered by the DHCP server servicing the network associated with this host-only adapter.</source>
- <translation type="unfinished">Tampilkan batas bawah alamat yang ditawarkan oleh server DHCP yang melayani jaringan yang diasosiasikan dengan adaptor hanya-host ini.</translation>
+ <translation>Menyimpan batas bawah alamat yang ditawarkan oleh server DHCP yang melayani jaringan yang diasosiasikan dengan adaptor hanya-host ini.</translation>
</message>
<message>
<source>&Upper Address Bound:</source>
- <translation type="unfinished">Batas &Atas Alamat:</translation>
+ <translation>Batas &Atas Alamat:</translation>
</message>
<message>
<source>Holds the upper address bound offered by the DHCP server servicing the network associated with this host-only adapter.</source>
- <translation type="unfinished">Tampilkan batas atas alamat yang ditawarkan oleh server DHCP yang melayani jaringan yang diasosiasikan dengan adaptor hanya-host ini.</translation>
+ <translation>Menyimpan batas atas alamat yang ditawarkan oleh server DHCP yang melayani jaringan yang diasosiasikan dengan adaptor hanya-host ini.</translation>
</message>
</context>
<context>
<name>UIGlobalSettingsNetworkDetailsNAT</name>
<message>
<source>NAT Network Details</source>
- <translation type="unfinished"></translation>
+ <translation>Rincian Jaringan NAT</translation>
</message>
<message>
<source>&Enable Network</source>
- <translation type="unfinished"></translation>
+ <translation>&Fungsikan Jaringan</translation>
</message>
<message>
<source>Enable this NAT network.</source>
- <translation type="unfinished"></translation>
+ <translation>Fungsikan jaringan NAT ini.</translation>
</message>
<message>
<source>Network &Name:</source>
- <translation type="unfinished"></translation>
+ <translation>&Nama Jaringan:</translation>
</message>
<message>
<source>Holds the name for this network.</source>
- <translation type="unfinished"></translation>
+ <translation>Menyimpan nama bagi jaringan ini.</translation>
</message>
<message>
<source>Network &CIDR:</source>
- <translation type="unfinished"></translation>
+ <translation>&CIDR Jaringan:</translation>
</message>
<message>
<source>Holds the CIDR for this network.</source>
- <translation type="unfinished"></translation>
+ <translation>Menyimpan CIDR bagi jaringan ini.</translation>
</message>
<message>
<source>Network Options:</source>
- <translation type="unfinished"></translation>
+ <translation>Opsi Jaringan:</translation>
</message>
<message>
<source>Supports &DHCP</source>
- <translation type="unfinished"></translation>
+ <translation>Mendukung &DHCP</translation>
</message>
<message>
<source>Determines whether this network supports DHCP.</source>
- <translation type="unfinished"></translation>
+ <translation>Menentukan apakan jaringan ini mendukung DHCP.</translation>
</message>
<message>
<source>Supports &IPv6</source>
- <translation type="unfinished"></translation>
+ <translation>Mendukung &IPv6</translation>
</message>
<message>
<source>Determines whether this network supports IPv6.</source>
- <translation type="unfinished"></translation>
+ <translation>Menentukan apakah jaringan ini mendukung IPv6.</translation>
</message>
<message>
<source>Advertise Default IPv6 &Route</source>
- <translation type="unfinished"></translation>
+ <translation>Umumkan &Rute IPv6 Baku</translation>
</message>
<message>
<source>Determines whether this network should be advertised as the default IPv6 route.</source>
- <translation type="unfinished"></translation>
+ <translation>Menentukan apakah jaringan ini mesti diumumkan sebagai rute baku IPv6.</translation>
</message>
<message>
<source>Opens a window to manage port forwarding rules.</source>
- <translation type="unfinished">Buka dialog untuk mengelola aturan penerusan port.</translation>
+ <translation>Membuka jendela untuk mengelola aturan penerusan port.</translation>
</message>
<message>
<source>&Port Forwarding</source>
- <translation type="unfinished">Penerusan &Port</translation>
+ <translation>Penerusan &Port</translation>
</message>
</context>
<context>
<name>UIGlobalSettingsPortForwardingDlg</name>
<message>
<source>Port Forwarding Rules</source>
- <translation type="unfinished">Aturan Penerusan Port</translation>
+ <translation>Aturan Penerusan Port</translation>
</message>
<message>
<source>IPv4</source>
- <translation type="unfinished"></translation>
+ <translation>IPv4</translation>
</message>
<message>
<source>IPv6</source>
- <translation type="unfinished"></translation>
+ <translation>IPv6</translation>
</message>
</context>
<context>
<name>UIGlobalSettingsProxy</name>
<message>
<source>When checked, VirtualBox will use the proxy settings supplied for tasks like downloading Guest Additions from the network or checking for updates.</source>
- <translation>Bila ditandai, VirtualBox akan memakai pengaturan proksi yang diberikan untuk tugas seperti men-download Guest Addition dari jaringan atau memeriksa update.</translation>
+ <translation>Bila ditandai, VirtualBox akan memakai pengaturan proksi yang diberikan untuk tugas seperti menunduh Guest Addition dari jaringan atau memeriksa pemutakhiran.</translation>
</message>
<message>
<source>&Enable Proxy</source>
- <translation>&Nyalakan proksi</translation>
+ <translation>&Fungsikan Proksi</translation>
</message>
<message>
<source>Ho&st:</source>
@@ -3521,11 +3525,11 @@
</message>
<message>
<source>No proxy host is currently specified.</source>
- <translation type="unfinished"></translation>
+ <translation>Host proksi saat ini tidak dinyatakan.</translation>
</message>
<message>
<source>No proxy port is currently specified.</source>
- <translation type="unfinished"></translation>
+ <translation>Port proksi saat ini tidak dinyatakan.</translation>
</message>
</context>
<context>
@@ -3536,7 +3540,7 @@
</message>
<message>
<source>&Check for Updates</source>
- <translation>&Periksa update</translation>
+ <translation>&Periksa Pemutakhiran</translation>
</message>
<message>
<source>&Once per:</source>
@@ -3544,7 +3548,7 @@
</message>
<message>
<source>Specifies how often the new version check should be performed. Note that if you want to completely disable this check, just clear the above check box.</source>
- <translation>Nyatakan seberapa sering pemeriksaan versi baru mesti dilakukan. Perhatikan bahwa bila Anda ingin mematikan pemeriksaan ini sepenuhnya, kosongkan saja kotak contreng di atas.</translation>
+ <translation>Menyatakan seberapa sering pemeriksaan versi baru mesti dilakukan. Perhatikan bahwa bila Anda ingin mematikan pemeriksaan ini sepenuhnya, kosongkan saja kotak contreng di atas.</translation>
</message>
<message>
<source>Next Check:</source>
@@ -3556,11 +3560,11 @@
</message>
<message>
<source><p>Choose this if you only wish to be notified about stable updates to VirtualBox.</p></source>
- <translation><p>Pilih ini bila Anda hanya menghendaki untuk diberitahu tentang update stabil atas VirtualBox.</p></translation>
+ <translation><p>Pilih ini bila Anda hanya menghendaki untuk diberitahu tentang pemutakhiran stabil atas VirtualBox.</p></translation>
</message>
<message>
<source>&Stable Release Versions</source>
- <translation>Versi rilis &stabil</translation>
+ <translation>Versi Rilis &Stabil</translation>
</message>
<message>
<source><p>Choose this if you wish to be notified about all new VirtualBox releases.</p></source>
@@ -3568,7 +3572,7 @@
</message>
<message>
<source>&All New Releases</source>
- <translation>Semu&a rilis baru</translation>
+ <translation>Semu&a Rilis Baru</translation>
</message>
<message>
<source><p>Choose this to be notified about all new VirtualBox releases and pre-release versions of VirtualBox.</p></source>
@@ -3576,7 +3580,7 @@
</message>
<message>
<source>All New Releases and &Pre-Releases</source>
- <translation>Semua rilis baru dan &prarilis</translation>
+ <translation>Semua Rilis Baru dan &Prarilis</translation>
</message>
</context>
<context>
@@ -3590,71 +3594,71 @@
<name>UIHostComboEditor</name>
<message>
<source><key_%1></source>
- <translation type="unfinished"><key_%1></translation>
+ <translation><key_%1></translation>
</message>
<message>
<source>Left </source>
- <translation type="unfinished">Kiri </translation>
+ <translation>Kiri </translation>
</message>
<message>
<source>Right </source>
- <translation type="unfinished">Kanan </translation>
+ <translation>Kanan </translation>
</message>
<message>
<source>Left Shift</source>
- <translation type="unfinished">Shift Kiri</translation>
+ <translation>Shift Kiri</translation>
</message>
<message>
<source>Right Shift</source>
- <translation type="unfinished">Shift Kanan</translation>
+ <translation>Shift Kanan</translation>
</message>
<message>
<source>Left Ctrl</source>
- <translation type="unfinished">Ctrl Kiri</translation>
+ <translation>Ctrl Kiri</translation>
</message>
<message>
<source>Right Ctrl</source>
- <translation type="unfinished">Ctrl Kanan</translation>
+ <translation>Ctrl Kanan</translation>
</message>
<message>
<source>Left Alt</source>
- <translation type="unfinished">Alt Kiri</translation>
+ <translation>Alt Kiri</translation>
</message>
<message>
<source>Right Alt</source>
- <translation type="unfinished">Alt Kanan</translation>
+ <translation>Alt Kanan</translation>
</message>
<message>
<source>Left WinKey</source>
- <translation type="unfinished">Tombol Windows Kiri</translation>
+ <translation>Tombol Windows Kiri</translation>
</message>
<message>
<source>Right WinKey</source>
- <translation type="unfinished">Tombol Windows Kanan</translation>
+ <translation>Tombol Windows Kanan</translation>
</message>
<message>
<source>Menu key</source>
- <translation type="unfinished">Tombol Menu</translation>
+ <translation>Tombol Menu</translation>
</message>
<message>
<source>Alt Gr</source>
- <translation type="unfinished">Alt Gr</translation>
+ <translation>Alt Gr</translation>
</message>
<message>
<source>Caps Lock</source>
- <translation type="unfinished">Caps Lock</translation>
+ <translation>Caps Lock</translation>
</message>
<message>
<source>Scroll Lock</source>
- <translation type="unfinished">Scroll Lock</translation>
+ <translation>Scroll Lock</translation>
</message>
<message>
<source>Host+</source>
- <translation type="unfinished"></translation>
+ <translation>Host+</translation>
</message>
<message>
<source>None</source>
- <translation type="unfinished">Tidak Ada</translation>
+ <translation>Tidak Ada</translation>
</message>
</context>
<context>
@@ -3841,22 +3845,22 @@
</message>
<message>
<source>Reset shortcut to default</source>
- <translation type="unfinished"></translation>
+ <translation>Reset pintasan ke baku</translation>
</message>
<message>
<source>Unset shortcut</source>
- <translation type="unfinished"></translation>
+ <translation>Nirtata pintasan</translation>
</message>
</context>
<context>
<name>UIHotKeyTableModel</name>
<message>
<source>Name</source>
- <translation type="unfinished">Nama</translation>
+ <translation>Nama</translation>
</message>
<message>
<source>Shortcut</source>
- <translation type="unfinished"></translation>
+ <translation>Pintasan</translation>
</message>
</context>
<context>
@@ -3912,11 +3916,11 @@
<name>UIImportLicenseViewer</name>
<message>
<source><b>The virtual system "%1" requires that you agree to the terms and conditions of the software license agreement shown below.</b><br /><br />Click <b>Agree</b> to continue or click <b>Disagree</b> to cancel the import.</source>
- <translation><b>Sistem virtual "%1" menuntut Anda setuju dengan syarat dan ketentuan dari persetujuan lisensi software yang ditunjukkan di bawah.</b><br /><br />Klik <b>Setuju</b> untuk melanjutkan atau klik <b>Tidak Setuju</b> untuk membatalkan impor.</translation>
+ <translation><b>Sistem virtual "%1" menuntut Anda setuju dengan syarat dan ketentuan dari perjanjian lisensi perangkat lunak yang ditunjukkan di bawah.</b><br /><br />Klik <b>Setuju</b> untuk melanjutkan atau klik <b>Tidak Setuju</b> untuk membatalkan impor.</translation>
</message>
<message>
<source>Software License Agreement</source>
- <translation>Persetujuan Lisensi Software</translation>
+ <translation>Perjanjian Lisensi Perangkat Lunak</translation>
</message>
<message>
<source>&Disagree</source>
@@ -3940,7 +3944,7 @@
</message>
<message>
<source>Save license to file...</source>
- <translation>Simpan lisensi ke file...</translation>
+ <translation>Simpan lisensi ke berkas...</translation>
</message>
</context>
<context>
@@ -3948,27 +3952,27 @@
<message>
<source><p style='white-space:pre'><nobr>Indicates the activity of the virtual hard disks:</nobr>%1</p></source>
<comment>HDD tooltip</comment>
- <translation><p style='white-space:pre'><nobr>Mengindikasikan aktifitas media hard disk virtual:</nobr>%1</p></translation>
+ <translation><p style='white-space:pre'><nobr>Mengindikasikan aktivitas media hard disk virtual:</nobr>%1</p></translation>
</message>
<message>
<source><p style='white-space:pre'><nobr>Indicates the activity of the CD/DVD devices:</nobr>%1</p></source>
<comment>CD/DVD tooltip</comment>
- <translation><p style='white-space:pre'><nobr>Mengindikasikan aktifitas media CD/DVD:</nobr>%1</p></translation>
+ <translation><p style='white-space:pre'><nobr>Mengindikasikan aktivitas perangkat CD/DVD:</nobr>%1</p></translation>
</message>
<message>
<source><p style='white-space:pre'><nobr>Indicates the activity of the floppy devices:</nobr>%1</p></source>
<comment>FD tooltip</comment>
- <translation><p style='white-space:pre'><nobr>Mengindikasikan aktifitas media floppy:</nobr>%1</p></translation>
+ <translation><p style='white-space:pre'><nobr>Mengindikasikan aktivitas perangkat floppy:</nobr>%1</p></translation>
</message>
<message>
<source><p style='white-space:pre'><nobr>Indicates the activity of the network interfaces:</nobr>%1</p></source>
<comment>Network adapters tooltip</comment>
- <translation><p style='white-space:pre'><nobr>Mengindikasikan aktifitas antarmuka jaringan:</nobr>%1</p></translation>
+ <translation><p style='white-space:pre'><nobr>Mengindikasikan aktivitas antarmuka jaringan:</nobr>%1</p></translation>
</message>
<message>
<source><br><nobr><b>Adapter %1 (%2)</b>: %3 cable %4</nobr></source>
<comment>Network adapters tooltip</comment>
- <translation><br><nobr><b>Adapter %1 (%2)</b>: %3 kabel %4</nobr></translation>
+ <translation><br><nobr><b>Adaptor %1 (%2)</b>: %3 kabel %4</nobr></translation>
</message>
<message>
<source>connected</source>
@@ -3983,32 +3987,32 @@
<message>
<source><br><nobr><b>All network adapters are disabled</b></nobr></source>
<comment>Network adapters tooltip</comment>
- <translation><br><nobr><b>Semua adapter jaringan dimatikan</b></nobr></translation>
+ <translation><br><nobr><b>Semua adaptor jaringan dinonaktifkan</b></nobr></translation>
</message>
<message>
<source><p style='white-space:pre'><nobr>Indicates the activity of the attached USB devices:</nobr>%1</p></source>
<comment>USB device tooltip</comment>
- <translation><p style='white-space:pre'><nobr>Mengindikasikan aktifitas device USB terpasang:</nobr>%1</p></translation>
+ <translation><p style='white-space:pre'><nobr>Mengindikasikan aktivitas perangkat USB yang terpasang:</nobr>%1</p></translation>
</message>
<message>
<source><br><nobr><b>No USB devices attached</b></nobr></source>
<comment>USB device tooltip</comment>
- <translation><br><nobr><b>Tidak ada device USB terpasang</b></nobr></translation>
+ <translation><br><nobr><b>Tidak ada perangkat USB yang terpasang</b></nobr></translation>
</message>
<message>
<source><br><nobr><b>USB Controller is disabled</b></nobr></source>
<comment>USB device tooltip</comment>
- <translation><br><nobr><b>Kontroler USB dimatikan</b></nobr></translation>
+ <translation><br><nobr><b>Pengendali USB dinonaktifkan</b></nobr></translation>
</message>
<message>
<source><p style='white-space:pre'><nobr>Indicates the activity of the machine's shared folders:</nobr>%1</p></source>
<comment>Shared folders tooltip</comment>
- <translation><p style='white-space:pre'><nobr>Mengindikasikan aktifitas folder yang dishare:</nobr>%1</p></translation>
+ <translation><p style='white-space:pre'><nobr>Mengindikasikan aktivitas folder bersama:</nobr>%1</p></translation>
</message>
<message>
<source><br><nobr><b>No shared folders</b></nobr></source>
<comment>Shared folders tooltip</comment>
- <translation><br><nobr><b>Tidak ada folder yang dishare</b></nobr></translation>
+ <translation><br><nobr><b>Tidak ada folder dipakai bersama</b></nobr></translation>
</message>
<message>
<source><hr>The VRDP Server is listening on port %1</source>
@@ -4017,15 +4021,15 @@
<message>
<source><br><nobr><b>%1:</b> %2</nobr></source>
<comment>Virtualization Stuff LED</comment>
- <translation></translation>
+ <translation><br><nobr><b>%1:</b> %2</nobr></translation>
</message>
<message>
<source>Indicates whether the host mouse pointer is captured by the guest OS:<br><nobr><img src=:/mouse_disabled_16px.png/> pointer is not captured</nobr><br><nobr><img src=:/mouse_16px.png/> pointer is captured</nobr><br><nobr><img src=:/mouse_seamless_16px.png/> mouse integration (MI) is On</nobr><br><nobr><img src=:/mouse_can_seamless_ [...]
- <translation>Mengindikasikan apakah mouse pointer host tertangkap oleh sistem operasi guest:<br><nobr><img src=:/mouse_disabled_16px.png/> pointer tidak tertangkap</nobr><br><nobr><img src=:/mouse_16px.png/> pointer tertangkap</nobr><br><nobr><img src=:/mouse_seamless_16px.png/> integrasi mouse (MI) Menyala</nobr><br><nobr><img src=:/mous [...]
+ <translation>Mengindikasikan apakah penunjuk tetikus host ditangkap oleh sistem operasi guest:<br><nobr><img src=:/mouse_disabled_16px.png/> pointer tidak ditangkap</nobr><br><nobr><img src=:/mouse_16px.png/> pointer ditangkap</nobr><br><nobr><img src=:/mouse_seamless_16px.png/> integrasi tetikus (MI) Menyala</nobr><br><nobr><img src=:/mo [...]
</message>
<message>
<source>Indicates whether the keyboard is captured by the guest OS (<img src=:/hostkey_captured_16px.png/>) or not (<img src=:/hostkey_16px.png/>).</source>
- <translation>Mengindikasikan apakah keyboard tertangkap oleh Sistem Operasi guest (<img src=:/hostkey_captured_16px.png/>) atau tidak (<img src=:/hostkey_16px.png/>).</translation>
+ <translation>Mengindikasikan apakah papan tik ditangkap oleh Sistem Operasi guest (<img src=:/hostkey_captured_16px.png/>) atau tidak (<img src=:/hostkey_16px.png/>).</translation>
</message>
<message>
<source>Indicates whether the Remote Desktop Server is enabled (<img src=:/vrdp_16px.png/>) or not (<img src=:/vrdp_disabled_16px.png/>).</source>
@@ -4042,27 +4046,27 @@
</message>
<message>
<source><nobr>Indicates video capturing activity:</nobr><br>%1</source>
- <translation type="unfinished"></translation>
+ <translation><nobr>Mengindikasikan aktivitas penangkapan video:</nobr><br>%1</translation>
</message>
<message>
<source><nobr><b>Video capture disabled</b></nobr></source>
- <translation type="unfinished"></translation>
+ <translation><nobr><b>Penangkapan video dinonaktifkan</b></nobr></translation>
</message>
<message>
<source><nobr><b>Video capture file:</b> %1</nobr></source>
- <translation type="unfinished"></translation>
+ <translation><nobr><b>Berkas tangkapan video: </b> %1</nobr></translation>
</message>
<message>
<source>Additional feature status:<br><nobr><b>%1:</b> %2</nobr><br><nobr><b>%3:</b> %4</nobr><br><nobr><b>%5:</b> %6</nobr><br><nobr><b>%7:</b> %8%</nobr></source>
<comment>Virtualization Stuff LED</comment>
- <translation type="unfinished"></translation>
+ <translation>Status fitur tambahan: <br><nobr><b>%1:</b> %2</nobr><br><nobr><b>%3:</b> %4</nobr><br><nobr><b>%5:</b> %6</nobr><br><nobr><b>%7:</b> %8%</nobr></translation>
</message>
</context>
<context>
<name>UILineTextEdit</name>
<message>
<source>&Edit</source>
- <translation>&Edit</translation>
+ <translation>&Sunting</translation>
</message>
</context>
<context>
@@ -4077,7 +4081,7 @@
</message>
<message>
<source>Preview Monitor %1</source>
- <translation>Pratinjau Monitor %1</translation>
+ <translation>Pemantauan Pratinjau %1</translation>
</message>
<message>
<source>Snapshot %1</source>
@@ -4101,15 +4105,23 @@
</message>
<message>
<source>No USB Devices Connected</source>
- <translation>Tidak Ada Device USB Tersambung</translation>
+ <translation>Tidak Ada Perangkat USB Tersambung</translation>
</message>
<message>
<source>No supported devices connected to the host PC</source>
- <translation>Tidak ada device yang terdukung terkoneksi pada PC host</translation>
+ <translation>Tidak ada perangkat yang didukung yang terhubung ke PC host</translation>
</message>
<message>
<source>Select a filename for the screenshot ...</source>
- <translation type="unfinished"></translation>
+ <translation>Pilih sebuah nama berkas untuk cuplikan layar ...</translation>
+ </message>
+ <message>
+ <source>No Webcams Connected</source>
+ <translation>Tidak Ada Webcam Yang Tersambung</translation>
+ </message>
+ <message>
+ <source>No supported webcams connected to the host PC</source>
+ <translation>Tidak ada webcam yang didukung yang terhubung ke PC host</translation>
</message>
</context>
<context>
@@ -4120,7 +4132,7 @@
</message>
<message>
<source>Enable &Audio</source>
- <translation>&Nyalakan Suara</translation>
+ <translation>Fungsik&an Suara</translation>
</message>
<message>
<source>Host Audio &Driver:</source>
@@ -4175,7 +4187,7 @@
</message>
<message>
<source>Enable &3D Acceleration</source>
- <translation>Aktifkan Akselerasi &3D</translation>
+ <translation>Fungsikan Akselerasi &3D</translation>
</message>
<message>
<source>&Remote Display</source>
@@ -4183,11 +4195,11 @@
</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>Saat tertandai, VM akan bertindak sebagai server Remote Desktop Protocol (RDP), mengijinkan client jarak jauh untuk terhubung dan mengendalikan VM (saat berjalan) menggunakan client RDP standar.</translation>
+ <translation>Saat tertandai, VM akan bertindak sebagai server Remote Desktop Protocol (RDP), mengijinkan client jarak jauh untuk terhubung dan mengoperasikan VM (saat berjalan) menggunakan klien RDP standar.</translation>
</message>
<message>
<source>&Enable Server</source>
- <translation>Aktifkan S&erver</translation>
+ <translation>Fungsikan S&erver</translation>
</message>
<message>
<source>Server &Port:</source>
@@ -4203,11 +4215,11 @@
</message>
<message>
<source>Authentication &Timeout:</source>
- <translation>&Timeout Otentikasi:</translation>
+ <translation>&Tenggat Waktu Otentikasi:</translation>
</message>
<message>
<source>Specifies the timeout for guest authentication, in milliseconds.</source>
- <translation>Menyatakan timeout untuk otentikasi guest, dalam milidetik.</translation>
+ <translation>Menyatakan tenggat waktu untuk otentikasi guest, dalam milidetik.</translation>
</message>
<message>
<source>you have assigned less than <b>%1</b> of video memory which is the minimum amount required for HD Video to be played efficiently.</source>
@@ -4219,7 +4231,7 @@
</message>
<message>
<source>Enable &2D Video Acceleration</source>
- <translation>Aktifkan Akselerasi Video &2D</translation>
+ <translation>Fungsikan Akselerasi Video &2D</translation>
</message>
<message>
<source>The VRDP Server port number. You may specify <tt>0</tt> (zero), to select port 3389, the standard port for RDP.</source>
@@ -4259,130 +4271,130 @@
</message>
<message>
<source>Video &Capture</source>
- <translation type="unfinished"></translation>
+ <translation>&Tangkapan Video</translation>
</message>
<message>
<source>When checked, VirtualBox will record the virtual machine session as a video file.</source>
- <translation type="unfinished"></translation>
+ <translation>Saat tertandai, VirtualBox akan merekam sesi mesin virtual sebagai suatu berkas video.</translation>
</message>
<message>
<source>&Enable Video Capture</source>
- <translation type="unfinished"></translation>
+ <translation>Fungsikan P&enangkapan Video</translation>
</message>
<message>
<source>File &Path:</source>
- <translation type="unfinished"></translation>
+ <translation>&Path Berkas:</translation>
</message>
<message>
<source>This setting determines the filename VirtualBox uses to save the recorded content.</source>
- <translation type="unfinished"></translation>
+ <translation>Pengaturan ini menentukan nama berkas yang dipakai oleh VirtualBox untuk menyimpan isi rekaman.</translation>
</message>
<message>
<source>Frame &Size:</source>
- <translation type="unfinished"></translation>
+ <translation>&Ukuran Frame:</translation>
</message>
<message>
<source>This setting determines the resolution (frame size) of the recorded video.</source>
- <translation type="unfinished"></translation>
+ <translation>Pengaturan ini menentukan resolusi (ukuran frame) dari video rekaman.</translation>
</message>
<message>
<source>This setting determines the <b>horizontal</b> resolution (frame width) of the recorded video.</source>
- <translation type="unfinished"></translation>
+ <translation>Pengaturan ini menentukan resolusi <b>horisontal</b> (lebar frame) dari video rekaman.</translation>
</message>
<message>
<source>This setting determines the <b>vertical</b> resolution (frame height) of the recorded video.</source>
- <translation type="unfinished"></translation>
+ <translation>Pengaturan ini menentukan resolusi <b>vertikal</b> (tinggi frame) dari video rekaman.</translation>
</message>
<message>
<source>&Frame Rate:</source>
- <translation type="unfinished"></translation>
+ <translation>Laju &Frame:</translation>
</message>
<message>
<source>This setting determines the maximum number of <b>frames per second</b>. Additional frames will be skipped. Reducing this value will increase the number of skipped frames and reduce the file size.</source>
- <translation type="unfinished"></translation>
+ <translation>Pengaturan ini menentukan cacah maksimum <b>frame per detik</b>. Frame tambahan akan dilewati. Mengurangi nilai ini akan menaikkan banyaknya frame yang dilewati dan mengurangi ukuran berkas.</translation>
</message>
<message>
<source>&Quality:</source>
- <translation type="unfinished"></translation>
+ <translation>&Kualitas:</translation>
</message>
<message>
<source>This setting determines the <b>quality</b>. Increasing this value will make the video look better at the cost of an increased file size.</source>
- <translation type="unfinished"></translation>
+ <translation>Pengaturan ini menentukan <b>kualitas</b>. Menaikkan nilai ini akan membuat video nampak lebih baik tapi ukuran berkas meningkat.</translation>
</message>
<message>
<source>This setting determines the bitrate in <b>kilobits per second</b>. Increasing this value will make the video look better at the cost of an increased file size.</source>
- <translation type="unfinished"></translation>
+ <translation>Pengaturan ini menentukan laju bit dalam <b>kilobit per detik</b>. Menaikkan nilai ini akan membuat video nampak lebih baik tapi ukuran berkas meningkat.</translation>
</message>
<message>
<source>&Screens:</source>
- <translation type="unfinished"></translation>
+ <translation>&Layar:</translation>
</message>
<message>
<source>The virtual machine is set up to use hardware graphics acceleration. However the host system does not currently provide this, so you will not be able to start the machine.</source>
- <translation type="unfinished"></translation>
+ <translation>Mesin virtual disiapkan untuk memakai akselerasi grafis perangkat keras. Namun sistem host saat ini tidak menyediakannya, sehingga Anda tidak akan bisa mulai menjalankan mesin.</translation>
</message>
<message>
<source>The virtual machine is currently assigned less than <b>%1</b> of video memory which is the minimum amount required to switch to fullscreen or seamless mode.</source>
- <translation type="unfinished"></translation>
+ <translation>Mesin virtual saat ini diberi memori video kurang dari <b>%1</b> yang merupakan jumlah minimum yang diperlukan untuk bertukar ke mode layar penuh atau seamless.</translation>
</message>
<message>
<source>The virtual machine is currently assigned less than <b>%1</b> of video memory which is the minimum amount required for High Definition Video to be played efficiently.</source>
- <translation type="unfinished"></translation>
+ <translation>Mesin virtual saat ini diberi memori video kurang dari <b>%1</b> yang merupakan jumlah minimum yang diperlukan bagi High Definition Video untuk diputar secara efisien.</translation>
</message>
<message>
<source>The virtual machine is set up to use hardware graphics acceleration and the operating system hint is set to Windows Vista or later. For best performance you should set the machine's video memory to at least b>%1</b>.</source>
- <translation type="unfinished"></translation>
+ <translation>Mesin virtual disiapkan untuk memakai akselerasi grafis perangkat keras dan arahan sistem operasi ditata ke Windows Vista atau setelahnya. Untuk kinerja terbaik Anda mesti menata memori video mesin paling tidak <b>%1</b>.</translation>
</message>
<message>
<source>The virtual machine is set up to use Video Stream Acceleration. As this feature only works with Windows guest systems it will be disabled.</source>
- <translation type="unfinished"></translation>
+ <translation>Mesin virtual disiapkan untuk memakai Akselerasi Stream Video. Karena fitur ini hanya bekerja dengan sistem guest Windows itu akan dinonaktifkan.</translation>
</message>
<message>
<source>The VRDE server port value is not currently specified.</source>
- <translation type="unfinished"></translation>
+ <translation>Nilai port server VRDE saat ini tidak dinyatakan.</translation>
</message>
<message>
<source>The VRDE authentication timeout value is not currently specified.</source>
- <translation type="unfinished"></translation>
+ <translation>Nilai tenggat waktu otentikasi VRDE saat ini tidak dinyatakan.</translation>
</message>
<message>
<source>User Defined</source>
- <translation type="unfinished"></translation>
+ <translation>Didefinisikan Oleh Pengguna</translation>
</message>
<message>
<source>%1 fps</source>
- <translation type="unfinished"></translation>
+ <translation>%1 fps</translation>
</message>
<message>
<source>fps</source>
- <translation type="unfinished"></translation>
+ <translation>fps</translation>
</message>
<message>
<source>low</source>
<comment>quality</comment>
- <translation type="unfinished"></translation>
+ <translation>rendah</translation>
</message>
<message>
<source>medium</source>
<comment>quality</comment>
- <translation type="unfinished"></translation>
+ <translation>sedang</translation>
</message>
<message>
<source>high</source>
<comment>quality</comment>
- <translation type="unfinished"></translation>
+ <translation>tinggi</translation>
</message>
<message>
<source>kbps</source>
- <translation type="unfinished"></translation>
+ <translation>kbps</translation>
</message>
<message>
<source>Screen %1</source>
- <translation type="unfinished"></translation>
+ <translation>Layar %1</translation>
</message>
<message>
<source>Enable video recording for screen %1.</source>
- <translation type="unfinished"></translation>
+ <translation>Fungsikan perekaman video bagi layar %1.</translation>
</message>
</context>
<context>
@@ -4393,7 +4405,7 @@
</message>
<message>
<source>Holds 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>Tampilkan path dimana snapshot dari mesin virtual akan disimpan. Sadari bahwa snapshot dapat menghabiskan banyak ruang disk.</translation>
+ <translation>Menyimpan path tempat snapshot dari mesin virtual akan disimpan. Sadari bahwa snapshot dapat menghabiskan banyak ruang disk.</translation>
</message>
<message>
<source>&Basic</source>
@@ -4477,11 +4489,11 @@
</message>
<message>
<source>&Shared Clipboard:</source>
- <translation>Clipboard yang di-&Share:</translation>
+ <translation>Papan Klip Ber&sama:</translation>
</message>
<message>
<source>Selects which clipboard data will be copied between the guest and the host OS. This feature requires Guest Additions to be installed in the guest OS.</source>
- <translation>Memilih data clipboard mana yang akan disalin diantara OS guest dan host. Fitur ini membutuhkan Guest Additions terinstall pada OS guest.</translation>
+ <translation>Memilih data clipboard mana yang akan disalin di antara OS guest dan host. Fitur ini membutuhkan Guest Additions terpasang pada OS guest.</translation>
</message>
<message>
<source>Defines the type of the virtual IDE controller. Depending on this value, VirtualBox will provide different virtual IDE hardware devices to the guest OS.</source>
@@ -4497,15 +4509,15 @@
</message>
<message>
<source>Holds the description of the virtual machine. The description field is useful for commenting on configuration details of the installed guest OS.</source>
- <translation>Menampilkan deskripsi mesin virtual. Field deskripsi berguna untuk memberikan komentar pada detail konfigurasi dari OS guest terinstal.</translation>
+ <translation>Menyimpan deskripsi mesin virtual. Field deskripsi berguna untuk memberikan komentar pada detail konfigurasi dari OS guest yang terpasang.</translation>
</message>
<message>
<source>If checked, any CD/DVD or floppy disks inserted into or removed from the virtual drives while the machine is running will be remembered.</source>
- <translation>Saat tertandai, perubahan apapun pada media CD/DVD atau Floppy terpasang yang dilakukan saat eksekusi mesin akan disimpan dalam file setting guna menjaga konfigurasi media termuat diantara penjalanan.</translation>
+ <translation>Saat tertandai, sebarang CD/DVD atau disk floppy yang disisipkan ke atau dilepas dari drive virtual ketika mesin sedang berjalan akan diingat.</translation>
</message>
<message>
<source>Removable Media:</source>
- <translation>Media Removable:</translation>
+ <translation>Media Lepas Pasang:</translation>
</message>
<message>
<source>&Remember Runtime Changes</source>
@@ -4513,19 +4525,19 @@
</message>
<message>
<source>Mini ToolBar:</source>
- <translation>ToolBar Mini:</translation>
+ <translation>Bilah Alat Mini:</translation>
</message>
<message>
<source>If checked, show the Mini ToolBar in Fullscreen and Seamless modes.</source>
- <translation>Bila ditandai, menampilkan ToolBar Mini dalam mode Fullscreen dan Seamless.</translation>
+ <translation>Bila ditandai, menampilkan Bilah Alat Mini dalam mode Layar Penuh dan Seamless.</translation>
</message>
<message>
<source>Show in &Fullscreen/Seamless</source>
- <translation>Tampilkan Dalam &Fullscreen/Seamless</translation>
+ <translation>Tampilkan Dalam Layar &Penuh/Seamless</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>
- <translation>Bila ditandai, menampilkan ToolBar Mini di puncak layar, bukan di posisi default di dasar layar.</translation>
+ <translation>Bila ditandai, menampilkan Bilah Alat Mini di puncak layar, bukan pada posisi baku di dasar layar.</translation>
</message>
<message>
<source>Show at &Top of Screen</source>
@@ -4537,19 +4549,19 @@
</message>
<message>
<source>&Drag'n'Drop:</source>
- <translation type="unfinished"></translation>
+ <translation>&Drag'n'Drop:</translation>
</message>
<message>
<source>Selects which data will be copied between the guest and the host OS by drag'n'drop. This feature requires Guest Additions to be installed in the guest OS.</source>
- <translation type="unfinished"></translation>
+ <translation>Memilih data mana yang akan disalin di antara OS guest dan host oleh drag'n'drop. Fitur ini membutuhkan Guest Additions terpasang pada OS guest.</translation>
</message>
<message>
<source>No name specified for the virtual machine.</source>
- <translation type="unfinished"></translation>
+ <translation>Tidak ada nama yang dinyatakan bagi mesin virtual.</translation>
</message>
<message>
<source>The virtual machine operating system hint is set to a 64-bit type. 64-bit guest systems require hardware virtualization, so this will be enabled automatically if you confirm the changes.</source>
- <translation type="unfinished"></translation>
+ <translation>Arahan sistem operasi mesin virtual ditata ke tipe 64 bit. Sistem guest 64 bit memerlukan virtualisasi perangkat keras, sehingga ini akan difungsikan secara otomatis bila Anda mengkonfirmasi perubahan.</translation>
</message>
</context>
<context>
@@ -4568,11 +4580,11 @@
</message>
<message>
<source>&Enable Network Adapter</source>
- <translation>&Aktifkan Adaptor Jaringan</translation>
+ <translation>&Fungsikan Adaptor Jaringan</translation>
</message>
<message>
<source>Selects the type of the virtual network adapter. Depending on this value, VirtualBox will provide different network hardware to the virtual machine.</source>
- <translation>Memilih tipe adaptor jaringan virtual. Bergantung pada nilai tersebut, VirtualBox akan menyediakan hardware jaringan yang berbeda bagi mesin virtual.</translation>
+ <translation>Memilih tipe adaptor jaringan virtual. Bergantung pada nilai tersebut, VirtualBox akan menyediakan perangkat keras jaringan yang berbeda bagi mesin virtual.</translation>
</message>
<message>
<source>&Attached to:</source>
@@ -4588,7 +4600,7 @@
</message>
<message>
<source>Holds the MAC address of this adapter. It contains exactly 12 characters chosen from {0-9,A-F}. Note that the second character must be an even digit.</source>
- <translation>Menampilkan alamat MAC dari adaptor ini. Ia berisi tepat 12 karakter dipilih dari {0-9,A-F}. Perhatikan bahwa karakter kedua harus digit genap.</translation>
+ <translation>Menyimpan alamat MAC dari adaptor ini. Ia berisi tepat 12 karakter dipilih dari {0-9,A-F}. Perhatikan bahwa karakter kedua harus digit genap.</translation>
</message>
<message>
<source>Generates a new random MAC address.</source>
@@ -4679,11 +4691,11 @@
</message>
<message>
<source>&Cable Connected</source>
- <translation>Ka&bel terhubung</translation>
+ <translation>Ka&bel Tersambung</translation>
</message>
<message>
<source>Opens a window to manage port forwarding rules.</source>
- <translation>Buka dialog untuk mengelola aturan penerusan port.</translation>
+ <translation>Buka jendela untuk mengelola aturan penerusan port.</translation>
</message>
<message>
<source>&Port Forwarding</source>
@@ -4727,39 +4739,39 @@
</message>
<message>
<source>&MAC Address:</source>
- <translation type="unfinished"></translation>
+ <translation>Alamat &MAC:</translation>
</message>
<message>
<source>No bridged network adapter is currently selected.</source>
- <translation type="unfinished"></translation>
+ <translation>Tidak ada adaptor jaringan ter-bridge yang saat ini dipilih.</translation>
</message>
<message>
<source>No internal network name is currently specified.</source>
- <translation type="unfinished"></translation>
+ <translation>Nama jaringan internal saat ini tidak dinyatakan.</translation>
</message>
<message>
<source>No host-only network adapter is currently selected.</source>
- <translation type="unfinished"></translation>
+ <translation>Tidak ada adaptor jaringan hanya-host saat ini yang dipilih.</translation>
</message>
<message>
<source>No generic driver is currently selected.</source>
- <translation type="unfinished"></translation>
+ <translation>Tidak ada driver generik yang saat ini dipilih.</translation>
</message>
<message>
<source>The MAC address must be 12 hexadecimal digits long.</source>
- <translation type="unfinished"></translation>
+ <translation>Alamat MAC mesti sepanjang 12 dijit heksadesimal.</translation>
</message>
<message>
<source>The second digit in the MAC address may not be odd as only unicast addresses are allowed.</source>
- <translation type="unfinished"></translation>
+ <translation>Dijit kedua dalam alamat MAC tidak boleh ganjil karena hanya alamt unicast yang diijinkan.</translation>
</message>
<message>
<source>No NAT network name is currently specified.</source>
- <translation type="unfinished"></translation>
+ <translation>Nama jaringan NAT saat ini tidak dinyatakan.</translation>
</message>
<message>
<source>Holds the name of the NAT network that this network card will be connected to. You can create and remove networks using the global network settings in the virtual machine manager window.</source>
- <translation type="unfinished"></translation>
+ <translation>Menyimpan nama jaringan NAT tempat akan terhubungnya kartu jaringan ini. Anda dapat membuat dan menghapus jaringan memakai pengaturan jaringan global dalam jendela manajer mesin virtual.</translation>
</message>
</context>
<context>
@@ -4801,7 +4813,7 @@
</message>
<message>
<source>&Enable Parallel Port</source>
- <translation>Nyalakan Port Paral&el</translation>
+ <translation>Fungsikan Port Paral&el</translation>
</message>
<message>
<source>Port &Number:</source>
@@ -4809,7 +4821,7 @@
</message>
<message>
<source>Holds the parallel port number. You can choose one of the standard parallel ports or select <b>User-defined</b> and specify port parameters manually.</source>
- <translation>Tampilkan nomor port paralel. Anda dapat memilih satu dari port paralel standar atau pilih <b>Didefinisikan pengguna</b> dan menyatakan parameter port secara manual.</translation>
+ <translation>Menyimpan nomor port paralel. Anda dapat memilih satu dari port paralel standar atau pilih <b>Didefinisikan pengguna</b> dan menyatakan parameter port secara manual.</translation>
</message>
<message>
<source>&IRQ:</source>
@@ -4833,15 +4845,15 @@
</message>
<message>
<source>Holds the host parallel device name.</source>
- <translation>Tampilkan nama device paralel milik host.</translation>
+ <translation>Menyimpan nama device paralel milik host.</translation>
</message>
<message>
<source>Holds the IRQ number of this parallel port. This should be a whole number between <tt>0</tt> and <tt>255</tt>. Values greater than <tt>15</tt> may only be used if the <b>I/O APIC</b> setting is enabled for this virtual machine.</source>
- <translation>Tampilkan nomor IRQ dari port paralel ini. Ini mesti berupa bilangan bulat antara <tt>0</tt> dan <tt>255</tt>. Nilai lebih dari <tt>15</tt> hanya bisa digunakan bila pengaturan <b>I/O APIC</b> dinyalakan untuk mesin virtual ini.</translation>
+ <translation>Menyimpan nomor IRQ dari port paralel ini. Ini mesti berupa bilangan bulat antara <tt>0</tt> dan <tt>255</tt>. Nilai lebih dari <tt>15</tt> hanya bisa digunakan bila pengaturan <b>I/O APIC</b> dinyalakan untuk mesin virtual ini.</translation>
</message>
<message>
<source>Holds the base I/O port address of this parallel port. Valid values are integer numbers in range from <tt>0</tt> to <tt>0xFFFF</tt>.</source>
- <translation>Tampilkan alamat dasar port I/O dari port paralel ini. Nilai yang valid adalah bilangan bulat dalam jangkauan <tt>0</tt> hingga <tt>0xFFFF</tt>.</translation>
+ <translation>Menyimpan alamat dasar port I/O dari port paralel ini. Nilai yang valid adalah bilangan bulat dalam jangkauan <tt>0</tt> hingga <tt>0xFFFF</tt>.</translation>
</message>
</context>
<context>
@@ -4860,23 +4872,23 @@
</message>
<message>
<source>No IRQ is currently specified.</source>
- <translation type="unfinished"></translation>
+ <translation>IRQ saat ini tidak dinyatakan.</translation>
</message>
<message>
<source>No I/O port is currently specified.</source>
- <translation type="unfinished"></translation>
+ <translation>Port I/O saat ini tidak dinyatakan.</translation>
</message>
<message>
<source>Two or more ports have the same settings.</source>
- <translation type="unfinished"></translation>
+ <translation>Dua port atau lebih memiliki pengaturan yang sama.</translation>
</message>
<message>
<source>No port path is currently specified.</source>
- <translation type="unfinished"></translation>
+ <translation>Path port saat ini tidak dinyatakan.</translation>
</message>
<message>
<source>There are currently duplicate port paths specified.</source>
- <translation type="unfinished"></translation>
+ <translation>Saat ini ada path port yang duplikat.</translation>
</message>
</context>
<context>
@@ -4914,15 +4926,15 @@
<name>UIMachineSettingsSF</name>
<message>
<source>Adds a new shared folder definition.</source>
- <translation>Menambahkan sebuah definisi baru folder yang di share.</translation>
+ <translation>Menambahkan sebuah definisi baru folder bersama.</translation>
</message>
<message>
<source>Edits the selected shared folder definition.</source>
- <translation>Edit definisi folder yang di share yang dipilih.</translation>
+ <translation>Sunting definisi folder bersama yang dipilih.</translation>
</message>
<message>
<source>Removes the selected shared folder definition.</source>
- <translation>Hapus definisi folder yang di share yang dipilih.</translation>
+ <translation>Menghapus definisi folder bersama yang dipilih.</translation>
</message>
<message>
<source> Machine Folders</source>
@@ -4942,7 +4954,7 @@
</message>
<message>
<source>Lists all shared folders accessible to this machine. Use 'net use x: \\vboxsvr\share' to access a shared folder named <i>share</i> from a DOS-like OS, or 'mount -t vboxsf share mount_point' to access it from a Linux OS. This feature requires Guest Additions.</source>
- <translation>Tampilkan daftar semua folder yang di share yang dapat diakses oleh mesin ini. Gunakan 'net use x: \\vboxsvr\share' untuk mengakses sebuah folder yang di share bernama <i>share</i> dari OS serupa DOS atau 'mount -t vboxsf share titik_mount_point' dari OS Linux. Fitur ini membutuhkan Guest Additions.</translation>
+ <translation>Menampilkan daftar semua folder bersama yang dapat diakses oleh mesin ini. Gunakan 'net use x: \\vboxsvr\share' untuk mengakses sebuah folder bersama bernama <i>share</i> dari OS serupa DOS atau 'mount -t vboxsf share titik_kait' dari OS Linux. Fitur ini membutuhkan Guest Additions.</translation>
</message>
<message>
<source>Name</source>
@@ -4958,15 +4970,15 @@
</message>
<message>
<source>&Add Shared Folder</source>
- <translation>T&ambah Folder Yang Di-Share</translation>
+ <translation>T&ambah Folder Bersama</translation>
</message>
<message>
<source>&Edit Shared Folder</source>
- <translation>&Edit Folder Yang Di-Share</translation>
+ <translation>&Sunting Folder Bersama</translation>
</message>
<message>
<source>&Remove Shared Folder</source>
- <translation>Hapus Folde&r Yang Di-Share</translation>
+ <translation>Hapus Folde&r Bersama</translation>
</message>
<message>
<source>&Folders List</source>
@@ -4974,7 +4986,7 @@
</message>
<message>
<source>Auto-mount</source>
- <translation>Mount Otomatis</translation>
+ <translation>Kaitkan Otomatis</translation>
</message>
<message>
<source>Yes</source>
@@ -4985,11 +4997,11 @@
<name>UIMachineSettingsSFDetails</name>
<message>
<source>Add Share</source>
- <translation>Tambahkan Share</translation>
+ <translation>Tambahkan Berbagi Pakai</translation>
</message>
<message>
<source>Edit Share</source>
- <translation>Edit Share</translation>
+ <translation>Sunting Berbagi Pakai</translation>
</message>
<message>
<source>Dialog</source>
@@ -5005,11 +5017,11 @@
</message>
<message>
<source>Holds the name of the shared folder (as it will be seen by the guest OS).</source>
- <translation>Tampilkan nama dari folder yang di share (sebagaimana terlihat oleh OS guest).</translation>
+ <translation>Menyimpan nama dari folder yang dipakai bersama (sebagaimana terlihat oleh OS guest).</translation>
</message>
<message>
<source>When checked, the guest OS will not be able to write to the specified shared folder.</source>
- <translation>Saat ditandai, OS guest tidak akan dapat menulis ke folder yang di-share yang dinyatakan.</translation>
+ <translation>Saat ditandai, OS guest tidak akan dapat menulis ke folder bersama yang dinyatakan.</translation>
</message>
<message>
<source>&Read-only</source>
@@ -5021,19 +5033,19 @@
</message>
<message>
<source>When checked, the guest OS will try to automatically mount the shared folder on startup.</source>
- <translation>Saat ditandai, OS guest akan mencoba me-mount secara otomatis, folder yang di-share, saat startup.</translation>
+ <translation>Saat ditandai, OS guest akan mencoba mengait secara otomatis folder bersama saat awal mula.</translation>
</message>
<message>
<source>&Auto-mount</source>
- <translation>Mount otom&atis</translation>
+ <translation>Kaitkan otom&atis</translation>
</message>
<message>
<source>If checked, this shared folder will be permanent.</source>
- <translation>Bila ditandai, folder yang di-share ini akan permanen.</translation>
+ <translation>Bila ditandai, folder bersama ini akan permanen.</translation>
</message>
<message>
<source>Window</source>
- <translation type="unfinished"></translation>
+ <translation>Jendela</translation>
</message>
</context>
<context>
@@ -5045,11 +5057,11 @@
</message>
<message>
<source>When checked, enables the given serial port of the virtual machine.</source>
- <translation>Saat ditandai, nyalakan port serial yang diberikan pada mesin virtual.</translation>
+ <translation>Saat ditandai, memfungsikan port serial yang diberikan pada mesin virtual.</translation>
</message>
<message>
<source>&Enable Serial Port</source>
- <translation>Nyalakan Port S&erial</translation>
+ <translation>Fungsikan Port S&erial</translation>
</message>
<message>
<source>Port &Number:</source>
@@ -5057,7 +5069,7 @@
</message>
<message>
<source>Selects the serial port number. You can choose one of the standard serial ports or select <b>User-defined</b> and specify port parameters manually.</source>
- <translation>Tampilkan nomor port serial. Anda dapat memilih satu dari port serial standar atau pilih <b>Didefinisikan oleh pengguna</b> dan menyatakan parameter port secara manual.</translation>
+ <translation>Pilih nomor port serial. Anda dapat memilih satu dari port serial standar atau pilih <b>Didefinisikan oleh pengguna</b> dan menyatakan parameter port secara manual.</translation>
</message>
<message>
<source>&IRQ:</source>
@@ -5085,7 +5097,7 @@
</message>
<message>
<source>If checked, the pipe specified in the <b>Port Path</b> field will be created by the virtual machine when it starts. Otherwise, the virtual machine will assume that the pipe exists and try to use it.</source>
- <translation>BIla ditandai, pipa yang disebutkan dalam field <b>Path Port</b> akan diciptakan oleh mesin virtual saat ia mulai menyala. Jika tidak, mesin virtual akan menganggap pipa ada dan mencoba menggunakannya.</translation>
+ <translation>BIla ditandai, pipa yang disebutkan dalam ruas <b>Path Port</b> akan diciptakan oleh mesin virtual saat mulai menyala. Jika tidak, mesin virtual akan menganggap pipa ada dan mencoba menggunakannya.</translation>
</message>
<message>
<source>&Create Pipe</source>
@@ -5093,7 +5105,7 @@
</message>
<message>
<source>Holds the path to the serial port's pipe on the host when the port is working in <b>Host Pipe</b> mode, or the host serial device name when the port is working in <b>Host Device</b> mode.</source>
- <translation>Tampilkan path ke pipa port serial pada host saat port bekerja pada mode <b>Pipa Host</a>, atau nama device serial host saat port bekerja pada mode <b>Device Host</b>.</translation>
+ <translation>Menyimpan path ke pipa port serial pada host saat port bekerja pada mode <b>Pipa Host</a>, atau nama perangkat serial host saat port bekerja pada mode <b>Device Host</b>.</translation>
</message>
<message>
<source>Port/File &Path:</source>
@@ -5101,11 +5113,11 @@
</message>
<message>
<source>Holds the IRQ number of this serial port. This should be a whole number between <tt>0</tt> and <tt>255</tt>. Values greater than <tt>15</tt> may only be used if the <b>I/O APIC</b> setting is enabled for this virtual machine.</source>
- <translation>Tampilkan nomor IRQ dari port serial ini. Ini mesti berupa bilangan bulat antara <tt>0</tt> dan <tt>255</tt>. Nilai lebih dari <tt>15</tt> hanya bisa digunakan bila pengaturan <b>I/O APIC</b> dinyalakan untuk mesin virtual ini.</translation>
+ <translation>Menyimpan nomor IRQ dari port serial ini. Ini mesti berupa bilangan bulat antara <tt>0</tt> dan <tt>255</tt>. Nilai lebih dari <tt>15</tt> hanya bisa digunakan bila pengaturan <b>I/O APIC</b> dinyalakan untuk mesin virtual ini.</translation>
</message>
<message>
<source>Holds the base I/O port address of this serial port. Valid values are integer numbers in range from <tt>0</tt> to <tt>0xFFFF</tt>.</source>
- <translation>Tampilkan alamat dasar port I/O dari port paralel ini. Nilai yang valid adalah bilangan bulat dalam jangkauan <tt>0</tt> hingga <tt>0xFFFF</tt>.</translation>
+ <translation>Menyimpan alamat dasar port I/O dari port paralel ini. Nilai yang valid adalah bilangan bulat dalam jangkauan <tt>0</tt> hingga <tt>0xFFFF</tt>.</translation>
</message>
</context>
<context>
@@ -5124,23 +5136,23 @@
</message>
<message>
<source>No IRQ is currently specified.</source>
- <translation type="unfinished"></translation>
+ <translation>IRQ saat ini tidak dinyatakan.</translation>
</message>
<message>
<source>No I/O port is currently specified.</source>
- <translation type="unfinished"></translation>
+ <translation>Port I/O saat ini tidak dinyatakan.</translation>
</message>
<message>
<source>Two or more ports have the same settings.</source>
- <translation type="unfinished"></translation>
+ <translation>Dua port atau lebih memiliki pengaturan yang sama.</translation>
</message>
<message>
<source>No port path is currently specified.</source>
- <translation type="unfinished"></translation>
+ <translation>Path port saat ini tidak dinyatakan.</translation>
</message>
<message>
<source>There are currently duplicate port paths specified.</source>
- <translation type="unfinished"></translation>
+ <translation>Saat ini ada path port yang duplikat.</translation>
</message>
</context>
<context>
@@ -5179,7 +5191,7 @@
</message>
<message>
<source><nobr>Expand/Collapse Item</nobr></source>
- <translation><nobr>Kembangkan/Ringkaskan :Item</nobr></translation>
+ <translation><nobr>Kembangkan/Ringkaskan Butir</nobr></translation>
</message>
<message>
<source><nobr>Add Hard Disk</nobr></source>
@@ -5187,11 +5199,11 @@
</message>
<message>
<source><nobr>Add CD/DVD Device</nobr></source>
- <translation><nobr>Tambah Device CD/DVD</nobr></translation>
+ <translation><nobr>Tambah Perangkat CD/DVD</nobr></translation>
</message>
<message>
<source><nobr>Add Floppy Device</nobr></source>
- <translation><nobr>Tambah Device Floppy</nobr></translation>
+ <translation><nobr>Tambah Perangkat Floppy</nobr></translation>
</message>
<message>
<source><i>%1</i> uses a medium that is already attached to <i>%2</i>.</source>
@@ -5231,11 +5243,11 @@
</message>
<message>
<source>Add CD/DVD Device</source>
- <translation>Tambah Device CD/DVD</translation>
+ <translation>Tambah Perangkat CD/DVD</translation>
</message>
<message>
<source>Add Floppy Device</source>
- <translation>Tambah Device Floppy</translation>
+ <translation>Tambah Perangkat Floppy</translation>
</message>
<message>
<source>Remove Attachment</source>
@@ -5247,7 +5259,7 @@
</message>
<message>
<source>Removes the controller highlighted in the Storage Tree.</source>
- <translation>Hapus pengendali yang di-highlight pada Pohon Penyimpanan.</translation>
+ <translation>Hapus pengendali yang disorot pada Pohon Penyimpanan.</translation>
</message>
<message>
<source>Adds a new attachment to the Storage Tree using currently selected controller as parent.</source>
@@ -5255,7 +5267,7 @@
</message>
<message>
<source>Removes the attachment highlighted in the Storage Tree.</source>
- <translation>Hapus cantolan yang di-highlight dalam Pohon Penyimpanan.</translation>
+ <translation>Hapus cantolan yang disorot dalam Pohon Penyimpanan.</translation>
</message>
<message>
<source>IDE Controller</source>
@@ -5283,7 +5295,7 @@
</message>
<message>
<source>Contains all storage controllers for this machine and the virtual images and host drives attached to them.</source>
- <translation>Memuat semua pengendali penyimpanan bagi mesin ini dan image virtual serta drive host ditancapkan ke mereka.</translation>
+ <translation>Memuat semua pengendali penyimpanan bagi mesin ini dan image virtual serta drive host yang ditancapkan ke mereka.</translation>
</message>
<message>
<source>Information</source>
@@ -5379,11 +5391,11 @@
</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>Pilih atau ciptakan file hard disk virtual. Mesin virtual akan melihat data dalam file sebagai isi hard disk virtual.</translation>
+ <translation>Pilih atau ciptakan berkas hard disk virtual. Mesin virtual akan melihat data dalam berkas sebagai isi hard disk virtual.</translation>
</message>
<message>
<source>Set up the virtual hard disk</source>
- <translation>Set up hard disk virtual</translation>
+ <translation>Siapkan hard disk virtual</translation>
</message>
<message>
<source>CD/DVD &Drive:</source>
@@ -5391,11 +5403,11 @@
</message>
<message>
<source>Choose a virtual CD/DVD disk or a physical drive to use with the virtual drive. The virtual machine will see a disk inserted into the drive with the data in the file or on the disk in the physical drive as its contents.</source>
- <translation>Pilih disk CD/DVD virtual atau drive fisik untuk dipakai dengan drive virtual. Mesin virtual akan melihat suatu disk disisipkan ke dalam drive dengan data dalam file atau pada disk dalam drive fisik sebagai isinya.</translation>
+ <translation>Pilih disk CD/DVD virtual atau drive fisik untuk dipakai dengan drive virtual. Mesin virtual akan melihat suatu disk disisipkan ke dalam drive dengan data dalam berkas atau pada disk dalam drive fisik sebagai isinya.</translation>
</message>
<message>
<source>Set up the virtual CD/DVD drive</source>
- <translation>Set up drive CD/DVD virtual</translation>
+ <translation>Siapkan drive CD/DVD virtual</translation>
</message>
<message>
<source>Floppy &Drive:</source>
@@ -5403,11 +5415,11 @@
</message>
<message>
<source>Choose a virtual floppy disk or a physical drive to use with the virtual drive. The virtual machine will see a disk inserted into the drive with the data in the file or on the disk in the physical drive as its contents.</source>
- <translation>Pilih disk floppy virtual atau drive fisik untuk dipakai dengan drive virtual. Mesin virtual akan melihat suatu disk disisipkan ke dalam drive dengan data dalam file atau pada disk dalam drive fisik sebagai isinya.</translation>
+ <translation>Pilih disk floppy virtual atau drive fisik untuk dipakai dengan drive virtual. Mesin virtual akan melihat suatu disk disisipkan ke dalam drive dengan data dalam berkas atau pada disk dalam drive fisik sebagai isinya.</translation>
</message>
<message>
<source>Set up the virtual floppy drive</source>
- <translation>Set up drive floppy virtual</translation>
+ <translation>Siapkan drive floppy virtual</translation>
</message>
<message>
<source>Create a new hard disk...</source>
@@ -5415,11 +5427,11 @@
</message>
<message>
<source>Choose a virtual hard disk file...</source>
- <translation>Pilih file hard disk virtual...</translation>
+ <translation>Pilih berkas hard disk virtual...</translation>
</message>
<message>
<source>Choose a virtual CD/DVD disk file...</source>
- <translation>Pilih sebuah file CD/DVD virtual...</translation>
+ <translation>Pilih sebuah berkas CD/DVD virtual...</translation>
</message>
<message>
<source>Remove disk from virtual drive</source>
@@ -5427,7 +5439,7 @@
</message>
<message>
<source>Choose a virtual floppy disk file...</source>
- <translation>Pilih sebuah file floppy virtual...</translation>
+ <translation>Pilih sebuah berkas floppy virtual...</translation>
</message>
<message>
<source>When checked the virtual disk will not be removed when the guest system ejects it.</source>
@@ -5439,11 +5451,11 @@
</message>
<message>
<source>When checked the guest system will see the virtual disk as a solid state device.</source>
- <translation>Saat ditandai, sistem guest akan melihat disk virtual sebagai device solid state.</translation>
+ <translation>Saat ditandai, sistem guest akan melihat disk virtual sebagai perangkat solid state.</translation>
</message>
<message>
<source>&Solid-state Drive</source>
- <translation>Drive &solid-state</translation>
+ <translation>Drive &Solid-state</translation>
</message>
<message>
<source>Details:</source>
@@ -5485,27 +5497,27 @@
</message>
<message>
<source>Controller: %1</source>
- <translation type="unfinished"></translation>
+ <translation>Pengendali: %1</translation>
</message>
<message>
<source>No name is currently specified for the controller at position <b>%1</b>.</source>
- <translation type="unfinished"></translation>
+ <translation>Saat ini nama tidak dinyatakan bagi pengendali pada posisi <b>%1</b>.</translation>
</message>
<message>
<source>The controller at position <b>%1</b> has the same name as the controller at position <b>%2</b>.</source>
- <translation type="unfinished"></translation>
+ <translation>Pengendali pada posisi <b>%1</b> memakai nama yang sama dengan pengendali pada posisi <b>%2</b>.</translation>
</message>
<message>
<source>No hard disk is selected for <i>%1</i>.</source>
- <translation type="unfinished"></translation>
+ <translation>Tidak ada hard disk yang dipilih bagi <i>%1</i>.</translation>
</message>
<message>
<source><i>%1</i> is using a disk that is already attached to <i>%2</i>.</source>
- <translation type="unfinished"></translation>
+ <translation><i>%1</i> menggunakan hard disk yang sudah terpasang pada <i>%2</i>.</translation>
</message>
<message>
<source>The machine currently has more storage controllers assigned than a %1 chipset supports. Please change the chipset type on the System settings page or reduce the number of the following storage controllers on the Storage settings page: %2</source>
- <translation type="unfinished"></translation>
+ <translation>Mesin kini memiliki pengendali penyimpanan terpasang yang lebih banyak daripada yang didukung oleh chipset %1. Silakan ubah tipe chipset pada halaman pengaturan Sistem atau kurangi cacah pengendali penyimpanan berikut pada halaman pengaturan Penyimpanan: %2</translation>
</message>
</context>
<context>
@@ -5565,7 +5577,7 @@
</message>
<message>
<source>Defines the boot device order. Use the checkboxes on the left to enable or disable individual boot devices. Move items up and down to change the device order.</source>
- <translation>Menentukan urutan boot device. Gunakan checkbox yang tersedia di sebelah kiri untuk menyalakan atau mematikan boot device secara individual. Naikkan atau turunkan item untuk mengubah urutan device.</translation>
+ <translation>Menentukan urutan perangkat boot. Gunakan kotak contreng yang tersedia di sebelah kiri untuk menyalakan atau mematikan perangkat boot secara individual. Naikkan atau turunkan butir untuk mengubah urutan perangkat.</translation>
</message>
<message>
<source>Move Down (Ctrl-Down)</source>
@@ -5573,7 +5585,7 @@
</message>
<message>
<source>Moves the selected boot device down.</source>
- <translation>Turunkan boot device yang dipilih.</translation>
+ <translation>Turunkan perangkat boot yang dipilih.</translation>
</message>
<message>
<source>Move Up (Ctrl-Up)</source>
@@ -5581,7 +5593,7 @@
</message>
<message>
<source>Moves the selected boot device up.</source>
- <translation>Naikkan boot device yang dipilih.</translation>
+ <translation>Naikkan perangkat boot yang dipilih.</translation>
</message>
<message>
<source>Extended Features:</source>
@@ -5589,11 +5601,11 @@
</message>
<message>
<source>When checked, the virtual machine will support the Input Output APIC (I/O APIC), which may slightly decrease performance. <b>Note:</b> don't disable this feature after having installed a Windows guest operating system!</source>
- <translation>Saat tertandai, mesin virtual akan mendukung Input Output APIC (I/O APIC), yang bisa saja sedikit menurunkan kinerja mesin. <b>Catatan:</b> jangan matikan fitur ini setelah menginstal sebuah sistem operasi guest Windows!</translation>
+ <translation>Saat tertandai, mesin virtual akan mendukung Input Output APIC (I/O APIC), yang bisa saja sedikit menurunkan kinerja mesin. <b>Catatan:</b> jangan nonaktifkan fitur ini setelah memasang sebuah sistem operasi guest Windows!</translation>
</message>
<message>
<source>Enable &I/O APIC</source>
- <translation>Aktifkan &I/O APIC</translation>
+ <translation>Fungsikan &I/O APIC</translation>
</message>
<message>
<source>&Processor</source>
@@ -5609,7 +5621,7 @@
</message>
<message>
<source>Enable PA&E/NX</source>
- <translation>Aktifkan PA&E/NX</translation>
+ <translation>Fungsikan PA&E/NX</translation>
</message>
<message>
<source>Acce&leration</source>
@@ -5617,15 +5629,15 @@
</message>
<message>
<source>Hardware Virtualization:</source>
- <translation>Virtualisasi Hardware:</translation>
+ <translation>Virtualisasi Perangkat Keras:</translation>
</message>
<message>
<source>When checked, the virtual machine will try to make use of the host CPU's hardware virtualization extensions such as Intel VT-x and AMD-V.</source>
- <translation>Bila ditandai, mesin virtual akan mencoba memakai ekstensi virtualisasi hardware milik CPU host seperti misalnya Intel VT-x dan AMD-V.</translation>
+ <translation>Bila ditandai, mesin virtual akan mencoba memakai ekstensi virtualisasi perangkat keras milik CPU host seperti misalnya Intel VT-x dan AMD-V.</translation>
</message>
<message>
<source>Enable &VT-x/AMD-V</source>
- <translation>Aktifkan &VT-x/AMD-V</translation>
+ <translation>Fungsikan &VT-x/AMD-V</translation>
</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>
@@ -5633,12 +5645,12 @@
</message>
<message>
<source>Enable Nested Pa&ging</source>
- <translation>Aktifkan Pa&ging Bertingkat</translation>
+ <translation>Fungsikan Pa&ging Bertingkat</translation>
</message>
<message>
<source><qt>%1 CPUs</qt></source>
<comment>%1 is host cpu count * 2 for now</comment>
- <translation><qt>%1 CPUs</qt></translation>
+ <translation><qt>%1 CPU</qt></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>
@@ -5646,19 +5658,19 @@
</message>
<message>
<source>Enable &EFI (special OSes only)</source>
- <translation>Aktifkan &EFI (hanya OS khusus)</translation>
+ <translation>Fungsikan &EFI (hanya OS khusus)</translation>
</message>
<message>
<source>If checked, the RTC device will report the time in UTC, otherwise in local (host) time. Unix usually expects the hardware clock to be set to UTC.</source>
- <translation>Bila ditandai, device RTC akan melaporkan waktu dalam UTC, bila tidak, dalam waktu lokal (host). Unix biasanya mengharapkan jam hardware ditata ke UTC.</translation>
+ <translation>Bila ditandai, perangkat RTC akan melaporkan waktu dalam UTC, bila tidak, dalam waktu lokal (host). Unix biasanya mengharapkan jam perangkat keras ditata ke UTC.</translation>
</message>
<message>
<source>Hardware Clock in &UTC Time</source>
- <translation>Jam hardware dalam waktu &UTC</translation>
+ <translation>Jam Perangkat Keras dalam Waktu &UTC</translation>
</message>
<message>
<source>Controls the number of virtual CPUs in the virtual machine. You need hardware virtualization support on your host system to use more than one virtual CPU.</source>
- <translation>Mengendalikan cacah CPU virtual dalam mesin virtual. Anda perlu dukungan virtualisasi hardware pada sistem host Anda untuk memakai lebih dari satu CPU virtual.</translation>
+ <translation>Mengendalikan cacah CPU virtual dalam mesin virtual. Anda perlu dukungan virtualisasi perangkat keras pada sistem host Anda untuk memakai lebih dari satu CPU virtual.</translation>
</message>
<message>
<source>If checked, an absolute pointing device (a USB tablet) will be supported. Otherwise, only a standard PS/2 mouse will be emulated.</source>
@@ -5678,11 +5690,11 @@
</message>
<message>
<source>&Execution Cap:</source>
- <translation>Cap &Eksekusi:</translation>
+ <translation>Batas &Eksekusi:</translation>
</message>
<message>
<source>Limits the amount of time that each virtual CPU is allowed to run for. Each virtual CPU will be allowed to use up to this percentage of the processing time available on one physical CPU. The execution cap can be disabled by setting it to 100%. Setting the cap too low can make the machine feel slow to respond.</source>
- <translation>Membatasi lama waktu setiap CPU virtual diijinkan berjalan. Setiap CPU virtual akan diijinkan memakai sampai dengan persentase ini dari waktu pemrosesan yang tersedia pada satu CPU fisik. Cap eksekusi dapat dimatikan dengan menatanya ke 100%. Menata cap terlalu rendah dapat membuat mesin terasa lambat merespon.</translation>
+ <translation>Membatasi lama waktu setiap CPU virtual diijinkan berjalan. Setiap CPU virtual akan diijinkan memakai sampai dengan persentase ini dari waktu pemrosesan yang tersedia pada satu CPU fisik. Batas eksekusi dapat dimatikan dengan menatanya ke 100%. Menata batas terlalu rendah dapat membuat mesin terasa lambat merespon.</translation>
</message>
<message>
<source>you have set the processor execution cap to a low value. This can make the machine feel slow to respond.</source>
@@ -5708,47 +5720,47 @@
</message>
<message>
<source>&Pointing Device:</source>
- <translation type="unfinished"></translation>
+ <translation>Perangkat &Penunjuk:</translation>
</message>
<message>
<source>Determines whether the emulated pointing device is a standard PS/2 mouse, a USB tablet or a USB multi-touch tablet.</source>
- <translation type="unfinished"></translation>
+ <translation>Menentukan apakah perangkat penunjuk yang diemulasi adalah tetikus PS/2 standar, tablet USB, atau tablet multi-sentuh USB.</translation>
</message>
<message>
<source>More than <b>%1%</b> of the host computer's memory (<b>%2</b>) is assigned to the virtual machine. Not enough memory is left for the host operating system. Please select a smaller amount.</source>
- <translation type="unfinished"></translation>
+ <translation>Lebih dari <b>%1%</b> dari memori komputer host (<b>%2</b>) diserahkan ke mesin virtual. Memori tersisa tidak cukup untuk sistem operasi host. Silakan pilih nilai yang lebih kecil.</translation>
</message>
<message>
<source>More than <b>%1%</b> of the host computer's memory (<b>%2</b>) is assigned to the virtual machine. There might not be enough memory left for the host operating system. Please consider selecting a smaller amount.</source>
- <translation type="unfinished"></translation>
+ <translation>Lebih dari <b>%1%</b> dari memori komputer host (<b>%2</b>) diserahkan ke mesin virtual. Memori tersisa mungkin tidak cukup untuk sistem operasi host. Harap pertimbangkan untuk memilih nilai yang lebih kecil.</translation>
</message>
<message>
<source>The I/O APIC feature is not currently enabled in the Motherboard section of the System page. This is needed in order to support a chip set of type ICH9. It will be done automatically if you confirm your changes.</source>
- <translation type="unfinished"></translation>
+ <translation>Fitur I/O APIC saat ini tidak difungsikan dalam bagian Motherboard dari halaman SIstem. Ini diperlukan untuk mendukung chipset bertipe ICH9. Ini akan dilakukan secara otomatis bila Anda mengkonfirmasi perubahan Anda.</translation>
</message>
<message>
<source>USB controller emulation is not currently enabled on the USB page. This is needed to support an emulated USB input device. It will be done automatically if you confirm your changes.</source>
- <translation type="unfinished"></translation>
+ <translation>Emulasi pengendali USB saat ini tidak difungsikan pada halaman USB. Ini diperlukan untuk mendukung perangkat masukan USB teremulasi. Ini akan dilakukan secara otomatis bila Anda mengkonfirmasi perubahan Anda.</translation>
</message>
<message>
<source>For performance reasons, the number of virtual CPUs attached to the virtual machine may not be more than twice the number of physical CPUs on the host (<b>%1</b>). Please reduce the number of virtual CPUs.</source>
- <translation type="unfinished"></translation>
+ <translation>Untuk alasan kinerja, cacah CPU virtual yang terpasang ke mesin virtual tidak boleh lebih dari dua kali cacah CPU fisik pada host (<b>%1</b>). Harap kurangi cacah CPU virtual.</translation>
</message>
<message>
<source>More virtual CPUs are assigned to the virtual machine than the number of physical CPUs on the host system (<b>%1</b>). This is likely to degrade the performance of your virtual machine. Please consider reducing the number of virtual CPUs.</source>
- <translation type="unfinished"></translation>
+ <translation>Lebih banyak CPU virtual yang dipasang ke mesin virtual daripada cacah CPU fisik pada sistem host (<b>%1</b>). Ini boleh jadi menurunkan kinerja mesin virtual Anda. Harap pertimbangkan untuk mengurangi cacah CPU virtual.</translation>
</message>
<message>
<source>The I/O APIC feature is not currently enabled in the Motherboard section of the System page. This is needed in order to support more than one virtual processor. It will be done automatically if you confirm your changes.</source>
- <translation type="unfinished"></translation>
+ <translation>Fitur I/O APIC saat ini tidak difungsikan dalam bagian Motherboard dari halaman SIstem. Ini diperlukan untuk mendukung lebih dari satu prosesor virtual. Ini akan dilakukan secara otomatis bila Anda mengkonfirmasi perubahan Anda.</translation>
</message>
<message>
<source>Hardware virtualization is not currently enabled in the Acceleration section of the System page. This is needed in order to support more than one virtual processor. It will be done automatically if you confirm your changes.</source>
- <translation type="unfinished"></translation>
+ <translation>Virtualisasi perangkat keras saat ini tidak difungsikan dalam bagian Akselerasi dari halaman SIstem. Ini diperlukan untuk mendukung lebih dari satu prosesor virtual. Ini akan dilakukan secara otomatis bila Anda mengkonfirmasi perubahan Anda.</translation>
</message>
<message>
<source>The processor execution cap is set to a low value. This may make the machine feel slow to respond.</source>
- <translation type="unfinished"></translation>
+ <translation>Batas eksekusi prosesor diatur ke nilai yang rendah. Ini mungkin membuat mesin terasa lambat merespon.</translation>
</message>
</context>
<context>
@@ -5759,11 +5771,11 @@
</message>
<message>
<source>A&dd Filter From Device</source>
- <translation>Tambahkan Filter &Dari Device</translation>
+ <translation>Tambahkan Filter &Dari Perangkat</translation>
</message>
<message>
<source>&Edit Filter</source>
- <translation>&Edit Filter</translation>
+ <translation>&Sunting Filter</translation>
</message>
<message>
<source>&Remove Filter</source>
@@ -5787,7 +5799,7 @@
</message>
<message>
<source>Edits the selected USB filter.</source>
- <translation>Edit filter USB yang dipilih.</translation>
+ <translation>Sunting filter USB yang dipilih.</translation>
</message>
<message>
<source>Removes the selected USB filter.</source>
@@ -5812,7 +5824,7 @@
</message>
<message>
<source>Enable &USB Controller</source>
- <translation>Aktifkan Pengendali &USB</translation>
+ <translation>Fungsikan Pengendali &USB</translation>
</message>
<message>
<source>When checked, enables the virtual USB EHCI controller of this machine. The USB EHCI controller provides USB 2.0 support.</source>
@@ -5824,11 +5836,11 @@
</message>
<message>
<source>USB Device &Filters</source>
- <translation>&Filter Device USB</translation>
+ <translation>&Filter Perangkat USB</translation>
</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>Menampilkan semua filter USB dari mesin ini. Checkbox di kiri menentukan apakah filter tertentu diaktifkan atau tidak. Gunakan menu konteks atau tombol di kanan untuk menambah atau menghapus filter USB.</translation>
+ <translation>Menampilkan semua filter USB dari mesin ini. Kotak contreng di kiri menentukan apakah filter tertentu difungsikan atau tidak. Gunakan menu konteks atau tombol di kanan untuk menambah atau menghapus filter USB.</translation>
</message>
<message>
<source>[filter]</source>
@@ -5880,7 +5892,7 @@
</message>
<message>
<source>USB 2.0 is currently enabled for this virtual machine. However, this requires the <b>%1</b> to be installed. Please install the Extension Pack from the VirtualBox download site or disable USB 2.0 to be able to start the machine.</source>
- <translation type="unfinished"></translation>
+ <translation>USB 2.0 saat ini difungsikan bagi mesin virtual ini. Namun, ini memerlukan dipasangnya <b>%1</b>. Harap pasang Extension Pack dari situs unduh VirtualBox atau nonaktifkan USB 2.0 agar bisa memulai mesin.</translation>
</message>
</context>
<context>
@@ -5906,7 +5918,7 @@
</message>
<message>
<source>Holds the filter name.</source>
- <translation>Tampilkan nama filter.</translation>
+ <translation>Menyimpan nama filter.</translation>
</message>
<message>
<source>&Vendor ID:</source>
@@ -5914,7 +5926,7 @@
</message>
<message>
<source>Defines the vendor ID filter. The <i>exact match</i> string format is <tt>XXXX</tt> where <tt>X</tt> is a hexadecimal digit. An empty string will match any value.</source>
- <translation>Mendefinisikan filter ID vendor. Format string <i>cocok eksak</i> adalah <tt>XXXX</tt> dimana <tt>X</tt> adalah digit heksadesimal. String kosong akan cocok dengan sebarang nilai.</translation>
+ <translation>Mendefinisikan penyaring ID vendor. Format string <i>cocok eksak</i> adalah <tt>XXXX</tt> dimana <tt>X</tt> adalah digit heksadesimal. String kosong akan cocok dengan sebarang nilai.</translation>
</message>
<message>
<source>&Product ID:</source>
@@ -5922,7 +5934,7 @@
</message>
<message>
<source>Defines the product ID filter. The <i>exact match</i> string format is <tt>XXXX</tt> where <tt>X</tt> is a hexadecimal digit. An empty string will match any value.</source>
- <translation>Mendefinisikan filter ID produk. Format string <i>cocok eksak</i> adalah <tt>XXXX</tt> dimana <tt>X</tt> adalah digit heksadesimal. String kosong akan cocok dengan sebarang nilai.</translation>
+ <translation>Mendefinisikan penyaring ID produk. Format string <i>cocok eksak</i> adalah <tt>XXXX</tt> dimana <tt>X</tt> adalah digit heksadesimal. String kosong akan cocok dengan sebarang nilai.</translation>
</message>
<message>
<source>&Revision:</source>
@@ -5930,7 +5942,7 @@
</message>
<message>
<source>Defines the revision number filter. The <i>exact match</i> string format is <tt>IIFF</tt> where <tt>I</tt> is a decimal digit of the integer part and <tt>F</tt> is a decimal digit of the fractional part. An empty string will match any value.</source>
- <translation>Mendefinisikan filter nomor revisi. Format string <i>cocok eksak</i> adalah <tt>IIFF</tt> dimana <tt>I</tt> adalah digit desimal dari bagian integer dan <tt>F</tt> adalah digit desimal dari bagian pecahan. String kosong akan cocok dengan sebarang nilai.</translation>
+ <translation>Mendefinisikan penyaring nomor revisi. Format string <i>cocok eksak</i> adalah <tt>IIFF</tt> dimana <tt>I</tt> adalah digit desimal dari bagian integer dan <tt>F</tt> adalah digit desimal dari bagian pecahan. String kosong akan cocok dengan sebarang nilai.</translation>
</message>
<message>
<source>&Manufacturer:</source>
@@ -5938,7 +5950,7 @@
</message>
<message>
<source>Defines the manufacturer filter as an <i>exact match</i> string. An empty string will match any value.</source>
- <translation>Mendefinisikan filter pabrikan sebagai suatu string <i>cocok eksak</i>. String kosong akan cocok dengan sebarang nilai.</translation>
+ <translation>Mendefinisikan penyaring pabrikan sebagai suatu string <i>cocok eksak</i>. String kosong akan cocok dengan sebarang nilai.</translation>
</message>
<message>
<source>Pro&duct:</source>
@@ -5946,7 +5958,7 @@
</message>
<message>
<source>Defines the product name filter as an <i>exact match</i> string. An empty string will match any value.</source>
- <translation>Mendefinisikan filter nama produk sebagai suatu string <i>cocok eksak</i>. String kosong akan cocok dengan sebarang nilai.</translation>
+ <translation>Mendefinisikan penyaring nama produk sebagai suatu string <i>cocok eksak</i>. String kosong akan cocok dengan sebarang nilai.</translation>
</message>
<message>
<source>&Serial No.:</source>
@@ -5954,7 +5966,7 @@
</message>
<message>
<source>Defines the serial number filter as an <i>exact match</i> string. An empty string will match any value.</source>
- <translation>Mendefinisikan filter nomor seri sebagai suatu string <i>cocok eksak</i>. String kosong akan cocok dengan sebarang nilai.</translation>
+ <translation>Mendefinisikan penyaring nomor seri sebagai suatu string <i>cocok eksak</i>. String kosong akan cocok dengan sebarang nilai.</translation>
</message>
<message>
<source>Por&t:</source>
@@ -5962,7 +5974,7 @@
</message>
<message>
<source>Defines the host USB port filter as an <i>exact match</i> string. An empty string will match any value.</source>
- <translation>Mendefinisikan filter port USB sebagai suatu string <i>cocok eksak</i>. String kosong akan cocok dengan sebarang nilai.</translation>
+ <translation>Mendefinisikan penyaring port USB sebagai suatu string <i>cocok eksak</i>. String kosong akan cocok dengan sebarang nilai.</translation>
</message>
<message>
<source>R&emote:</source>
@@ -5970,7 +5982,7 @@
</message>
<message>
<source>Defines whether this filter applies to USB devices attached locally to the host computer (<i>No</i>), to a VRDP client's computer (<i>Yes</i>), or both (<i>Any</i>).</source>
- <translation>Menentukan apakah filter ini diterapkan ke device USB yang tersambung secara lokal ke komputer host (<i>Tidak</i>), ke klien VRDP komputer (<i>Ya</i>), atau keduanya (<i>Apa saja</a>).</translation>
+ <translation>Menentukan apakah penyaring ini diterapkan ke device USB yang tersambung secara lokal ke komputer host (<i>Tidak</i>), ke klien VRDP komputer (<i>Ya</i>), atau keduanya (<i>Apa saja</a>).</translation>
</message>
<message>
<source>&Action:</source>
@@ -5982,36 +5994,36 @@
</message>
<message>
<source>USB Filter Details</source>
- <translation>Rincian Filter USB</translation>
+ <translation>Rincian Penyaring USB</translation>
</message>
</context>
<context>
<name>UIMachineWindow</name>
<message>
<source> EXPERIMENTAL build %1r%2 - %3</source>
- <translation type="unfinished"> build EXPERIMENTAL %1r%2 - %3</translation>
+ <translation> build EKSPERIMEN %1r%2 - %3</translation>
</message>
</context>
<context>
<name>UIMachineWindowNormal</name>
<message>
<source>Shows the currently assigned Host key.<br>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>Tunjukkan tombol Host yang sedang ditugaskan.<br>Tombol ini, saat ditekan sendirian, menjungkit keadaan penangkapan keyboard dan mouse. Ia juga dapat digunakan dalam kombinasi dengan kunci lain untuk melakukan tindakan dari dalam menu utama secara cepat.</translation>
+ <translation>Tunjukkan tombol Host yang sedang ditugaskan.<br>Tombol ini, saat ditekan sendirian, menjungkit keadaan penangkapan papan tik dan tetikus. Ia juga dapat digunakan dalam kombinasi dengan tombol lain untuk melakukan tindakan dari dalam menu utama secara cepat.</translation>
</message>
</context>
<context>
<name>UIMediumManager</name>
<message>
<source>&Hard drives</source>
- <translation type="unfinished"></translation>
+ <translation>&Hard disk</translation>
</message>
<message>
<source>&Optical disks</source>
- <translation type="unfinished"></translation>
+ <translation>Cakram &optik</translation>
</message>
<message>
<source>&Floppy disks</source>
- <translation type="unfinished"></translation>
+ <translation>Cakram &floppy</translation>
</message>
<message>
<source>&Select</source>
@@ -6019,7 +6031,7 @@
</message>
<message>
<source>C&lose</source>
- <translation type="unfinished">&Tutup</translation>
+ <translation>&Tutup</translation>
</message>
</context>
<context>
@@ -6030,11 +6042,11 @@
</message>
<message>
<source><p>You are about to change the settings of the disk image file <b>%1</b>.</p><p>Please choose one of the following modes and press <b>%2</b> to proceed or <b>%3</b> otherwise.</p></source>
- <translation></translation>
+ <translation><b>Anda akan mengubah pengaturan berkas image disk <b>%1</b>.</p><p>Harap pilih satu dari mode berikut dan tekan <b>%2</b> untuk melanjutkan atau <b>%3</b> bila tidak.</p></translation>
</message>
<message>
<source>Choose mode:</source>
- <translation>Pilih tipe medium:</translation>
+ <translation>Pilih mode:</translation>
</message>
</context>
<context>
@@ -6259,7 +6271,7 @@
</message>
<message>
<source>Failed to create the shared folder <b>%1</b> (pointing to <nobr><b>%2</b></nobr>) for the virtual machine <b>%3</b>.</source>
- <translation>Gagal menciptakan sebuah folder yang dishare <b>%1</b> (menunjuk pada <nobr><b>%2</b></nobr>) bagi mesin virtual <b>%3</b>.</translation>
+ <translation>Gagal menciptakan sebuah folder bersama <b>%1</b> (menunjuk pada <nobr><b>%2</b></nobr>) bagi mesin virtual <b>%3</b>.</translation>
</message>
<message>
<source>Failed to remove the shared folder <b>%1</b> (pointing to <nobr><b>%2</b></nobr>) from the virtual machine <b>%3</b>.</source>
@@ -6401,7 +6413,7 @@
</message>
<message>
<source><p>The virtual machine window is optimized to work in <b>%1 bit</b> color mode but the virtual display is currently set to <b>%2 bit</b>.</p><p>Please open the display properties dialog of the guest OS and select a <b>%3 bit</b> color mode, if it is available, for best possible performance of the virtual video subsystem.</p><p><b>Note</b>. Some operating systems, like [...]
- <translation><p>Jendela mesin virtual dioptimalkan untuk bekerja pada mode warna <b>%1 bit</b> tapi kualitas warna tampilan virtual saat ini di-set pada <b>%2 bit</b>.</p><p>Silahkan buka dialog properti tampilan pada Sistem Operasi guest dan pilih sebuah mode warna <b>%3 bit</b>, bila tersedia, untuk performa terbaik yang memungkinkan pada subsistem video virtual.</p><p><b>Catatan& [...]
+ <translation type="obsolete"><p>Jendela mesin virtual dioptimalkan untuk bekerja pada mode warna <b>%1 bit</b> tapi kualitas warna tampilan virtual saat ini di-set pada <b>%2 bit</b>.</p><p>Silahkan buka dialog properti tampilan pada Sistem Operasi guest dan pilih sebuah mode warna <b>%3 bit</b>, bila tersedia, untuk performa terbaik yang memungkinkan pada subsistem video virtual.</p><p>& [...]
</message>
<message>
<source><p>A critical error has occurred while running the virtual machine and the machine execution has been stopped.</p><p>For help, please see the Community section on <a href=http://www.virtualbox.org>http://www.virtualbox.org</a> or your support contract. Please provide the contents of the log file <tt>VBox.log</tt> and the image file <tt>VBox.png</tt>, which you can find in the <nobr><b>%1</b></nobr& [...]
@@ -6514,7 +6526,7 @@
<message>
<source>Insert</source>
<comment>additions</comment>
- <translation type="unfinished">Pasang</translation>
+ <translation>Pasang</translation>
</message>
<message>
<source><p>The host key is currently defined as <b>%1</b>.</p></source>
@@ -6533,7 +6545,7 @@
<message>
<source>Check</source>
<comment>inaccessible media message box</comment>
- <translation>Cek</translation>
+ <translation>Periksa</translation>
</message>
<message>
<source><p>The following VirtualBox settings files have been automatically converted to the new settings file format version <b>%1</b>.</p><p>However, the results of the conversion were not saved back to disk yet. Please press:</p><ul><li><b>Save</b> 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);</li><li><b>Ba [...]
@@ -7062,8 +7074,7 @@
</message>
<message>
<source>Delete all files</source>
- <translatorcomment>Hapus semua file</translatorcomment>
- <translation></translation>
+ <translation>Hapus semua berkas</translation>
</message>
<message>
<source>Remove only</source>
@@ -7163,12 +7174,11 @@
</message>
<message>
<source><p>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 <b>Insert Guest Additions CD image</b> from the <b>Devices</b> menu. If they are installed but the machine is not yet fully starte [...]
- <translation type="unfinished"><p>VirtualBox Guest Addition sepertinya tak tak tersedia pada mesin virtual ini, dan folder shared tak dapat dipakai tanpanya. Untuk memakai shared folder di dalam mesin virtual, silakan install Guest Addition bila belum dipasang, atau install ulang bila tidak bekerja dengan benar, dengan memilih <b>Install Guest Addition</b> dari menu <b>Device</b>. Bila sudah dipasang tapi mesin belum dimulai secara penuh maka shared [...]
+ <translation><p>VirtualBox Guest Addition sepertinya tak tak tersedia pada mesin virtual ini, dan folder shared tak dapat dipakai tanpanya. Untuk memakai shared folder di dalam mesin virtual, silakan install Guest Addition bila belum dipasang, atau install ulang bila tidak bekerja dengan benar, dengan memilih <b>Install Guest Addition</b> dari menu <b>Device</b>. Bila sudah dipasang tapi mesin belum dimulai secara penuh maka shared folder akan tersed [...]
</message>
<message>
<source><p>The virtual machine window will be now switched to <b>fullscreen</b> mode. You can go back to windowed mode at any time by pressing <b>%1</b>.</p><p>Note that the <i>Host</i> key is currently defined as <b>%2</b>.</p><p>Note that the main menu bar is hidden in fullscreen mode. You can access it by pressing <b>Host+Home</b>.</p></source>
- <translatorcomment><p>Window mesin virtual akan ditukar ke mode <b>Fullscreen</b>. Anda dapat kembali ke mode windowed kapanpun dengan menekan <b>%1</b>.</p><p>Perhatikan bahwa tombol <i>Host</i> kini didefinisikan sebagai <b>%2</b>.</p><p>Perhatikan bahwa bar manu utama tersembunyi dalam mode fullscreen. Anda dapat mengaksesnya dengan menekan <b>Host+Home</b>.</p></translatorcomment>
- <translation></translation>
+ <translation><p>Jendela mesin virtual akan ditukar ke mode <b>layar penuh</b>. Anda dapat kembali ke mode windowed kapanpun dengan menekan <b>%1</b>.</p><p>Perhatikan bahwa tombol <i>Host</i> kini didefinisikan sebagai <b>%2</b>.</p><p>Perhatikan bahwa bilah menu utama tersembunyi dalam mode layar penuh. Anda dapat mengaksesnya dengan menekan <b>Host+Home</b>.</p></translation>
</message>
<message>
<source><p>The virtual machine window will be now switched to <b>Seamless</b> mode. You can go back to windowed mode at any time by pressing <b>%1</b>.</p><p>Note that the <i>Host</i> key is currently defined as <b>%2</b>.</p><p>Note that the main menu bar is hidden in seamless mode. You can access it by pressing <b>Host+Home</b>.</p></source>
@@ -7359,101 +7369,101 @@
</message>
<message>
<source><p>Failed to initialize COM because the VirtualBox global configuration directory <b><nobr>%1</nobr></b> is not accessible. Please check the permissions of this directory and of its parent directory.</p><p>The application will now terminate.</p></source>
- <translation type="unfinished"></translation>
+ <translation><p>Gagal menginisiasi COM karena direktori konfigurasi global VirtualBox <b><nobr>%1</nobr></b> tidak dapat diakses. Harap periksa ijin direktori ini dan direktori induknya.</p><p>Aplikasi kini akan berakhir.</p></translation>
</message>
<message>
<source><p>You are about to remove following virtual machine items from the machine list:</p><p><b>%1</b></p><p>Do you wish to proceed?</p></source>
- <translation type="unfinished"></translation>
+ <translation><p>Anda akan menghapus butir mesin virtual berikut dari daftar mesin:</p><p><b>%1</b></p><p>Apakah Anda hendak melanjutkan?</p></translation>
</message>
<message>
<source><p>You are about to remove following inaccessible virtual machines from the machine list:</p><p>%1</p><p>Do you wish to proceed?</p></source>
- <translation type="unfinished"></translation>
+ <translation><p>Anda akan menghapus mesin virtual berikut yang tidak bisa diakses dari daftar mesin:</p><p><b>%1</b></p><p>Apakah Anda hendak melanjutkan?</p></translation>
</message>
<message>
<source><p>You are about to remove following virtual machines from the machine list:</p><p>%1</p><p>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's virtual hard disks if they are not in use by another machine.</p></source>
- <translation type="unfinished"></translation>
+ <translation><p>Anda akan menghapus mesin virtual berikut dari daftar mesin:</p><p><b>%1</b></p><p>Apakah Anda juga hendak menghapus berkas yang memuat mesin virtual dari hard disk Anda? Melakukan ini juga akan menghapus berkas yang memuat hard disk virtual mesin bila mereka tidak dipakai oleh mesin lain.</p></translation>
</message>
<message>
<source><p>You are about to remove following virtual machines from the machine list:</p><p>%1</p><p>Would you like to delete the files containing the virtual machine from your hard disk as well?</p></source>
- <translation type="unfinished"></translation>
+ <translation><p>Anda akan menghapus mesin virtual berikut dari daftar mesin:</p><p><b>%1</b></p><p>Apakah Anda juga hendak menghapus berkas yang memuat mesin virtual dari hard disk Anda?</p></translation>
</message>
<message>
<source>Do you wish to cancel all current network operations?</source>
- <translation type="unfinished"></translation>
+ <translation>Apakah Anda hendak membatalkan semua operasi jaringan saat ini?</translation>
</message>
<message>
<source>ACPI Shutdown</source>
<comment>machine</comment>
- <translation type="unfinished"></translation>
+ <translation>ACPI Shutdown</translation>
</message>
<message>
<source>Power Off</source>
<comment>machine</comment>
- <translation type="unfinished"></translation>
+ <translation>Matikan Daya</translation>
</message>
<message>
<source><p>Cannot remove the machine folder <nobr><b>%1</b>.</nobr></p><p>Please check that this folder really exists and that you have permissions to remove it.</p></source>
- <translation type="unfinished"></translation>
+ <translation><p>Tidak bisa menghapus folder mesin <nobr><b>%1</b>.</nobr></p><p>Harap periksa apakah folder memang benar ada dan Anda memiliki hak untuk menghapusnya.</p></translation>
</message>
<message>
<source><p>Cannot create the machine folder <b>%1</b> in the parent folder <nobr><b>%2</b>.</nobr></p><p>This folder already exists and possibly belongs to another machine.</p></source>
- <translation type="unfinished"></translation>
+ <translation><p>Tidak bisa membuat folder mesin <b>%1</b> dalam folder induk <nobr><b>%2</b>.</nobr></p><p>Folder ini telah ada dan mungkin milik mesin lain.</p></translation>
</message>
<message>
<source>You are about to create a new virtual machine without a hard drive. You will not be able to install an operating system on the machine until you add one. In the mean time you will only be able to start the machine using a virtual optical disk or from the network.</source>
- <translation type="unfinished"></translation>
+ <translation>Anda hendak membuat suatu mesin virtual baru tanpa hard disk. Anda tidak akan bisa memasang sistem operasi pada mesin sampai Anda menambahkannya. Sementara waktu Anda hanya akan bisa memulai mesin memakai disk optik virtual atau dari jaringan.</translation>
</message>
<message>
<source>Failed to drop data.</source>
- <translation type="unfinished"></translation>
+ <translation>Gagal menjatuhkan data.</translation>
</message>
<message>
<source><p>Are you sure you want to discard the saved state of the following virtual machines?</p><p><b>%1</b></p><p>This operation is equivalent to resetting or powering off the machine without doing a proper shutdown of the guest OS.</p></source>
- <translation type="unfinished"></translation>
+ <translation><p>Apakah Anda yakin ingin membuang keadaan tersimpan dari mesin virtual berikut? </p><p><b>%1</b></p><p>Tindakan ini setara dengan me-reset atau mematikan daya mesin tanpa melakukan shutdown yang benar pada OS guest.</p></translation>
</message>
<message>
<source><p>Do you really want to reset the following virtual machines?</p><p><b>%1</b></p><p>This will cause any unsaved data in applications running inside it to be lost.</p></source>
- <translation type="unfinished"></translation>
+ <translation><p>Apakah Anda benar-benar ingin me-reset mesin virtual berikut?</p><p><b>%1</b></p><p>Ini akan menyebabkan data yang belum disimpan pada aplikasi yang sedang berjalan di dalamnya hilang.</p></translation>
</message>
<message>
<source><p>Do you really want to send an ACPI shutdown signal to the following virtual machines?</p><p><b>%1</b></p></source>
- <translation type="unfinished"></translation>
+ <translation><p>Apakah Anda benar-benar ingin mengirim sinyal shutdown ACPI ke mesin virtual berikut?</p><p><b>%1</b></p></translation>
</message>
<message>
<source><p>Do you really want to power off the following virtual machines?</p><p><b>%1</b></p><p>This will cause any unsaved data in applications running inside it to be lost.</p></source>
- <translation type="unfinished"></translation>
+ <translation><p>Apakah Anda benar-benar ingin mematikan daya mesin virtual berikut?</p><p><b>%1</b></p><p>Ini akan menyebabkan data yang belum disimpan pada aplikasi yang sedang berjalan di dalamnya hilang.</p></translation>
</message>
<message>
<source><p>You are trying to move machine <nobr><b>%1</b></nobr> to group <nobr><b>%2</b></nobr> which already have sub-group <nobr><b>%1</b></nobr>.</p><p>Please resolve this name-conflict and try again.</p></source>
- <translation type="unfinished"></translation>
+ <translation><p>Anda mencoba memindah mesin <nobr><b>%1</b></nobr>ke grup <nobr><b>%2</b></nobr> yang telah memiliki sub grup <nobr><b>%1</b></nobr>.</p><p>Harap selesaikan konflik nama ini dan mencoba lagi.</p></translation>
</message>
<message>
<source><p>You are trying to move group <nobr><b>%1</b></nobr> to group <nobr><b>%2</b></nobr> which already have another item with the same name.</p><p>Would you like to automatically rename it?</p></source>
- <translation type="unfinished"></translation>
+ <translation><p>Anda mencoba memindah grup <nobr><b>%1</b></nobr>ke grup <nobr><b>%2</b></nobr> yang telah memiliki butir lain dengan nama yang sama.</p><p>Apakah Anda ingin mengubah namanya secara otomatis?</p></translation>
</message>
<message>
<source>Rename</source>
- <translation type="unfinished"></translation>
+ <translation>Ubah nama</translation>
</message>
<message>
<source><p>You are about to restore snapshot <nobr><b>%1</b></nobr>.</p><p>You can create a snapshot of the current state of the virtual machine first by checking the box below; if you do not do this the current state will be permanently lost. Do you wish to proceed?</p></source>
- <translation type="unfinished"></translation>
+ <translation><p>Anda akan mengembalikan snapshot <nobr><b>%1</b></nobr>.</p><p>Anda dapat terlebih dahulu mencipta sebuah snapshot dari keadaan mesin virtual saat ini dengan mencontreng kotak di bawah, bila Anda tidak melakukan ini maka keadaan sekarang akan hilang selamanya. Apakah Anda hendak melanjutkan?</p></translation>
</message>
<message>
<source><p>Are you sure you want to restore snapshot <nobr><b>%1</b></nobr>?</p></source>
- <translation type="unfinished"></translation>
+ <translation><p>Apakah Anda yakin hendak mengembalikan snapshot <nobr><b>%1</b></nobr>?</p></translation>
</message>
<message>
<source>Failed to set groups of the virtual machine <b>%1</b>.</source>
- <translation type="unfinished"></translation>
+ <translation>Gagal menata grup mesin virtual <b>%1</b>.</translation>
</message>
<message>
<source><p>Could not start the machine <b>%1</b> because the following physical network interfaces were not found:</p><p><b>%2</b></p><p>You can either change the machine's network settings or stop the machine.</p></source>
- <translation type="unfinished"></translation>
+ <translation><p>Tidak bisa memulai mesin <b>%1</b> karena antar muka jaringan fisik berikut tidak ditemukan:</p><p><b>%2</b></p><p>Anda bisa mengubah pengaturan jaringan mesin atau menghentikan mesin.</p></translation>
</message>
<message>
<source>Change Network Settings</source>
- <translation type="unfinished"></translation>
+ <translation>Ubah Pengaturan Jaringan</translation>
</message>
<message>
<source>Close Virtual Machine</source>
@@ -7461,218 +7471,218 @@
</message>
<message>
<source><p>Cannot start the VirtualBox Manager due to local restrictions.</p><p>The application will now terminate.</p></source>
- <translation type="unfinished"></translation>
+ <translation><p>Tidak dapat menjalankan Manajer karena restriksi lokal.</p><p>Aplikasi akan diakhiri sekarang.</p></translation>
</message>
<message>
<source><p>Could not find a language file for the language <b>%1</b> in the directory <b><nobr>%2</nobr></b>.</p><p>The language will be temporarily reset to the system default language. Please go to the <b>Preferences</b> window which you can open from the <b>File</b> menu of the VirtualBox Manager window, and select one of the existing languages on the <b>Language</b> page.</p></source>
- <translation type="unfinished"></translation>
+ <translation><p>Tidak dapat menemukan berkas bahasa untuk bahasa <b>%1</b> dalam direktori <b><nobr>%2</nobr></b>.</p><p>Bahasa akan sementara di-reset ke bahasa baku sistem. Silakan ke jendela <b>Preferensi</b> yang dapat Anda buka dari menu <b>Berkas</b> di jendela Manajer VirtualBox , dan pilih satu dari bahasa yang tersedia pada halaman <b>Bahasa</b>.</p></translation>
</message>
<message>
<source><p>Could not load the language file <b><nobr>%1</nobr></b>. <p>The language will be temporarily reset to English (built-in). Please go to the <b>Preferences</b> window which you can open from the <b>File</b> menu of the VirtualBox Manager window, and select one of the existing languages on the <b>Language</b> page.</p></source>
- <translation type="unfinished"></translation>
+ <translation><p>Tidak dapat memuat berkas bahasa <b><nobr>%1</nobr></b>. <p>Bahasa akan sementara di-reset pada bahasa Inggris (bawaan). Silakan ke jendela <b>Preferensi</b> yang dapat Anda buka dari menu <b>Berkas</b> di jendela Manajer VirtualBox , dan pilih satu dari bahasa yang tersedia pada halaman <b>Bahasa</b>.</p></translation>
</message>
<message>
<source>There is no virtual machine with the identifier <b>%1</b>.</source>
- <translation type="unfinished"></translation>
+ <translation>Tidak ada mesin virtual dengan identifier <b>%1</b>.</translation>
</message>
<message>
<source>Ignore</source>
- <translation type="unfinished">Abaikan</translation>
+ <translation>Abaikan</translation>
</message>
<message>
<source>Failed to create NAT network.</source>
- <translation type="unfinished"></translation>
+ <translation>Gagal menciptakan jaringan NAT.</translation>
</message>
<message>
<source>Failed to remove NAT network <b>%1</b>.</source>
- <translation type="unfinished"></translation>
+ <translation>Gagal menghapus jaringan NAT <b>%1</b>.</translation>
</message>
<message>
<source>Failed to create DHCP server.</source>
- <translation type="unfinished"></translation>
+ <translation>Gagal menciptakan server DHCP.</translation>
</message>
<message>
<source>Failed to remove DHCP server for network interface <b>%1</b>.</source>
- <translation type="unfinished"></translation>
+ <translation>Gagal menghapus server DHCP untuk antar muka jaringan <b>%1</b>.</translation>
</message>
<message>
<source>Failed to create the host network interface.</source>
- <translation type="unfinished"></translation>
+ <translation>Gagal menciptakan antarmuka jaringan host.</translation>
</message>
<message>
<source>Create &new disk</source>
- <translation type="unfinished">Ciptakan disk &baru</translation>
+ <translation>Ciptaka&n disk baru</translation>
</message>
<message>
<source>&Choose existing disk</source>
- <translation type="unfinished">&Pilih disk yang telah ada</translation>
+ <translation>&Pilih disk yang telah ada</translation>
</message>
<message>
<source>Leave &empty</source>
- <translation type="unfinished">Biarkan &kosong</translation>
+ <translation>Biarkan &kosong</translation>
</message>
<message>
<source>&Choose disk</source>
- <translation type="unfinished">&Pilih disk</translation>
+ <translation>&Pilih disk</translation>
</message>
<message>
<source><p>Are you sure you want to release the virtual hard disk <nobr><b>%1</b></nobr>?</p><p>This will detach it from the following virtual machine(s): <b>%2</b>.</p></source>
- <translation type="unfinished"></translation>
+ <translation><p>Apakah Anda yakin hendak merilis hard disk virtual<nobr><b>%1</b></nobr>?</p><p>Ini akan melepaskannya dari mesin virtual berikut: <b>%2</b>.</p></translation>
</message>
<message>
<source><p>Are you sure you want to release the virtual optical disk <nobr><b>%1</b></nobr>?</p><p>This will detach it from the following virtual machine(s): <b>%2</b>.</p></source>
- <translation type="unfinished"></translation>
+ <translation><p>Apakah Anda yakin hendak merilis disk optik virtual<nobr><b>%1</b></nobr>?</p><p>Ini akan melepaskannya dari mesin virtual berikut: <b>%2</b>.</p></translation>
</message>
<message>
<source><p>Are you sure you want to release the virtual floppy disk <nobr><b>%1</b></nobr>?</p><p>This will detach it from the following virtual machine(s): <b>%2</b>.</p></source>
- <translation type="unfinished"></translation>
+ <translation><p>Apakah Anda yakin hendak merilis disk floppy virtual<nobr><b>%1</b></nobr>?</p><p>Ini akan melepaskannya dari mesin virtual berikut: <b>%2</b>.</p></translation>
</message>
<message>
<source><p>Are you sure you want to remove the virtual hard disk <nobr><b>%1</b></nobr> from the list of known disk image files?</p></source>
- <translation type="unfinished"></translation>
+ <translation><p>Apakah Anda yakin hendak menghapus hard disk virtual <nobr><b>%1</b></nobr> dari daftar berkas image disk yang dikenal?</p></translation>
</message>
<message>
<source><p>As this hard disk is inaccessible its image file can not be deleted.</p></source>
- <translation type="unfinished"></translation>
+ <translation><p>Karena hard disk ini tidak dapat diakses, berkas imagenya tak dapat dihapus.</p></translation>
</message>
<message>
<source><p>Are you sure you want to remove the virtual optical disk <nobr><b>%1</b></nobr> from the list of known disk image files?</p></source>
- <translation type="unfinished"></translation>
+ <translation><p>Apakah Anda yakin hendak menghapus disk optik virtual <nobr><b>%1</b></nobr> dari daftar berkas image disk yang dikenal?</p></translation>
</message>
<message>
<source><p>Are you sure you want to remove the virtual floppy disk <nobr><b>%1</b></nobr> from the list of known disk image files?</p></source>
- <translation type="unfinished"></translation>
+ <translation><p>Apakah Anda yakin hendak menghapus disk floppy virtual <nobr><b>%1</b></nobr> dari daftar berkas image disk yang dikenal?</p></translation>
</message>
<message>
<source><p>Unable to insert the virtual optical disk <nobr><b>%1</b></nobr> into the machine <b>%2</b>.</p></source>
- <translation type="unfinished"></translation>
+ <translation><p>Tidak bisa memasang disk optik virtual <nobr><b>%1</b></nobr> ke dalam mesin <b>%2</b>.</p></translation>
</message>
<message>
<source><p>Would you like to try to force insertion of this disk?</p></source>
- <translation type="unfinished"></translation>
+ <translation><p>Apakah Anda hendak memaksa pemasangan disk ini?</p></translation>
</message>
<message>
<source><p>Unable to eject the virtual optical disk <nobr><b>%1</b></nobr> from the machine <b>%2</b>.</p></source>
- <translation type="unfinished"></translation>
+ <translation><p>Tidak bisa mengeluarkan disk optik virtual <nobr><b>%1</b></nobr> dari mesin <b>%2</b>.</p></translation>
</message>
<message>
<source><p>Would you like to try to force ejection of this disk?</p></source>
- <translation type="unfinished"></translation>
+ <translation><p>Apakah Anda hendak memaksa mengeluarkan disk ini?</p></translation>
</message>
<message>
<source><p>Unable to insert the virtual floppy disk <nobr><b>%1</b></nobr> into the machine <b>%2</b>.</p></source>
- <translation type="unfinished"></translation>
+ <translation><p>Tidak bisa memasang disk floppy virtual <nobr><b>%1</b></nobr> ke dalam mesin <b>%2</b>.</p></translation>
</message>
<message>
<source><p>Unable to eject the virtual floppy disk <nobr><b>%1</b></nobr> from the machine <b>%2</b>.</p></source>
- <translation type="unfinished"></translation>
+ <translation><p>Tidak bisa mengeluarkan disk floppy virtual <nobr><b>%1</b></nobr> dari mesin <b>%2</b>.</p></translation>
</message>
<message>
<source>Failed to open the hard disk file <nobr><b>%1</b></nobr>.</source>
- <translation type="unfinished"></translation>
+ <translation>Gagal membuka berkas hard disk <nobr><b>%1</b></nobr>.</translation>
</message>
<message>
<source>Failed to open the optical disk file <nobr><b>%1</b></nobr>.</source>
- <translation type="unfinished"></translation>
+ <translation>Gagal membuka berkas disk optik <nobr><b>%1</b></nobr>.</translation>
</message>
<message>
<source>Failed to open the floppy disk file <nobr><b>%1</b></nobr>.</source>
- <translation type="unfinished"></translation>
+ <translation>Gagal membuka berkas disk floppy <nobr><b>%1</b></nobr>.</translation>
</message>
<message>
<source>Failed to close the hard disk file <nobr><b>%2</b></nobr>.</source>
- <translation type="unfinished"></translation>
+ <translation>Gagal menutup berkas hard disk <nobr><b>%2</b></nobr>.</translation>
</message>
<message>
<source>Failed to close the optical disk file <nobr><b>%2</b></nobr>.</source>
- <translation type="unfinished"></translation>
+ <translation>Gagal menutup berkas disk optik <nobr><b>%2</b></nobr>.</translation>
</message>
<message>
<source>Failed to close the floppy disk file <nobr><b>%2</b></nobr>.</source>
- <translation type="unfinished"></translation>
+ <translation>Gagal menutup berkas disk floppy <nobr><b>%2</b></nobr>.</translation>
</message>
<message numerus="yes">
<source><p>The %n following virtual machine(s) are currently in a saved state: <b>%1</b></p><p>If you continue the runtime state of the exported machine(s) will be discarded. The other machine(s) will not be changed.</p></source>
<comment>This text is never used with n == 0. Feel free to drop the %n where possible, we only included it because of problems with Qt Linguist (but the user can see how many machines are in the list and doesn't need to be told).</comment>
- <translation type="unfinished">
+ <translation>
<numerusform><p>%n mesin virtual berikut kini dalam keadaan disimpan: <b>%1</b></p><p>Bila Anda meneruskan, keadaan runtime dari mesin yang diekspor akan dibuang. Mesin lain tidak akan diubah.</p></numerusform>
</translation>
</message>
<message>
<source>Switch</source>
- <translation type="unfinished">Beralih</translation>
+ <translation>Beralih</translation>
</message>
<message>
<source>Failed to enable the remote desktop server for the virtual machine <b>%1</b>.</source>
- <translation type="unfinished"></translation>
+ <translation>Gagal memfungsikan server desktop jarak jauh bagi mesin virtual <b>%1</b>.</translation>
</message>
<message>
<source>Failed to disable the remote desktop server for the virtual machine <b>%1</b>.</source>
- <translation type="unfinished"></translation>
+ <translation>Gagal menonaktifkan server desktop jarak jauh bagi mesin virtual <b>%1</b>.</translation>
</message>
<message>
<source>Failed to enable video capturing for the virtual machine <b>%1</b>.</source>
- <translation type="unfinished"></translation>
+ <translation>Gagal memfungsikan penangkapan video bagi mesin virtual <b>%1</b>.</translation>
</message>
<message>
<source>Failed to disable video capturing for the virtual machine <b>%1</b>.</source>
- <translation type="unfinished"></translation>
+ <translation>Gagal menonaktifkan penangkapan video bagi mesin virtual <b>%1</b>.</translation>
</message>
<message>
<source><p>Could not find the <b>VirtualBox Guest Additions</b> disk image file.</p><p>Do you wish to download this disk image file from the Internet?</p></source>
- <translation type="unfinished"></translation>
+ <translation><p>Tidak bisa menemukan berkas image disk <b>VirtualBox Guest Additions</b>.</p><p>Apakah Anda hendak mengunduh berkas ini dari Internet?</p></translation>
</message>
<message>
<source>Download</source>
- <translation type="unfinished">Download</translation>
+ <translation>Unduh</translation>
</message>
<message>
<source><p>Are you sure you want to download the <b>VirtualBox Guest Additions</b> disk image file from <nobr><a href="%1">%1</a></nobr> (size %2 bytes)?</p></source>
- <translation type="unfinished"></translation>
+ <translation><p>Apakah Anda yakin hendak mengunduh berkas image disk <b>VirtualBox Guest Additions</b> dari <nobr><a href="%1">%1</a></nobr> (ukuran %2 byte)?</p></translation>
</message>
<message>
<source><p>The <b>VirtualBox Guest Additions</b> disk image file has been successfully downloaded from <nobr><a href="%1">%1</a></nobr> but can't be saved locally as <nobr><b>%2</b>.</nobr></p><p>Please choose another location for that file.</p></source>
- <translation type="unfinished"></translation>
+ <translation><p>Berkas image disk <b>VirtualBox Guest Additions</b> telah sukses diunduh dari <nobr><a href="%1">%1</a></nobr> tapi tidak dapat disimpan secara lokal sebagai <nobr><b>%2</b>.</nobr></p><p>Harap pilih lokasi lain bagi berkas itu.</p></translation>
</message>
<message>
<source><p>The <b>VirtualBox Guest Additions</b> disk image file has been successfully downloaded from <nobr><a href="%1">%1</a></nobr> and saved locally as <nobr><b>%2</b>.</nobr></p><p>Do you wish to register this disk image file and insert it into the virtual CD/DVD drive?</p></source>
- <translation type="unfinished"></translation>
+ <translation><p>Berkas image disk <b>VirtualBox Guest Additions</b> telah sukses diunduh dari <nobr><a href="%1">%1</a></nobr> dan disimpan secara lokal sebagai <nobr><b>%2</b>.</nobr></p><p>Apakah Anda ingin mendaftarkan berkas image disk ini dan memasangnya pada drive CD/DVD virtual?</p></translation>
</message>
<message>
<source><p>Could not insert the <b>VirtualBox Guest Additions</b> disk image file into the virtual machine <b>%1</b>, as the machine has no CD/DVD drives. Please add a drive using the storage page of the virtual machine settings window.</p></source>
- <translation type="unfinished"></translation>
+ <translation><b>Tak bisa menyisipkan berkas image disk <b>VirtualBox Guest Additions</b> ke dalam mesin virtual <b>%1</b>, karena mesin tak memiliki drive CD/DVD. Silakan tambahkan sebuah drive memakai halaman penyimpanan dari dialog pengaturan mesin virtual.</p></translation>
</message>
<message>
<source><p>Could not find the <b>VirtualBox User Manual</b> <nobr><b>%1</b>.</nobr></p><p>Do you wish to download this file from the Internet?</p></source>
- <translation type="unfinished"></translation>
+ <translation><p>Tidak bisa menemukan <b>Manual Pengguna VirtualBox</b> <nobr><b>%1</b>.</nobr></p><p>Apakah Anda hendak mengunduh berkas ini dari Internet?</p></translation>
</message>
<message>
<source><p>Are you sure you want to download the <b>VirtualBox User Manual</b> from <nobr><a href="%1">%1</a></nobr> (size %2 bytes)?</p></source>
- <translation type="unfinished"></translation>
+ <translation><p>Apakah Anda yakin hendak mengunduh <b>Manual Pengguna VirtualBox</b> dari <nobr><a href="%1">%1</a></nobr> (ukuran %2 byte)?</p></translation>
</message>
<message>
<source><p>The VirtualBox User Manual has been successfully downloaded from <nobr><a href="%1">%1</a></nobr> but can't be saved locally as <nobr><b>%2</b>.</nobr></p><p>Please choose another location for that file.</p></source>
- <translation type="unfinished"><p>Manual Pengguna VirtualBox telah sukses didownload dari <nobr><a href="%1">%2</a></nobr> namu tak dapat disimpan secara lokal sebagai <nobr><b>%3</b>.</nobr></p><p>Silakan pilih lokasi lain bagi file itu.</p> {1"?} {1<?} {2<?}</translation>
+ <translation><p>Manual Pengguna VirtualBox telah sukses diunduh dari <nobr><a href="%1">%1</a></nobr> namun tidak dapat disimpan secara lokal sebagai <nobr><b>%2</b>.</nobr></p><p>Silakan pilih lokasi lain bagi berkas itu.</p></translation>
</message>
<message>
<source><p>The VirtualBox User Manual has been successfully downloaded from <nobr><a href="%1">%1</a></nobr> and saved locally as <nobr><b>%2</b>.</nobr></p></source>
- <translation type="unfinished"><p>Manual Pengguna VirtualBox telah sukses didownload dari <nobr><a href="%1">%2</a></nobr> dan disimpan secara lokal sebagai <nobr><b>%3</b>.</nobr></p> {1"?} {1<?} {2<?}</translation>
+ <translation><p>Manual Pengguna VirtualBox telah sukses diunduh dari <nobr><a href="%1">%1</a></nobr> dan disimpan secara lokal sebagai <nobr><b>%2</b>.</nobr></p></translation>
</message>
<message>
<source>Close</source>
- <translation type="unfinished">Tutup</translation>
+ <translation>Tutup</translation>
</message>
<message>
<source>Ok</source>
- <translation type="unfinished">Ok</translation>
+ <translation>Ok</translation>
</message>
<message>
<source>Do not show this message again</source>
- <translation type="unfinished">Jangan tampilkan pesan ini lagi</translation>
+ <translation>Jangan tampilkan pesan ini lagi</translation>
</message>
<message>
<source><p>Do you want to remove the NAT network <nobr><b>%1</b>?</nobr></p><p>If this network is in use by one or more virtual machine network adapters these adapters will no longer be usable until you correct their settings by either choosing a different network name or a different adapter attachment type.</p></source>
- <translation type="unfinished"></translation>
+ <translation><p>Apakah Anda hendak menghapus jaringan NAT <nobr><b>%1</b>?</nobr></p><p>Bila jaringan ini sedang dipakai oleh adaptor jaringan satu mesin virtual atau lebih, adaptor tersebut tidak akan dapat dipakai lagi sampai Anda memperbaiki pengaturan mereka dengan memilih nama jaringan lain atau tipe pencantolan adaptor yang berbeda.</p></translation>
</message>
<message>
<source><p>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 <b>Insert Guest Additions CD image</b> from the <b>Devices</b> menu. If they are installed but the machine is not yet fully starte [...]
@@ -7684,6 +7694,18 @@
<comment>additions-new</comment>
<translation type="obsolete">Pasang</translation>
</message>
+ <message>
+ <source>Failed to attach the webcam <b>%1</b> to the virtual machine <b>%2</b>.</source>
+ <translation>Gagal menghubungkan webcam <b>%1</b> ke mesin virtual <b>%2</b>.</translation>
+ </message>
+ <message>
+ <source>Failed to detach the webcam <b>%1</b> from the virtual machine <b>%2</b>.</source>
+ <translation>Gagal melepas webcam <b>%1</b> dari mesin virtual <b>%2</b>.</translation>
+ </message>
+ <message>
+ <source><p>The virtual screen is currently set to a <b>%1 bit</b> color mode. For better performance please change this to <b>%2 bit</b>. This can usually be done from the <b>Display</b> section of the guest operating system's Control Panel or System Settings.</p></source>
+ <translation><p>Layar virtual saat ini ditata ke mode warna <b>%1 bit</b>. Untuk kinerja yang lebih baik silakan mengubah ini menjadi <b>%2 bit</b>. Biasanya ini dapat dilakukan dari bagian <b>Tampilan</b> dari Panel Kendali atau Pengaturan Sistem sistem operasi guest.</p></translation>
+ </message>
</context>
<context>
<name>UIMiniProcessWidgetAdditions</name>
@@ -7745,19 +7767,19 @@
<name>UIMiniToolBar</name>
<message>
<source>Always show the toolbar</source>
- <translation type="unfinished">Selalu tampilkan toolbar</translation>
+ <translation>Selalu tampilkan bilah alat</translation>
</message>
<message>
<source>Minimize Window</source>
- <translation type="unfinished">Minimalkan Window</translation>
+ <translation>Minimalkan Jendela</translation>
</message>
<message>
<source>Exit Full Screen or Seamless Mode</source>
- <translation type="unfinished">Keluar Mode Fullscreen atau Seamless</translation>
+ <translation>Keluar Mode Layar Penuh atau Seamless</translation>
</message>
<message>
<source>Close VM</source>
- <translation type="unfinished">Tutup VM</translation>
+ <translation>Tutup VM</translation>
</message>
</context>
<context>
@@ -7775,109 +7797,109 @@
<name>UINameAndSystemEditor</name>
<message>
<source>&Name:</source>
- <translation type="unfinished">&Nama:</translation>
+ <translation>&Nama:</translation>
</message>
<message>
<source>Holds the name of the virtual machine.</source>
- <translation type="unfinished">Tampilkan nama dari mesin virtual.</translation>
+ <translation>Menyimpan nama dari mesin virtual.</translation>
</message>
<message>
<source>&Type:</source>
- <translation type="unfinished">&Tipe:</translation>
+ <translation>&Tipe:</translation>
</message>
<message>
<source>Selects the operating system family that you plan to install into this virtual machine.</source>
- <translation type="unfinished">Tampilkan keluarga sistem operasi yang Anda rencanakan untuk diinstal ke mesin virtual ini.</translation>
+ <translation>Pilih keluarga sistem operasi yang Anda rencanakan untuk dipasang ke mesin virtual ini.</translation>
</message>
<message>
<source>&Version:</source>
- <translation type="unfinished">&Versi:</translation>
+ <translation>&Versi:</translation>
</message>
<message>
<source>Selects the operating system type that you plan to install into this virtual machine (called a guest operating system).</source>
- <translation type="unfinished"></translation>
+ <translation>Pilih tipe sistem operasi yang Anda rencanakan untuk dipasang ke mesin virtual ini (dikenal sebagai sistem operasi guest).</translation>
</message>
</context>
<context>
<name>UINetworkManagerDialog</name>
<message>
<source>Network Operations Manager</source>
- <translation type="unfinished"></translation>
+ <translation>Manajer Operasi Jaringan</translation>
</message>
<message>
<source>There are no active network operations.</source>
- <translation type="unfinished"></translation>
+ <translation>Tidak ada operasi jaringan yang aktif.</translation>
</message>
<message>
<source>&Cancel All</source>
- <translation type="unfinished"></translation>
+ <translation>&Batalkan Semua</translation>
</message>
<message>
<source>Cancel all active network operations</source>
- <translation type="unfinished"></translation>
+ <translation>Batalkan semua operasi jaringan yang aktif</translation>
</message>
<message>
<source>Network Operation</source>
- <translation type="unfinished"></translation>
+ <translation>Operasi Jaringan</translation>
</message>
<message>
<source>Restart network operation</source>
- <translation type="unfinished"></translation>
+ <translation>Start ulang operasi jaringan</translation>
</message>
<message>
<source>Cancel network operation</source>
- <translation type="unfinished"></translation>
+ <translation>Batalkan operasi jaringan</translation>
</message>
<message>
<source>The network operation failed with the following error: %1.</source>
- <translation type="unfinished"></translation>
+ <translation>Operasi jaringan gagal dengan kesalahan berikut: %1.</translation>
</message>
</context>
<context>
<name>UINetworkManagerIndicator</name>
<message>
<source>Current network operations:</source>
- <translation type="unfinished"></translation>
+ <translation>Operasi jaringan saat ini:</translation>
</message>
<message>
<source>failed</source>
<comment>network operation</comment>
- <translation type="unfinished"></translation>
+ <translation>gagal</translation>
</message>
<message>
<source>(%1 of %2)</source>
- <translation type="unfinished"></translation>
+ <translation>(%1 dari %2)</translation>
</message>
<message>
<source>Double-click for more information.</source>
- <translation type="unfinished"></translation>
+ <translation>Klik ganda untuk informasi lebih banyak.</translation>
</message>
</context>
<context>
<name>UINetworkReplyPrivate</name>
<message>
<source>Host not found</source>
- <translation type="unfinished"></translation>
+ <translation>Host tidak ditemukan</translation>
</message>
<message>
<source>Content access denied</source>
- <translation type="unfinished"></translation>
+ <translation>Akses kontek ditolak</translation>
</message>
<message>
<source>Protocol failure</source>
- <translation type="unfinished"></translation>
+ <translation>Kegagalan protokol</translation>
</message>
<message>
<source>Wrong SSL certificate format</source>
- <translation type="unfinished"></translation>
+ <translation>Format sertifikat SSL salah</translation>
</message>
<message>
<source>SSL authentication failed</source>
- <translation type="unfinished"></translation>
+ <translation>Otentikasi SSL gagal</translation>
</message>
<message>
<source>Unknown reason</source>
- <translation type="unfinished"></translation>
+ <translation>Alasan tidak diketahui</translation>
</message>
</context>
<context>
@@ -8579,7 +8601,7 @@ langkah ini dan memasang hard disk pada waktu lain menggunakan dialog Setting Me
<name>UIPopupCenter</name>
<message>
<source>Click for full details</source>
- <translation type="unfinished"></translation>
+ <translation>Klik untuk rincian lengkap</translation>
</message>
</context>
<context>
@@ -8642,28 +8664,28 @@ langkah ini dan memasang hard disk pada waktu lain menggunakan dialog Setting Me
<name>UISelectorWindow</name>
<message>
<source>Show Toolbar</source>
- <translation type="unfinished">Tampilkan Toolbar</translation>
+ <translation>Tampilkan Bilah Alat</translation>
</message>
<message>
<source>Show Statusbar</source>
- <translation type="unfinished">Tampilkan Statusbar</translation>
+ <translation>Tampilkan Bilah Status</translation>
</message>
<message>
<source>Select a virtual machine file</source>
- <translation type="unfinished">Pilih suatu file mesin virtual</translation>
+ <translation>Pilih suatu berkas mesin virtual</translation>
</message>
<message>
<source>Virtual machine files (%1)</source>
- <translation type="unfinished">File mesin virtual (%1)</translation>
+ <translation>Berkas mesin virtual (%1)</translation>
</message>
<message>
<source><h3>Welcome to VirtualBox!</h3><p>The left part of this window is a list of all virtual machines on your computer. The list is empty now because you haven't created any virtual machines yet.<img src=:/welcome.png align=right/></p><p>In order to create a new virtual machine, press the <b>New</b> button in the main tool bar located at the top of the window.</p><p>You can press the <b>%1</b> key to [...]
- <translation type="unfinished"><h3>Selamat datang di VirtualBox!</h3><p>Bagian kiri dari jendela ini ditujukan untuk menampilkan daftar dari semua mesin virtual dalam komputer Anda. Daftar ini saat ini kosong karena Anda belum menciptakan mesin virtual apapun.<img src=:/welcome.png align=right/></p><p>Untuk menciptakan mesin virtual baru, tekan tombol <b>Baru</b> pada toolbar utama yang terletak di bagian atas jendela.</p>< [...]
+ <translation><h3>Selamat datang di VirtualBox!</h3><p>Bagian kiri dari jendela ini adalah daftar dari semua mesin virtual dalam komputer Anda. Daftar ini saat ini kosong karena Anda belum menciptakan mesin virtual apapun.<img src=:/welcome.png align=right/></p><p>Untuk menciptakan mesin virtual baru, tekan tombol <b>Baru</b> pada bilah alat utama yang terletak di bagian atas jendela.</p><p>Anda dapat menekan tombol <b [...]
</message>
<message>
<source>Manager</source>
<comment>Note: main window title which is pretended by the product name.</comment>
- <translation type="unfinished">- Manajer</translation>
+ <translation>Manajer</translation>
</message>
</context>
<context>
@@ -8674,14 +8696,14 @@ langkah ini dan memasang hard disk pada waktu lain menggunakan dialog Setting Me
</message>
<message>
<source>Updating Guest Additions</source>
- <translation type="unfinished"></translation>
+ <translation>Memutakhirkan Guest Additions</translation>
</message>
</context>
<context>
<name>UISettingsDialog</name>
<message>
<source><i>Select a settings category from the list on the left-hand side and move the mouse over a settings item to get more information.</i></source>
- <translation><i>Pilih kategori setting dari daftar pada sisi kiri dan gerakkan mouse di atas sebuah pilihan setting untuk memperoleh informasi tambahan.</i></translation>
+ <translation><i>Pilih kategori pengaturan dari daftar pada sisi kiri dan gerakkan tetikus di atas sebuah butir pengaturan untuk memperoleh informasi tambahan.</i></translation>
</message>
<message>
<source>On the <b>%1</b> page, %2</source>
@@ -8689,7 +8711,7 @@ langkah ini dan memasang hard disk pada waktu lain menggunakan dialog Setting Me
</message>
<message>
<source>Invalid settings detected</source>
- <translation>Setting yang tidak valid terdeteksi</translation>
+ <translation>Pengaturan yang tidak valid terdeteksi</translation>
</message>
<message>
<source>Non-optimal settings detected</source>
@@ -8697,15 +8719,15 @@ langkah ini dan memasang hard disk pada waktu lain menggunakan dialog Setting Me
</message>
<message>
<source>Settings</source>
- <translation>Setting</translation>
+ <translation>Pengaturan</translation>
</message>
<message>
<source><b>%1</b> page:</source>
- <translation type="unfinished"></translation>
+ <translation>Halaman <b>%1</b>:</translation>
</message>
<message>
<source><b>%1: %2</b> page:</source>
- <translation type="unfinished"></translation>
+ <translation>Halaman <b>%1: %2</b>:</translation>
</message>
</context>
<context>
@@ -8720,7 +8742,7 @@ langkah ini dan memasang hard disk pada waktu lain menggunakan dialog Setting Me
</message>
<message>
<source>Update</source>
- <translation>Update</translation>
+ <translation>Pemutakhiran</translation>
</message>
<message>
<source>Language</source>
@@ -8748,7 +8770,7 @@ langkah ini dan memasang hard disk pada waktu lain menggunakan dialog Setting Me
</message>
<message>
<source>Display</source>
- <translation type="unfinished"></translation>
+ <translation>Tampilan</translation>
</message>
</context>
<context>
@@ -8763,7 +8785,7 @@ langkah ini dan memasang hard disk pada waktu lain menggunakan dialog Setting Me
</message>
<message>
<source>Display</source>
- <translation>Display</translation>
+ <translation>Tampilan</translation>
</message>
<message>
<source>Storage</source>
@@ -8795,7 +8817,7 @@ langkah ini dan memasang hard disk pada waktu lain menggunakan dialog Setting Me
</message>
<message>
<source>Shared Folders</source>
- <translation>Folder yang di Share</translation>
+ <translation>Folder Bersama</translation>
</message>
<message>
<source>%1 - %2</source>
@@ -8806,7 +8828,7 @@ langkah ini dan memasang hard disk pada waktu lain menggunakan dialog Setting Me
<name>UITextEditor</name>
<message>
<source>Edit text</source>
- <translation>Edit teks</translation>
+ <translation>Sunting teks</translation>
</message>
<message>
<source>&Replace...</source>
@@ -8814,7 +8836,7 @@ langkah ini dan memasang hard disk pada waktu lain menggunakan dialog Setting Me
</message>
<message>
<source>Replaces the current text with the content of a file.</source>
- <translation>Ganti teks sekarang dengan isi dari suatu file.</translation>
+ <translation>Ganti teks sekarang dengan isi dari suatu berkas.</translation>
</message>
<message>
<source>Text (*.txt);;All (*.*)</source>
@@ -8822,7 +8844,7 @@ langkah ini dan memasang hard disk pada waktu lain menggunakan dialog Setting Me
</message>
<message>
<source>Select a file to open...</source>
- <translation>Pilih sebuah file untuk dibuka...</translation>
+ <translation>Pilih sebuah berkas untuk dibuka...</translation>
</message>
</context>
<context>
@@ -8892,7 +8914,7 @@ langkah ini dan memasang hard disk pada waktu lain menggunakan dialog Setting Me
<name>UIUpdateStepVirtualBox</name>
<message>
<source>Checking for a new VirtualBox version...</source>
- <translation type="unfinished"></translation>
+ <translation>Memeriksa versi baru VirtualBox...</translation>
</message>
</context>
<context>
@@ -8907,7 +8929,7 @@ langkah ini dan memasang hard disk pada waktu lain menggunakan dialog Setting Me
</message>
<message>
<source><p>Saves the current execution state of the virtual machine to the physical hard disk of the host PC.</p><p>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.</p><p>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 th [...]
- <translation><p>Menyimpan keadaan eksekusi mesin virtual pada hard disk fisik dari PC host.</p><p>Saat waktu berikutnya mesin ini dinyalakan, akan dikembalikan dari keadaan yang tersimpan dan melanjutkan eksekusi dari tempat dimana Anda menyimpannya, yang akan memungkinkan Anda melanjutkan pekerjaan Anda seketika.</p><p>Perhatikan bahwa menyimpan keadaan mesin dapat membutuhkan waktu lama, bergantung pada tipe sistem operasi guest dan banyaknya memor [...]
+ <translation><p>Menyimpan keadaan eksekusi mesin virtual pada hard disk fisik dari PC host.</p><p>Saat berikutnya mesin ini dinyalakan, akan dikembalikan dari keadaan yang tersimpan dan melanjutkan eksekusi dari tempat dimana Anda menyimpannya, yang akan memungkinkan Anda melanjutkan pekerjaan Anda seketika.</p><p>Perhatikan bahwa menyimpan keadaan mesin dapat membutuhkan waktu lama, bergantung pada tipe sistem operasi guest dan banyaknya memori yang [...]
</message>
<message>
<source>&Save the machine state</source>
@@ -8939,7 +8961,7 @@ langkah ini dan memasang hard disk pada waktu lain menggunakan dialog Setting Me
</message>
<message>
<source>&Restore current snapshot '%1'</source>
- <translation>&Kembali pada snapshot saat ini '%1'</translation>
+ <translation>&Pulihkan snapshot saat ini '%1'</translation>
</message>
</context>
<context>
@@ -9006,67 +9028,67 @@ langkah ini dan memasang hard disk pada waktu lain menggunakan dialog Setting Me
<name>UIVMLogViewer</name>
<message>
<source>Close the search panel</source>
- <translation type="unfinished">Tutup panel pencarian</translation>
+ <translation>Tutup panel pencarian</translation>
</message>
<message>
<source>&Find</source>
- <translation type="unfinished">&Cari </translation>
+ <translation>&Cari</translation>
</message>
<message>
<source>Enter a search string here</source>
- <translation type="unfinished">Masukkan string pencarian disini</translation>
+ <translation>Masukkan string pencarian di sini</translation>
</message>
<message>
<source>&Previous</source>
- <translation type="unfinished">&Sebelumnya</translation>
+ <translation>&Sebelumnya</translation>
</message>
<message>
<source>Search for the previous occurrence of the string</source>
- <translation type="unfinished">Cari dari string kejadian sebelumnya</translation>
+ <translation>Cari kemunculan string sebelumnya</translation>
</message>
<message>
<source>&Next</source>
- <translation type="unfinished">La&njut</translation>
+ <translation>Sela&njutnya</translation>
</message>
<message>
<source>Search for the next occurrence of the string</source>
- <translation type="unfinished">Caru dari string kejadian berikutnya</translation>
+ <translation>Cari kemunculan string selanjutnya</translation>
</message>
<message>
<source>C&ase Sensitive</source>
- <translation type="unfinished">C&ase Sensitive</translation>
+ <translation>Bed&akan Huruf Besar Kecil</translation>
</message>
<message>
<source>Perform case sensitive search (when checked)</source>
- <translation type="unfinished">Lakukan pencarian secara case sensitive (bila dipilih)</translation>
+ <translation>Lakukan pencarian yang membedakan huruf besar kecil (bila dipilih)</translation>
</message>
<message>
<source>String not found</source>
- <translation type="unfinished">String tidak ditemukan</translation>
+ <translation>String tidak ditemukan</translation>
</message>
<message>
<source><p>No log files found. Press the <b>Refresh</b> button to rescan the log folder <nobr><b>%1</b></nobr>.</p></source>
- <translation type="unfinished"><p>Tidak ada file log ditemukan. Tekan tombol <b>Refresh</b> untuk me-rescan folder log <nobr><b>%1</b></nobr>.</p></translation>
+ <translation><p>Tidak ada file log yang ditemukan. Tekan tombol <b>Segarkan</b> untuk memindai ulang folder log <nobr><b>%1</b></nobr>.</p></translation>
</message>
<message>
<source>Save VirtualBox Log As</source>
- <translation type="unfinished">Simpan Log VirtualBox Sebagai</translation>
+ <translation>Simpan Log VirtualBox Sebagai</translation>
</message>
<message>
<source>%1 - VirtualBox Log Viewer</source>
- <translation type="unfinished">%1 -Viewer Log VirtualBox</translation>
+ <translation>%1 -Penilik Log VirtualBox</translation>
</message>
<message>
<source>&Refresh</source>
- <translation type="unfinished">&Refresh</translation>
+ <translation>Sega&rkan</translation>
</message>
<message>
<source>&Save</source>
- <translation type="unfinished">&Simpan</translation>
+ <translation>&Simpan</translation>
</message>
<message>
<source>Close</source>
- <translation type="unfinished">Tutup</translation>
+ <translation>Tutup</translation>
</message>
</context>
<context>
@@ -9104,301 +9126,301 @@ langkah ini dan memasang hard disk pada waktu lain menggunakan dialog Setting Me
<name>UIWizard</name>
<message>
<source>Hide Description</source>
- <translation type="unfinished"></translation>
+ <translation>Sembunyikan Deskripsi</translation>
</message>
<message>
<source>Show Description</source>
- <translation type="unfinished"></translation>
+ <translation>Tampilkan Deskripsi</translation>
</message>
</context>
<context>
<name>UIWizardCloneVD</name>
<message>
<source>Copy Virtual Hard Drive</source>
- <translation type="unfinished"></translation>
+ <translation>Salin Hard Disk Virtual</translation>
</message>
<message>
<source>Copy</source>
- <translation type="unfinished">Salin</translation>
+ <translation>Salin</translation>
</message>
<message>
<source>Hard drive to copy</source>
- <translation type="unfinished"></translation>
+ <translation>Hard disk yang akan disalin</translation>
</message>
<message>
<source><p>Please select the virtual hard drive file that you would like to copy if it is not already selected. You can either choose one from the list or use the folder icon beside the list to select one.</p></source>
- <translation type="unfinished"></translation>
+ <translation><p>Silakan pilih berkas hard disk virtual yang ingin Anda salin bila belum dipilih. Anda dapat memilih dari daftar atau memakai ikon folder di samping daftar untuk memilih salah satu.</p></translation>
</message>
<message>
<source>Choose a virtual hard drive file to copy...</source>
- <translation type="unfinished"></translation>
+ <translation>Pilih file hard disk virtual yang akan disalin...</translation>
</message>
<message>
<source>Hard drive file type</source>
- <translation type="unfinished"></translation>
+ <translation>Tipe file hard disk</translation>
</message>
<message>
<source>Please choose the type of file that you would like to use for the new virtual hard drive. If you do not need to use it with other virtualization software you can leave this setting unchanged.</source>
- <translation type="unfinished"></translation>
+ <translation>Silakan pilih tipe berkas yang ingin Anda pakai untuk hard disk virtual baru. Bila Anda tak perlu memakainya dengan perangkat lunak virtualisasi lain Anda dapat membiarkan setting ini tak diubah.</translation>
</message>
<message>
<source>Storage on physical hard drive</source>
- <translation type="unfinished"></translation>
+ <translation>Penyimpanan pada hard disk fisik</translation>
</message>
<message>
<source>Please choose whether the new virtual hard drive file should grow as it is used (dynamically allocated) or if it should be created at its maximum size (fixed size).</source>
- <translation type="unfinished"></translation>
+ <translation>Silakan pilih apakah berkas hard disk virtual baru mesti berkembang ketika dipakai (dialokasikan secara dinamik) atau mesti diciptakan pada ukuran maksimumnya (ukuran tetap).</translation>
</message>
<message>
<source><p>A <b>dynamically allocated</b> hard drive file will only use space on your physical hard drive as it fills up (up to a maximum <b>fixed size</b>), although it will not shrink again automatically when space on it is freed.</p></source>
- <translation type="unfinished"></translation>
+ <translation><p>Berkas hard disk virtual <b>yang dialokasikan secara dinamik</b> hanya akan memakai ruang pada hard disk fisik Anda ketika terisi (sampai dengan suatu <b>ukuran tetap</b> maksimum), walaupun mereka tak akan mengecil lagi secara otomatis ketika ruang di dalamnya dibebaskan.</p></translation>
</message>
<message>
<source><p>A <b>fixed size</b> hard drive file may take longer to create on some systems but is often faster to use.</p></source>
- <translation type="unfinished"></translation>
+ <translation><p>Berkas hard disk virtual <b>ukuran tetap</b> mungkin makan waktu lebih lama untuk diciptakan pada beberapa sistem tapi seringkali lebih cepat dipakainya.</p></translation>
</message>
<message>
<source><p>You can also choose to <b>split</b> the hard drive file into several files of up to two gigabytes each. This is mainly useful if you wish to store the virtual machine on removable USB devices or old systems, some of which cannot handle very large files.</source>
- <translation type="unfinished"></translation>
+ <translation><p>Anda juga dapat memilih untuk <b>memecah</b> berkas hard disk virtual ke dalam beberapa berkas yang masing-masing berukuran sampai dengan dua giga byte. Ini terutama berguna bila Anda hendak menyimpan mesin virtual pada perangkat USB lepas pasang atau sistem lama, yang mungkin tak bisa menangani berkas sangat besar.</translation>
</message>
<message>
<source>&Dynamically allocated</source>
- <translation type="unfinished">&Dialokasikan secara dinamis</translation>
+ <translation>&Dialokasikan secara dinamis</translation>
</message>
<message>
<source>&Fixed size</source>
- <translation type="unfinished">Ukuran &tetap</translation>
+ <translation>Ukuran &tetap</translation>
</message>
<message>
<source>&Split into files of less than 2GB</source>
- <translation type="unfinished">&Pecah ke dalam file kurang dari 2GB</translation>
+ <translation>&Pecah ke dalam file kurang dari 2GB</translation>
</message>
<message>
<source>Please choose a location for new virtual hard drive file</source>
- <translation type="unfinished"></translation>
+ <translation>Silakah pilih lokasi untuk berkas hard disk virtual baru</translation>
</message>
<message>
<source>New hard drive to create</source>
- <translation type="unfinished"></translation>
+ <translation>Hard disk baru yang akan dibuat</translation>
</message>
<message>
<source>Please type the name of the new virtual hard drive file into the box below or click on the folder icon to select a different folder to create the file in.</source>
- <translation type="unfinished"></translation>
+ <translation>Silakan ketik nama berkas hard disk virtual baru ke kotak di bawah atau klik pada ikon folder untuk memilih folder lain tempat mencipta berkas.</translation>
</message>
<message>
<source>Choose a location for new virtual hard drive file...</source>
- <translation type="unfinished"></translation>
+ <translation>Pilih lokasi untuk berkas hard disk virtual baru...</translation>
</message>
<message>
<source>%1_copy</source>
<comment>copied virtual hard drive name</comment>
- <translation type="unfinished">salinan_%1</translation>
+ <translation>salinan_%1</translation>
</message>
<message>
<source>Hard drive to ©</source>
- <translation type="unfinished"></translation>
+ <translation>Hard disk yang akan di&salin</translation>
</message>
<message>
<source>&New hard drive to create</source>
- <translation type="unfinished"></translation>
+ <translation>Hard disk baru yang aka&n dibuat</translation>
</message>
<message>
<source>Hard drive file &type</source>
- <translation type="unfinished"></translation>
+ <translation>&Tipe berkas hard disk</translation>
</message>
</context>
<context>
<name>UIWizardCloneVM</name>
<message>
<source>Linked Base for %1 and %2</source>
- <translation type="unfinished">Basis Tertaut bagi %1 dan %2</translation>
+ <translation>Basis Tertaut bagi %1 dan %2</translation>
</message>
<message>
<source>Clone Virtual Machine</source>
- <translation type="unfinished"></translation>
+ <translation>Buat Klon Mesin Virtual</translation>
</message>
<message>
<source>Clone</source>
- <translation type="unfinished">Klon</translation>
+ <translation>Klon</translation>
</message>
<message>
<source>%1 Clone</source>
- <translation type="unfinished">Klon %1</translation>
+ <translation>Klon %1</translation>
</message>
<message>
<source>New machine name</source>
- <translation type="unfinished"></translation>
+ <translation>Nama mesin baru</translation>
</message>
<message>
<source><p>Please choose a name for the new virtual machine. The new machine will be a clone of the machine <b>%1</b>.</p></source>
- <translation type="unfinished"></translation>
+ <translation><p>Harap pilih suatu nama bagi mesin virtual baru. Mesin baru akan berupa klon dari mesin <b>%1</b>.</p></translation>
</message>
<message>
<source>When checked a new unique MAC address will be assigned to all configured network cards.</source>
- <translation type="unfinished">Saat ditandai, suatu alamat MAC unik yang baru akan diberikan ke semua kartu jaringan yang terkonfigurasi.</translation>
+ <translation>Saat ditandai, suatu alamat MAC unik yang baru akan diberikan ke semua kartu jaringan yang terkonfigurasi.</translation>
</message>
<message>
<source>&Reinitialize the MAC address of all network cards</source>
- <translation type="unfinished"></translation>
+ <translation>Inisialisasi ulang alamat MAC dari semua kartu ja&ringan</translation>
</message>
<message>
<source>Clone type</source>
- <translation type="unfinished"></translation>
+ <translation>Tipe klon</translation>
</message>
<message>
<source><p>Please choose the type of clone you wish to create.</p><p>If you choose <b>Full clone</b>, an exact copy (including all virtual hard drive files) of the original virtual machine will be created.</p><p>If you choose <b>Linked clone</b>, a new machine will be created, but the virtual hard drive files will be tied to the virtual hard drive files of original machine and you will not be able to move the new virtual machi [...]
- <translation type="unfinished"></translation>
+ <translation><p>Harap pilih tipe klon yang hendak Anda buat.</p><p>Bila Anda memilih <b>Klon penuh</b>, suatu salinan eksak (termasuk semua berkas hard disk virtual) dari mesin virtual asli akan dibuat.</p><p>Bila Anda memilih <b>Klon tertaut</b>, suatu mesin baru akan dibuat, tapi berkas hard disk virtual akan diikatkan ke berkas hard disk virtual mesin yang asli, dan Anda tidak akan bisa memindah mesin virtual baru ke komput [...]
</message>
<message>
<source><p>If you create a <b>Linked clone</b> then a new snapshot will be created in the original virtual machine as part of the cloning process.</p></source>
- <translation type="unfinished"></translation>
+ <translation>Bila Anda memilih <b>Klon tertaut</b> maka suatu snapshot baru akan dibuat dalam mesin virtual asli sebagai bagian dari proses kloning.</p></translation>
</message>
<message>
<source>&Full clone</source>
- <translation type="unfinished"></translation>
+ <translation>Klon penuh</translation>
</message>
<message>
<source>&Linked clone</source>
- <translation type="unfinished"></translation>
+ <translation>Klon &tertaut</translation>
</message>
<message>
<source>Snapshots</source>
- <translation type="unfinished"></translation>
+ <translation>Snapshot</translation>
</message>
<message>
<source><p>Please choose which parts of the snapshot tree should be cloned with the machine.</p></source>
- <translation type="unfinished"></translation>
+ <translation><p>Silakan pilih bagian mana dari pohon snapshot yang mesti diklon dengan mesin.</p></translation>
</message>
<message>
<source><p>If you choose <b>Current machine state</b>, the new machine will reflect the current state of the original machine and will have no snapshots.</p></source>
- <translation type="unfinished"></translation>
+ <translation><p>Bila Anda memilih <b>Keadaan mesin kini</b>, mesin baru akan mencerminkan keadaan sekarang dari mesin asli dan tidak akan memiliki snapshot.</p></translation>
</message>
<message>
<source><p>If you choose <b>Current snapshot tree branch</b>, the new machine will reflect the current state of the original machine and will have matching snapshots for all snapshots in the tree branch starting at the current state in the original machine.</p></source>
- <translation type="unfinished"></translation>
+ <translation><p>Bila Anda memilih <b>Cabang pohon snapshot saat ini</b>, mesin baru akan mencerminkan keadaan sekarang dari mesin asli dan akan memiliki snapshot yang cocok bagi semua snapshot dalam cabang pohon yang dimulai dari keadaan sekarang dalam mesin asli.</p></translation>
</message>
<message>
<source><p>If you choose <b>Everything</b>, the new machine will reflect the current state of the original machine and will have matching snapshots for all snapshots in the original machine.</p></source>
- <translation type="unfinished"></translation>
+ <translation><p>Bila Anda memilih <b>Semuanya</b>, mesin baru akan mencerminkan keadaan sekarang dari mesin asli dan dan akan memiliki snapshot yang cocok bagi semua snapshot dalam mesin asli.</p></translation>
</message>
<message>
<source>Current &machine state</source>
- <translation type="unfinished"></translation>
+ <translation>Keadaan &mesin kini</translation>
</message>
<message>
<source>Current &snapshot tree branch</source>
- <translation type="unfinished"></translation>
+ <translation>Cabang pohon &snapshot saat ini</translation>
</message>
<message>
<source>&Everything</source>
- <translation type="unfinished"></translation>
+ <translation>S&emuanya</translation>
</message>
<message>
<source>New machine &name</source>
- <translation type="unfinished"></translation>
+ <translation>&Nama mesin baru</translation>
</message>
<message>
<source>&Full Clone</source>
- <translation type="unfinished"></translation>
+ <translation>Klon &Penuh</translation>
</message>
<message>
<source>&Linked Clone</source>
- <translation type="unfinished"></translation>
+ <translation>K&lon Tertaut</translation>
</message>
</context>
<context>
<name>UIWizardExportApp</name>
<message>
<source>Checking files ...</source>
- <translation type="unfinished">Memeriksa file ...</translation>
+ <translation>Memeriksa berkas ...</translation>
</message>
<message>
<source>Removing files ...</source>
- <translation type="unfinished">Menghapus file ...</translation>
+ <translation>Menghapus berkas ...</translation>
</message>
<message>
<source>Exporting Appliance ...</source>
- <translation type="unfinished">Mengekspor Appliance ...</translation>
+ <translation>Mengekspor Appliance ...</translation>
</message>
<message>
<source>Export Virtual Appliance</source>
- <translation type="unfinished"></translation>
+ <translation>Ekspor Appliance Virtual</translation>
</message>
<message>
<source>Restore Defaults</source>
- <translation type="unfinished">Kembalikan Default</translation>
+ <translation>Pulihkan Baku</translation>
</message>
<message>
<source>Export</source>
- <translation type="unfinished">Ekspor</translation>
+ <translation>Ekspor</translation>
</message>
<message>
<source>Virtual machines to export</source>
- <translation type="unfinished"></translation>
+ <translation>Mesin virtual yang akan diekspor</translation>
</message>
<message>
<source><p>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.</p></source>
- <translation type="unfinished"></translation>
+ <translation><p>Silakan pilih mesin virtual yang mesti ditambahkan ke appliance. Anda dapat memilih lebih dari satu. Perhatikan bahwa mesin-mesin ini mesti dimatikan sebelum dapat diekspor.</p></translation>
</message>
<message>
<source>Appliance settings</source>
- <translation type="unfinished"></translation>
+ <translation>Pengaturan appliance</translation>
</message>
<message>
<source>Please choose where to create the virtual appliance. You can create it on your own computer, on the Sun Cloud service or on an S3 storage server.</source>
- <translation type="unfinished"></translation>
+ <translation>Silakan pilih di mana membuat appliance virtual. Anda dapat membuatnya pada komputer Anda sendiri, pada layanan Sun Cloud, atau pada server penyimpanan S3.</translation>
</message>
<message>
<source>Create on</source>
- <translation type="unfinished"></translation>
+ <translation>Dibuat pada</translation>
</message>
<message>
<source>&This computer</source>
- <translation type="unfinished"></translation>
+ <translation>Kompu&ter ini</translation>
</message>
<message>
<source>Sun &Cloud</source>
- <translation type="unfinished">&Cloud Sun</translation>
+ <translation>&Cloud Sun</translation>
</message>
<message>
<source>&Simple Storage System (S3)</source>
- <translation type="unfinished">&Simple Storage System (S3)</translation>
+ <translation>&Simple Storage System (S3)</translation>
</message>
<message>
<source>Appliance</source>
- <translation type="unfinished">Appliance</translation>
+ <translation>Appliance</translation>
</message>
<message>
<source>&Username:</source>
- <translation type="unfinished">Nama pengg&una:</translation>
+ <translation>Nama pengg&una:</translation>
</message>
<message>
<source>&Password:</source>
- <translation type="unfinished">&Password:</translation>
+ <translation>&Password:</translation>
</message>
<message>
<source>&Hostname:</source>
- <translation type="unfinished">Nama &host:</translation>
+ <translation>Nama &host:</translation>
</message>
<message>
<source>&Bucket:</source>
- <translation type="unfinished">&Bucket:</translation>
+ <translation>&Bucket:</translation>
</message>
<message>
<source>&File:</source>
- <translation type="unfinished">&File:</translation>
+ <translation>&Berkas:</translation>
</message>
<message>
<source>Open Virtualization Format Archive (%1)</source>
- <translation type="unfinished">Arsip Open Virtualization Format (%1)</translation>
+ <translation>Arsip Open Virtualization Format (%1)</translation>
</message>
<message>
<source>Open Virtualization Format (%1)</source>
- <translation type="unfinished"></translation>
+ <translation>Open Virtualization Format (%1)</translation>
</message>
<message>
<source>Write in legacy OVF 0.9 format for compatibility with other virtualization products.</source>
- <translation type="unfinished">Tulis dalam format legacy OVF 0.9 untuk kompatibilitas dengan produk virtualisasi lain.</translation>
+ <translation>Tulis dalam format legacy OVF 0.9 untuk kompatibilitas dengan produk virtualisasi lain.</translation>
</message>
<message>
<source>&Write legacy OVF 0.9</source>
@@ -9406,135 +9428,135 @@ langkah ini dan memasang hard disk pada waktu lain menggunakan dialog Setting Me
</message>
<message>
<source>Create a Manifest file for automatic data integrity checks on import.</source>
- <translation type="unfinished">Buat file Manifest untuk pemeriksaan integritas data otomatis saat impor.</translation>
+ <translation>Buat berkas Manifest untuk pemeriksaan integritas data otomatis saat impor.</translation>
</message>
<message>
<source>Write &Manifest file</source>
- <translation type="unfinished">Tulis file &Manifest</translation>
+ <translation>Tulis berkas &Manifest</translation>
</message>
<message>
<source>This is the descriptive information which will be added to the virtual appliance. You can change it by double clicking on individual lines.</source>
- <translation type="unfinished"></translation>
+ <translation>Ini adalah informasi deskriptif yang akan ditambahkan ke appliance virtual. Anda dapat mengubahnya dengan klik ganda pada baris individu.</translation>
</message>
<message>
<source>Virtual &machines to export</source>
- <translation type="unfinished"></translation>
+ <translation>&Mesin virtual yang akan diekspor</translation>
</message>
<message>
<source>Appliance &settings</source>
- <translation type="unfinished"></translation>
+ <translation>&Pengaturan appliance</translation>
</message>
<message>
<source>&Destination</source>
- <translation type="unfinished"></translation>
+ <translation>&Tujuan</translation>
</message>
<message>
<source>&Local Filesystem </source>
- <translation type="unfinished">Sistem File &Lokal</translation>
+ <translation>Sistem Berkas &Lokal</translation>
</message>
<message>
<source>Storage settings</source>
- <translation type="unfinished"></translation>
+ <translation>Pengaturan penyimpanan</translation>
</message>
<message>
<source>Please choose a file to export the virtual appliance to</source>
- <translation type="unfinished"></translation>
+ <translation>Pilih berkas tujuan ekspor appliance virtual</translation>
</message>
<message>
<source>F&ormat:</source>
- <translation type="unfinished"></translation>
+ <translation>F&ormat:</translation>
</message>
<message>
<source>OVF 0.9</source>
- <translation type="unfinished"></translation>
+ <translation>OVF 0.9</translation>
</message>
<message>
<source>OVF 1.0</source>
- <translation type="unfinished"></translation>
+ <translation>OVF 1.0</translation>
</message>
<message>
<source>OVF 2.0</source>
- <translation type="unfinished"></translation>
+ <translation>OVF 2.0</translation>
</message>
<message>
<source>Write in standard OVF 1.0 format.</source>
- <translation type="unfinished"></translation>
+ <translation>Tulis dalam format standar OVF 1.0.</translation>
</message>
<message>
<source>Write in new experimental OVF 2.0 format.</source>
- <translation type="unfinished"></translation>
+ <translation>Tulis dalam format eksperimen OVF 2.0.</translation>
</message>
<message>
<source>&Storage settings</source>
- <translation type="unfinished"></translation>
+ <translation>&Pengaturan penyimpanan</translation>
</message>
</context>
<context>
<name>UIWizardExportAppPageBasic3</name>
<message>
<source><p>Please choose a filename to export the OVF/OVA to.</p><p>If you use an <i>ova</i> extension, then all the files will be combined into one Open Virtualization Format Archive.</p><p>If you use an <i>ovf</i> extension, several files will be written separately.</p><p>Other extensions are not allowed.</p></source>
- <translation type="unfinished"></translation>
+ <translation><p>Harap pilih suatu nama berkas tujuan ekspor OVF/OVA.</p><p>Bila Anda memakai ekstensi <i>ova</i>, maka semua berkas akan digabung ke dalam satu Open Virtualization Format Archive.</p><p>Jika Anda memakai ekstensi <i>ovf</i>, beberapa berkas akan ditulis secara terpisah.</p><p>Ekstensi lain tak diijinkan.</p></translation>
</message>
<message>
<source>Please complete the additional fields like the username, password and the bucket, and provide a filename for the OVF target.</source>
- <translation type="unfinished">Silakan lengkapi field tambahan seperti nama pengguna, password, dan bucket, dan berikan nama file bagi target OVF.</translation>
+ <translation>Silakan lengkapi field tambahan seperti nama pengguna, sandi, serta buket, dan berikan nama berkas bagi target OVF.</translation>
</message>
<message>
<source>Please complete the additional fields like the username, password, hostname and the bucket, and provide a filename for the OVF target.</source>
- <translation type="unfinished">Silakan lengkapi field tambahan seperti nama pengguna, password, nama host, dan bucket, dan berikan nama file bagi target OVF.</translation>
+ <translation>Silakan lengkapi field tambahan seperti nama pengguna, sandi, nama host, serta buket, dan berikan nama berkas bagi target OVF.</translation>
</message>
<message>
<source>Choose a file to export the virtual appliance to...</source>
- <translation type="unfinished"></translation>
+ <translation>Pilih berkas tujuan ekspor appliance virtual...</translation>
</message>
</context>
<context>
<name>UIWizardExportAppPageExpert</name>
<message>
<source>Choose a file to export the virtual appliance to...</source>
- <translation type="unfinished"></translation>
+ <translation>Pilih file tujuan ekspor appliance virtual...</translation>
</message>
</context>
<context>
<name>UIWizardFirstRun</name>
<message>
<source>Select start-up disk</source>
- <translation type="unfinished"></translation>
+ <translation>Pilih disk awal mula</translation>
</message>
<message>
<source>Start</source>
- <translation type="unfinished">Mulai</translation>
+ <translation>Mulai</translation>
</message>
<message>
<source><p>Please select a virtual optical disk file or a physical optical drive containing a disk to start your new virtual machine from.</p><p>The disk should be suitable for starting a computer from and should contain the operating system you wish to install on the virtual machine if you want to do that now. The disk will be ejected from the virtual drive automatically next time you switch the virtual machine off, but you can also do this yourself if needed u [...]
- <translation type="unfinished"></translation>
+ <translation><p>Harap pilih berkas disk optik virtual atau drive optik fisik yang memuat suatu disk tempat asal memulai mesin virtual Anda.</p><p>Disk mesti cocok untuk memulai suatu komputer dan mesti memuat sistem operasi yang ingin Anda pasang ke mesin virtual bila Anda ingin melakukannya sekarang. Disk mesti dikeluarkan dari drive virtual secara otomatis kali berikutnya Anda mematikan mesin virtual, tapi Anda juga dapat melakukan ini sendiri bila diperlukan [...]
</message>
<message>
<source><p>Please select a virtual optical disk file or a physical optical drive containing a disk to start your new virtual machine from.</p><p>The disk should be suitable for starting a computer from. As this virtual machine has no hard drive you will not be able to install an operating system on it at the moment.</p></source>
- <translation type="unfinished"></translation>
+ <translation><p>Harap pilih berkas disk optik virtual atau drive optik fisik yang memuat suatu disk tempat asal memulai mesin virtual Anda.</p><p>Disk mesti cocok untuk memulai suatu komputer. Karena mesin virtual ini tak memiliki hard disk Anda tidak akan bisa memasang sistem operasi padanya saat ini.</p></translation>
</message>
<message>
<source>Choose a virtual optical disk file...</source>
- <translation type="unfinished"></translation>
+ <translation>Pilih berkas disk optik virtual...</translation>
</message>
</context>
<context>
<name>UIWizardImportApp</name>
<message>
<source>Restore Defaults</source>
- <translation type="unfinished">Kembalikan Default</translation>
+ <translation>Pulihkan Baku</translation>
</message>
<message>
<source>Import</source>
- <translation type="unfinished">Impor</translation>
+ <translation>Impor</translation>
</message>
<message>
<source>Appliance to import</source>
- <translation type="unfinished"></translation>
+ <translation>Appliance yang akan diimpor</translation>
</message>
<message>
<source><p>VirtualBox currently supports importing appliances saved in the Open Virtualization Format (OVF). To continue, select the file to import below.</p></source>
- <translation type="unfinished"></translation>
+ <translation><p>VirtualBox saat ini mendukung pengimporan appliance yang disimpan dalam Open Virtualization Format (OVF). Untuk melanjutkan, pilih berkas yang hendak diimpor di bawah.</p></translation>
</message>
<message>
<source>Select an appliance to import</source>
@@ -9542,121 +9564,121 @@ langkah ini dan memasang hard disk pada waktu lain menggunakan dialog Setting Me
</message>
<message>
<source>Open Virtualization Format (%1)</source>
- <translation type="unfinished"></translation>
+ <translation>Open Virtualization Format (%1)</translation>
</message>
<message>
<source>Appliance settings</source>
- <translation type="unfinished"></translation>
+ <translation>Pengaturan appliance</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>
- <translation type="unfinished">Ini adalah mesin virtual yang dimuat di dalam appliance dan tatanan yang disarankan dari mesin VirtualBox yang diimpor. Anda dapat mengubah berbagai properti yang ditampilkan dengan melakukan klik ganda pada butir dan mematikan lainnya dengan memakai check box di bawah.</translation>
+ <translation>Ini adalah mesin virtual yang dimuat di dalam appliance dan tatanan yang disarankan dari mesin VirtualBox yang diimpor. Anda dapat mengubah berbagai properti yang ditampilkan dengan melakukan klik ganda pada butir dan mematikan lainnya dengan memakai kotak contreng di bawah.</translation>
</message>
<message>
<source>Import Virtual Appliance</source>
- <translation type="unfinished"></translation>
+ <translation>Impor Appliance Virtual</translation>
</message>
<message>
<source>Choose a virtual appliance file to import...</source>
- <translation type="unfinished"></translation>
+ <translation>Pilih berkas appliance virtual yang hendak diimpor...</translation>
</message>
<message>
<source>Please choose a virtual appliance file to import</source>
- <translation type="unfinished"></translation>
+ <translation>Harap pilih suatu berkas appliance virtual yang akan diimpor</translation>
</message>
</context>
<context>
<name>UIWizardNewVD</name>
<message>
<source>Create Virtual Hard Drive</source>
- <translation type="unfinished"></translation>
+ <translation>Buat Hard Disk Virtual</translation>
</message>
<message>
<source>Create</source>
- <translation type="unfinished">Buat</translation>
+ <translation>Buat</translation>
</message>
<message>
<source>Hard drive file type</source>
- <translation type="unfinished"></translation>
+ <translation>Tipe berkas hard disk</translation>
</message>
<message>
<source>Please choose the type of file that you would like to use for the new virtual hard drive. If you do not need to use it with other virtualization software you can leave this setting unchanged.</source>
- <translation type="unfinished"></translation>
+ <translation>Silakan pilih tipe berkas yang ingin Anda pakai untuk hard disk virtual baru. Bila Anda tak perlu memakainya dengan perangkat lunak virtualisasi lain Anda dapat membiarkan setting ini tak diubah.</translation>
</message>
<message>
<source>Storage on physical hard drive</source>
- <translation type="unfinished"></translation>
+ <translation>Penyimpanan pada hard disk fisik</translation>
</message>
<message>
<source>Please choose whether the new virtual hard drive file should grow as it is used (dynamically allocated) or if it should be created at its maximum size (fixed size).</source>
- <translation type="unfinished"></translation>
+ <translation>Silakan pilih apakah berkas hard disk virtual baru mesti berkembang ketika dipakai (dialokasikan secara dinamik) atau mesti diciptakan pada ukuran maksimumnya (ukuran tetap).</translation>
</message>
<message>
<source><p>A <b>dynamically allocated</b> hard drive file will only use space on your physical hard drive as it fills up (up to a maximum <b>fixed size</b>), although it will not shrink again automatically when space on it is freed.</p></source>
- <translation type="unfinished"></translation>
+ <translation><p>Berkas hard disk virtual <b>yang dialokasikan secara dinamik</b> hanya akan memakai ruang pada hard disk fisik Anda ketika terisi (sampai dengan suatu <b>ukuran tetap</b> maksimum), walaupun mereka tak akan mengecil lagi secara otomatis ketika ruang di dalamnya dibebaskan.</p></translation>
</message>
<message>
<source><p>A <b>fixed size</b> hard drive file may take longer to create on some systems but is often faster to use.</p></source>
- <translation type="unfinished"></translation>
+ <translation><p>Berkas hard disk virtual <b>berukuran tetap</b> mungkin makan waktu lebih lama untuk diciptakan pada beberapa sistem tapi seringkali lebih cepat dipakainya.</p></translation>
</message>
<message>
<source><p>You can also choose to <b>split</b> the hard drive file into several files of up to two gigabytes each. This is mainly useful if you wish to store the virtual machine on removable USB devices or old systems, some of which cannot handle very large files.</source>
- <translation type="unfinished"></translation>
+ <translation><p>Anda juga dapat memilih untuk <b>memecah</b> berkas hard disk virtual ke dalam beberapa berkas yang masing-masing berukuran sampai dengan dua giga byte. Ini terutama berguna bila Anda hendak menyimpan mesin virtual pada perangkat USB lepas pasang atau sistem lama, yang mungkin tak bisa menangani berkas sangat besar.</translation>
</message>
<message>
<source>&Dynamically allocated</source>
- <translation type="unfinished">&Dialokasikan secara dinamis</translation>
+ <translation>&Dialokasikan secara dinamik</translation>
</message>
<message>
<source>&Fixed size</source>
- <translation type="unfinished">Ukuran &tetap</translation>
+ <translation>Ukuran &tetap</translation>
</message>
<message>
<source>&Split into files of less than 2GB</source>
- <translation type="unfinished">&Pecah ke dalam file kurang dari 2GB</translation>
+ <translation>&Pecah ke dalam berkas-berkas kurang dari 2GB</translation>
</message>
<message>
<source><nobr>%1 (%2 B)</nobr></source>
- <translation type="unfinished"><nobr>%1 (%2 B)</nobr></translation>
+ <translation><nobr>%1 (%2 B)</nobr></translation>
</message>
<message>
<source>File location and size</source>
- <translation type="unfinished"></translation>
+ <translation>Lokasi dan ukuran berkas</translation>
</message>
<message>
<source>Please type the name of the new virtual hard drive file into the box below or click on the folder icon to select a different folder to create the file in.</source>
- <translation type="unfinished"></translation>
+ <translation>Silakan ketik nama berkas hard disk virtual baru ke kotak di bawah atau klik pada ikon folder untuk memilih folder lain tempat mencipta berkas.</translation>
</message>
<message>
<source>Choose a location for new virtual hard drive file...</source>
- <translation type="unfinished"></translation>
+ <translation>Pilih lokasi untuk berkas hard disk virtual baru...</translation>
</message>
<message>
<source>Select the size of the virtual hard drive in megabytes. This size is the limit on the amount of file data that a virtual machine will be able to store on the hard drive.</source>
- <translation type="unfinished"></translation>
+ <translation>Pilih ukuran image hard disk virtual dalam megabyte. Ukuran ini adalah batas pada banyaknya data berkas yang dapat disimpan oleh mesin virtual pada hard disk.</translation>
</message>
<message>
<source>File &location</source>
- <translation type="unfinished"></translation>
+ <translation>&Lokasi berkas</translation>
</message>
<message>
<source>File &size</source>
- <translation type="unfinished"></translation>
+ <translation>&Ukuran berkas</translation>
</message>
<message>
<source>Hard drive file &type</source>
- <translation type="unfinished"></translation>
+ <translation>&Tipe berkas hard disk</translation>
</message>
</context>
<context>
<name>UIWizardNewVM</name>
<message>
<source>Create Virtual Machine</source>
- <translation type="unfinished"></translation>
+ <translation>Ciptakan Mesin Virtual</translation>
</message>
<message>
<source>Create</source>
- <translation type="unfinished">Buat</translation>
+ <translation>Buat</translation>
</message>
<message>
<source>IDE Controller</source>
@@ -9680,47 +9702,47 @@ langkah ini dan memasang hard disk pada waktu lain menggunakan dialog Setting Me
</message>
<message>
<source>Name and operating system</source>
- <translation type="unfinished"></translation>
+ <translation>Nama dan sistem operasi</translation>
</message>
<message>
<source>Please choose a descriptive name for the new virtual machine and select the type of operating system you intend to install on it. The name you choose will be used throughout VirtualBox to identify this machine.</source>
- <translation type="unfinished"></translation>
+ <translation>Harap pilih suatu nama yang deskriptif bagi mesin virtual baru dan pilih tipe sistem operasu yang hendak Anda pasang padanya. Nama yang Anda pilih akan dipakai di seluruh VirtualBox untuk mengidentifikasi mesin ini.</translation>
</message>
<message>
<source>Memory size</source>
- <translation type="unfinished"></translation>
+ <translation>Ukuran memori</translation>
</message>
<message>
<source><p>Select the amount of memory (RAM) in megabytes to be allocated to the virtual machine.</p><p>The recommended memory size is <b>%1</b> MB.</p></source>
- <translation type="unfinished"></translation>
+ <translation><p>Atur banyaknya memori (RAM) dalam megabyte untuk dialokasikan ke mesin virtual.</p><p>Ukuran memori yang disarankan adalah <b>%1</b> MB.</p></translation>
</message>
<message>
<source>Hard drive</source>
- <translation type="unfinished"></translation>
+ <translation>Hard disk</translation>
</message>
<message>
<source><p>If you wish you can add a virtual hard drive to the new machine. You can either create a new hard drive file or select one from the list or from another location using the folder icon.</p><p>If you need a more complex storage set-up you can skip this step and make the changes to the machine settings once the machine is created.</p><p>The recommended size of the hard drive is <b>%1</b>.</p></source>
- <translation type="unfinished"></translation>
+ <translation><p>Bila Anda mau Anda dapat menambahkan suatu hard disk virtual ke mesin baru. Anda dapat membuat suatu berkas hard disk baru atau memilih satu dari daftar atau dari lokasi lain memakai ikon folder.</p><p>Bila Anda perlu penyiapan penyimpanan yang lebih rumit Anda dapat melewait langkah ini dan membuat perubahan ke pengaturan mesin setelah mesin dibuat.</p><p>Ukuran hard disk yang disarankan adalah <b>%1</b>.</p></translation>
</message>
<message>
<source>Choose a virtual hard drive file...</source>
- <translation type="unfinished"></translation>
+ <translation>Pilih suatu berkas hard disk virtual...</translation>
</message>
<message>
<source>&Memory size</source>
- <translation type="unfinished"></translation>
+ <translation>Ukuran &memori</translation>
</message>
<message>
<source>&Do not add a virtual hard drive</source>
- <translation type="unfinished"></translation>
+ <translation>Jangan tambahkan hard &disk virtual</translation>
</message>
<message>
<source>&Create a virtual hard drive now</source>
- <translation type="unfinished"></translation>
+ <translation>&Buat hard disk virtual sekarang</translation>
</message>
<message>
<source>&Use an existing virtual hard drive file</source>
- <translation type="unfinished"></translation>
+ <translation>G&unakan berkas hard disk virtual yang ada</translation>
</message>
</context>
<context>
@@ -9737,7 +9759,7 @@ langkah ini dan memasang hard disk pada waktu lain menggunakan dialog Setting Me
</message>
<message>
<source>VirtualBox Graphical User Interface</source>
- <translation>Antarmuka Pengguna Grafik VirtualBox</translation>
+ <translation>Antarmuka Pengguna Grafis VirtualBox</translation>
</message>
<message>
<source>Version %1</source>
@@ -10638,18 +10660,18 @@ Versi %1</translation>
</message>
<message>
<source>Choose...</source>
- <translation type="unfinished"></translation>
+ <translation>Pilih...</translation>
</message>
</context>
<context>
<name>VBoxFilePathSelectorWidget</name>
<message>
<source><reset to default></source>
- <translation><reset ke default></translation>
+ <translation><reset ke baku></translation>
</message>
<message>
<source>The actual default path value will be displayed after accepting the changes and opening this window again.</source>
- <translation type="unfinished">Nila path default sebenarnya akan ditampilkan setelah menerima perubahan dan membuka dialog ini lagi.</translation>
+ <translation>Nila path baku sebenarnya akan ditampilkan setelah menerima perubahan dan membuka dialog ini lagi.</translation>
</message>
<message>
<source><not selected></source>
@@ -10657,7 +10679,7 @@ Versi %1</translation>
</message>
<message>
<source>Please use the <b>Other...</b> item from the drop-down list to select a path.</source>
- <translation>Silakan pakai item <b>Lainnya...</b> dari daftar drop-down untuk memilih suatu path.</translation>
+ <translation>Silakan pakai butir <b>Lainnya...</b> dari daftar drop-down untuk memilih suatu path.</translation>
</message>
<message>
<source>Other...</source>
@@ -10669,19 +10691,19 @@ Versi %1</translation>
</message>
<message>
<source>Opens a window to select a different folder.</source>
- <translation>Buka dialog untuk memilih folder lain.</translation>
+ <translation>Buka jendela untuk memilih folder lain.</translation>
</message>
<message>
<source>Resets the folder path to the default value.</source>
- <translation>Reset path folder ke nilai default.</translation>
+ <translation>Reset path folder ke nilai baku.</translation>
</message>
<message>
<source>Opens a window to select a different file.</source>
- <translation>Buka dialog untuk memilih file lain.</translation>
+ <translation>Buka jendela untuk memilih berkas lain.</translation>
</message>
<message>
<source>Resets the file path to the default value.</source>
- <translation>Reset path file ke nilai default.</translation>
+ <translation>Reset path berkas ke nilai baku.</translation>
</message>
<message>
<source>&Copy</source>
@@ -10693,7 +10715,7 @@ Versi %1</translation>
</message>
<message>
<source>Please type the file path here.</source>
- <translation>Silakan ketik path file di sini.</translation>
+ <translation>Silakan ketik path berkas di sini.</translation>
</message>
<message>
<source>The actual default path value will be displayed after accepting the changes and opening this window again.</source>
@@ -10741,12 +10763,12 @@ Versi %1</translation>
<message>
<source>Unknown device %1:%2</source>
<comment>USB device details</comment>
- <translation>Device tidak dikenal %1:%2</translation>
+ <translation>Perangkat tidak dikenal %1:%2</translation>
</message>
<message>
<source><nobr>Vendor ID: %1</nobr><br><nobr>Product ID: %2</nobr><br><nobr>Revision: %3</nobr></source>
<comment>USB device tooltip</comment>
- <translation><nobr>ID Vendor: %1</nobr><br><nobr>ID Product: %2</nobr><br><nobr>Revisi: %3</nobr></translation>
+ <translation><nobr>ID Vendor: %1</nobr><br><nobr>ID Produk: %2</nobr><br><nobr>Revisi: %3</nobr></translation>
</message>
<message>
<source><br><nobr>Serial No. %1</nobr></source>
@@ -10766,7 +10788,7 @@ Versi %1</translation>
<message>
<source>OS Type</source>
<comment>details report</comment>
- <translation>Tipe Sistem Operasi</translation>
+ <translation>Tipe OS</translation>
</message>
<message>
<source>Base Memory</source>
@@ -10781,7 +10803,7 @@ Versi %1</translation>
<message>
<source>General</source>
<comment>details report</comment>
- <translation>Garis Besar</translation>
+ <translation>Umum</translation>
</message>
<message>
<source>Video Memory</source>
@@ -10821,22 +10843,22 @@ Versi %1</translation>
<message>
<source>Enabled</source>
<comment>details report (ACPI)</comment>
- <translation>Menyala</translation>
+ <translation>Difungsikan</translation>
</message>
<message>
<source>Disabled</source>
<comment>details report (ACPI)</comment>
- <translation>Mati</translation>
+ <translation>Dinonaktifkan</translation>
</message>
<message>
<source>Enabled</source>
<comment>details report (I/O APIC)</comment>
- <translation>Menyala</translation>
+ <translation>Difungsikan</translation>
</message>
<message>
<source>Disabled</source>
<comment>details report (I/O APIC)</comment>
- <translation>Mati</translation>
+ <translation>Dinonaktifkan</translation>
</message>
<message>
<source>Not mounted</source>
@@ -10886,7 +10908,7 @@ Versi %1</translation>
<message>
<source>Disabled</source>
<comment>details report (audio)</comment>
- <translation>Mati</translation>
+ <translation>Dinonaktifkan</translation>
</message>
<message>
<source>Audio</source>
@@ -10896,12 +10918,12 @@ Versi %1</translation>
<message>
<source>Adapter %1</source>
<comment>details report (network)</comment>
- <translation>Adapter %1</translation>
+ <translation>Adaptor %1</translation>
</message>
<message>
<source>Disabled</source>
<comment>details report (network)</comment>
- <translation>Mati</translation>
+ <translation>Dinonaktifkan</translation>
</message>
<message>
<source>Network</source>
@@ -10911,7 +10933,7 @@ Versi %1</translation>
<message>
<source>Device Filters</source>
<comment>details report (USB)</comment>
- <translation>Filter Device</translation>
+ <translation>Penyaring Perangkat</translation>
</message>
<message>
<source>%1 (%2 active)</source>
@@ -10921,7 +10943,7 @@ Versi %1</translation>
<message>
<source>Disabled</source>
<comment>details report (USB)</comment>
- <translation>Mati</translation>
+ <translation>Dinonaktifkan</translation>
</message>
<message>
<source>VRDP Server Port</source>
@@ -11175,7 +11197,7 @@ Versi %1</translation>
<message>
<source>Not supported</source>
<comment>USBDeviceState</comment>
- <translation>Tidak terdukung</translation>
+ <translation>Tidak didukung</translation>
</message>
<message>
<source>Unavailable</source>
@@ -11195,12 +11217,12 @@ Versi %1</translation>
<message>
<source>Held</source>
<comment>USBDeviceState</comment>
- <translation>Terpegang</translation>
+ <translation>Ditahan</translation>
</message>
<message>
<source>Captured</source>
<comment>USBDeviceState</comment>
- <translation>Tertangkap</translation>
+ <translation>Ditangkap</translation>
</message>
<message>
<source><i>Checking...</i></source>
@@ -11215,7 +11237,7 @@ Versi %1</translation>
<message>
<source>Disabled</source>
<comment>ClipboardType</comment>
- <translation>Mati</translation>
+ <translation>Dinonaktifkan</translation>
</message>
<message>
<source>Host To Guest</source>
@@ -11248,7 +11270,7 @@ Versi %1</translation>
<message>
<source>Disabled</source>
<comment>details report (serial ports)</comment>
- <translation>Mati</translation>
+ <translation>Dinonaktifkan</translation>
</message>
<message>
<source>Serial Ports</source>
@@ -11263,7 +11285,7 @@ Versi %1</translation>
<message>
<source>Shared Folders</source>
<comment>details report (shared folders)</comment>
- <translation>Folder yang di Share</translation>
+ <translation>Folder Bersama</translation>
</message>
<message>
<source>%1</source>
@@ -11278,7 +11300,7 @@ Versi %1</translation>
<message>
<source>Shared Folders</source>
<comment>details report</comment>
- <translation>Folder yang di Share</translation>
+ <translation>Folder Bersama</translation>
</message>
<message>
<source>Stuck</source>
@@ -11298,7 +11320,7 @@ Versi %1</translation>
<message>
<source>Host Device</source>
<comment>PortMode</comment>
- <translation>Device Host</translation>
+ <translation>Perangkat Host</translation>
</message>
<message>
<source>User-defined</source>
@@ -11323,22 +11345,22 @@ Versi %1</translation>
<message>
<source>Enabled</source>
<comment>details report (VT-x/AMD-V)</comment>
- <translation>Menyala</translation>
+ <translation>Difungsikan</translation>
</message>
<message>
<source>Disabled</source>
<comment>details report (VT-x/AMD-V)</comment>
- <translation>Mati</translation>
+ <translation>Dinonaktifkan</translation>
</message>
<message>
<source>Enabled</source>
<comment>details report (PAE/NX)</comment>
- <translation>Menyala</translation>
+ <translation>Difungsikan</translation>
</message>
<message>
<source>Disabled</source>
<comment>details report (PAE/NX)</comment>
- <translation>Mati</translation>
+ <translation>Dinonaktifkan</translation>
</message>
<message>
<source>Host Driver</source>
@@ -11358,7 +11380,7 @@ Versi %1</translation>
<message>
<source>Disabled</source>
<comment>details report (parallel ports)</comment>
- <translation>Mati</translation>
+ <translation>Dinonaktifkan</translation>
</message>
<message>
<source>Parallel Ports</source>
@@ -11373,7 +11395,7 @@ Versi %1</translation>
<message>
<source>Shared Folder</source>
<comment>DeviceType</comment>
- <translation>Folder yang di Share</translation>
+ <translation>Folder Bersama</translation>
</message>
<message>
<source>IDE</source>
@@ -11533,12 +11555,12 @@ Versi %1</translation>
<message>
<source>Enabled</source>
<comment>details report (3D Acceleration)</comment>
- <translation>Diaktifkan</translation>
+ <translation>Difungsikan</translation>
</message>
<message>
<source>Disabled</source>
<comment>details report (3D Acceleration)</comment>
- <translation>Dimatikan</translation>
+ <translation>Dinonaktifkan</translation>
</message>
<message>
<source>Setting Up</source>
@@ -11558,12 +11580,12 @@ Versi %1</translation>
<message>
<source>Enabled</source>
<comment>details report (Nested Paging)</comment>
- <translation>Diaktifkan</translation>
+ <translation>Difungsikan</translation>
</message>
<message>
<source>Disabled</source>
<comment>details report (Nested Paging)</comment>
- <translation>Dimatikan</translation>
+ <translation>Dinonaktifkan</translation>
</message>
<message>
<source>Internal network, '%1'</source>
@@ -11658,22 +11680,22 @@ Versi %1</translation>
<message>
<source>Display</source>
<comment>details report</comment>
- <translation>Display</translation>
+ <translation>Tampilan</translation>
</message>
<message>
<source>Raw File</source>
<comment>PortMode</comment>
- <translation>File Raw</translation>
+ <translation>Berkas Mentah</translation>
</message>
<message>
<source>Enabled</source>
<comment>details report (2D Video Acceleration)</comment>
- <translation>Diaktifkan</translation>
+ <translation>Difungsikan</translation>
</message>
<message>
<source>Disabled</source>
<comment>details report (2D Video Acceleration)</comment>
- <translation>Dimatikan</translation>
+ <translation>Dinonaktifkan</translation>
</message>
<message>
<source>2D Video Acceleration</source>
@@ -11683,7 +11705,7 @@ Versi %1</translation>
<message>
<source>Not Attached</source>
<comment>details report (Storage)</comment>
- <translation>Tidak Disambung</translation>
+ <translation>Tidak Terpasang</translation>
</message>
<message>
<source>Storage</source>
@@ -11818,21 +11840,21 @@ Versi %1</translation>
<message>
<source>Failed to check accessibility of disk image files.</source>
<comment>medium</comment>
- <translation>Gagal memeriksa aksesibilitas media.</translation>
+ <translation>Gagal memeriksa aksesibilitas berkas image disk.</translation>
</message>
<message>
<source><b>No disk image file selected</b></source>
<comment>medium</comment>
- <translation><b>Tak ada medium yang dipilih</b></translation>
+ <translation><b>Tidak ada berkas image disk yang dipilih</b></translation>
</message>
<message>
<source>You can also change this while the machine is running.</source>
- <translation>Anda juga dapat mengubah ini ketika mesin berjalan.</translation>
+ <translation>Anda juga dapat mengubah ini ketika mesin sedang berjalan.</translation>
</message>
<message>
<source><b>No disk image files available</b></source>
<comment>medium</comment>
- <translation><b>Tak ada media yang tersedia</b></translation>
+ <translation><b>Tidak ada berkas image disk yang tersedia</b></translation>
</message>
<message>
<source>You can create disk image files using the virtual media manager.</source>
@@ -11846,7 +11868,7 @@ Versi %1</translation>
<message>
<source>Some of the files in this hard disk chain are inaccessible. Please use the Virtual Media Manager in <b>Show Differencing Hard Disks</b> mode to inspect these files.</source>
<comment>medium</comment>
- <translation>Beberapa media dalam rangkaian hard disk ini tak dapat diakses. Silakan pakai Manajer Media Virtual dalam mode <b>Tampilkan Hard Disk Pembeda</b> untuk memeriksa media tersebut.</translation>
+ <translation>Beberapa berkas dalam rangkaian hard disk ini tak dapat diakses. Silakan pakai Manajer Media Virtual dalam mode <b>Tampilkan Hard Disk Pembeda</b> untuk memeriksa berkas-berkas tersebut.</translation>
</message>
<message>
<source>This base hard disk is indirectly attached using the following differencing hard disk:</source>
@@ -11891,7 +11913,7 @@ Versi %1</translation>
</message>
<message>
<source>(CD/DVD)</source>
- <translation>CD/DVD</translation>
+ <translation>(CD/DVD)</translation>
</message>
<message>
<source>Screens</source>
@@ -11960,7 +11982,7 @@ Versi %1</translation>
<message>
<source>Unknown device</source>
<comment>USB device details</comment>
- <translation>Device tidak dikenal</translation>
+ <translation>Perangkat tidak dikenal</translation>
</message>
<message>
<source>SAS Port %1</source>
@@ -11980,7 +12002,7 @@ Versi %1</translation>
<message>
<source>Disabled</source>
<comment>details report (VRDE Server)</comment>
- <translation>Dimatikan</translation>
+ <translation>Dinonaktifkan</translation>
</message>
<message>
<source>Choose a virtual hard disk file</source>
@@ -12012,7 +12034,7 @@ Versi %1</translation>
</message>
<message>
<source>All files (*)</source>
- <translation>Semua file (*)</translation>
+ <translation>Semua berkas (*)</translation>
</message>
<message>
<source>Fault Tolerant Syncing</source>
@@ -12108,7 +12130,7 @@ Versi %1</translation>
<message>
<source>Execution Cap</source>
<comment>details report</comment>
- <translation>Cap Eksekusi</translation>
+ <translation>Batas Eksekusi</translation>
</message>
<message>
<source><nobr>%1%</nobr></source>
@@ -12147,347 +12169,347 @@ Versi %1</translation>
<message>
<source>Disabled</source>
<comment>DragAndDropType</comment>
- <translation type="unfinished"></translation>
+ <translation>Dinonaktifkan</translation>
</message>
<message>
<source>Host To Guest</source>
<comment>DragAndDropType</comment>
- <translation type="unfinished">Host ke Guest</translation>
+ <translation>Host ke Guest</translation>
</message>
<message>
<source>Guest To Host</source>
<comment>DragAndDropType</comment>
- <translation type="unfinished">Guest ke Host</translation>
+ <translation>Guest ke Host</translation>
</message>
<message>
<source>Bidirectional</source>
<comment>DragAndDropType</comment>
- <translation type="unfinished">Dua Arah</translation>
+ <translation>Dua Arah</translation>
</message>
<message>
<source>Normal</source>
<comment>MediumType</comment>
- <translation type="unfinished">Normal</translation>
+ <translation>Normal</translation>
</message>
<message>
<source>Immutable</source>
<comment>MediumType</comment>
- <translation type="unfinished">Immutable</translation>
+ <translation>Tetap</translation>
</message>
<message>
<source>Writethrough</source>
<comment>MediumType</comment>
- <translation type="unfinished">Writethrough</translation>
+ <translation>Writethrough</translation>
</message>
<message>
<source>Shareable</source>
<comment>MediumType</comment>
- <translation type="unfinished">Dapat Di-share</translation>
+ <translation>Dapat Dipakai Bersama</translation>
</message>
<message>
<source>Readonly</source>
<comment>MediumType</comment>
- <translation type="unfinished">Baca-saja</translation>
+ <translation>Baca-saja</translation>
</message>
<message>
<source>Multi-attach</source>
<comment>MediumType</comment>
- <translation type="unfinished">Multi-cantol</translation>
+ <translation>Multi-cantol</translation>
</message>
<message>
<source>Dynamically allocated storage</source>
<comment>MediumVariant</comment>
- <translation type="unfinished">Penyimpanan yang dialokasikan secara dinamis</translation>
+ <translation>Penyimpanan yang dialokasikan secara dinamis</translation>
</message>
<message>
<source>Dynamically allocated differencing storage</source>
<comment>MediumVariant</comment>
- <translation type="unfinished"></translation>
+ <translation>Penyimpanan pembeda yang dialokasikan secara dinamis</translation>
</message>
<message>
<source>Fixed size storage</source>
<comment>MediumVariant</comment>
- <translation type="unfinished">Penyimpanan ukuran tetap</translation>
+ <translation>Penyimpanan ukuran tetap</translation>
</message>
<message>
<source>Dynamically allocated storage split into files of less than 2GB</source>
<comment>MediumVariant</comment>
- <translation type="unfinished">Penyimpanan yang dialokasikan secara dinamis memecah ke file berukuran kurang dari 2GB</translation>
+ <translation>Penyimpanan yang dialokasikan secara dinamis memecah ke file berukuran kurang dari 2GB</translation>
</message>
<message>
<source>Dynamically allocated differencing storage split into files of less than 2GB</source>
<comment>MediumVariant</comment>
- <translation type="unfinished"></translation>
+ <translation>Penyimpanan pembeda yang dialokasikan secara dinamis memecah ke file berukuran kurang dari 2GB</translation>
</message>
<message>
<source>Fixed size storage split into files of less than 2GB</source>
<comment>MediumVariant</comment>
- <translation type="unfinished">Penyimpanan ukuran tetap memecah file berukuran kurang dari 2GB</translation>
+ <translation>Penyimpanan ukuran tetap memecah ke file berukuran kurang dari 2GB</translation>
</message>
<message>
<source>Dynamically allocated compressed storage</source>
<comment>MediumVariant</comment>
- <translation type="unfinished"></translation>
+ <translation>Penyimpanan terkompresi yang dialokasikan secara dinamis</translation>
</message>
<message>
<source>Dynamically allocated differencing compressed storage</source>
<comment>MediumVariant</comment>
- <translation type="unfinished"></translation>
+ <translation>Penyimpanan pembeda terkompresi yang dialokasikan secara dinamis</translation>
</message>
<message>
<source>Fixed size ESX storage</source>
<comment>MediumVariant</comment>
- <translation type="unfinished"></translation>
+ <translation>Penyimpanan ESX ukuran tetap</translation>
</message>
<message>
<source>Fixed size storage on raw disk</source>
<comment>MediumVariant</comment>
- <translation type="unfinished"></translation>
+ <translation>Penyimpanan ukuran tetap pada disk mentah</translation>
</message>
<message>
<source>Deny</source>
<comment>NetworkAdapterPromiscModePolicy</comment>
- <translation type="unfinished">Tolak</translation>
+ <translation>Tolak</translation>
</message>
<message>
<source>Allow VMs</source>
<comment>NetworkAdapterPromiscModePolicy</comment>
- <translation type="unfinished">Ijinkan VM</translation>
+ <translation>Ijinkan VM</translation>
</message>
<message>
<source>Allow All</source>
<comment>NetworkAdapterPromiscModePolicy</comment>
- <translation type="unfinished">Ijinkan Semua</translation>
+ <translation>Ijinkan Semua</translation>
</message>
<message>
<source>Ignore</source>
<comment>USBDeviceFilterAction</comment>
- <translation type="unfinished">Abaikan</translation>
+ <translation>Abaikan</translation>
</message>
<message>
<source>Hold</source>
<comment>USBDeviceFilterAction</comment>
- <translation type="unfinished">Tahan</translation>
+ <translation>Tahan</translation>
</message>
<message>
<source>UDP</source>
<comment>NATProtocol</comment>
- <translation type="unfinished">UDP</translation>
+ <translation>UDP</translation>
</message>
<message>
<source>TCP</source>
<comment>NATProtocol</comment>
- <translation type="unfinished">TCP</translation>
+ <translation>TCP</translation>
</message>
<message>
<source>IDE Primary Master</source>
<comment>StorageSlot</comment>
- <translation type="unfinished">IDE Master Primer</translation>
+ <translation>IDE Master Primer</translation>
</message>
<message>
<source>IDE Primary Slave</source>
<comment>StorageSlot</comment>
- <translation type="unfinished">IDE Slave Primer</translation>
+ <translation>IDE Slave Primer</translation>
</message>
<message>
<source>IDE Secondary Master</source>
<comment>StorageSlot</comment>
- <translation type="unfinished">IDE Master Sekunder</translation>
+ <translation>IDE Master Sekunder</translation>
</message>
<message>
<source>IDE Secondary Slave</source>
<comment>StorageSlot</comment>
- <translation type="unfinished">IDE Slave Sekunder</translation>
+ <translation>IDE Slave Sekunder</translation>
</message>
<message>
<source>SATA Port %1</source>
<comment>StorageSlot</comment>
- <translation type="unfinished">SATA Port %1</translation>
+ <translation>SATA Port %1</translation>
</message>
<message>
<source>SCSI Port %1</source>
<comment>StorageSlot</comment>
- <translation type="unfinished">SCSI Port %1</translation>
+ <translation>SCSI Port %1</translation>
</message>
<message>
<source>SAS Port %1</source>
<comment>StorageSlot</comment>
- <translation type="unfinished">SAS Port %1</translation>
+ <translation>SAS Port %1</translation>
</message>
<message>
<source>Floppy Device %1</source>
<comment>StorageSlot</comment>
- <translation type="unfinished">Device Floppy %1</translation>
+ <translation>Device Floppy %1</translation>
</message>
<message>
<source>General</source>
<comment>DetailsElementType</comment>
- <translation type="unfinished"></translation>
+ <translation>Umum</translation>
</message>
<message>
<source>Preview</source>
<comment>DetailsElementType</comment>
- <translation type="unfinished">Pratinjau</translation>
+ <translation>Pratinjau</translation>
</message>
<message>
<source>System</source>
<comment>DetailsElementType</comment>
- <translation type="unfinished">Sistem</translation>
+ <translation>Sistem</translation>
</message>
<message>
<source>Display</source>
<comment>DetailsElementType</comment>
- <translation type="unfinished"></translation>
+ <translation>Tampilan</translation>
</message>
<message>
<source>Storage</source>
<comment>DetailsElementType</comment>
- <translation type="unfinished">Penyimpanan</translation>
+ <translation>Penyimpanan</translation>
</message>
<message>
<source>Audio</source>
<comment>DetailsElementType</comment>
- <translation type="unfinished">Suara</translation>
+ <translation>Suara</translation>
</message>
<message>
<source>Network</source>
<comment>DetailsElementType</comment>
- <translation type="unfinished">Jaringan</translation>
+ <translation>Jaringan</translation>
</message>
<message>
<source>Serial ports</source>
<comment>DetailsElementType</comment>
- <translation type="unfinished"></translation>
+ <translation>Port serial</translation>
</message>
<message>
<source>Parallel ports</source>
<comment>DetailsElementType</comment>
- <translation type="unfinished"></translation>
+ <translation>Port paralel</translation>
</message>
<message>
<source>USB</source>
<comment>DetailsElementType</comment>
- <translation type="unfinished">USB</translation>
+ <translation>USB</translation>
</message>
<message>
<source>Shared folders</source>
<comment>DetailsElementType</comment>
- <translation type="unfinished"></translation>
+ <translation>Folder bersama</translation>
</message>
<message>
<source>Description</source>
<comment>DetailsElementType</comment>
- <translation type="unfinished">Deskripsi</translation>
+ <translation>Deskripsi</translation>
</message>
<message>
<source>Please choose a virtual hard drive file</source>
- <translation type="unfinished"></translation>
+ <translation>Harap pilih berkas hard disk virtual</translation>
</message>
<message>
<source>All virtual hard drive files (%1)</source>
- <translation type="unfinished"></translation>
+ <translation>Semua berkas hard disk virtual (%1)</translation>
</message>
<message>
<source>Please choose a virtual optical disk file</source>
- <translation type="unfinished"></translation>
+ <translation>Harap pilih berkas disk optik virtual</translation>
</message>
<message>
<source>All virtual optical disk files (%1)</source>
- <translation type="unfinished"></translation>
+ <translation>Semua berkas disk optik virtual (%1)</translation>
</message>
<message>
<source>Please choose a virtual floppy disk file</source>
- <translation type="unfinished"></translation>
+ <translation>Pilih sebuah berkas disk floppy virtual</translation>
</message>
<message>
<source>All virtual floppy disk files (%1)</source>
- <translation type="unfinished"></translation>
+ <translation>Semua berkas disk floppy virtual (%1)</translation>
</message>
<message>
<source>VDI (VirtualBox Disk Image)</source>
- <translation type="unfinished"></translation>
+ <translation>VDI (VirtualBox Disk Image)</translation>
</message>
<message>
<source>VMDK (Virtual Machine Disk)</source>
- <translation type="unfinished"></translation>
+ <translation>VMDK (Virtual Machine Disk)</translation>
</message>
<message>
<source>VHD (Virtual Hard Disk)</source>
- <translation type="unfinished"></translation>
+ <translation>VHD (Virtual Hard Disk)</translation>
</message>
<message>
<source>HDD (Parallels Hard Disk)</source>
- <translation type="unfinished"></translation>
+ <translation>HDD (Parallels Hard Disk)</translation>
</message>
<message>
<source>QED (QEMU enhanced disk)</source>
- <translation type="unfinished"></translation>
+ <translation>QED (QEMU enhanced disk)</translation>
</message>
<message>
<source>QCOW (QEMU Copy-On-Write)</source>
- <translation type="unfinished"></translation>
+ <translation>QCOW (QEMU Copy-On-Write)</translation>
</message>
<message>
<source>Please choose a location for new virtual hard drive file</source>
- <translation type="unfinished"></translation>
+ <translation>Harap pilih lokasi untuk berkas hard disk virtual baru</translation>
</message>
<message>
<source>Enabled</source>
<comment>details report (Unrestricted Execution)</comment>
- <translation type="unfinished"></translation>
+ <translation>Difungsikan</translation>
</message>
<message>
<source>Disabled</source>
<comment>details report (Unrestricted Execution)</comment>
- <translation type="unfinished"></translation>
+ <translation>Dinonaktifkan</translation>
</message>
<message>
<source>Unrestricted Execution</source>
<comment>details report</comment>
- <translation type="unfinished"></translation>
+ <translation>Eksekusi Tanpa Batas</translation>
</message>
<message>
<source>PS/2 Mouse</source>
<comment>PointingHIDType</comment>
- <translation type="unfinished"></translation>
+ <translation>Tetikus PS/2</translation>
</message>
<message>
<source>USB Mouse</source>
<comment>PointingHIDType</comment>
- <translation type="unfinished"></translation>
+ <translation>Tetikus USB</translation>
</message>
<message>
<source>PS/2 and USB Mouse</source>
<comment>PointingHIDType</comment>
- <translation type="unfinished"></translation>
+ <translation>Tetikus PS/2 dan USB</translation>
</message>
<message>
<source>Unrestricted Execution</source>
- <translation type="unfinished"></translation>
+ <translation>Eksekusi Tanpa Batas</translation>
</message>
<message>
<source>USB Tablet</source>
<comment>PointingHIDType</comment>
- <translation type="unfinished"></translation>
+ <translation>Tablet USB</translation>
</message>
<message>
<source>USB Multi-Touch Tablet</source>
<comment>PointingHIDType</comment>
- <translation type="unfinished"></translation>
+ <translation>Tablet Multi-Sentuh USB</translation>
</message>
<message>
<source>NAT Network</source>
<comment>NetworkAttachmentType</comment>
- <translation type="unfinished"></translation>
+ <translation>Jaringan NAT</translation>
</message>
<message>
<source>NAT network, '%1'</source>
<comment>details report (network)</comment>
- <translation type="unfinished"></translation>
+ <translation>Jaringan NAT, '%1'</translation>
</message>
<message>
<source>You can create or add disk image files in the virtual machine settings.</source>
- <translation type="unfinished"></translation>
+ <translation>Anda dapat membuat atau menambah berkas image disk dalam pengaturan mesin virtual.</translation>
</message>
<message>
<source>USB</source>
@@ -12503,15 +12525,15 @@ Versi %1</translation>
</message>
<message>
<source>The value '%1' of the key '%2' doesn't match the regexp constraint '%3'.</source>
- <translation>Nilai '%1' dari key '%2' tidak match dengan konstrain regexp '%3'.</translation>
+ <translation>Nilai '%1' dari kunci '%2' tidak cocok dengan batasan regexp '%3'.</translation>
</message>
<message>
<source>Cannot delete the key '%1'.</source>
- <translation>Tidak dapat menghapus key '%1'.</translation>
+ <translation>Tidak dapat menghapus kunci '%1'.</translation>
</message>
<message>
<source>'%1' is an invalid host-combination code-sequence.</source>
- <translation>'%1' adalah urutan kode kombinasi host yang tak valid.</translation>
+ <translation>'%1' adalah urutan kode kombinasi host yang tidak valid.</translation>
</message>
</context>
<context>
@@ -13171,7 +13193,7 @@ ke nilai awal bahasa sistem.</qt>
</message>
<message>
<source>Re&fresh</source>
- <translation>Re&fresh</translation>
+ <translation>Sega&rkan</translation>
</message>
<message>
<source>Create a new virtual hard disk</source>
@@ -13183,15 +13205,15 @@ ke nilai awal bahasa sistem.</qt>
</message>
<message>
<source>Remove the selected disk image file</source>
- <translation>Hapus medium yang dipilih</translation>
+ <translation>Hapus berkas image disk yang dipilih</translation>
</message>
<message>
<source>Release the selected disk image file by detaching it from the machines</source>
- <translation>Lepas medium yang dipilih dengan mencopotnya dari mesin</translation>
+ <translation>Lepas berkas image disk yang dipilih dengan mencopotnya dari mesin-mesin</translation>
</message>
<message>
<source>Refresh the list of disk image files</source>
- <translation>Refresh daftar media</translation>
+ <translation>Segarkan daftar berkas image disk</translation>
</message>
<message>
<source>Location</source>
@@ -13335,11 +13357,11 @@ ke nilai awal bahasa sistem.</qt>
</message>
<message>
<source>Copy an existing disk image file</source>
- <translation>Salin media yang ada</translation>
+ <translation>Salin berkas image disk yang ada</translation>
</message>
<message>
<source>Modify the attributes of the selected disk image file</source>
- <translation>Ubah atribut medium yang dipilih</translation>
+ <translation>Ubah atribut berkas image disk yang dipilih</translation>
</message>
<message>
<source>C&lose</source>
@@ -14061,11 +14083,11 @@ untuk mengaksesnya dari sebuah SIstem Operasi Linux. Fitur ini membutuhkan Guest
</message>
<message>
<source>Details of %1 (%2)</source>
- <translation>Detail dari %1 (%2)</translation>
+ <translation>Rincian dari %1 (%2)</translation>
</message>
<message>
<source>Click to enlarge the screenshot.</source>
- <translation>Klik untuk memperbesar screenshot.</translation>
+ <translation>Klik untuk memperbesar cuplikan layar.</translation>
</message>
<message>
<source>&Name:</source>
@@ -14145,12 +14167,12 @@ untuk mengaksesnya dari sebuah SIstem Operasi Linux. Fitur ini membutuhkan Guest
<message>
<source>Current State (changed)</source>
<comment>Current State (Modified)</comment>
- <translation>Keadaan Saat ini (berubah)</translation>
+ <translation>Keadaan Saat Ini (berubah)</translation>
</message>
<message>
<source>Current State</source>
<comment>Current State (Unmodified)</comment>
- <translation>Keadaan Saat ini</translation>
+ <translation>Keadaan Saat Ini</translation>
</message>
<message>
<source>The current state differs from the state stored in the current snapshot</source>
@@ -14168,12 +14190,12 @@ untuk mengaksesnya dari sebuah SIstem Operasi Linux. Fitur ini membutuhkan Guest
<message>
<source>online)</source>
<comment>Snapshot details</comment>
- <translation>online)</translation>
+ <translation>daring)</translation>
</message>
<message>
<source>offline)</source>
<comment>Snapshot details</comment>
- <translation>offline)</translation>
+ <translation>luring)</translation>
</message>
<message>
<source>Taken at %1</source>
@@ -14244,7 +14266,7 @@ untuk mengaksesnya dari sebuah SIstem Operasi Linux. Fitur ini membutuhkan Guest
</message>
<message>
<source>&Restore Snapshot</source>
- <translation>&Kembalikan Snapshot</translation>
+ <translation>&Pulihkan Snapshot</translation>
</message>
<message>
<source>&Delete Snapshot</source>
@@ -14252,11 +14274,11 @@ untuk mengaksesnya dari sebuah SIstem Operasi Linux. Fitur ini membutuhkan Guest
</message>
<message>
<source>Restore the selected snapshot of the virtual machine</source>
- <translation>Kembalikan snapshot dari mesin virtual yang dipilih</translation>
+ <translation>Pulihkan snapshot yang dipilih dari mesin virtual</translation>
</message>
<message>
<source>Delete the selected snapshot of the virtual machine</source>
- <translation>Hapus snapshot dari mesin virtual yang dipilih</translation>
+ <translation>Hapus snapshot yang dipilih dari mesin virtual</translation>
</message>
<message>
<source> (%1 ago)</source>
@@ -14479,12 +14501,12 @@ dengan nilai apapun.</qt></translation>
<message>
<source><no devices available></source>
<comment>USB devices</comment>
- <translation><tidak ada device tersedia></translation>
+ <translation><tidak ada perangkat tersedia></translation>
</message>
<message>
<source>No supported devices connected to the host PC</source>
<comment>USB device tooltip</comment>
- <translation>Tidak ada device yang terdukung terkoneksi pada PC host</translation>
+ <translation>Tidak ada perangkat yang didukung yang terhubung ke PC host</translation>
</message>
</context>
<context>
@@ -14608,7 +14630,7 @@ dengan nilai apapun.</qt></translation>
</message>
<message>
<source>Guest OS Type</source>
- <translation>Tipe Sistem Operasi Guest</translation>
+ <translation>Tipe OS Guest</translation>
</message>
<message>
<source>Hard Disk Statistics</source>
@@ -14620,7 +14642,7 @@ dengan nilai apapun.</qt></translation>
</message>
<message>
<source>No Network Adapters</source>
- <translation>Tidak Ada Adapter Jaringan</translation>
+ <translation>Tidak Ada Adaptor Jaringan</translation>
</message>
<message>
<source>Enabled</source>
@@ -14642,7 +14664,7 @@ dengan nilai apapun.</qt></translation>
</message>
<message>
<source>No Storage Devices</source>
- <translation>Tidak Ada Device Penyimpanan</translation>
+ <translation>Tidak Ada Perangkat Penyimpanan</translation>
</message>
<message>
<source>Network Statistics</source>
@@ -14655,19 +14677,19 @@ dengan nilai apapun.</qt></translation>
</message>
<message>
<source>Clipboard Mode</source>
- <translation type="unfinished"></translation>
+ <translation>Mode Papan Klip</translation>
</message>
<message>
<source>Drag'n'Drop Mode</source>
- <translation type="unfinished"></translation>
+ <translation>Mode Drag'n'Drop</translation>
</message>
<message>
<source>Configuration &Details</source>
- <translation type="unfinished"></translation>
+ <translation>&Rincian Konfigurasi</translation>
</message>
<message>
<source>&Runtime Information</source>
- <translation type="unfinished"></translation>
+ <translation>Informasi &Runtime</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 d273914..cdf61fb 100644
--- a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_it.ts
+++ b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_it.ts
@@ -336,7 +336,7 @@
</message>
<message>
<source>Show Session Information Window</source>
- <translation type="unfinished">Visualizza la finestra Informazioni di sessione</translation>
+ <translation>Mostra la finestra Informazioni di sessione</translation>
</message>
<message>
<source>&Pause</source>
@@ -408,7 +408,7 @@
</message>
<message>
<source>&Insert Guest Additions CD image...</source>
- <translation type="unfinished">&Inserisci l'installatore delle Guest Additions...</translation>
+ <translation>&Inserisci l'immagine del CD delle Guest Additions...</translation>
</message>
<message>
<source>Insert the Guest Additions disk file into the virtual drive</source>
@@ -1122,6 +1122,10 @@
<comment>new</comment>
<translation type="obsolete">Monta l'immagine per l'installazione delle Guest Additions</translation>
</message>
+ <message>
+ <source>&Webcams</source>
+ <translation>&Webcam</translation>
+ </message>
</context>
<context>
<name>UIActonPool</name>
@@ -4934,6 +4938,14 @@ p, li { white-space: pre-wrap; }
<source>Select a filename for the screenshot ...</source>
<translation>Seleziona un nome per la schermata...</translation>
</message>
+ <message>
+ <source>No Webcams Connected</source>
+ <translation>Nessuna webcam connessa</translation>
+ </message>
+ <message>
+ <source>No supported webcams connected to the host PC</source>
+ <translation>Nessuna webcam supportata è connessa al PC host</translation>
+ </message>
</context>
<context>
<name>UIMachineSettingsAudio</name>
@@ -6121,7 +6133,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>Window</source>
- <translation type="unfinished"></translation>
+ <translation>Finestra</translation>
</message>
</context>
<context>
@@ -7474,7 +7486,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source><p>The virtual machine window is optimized to work in <b>%1 bit</b> color mode but the virtual display is currently set to <b>%2 bit</b>.</p><p>Please open the display properties dialog of the guest OS and select a <b>%3 bit</b> color mode, if it is available, for best possible performance of the virtual video subsystem.</p><p><b>Note</b>. Some operating systems, like [...]
- <translation><p>La finestra della macchina virtuale è ottimizzata per lavorare in modalità colore a <b>%1 bit</b>, ma la qualità del colore dello schermo virtuale è impostata attualmente a <b>%2 bit</b>.</p><p>Apri la finestra delle proprietà dello schermo nel sistema guest e scegli una modalità di colore a <b>%3 bit</b>, se disponibile, per ottenere le migliori prestazioni dal sottosistema video vir [...]
+ <translation type="obsolete"><p>La finestra della macchina virtuale è ottimizzata per lavorare in modalità colore a <b>%1 bit</b>, ma la qualità del colore dello schermo virtuale è impostata attualmente a <b>%2 bit</b>.</p><p>Apri la finestra delle proprietà dello schermo nel sistema guest e scegli una modalità di colore a <b>%3 bit</b>, se disponibile, per ottenere le migliori prestazioni dal sottos [...]
</message>
<message>
<source><p>You didn'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 window or the First Run Wizard.</p><p>Do you wish to continue?</p></source>
@@ -8087,7 +8099,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source><p>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 <b>Insert Guest Additions CD image</b> from the <b>Devices</b> menu. If they are installed but the machine is not yet fully starte [...]
- <translation type="unfinished"><p>Le VirtualBox Guest Additions non sembrano essere presenti su questa macchina virtuale, e le cartelle condivise non possono essere utilizzate senza di esse. Per utilizzare le cartelle condivise nella macchina virtuale, installa le Guest Additions se non sono installate, o installale di nuovo se non funzionano correttamente, selezionando <b>Inserisci l'installatore delle Guest Additions</b> dal menu <b>Dispositivi</ [...]
+ <translation><p>Le VirtualBox Guest Additions non sembrano essere presenti su questa macchina virtuale, e le cartelle condivise non possono essere utilizzate senza di esse. Per utilizzare le cartelle condivise nella macchina virtuale, installa le Guest Additions se non sono installate, o installale di nuovo se non funzionano correttamente, selezionando <b>Inserisci l'immagine del CD delle Guest Additions</b> dal menu <b>Dispositivi</b>. Se sono [...]
</message>
<message>
<source><p>The virtual machine window will be now switched to <b>fullscreen</b> mode. You can go back to windowed mode at any time by pressing <b>%1</b>.</p><p>Note that the <i>Host</i> key is currently defined as <b>%2</b>.</p><p>Note that the main menu bar is hidden in fullscreen mode. You can access it by pressing <b>Host+Home</b>.</p></source>
@@ -9053,6 +9065,18 @@ p, li { white-space: pre-wrap; }
<comment>additions-new</comment>
<translation type="obsolete">Monta</translation>
</message>
+ <message>
+ <source>Failed to attach the webcam <b>%1</b> to the virtual machine <b>%2</b>.</source>
+ <translation>Connessione della webcam <b>%1</b> alla macchina virtuale <b>%2</b> non riuscita.</translation>
+ </message>
+ <message>
+ <source>Failed to detach the webcam <b>%1</b> from the virtual machine <b>%2</b>.</source>
+ <translation>Disconnessione della webcam <b>%1</b> dalla macchina virtuale <b>%2</b> non riuscita.</translation>
+ </message>
+ <message>
+ <source><p>The virtual screen is currently set to a <b>%1 bit</b> color mode. For better performance please change this to <b>%2 bit</b>. This can usually be done from the <b>Display</b> section of the guest operating system's Control Panel or System Settings.</p></source>
+ <translation><p>Lo schermo virtuale è attualmente impostato a una modalità di colore di <b>%1 bit</b>. Per ottenere prestazioni migliori, modifica questa impostazione a <b>%2 bit</b>. Ciò normalmente può essere fatto dalla sezione <b>Schermo</b> del panello di controllo del sistema operativo del guest o da Impostazioni di sistema.</p></translation>
+ </message>
</context>
<context>
<name>UIMiniProcessWidgetAdditions</name>
diff --git a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_ja.ts b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_ja.ts
index ee76b9b..15539f4 100644
--- a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_ja.ts
+++ b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_ja.ts
@@ -4,31 +4,31 @@
<context>
<name>@@@</name>
<message>
- <location filename="../src/globals/VBoxGlobal.cpp" line="1889"/>
+ <location filename="../src/globals/VBoxGlobal.cpp" line="1936"/>
<source>English</source>
<comment>Native language name</comment>
<translation>日本語</translation>
</message>
<message>
- <location filename="../src/globals/VBoxGlobal.cpp" line="1900"/>
+ <location filename="../src/globals/VBoxGlobal.cpp" line="1947"/>
<source>--</source>
<comment>Native language country name (empty if this language is for all countries)</comment>
<translation></translation>
</message>
<message>
- <location filename="../src/globals/VBoxGlobal.cpp" line="1913"/>
+ <location filename="../src/globals/VBoxGlobal.cpp" line="1960"/>
<source>English</source>
<comment>Language name, in English</comment>
<translation>Japanese</translation>
</message>
<message>
- <location filename="../src/globals/VBoxGlobal.cpp" line="1924"/>
+ <location filename="../src/globals/VBoxGlobal.cpp" line="1971"/>
<source>--</source>
<comment>Language country name, in English (empty if native country name is empty)</comment>
<translation></translation>
</message>
<message>
- <location filename="../src/globals/VBoxGlobal.cpp" line="1937"/>
+ <location filename="../src/globals/VBoxGlobal.cpp" line="1984"/>
<source>Oracle Corporation</source>
<comment>Comma-separated list of translators</comment>
<translation>Toshimitsu Tanaka,Ikuya Awashiro,Shushi Kurose</translation>
@@ -93,22 +93,22 @@
<context>
<name>QApplication</name>
<message>
- <location filename="../src/main.cpp" line="455"/>
+ <location filename="../src/main.cpp" line="460"/>
<source>Executable <b>%1</b> requires Qt %2.x, found Qt %3.</source>
<translation>実行ファイル <b>%1</b> はQt %2.x が必要です。Qt %3 が見つかりました。</translation>
</message>
<message>
- <location filename="../src/main.cpp" line="459"/>
+ <location filename="../src/main.cpp" line="464"/>
<source>Incompatible Qt Library Error</source>
<translation>互換性のないQtライブラリーエラー</translation>
</message>
<message>
- <location filename="../src/main.cpp" line="651"/>
+ <location filename="../src/main.cpp" line="656"/>
<source>VirtualBox - Error In %1</source>
<translation>VirtualBox - %1 のエラー</translation>
</message>
<message>
- <location filename="../src/main.cpp" line="654"/>
+ <location filename="../src/main.cpp" line="659"/>
<source><html><b>%1 (rc=%2)</b><br/><br/></source>
<translation><html><b>%1 (rc=%2)</b><br/><br/></translation>
</message>
@@ -131,22 +131,22 @@
<translation>カーネルモジュールが正しくロードされたことを確認してください。</translation>
</message>
<message>
- <location filename="../src/main.cpp" line="590"/>
+ <location filename="../src/main.cpp" line="595"/>
<source>VirtualBox - Runtime Error</source>
<translation>VirtualBox - ランタイムエラー</translation>
</message>
<message>
- <location filename="../src/main.cpp" line="596"/>
+ <location filename="../src/main.cpp" line="601"/>
<source><b>Cannot access the kernel driver!</b><br/><br/></source>
<translation><b>カーネルドライバーにアクセスできません!</b><br/><br/></translation>
</message>
<message>
- <location filename="../src/main.cpp" line="619"/>
+ <location filename="../src/main.cpp" line="624"/>
<source>Unknown error %2 during initialization of the Runtime</source>
<translation>ランタイムの初期化中に予期しないエラー(%2)</translation>
</message>
<message>
- <location filename="../src/main.cpp" line="609"/>
+ <location filename="../src/main.cpp" line="614"/>
<source>Kernel driver not accessible</source>
<translation>カーネルドライバーにアクセスできません</translation>
</message>
@@ -244,7 +244,7 @@
</message>
<message>
<location filename="../src/extensions/QIMessageBox.cpp" line="310"/>
- <location filename="../src/globals/UIMessageCenter.cpp" line="1730"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="1731"/>
<location filename="../src/widgets/UIPopupPaneButtonPane.cpp" line="175"/>
<source>OK</source>
<translation>OK</translation>
@@ -483,7 +483,7 @@
<message>
<location filename="../src/runtime/UIActionPoolRuntime.cpp" line="165"/>
<source>Show Session Information Window</source>
- <translation type="unfinished">セッション情報ダイアログを表示</translation>
+ <translation>セッション情報ウィンドウを表示</translation>
</message>
<message>
<location filename="../src/runtime/UIActionPoolRuntime.cpp" line="277"/>
@@ -615,71 +615,76 @@
<translation>USB デバイス(&U)</translation>
</message>
<message>
- <location filename="../src/runtime/UIActionPoolRuntime.cpp" line="748"/>
+ <location filename="../src/runtime/UIActionPoolRuntime.cpp" line="749"/>
+ <source>&Webcams</source>
+ <translation>ウェブカメラ(&W)</translation>
+ </message>
+ <message>
+ <location filename="../src/runtime/UIActionPoolRuntime.cpp" line="769"/>
<source>Shared &Clipboard</source>
<translation>クリップボードの共有(&C)</translation>
</message>
<message>
- <location filename="../src/runtime/UIActionPoolRuntime.cpp" line="768"/>
+ <location filename="../src/runtime/UIActionPoolRuntime.cpp" line="789"/>
<source>Drag'n'Drop</source>
<translation>ドラッグ&ドロップ</translation>
</message>
<message>
- <location filename="../src/runtime/UIActionPoolRuntime.cpp" line="810"/>
+ <location filename="../src/runtime/UIActionPoolRuntime.cpp" line="831"/>
<source>&Network Settings...</source>
<translation>ネットワーク設定(&N)...</translation>
</message>
<message>
- <location filename="../src/runtime/UIActionPoolRuntime.cpp" line="853"/>
+ <location filename="../src/runtime/UIActionPoolRuntime.cpp" line="874"/>
<source>&Shared Folders Settings...</source>
<translation>共有フォルダー設定(&S)...</translation>
</message>
<message>
- <location filename="../src/runtime/UIActionPoolRuntime.cpp" line="881"/>
+ <location filename="../src/runtime/UIActionPoolRuntime.cpp" line="902"/>
<source>R&emote Display</source>
<translation>リモートディスプレイ(&E)</translation>
</message>
<message>
- <location filename="../src/runtime/UIActionPoolRuntime.cpp" line="882"/>
+ <location filename="../src/runtime/UIActionPoolRuntime.cpp" line="903"/>
<source>Toggle remote desktop (RDP) connections to this machine</source>
<translation>この仮想マシンへのリモートデスクトップ(RDP)接続を切り替え</translation>
</message>
<message>
- <location filename="../src/runtime/UIActionPoolRuntime.cpp" line="926"/>
+ <location filename="../src/runtime/UIActionPoolRuntime.cpp" line="947"/>
<source>&Video Capture</source>
<translation>ビデオキャプチャー(&V)</translation>
</message>
<message>
- <location filename="../src/runtime/UIActionPoolRuntime.cpp" line="927"/>
+ <location filename="../src/runtime/UIActionPoolRuntime.cpp" line="948"/>
<source>Toggle video capture</source>
<translation>ビデオキャプチャーの切り替え</translation>
</message>
<message>
- <location filename="../src/runtime/UIActionPoolRuntime.cpp" line="952"/>
+ <location filename="../src/runtime/UIActionPoolRuntime.cpp" line="973"/>
<source>&Video Capture Settings...</source>
<translation>ビデオキャプチャーの設定(&V)...</translation>
</message>
<message>
- <location filename="../src/runtime/UIActionPoolRuntime.cpp" line="953"/>
+ <location filename="../src/runtime/UIActionPoolRuntime.cpp" line="974"/>
<source>Configure video capture settings</source>
<translation>ビデオキャプチャーの設定を変更</translation>
</message>
<message>
- <location filename="../src/runtime/UIActionPoolRuntime.cpp" line="983"/>
+ <location filename="../src/runtime/UIActionPoolRuntime.cpp" line="1004"/>
<source>&Insert Guest Additions CD image...</source>
- <translation type="unfinished"></translation>
+ <translation>Guest Additions のCDイメージを挿入(&I)...</translation>
</message>
<message>
- <location filename="../src/runtime/UIActionPoolRuntime.cpp" line="984"/>
+ <location filename="../src/runtime/UIActionPoolRuntime.cpp" line="1005"/>
<source>Insert the Guest Additions disk file into the virtual drive</source>
- <translation type="unfinished"></translation>
+ <translation>Guest Additions ディスクファイルを仮想ドライブに挿入します</translation>
</message>
<message>
<source>&Network Adapters...</source>
<translation type="obsolete">ネットワークアダプター(&N)...</translation>
</message>
<message>
- <location filename="../src/runtime/UIActionPoolRuntime.cpp" line="811"/>
+ <location filename="../src/runtime/UIActionPoolRuntime.cpp" line="832"/>
<source>Change the settings of network adapters</source>
<translation>ネットワークアダプターの設定変更</translation>
</message>
@@ -688,7 +693,7 @@
<translation type="obsolete">共有フォルダー(&S)...</translation>
</message>
<message>
- <location filename="../src/runtime/UIActionPoolRuntime.cpp" line="854"/>
+ <location filename="../src/runtime/UIActionPoolRuntime.cpp" line="875"/>
<source>Create or modify shared folders</source>
<translation>共有フォルダーを作成または変更</translation>
</message>
@@ -739,24 +744,24 @@
<translation type="obsolete">Guest Additions インストールイメージをマウントする</translation>
</message>
<message>
- <location filename="../src/runtime/UIActionPoolRuntime.cpp" line="1005"/>
+ <location filename="../src/runtime/UIActionPoolRuntime.cpp" line="1026"/>
<source>De&bug</source>
<translation>デバッグ(&B)</translation>
</message>
<message>
- <location filename="../src/runtime/UIActionPoolRuntime.cpp" line="1030"/>
+ <location filename="../src/runtime/UIActionPoolRuntime.cpp" line="1051"/>
<source>&Statistics...</source>
<comment>debug action</comment>
<translation>統計(&S)...</translation>
</message>
<message>
- <location filename="../src/runtime/UIActionPoolRuntime.cpp" line="1055"/>
+ <location filename="../src/runtime/UIActionPoolRuntime.cpp" line="1076"/>
<source>&Command Line...</source>
<comment>debug action</comment>
<translation>コマンドライン(&C)...</translation>
</message>
<message>
- <location filename="../src/runtime/UIActionPoolRuntime.cpp" line="1080"/>
+ <location filename="../src/runtime/UIActionPoolRuntime.cpp" line="1101"/>
<source>&Logging...</source>
<comment>debug action</comment>
<translation>ログ取得(&L)...</translation>
@@ -837,17 +842,17 @@
<translation>製品情報ウィンドウを表示</translation>
</message>
<message>
- <location filename="../src/runtime/UIActionPoolRuntime.cpp" line="1119"/>
+ <location filename="../src/runtime/UIActionPoolRuntime.cpp" line="1140"/>
<source>Dock Icon</source>
<translation>ドックアイコン</translation>
</message>
<message>
- <location filename="../src/runtime/UIActionPoolRuntime.cpp" line="1144"/>
+ <location filename="../src/runtime/UIActionPoolRuntime.cpp" line="1165"/>
<source>Show Monitor Preview</source>
<translation>ディスプレイのプレビューを表示</translation>
</message>
<message>
- <location filename="../src/runtime/UIActionPoolRuntime.cpp" line="1169"/>
+ <location filename="../src/runtime/UIActionPoolRuntime.cpp" line="1190"/>
<source>Show Application Icon</source>
<translation>アプリケーションアイコンを表示</translation>
</message>
@@ -4956,16 +4961,26 @@ p, li { white-space: pre-wrap; }
<translation type="obsolete">試験的ビルド %1r%2 - %3</translation>
</message>
<message>
- <location filename="../src/runtime/UIMachineLogic.cpp" line="643"/>
+ <location filename="../src/runtime/UIMachineLogic.cpp" line="657"/>
<source>Preview Monitor %1</source>
<translation>プレビュー ディスプレイ %1</translation>
</message>
<message>
- <location filename="../src/runtime/UIMachineLogic.cpp" line="1198"/>
+ <location filename="../src/runtime/UIMachineLogic.cpp" line="1215"/>
<source>Snapshot %1</source>
<translation>スナップショット %1</translation>
</message>
<message>
+ <location filename="../src/runtime/UIMachineLogic.cpp" line="1884"/>
+ <source>No Webcams Connected</source>
+ <translation>ウェブカメラが接続されていません</translation>
+ </message>
+ <message>
+ <location filename="../src/runtime/UIMachineLogic.cpp" line="1885"/>
+ <source>No supported webcams connected to the host PC</source>
+ <translation>ホストPCに接続されているウェブカメラはサポートされていません</translation>
+ </message>
+ <message>
<source>More CD/DVD Images...</source>
<translation type="obsolete">CD/DVD イメージの追加...</translation>
</message>
@@ -4982,7 +4997,7 @@ p, li { white-space: pre-wrap; }
<translation type="obsolete">フロッピーデバイスのマウント解除</translation>
</message>
<message>
- <location filename="../src/runtime/UIMachineLogic.cpp" line="1293"/>
+ <location filename="../src/runtime/UIMachineLogic.cpp" line="1310"/>
<source>Select a filename for the screenshot ...</source>
<translation>スクリーンショットの名前を選択...</translation>
</message>
@@ -5003,12 +5018,12 @@ p, li { white-space: pre-wrap; }
<translation type="obsolete">フロッピーデバイス 未割り当て</translation>
</message>
<message>
- <location filename="../src/runtime/UIMachineLogic.cpp" line="1801"/>
+ <location filename="../src/runtime/UIMachineLogic.cpp" line="1818"/>
<source>No USB Devices Connected</source>
<translation>USB デバイス 未接続</translation>
</message>
<message>
- <location filename="../src/runtime/UIMachineLogic.cpp" line="1802"/>
+ <location filename="../src/runtime/UIMachineLogic.cpp" line="1819"/>
<source>No supported devices connected to the host PC</source>
<translation>ホストマシンに接続されたデバイスはサポートされていません</translation>
</message>
@@ -6333,7 +6348,7 @@ p, li { white-space: pre-wrap; }
<message>
<location filename="../src/settings/machine/UIMachineSettingsSFDetails.ui" line="26"/>
<source>Window</source>
- <translation type="unfinished"></translation>
+ <translation>ウィンドウ</translation>
</message>
<message>
<location filename="../src/settings/machine/UIMachineSettingsSFDetails.ui" line="32"/>
@@ -6838,21 +6853,21 @@ p, li { white-space: pre-wrap; }
<translation>仮想ハードディスクファイルの選択...</translation>
</message>
<message>
- <location filename="../src/runtime/UIMachineLogic.cpp" line="1610"/>
+ <location filename="../src/runtime/UIMachineLogic.cpp" line="1627"/>
<location filename="../src/settings/machine/UIMachineSettingsStorage.cpp" line="2665"/>
<source>Choose a virtual CD/DVD disk file...</source>
<translation>仮想CD/DVDディスクファイルの選択...</translation>
</message>
<message>
- <location filename="../src/runtime/UIMachineLogic.cpp" line="1611"/>
- <location filename="../src/runtime/UIMachineLogic.cpp" line="1617"/>
+ <location filename="../src/runtime/UIMachineLogic.cpp" line="1628"/>
+ <location filename="../src/runtime/UIMachineLogic.cpp" line="1634"/>
<location filename="../src/settings/machine/UIMachineSettingsStorage.cpp" line="2672"/>
<location filename="../src/settings/machine/UIMachineSettingsStorage.cpp" line="2689"/>
<source>Remove disk from virtual drive</source>
<translation>仮想ドライブからディスクを除去</translation>
</message>
<message>
- <location filename="../src/runtime/UIMachineLogic.cpp" line="1616"/>
+ <location filename="../src/runtime/UIMachineLogic.cpp" line="1633"/>
<location filename="../src/settings/machine/UIMachineSettingsStorage.cpp" line="2682"/>
<source>Choose a virtual floppy disk file...</source>
<translation>仮想フロッピーディスクファイルの選択...</translation>
@@ -7037,7 +7052,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<location filename="../src/VBoxVMInformationDlg.cpp" line="551"/>
- <location filename="../src/globals/VBoxGlobal.cpp" line="1289"/>
+ <location filename="../src/globals/VBoxGlobal.cpp" line="1336"/>
<location filename="../src/selector/graphics/details/UIGDetailsElements.cpp" line="490"/>
<location filename="../src/settings/machine/UIMachineSettingsStorage.cpp" line="544"/>
<source>Controller: %1</source>
@@ -7714,133 +7729,143 @@ p, li { white-space: pre-wrap; }
<context>
<name>UIMessageCenter</name>
<message>
- <location filename="../src/globals/UIMessageCenter.cpp" line="257"/>
- <location filename="../src/globals/UIMessageCenter.cpp" line="2707"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="258"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="2724"/>
<source>VirtualBox - Information</source>
<comment>msg box title</comment>
<translation>VirtualBox - 情報</translation>
</message>
<message>
- <location filename="../src/globals/UIMessageCenter.cpp" line="261"/>
- <location filename="../src/globals/UIMessageCenter.cpp" line="2711"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="262"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="2728"/>
<source>VirtualBox - Question</source>
<comment>msg box title</comment>
<translation>VirtualBox - 質問</translation>
</message>
<message>
- <location filename="../src/globals/UIMessageCenter.cpp" line="265"/>
- <location filename="../src/globals/UIMessageCenter.cpp" line="2715"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="266"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="2732"/>
<source>VirtualBox - Warning</source>
<comment>msg box title</comment>
<translation>VirtualBox - 警告</translation>
</message>
<message>
- <location filename="../src/globals/UIMessageCenter.cpp" line="269"/>
- <location filename="../src/globals/UIMessageCenter.cpp" line="2719"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="270"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="2736"/>
<source>VirtualBox - Error</source>
<comment>msg box title</comment>
<translation>VirtualBox - エラー</translation>
</message>
<message>
- <location filename="../src/globals/UIMessageCenter.cpp" line="273"/>
- <location filename="../src/globals/UIMessageCenter.cpp" line="2723"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="274"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="2740"/>
<source>VirtualBox - Critical Error</source>
<comment>msg box title</comment>
<translation>VirtualBox - 重大なエラー</translation>
</message>
<message>
- <location filename="../src/globals/UIMessageCenter.cpp" line="889"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="890"/>
<source><p>Do you want to remove the NAT network <nobr><b>%1</b>?</nobr></p><p>If this network is in use by one or more virtual machine network adapters these adapters will no longer be usable until you correct their settings by either choosing a different network name or a different adapter attachment type.</p></source>
<translation><p>NATネットワーク<nobr><b>%1</b></nobr> を除去しますか?</p> <p>このネットワークをひとつ以上の仮想マシンネットワークアダプターで使用中の場合は、別のネットワーク名や別のアダプタータイプを選択しない限りふたたび使えるようにはなりません。</p></translation>
</message>
<message>
<location filename="../src/globals/UIMessageCenter.cpp" line="1940"/>
+ <source>Failed to attach the webcam <b>%1</b> to the virtual machine <b>%2</b>.</source>
+ <translation>ウェブカメラ<b>"%1"</b>の仮想マシン<b>"%2"</b>への割り当てに失敗しました。</translation>
+ </message>
+ <message>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="1948"/>
+ <source>Failed to detach the webcam <b>%1</b> from the virtual machine <b>%2</b>.</source>
+ <translation>ウェブカメラ<b>"%1"</b>の仮想マシン<b>"%2"</b>への割り当て解除に失敗しました。</translation>
+ </message>
+ <message>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="1957"/>
<source>Failed to enable the remote desktop server for the virtual machine <b>%1</b>.</source>
<translation>仮想マシン <b>%1</b> のリモートデスクトップサーバーを有効化できませんでした。</translation>
</message>
<message>
- <location filename="../src/globals/UIMessageCenter.cpp" line="1941"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="1958"/>
<source>Failed to disable the remote desktop server for the virtual machine <b>%1</b>.</source>
<translation>仮想マシン <b>%1</b> のリモートデスクトップサーバーを無効化できませんでした。</translation>
</message>
<message>
- <location filename="../src/globals/UIMessageCenter.cpp" line="1951"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="1968"/>
<source>Failed to enable video capturing for the virtual machine <b>%1</b>.</source>
<translation>仮想マシン <b>%1</b> のビデオキャプチャーを有効化できませんでした。</translation>
</message>
<message>
- <location filename="../src/globals/UIMessageCenter.cpp" line="1952"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="1969"/>
<source>Failed to disable video capturing for the virtual machine <b>%1</b>.</source>
<translation>仮想マシン <b>%1</b> のビデオキャプチャーを無効化できませんでした。</translation>
</message>
<message>
- <location filename="../src/globals/UIMessageCenter.cpp" line="1959"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="1976"/>
<source><p>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 <b>Insert Guest Additions CD image</b> from the <b>Devices</b> menu. If they are installed but the machine is not yet fully starte [...]
- <translation type="unfinished"></translation>
+ <translation><p>VirtualBox Guest Additionsがインストールされていないため、共有フォルダーは利用できません。共有フォルダーを使用するには<b>[デバイス]</b>メニューから<b>[Guest Additions のCDイメージを挿入]</b>を選びGuest Additionsをインストールまたは再インストールしてください。インストール後、仮想マシンを再起動すると共有フォルダーが利用できます。</p></translation>
</message>
<message>
- <location filename="../src/globals/UIMessageCenter.cpp" line="2000"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="2017"/>
<source><p>Could not find the <b>VirtualBox Guest Additions</b> disk image file.</p><p>Do you wish to download this disk image file from the Internet?</p></source>
<translation><p><b>VirtualBox Guest Additions</b> ディスクイメージファイルが見つかりません。</p><p>インターネットからディスクイメージをダウンロードしますか?</p></translation>
</message>
<message>
- <location filename="../src/globals/UIMessageCenter.cpp" line="2003"/>
- <location filename="../src/globals/UIMessageCenter.cpp" line="2013"/>
- <location filename="../src/globals/UIMessageCenter.cpp" line="2062"/>
- <location filename="../src/globals/UIMessageCenter.cpp" line="2072"/>
- <location filename="../src/globals/UIMessageCenter.cpp" line="2101"/>
- <location filename="../src/globals/UIMessageCenter.cpp" line="2111"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="2020"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="2030"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="2079"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="2089"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="2118"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="2128"/>
<source>Download</source>
<translation>ダウンロード</translation>
</message>
<message>
- <location filename="../src/globals/UIMessageCenter.cpp" line="2009"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="2026"/>
<source><p>Are you sure you want to download the <b>VirtualBox Guest Additions</b> disk image file from <nobr><a href="%1">%1</a></nobr> (size %2 bytes)?</p></source>
<translation><p>本当に<b>VirtualBox Guest Additions</b> ディスクイメージを<nobr><a href="%1">%1</a></nobr> からダウンロードしますか? (サイズ %2バイト)</p></translation>
</message>
<message>
- <location filename="../src/globals/UIMessageCenter.cpp" line="2019"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="2036"/>
<source><p>The <b>VirtualBox Guest Additions</b> disk image file has been successfully downloaded from <nobr><a href="%1">%1</a></nobr> but can't be saved locally as <nobr><b>%2</b>.</nobr></p><p>Please choose another location for that file.</p></source>
<translation><p><b>VirtualBox Guest Additions</b> ディスクイメージを<nobr><a href="%1">%1</a></nobr>からダウンロードしましたが、<nobr><b>%2</b></nobr>に保存できません。</p><p>他の保存場所を選択してください。</p></translation>
</message>
<message>
- <location filename="../src/globals/UIMessageCenter.cpp" line="2029"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="2046"/>
<source><p>The <b>VirtualBox Guest Additions</b> disk image file has been successfully downloaded from <nobr><a href="%1">%1</a></nobr> and saved locally as <nobr><b>%2</b>.</nobr></p><p>Do you wish to register this disk image file and insert it into the virtual CD/DVD drive?</p></source>
<translation><p><b>VirtualBox Guest Additions</b> ディスクイメージを<nobr><a href="%1">%1</a></nobr>からダウンロードし、<nobr><b>%2</b>に保存しました。</nobr></p><p>ディスクイメージファイルを登録し、仮想CD/DVDドライブに挿入しますか?</p></translation>
</message>
<message>
- <location filename="../src/globals/UIMessageCenter.cpp" line="2035"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="2052"/>
<source>Insert</source>
<comment>additions</comment>
- <translation type="unfinished"></translation>
+ <translation>挿入</translation>
</message>
<message>
- <location filename="../src/globals/UIMessageCenter.cpp" line="2041"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="2058"/>
<source><p>Could not insert the <b>VirtualBox Guest Additions</b> disk image file into the virtual machine <b>%1</b>, as the machine has no CD/DVD drives. Please add a drive using the storage page of the virtual machine settings window.</p></source>
<translation><p>仮想マシン<b>"%1"</b>にCD/DVDドライブがないので、<b>VirtualBox Guest Additions</b>のディスクイメージを仮想マシンに挿入できません。 仮想マシン設定ウィンドウのストレージページでドライブを追加してください。</p></translation>
</message>
<message>
- <location filename="../src/globals/UIMessageCenter.cpp" line="2058"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="2075"/>
<source><p>Could not find the <b>VirtualBox User Manual</b> <nobr><b>%1</b>.</nobr></p><p>Do you wish to download this file from the Internet?</p></source>
<translation><p><b>VirtualBox ユーザーマニュアル</b> <nobr><b>%1</b></nobr>が見つかりません。</p><p>ダウンロードしますか?</p></translation>
</message>
<message>
- <location filename="../src/globals/UIMessageCenter.cpp" line="2068"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="2085"/>
<source><p>Are you sure you want to download the <b>VirtualBox User Manual</b> from <nobr><a href="%1">%1</a></nobr> (size %2 bytes)?</p></source>
<translation><p><b>VirtualBox ユーザーマニュアル</b>を<nobr><a href="%1">%1</a></nobr> からダウンロードしますか? (サイズ %2バイト)</p></translation>
</message>
<message>
- <location filename="../src/globals/UIMessageCenter.cpp" line="2078"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="2095"/>
<source><p>The VirtualBox User Manual has been successfully downloaded from <nobr><a href="%1">%1</a></nobr> but can't be saved locally as <nobr><b>%2</b>.</nobr></p><p>Please choose another location for that file.</p></source>
<translation><p>VirtualBox ユーザーマニュアルを<nobr><a href="%1">%1</a></nobr>からダウンロードしましたが、<nobr><b>%2</b></nobr>に保存できません。</p><p>他の保存場所を選択してください。</p></translation>
</message>
<message>
- <location filename="../src/globals/UIMessageCenter.cpp" line="2088"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="2105"/>
<source><p>The VirtualBox User Manual has been successfully downloaded from <nobr><a href="%1">%1</a></nobr> and saved locally as <nobr><b>%2</b>.</nobr></p></source>
<translation><p>VirtualBox ユーザーマニュアルを<nobr><a href="%1">%1</a></nobr>からダウンロードし、<nobr><b>%2</b></nobr>に保存しました。</p></translation>
</message>
<message>
- <location filename="../src/globals/UIMessageCenter.cpp" line="2742"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="2759"/>
<source>Do not show this message again</source>
<comment>msg box flag</comment>
<translation>次回からこのメッセージを表示しない</translation>
@@ -7850,37 +7875,37 @@ p, li { white-space: pre-wrap; }
<translation type="obsolete">クラッシュを防ぐため、Windows/x64では仮想マシンに含まれるすべてのファイルの削除は現在できません。これは次回のリリースで修正されます。</translation>
</message>
<message>
- <location filename="../src/globals/UIMessageCenter.cpp" line="502"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="503"/>
<source>Failed to open <tt>%1</tt>. Make sure your desktop environment can properly handle URLs of this type.</source>
<translation><tt>%1</tt>を開けませんでした。デスクトップ環境が適切にURLを扱えることを確認してください。</translation>
</message>
<message>
- <location filename="../src/globals/UIMessageCenter.cpp" line="400"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="401"/>
<source><p>Failed to initialize COM or to find the VirtualBox COM server. Most likely, the VirtualBox server is not running or failed to start.</p><p>The application will now terminate.</p></source>
<translation><p>COM の初期化に失敗したか、またはVirtualBox COMサーバーが見つかりませんでした。VirtualBoxサーバーが起動していないか、または起動に失敗しています。</p><p>アプリケーションを終了します。</p></translation>
</message>
<message>
- <location filename="../src/globals/UIMessageCenter.cpp" line="389"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="390"/>
<source><p>Failed to initialize COM because the VirtualBox global configuration directory <b><nobr>%1</nobr></b> is not accessible. Please check the permissions of this directory and of its parent directory.</p><p>The application will now terminate.</p></source>
<translation><p>VirtualBox のグローバル設定ディレクトリー <b><nobr>%1</nobr></b> にアクセスできないため、 COM の初期化に失敗しました。このディレクトリーならびに親ディレクトリーのパーミッションを確認してください。</p><p>このアプリケーションは終了します。</p></translation>
</message>
<message>
- <location filename="../src/globals/UIMessageCenter.cpp" line="409"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="410"/>
<source><p>Failed to create the VirtualBox COM object.</p><p>The application will now terminate.</p></source>
<translation><p>VirtualBox COMオブジェクトの作成に失敗しました。</p><p>アプリケーションを終了します。</p></translation>
</message>
<message>
- <location filename="../src/globals/UIMessageCenter.cpp" line="979"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="980"/>
<source>Failed to set global VirtualBox properties.</source>
<translation>グローバルなVirtualBoxのプロパティの設定に失敗しました。</translation>
</message>
<message>
- <location filename="../src/globals/UIMessageCenter.cpp" line="993"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="994"/>
<source>Failed to access the USB subsystem.</source>
<translation>USBサブシステムのアクセスに失敗しました。</translation>
</message>
<message>
- <location filename="../src/globals/UIMessageCenter.cpp" line="1443"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="1444"/>
<source>Failed to create a new virtual machine.</source>
<translation>新規仮想マシンの作成に失敗しました。</translation>
</message>
@@ -7889,17 +7914,17 @@ p, li { white-space: pre-wrap; }
<translation type="obsolete">新規仮想マシン<b>"%1"</b>の作成に失敗しました。</translation>
</message>
<message>
- <location filename="../src/globals/UIMessageCenter.cpp" line="510"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="511"/>
<source>Failed to open virtual machine located in %1.</source>
<translation>仮想マシン<b>"%1"</b>を開けませんでした。</translation>
</message>
<message>
- <location filename="../src/globals/UIMessageCenter.cpp" line="1450"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="1451"/>
<source>Failed to register the virtual machine <b>%1</b>.</source>
<translation>仮想マシン <b>%1</b> の登録に失敗しました。</translation>
</message>
<message>
- <location filename="../src/globals/UIMessageCenter.cpp" line="518"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="519"/>
<source>Failed to add virtual machine <b>%1</b> located in <i>%2</i> because its already present.</source>
<translation>仮想マシン<b>"%1"</b>(<i>"%2"</i>)の追加に失敗しました。すでに存在します。</translation>
</message>
@@ -7908,73 +7933,73 @@ p, li { white-space: pre-wrap; }
<translation type="obsolete">仮想マシン<b>"%1"</b>の設定の適用に失敗しました。</translation>
</message>
<message>
- <location filename="../src/globals/UIMessageCenter.cpp" line="1015"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="1016"/>
<source><p>The machine settings were changed while you were editing them. You currently have unsaved setting changes.</p><p>Would you like to reload the changed settings or to keep your own changes?</p></source>
<translation><p>編集中にマシンの設定が変更されました。現在保存されていない変更が含まれています。</p><p>変更を再読み込みするか、現在の設定を保持しますか?</p></translation>
</message>
<message>
- <location filename="../src/globals/UIMessageCenter.cpp" line="1019"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="1020"/>
<source>Reload settings</source>
<translation>設定を再読み込み</translation>
</message>
<message>
- <location filename="../src/globals/UIMessageCenter.cpp" line="1019"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="1020"/>
<source>Keep changes</source>
<translation>設定を保持</translation>
</message>
<message>
- <location filename="../src/globals/UIMessageCenter.cpp" line="1005"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="1006"/>
<source>The virtual machine that you are changing has been started. Only certain settings can be changed while a machine is running. All other changes will be lost if you close this window now.</source>
<translation>設定を変更した仮想マシンを開始しました。マシンの起動中に変更できる設定は特定のもののみとなります。このウィンドウをすぐに閉じた場合は、他のすべての変更点は失われます。</translation>
</message>
<message>
- <location filename="../src/globals/UIMessageCenter.cpp" line="1785"/>
- <location filename="../src/globals/UIMessageCenter.cpp" line="1793"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="1786"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="1794"/>
<source>Failed to start the virtual machine <b>%1</b>.</source>
<translation>仮想マシン<b>"%1"</b>の起動に失敗しました。</translation>
</message>
<message>
- <location filename="../src/globals/UIMessageCenter.cpp" line="723"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="724"/>
<source>Failed to pause the execution of the virtual machine <b>%1</b>.</source>
<translation>仮想マシン<b>"%1"</b>の一時停止に失敗しました。</translation>
</message>
<message>
- <location filename="../src/globals/UIMessageCenter.cpp" line="731"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="732"/>
<source>Failed to resume the execution of the virtual machine <b>%1</b>.</source>
<translation>仮想マシン<b>"%1"</b>の再開に失敗しました。</translation>
</message>
<message>
- <location filename="../src/globals/UIMessageCenter.cpp" line="747"/>
- <location filename="../src/globals/UIMessageCenter.cpp" line="755"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="748"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="756"/>
<source>Failed to save the state of the virtual machine <b>%1</b>.</source>
<translation>仮想マシン<b>"%1"</b>の状態の保存に失敗しました。</translation>
</message>
<message>
- <location filename="../src/globals/UIMessageCenter.cpp" line="1458"/>
- <location filename="../src/globals/UIMessageCenter.cpp" line="1466"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="1459"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="1467"/>
<source>Failed to clone the virtual machine <b>%1</b>.</source>
<translation>仮想マシン <b>%1</b>.のクローンに失敗しました。</translation>
</message>
<message>
- <location filename="../src/globals/UIMessageCenter.cpp" line="839"/>
- <location filename="../src/globals/UIMessageCenter.cpp" line="847"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="840"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="848"/>
<source>Failed to create a snapshot of the virtual machine <b>%1</b>.</source>
<translation>仮想マシン<b>"%1"</b>のスナップショット作成に失敗しました。</translation>
</message>
<message>
- <location filename="../src/globals/UIMessageCenter.cpp" line="771"/>
- <location filename="../src/globals/UIMessageCenter.cpp" line="779"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="772"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="780"/>
<source>Failed to stop the virtual machine <b>%1</b>.</source>
<translation>仮想マシン<b>"%1"</b>の停止に失敗しました。</translation>
</message>
<message>
- <location filename="../src/globals/UIMessageCenter.cpp" line="649"/>
- <location filename="../src/globals/UIMessageCenter.cpp" line="657"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="650"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="658"/>
<source>Failed to remove the virtual machine <b>%1</b>.</source>
<translation>仮想マシン<b>"%1"</b>の除去に失敗しました。</translation>
</message>
<message>
- <location filename="../src/globals/UIMessageCenter.cpp" line="739"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="740"/>
<source>Failed to discard the saved state of the virtual machine <b>%1</b>.</source>
<translation>仮想マシン<b>"%1"</b>の保存された状態の破棄に失敗しました。</translation>
</message>
@@ -7991,7 +8016,7 @@ p, li { white-space: pre-wrap; }
<translation type="obsolete">仮想マシン<b>"%1"</b>の最新のスナップショットと状態の破棄に失敗しました。</translation>
</message>
<message>
- <location filename="../src/globals/UIMessageCenter.cpp" line="455"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="456"/>
<source>There is no virtual machine named <b>%1</b>.</source>
<translation>仮想マシン<b>"%1"</b>がありません。</translation>
</message>
@@ -8050,13 +8075,13 @@ p, li { white-space: pre-wrap; }
<translation type="obsolete">%1 <nobr><b>%2</b></nobr>の登録解除に失敗しました。</translation>
</message>
<message>
- <location filename="../src/globals/UIMessageCenter.cpp" line="471"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="472"/>
<source>Failed to create a new session.</source>
<translation>新規セッションの作成に失敗しました。</translation>
</message>
<message>
- <location filename="../src/globals/UIMessageCenter.cpp" line="478"/>
- <location filename="../src/globals/UIMessageCenter.cpp" line="486"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="479"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="487"/>
<source>Failed to open a session for the virtual machine <b>%1</b>.</source>
<translation>仮想マシン<b>"%1"</b>のセッションを開けませんでした。</translation>
</message>
@@ -8069,26 +8094,26 @@ p, li { white-space: pre-wrap; }
<translation type="obsolete">ホストネットワークインターフェース<b>"%1"</b>の作成に失敗しました。</translation>
</message>
<message>
- <location filename="../src/globals/UIMessageCenter.cpp" line="963"/>
- <location filename="../src/globals/UIMessageCenter.cpp" line="971"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="964"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="972"/>
<source>Failed to remove the host network interface <b>%1</b>.</source>
<translation>ホストネットワークインターフェース<b>"%1"</b>を除去できませんでした。</translation>
</message>
<message>
- <location filename="../src/globals/UIMessageCenter.cpp" line="1907"/>
- <location filename="../src/globals/UIMessageCenter.cpp" line="1915"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="1908"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="1916"/>
<source>Failed to attach the USB device <b>%1</b> to the virtual machine <b>%2</b>.</source>
<translation>USB デバイス<b>"%1"</b>の仮想マシン<b>"%2"</b>への割り当てに失敗しました。</translation>
</message>
<message>
- <location filename="../src/globals/UIMessageCenter.cpp" line="1923"/>
- <location filename="../src/globals/UIMessageCenter.cpp" line="1931"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="1924"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="1932"/>
<source>Failed to detach the USB device <b>%1</b> from the virtual machine <b>%2</b>.</source>
<translation>USB デバイス<b>"%1"</b>の仮想マシン<b>"%2"</b>からの割り当て解除に失敗しました。</translation>
</message>
<message>
- <location filename="../src/globals/UIMessageCenter.cpp" line="1113"/>
- <location filename="../src/globals/UIMessageCenter.cpp" line="1122"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="1114"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="1123"/>
<source>Failed to create the shared folder <b>%1</b> (pointing to <nobr><b>%2</b></nobr>) for the virtual machine <b>%3</b>.</source>
<translation>仮想マシン<b>"%3"</b>の共有フォルダー<b>"%1"</b>(参照先 <nobr><b>%2</b></nobr>)の作成に失敗しました。</translation>
</message>
@@ -8117,23 +8142,28 @@ p, li { white-space: pre-wrap; }
<translation><p>仮想マシンは現在<b>"一時停止"</b>状態のため、キーボードとマウス操作を受け付けません。仮想マシンでの作業を続けたい場合は、メニューバーから対応する動作を選択して、仮想マシンを再開する必要があります。</p></translation>
</message>
<message>
+ <location filename="../src/globals/UIPopupCenter.cpp" line="481"/>
+ <source><p>The virtual screen is currently set to a <b>%1 bit</b> color mode. For better performance please change this to <b>%2 bit</b>. This can usually be done from the <b>Display</b> section of the guest operating system's Control Panel or System Settings.</p></source>
+ <translation><p>現在仮想スクリーンは<b>%1 ビット</b> カラーモードです。パフォーマンス向上のために <b>%2 ビット</b> に変更してください。通常ゲストOSのコントロールパネルあるいはシステム設定にある<b>ディスプレイ</b> で変更できます。</p></translation>
+ </message>
+ <message>
<source><p>Cannot run VirtualBox in <i>VM Selector</i> mode due to local restrictions.</p><p>The application will now terminate.</p></source>
<translation type="obsolete"><p>ローカルの制限のため、 <i>VM Selector</i>モードでVirtualBoxを実行できません。</p><p>アプリケーションを終了します。</p></translation>
</message>
<message>
- <location filename="../src/globals/UIMessageCenter.cpp" line="2050"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="2067"/>
<source>Failed to update Guest Additions. The Guest Additions disk image file will be inserted for user installation.</source>
<translation>Guest Additionsの更新に失敗しました。Guest Additionsのインストールイメージは手動インストールのためマウントされます。</translation>
</message>
<message>
- <location filename="../src/globals/UIMessageCenter.cpp" line="2239"/>
- <location filename="../src/globals/UIMessageCenter.cpp" line="2247"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="2256"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="2264"/>
<source>Failed to install the Extension Pack <b>%1</b>.</source>
<translation>機能拡張パッケージ<b>"%1"</b>のインストールに失敗しました。</translation>
</message>
<message>
- <location filename="../src/globals/UIMessageCenter.cpp" line="2255"/>
- <location filename="../src/globals/UIMessageCenter.cpp" line="2263"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="2272"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="2280"/>
<source>Failed to uninstall the Extension Pack <b>%1</b>.</source>
<translation>機能拡張パッケージ<b>"%1"</b>のアンインストールに失敗しました。</translation>
</message>
@@ -8142,195 +8172,195 @@ p, li { white-space: pre-wrap; }
<translation type="obsolete">機能拡張パッケージ<b>"%1"</b>を除去します。本当に除去しますか?</translation>
</message>
<message>
- <location filename="../src/globals/UIMessageCenter.cpp" line="2219"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="2236"/>
<source>&Remove</source>
<translation>除去(&R)</translation>
</message>
<message>
- <location filename="../src/globals/UIMessageCenter.cpp" line="1099"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="1100"/>
<source>The current port forwarding rules are not valid. None of the host or guest port values may be set to zero.</source>
<translation>現在のポートフォワーディングルールは無効です。 ホストまたはゲストポートの値にゼロが設定されています。</translation>
</message>
<message>
- <location filename="../src/globals/UIMessageCenter.cpp" line="368"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="369"/>
<source><p>Cannot start the VirtualBox Manager due to local restrictions.</p><p>The application will now terminate.</p></source>
<translation><p>ローカルの制限のため、VirtualBox マネージャーを実行できません。</p><p>アプリケーションを終了します。</p></translation>
</message>
<message>
- <location filename="../src/globals/UIMessageCenter.cpp" line="417"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="418"/>
<source><p>Could not find a language file for the language <b>%1</b> in the directory <b><nobr>%2</nobr></b>.</p><p>The language will be temporarily reset to the system default language. Please go to the <b>Preferences</b> window which you can open from the <b>File</b> menu of the VirtualBox Manager window, and select one of the existing languages on the <b>Language</b> page.</p></source>
<translation><p>言語ファイル<b>"%1"</b>が<b><nobr>%2</nobr></b>ディレクトリで見つかりません。</p><p>言語は一時的にシステムのデフォルト言語に設定されます。VirtualBox マネージャーウィンドウの<b>ファイル</b>メニューから<b>環境設定</b>ウィンドウを開き、<b>言語</b>ページにある言語から選択してください。</p></translation>
</message>
<message>
- <location filename="../src/globals/UIMessageCenter.cpp" line="427"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="428"/>
<source><p>Could not load the language file <b><nobr>%1</nobr></b>. <p>The language will be temporarily reset to English (built-in). Please go to the <b>Preferences</b> window which you can open from the <b>File</b> menu of the VirtualBox Manager window, and select one of the existing languages on the <b>Language</b> page.</p></source>
<translation><p>言語ファイル<b><nobr>"%1"</nobr></b>が読み込めません。</p> <p>言語は一時的にEnglish(内蔵)に設定されます。VirtualBox マネージャーウィンドウの<b>ファイル</b>メニューから<b>環境設定</b>ウィンドウを開き、<b>言語</b>ページで表示されている言語から選択してください。</p></translation>
</message>
<message>
- <location filename="../src/globals/UIMessageCenter.cpp" line="463"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="464"/>
<source>There is no virtual machine with the identifier <b>%1</b>.</source>
<translation>IDが <b>"%1"</b> の仮想マシンはありません。</translation>
</message>
<message>
- <location filename="../src/globals/UIMessageCenter.cpp" line="673"/>
- <location filename="../src/globals/UIMessageCenter.cpp" line="1731"/>
- <location filename="../src/globals/UIMessageCenter.cpp" line="1870"/>
- <location filename="../src/globals/UIMessageCenter.cpp" line="1891"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="674"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="1732"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="1871"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="1892"/>
<source>Ignore</source>
<translation>無視</translation>
</message>
<message>
- <location filename="../src/globals/UIMessageCenter.cpp" line="919"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="920"/>
<source>Failed to create NAT network.</source>
<translation>NATネットワークの作成に失敗しました。</translation>
</message>
<message>
- <location filename="../src/globals/UIMessageCenter.cpp" line="926"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="927"/>
<source>Failed to remove NAT network <b>%1</b>.</source>
<translation>NATネットワーク <b>%1</b> の除去に失敗しました。</translation>
</message>
<message>
- <location filename="../src/globals/UIMessageCenter.cpp" line="934"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="935"/>
<source>Failed to create DHCP server.</source>
<translation>DHCPサーバーの作成しに失敗しました。</translation>
</message>
<message>
- <location filename="../src/globals/UIMessageCenter.cpp" line="941"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="942"/>
<source>Failed to remove DHCP server for network interface <b>%1</b>.</source>
<translation>ネットワークインターフェース <b>%1</b> のDHCPサーバーの除去に失敗しました。</translation>
</message>
<message>
- <location filename="../src/globals/UIMessageCenter.cpp" line="949"/>
- <location filename="../src/globals/UIMessageCenter.cpp" line="956"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="950"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="957"/>
<source>Failed to create the host network interface.</source>
<translation>ホストネットワークインターフェースの作成しに失敗しました。</translation>
</message>
<message>
- <location filename="../src/globals/UIMessageCenter.cpp" line="1029"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="1030"/>
<source>Create &new disk</source>
<translation>新規ディスクの作成(&N)</translation>
</message>
<message>
- <location filename="../src/globals/UIMessageCenter.cpp" line="1029"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="1030"/>
<source>&Choose existing disk</source>
<translation>既存のディスクを選択(&C)</translation>
</message>
<message>
- <location filename="../src/globals/UIMessageCenter.cpp" line="1040"/>
- <location filename="../src/globals/UIMessageCenter.cpp" line="1051"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="1041"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="1052"/>
<source>Leave &empty</source>
<translation>空のままにする(&E)</translation>
</message>
<message>
- <location filename="../src/globals/UIMessageCenter.cpp" line="1040"/>
- <location filename="../src/globals/UIMessageCenter.cpp" line="1051"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="1041"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="1052"/>
<source>&Choose disk</source>
<translation>ディスクを選択(&C)</translation>
</message>
<message>
- <location filename="../src/globals/UIMessageCenter.cpp" line="1106"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="1107"/>
<source><p>There are unsaved changes in the port forwarding configuration.</p><p>If you proceed your changes will be discarded.</p></source>
<translation><p>ポートフォワーディング設定の変更が保存されていません。</p><p>続行すると変更は破棄されます。</p></translation>
</message>
<message>
- <location filename="../src/globals/UIMessageCenter.cpp" line="1174"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="1175"/>
<source><p>Are you sure you want to release the virtual hard disk <nobr><b>%1</b></nobr>?</p><p>This will detach it from the following virtual machine(s): <b>%2</b>.</p></source>
<translation></translation>
</message>
<message>
- <location filename="../src/globals/UIMessageCenter.cpp" line="1180"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="1181"/>
<source><p>Are you sure you want to release the virtual optical disk <nobr><b>%1</b></nobr>?</p><p>This will detach it from the following virtual machine(s): <b>%2</b>.</p></source>
<translation><p>仮想光学ディスク <nobr><b>%1</b></nobr>を解放しますか?</p><p>次の仮想マシンから取り外します: <b>%2</b></p></translation>
</message>
<message>
- <location filename="../src/globals/UIMessageCenter.cpp" line="1186"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="1187"/>
<source><p>Are you sure you want to release the virtual floppy disk <nobr><b>%1</b></nobr>?</p><p>This will detach it from the following virtual machine(s): <b>%2</b>.</p></source>
<translation><p>仮想フロッピーディスク <nobr><b>%1</b></nobr>を解放しますか?</p><p>次の仮想マシンから取り外します: <b>%2</b></p></translation>
</message>
<message>
- <location filename="../src/globals/UIMessageCenter.cpp" line="1208"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="1209"/>
<source><p>Are you sure you want to remove the virtual hard disk <nobr><b>%1</b></nobr> from the list of known disk image files?</p></source>
<translation><p>ディスクイメージファイルのリストから仮想ハードディスク <nobr><b>%1</b></nobr>を除去しますか?</p></translation>
</message>
<message>
- <location filename="../src/globals/UIMessageCenter.cpp" line="1220"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="1221"/>
<source><p>As this hard disk is inaccessible its image file can not be deleted.</p></source>
<translation><p>注:このハードディスクイメージにアクセスできないため、除去できません。</p></translation>
</message>
<message>
- <location filename="../src/globals/UIMessageCenter.cpp" line="1227"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="1228"/>
<source><p>Are you sure you want to remove the virtual optical disk <nobr><b>%1</b></nobr> from the list of known disk image files?</p></source>
<translation><p>ディスクイメージファイルのリストから仮想光学ドライブ <nobr><b>%1</b></nobr>を除去しますか?</p></translation>
</message>
<message>
- <location filename="../src/globals/UIMessageCenter.cpp" line="1235"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="1236"/>
<source><p>Are you sure you want to remove the virtual floppy disk <nobr><b>%1</b></nobr> from the list of known disk image files?</p></source>
<translation><p>ディスクイメージファイルのリストから仮想フロッピードライブ <nobr><b>%1</b></nobr>を除去しますか?</p></translation>
</message>
<message>
- <location filename="../src/globals/UIMessageCenter.cpp" line="1326"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="1327"/>
<source><p>Unable to insert the virtual optical disk <nobr><b>%1</b></nobr> into the machine <b>%2</b>.</p></source>
<translation><p>仮想光学ディスク <nobr><b>%1</b></nobr> をマシン <b>%2</b> に挿入できません。</p></translation>
</message>
<message>
- <location filename="../src/globals/UIMessageCenter.cpp" line="1328"/>
- <location filename="../src/globals/UIMessageCenter.cpp" line="1344"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="1329"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="1345"/>
<source><p>Would you like to try to force insertion of this disk?</p></source>
<translation><p>このディスクを強制挿入してみますか?</p></translation>
</message>
<message>
- <location filename="../src/globals/UIMessageCenter.cpp" line="1332"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="1333"/>
<source><p>Unable to eject the virtual optical disk <nobr><b>%1</b></nobr> from the machine <b>%2</b>.</p></source>
<translation><p>仮想光学ディスク <nobr><b>%1</b></nobr> をマシン <b>%2</b> から取り出せません。</p></translation>
</message>
<message>
- <location filename="../src/globals/UIMessageCenter.cpp" line="1334"/>
- <location filename="../src/globals/UIMessageCenter.cpp" line="1350"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="1335"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="1351"/>
<source><p>Would you like to try to force ejection of this disk?</p></source>
<translation><p>このディスクを強制排出してみますか?</p></translation>
</message>
<message>
- <location filename="../src/globals/UIMessageCenter.cpp" line="1342"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="1343"/>
<source><p>Unable to insert the virtual floppy disk <nobr><b>%1</b></nobr> into the machine <b>%2</b>.</p></source>
<translation><p>仮想フロッピーディスク <nobr><b>%1</b></nobr> をマシン <b>%2</b> に挿入できません。</p></translation>
</message>
<message>
- <location filename="../src/globals/UIMessageCenter.cpp" line="1348"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="1349"/>
<source><p>Unable to eject the virtual floppy disk <nobr><b>%1</b></nobr> from the machine <b>%2</b>.</p></source>
<translation><p>仮想フロッピーディスク <nobr><b>%1</b></nobr> をマシン <b>%2</b> から取り出せません。</p></translation>
</message>
<message>
- <location filename="../src/globals/UIMessageCenter.cpp" line="1378"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="1379"/>
<source>Failed to open the hard disk file <nobr><b>%1</b></nobr>.</source>
<translation>ハードディスクファイル <nobr><b>%1</b></nobr> を開けませんでした。</translation>
</message>
<message>
- <location filename="../src/globals/UIMessageCenter.cpp" line="1383"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="1384"/>
<source>Failed to open the optical disk file <nobr><b>%1</b></nobr>.</source>
<translation>光学ディスクファイル <nobr><b>%1</b></nobr> を開けませんでした。</translation>
</message>
<message>
- <location filename="../src/globals/UIMessageCenter.cpp" line="1388"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="1389"/>
<source>Failed to open the floppy disk file <nobr><b>%1</b></nobr>.</source>
<translation>フロッピーディスクファイル <nobr><b>%1</b></nobr> を開けませんでした。</translation>
</message>
<message>
- <location filename="../src/globals/UIMessageCenter.cpp" line="1407"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="1408"/>
<source>Failed to close the hard disk file <nobr><b>%2</b></nobr>.</source>
<translation>ハードディスクファイル <nobr><b>%2</b></nobr> を閉じられませんでした。</translation>
</message>
<message>
- <location filename="../src/globals/UIMessageCenter.cpp" line="1412"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="1413"/>
<source>Failed to close the optical disk file <nobr><b>%2</b></nobr>.</source>
<translation>光学ディスクファイル <nobr><b>%2</b></nobr> を閉じられませんでした。</translation>
</message>
<message>
- <location filename="../src/globals/UIMessageCenter.cpp" line="1417"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="1418"/>
<source>Failed to close the floppy disk file <nobr><b>%2</b></nobr>.</source>
<translation>フロッピディスクファイル <nobr><b>%2</b></nobr> を閉じられませんでした。</translation>
</message>
<message numerus="yes">
- <location filename="../src/globals/UIMessageCenter.cpp" line="1573"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="1574"/>
<source><p>The %n following virtual machine(s) are currently in a saved state: <b>%1</b></p><p>If you continue the runtime state of the exported machine(s) will be discarded. The other machine(s) will not be changed.</p></source>
<comment>This text is never used with n == 0. Feel free to drop the %n where possible, we only included it because of problems with Qt Linguist (but the user can see how many machines are in the list and doesn't need to be told).</comment>
<translation>
@@ -8338,47 +8368,47 @@ p, li { white-space: pre-wrap; }
</translation>
</message>
<message>
- <location filename="../src/globals/UIMessageCenter.cpp" line="1641"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="1642"/>
<source><nobr>Fatal Error</nobr></source>
<comment>runtime error info</comment>
<translation><nobr>致命的なエラー</nobr></translation>
</message>
<message>
- <location filename="../src/globals/UIMessageCenter.cpp" line="1647"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="1648"/>
<source><nobr>Non-Fatal Error</nobr></source>
<comment>runtime error info</comment>
<translation><nobr>致命的でないエラー</nobr></translation>
</message>
<message>
- <location filename="../src/globals/UIMessageCenter.cpp" line="1653"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="1654"/>
<source><nobr>Warning</nobr></source>
<comment>runtime error info</comment>
<translation><nobr>警告</nobr></translation>
</message>
<message>
- <location filename="../src/globals/UIMessageCenter.cpp" line="1669"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="1670"/>
<source><nobr>Error ID: </nobr></source>
<comment>runtime error info</comment>
<translation><nobr>エラーID: </nobr></translation>
</message>
<message>
- <location filename="../src/globals/UIMessageCenter.cpp" line="1670"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="1671"/>
<source>Severity: </source>
<comment>runtime error info</comment>
<translation>重要度:</translation>
</message>
<message>
- <location filename="../src/globals/UIMessageCenter.cpp" line="1678"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="1679"/>
<source><p>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:</p></source>
<translation><p>仮想マシンの実行中に致命的なエラーが発生しました!仮想マシンの電源をオフにします。調査のために以下のエラーメッセージをクリップボードにコピーして使用してください:</p></translation>
</message>
<message>
- <location filename="../src/globals/UIMessageCenter.cpp" line="1686"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="1687"/>
<source><p>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.</p></source>
<translation><p>仮想マシンの実行中にエラーが発生しました!エラーの詳細を以下に示します。説明されたエラーを修正し、仮想マシンの再実行することができます。</p></translation>
</message>
<message>
- <location filename="../src/globals/UIMessageCenter.cpp" line="1694"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="1695"/>
<source><p>The virtual machine execution may run into an error condition as described below. We suggest that you take an appropriate action to avert the error.</p></source>
<translation><p>仮想マシンの実行中、以下で説明されるエラーが発生するかもしれません。このメッセージは無視できますが、動作を確実にするために、説明された誤りを対策することが推奨されます。</p></translation>
</message>
@@ -8387,17 +8417,17 @@ p, li { white-space: pre-wrap; }
<translation type="obsolete">申し訳ありません。不明なエラーが発生しました。</translation>
</message>
<message>
- <location filename="../src/globals/UIMessageCenter.cpp" line="1073"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="1074"/>
<source>Failed to attach the hard disk (<nobr><b>%1</b></nobr>) to the slot <i>%2</i> of the machine <b>%3</b>.</source>
<translation>ハードディスク(<nobr><b>%1</b></nobr>)の、仮想マシン<b>"%3"</b>のスロット<i>"%2"</i> への割り当てに失敗しました。</translation>
</message>
<message>
- <location filename="../src/globals/UIMessageCenter.cpp" line="1079"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="1080"/>
<source>Failed to attach the CD/DVD device (<nobr><b>%1</b></nobr>) to the slot <i>%2</i> of the machine <b>%3</b>.</source>
<translation>CD/DVDデバイス(<nobr><b>%1</b></nobr>)の、仮想マシン<b>"%3"</b>のスロット<i>"%2"</i> への割り当てに失敗しました。</translation>
</message>
<message>
- <location filename="../src/globals/UIMessageCenter.cpp" line="1085"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="1086"/>
<source>Failed to attach the floppy device (<nobr><b>%1</b></nobr>) to the slot <i>%2</i> of the machine <b>%3</b>.</source>
<translation>フロッピーデバイス(<nobr><b>%1</b></nobr>)の、仮想マシン<b>"%3"</b>のスロット<i>"%2"</i> への割り当てに失敗しました。</translation>
</message>
@@ -8406,32 +8436,32 @@ p, li { white-space: pre-wrap; }
<translation type="obsolete"><p>この仮想マシンでUSB 2.0を有効化するには<b><nobr>%1</nobr></b>のインストールが必要です。VirtualBoxのダウンロードサイトから機能拡張パッケージをダウンロードし、インストールしてください。機能拡張パッケージをインストールすると、USB 2.0を有効化することができます。現在の設定をキャンセルしない場合、USB 2.0は無効化されます。</p></translation>
</message>
<message>
- <location filename="../src/globals/UIMessageCenter.cpp" line="2404"/>
- <location filename="../src/globals/UIMessageCenter.cpp" line="2625"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="2421"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="2642"/>
<source>Result Code: </source>
<comment>error info</comment>
<translation>終了コード : </translation>
</message>
<message>
- <location filename="../src/globals/UIMessageCenter.cpp" line="2631"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="2648"/>
<source>Component: </source>
<comment>error info</comment>
<translation>コンポーネント: </translation>
</message>
<message>
- <location filename="../src/globals/UIMessageCenter.cpp" line="2639"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="2656"/>
<source>Interface: </source>
<comment>error info</comment>
<translation>インターフェース: </translation>
</message>
<message>
- <location filename="../src/globals/UIMessageCenter.cpp" line="2648"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="2665"/>
<source>Callee: </source>
<comment>error info</comment>
<translation>呼び出し先: </translation>
</message>
<message>
- <location filename="../src/globals/UIMessageCenter.cpp" line="2656"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="2673"/>
<source>Callee RC: </source>
<comment>error info</comment>
<translation>呼び出し先 RC: </translation>
@@ -8461,8 +8491,8 @@ p, li { white-space: pre-wrap; }
<translation type="obsolete">仮想マシン<b>%1<b>のスナップショット保存フォルダーのパスを<nobr><b>%2</b></nobr>に変更できませんでした。</translation>
</message>
<message>
- <location filename="../src/globals/UIMessageCenter.cpp" line="1131"/>
- <location filename="../src/globals/UIMessageCenter.cpp" line="1142"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="1132"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="1143"/>
<source><p>Failed to remove the shared folder <b>%1</b> (pointing to <nobr><b>%2</b></nobr>) from the virtual machine <b>%3</b>.</p><p>Please close all programs in the guest OS that may be using this shared folder and try again.</p></source>
<translation><p>仮想マシン<b>%3</b>の共有フォルダー<b>%1</b>(参照先:<nobr><b>%2</b></nobr>)の除去に失敗しました。</p><p>この共有フォルダーを使用しているゲストOSのすべてのプログラムを終了し、再実行してください。</p></translation>
</message>
@@ -8492,9 +8522,8 @@ p, li { white-space: pre-wrap; }
<translation type="obsolete"><p>仮想マシンのウィンドウを"シームレス"モードに切り替えます。<b>%1</b>キーを押すといつでもウィンドウ表示に戻ることができます。注:ホストキーは現在<b>%2</b>に割り当てられています。</p><p>注:シームレスモードではメインメニューバーは表示されません。メニューバーにアクセスするには <b>Host+Home</b>キーを押してください。</p></translation>
</message>
<message>
- <location filename="../src/globals/UIPopupCenter.cpp" line="481"/>
<source><p>The virtual machine window is optimized to work in <b>%1 bit</b> color mode but the virtual display is currently set to <b>%2 bit</b>.</p><p>Please open the display properties dialog of the guest OS and select a <b>%3 bit</b> color mode, if it is available, for best possible performance of the virtual video subsystem.</p><p><b>Note</b>. Some operating systems, like [...]
- <translation><p>仮想マシンウィンドウは<b>%1 ビット</b>カラーモードに最適化されますが、現在仮想ディスプレイは<b>%2 ビット</b>に設定されています。</p><p>最良の仮想ビデオサブシステム性能を得るため、利用可能であるならばゲストOSの画面設定ダイアログを開き、<b>%3 ビット</b>カラーモードを選択してください。</p><p><b>注</b>:OS/2など、いくつかのオペレーティングシステムは32 ビットモードの動作を24 ビット(約1600万色)として報告します。 このメッセージが消えるか、またはゲストOSで必要な色深度(%4 ビット) が利用できないことが分かっているならば、単にメッセージを無効にできるか確認するために異なった色深度を選択することができ [...]
+ <translation type="obsolete"><p>仮想マシンウィンドウは<b>%1 ビット</b>カラーモードに最適化されますが、現在仮想ディスプレイは<b>%2 ビット</b>に設定されています。</p><p>最良の仮想ビデオサブシステム性能を得るため、利用可能であるならばゲストOSの画面設定ダイアログを開き、<b>%3 ビット</b>カラーモードを選択してください。</p><p><b>注</b>:OS/2など、いくつかのオペレーティングシステムは32 ビットモードの動作を24 ビット(約1600万色)として報告します。 このメッセージが消えるか、またはゲストOSで必要な色深度(%4 ビット) が利用できないことが分かっているならば、単にメッセージを無効にできるか確認するために異 [...]
</message>
<message>
<source><p>A critical error has occurred while running the virtual machine and the machine execution has been stopped.</p><p>For help, please see the Community section on <a href=http://www.virtualbox.org>http://www.virtualbox.org</a> or your support contract. Please provide the contents of the log file <tt>VBox.log</tt> and the image file <tt>VBox.png</tt>, which you can find in the <nobr><b>%1</b></nobr& [...]
@@ -8509,12 +8538,12 @@ p, li { white-space: pre-wrap; }
<translation type="obsolete"><nobr><b>"%1"</b></nobr>にライセンスファイルが見つかりません。</translation>
</message>
<message>
- <location filename="../src/globals/UIMessageCenter.cpp" line="2294"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="2311"/>
<source>Failed to open the license file <nobr><b>%1</b></nobr>. Check file permissions.</source>
<translation>ライセンスファイル<nobr><b>"%1"</b></nobr>が開けません。ファイルのパーミッションを確認してください。</translation>
</message>
<message>
- <location filename="../src/globals/UIMessageCenter.cpp" line="763"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="764"/>
<source>Failed to send the ACPI Power Button press event to the virtual machine <b>%1</b>.</source>
<translation>仮想マシン<b>"%1"</b>への電源ボタン オフのACPIイベント送信に失敗しました。</translation>
</message>
@@ -8535,19 +8564,19 @@ p, li { white-space: pre-wrap; }
<translation type="obsolete"><p>グローバルなVirtualBox設定の<b><nobr>"%1"</nobr></b>への保存に失敗しました。</p></translation>
</message>
<message>
- <location filename="../src/globals/UIMessageCenter.cpp" line="437"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="438"/>
<source><p>Failed to load the global GUI configuration from <b><nobr>%1</nobr></b>.</p><p>The application will now terminate.</p></source>
<translation><p>グローバルなGUI構成の<b><nobr>"%1"</nobr></b>からの読み込みに失敗しました。</p>
<p>アプリケーションを終了します。</p></translation>
</message>
<message>
- <location filename="../src/globals/UIMessageCenter.cpp" line="446"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="447"/>
<source><p>Failed to save the global GUI configuration to <b><nobr>%1</nobr></b>.</p><p>The application will now terminate.</p></source>
<translation><p>グローバルなGUI構成の<b><nobr>"%1"</nobr></b>への保存に失敗しました。</p>
<p>アプリケーションを終了します。</p></translation>
</message>
<message>
- <location filename="../src/globals/UIMessageCenter.cpp" line="1153"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="1154"/>
<source>Failed to save the settings of the virtual machine <b>%1</b> to <b><nobr>%2</nobr></b>.</source>
<translation>仮想マシン<b>"%1"</b>の設定の<b><nobr>"%2"</nobr></b>への保存に失敗しました。</translation>
</message>
@@ -8566,7 +8595,7 @@ p, li { white-space: pre-wrap; }
<translation type="obsolete">登録解除</translation>
</message>
<message>
- <location filename="../src/globals/UIMessageCenter.cpp" line="685"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="686"/>
<source>Discard</source>
<comment>saved state</comment>
<translation>破棄</translation>
@@ -8621,14 +8650,14 @@ p, li { white-space: pre-wrap; }
<translation type="obsolete">マウント</translation>
</message>
<message>
- <location filename="../src/globals/UIMessageCenter.cpp" line="1810"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="1811"/>
<location filename="../src/globals/UIPopupCenter.cpp" line="432"/>
<source><p>The host key is currently defined as <b>%1</b>.</p></source>
<comment>additional message box paragraph</comment>
<translation><p>現在ホストキーは<b>%1</b>に割り当てられています。</p></translation>
</message>
<message>
- <location filename="../src/globals/UIMessageCenter.cpp" line="1816"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="1817"/>
<source>Capture</source>
<comment>do input capture</comment>
<translation>キャプチャー</translation>
@@ -8639,7 +8668,7 @@ p, li { white-space: pre-wrap; }
<p><b>[確認]</b>ボタンをクリックして仮想ディスクマネージャーを起動し、どのメディアにアクセスできないのか確認してください。または<b>[無視]</b>ボタンをクリックして、このメッセージを無視してください。</p></translation>
</message>
<message>
- <location filename="../src/globals/UIMessageCenter.cpp" line="673"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="674"/>
<source>Check</source>
<comment>inaccessible media message box</comment>
<translation>確認</translation>
@@ -8683,19 +8712,19 @@ p, li { white-space: pre-wrap; }
<translation type="obsolete"><p>仮想マシンを本当にリセットしますか?</p><p>仮想マシンをリセットすると、その中で稼動中のすべてのアプリケーションの保存されていないデータは失われます。</p></translation>
</message>
<message>
- <location filename="../src/globals/UIMessageCenter.cpp" line="696"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="697"/>
<source>Reset</source>
<comment>machine</comment>
<translation>リセット</translation>
</message>
<message>
- <location filename="../src/globals/UIMessageCenter.cpp" line="1436"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="1437"/>
<source>Continue</source>
<comment>no hard disk attached</comment>
<translation>続ける</translation>
</message>
<message>
- <location filename="../src/globals/UIMessageCenter.cpp" line="1437"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="1438"/>
<source>Go Back</source>
<comment>no hard disk attached</comment>
<translation>戻る</translation>
@@ -8720,12 +8749,12 @@ p, li { white-space: pre-wrap; }
<translation type="obsolete">選択</translation>
</message>
<message>
- <location filename="../src/globals/UIMessageCenter.cpp" line="1876"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="1877"/>
<source><p>Could not enter seamless mode due to insufficient guest video memory.</p><p>You should configure the virtual machine to have at least <b>%1</b> of video memory.</p></source>
<translation><p>ゲストOSのビデオメモリー不足のため、シームレスモードに切り替えできません。</p><p>仮想マシンの設定でビデオメモリーを <b>%1</b>以上に設定してください。</p></translation>
</message>
<message>
- <location filename="../src/globals/UIMessageCenter.cpp" line="1865"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="1866"/>
<source><p>Could not switch the guest display to fullscreen mode due to insufficient guest video memory.</p><p>You should configure the virtual machine to have at least <b>%1</b> of video memory.</p><p>Press <b>Ignore</b> to switch to fullscreen mode anyway or press <b>Cancel</b> to cancel the operation.</p></source>
<translation><p>ゲストOSのビデオメモリー不足のため、ゲスト画面をフルスクリーンモードに切り替えできません。</p><p>仮想マシンの設定でビデオメモリーを <b>%1</b>以上に設定してください。</p><p><b>[無視]</b>ボタンをクリックしてフルスクリーンモードに切り換えるか、<b>[キャンセル]</b>ボタンをクリックして操作を取り消してください。</p></translation>
</message>
@@ -8734,12 +8763,12 @@ p, li { white-space: pre-wrap; }
<translation type="obsolete"><p>ネットワークエラーのため、新しいバージョン情報を取得できません:</p><p><b>%1</b></p></translation>
</message>
<message>
- <location filename="../src/globals/UIMessageCenter.cpp" line="1986"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="2003"/>
<source>You are already running the most recent version of VirtualBox.</source>
<translation>最新バージョンのVirtualBoxがインストールされています。 後でバージョン確認を行ってください。</translation>
</message>
<message>
- <location filename="../src/globals/UIMessageCenter.cpp" line="1801"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="1802"/>
<source><p>You have <b>clicked the mouse</b> inside the Virtual Machine display or pressed the <b>host key</b>. This will cause the Virtual Machine to <b>capture</b> 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.</p><p>You can press the <b>host key</b> at [...]
<translation><p>仮想マシンの画面を<b>マウスでクリック</b>するか、または<b>ホストキー</b>を押すと、仮想マシンはマウスポインター(マウス統合機能がゲストOSでサポートされていないときのみ)とキーボードを<b>キャプチャー</b>します。仮想マシンにキーボードとマウスがキャプチャーされるとホストマシンで動作する他のアプリケーションは利用できません。</p><p></p><p><b>ホストキー</b>を押すと、キーボードとマウス(キャプチャーされているとき)は<b>キャプチャー解除</b>され、通常の操作に戻ることができます。現在割り当てられているホストキーは仮想マシンのウィンドウ下部のステータスバーに <img src=:/hostkey_16px.png/> アイコンで表示されます。このアイコンはマウス [...]
</message>
@@ -8810,7 +8839,7 @@ p, li { white-space: pre-wrap; }
<translation type="obsolete">製品情報ダイアログを表示</translation>
</message>
<message>
- <location filename="../src/globals/UIMessageCenter.cpp" line="1976"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="1993"/>
<source><p>A new version of VirtualBox has been released! Version <b>%1</b> is available at <a href="http://www.virtualbox.org/">virtualbox.org</a>.</p><p>You can download this version using the link:</p><p><a href=%2>%3</a></p></source>
<translation><p>VirtualBoxの新しいバージョンがリリースされました! バージョン <b>%1</b>は<a href="http://www.virtualbox.org/">virtualbox.org</a>から入手できます。</p><p>このリンクから最新バージョンをダウンロードできます。: </p><p><a href=%2>%3</a></p></translation>
</message>
@@ -8827,12 +8856,12 @@ p, li { white-space: pre-wrap; }
<translation type="obsolete"><p>仮想マシン<b>"%1"</b>をリストから除去します。</p><p>仮想マシンを構成するファイルをハードディスクから削除しますか?他の仮想マシンで使用されていない仮想ハードディスクは削除されます。</p></translation>
</message>
<message>
- <location filename="../src/globals/UIMessageCenter.cpp" line="642"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="643"/>
<source>Delete all files</source>
<translation>すべてのファイルを削除</translation>
</message>
<message>
- <location filename="../src/globals/UIMessageCenter.cpp" line="643"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="644"/>
<source>Remove only</source>
<translation>除去のみ</translation>
</message>
@@ -8841,15 +8870,15 @@ p, li { white-space: pre-wrap; }
<translation type="obsolete">アクセスできない仮想マシン<b>"%1"</b>をリストから除去します。続行しますか?</translation>
</message>
<message>
- <location filename="../src/globals/UIMessageCenter.cpp" line="562"/>
- <location filename="../src/globals/UIMessageCenter.cpp" line="635"/>
- <location filename="../src/globals/UIMessageCenter.cpp" line="897"/>
- <location filename="../src/globals/UIMessageCenter.cpp" line="913"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="563"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="636"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="898"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="914"/>
<source>Remove</source>
<translation>除去</translation>
</message>
<message>
- <location filename="../src/globals/UIMessageCenter.cpp" line="1197"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="1198"/>
<source>Release</source>
<comment>detach medium</comment>
<translation>解放</translation>
@@ -8871,36 +8900,36 @@ p, li { white-space: pre-wrap; }
<translation type="obsolete"><p>注:このメディアのストレージ装置は削除されません。後でリストに再度追加することが可能です。</p></translation>
</message>
<message>
- <location filename="../src/globals/UIMessageCenter.cpp" line="1248"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="1249"/>
<source>Remove</source>
<comment>medium</comment>
<translation>除去</translation>
</message>
<message>
- <location filename="../src/globals/UIMessageCenter.cpp" line="1474"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="1475"/>
<source><p>The hard disk storage unit at location <b>%1</b> 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.</p><p>Please specify a different location.</p></source>
<translation><p>ハードディスクストレージ装置の場所 <b>"%1"</b>はすでに存在します。別の仮想ハードディスクが使用しているため、この場所に新規仮想ハードディスクを作成できません。</p><p>別の場所を指定してください。</p></translation>
</message>
<message>
- <location filename="../src/globals/UIMessageCenter.cpp" line="1254"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="1255"/>
<source><p>Do you want to delete the storage unit of the hard disk <nobr><b>%1</b></nobr>?</p><p>If you select <b>Delete</b> then the specified storage unit will be permanently deleted. This operation <b>cannot be undone</b>.</p><p>If you select <b>Keep</b> 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 po [...]
<translation><p>ハードディスク<nobr><b>"%1"</b></nobr>のストレージ装置を削除しますか?</p><p><b>[削除]</b>を選択すると、指定されたストレージ装置は永久に削除されます。この操作は<b>元に戻せません</b>。</p><p><b>[保持]</b>を選択すると、ハードディスクはリストから取り除かれますが、ストレージ装置は後でリストに再度追加できるように、そのまま置かれます。</p></translation>
</message>
<message>
- <location filename="../src/globals/UIMessageCenter.cpp" line="1265"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="1266"/>
<source>Delete</source>
<comment>hard disk storage</comment>
<translation>削除</translation>
</message>
<message>
- <location filename="../src/globals/UIMessageCenter.cpp" line="1266"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="1267"/>
<source>Keep</source>
<comment>hard disk storage</comment>
<translation>保持</translation>
</message>
<message>
- <location filename="../src/globals/UIMessageCenter.cpp" line="1272"/>
- <location filename="../src/globals/UIMessageCenter.cpp" line="1280"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="1273"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="1281"/>
<source>Failed to delete the storage unit of the hard disk <b>%1</b>.</source>
<translation>ハードディスクストレージ装置<b>"%1"</b>の削除に失敗しました。</translation>
</message>
@@ -8909,9 +8938,9 @@ p, li { white-space: pre-wrap; }
<translation type="obsolete"><p>新規の割り当てに利用できる未使用のハードディスクがありません。</p><p><b>[作成]</b>ボタンをクリックし、<i>新規仮想ディスク作成ウィザード</i>を起動して新規ハードディスクイメージを作成するか、<b>[選択]</b>ボタンをクリックして、<i>仮想メディアマネージャー</i>を開き、動作を選択してください。</p></translation>
</message>
<message>
- <location filename="../src/globals/UIMessageCenter.cpp" line="1484"/>
- <location filename="../src/globals/UIMessageCenter.cpp" line="1492"/>
- <location filename="../src/globals/UIMessageCenter.cpp" line="1500"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="1485"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="1493"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="1501"/>
<source>Failed to create the hard disk storage <nobr><b>%1</b>.</nobr></source>
<translation>ハードディスクストレージ<nobr><b>"%1"</b>の作成に失敗しました。</nobr></translation>
</message>
@@ -8940,7 +8969,7 @@ p, li { white-space: pre-wrap; }
<translation type="obsolete">"%1 <nobr><b>%2</b></nobr>"のクローズに失敗しました。</translation>
</message>
<message>
- <location filename="../src/globals/UIMessageCenter.cpp" line="494"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="495"/>
<source>Failed to access the disk image file <nobr><b>%1</b></nobr>.</source>
<translation>メディア<nobr><b>"%1"</b></nobr>のアクセス可否状態の取得に失敗しました。</translation>
</message>
@@ -8953,7 +8982,7 @@ p, li { white-space: pre-wrap; }
<translation type="obsolete"><p>新しいバージョンの情報を取得できません。エラー:</p><p><b>%1</b></p></translation>
</message>
<message>
- <location filename="../src/globals/UIMessageCenter.cpp" line="665"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="666"/>
<source><p>One or more virtual hard disks, CD/DVD or floppy disk image files are not currently accessible. As a result, you will not be able to operate virtual machines that use these files until they become accessible later.</p><p>Press <b>Check</b> to open the Virtual Media Manager window and see which files are inaccessible, or press <b>Ignore</b> to ignore this message.</p></source>
<translation><p>一つ以上の仮想ハードディスク、CD/DVDまたはフロッピーメディアのに現在アクセスできません。アクセス可能になるまでこれらのメディアを使用する仮想マシンを操作できません。</p><p><b>[確認]</b>ボタンをクリックして仮想メディアマネージャーを起動し、どのメディアにアクセスできないのか確認してください。または<b>[無視]</b>ボタンをクリックして、このメッセージを無視してください。</p></translation>
</message>
@@ -8985,7 +9014,7 @@ p, li { white-space: pre-wrap; }
<translation type="obsolete">上書き(&V)</translation>
</message>
<message>
- <location filename="../src/globals/UIMessageCenter.cpp" line="1711"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="1712"/>
<source><p>A critical error has occurred while running the virtual machine and the machine execution has been stopped.</p><p>For help, please see the Community section on <a href=http://www.virtualbox.org>http://www.virtualbox.org</a> or your support contract. Please provide the contents of the log file <tt>VBox.log</tt> and the image file <tt>VBox.png</tt>, which you can find in the <nobr><b>%1</b></nobr& [...]
<translation><p>仮想マシン実行中に重大なエラーが発生したため、仮想マシンは停止しました。</p><p>問題の解決のため、<a href=http://www.virtualbox.org>http://www.virtualbox.org</a>のCommunityセクションを参照するか、サポートに連絡してください。あなたがエラー発生時に行った操作と共に、<nobr><b>%1</b></nobr>ディレクトリに格納されているログファイル(<tt>VBox.log</tt>)とイメージファイル(<tt>VBox.png</tt>)を提供してください。注:VirtualBoxメインウィンドウの<b>[仮想マシン]</b>メニューから[ログを参照]を選択して、上記ファイルにアクセスすることができます。</p><p>仮想マシンを電源オフするには [...]
</message>
@@ -9009,7 +9038,7 @@ p, li { white-space: pre-wrap; }
<translation type="obsolete">ファイル名<b>"%1"</b>はすでに使われています。ファイルを置き換えますか?<br /><br />ファイルは"%2"に存在します。ファイルの内容は上書きされます。</translation>
</message>
<message>
- <location filename="../src/globals/UIMessageCenter.cpp" line="2314"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="2331"/>
<source>The following files already exist:<br /><br />%1<br /><br />Are you sure you want to replace them? Replacing them will overwrite their contents.</source>
<translation>以下のファイルはすでに存在しています:<br /><br />%1<br /><br />ファイルを置き換えますか?ファイルの内容は上書きされます。</translation>
</message>
@@ -9018,7 +9047,7 @@ p, li { white-space: pre-wrap; }
<translation type="obsolete"><b>"%1"</b>の除去に失敗しました。<br /><br />手作業でファイルを取り除き、再実行してください。</translation>
</message>
<message>
- <location filename="../src/globals/UIMessageCenter.cpp" line="375"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="376"/>
<source>You are running a prerelease version of VirtualBox. This version is not suitable for production use.</source>
<translation>これはVirtualBoxのプレリリースバージョンです。このバージョンは実務作業には適していません。</translation>
</message>
@@ -9032,25 +9061,25 @@ p, li { white-space: pre-wrap; }
<translation>電源ボタン オフのACPIイベントでゲストOSをシャットダウンしようとしています。ゲストOSがACPIサブシステムを使用しないためシャットダウンできません。</translation>
</message>
<message>
- <location filename="../src/globals/UIMessageCenter.cpp" line="1738"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="1739"/>
<source><p>VT-x/AMD-V hardware acceleration has been enabled, but is not operational. Your 64-bit guest will fail to detect a 64-bit CPU and will not be able to boot.</p><p>Please ensure that you have enabled VT-x/AMD-V properly in the BIOS of your host computer.</p></source>
<translation><p>仮想化支援機能(VT-x/AMD-V)を有効化できません。64ビット ゲストOSは64ビットCPUを検出できず、起動できません。</p><p>ホストマシンのBIOS設定でVT-x/AMD-Vを有効化してください。</p></translation>
</message>
<message>
- <location filename="../src/globals/UIMessageCenter.cpp" line="1744"/>
- <location filename="../src/globals/UIMessageCenter.cpp" line="1751"/>
- <location filename="../src/globals/UIMessageCenter.cpp" line="1762"/>
- <location filename="../src/globals/UIMessageCenter.cpp" line="1768"/>
- <location filename="../src/globals/UIMessageCenter.cpp" line="1779"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="1745"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="1752"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="1763"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="1769"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="1780"/>
<source>Close VM</source>
<translation>仮想マシンを閉じる</translation>
</message>
<message>
- <location filename="../src/globals/UIMessageCenter.cpp" line="1581"/>
- <location filename="../src/globals/UIMessageCenter.cpp" line="1744"/>
- <location filename="../src/globals/UIMessageCenter.cpp" line="1751"/>
- <location filename="../src/globals/UIMessageCenter.cpp" line="1762"/>
- <location filename="../src/globals/UIMessageCenter.cpp" line="1768"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="1582"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="1745"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="1752"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="1763"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="1769"/>
<source>Continue</source>
<translation>続ける</translation>
</message>
@@ -9063,8 +9092,8 @@ p, li { white-space: pre-wrap; }
<translation type="obsolete">破棄</translation>
</message>
<message>
- <location filename="../src/globals/UIMessageCenter.cpp" line="797"/>
- <location filename="../src/globals/UIMessageCenter.cpp" line="806"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="798"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="807"/>
<location filename="../src/globals/UIPopupCenter.cpp" line="241"/>
<source>Cancel</source>
<translation>キャンセル</translation>
@@ -9099,7 +9128,7 @@ p, li { white-space: pre-wrap; }
<translation type="obsolete"><p>スナップショット <b>%1</b> をリストアしようとしています。</p><p>現在の仮想マシンの状態から下にチェックを入れたところまでのスナップショットを作成することができます。もしこれをしないと、現在の状態が永久に失われてしまします。続行しますか?</p></translation>
</message>
<message>
- <location filename="../src/globals/UIMessageCenter.cpp" line="792"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="793"/>
<source>Create a snapshot of the current machine state</source>
<translation>現在のマシンの状態のスナップショットを作成</translation>
</message>
@@ -9108,53 +9137,53 @@ p, li { white-space: pre-wrap; }
<translation type="obsolete"><p>本当にスナップショット <b>%1</b> をリストアしますか?</p></translation>
</message>
<message>
- <location filename="../src/globals/UIMessageCenter.cpp" line="1611"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="1612"/>
<source>Can't find snapshot named <b>%1</b>.</source>
<translation><b>%1</b> という名前のスナップショットが見つかりません。</translation>
</message>
<message>
- <location filename="../src/globals/UIMessageCenter.cpp" line="539"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="540"/>
<source>Rename</source>
<translation>名前を変更</translation>
</message>
<message>
- <location filename="../src/globals/UIMessageCenter.cpp" line="558"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="559"/>
<source><p>You are about to remove following virtual machine items from the machine list:</p><p><b>%1</b></p><p>Do you wish to proceed?</p></source>
<translation><p>以下の仮想マシンを除去しようとしています:</p><p><b>%1</b></p><p>続行しますか?</p></translation>
</message>
<message>
- <location filename="../src/globals/UIMessageCenter.cpp" line="611"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="612"/>
<source><p>You are about to remove following inaccessible virtual machines from the machine list:</p><p>%1</p><p>Do you wish to proceed?</p></source>
<translation><p>以下のアクセスできない仮想マシンを除去しようとしています:</p><p><b>%1</b></p><p>続行しますか?</p></translation>
</message>
<message>
- <location filename="../src/globals/UIMessageCenter.cpp" line="616"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="617"/>
<source><p>You are about to remove following virtual machines from the machine list:</p><p>%1</p><p>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's virtual hard disks if they are not in use by another machine.</p></source>
<translation><p>以下の仮想マシンを除去しようとしています:</p><p><b>%1</b></p><p>仮想マシンを構成するファイルをハードディスクから削除しますか? 他の仮想マシンで使用されていない仮想ハードディスクも削除します。</p></translation>
</message>
<message>
- <location filename="../src/globals/UIMessageCenter.cpp" line="622"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="623"/>
<source><p>You are about to remove following virtual machines from the machine list:</p><p>%1</p><p>Would you like to delete the files containing the virtual machine from your hard disk as well?</p></source>
<translation><p>以下の仮想マシンを除去しようとしています:</p><p><b>%1</b></p><p>仮想マシンを構成するファイルをハードディスクから削除しますか?</p></translation>
</message>
<message>
- <location filename="../src/globals/UIMessageCenter.cpp" line="679"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="680"/>
<source><p>Are you sure you want to discard the saved state of the following virtual machines?</p><p><b>%1</b></p><p>This operation is equivalent to resetting or powering off the machine without doing a proper shutdown of the guest OS.</p></source>
<translation><p>以下の仮想マシンの保存状態を破棄しますか?</p><p><b>%1</b></p><p>この操作はゲストOSを適切にシャットダウンせずにリセットまたは電源をオフにすることと同等です。</p></translation>
</message>
<message>
- <location filename="../src/globals/UIMessageCenter.cpp" line="1161"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="1162"/>
<source><p>Error changing disk image mode from <b>%1</b> to <b>%2</b>.</p></source>
<translation><p>メディアタイプを<b>%1</b> から <b>%2</b> にする際にエラーが発生しました。</p></translation>
</message>
<message>
- <location filename="../src/globals/UIMessageCenter.cpp" line="1229"/>
- <location filename="../src/globals/UIMessageCenter.cpp" line="1237"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="1230"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="1238"/>
<source><p>Note that the storage unit of this medium will not be deleted and that it will be possible to use it later again.</p></source>
<translation><p>注:このメディアの記憶装置は削除されません。再度利用することができます。</p></translation>
</message>
<message>
- <location filename="../src/globals/UIMessageCenter.cpp" line="1025"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="1026"/>
<source><p>You are about to add a virtual hard disk to controller <b>%1</b>.</p><p>Would you like to create a new, empty file to hold the disk contents or select an existing one?</p></source>
<translation><p>仮想ハードディスクをコントローラー<b>"%1"</b>に追加します。</p><p>空の仮想ハードディスクを新規作成しますか?既存の仮想ハードディスクを選択しますか?</p></translation>
</message>
@@ -9169,7 +9198,7 @@ p, li { white-space: pre-wrap; }
<translation type="obsolete">既存のディスクを選択(&C)</translation>
</message>
<message>
- <location filename="../src/globals/UIMessageCenter.cpp" line="1035"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="1036"/>
<source><p>You are about to add a new CD/DVD drive to controller <b>%1</b>.</p><p>Would you like to choose a virtual CD/DVD disk to put in the drive or to leave it empty for now?</p></source>
<translation><p>CD/DVDドライブをコントローラー<b>"%1"</b>に追加します。</p><p>仮想CD/DVDディスクをドライブに割り当てますか?空のドライブだけ割り当てますか?</p></translation>
</message>
@@ -9184,22 +9213,22 @@ p, li { white-space: pre-wrap; }
<translation type="obsolete">空のドライブ(&E)</translation>
</message>
<message>
- <location filename="../src/globals/UIMessageCenter.cpp" line="1046"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="1047"/>
<source><p>You are about to add a new floppy drive to controller <b>%1</b>.</p><p>Would you like to choose a virtual floppy disk to put in the drive or to leave it empty for now?</p></source>
<translation><p>フロッピードライブをコントローラー<b>"%1"</b>に追加します。</p><p>仮想フロッピーディスクをドライブに割り当てますか?空のドライブだけ割り当てますか?</p></translation>
</message>
<message>
- <location filename="../src/globals/UIMessageCenter.cpp" line="1293"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="1294"/>
<source>Failed to detach the hard disk (<nobr><b>%1</b></nobr>) from the slot <i>%2</i> of the machine <b>%3</b>.</source>
<translation>ハードディスク(<nobr><b>%1</b></nobr>)の、仮想マシン<b>"%3"</b>のスロット<i>"%2"</i> への割り当て解除に失敗しました。</translation>
</message>
<message>
- <location filename="../src/globals/UIMessageCenter.cpp" line="1299"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="1300"/>
<source>Failed to detach the CD/DVD device (<nobr><b>%1</b></nobr>) from the slot <i>%2</i> of the machine <b>%3</b>.</source>
<translation>CD/DVDデバイス(<nobr><b>%1</b></nobr>)の、仮想マシン<b>"%3"</b>のスロット<i>"%2"</i> への割り当て解除に失敗しました。</translation>
</message>
<message>
- <location filename="../src/globals/UIMessageCenter.cpp" line="1305"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="1306"/>
<source>Failed to detach the floppy device (<nobr><b>%1</b></nobr>) from the slot <i>%2</i> of the machine <b>%3</b>.</source>
<translation>フロッピーデバイス(<nobr><b>%1</b></nobr>)の、仮想マシン<b>"%3"</b>のスロット<i>"%2"</i> への割り当て解除に失敗しました。</translation>
</message>
@@ -9212,12 +9241,12 @@ p, li { white-space: pre-wrap; }
<translation type="obsolete">仮想アプライアンスのオープンに失敗しました。</translation>
</message>
<message>
- <location filename="../src/globals/UIMessageCenter.cpp" line="1543"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="1544"/>
<source>Failed to open/interpret appliance <b>%1</b>.</source>
<translation>仮想アプライアンス<b>"%1"</b>のオープンまたは解析に失敗しました。</translation>
</message>
<message>
- <location filename="../src/globals/UIMessageCenter.cpp" line="1551"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="1552"/>
<source>Failed to import appliance <b>%1</b>.</source>
<translation>仮想アプライアンス<b>"%1"</b>のインポートに失敗しました。</translation>
</message>
@@ -9232,8 +9261,8 @@ p, li { white-space: pre-wrap; }
<translation type="obsolete">仮想アプライアンスの作成に失敗しました。</translation>
</message>
<message>
- <location filename="../src/globals/UIMessageCenter.cpp" line="1587"/>
- <location filename="../src/globals/UIMessageCenter.cpp" line="1595"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="1588"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="1596"/>
<source>Failed to prepare the export of the appliance <b>%1</b>.</source>
<translation>仮想アプライアンス<b>"%1"</b>のエクスポートの前処理に失敗しました。</translation>
</message>
@@ -9242,42 +9271,42 @@ p, li { white-space: pre-wrap; }
<translation type="obsolete">仮想アプライアンスの作成に失敗しました。</translation>
</message>
<message>
- <location filename="../src/globals/UIMessageCenter.cpp" line="1603"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="1604"/>
<source>Failed to export appliance <b>%1</b>.</source>
<translation>仮想アプライアンス<b>"%1"</b>のエクスポートに失敗しました。</translation>
</message>
<message>
- <location filename="../src/globals/UIMessageCenter.cpp" line="903"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="904"/>
<source><p>Deleting this host-only network will remove the host-only interface this network is based on. Do you want to remove the (host-only network) interface <nobr><b>%1</b>?</nobr></p><p><b>Note:</b> this interface may be in use by one or more virtual network adapters belonging to one of your VMs. After it is removed, these adapters will no longer be usable until you correct their settings by either choosing a different in [...]
<translation><p>このインターフェースを除去すると、このインターフェースが基づいているホストオンリーネットワークインターフェースが削除されます。ホストオンリーネットワークインターフェース<nobr><b>%1</b></nobr>を削除しますか?</p><p><b>注:</b>このインターフェースは他の仮想ネットワークアダプターで使用しているかもしれません。削除した場合、それらのアダプターは、他のインターフェース名を選ぶか、別のアダプタータイプを選んで設定を変更するまで使用できません。</p></translation>
</message>
<message>
- <location filename="../src/globals/UIMessageCenter.cpp" line="2301"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="2318"/>
<source>A file named <b>%1</b> already exists. Are you sure you want to replace it?<br /><br />Replacing it will overwrite its contents.</source>
<translation>ファイル名<b>"%1"</b>はすでに使われています。ファイルを置き換えますか?<br /><br />ファイルの内容は上書きされます。</translation>
</message>
<message>
- <location filename="../src/globals/UIMessageCenter.cpp" line="1758"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="1759"/>
<source><p>VT-x/AMD-V hardware acceleration has been enabled, but is not operational. Certain guests (e.g. OS/2 and QNX) require this feature.</p><p>Please ensure that you have enabled VT-x/AMD-V properly in the BIOS of your host computer.</p></source>
<translation><p>仮想化支援機能(VT-x/AMD-V)が有効化されましたが使用できません。いくつかのゲストOS(OS/2やQNXなど))は本機能を必要とします。</p><p>ホストマシンのBIOS設定でVT-x/AMD-Vを有効化してください。</p></translation>
</message>
<message>
- <location filename="../src/globals/UIMessageCenter.cpp" line="788"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="789"/>
<source><p>You are about to restore snapshot <nobr><b>%1</b></nobr>.</p><p>You can create a snapshot of the current state of the virtual machine first by checking the box below; if you do not do this the current state will be permanently lost. Do you wish to proceed?</p></source>
<translation><p>スナップショット <b>%1</b> をリストアしようとしています。</p><p>現在の仮想マシンの状態から下にチェックを入れたところまでのスナップショットを作成することができます。もしこれをしないと、現在の状態が永久に失われてしまします。続行しますか?</p></translation>
</message>
<message>
- <location filename="../src/globals/UIMessageCenter.cpp" line="799"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="800"/>
<source><p>Are you sure you want to restore snapshot <nobr><b>%1</b></nobr>?</p></source>
<translation><p>本当にスナップショット <b>%1</b> をリストアしますか?</p></translation>
</message>
<message>
- <location filename="../src/globals/UIMessageCenter.cpp" line="1774"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="1775"/>
<source><p>Could not start the machine <b>%1</b> because the following physical network interfaces were not found:</p><p><b>%2</b></p><p>You can either change the machine's network settings or stop the machine.</p></source>
<translation><p>次の物理ネットワークインターフェースが見つからないので、仮想マシン<b>%1</b>を開始できません:</p><p><b>%2</b></p><p>マシンのネットワーク設定を変更するとか、マシンを停止してください。</p></translation>
</message>
<message>
- <location filename="../src/globals/UIMessageCenter.cpp" line="1779"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="1780"/>
<source>Change Network Settings</source>
<translation>ネットワーク設定の変更</translation>
</message>
@@ -9286,17 +9315,17 @@ p, li { white-space: pre-wrap; }
<translation type="obsolete">仮想マシンを閉じる</translation>
</message>
<message>
- <location filename="../src/globals/UIMessageCenter.cpp" line="525"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="526"/>
<source><p>You are trying to move machine <nobr><b>%1</b></nobr> to group <nobr><b>%2</b></nobr> which already have sub-group <nobr><b>%1</b></nobr>.</p><p>Please resolve this name-conflict and try again.</p></source>
<translation><p>マシン<nobr><b>%1</b></nobr>(すでにサブグループ<nobr><b>%1</b></nobr>に入っている)をグループ<nobr><b>%2</b></nobr>に移動しようとしています。</p><p>名前の衝突を回避し、もう一度実行してください。</p></translation>
</message>
<message>
- <location filename="../src/globals/UIMessageCenter.cpp" line="534"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="535"/>
<source><p>You are trying to move group <nobr><b>%1</b></nobr> to group <nobr><b>%2</b></nobr> which already have another item with the same name.</p><p>Would you like to automatically rename it?</p></source>
<translation><p>同じ名前で別のアイテムを持つグループ<nobr><b>%1</b></nobr>を<nobr><b>%2</b></nobr>に移動しようとしています。</p><p>自動的に名前を変更しますか?</p></translation>
</message>
<message>
- <location filename="../src/globals/UIMessageCenter.cpp" line="550"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="551"/>
<source>Failed to set groups of the virtual machine <b>%1</b>.</source>
<translation>仮想マシン<b>%1</b>のグループの設定に失敗しました。</translation>
</message>
@@ -9317,52 +9346,52 @@ p, li { white-space: pre-wrap; }
<translation type="obsolete"><p>VirtualBoxの登録に失敗しました。</p><p>%1</p></translation>
</message>
<message>
- <location filename="../src/globals/UIMessageCenter.cpp" line="1970"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="1987"/>
<source>Do you wish to cancel all current network operations?</source>
<translation>すべての現在のネットワーク操作をキャンセルしますか?</translation>
</message>
<message>
- <location filename="../src/globals/UIMessageCenter.cpp" line="691"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="692"/>
<source><p>Do you really want to reset the following virtual machines?</p><p><b>%1</b></p><p>This will cause any unsaved data in applications running inside it to be lost.</p></source>
<translation><p>以下の仮想マシンを本当にリセットしますか?</p><p><b>%1</b></p><p>仮想マシンをリセットすると、その中で稼動中のすべてのアプリケーションの保存されていないデータは失われます。</p></translation>
</message>
<message>
- <location filename="../src/globals/UIMessageCenter.cpp" line="702"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="703"/>
<source><p>Do you really want to send an ACPI shutdown signal to the following virtual machines?</p><p><b>%1</b></p></source>
<translation><p>以下の仮想マシンに本当にACPIシャットダウン信号を送りますか?</p><p><b>%1</b></p></translation>
</message>
<message>
- <location filename="../src/globals/UIMessageCenter.cpp" line="712"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="713"/>
<source><p>Do you really want to power off the following virtual machines?</p><p><b>%1</b></p><p>This will cause any unsaved data in applications running inside it to be lost.</p></source>
<translation><p>以下の仮想マシンを本当に電源オフしますか?</p><p><b>%1</b></p><p>仮想マシンを電源オフすると、その中で稼動中のすべてのアプリケーションの保存されていないデータは失われます。</p></translation>
</message>
<message>
- <location filename="../src/globals/UIMessageCenter.cpp" line="1559"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="1560"/>
<source>Failed to check files.</source>
<translation>ファイルの確認に失敗しました。</translation>
</message>
<message>
- <location filename="../src/globals/UIMessageCenter.cpp" line="1566"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="1567"/>
<source>Failed to remove file.</source>
<translation>ファイルの除去に失敗しました。</translation>
</message>
<message>
- <location filename="../src/globals/UIMessageCenter.cpp" line="358"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="359"/>
<source>You seem to have the USBFS filesystem mounted at /sys/bus/usb/drivers. We strongly recommend that you change this, as it is a severe mis-configuration of your system which could cause USB devices to fail in unexpected ways.</source>
<translation>USBFS ファイルシステムを/sys/bus/usb/driversにマウントしています。これを変更することを強く勧めます。誤ったシステム構成によりUSB デバイスの使用に失敗するかもしれません。</translation>
</message>
<message>
- <location filename="../src/globals/UIMessageCenter.cpp" line="382"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="383"/>
<source>You are running an EXPERIMENTAL build of VirtualBox. This version is not suitable for production use.</source>
<translation>これはVirtualBoxの試験的ビルドです。このバージョンは実務作業には適していません。</translation>
</message>
<message>
- <location filename="../src/globals/UIMessageCenter.cpp" line="1747"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="1748"/>
<source><p>VT-x/AMD-V hardware acceleration is not available on your system. Your 64-bit guest will fail to detect a 64-bit CPU and will not be able to boot.</source>
<translation><p>ホストマシンの仮想化支援機能(VT-x/AMD-V)が使用できません。64ビット ゲストOSは64ビットCPUを検出できず、起動できません。</translation>
</message>
<message>
- <location filename="../src/globals/UIMessageCenter.cpp" line="1765"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="1766"/>
<source><p>VT-x/AMD-V hardware acceleration is not available on your system. Certain guests (e.g. OS/2 and QNX) require this feature and will fail to boot without it.</p></source>
<translation><p>ホストマシンの仮想化支援機能(VT-x/AMD-V)が使用できません。本機能を必要とするいくつかのゲストOS(OS/2やQNXなど)は起動できません。</p></translation>
</message>
@@ -9371,53 +9400,53 @@ p, li { white-space: pre-wrap; }
<translation type="obsolete"><p>スナップショット<b>"%1"</b>に復元しますか?現在の仮想マシンの状態は失われ、それを回復することはできません。</p></translation>
</message>
<message>
- <location filename="../src/globals/UIMessageCenter.cpp" line="797"/>
- <location filename="../src/globals/UIMessageCenter.cpp" line="806"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="798"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="807"/>
<source>Restore</source>
<translation>復元</translation>
</message>
<message>
- <location filename="../src/globals/UIMessageCenter.cpp" line="812"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="813"/>
<source><p>Deleting the snapshot will cause the state information saved in it to be lost, and disk data spread over several image files that VirtualBox has created together with the snapshot will be merged into one file. This can be a lengthy process, and the information in the snapshot cannot be recovered.</p></p>Are you sure you want to delete the selected snapshot <b>%1</b>?</p></source>
<translation><p>スナップショットを削除すると、スナップショットに格納されている情報は失われ、VirtualBoxがスナップショットと共に作成した複数のディスクデータはひとつのファイルにマージされます。これには長い時間がかかるかもしれません。そしてスナップショットの情報を回復することはできません。</p><p>スナップショット<b>"%1"</b>を削除しますか?。</p></translation>
</message>
<message>
- <location filename="../src/globals/UIMessageCenter.cpp" line="818"/>
- <location filename="../src/globals/UIMessageCenter.cpp" line="833"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="819"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="834"/>
<source>Delete</source>
<translation>削除</translation>
</message>
<message>
- <location filename="../src/globals/UIMessageCenter.cpp" line="827"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="828"/>
<source><p>Deleting the snapshot %1 will temporarily need more disk space. In the worst case the size of image %2 will grow by %3, however on this filesystem there is only %4 free.</p><p>Running out of disk space during the merge operation can result in corruption of the image and the VM configuration, i.e. loss of the VM and its data.</p><p>You may continue with deleting the snapshot at your own risk.</p></source>
<translation><p>スナップショット %1の削除には多くのディスク容量を必要とします。ディスクイメージファイル %2のサイズは最大で%3まで増加します。しかし、ディスクの空き容量は%4しかありません。</p><p>マージ作業中にディスク容量が不足すると、仮想マシンのデータを失う可能性があります。</p><p>スナップショットの削除を自己責任で続行できます。</p></translation>
</message>
<message>
- <location filename="../src/globals/UIMessageCenter.cpp" line="855"/>
- <location filename="../src/globals/UIMessageCenter.cpp" line="864"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="856"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="865"/>
<source>Failed to restore the snapshot <b>%1</b> of the virtual machine <b>%2</b>.</source>
<translation>仮想マシン<b>"%2"</b>のスナップショット<b>"%1"</b>への復元に失敗しました。</translation>
</message>
<message>
- <location filename="../src/globals/UIMessageCenter.cpp" line="873"/>
- <location filename="../src/globals/UIMessageCenter.cpp" line="881"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="874"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="882"/>
<source>Failed to delete the snapshot <b>%1</b> of the virtual machine <b>%2</b>.</source>
<translation>仮想マシン<b>"%2"</b>のスナップショット<b>"%1"</b>の削除に失敗しました。</translation>
</message>
<message>
- <location filename="../src/globals/UIMessageCenter.cpp" line="1833"/>
- <location filename="../src/globals/UIMessageCenter.cpp" line="1846"/>
- <location filename="../src/globals/UIMessageCenter.cpp" line="1859"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="1834"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="1847"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="1860"/>
<source>Switch</source>
<translation>切り替え</translation>
</message>
<message>
- <location filename="../src/globals/UIMessageCenter.cpp" line="1897"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="1898"/>
<source><p>Could not change the guest screen to this host screen due to insufficient guest video memory.</p><p>You should configure the virtual machine to have at least <b>%1</b> of video memory.</p></source>
<translation><p>ビデオメモリー不足のため、ゲスト スクリーンをこのホスト スクリーンに変更できません。</p><p>仮想マシンの構成で<b>%1</b>以上のビデオメモリーを指定してください。</p></translation>
</message>
<message>
- <location filename="../src/globals/UIMessageCenter.cpp" line="1886"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="1887"/>
<source><p>Could not change the guest screen to this host screen due to insufficient guest video memory.</p><p>You should configure the virtual machine to have at least <b>%1</b> of video memory.</p><p>Press <b>Ignore</b> to switch the screen anyway or press <b>Cancel</b> to cancel the operation.</p></source>
<translation><p>ビデオメモリー不足のため、ゲスト スクリーンをこのホスト スクリーンに変更できません。</p><p>仮想マシンの構成で<b>%1</b>以上のビデオメモリーを指定してください。</p><p><b>[無視]</b>ボタンをクリックしするとスクリーンを強制的に切り換えます。<b>[キャンセル]</b>ボタンをクリックすると操作は取り消されます。</p></translation>
</message>
@@ -9448,12 +9477,12 @@ p, li { white-space: pre-wrap; }
<translation type="obsolete"><p>新規の割り当てに利用できる未使用のメディアがありません。</p><p><b>[選択]</b>ボタンをクリックして、<i>仮想メディアマネージャー</i>を開いてください。</p></translation>
</message>
<message>
- <location filename="../src/globals/UIMessageCenter.cpp" line="1057"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="1058"/>
<source><p>Are you sure you want to delete the CD/DVD device?</p><p>You will not be able to insert any CDs or ISO images or install the Guest Additions without it!</p></source>
<translation><p>CD/DVD デバイスを削除しますか?</p><p>デバイスがない場合、CD/DVDメディアやISOイメージファイルのマウントおよびGuest Additions のインストールはできません!</p></translation>
</message>
<message>
- <location filename="../src/globals/UIMessageCenter.cpp" line="1061"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="1062"/>
<source>&Remove</source>
<comment>medium</comment>
<translation>除去(&R)</translation>
@@ -9483,7 +9512,7 @@ p, li { white-space: pre-wrap; }
<translation type="obsolete">メディアを強制マウント解除しますか?</translation>
</message>
<message>
- <location filename="../src/globals/UIMessageCenter.cpp" line="1363"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="1364"/>
<source>Force Unmount</source>
<translation>強制マウント解除</translation>
</message>
@@ -9520,7 +9549,7 @@ p, li { white-space: pre-wrap; }
<translation type="obsolete"><p>VirtualBox ユーザーマニュアルを<nobr><a href="%1">%2</a></nobr>からダウンロードしましたが、<nobr><b>%3</b></nobr>に保存できません。</p><p>他の保存場所を選択してください。</p></translation>
</message>
<message>
- <location filename="../src/globals/UIMessageCenter.cpp" line="2097"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="2114"/>
<source><p>You have an old version (%1) of the <b><nobr>%2</nobr></b> installed.</p><p>Do you wish to download latest one from the Internet?</p></source>
<translation><p> <b><nobr>%2</nobr></b> の古いバージョン(%1)がインストールされています。</p><p>最新版をインターネットからダウンロードしますか?</p></translation>
</message>
@@ -9530,7 +9559,7 @@ p, li { white-space: pre-wrap; }
<translation type="obsolete">ダウンロード</translation>
</message>
<message>
- <location filename="../src/globals/UIMessageCenter.cpp" line="1992"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="2009"/>
<source><p>You have version %1 of the <b><nobr>%2</nobr></b> installed.</p><p>You should download and install version %3 of this extension pack from Oracle!</p></source>
<translation><p> <b><nobr>%2</nobr></b> のバージョン %1 がインストールされています。</p><p>Oracleからバージョン %3 の拡張機能をダウンロードし、インストールしてください!</p></translation>
</message>
@@ -9540,24 +9569,24 @@ p, li { white-space: pre-wrap; }
<translation type="obsolete">OK</translation>
</message>
<message>
- <location filename="../src/globals/UIMessageCenter.cpp" line="2107"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="2124"/>
<source><p>Are you sure you want to download the <b><nobr>%1</nobr></b> from <nobr><a href="%2">%2</a></nobr> (size %3 bytes)?</p></source>
<translation><p><nobr><a href="%2">%2</a></nobr> から <b><nobr>%1</nobr></b>をダウンロードをしますか (サイズ %3 bytes) ?</p></translation>
</message>
<message>
- <location filename="../src/globals/UIMessageCenter.cpp" line="2127"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="2144"/>
<source><p>The <b><nobr>%1</nobr></b> has been successfully downloaded from <nobr><a href="%2">%2</a></nobr> and saved locally as <nobr><b>%3</b>.</nobr></p><p>Do you wish to install this extension pack?</p></source>
<translation><p><nobr><a href="%2">%2</a></nobr> から<b><nobr>%1</nobr></b>のダウンロードに成功し、<nobr><b>%3</b> として保存しました。</nobr></p><p>拡張機能パックをインストールしますか?</p></translation>
</message>
<message>
- <location filename="../src/globals/UIMessageCenter.cpp" line="2133"/>
- <location filename="../src/globals/UIMessageCenter.cpp" line="2151"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="2150"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="2168"/>
<source>Install</source>
<comment>extension pack</comment>
<translation>インストール</translation>
</message>
<message>
- <location filename="../src/globals/UIMessageCenter.cpp" line="2117"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="2134"/>
<source><p>The <b><nobr>%1</nobr></b> has been successfully downloaded from <nobr><a href="%2">%2</a></nobr> but can't be saved locally as <nobr><b>%3</b>.</nobr></p><p>Please choose another location for that file.</p></source>
<translation><p><nobr><a href="%2">%2</a></nobr>から<b><nobr>%1</nobr></b> のダウンロードに成功しましたが、<nobr><b>%3</b> として保存することができませんでした。</nobr></p><p>ほかの場所を選択してください。</p></translation>
</message>
@@ -9571,17 +9600,17 @@ p, li { white-space: pre-wrap; }
<translation type="obsolete"><p>次のVirtualBox設定ファイルは古い形式から新バージョンのVirtualBoxが必要とする新しい形式に自動的に変更されます。</p><p><b>[OK]</b>ボタンをクリックしてVirtualBoxを起動するか、設定ファイルの変更を行わずにVirtualBoxアプリケーションを終了させたいなら<b>[終了]</b>ボタンをクリックしてください。</p></translation>
</message>
<message>
- <location filename="../src/globals/UIMessageCenter.cpp" line="1826"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="1827"/>
<source><p>The virtual machine window will be now switched to <b>fullscreen</b> mode. You can go back to windowed mode at any time by pressing <b>%1</b>.</p><p>Note that the <i>Host</i> key is currently defined as <b>%2</b>.</p><p>Note that the main menu bar is hidden in fullscreen mode. You can access it by pressing <b>Host+Home</b>.</p></source>
<translation><p>仮想マシンのウィンドウを"フルスクリーン"モードに切り替えます。<b>%1</b>キーを押すといつでもウィンドウモードに戻ることができます。</p><p>注:<i>ホスト</i>キーは現在<b>%2</b>に割り当てられています。</p><p>注:フルスクリーンモードではメインメニューバーは表示されません。メニューバーにアクセスするには <b>ホスト+Home</b>キーを押してください。</p></translation>
</message>
<message>
- <location filename="../src/globals/UIMessageCenter.cpp" line="1839"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="1840"/>
<source><p>The virtual machine window will be now switched to <b>Seamless</b> mode. You can go back to windowed mode at any time by pressing <b>%1</b>.</p><p>Note that the <i>Host</i> key is currently defined as <b>%2</b>.</p><p>Note that the main menu bar is hidden in seamless mode. You can access it by pressing <b>Host+Home</b>.</p></source>
<translation><p>仮想マシンのウィンドウを"シームレス"モードに切り替えます。<b>%1</b>キーを押すといつでもウィンドウ表示に戻ることができます。</p><p>注:<i>ホスト</i>キーは現在<b>%2</b>に割り当てられています。</p><p>注:シームレスモードではメインメニューバーは表示されません。メニューバーにアクセスするには <b>ホスト+Home</b>キーを押してください。</p></translation>
</message>
<message>
- <location filename="../src/globals/UIMessageCenter.cpp" line="1852"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="1853"/>
<source><p>The virtual machine window will be now switched to <b>Scale</b> mode. You can go back to windowed mode at any time by pressing <b>%1</b>.</p><p>Note that the <i>Host</i> key is currently defined as <b>%2</b>.</p><p>Note that the main menu bar is hidden in scaled mode. You can access it by pressing <b>Host+Home</b>.</p></source>
<translation><p>仮想マシンのウィンドウを"スケール"モードに切り替えます。<b>%1</b>キーを押すといつでもウィンドウ表示に戻ることができます。</p><p>注:<i>ホスト</i>キーは現在<b>%2</b>に割り当てられています。</p><p>注:スケールモードではメインメニューバーは表示されません。メニューバーにアクセスするには <b>ホスト+Home</b>キーを押してください。</p></translation>
</message>
@@ -9591,34 +9620,34 @@ p, li { white-space: pre-wrap; }
<translation type="obsolete">切り替え</translation>
</message>
<message>
- <location filename="../src/globals/UIMessageCenter.cpp" line="706"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="707"/>
<source>ACPI Shutdown</source>
<comment>machine</comment>
<translation>ACPI シャットダウン</translation>
</message>
<message>
- <location filename="../src/globals/UIMessageCenter.cpp" line="717"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="718"/>
<source>Power Off</source>
<comment>machine</comment>
<translation>電源オフ</translation>
</message>
<message>
- <location filename="../src/globals/UIMessageCenter.cpp" line="1508"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="1509"/>
<source><p>Cannot remove the machine folder <nobr><b>%1</b>.</nobr></p><p>Please check that this folder really exists and that you have permissions to remove it.</p></source>
<translation><p>仮想マシンのフォルダー<nobr><b>%1</b>を除去できません。</nobr></p><p>このフォルダーが本当に存在し、除去する権限があるか確認してください。</p></translation>
</message>
<message>
- <location filename="../src/globals/UIMessageCenter.cpp" line="1517"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="1518"/>
<source><p>Cannot create the machine folder <b>%1</b> in the parent folder <nobr><b>%2</b>.</nobr></p><p>This folder already exists and possibly belongs to another machine.</p></source>
<translation><p>仮想マシンのフォルダー<b>%1</b>を親フォルダー<nobr><b>%2</b>に作成できません。</nobr></p><p>このフォルダーはすでに存在し、ほかマシンに属している可能性があります。</p></translation>
</message>
<message>
- <location filename="../src/globals/UIMessageCenter.cpp" line="1526"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="1527"/>
<source><p>Cannot create the machine folder <b>%1</b> in the parent folder <nobr><b>%2</b>.</nobr></p><p>Please check that the parent really exists and that you have permissions to create the machine folder.</p></source>
<translation><p>仮想マシンフォルダー<b>%1</b>を親フォルダー<nobr><b>%2</b>に作成できません。</nobr></p><p>親フォルダーの存在と、フォルダー作成に必要な権限の有無を確認してください。</p></translation>
</message>
<message>
- <location filename="../src/globals/UIMessageCenter.cpp" line="1431"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="1432"/>
<source>You are about to create a new virtual machine without a hard drive. You will not be able to install an operating system on the machine until you add one. In the mean time you will only be able to start the machine using a virtual optical disk or from the network.</source>
<translation>ハードドライブなしで新しい仮想マシンを作成しようとしています。それを追加するまではオペレーティングシステムをインストールすることはできません。仮想光学ディスクか、ネットワークから起動することしかできないことを意味します。</translation>
</message>
@@ -9630,13 +9659,13 @@ p, li { white-space: pre-wrap; }
</translation>
</message>
<message>
- <location filename="../src/globals/UIMessageCenter.cpp" line="2225"/>
- <location filename="../src/globals/UIMessageCenter.cpp" line="2232"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="2242"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="2249"/>
<source>Failed to open the Extension Pack <b>%1</b>.</source>
<translation>機能拡張パッケージ<b>"%1"</b>のオープンに失敗しました。</translation>
</message>
<message>
- <location filename="../src/globals/UIMessageCenter.cpp" line="2140"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="2157"/>
<source><p>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.</p><p><table cellpadding=0 cellspacing=0><tr><td><b>Name: </b></td><td>%1< [...]
<translation><p>VirtualBox 機能拡張パッケージをインストールします。機能拡張パッケージはVirtualBoxに機能を追加しますが、コンピューターに危害を与えるようなシステムレベルのソフトウェアを含んでいる可能性があります。信頼できる発行元から機能拡張パッケージを入手した場合に限り、以下の内容を確認して、処理を続行してください。</p><p><table cellpadding=0 cellspacing=0><tr><td><b>名前: </b></td><td>%1</td></tr><tr><td><b>バージョン: </b></td><td>%2</td></tr><tr><td>< [...]
</message>
@@ -9645,47 +9674,47 @@ p, li { white-space: pre-wrap; }
<translation type="obsolete">インストール(&I)</translation>
</message>
<message>
- <location filename="../src/globals/UIMessageCenter.cpp" line="2159"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="2176"/>
<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>機能拡張パッケージはVirtualBoxに機能を追加しますが、システムに危害を与えるシステムレベルのソフトウェアを含むこともできます。信頼できる発行元から機能拡張パッケージを入手した場合に限り、以下の内容を確認して、処理を続行してください。</translation>
</message>
<message>
- <location filename="../src/globals/UIMessageCenter.cpp" line="2173"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="2190"/>
<source><p>An older version of the extension pack is already installed, would you like to upgrade? <p>%1</p><p><table cellpadding=0 cellspacing=0><tr><td><b>Name: </b></td><td>%2</td></tr><tr><td><b>New Version: </b></td><td>%3</td></tr><tr><td><b>Current Version: </b></td& [...]
<translation><p>古いバージョンの機能拡張パッケージがインストールされています。アップグレードしますか?<p>%1</p><p><table cellpadding=0 cellspacing=0><tr><td><b>名前: </b></td><td>%2</td></tr><tr><td><b>バージョン: </b></td><td>%3</td></tr><tr><td><b>現在のバージョン: </b></td><td>%4</td></tr><tr><td&g [...]
</message>
<message>
- <location filename="../src/globals/UIMessageCenter.cpp" line="2183"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="2200"/>
<source>&Upgrade</source>
<translation>アップグレード(&U)</translation>
</message>
<message>
- <location filename="../src/globals/UIMessageCenter.cpp" line="2186"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="2203"/>
<source><p>An newer version of the extension pack is already installed, would you like to downgrade? <p>%1</p><p><table cellpadding=0 cellspacing=0><tr><td><b>Name: </b></td><td>%2</td></tr><tr><td><b>New Version: </b></td><td>%3</td></tr><tr><td><b>Current Version: </b></t [...]
<translation><p>新しいバージョンの機能拡張パッケージがインストールされています。ダウングレードしますか?<p>%1</p><p><table cellpadding=0 cellspacing=0><tr><td><b>名前: </b></td><td>%2</td></tr><tr><td><b>バージョン: </b></td><td>%3</td></tr><tr><td><b>現在のバージョン: </b></td><td>%4</td></tr><tr><td& [...]
</message>
<message>
- <location filename="../src/globals/UIMessageCenter.cpp" line="2196"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="2213"/>
<source>&Downgrade</source>
<translation>ダウングレード(&D)</translation>
</message>
<message>
- <location filename="../src/globals/UIMessageCenter.cpp" line="2199"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="2216"/>
<source><p>The extension pack is already installed with the same version, would you like reinstall it? <p>%1</p><p><table cellpadding=0 cellspacing=0><tr><td><b>Name: </b></td><td>%2</td></tr><tr><td><b>Version: </b></td><td>%3</td></tr><tr><td><b>Description: </b></td>& [...]
<translation><p>同じバージョンの機能拡張パッケージがインストールされています。再インストールしますか?<p>%1</p><p><table cellpadding=0 cellspacing=0><tr><td><b>名前: </b></td><td>%2</td></tr><tr><td><b>バージョン: </b></td><td>%3</td></tr><tr><td><b>説明: </b></td><td>%4</td></tr></table></p> [...]
</message>
<message>
- <location filename="../src/globals/UIMessageCenter.cpp" line="2208"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="2225"/>
<source>&Reinstall</source>
<translation>再インストール(&R)</translation>
</message>
<message>
- <location filename="../src/globals/UIMessageCenter.cpp" line="2215"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="2232"/>
<source><p>You are about to remove the VirtualBox extension pack <b>%1</b>.</p><p>Are you sure you want to proceed?</p></source>
<translation><p> VirtualBox 機能拡張パッケージ"<b>%1</b>"を除去します。</p><p>続行しますか?</p></translation>
</message>
<message>
- <location filename="../src/globals/UIMessageCenter.cpp" line="2271"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="2288"/>
<source>The extension pack <br><nobr><b>%1</b><nobr><br> was installed successfully.</source>
<translation>機能拡張パッケージ<br><nobr><b>%1</b><nobr><br>のインストールに成功しました。</translation>
</message>
@@ -9715,8 +9744,8 @@ p, li { white-space: pre-wrap; }
<translation type="obsolete">フロッピーイメージ</translation>
</message>
<message>
- <location filename="../src/globals/UIMessageCenter.cpp" line="2279"/>
- <location filename="../src/globals/UIMessageCenter.cpp" line="2286"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="2296"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="2303"/>
<source>Failed to drop data.</source>
<translation>データのドロップに失敗しました。</translation>
</message>
@@ -9725,27 +9754,27 @@ p, li { white-space: pre-wrap; }
<translation type="obsolete"><p>この仮想マシンでUSB 2.0を有効にするには<b><nobr>%1</nobr></b>のインストールが必要です。</p><p>VirtualBoxのダウンロードサイトから機能拡張パッケージをダウンロードし、インストールしてください。機能拡張パッケージをインストールすると、USB 2.0を有効にすることができます。現在の設定をキャンセルしない場合、USB 2.0は無効にします。</p></translation>
</message>
<message>
- <location filename="../src/globals/UIMessageCenter.cpp" line="2573"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="2590"/>
<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>USBプロキシーサービスが読み込めません (VERR_FILE_NOT_FOUND)。このサービスはホストコンピューターにインストールされている必要があります</translation>
</message>
<message>
- <location filename="../src/globals/UIMessageCenter.cpp" line="2574"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="2591"/>
<source>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</source>
<translation>VirtualBoxは現在USBデバイスへのアクセスが許可されていません。ユーザーを'vboxusers'グループに追加してください。詳細な説明はユーザーマニュアルをお読みください</translation>
</message>
<message>
- <location filename="../src/globals/UIMessageCenter.cpp" line="2575"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="2592"/>
<source>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</source>
<translation>VirtualBoxは現在USBデバイスへのアクセスが許可されていません。ユーザーを'usbfs'フォルダーとファイルに追加してください。詳細な説明はユーザーマニュアルをお読みください</translation>
</message>
<message>
- <location filename="../src/globals/UIMessageCenter.cpp" line="2576"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="2593"/>
<source>The USB Proxy Service has not yet been ported to this host</source>
<translation>USB プロキシーサービスはこのホストにはまだ移植されていません</translation>
</message>
<message>
- <location filename="../src/globals/UIMessageCenter.cpp" line="2577"/>
+ <location filename="../src/globals/UIMessageCenter.cpp" line="2594"/>
<source>Could not load the Host USB Proxy service</source>
<translation>ホストのUSB プロキシーサービスを読み込むことができません</translation>
</message>
@@ -9841,12 +9870,12 @@ p, li { white-space: pre-wrap; }
<context>
<name>UIMultiScreenLayout</name>
<message>
- <location filename="../src/runtime/UIMultiScreenLayout.cpp" line="329"/>
+ <location filename="../src/runtime/UIMultiScreenLayout.cpp" line="330"/>
<source>Virtual Screen %1</source>
<translation>仮想スクリーン %1</translation>
</message>
<message>
- <location filename="../src/runtime/UIMultiScreenLayout.cpp" line="336"/>
+ <location filename="../src/runtime/UIMultiScreenLayout.cpp" line="337"/>
<source>Use Host Screen %1</source>
<translation>ホスト スクリーン %1 を使う</translation>
</message>
@@ -9958,32 +9987,32 @@ p, li { white-space: pre-wrap; }
<context>
<name>UINetworkReplyPrivate</name>
<message>
- <location filename="../src/net/UINetworkReply.cpp" line="566"/>
+ <location filename="../src/net/UINetworkReply.cpp" line="560"/>
<source>Host not found</source>
<translation>ホストが見つかりません</translation>
</message>
<message>
- <location filename="../src/net/UINetworkReply.cpp" line="568"/>
+ <location filename="../src/net/UINetworkReply.cpp" line="562"/>
<source>Content access denied</source>
<translation>内容へのアクセスを拒否されました</translation>
</message>
<message>
- <location filename="../src/net/UINetworkReply.cpp" line="570"/>
+ <location filename="../src/net/UINetworkReply.cpp" line="564"/>
<source>Protocol failure</source>
<translation>プロトコル失敗</translation>
</message>
<message>
- <location filename="../src/net/UINetworkReply.cpp" line="572"/>
+ <location filename="../src/net/UINetworkReply.cpp" line="566"/>
<source>Wrong SSL certificate format</source>
<translation>誤ったSSL証明書のフォーマット</translation>
</message>
<message>
- <location filename="../src/net/UINetworkReply.cpp" line="574"/>
+ <location filename="../src/net/UINetworkReply.cpp" line="568"/>
<source>SSL authentication failed</source>
<translation>SSL認証に失敗</translation>
</message>
<message>
- <location filename="../src/net/UINetworkReply.cpp" line="576"/>
+ <location filename="../src/net/UINetworkReply.cpp" line="570"/>
<source>Unknown reason</source>
<translation>原因不明</translation>
</message>
@@ -10855,7 +10884,7 @@ step and attach hard disks later using the VM Settings dialog.</p></source
<translation type="obsolete">インストール</translation>
</message>
<message>
- <location filename="../src/runtime/UISession.cpp" line="544"/>
+ <location filename="../src/runtime/UISession.cpp" line="545"/>
<source>Updating Guest Additions</source>
<translation>Guest Additions をアップデートしています</translation>
</message>
@@ -13369,7 +13398,7 @@ Version %1</source>
<message>
<location filename="../src/widgets/VBoxFilePathSelectorWidget.cpp" line="284"/>
<source>The actual default path value will be displayed after accepting the changes and opening this window again.</source>
- <translation type="unfinished"></translation>
+ <translation>変更後、再度このダイアログを開くとデフォルトパスが表示されます。</translation>
</message>
<message>
<location filename="../src/widgets/VBoxFilePathSelectorWidget.cpp" line="289"/>
@@ -13493,43 +13522,43 @@ Version %1</source>
<translation type="obsolete">差分</translation>
</message>
<message>
- <location filename="../src/globals/VBoxGlobal.cpp" line="976"/>
+ <location filename="../src/globals/VBoxGlobal.cpp" line="1007"/>
<source>Unknown device %1:%2</source>
<comment>USB device details</comment>
<translation>不明なデバイス %1:%2</translation>
</message>
<message>
- <location filename="../src/globals/VBoxGlobal.cpp" line="1001"/>
+ <location filename="../src/globals/VBoxGlobal.cpp" line="1032"/>
<source><nobr>Vendor ID: %1</nobr><br><nobr>Product ID: %2</nobr><br><nobr>Revision: %3</nobr></source>
<comment>USB device tooltip</comment>
<translation><nobr>ベンダーID: %1</nobr><br><nobr>プロダクトID: %2</nobr><br><nobr>リビジョン: %3</nobr></translation>
</message>
<message>
- <location filename="../src/globals/VBoxGlobal.cpp" line="1010"/>
+ <location filename="../src/globals/VBoxGlobal.cpp" line="1041"/>
<source><br><nobr>Serial No. %1</nobr></source>
<comment>USB device tooltip</comment>
<translation><br><nobr>シリアルNo. %1</nobr></translation>
</message>
<message>
- <location filename="../src/globals/VBoxGlobal.cpp" line="1017"/>
+ <location filename="../src/globals/VBoxGlobal.cpp" line="1048"/>
<source><br><nobr>State: %1</nobr></source>
<comment>USB device tooltip</comment>
<translation><br><nobr>状態: %1</nobr></translation>
</message>
<message>
- <location filename="../src/globals/VBoxGlobal.cpp" line="1112"/>
+ <location filename="../src/globals/VBoxGlobal.cpp" line="1159"/>
<source>Name</source>
<comment>details report</comment>
<translation>名前</translation>
</message>
<message>
- <location filename="../src/globals/VBoxGlobal.cpp" line="1114"/>
+ <location filename="../src/globals/VBoxGlobal.cpp" line="1161"/>
<source>OS Type</source>
<comment>details report</comment>
<translation>OSタイプ</translation>
</message>
<message>
- <location filename="../src/globals/VBoxGlobal.cpp" line="1184"/>
+ <location filename="../src/globals/VBoxGlobal.cpp" line="1231"/>
<source>Base Memory</source>
<comment>details report</comment>
<translation>メインメモリー</translation>
@@ -13540,13 +13569,13 @@ Version %1</source>
<translation type="obsolete"><nobr>%3 MB</nobr></translation>
</message>
<message>
- <location filename="../src/globals/VBoxGlobal.cpp" line="1121"/>
+ <location filename="../src/globals/VBoxGlobal.cpp" line="1168"/>
<source>General</source>
<comment>details report</comment>
<translation>一般</translation>
</message>
<message>
- <location filename="../src/globals/VBoxGlobal.cpp" line="1220"/>
+ <location filename="../src/globals/VBoxGlobal.cpp" line="1267"/>
<source>Video Memory</source>
<comment>details report</comment>
<translation>ビデオメモリー</translation>
@@ -13557,19 +13586,19 @@ Version %1</source>
<translation type="obsolete"><nobr>%4 MB</nobr></translation>
</message>
<message>
- <location filename="../src/globals/VBoxGlobal.cpp" line="1193"/>
+ <location filename="../src/globals/VBoxGlobal.cpp" line="1240"/>
<source>Boot Order</source>
<comment>details report</comment>
<translation>起動順序</translation>
</message>
<message>
- <location filename="../src/globals/VBoxGlobal.cpp" line="1195"/>
+ <location filename="../src/globals/VBoxGlobal.cpp" line="1242"/>
<source>ACPI</source>
<comment>details report</comment>
<translation>ACPI</translation>
</message>
<message>
- <location filename="../src/globals/VBoxGlobal.cpp" line="1196"/>
+ <location filename="../src/globals/VBoxGlobal.cpp" line="1243"/>
<source>I/O APIC</source>
<comment>details report</comment>
<translation>I/O APIC</translation>
@@ -13585,25 +13614,25 @@ Version %1</source>
<translation type="obsolete">ハードディスク</translation>
</message>
<message>
- <location filename="../src/globals/VBoxGlobal.cpp" line="1152"/>
+ <location filename="../src/globals/VBoxGlobal.cpp" line="1199"/>
<source>Enabled</source>
<comment>details report (ACPI)</comment>
<translation>有効</translation>
</message>
<message>
- <location filename="../src/globals/VBoxGlobal.cpp" line="1153"/>
+ <location filename="../src/globals/VBoxGlobal.cpp" line="1200"/>
<source>Disabled</source>
<comment>details report (ACPI)</comment>
<translation>無効</translation>
</message>
<message>
- <location filename="../src/globals/VBoxGlobal.cpp" line="1157"/>
+ <location filename="../src/globals/VBoxGlobal.cpp" line="1204"/>
<source>Enabled</source>
<comment>details report (I/O APIC)</comment>
<translation>有効</translation>
</message>
<message>
- <location filename="../src/globals/VBoxGlobal.cpp" line="1158"/>
+ <location filename="../src/globals/VBoxGlobal.cpp" line="1205"/>
<source>Disabled</source>
<comment>details report (I/O APIC)</comment>
<translation>無効</translation>
@@ -13649,50 +13678,50 @@ Version %1</source>
<translation type="obsolete">CD/DVD</translation>
</message>
<message>
- <location filename="../src/globals/VBoxGlobal.cpp" line="1362"/>
+ <location filename="../src/globals/VBoxGlobal.cpp" line="1409"/>
<source>Disabled</source>
<comment>details report (audio)</comment>
<translation>無効</translation>
</message>
<message>
- <location filename="../src/globals/VBoxGlobal.cpp" line="1368"/>
+ <location filename="../src/globals/VBoxGlobal.cpp" line="1415"/>
<source>Audio</source>
<comment>details report</comment>
<translation>オーディオ</translation>
</message>
<message>
<location filename="../src/VBoxVMInformationDlg.cpp" line="695"/>
- <location filename="../src/globals/VBoxGlobal.cpp" line="1408"/>
+ <location filename="../src/globals/VBoxGlobal.cpp" line="1455"/>
<source>Adapter %1</source>
<comment>details report (network)</comment>
<translation>アダプター %1</translation>
</message>
<message>
- <location filename="../src/globals/VBoxGlobal.cpp" line="1417"/>
+ <location filename="../src/globals/VBoxGlobal.cpp" line="1464"/>
<source>Disabled</source>
<comment>details report (network)</comment>
<translation>無効</translation>
</message>
<message>
- <location filename="../src/globals/VBoxGlobal.cpp" line="1425"/>
+ <location filename="../src/globals/VBoxGlobal.cpp" line="1472"/>
<source>Network</source>
<comment>details report</comment>
<translation>ネットワーク</translation>
</message>
<message>
- <location filename="../src/globals/VBoxGlobal.cpp" line="1534"/>
+ <location filename="../src/globals/VBoxGlobal.cpp" line="1581"/>
<source>Device Filters</source>
<comment>details report (USB)</comment>
<translation>デバイスフィルター</translation>
</message>
<message>
- <location filename="../src/globals/VBoxGlobal.cpp" line="1535"/>
+ <location filename="../src/globals/VBoxGlobal.cpp" line="1582"/>
<source>%1 (%2 active)</source>
<comment>details report (USB)</comment>
<translation>%1 (%2 アクティブ)</translation>
</message>
<message>
- <location filename="../src/globals/VBoxGlobal.cpp" line="1540"/>
+ <location filename="../src/globals/VBoxGlobal.cpp" line="1587"/>
<source>Disabled</source>
<comment>details report (USB)</comment>
<translation>無効</translation>
@@ -14055,31 +14084,31 @@ Version %1</source>
<translation type="obsolete">ファイルを選択</translation>
</message>
<message>
- <location filename="../src/globals/VBoxGlobal.cpp" line="1453"/>
+ <location filename="../src/globals/VBoxGlobal.cpp" line="1500"/>
<source>Port %1</source>
<comment>details report (serial ports)</comment>
<translation>ポート %1</translation>
</message>
<message>
- <location filename="../src/globals/VBoxGlobal.cpp" line="1462"/>
+ <location filename="../src/globals/VBoxGlobal.cpp" line="1509"/>
<source>Disabled</source>
<comment>details report (serial ports)</comment>
<translation>無効</translation>
</message>
<message>
- <location filename="../src/globals/VBoxGlobal.cpp" line="1470"/>
+ <location filename="../src/globals/VBoxGlobal.cpp" line="1517"/>
<source>Serial Ports</source>
<comment>details report</comment>
<translation>シリアルポート</translation>
</message>
<message>
- <location filename="../src/globals/VBoxGlobal.cpp" line="1546"/>
+ <location filename="../src/globals/VBoxGlobal.cpp" line="1593"/>
<source>USB</source>
<comment>details report</comment>
<translation>USB</translation>
</message>
<message>
- <location filename="../src/globals/VBoxGlobal.cpp" line="1559"/>
+ <location filename="../src/globals/VBoxGlobal.cpp" line="1606"/>
<source>Shared Folders</source>
<comment>details report (shared folders)</comment>
<translation>共有フォルダー</translation>
@@ -14090,13 +14119,13 @@ Version %1</source>
<translation type="obsolete">%1</translation>
</message>
<message>
- <location filename="../src/globals/VBoxGlobal.cpp" line="1564"/>
+ <location filename="../src/globals/VBoxGlobal.cpp" line="1611"/>
<source>None</source>
<comment>details report (shared folders)</comment>
<translation>なし</translation>
</message>
<message>
- <location filename="../src/globals/VBoxGlobal.cpp" line="1570"/>
+ <location filename="../src/globals/VBoxGlobal.cpp" line="1617"/>
<source>Shared Folders</source>
<comment>details report</comment>
<translation>共有フォルダー</translation>
@@ -14140,7 +14169,7 @@ Version %1</source>
<translation>ICH9</translation>
</message>
<message>
- <location filename="../src/globals/VBoxGlobal.cpp" line="1949"/>
+ <location filename="../src/globals/VBoxGlobal.cpp" line="1996"/>
<source>User-defined</source>
<comment>serial port</comment>
<translation>ユーザー定義</translation>
@@ -14152,21 +14181,21 @@ Version %1</source>
</message>
<message>
<location filename="../src/VBoxVMInformationDlg.cpp" line="526"/>
- <location filename="../src/globals/VBoxGlobal.cpp" line="1202"/>
+ <location filename="../src/globals/VBoxGlobal.cpp" line="1249"/>
<location filename="../src/runtime/UIIndicatorsPool.cpp" line="687"/>
<source>VT-x/AMD-V</source>
<comment>details report</comment>
<translation>VT-x/AMD-V</translation>
</message>
<message>
- <location filename="../src/globals/VBoxGlobal.cpp" line="1197"/>
+ <location filename="../src/globals/VBoxGlobal.cpp" line="1244"/>
<source>PAE/NX</source>
<comment>details report</comment>
<translation>PAE/NX</translation>
</message>
<message>
<location filename="../src/VBoxVMInformationDlg.cpp" line="484"/>
- <location filename="../src/globals/VBoxGlobal.cpp" line="1170"/>
+ <location filename="../src/globals/VBoxGlobal.cpp" line="1217"/>
<location filename="../src/runtime/UIIndicatorsPool.cpp" line="665"/>
<source>Enabled</source>
<comment>details report (VT-x/AMD-V)</comment>
@@ -14174,7 +14203,7 @@ Version %1</source>
</message>
<message>
<location filename="../src/VBoxVMInformationDlg.cpp" line="485"/>
- <location filename="../src/globals/VBoxGlobal.cpp" line="1171"/>
+ <location filename="../src/globals/VBoxGlobal.cpp" line="1218"/>
<location filename="../src/runtime/UIIndicatorsPool.cpp" line="666"/>
<source>Disabled</source>
<comment>details report (VT-x/AMD-V)</comment>
@@ -14203,135 +14232,135 @@ Version %1</source>
</message>
<message>
<location filename="../src/VBoxVMInformationDlg.cpp" line="531"/>
- <location filename="../src/globals/VBoxGlobal.cpp" line="1258"/>
+ <location filename="../src/globals/VBoxGlobal.cpp" line="1305"/>
<source>Remote Desktop Server Port</source>
<comment>details report (VRDE Server)</comment>
<translation>リモートデスクトップサーバーポート</translation>
</message>
<message>
- <location filename="../src/globals/VBoxGlobal.cpp" line="1162"/>
+ <location filename="../src/globals/VBoxGlobal.cpp" line="1209"/>
<source>Enabled</source>
<comment>details report (PAE/NX)</comment>
<translation>有効</translation>
</message>
<message>
- <location filename="../src/globals/VBoxGlobal.cpp" line="1163"/>
+ <location filename="../src/globals/VBoxGlobal.cpp" line="1210"/>
<source>Disabled</source>
<comment>details report (PAE/NX)</comment>
<translation>無効</translation>
</message>
<message>
- <location filename="../src/globals/VBoxGlobal.cpp" line="1190"/>
+ <location filename="../src/globals/VBoxGlobal.cpp" line="1237"/>
<location filename="../src/runtime/UIIndicatorsPool.cpp" line="690"/>
<source>Execution Cap</source>
<comment>details report</comment>
<translation>使用率制限</translation>
</message>
<message>
- <location filename="../src/globals/VBoxGlobal.cpp" line="1191"/>
+ <location filename="../src/globals/VBoxGlobal.cpp" line="1238"/>
<source><nobr>%1%</nobr></source>
<comment>details report</comment>
<translation><nobr>%1</nobr></translation>
</message>
<message>
- <location filename="../src/globals/VBoxGlobal.cpp" line="1355"/>
+ <location filename="../src/globals/VBoxGlobal.cpp" line="1402"/>
<source>Host Driver</source>
<comment>details report (audio)</comment>
<translation>ホストドライバー</translation>
</message>
<message>
- <location filename="../src/globals/VBoxGlobal.cpp" line="1358"/>
+ <location filename="../src/globals/VBoxGlobal.cpp" line="1405"/>
<source>Controller</source>
<comment>details report (audio)</comment>
<translation>コントローラー</translation>
</message>
<message>
- <location filename="../src/globals/VBoxGlobal.cpp" line="1399"/>
+ <location filename="../src/globals/VBoxGlobal.cpp" line="1446"/>
<source>Generic, '%1'</source>
<comment>details report (network)</comment>
<translation>一般, '%1'</translation>
</message>
<message>
- <location filename="../src/globals/VBoxGlobal.cpp" line="1402"/>
+ <location filename="../src/globals/VBoxGlobal.cpp" line="1449"/>
<source>NAT network, '%1'</source>
<comment>details report (network)</comment>
<translation>NATネットワーク, '%1'</translation>
</message>
<message>
- <location filename="../src/globals/VBoxGlobal.cpp" line="1491"/>
+ <location filename="../src/globals/VBoxGlobal.cpp" line="1538"/>
<source>Port %1</source>
<comment>details report (parallel ports)</comment>
<translation>ポート %1</translation>
</message>
<message>
- <location filename="../src/globals/VBoxGlobal.cpp" line="1500"/>
+ <location filename="../src/globals/VBoxGlobal.cpp" line="1547"/>
<source>Disabled</source>
<comment>details report (parallel ports)</comment>
<translation>無効</translation>
</message>
<message>
- <location filename="../src/globals/VBoxGlobal.cpp" line="1509"/>
+ <location filename="../src/globals/VBoxGlobal.cpp" line="1556"/>
<source>Parallel Ports</source>
<comment>details report</comment>
<translation>パラレルポート</translation>
</message>
<message>
- <location filename="../src/globals/VBoxGlobal.cpp" line="1708"/>
+ <location filename="../src/globals/VBoxGlobal.cpp" line="1755"/>
<source>Please choose a virtual hard drive file</source>
<translation>仮想ハードドライブファイルを選択してください</translation>
</message>
<message>
- <location filename="../src/globals/VBoxGlobal.cpp" line="1709"/>
+ <location filename="../src/globals/VBoxGlobal.cpp" line="1756"/>
<source>All virtual hard drive files (%1)</source>
<translation>すべての仮想ハードドライブファイル (%1)</translation>
</message>
<message>
- <location filename="../src/globals/VBoxGlobal.cpp" line="1720"/>
+ <location filename="../src/globals/VBoxGlobal.cpp" line="1767"/>
<source>Please choose a virtual optical disk file</source>
<translation>仮想光学ディスクファイルを選択してください</translation>
</message>
<message>
- <location filename="../src/globals/VBoxGlobal.cpp" line="1721"/>
+ <location filename="../src/globals/VBoxGlobal.cpp" line="1768"/>
<source>All virtual optical disk files (%1)</source>
<translation>すべての仮想光学ディスクファイル (%1)</translation>
</message>
<message>
- <location filename="../src/globals/VBoxGlobal.cpp" line="1732"/>
+ <location filename="../src/globals/VBoxGlobal.cpp" line="1779"/>
<source>Please choose a virtual floppy disk file</source>
<translation>仮想フロッピーディスクファイルを選択してください</translation>
</message>
<message>
- <location filename="../src/globals/VBoxGlobal.cpp" line="1733"/>
+ <location filename="../src/globals/VBoxGlobal.cpp" line="1780"/>
<source>All virtual floppy disk files (%1)</source>
<translation>すべての仮想フロッピーディスクファイル (%1)</translation>
</message>
<message>
- <location filename="../src/globals/VBoxGlobal.cpp" line="3320"/>
+ <location filename="../src/globals/VBoxGlobal.cpp" line="3367"/>
<source>VDI (VirtualBox Disk Image)</source>
<translation>VDI (VirtualBox Disk Image)</translation>
</message>
<message>
- <location filename="../src/globals/VBoxGlobal.cpp" line="3322"/>
+ <location filename="../src/globals/VBoxGlobal.cpp" line="3369"/>
<source>VMDK (Virtual Machine Disk)</source>
<translation>VMDK (Virtual Machine Disk)</translation>
</message>
<message>
- <location filename="../src/globals/VBoxGlobal.cpp" line="3324"/>
+ <location filename="../src/globals/VBoxGlobal.cpp" line="3371"/>
<source>VHD (Virtual Hard Disk)</source>
<translation>VHD (Virtual Hard Disk)</translation>
</message>
<message>
- <location filename="../src/globals/VBoxGlobal.cpp" line="3326"/>
+ <location filename="../src/globals/VBoxGlobal.cpp" line="3373"/>
<source>HDD (Parallels Hard Disk)</source>
<translation>HDD (Parallels Hard Disk)</translation>
</message>
<message>
- <location filename="../src/globals/VBoxGlobal.cpp" line="3328"/>
+ <location filename="../src/globals/VBoxGlobal.cpp" line="3375"/>
<source>QED (QEMU enhanced disk)</source>
<translation>QED (QEMU enhanced disk)</translation>
</message>
<message>
- <location filename="../src/globals/VBoxGlobal.cpp" line="3330"/>
+ <location filename="../src/globals/VBoxGlobal.cpp" line="3377"/>
<source>QCOW (QEMU Copy-On-Write)</source>
<translation>QCOW (QEMU Copy-On-Write)</translation>
</message>
@@ -14452,49 +14481,49 @@ Version %1</source>
<translation>Intel PRO/1000 T Server (82543GC)</translation>
</message>
<message>
- <location filename="../src/globals/VBoxGlobal.cpp" line="1033"/>
+ <location filename="../src/globals/VBoxGlobal.cpp" line="1064"/>
<source><nobr>Vendor ID: %1</nobr></source>
<comment>USB filter tooltip</comment>
<translation><nobr>ベンダーID: %1</nobr></translation>
</message>
<message>
- <location filename="../src/globals/VBoxGlobal.cpp" line="1038"/>
+ <location filename="../src/globals/VBoxGlobal.cpp" line="1069"/>
<source><nobr>Product ID: %2</nobr></source>
<comment>USB filter tooltip</comment>
<translation><nobr>プロダクトID: %2</nobr></translation>
</message>
<message>
- <location filename="../src/globals/VBoxGlobal.cpp" line="1043"/>
+ <location filename="../src/globals/VBoxGlobal.cpp" line="1074"/>
<source><nobr>Revision: %3</nobr></source>
<comment>USB filter tooltip</comment>
<translation><nobr>リビジョン: %3</nobr></translation>
</message>
<message>
- <location filename="../src/globals/VBoxGlobal.cpp" line="1048"/>
+ <location filename="../src/globals/VBoxGlobal.cpp" line="1079"/>
<source><nobr>Product: %4</nobr></source>
<comment>USB filter tooltip</comment>
<translation><nobr>製品: %4</nobr></translation>
</message>
<message>
- <location filename="../src/globals/VBoxGlobal.cpp" line="1053"/>
+ <location filename="../src/globals/VBoxGlobal.cpp" line="1084"/>
<source><nobr>Manufacturer: %5</nobr></source>
<comment>USB filter tooltip</comment>
<translation><nobr>メーカー: %5</nobr></translation>
</message>
<message>
- <location filename="../src/globals/VBoxGlobal.cpp" line="1058"/>
+ <location filename="../src/globals/VBoxGlobal.cpp" line="1089"/>
<source><nobr>Serial No.: %1</nobr></source>
<comment>USB filter tooltip</comment>
<translation><nobr>シリアルNo.: %1</nobr></translation>
</message>
<message>
- <location filename="../src/globals/VBoxGlobal.cpp" line="1063"/>
+ <location filename="../src/globals/VBoxGlobal.cpp" line="1094"/>
<source><nobr>Port: %1</nobr></source>
<comment>USB filter tooltip</comment>
<translation><nobr>ポート: %1</nobr></translation>
</message>
<message>
- <location filename="../src/globals/VBoxGlobal.cpp" line="1070"/>
+ <location filename="../src/globals/VBoxGlobal.cpp" line="1101"/>
<source><nobr>State: %1</nobr></source>
<comment>USB filter tooltip</comment>
<translation><nobr>状態: %1</nobr></translation>
@@ -14566,19 +14595,19 @@ Version %1</source>
<translation type="obsolete">%1<hr>このベースハードディスクは以下の差分ハードディスクを使用して間接的に割り当てられます:<br>%2%3</translation>
</message>
<message>
- <location filename="../src/globals/VBoxGlobal.cpp" line="1239"/>
+ <location filename="../src/globals/VBoxGlobal.cpp" line="1286"/>
<source>3D Acceleration</source>
<comment>details report</comment>
<translation>3D アクセラレーション</translation>
</message>
<message>
- <location filename="../src/globals/VBoxGlobal.cpp" line="1235"/>
+ <location filename="../src/globals/VBoxGlobal.cpp" line="1282"/>
<source>Enabled</source>
<comment>details report (3D Acceleration)</comment>
<translation>有効</translation>
</message>
<message>
- <location filename="../src/globals/VBoxGlobal.cpp" line="1236"/>
+ <location filename="../src/globals/VBoxGlobal.cpp" line="1283"/>
<source>Disabled</source>
<comment>details report (3D Acceleration)</comment>
<translation>無効</translation>
@@ -14590,21 +14619,21 @@ Version %1</source>
<translation>セットアップ</translation>
</message>
<message>
- <location filename="../src/globals/VBoxGlobal.cpp" line="1947"/>
+ <location filename="../src/globals/VBoxGlobal.cpp" line="1994"/>
<source>Differencing</source>
<comment>DiskType</comment>
<translation>差分</translation>
</message>
<message>
<location filename="../src/VBoxVMInformationDlg.cpp" line="527"/>
- <location filename="../src/globals/VBoxGlobal.cpp" line="1203"/>
+ <location filename="../src/globals/VBoxGlobal.cpp" line="1250"/>
<source>Nested Paging</source>
<comment>details report</comment>
<translation>ネステッドページング</translation>
</message>
<message>
<location filename="../src/VBoxVMInformationDlg.cpp" line="487"/>
- <location filename="../src/globals/VBoxGlobal.cpp" line="1175"/>
+ <location filename="../src/globals/VBoxGlobal.cpp" line="1222"/>
<location filename="../src/runtime/UIIndicatorsPool.cpp" line="670"/>
<source>Enabled</source>
<comment>details report (Nested Paging)</comment>
@@ -14612,7 +14641,7 @@ Version %1</source>
</message>
<message>
<location filename="../src/VBoxVMInformationDlg.cpp" line="488"/>
- <location filename="../src/globals/VBoxGlobal.cpp" line="1176"/>
+ <location filename="../src/globals/VBoxGlobal.cpp" line="1223"/>
<location filename="../src/runtime/UIIndicatorsPool.cpp" line="671"/>
<source>Disabled</source>
<comment>details report (Nested Paging)</comment>
@@ -14624,7 +14653,7 @@ Version %1</source>
<translation type="obsolete">ブリッジネットワーク, '%1'</translation>
</message>
<message>
- <location filename="../src/globals/VBoxGlobal.cpp" line="1393"/>
+ <location filename="../src/globals/VBoxGlobal.cpp" line="1440"/>
<source>Internal network, '%1'</source>
<comment>details report (network)</comment>
<translation>内部ネットワーク, '%1'</translation>
@@ -14693,13 +14722,13 @@ Version %1</source>
<translation>BusLogic</translation>
</message>
<message>
- <location filename="../src/globals/VBoxGlobal.cpp" line="1390"/>
+ <location filename="../src/globals/VBoxGlobal.cpp" line="1437"/>
<source>Bridged adapter, %1</source>
<comment>details report (network)</comment>
<translation>ブリッジアダプター, '%1'</translation>
</message>
<message>
- <location filename="../src/globals/VBoxGlobal.cpp" line="1396"/>
+ <location filename="../src/globals/VBoxGlobal.cpp" line="1443"/>
<source>Host-only adapter, '%1'</source>
<comment>details report (network)</comment>
<translation>ホストオンリーアダプター, '%1'</translation>
@@ -14723,27 +14752,27 @@ Version %1</source>
<translation>ホストオンリーアダプター</translation>
</message>
<message>
- <location filename="../src/globals/VBoxGlobal.cpp" line="1185"/>
- <location filename="../src/globals/VBoxGlobal.cpp" line="1221"/>
+ <location filename="../src/globals/VBoxGlobal.cpp" line="1232"/>
+ <location filename="../src/globals/VBoxGlobal.cpp" line="1268"/>
<source><nobr>%1 MB</nobr></source>
<comment>details report</comment>
<translation><nobr>%1 MB</nobr></translation>
</message>
<message>
- <location filename="../src/globals/VBoxGlobal.cpp" line="1187"/>
+ <location filename="../src/globals/VBoxGlobal.cpp" line="1234"/>
<location filename="../src/runtime/UIIndicatorsPool.cpp" line="695"/>
<source>Processor(s)</source>
<comment>details report</comment>
<translation>プロセッサー数</translation>
</message>
<message>
- <location filename="../src/globals/VBoxGlobal.cpp" line="1188"/>
+ <location filename="../src/globals/VBoxGlobal.cpp" line="1235"/>
<source><nobr>%1</nobr></source>
<comment>details report</comment>
<translation><nobr>%1</nobr></translation>
</message>
<message>
- <location filename="../src/globals/VBoxGlobal.cpp" line="1209"/>
+ <location filename="../src/globals/VBoxGlobal.cpp" line="1256"/>
<source>System</source>
<comment>details report</comment>
<translation>システム</translation>
@@ -14764,7 +14793,7 @@ Version %1</source>
<translation type="obsolete">無効</translation>
</message>
<message>
- <location filename="../src/globals/VBoxGlobal.cpp" line="1271"/>
+ <location filename="../src/globals/VBoxGlobal.cpp" line="1318"/>
<source>Display</source>
<comment>details report</comment>
<translation>ディスプレイ</translation>
@@ -14777,60 +14806,60 @@ Version %1</source>
<translation>Rawファイル</translation>
</message>
<message>
- <location filename="../src/globals/VBoxGlobal.cpp" line="1244"/>
+ <location filename="../src/globals/VBoxGlobal.cpp" line="1291"/>
<source>Enabled</source>
<comment>details report (2D Video Acceleration)</comment>
<translation>有効</translation>
</message>
<message>
- <location filename="../src/globals/VBoxGlobal.cpp" line="967"/>
+ <location filename="../src/globals/VBoxGlobal.cpp" line="998"/>
<source>Unknown device</source>
<comment>USB device details</comment>
<translation>不明なデバイス</translation>
</message>
<message>
- <location filename="../src/globals/VBoxGlobal.cpp" line="1229"/>
+ <location filename="../src/globals/VBoxGlobal.cpp" line="1276"/>
<source>Screens</source>
<comment>details report</comment>
<translation>スクリーン</translation>
</message>
<message>
- <location filename="../src/globals/VBoxGlobal.cpp" line="1245"/>
+ <location filename="../src/globals/VBoxGlobal.cpp" line="1292"/>
<source>Disabled</source>
<comment>details report (2D Video Acceleration)</comment>
<translation>無効</translation>
</message>
<message>
- <location filename="../src/globals/VBoxGlobal.cpp" line="1248"/>
+ <location filename="../src/globals/VBoxGlobal.cpp" line="1295"/>
<source>2D Video Acceleration</source>
<comment>details report</comment>
<translation>2D ビデオアクセラレーション</translation>
</message>
<message>
- <location filename="../src/globals/VBoxGlobal.cpp" line="1262"/>
+ <location filename="../src/globals/VBoxGlobal.cpp" line="1309"/>
<source>Remote Desktop Server</source>
<comment>details report (VRDE Server)</comment>
<translation>リモートデスクトップサーバー</translation>
</message>
<message>
- <location filename="../src/globals/VBoxGlobal.cpp" line="1263"/>
+ <location filename="../src/globals/VBoxGlobal.cpp" line="1310"/>
<source>Disabled</source>
<comment>details report (VRDE Server)</comment>
<translation>無効</translation>
</message>
<message>
- <location filename="../src/globals/VBoxGlobal.cpp" line="1303"/>
+ <location filename="../src/globals/VBoxGlobal.cpp" line="1350"/>
<source>(CD/DVD)</source>
<translation>(CD/DVD)</translation>
</message>
<message>
- <location filename="../src/globals/VBoxGlobal.cpp" line="1335"/>
+ <location filename="../src/globals/VBoxGlobal.cpp" line="1382"/>
<source>Not Attached</source>
<comment>details report (Storage)</comment>
<translation>未割り当て</translation>
</message>
<message>
- <location filename="../src/globals/VBoxGlobal.cpp" line="1343"/>
+ <location filename="../src/globals/VBoxGlobal.cpp" line="1390"/>
<source>Storage</source>
<comment>details report</comment>
<translation>ストレージ</translation>
@@ -14869,7 +14898,7 @@ Version %1</source>
<translation type="obsolete">すべての%1イメージ(%2)</translation>
</message>
<message>
- <location filename="../src/globals/VBoxGlobal.cpp" line="1759"/>
+ <location filename="../src/globals/VBoxGlobal.cpp" line="1806"/>
<source>All files (*)</source>
<translation>すべてのファイル(*)</translation>
</message>
@@ -15270,8 +15299,8 @@ Version %1</source>
<message>
<location filename="../src/converter/UIConverterBackendGlobal.cpp" line="49"/>
<location filename="../src/converter/UIConverterBackendGlobal.cpp" line="68"/>
- <location filename="../src/globals/VBoxGlobal.cpp" line="2525"/>
- <location filename="../src/globals/VBoxGlobal.cpp" line="2557"/>
+ <location filename="../src/globals/VBoxGlobal.cpp" line="2572"/>
+ <location filename="../src/globals/VBoxGlobal.cpp" line="2604"/>
<source>B</source>
<comment>size suffix Bytes</comment>
<translation>B</translation>
@@ -15279,8 +15308,8 @@ Version %1</source>
<message>
<location filename="../src/converter/UIConverterBackendGlobal.cpp" line="50"/>
<location filename="../src/converter/UIConverterBackendGlobal.cpp" line="69"/>
- <location filename="../src/globals/VBoxGlobal.cpp" line="2526"/>
- <location filename="../src/globals/VBoxGlobal.cpp" line="2559"/>
+ <location filename="../src/globals/VBoxGlobal.cpp" line="2573"/>
+ <location filename="../src/globals/VBoxGlobal.cpp" line="2606"/>
<source>KB</source>
<comment>size suffix KBytes=1024 Bytes</comment>
<translation>KB</translation>
@@ -15288,8 +15317,8 @@ Version %1</source>
<message>
<location filename="../src/converter/UIConverterBackendGlobal.cpp" line="51"/>
<location filename="../src/converter/UIConverterBackendGlobal.cpp" line="70"/>
- <location filename="../src/globals/VBoxGlobal.cpp" line="2527"/>
- <location filename="../src/globals/VBoxGlobal.cpp" line="2561"/>
+ <location filename="../src/globals/VBoxGlobal.cpp" line="2574"/>
+ <location filename="../src/globals/VBoxGlobal.cpp" line="2608"/>
<location filename="../src/widgets/UIApplianceEditorWidget.cpp" line="241"/>
<location filename="../src/widgets/UIApplianceEditorWidget.cpp" line="432"/>
<location filename="../src/wizards/newvm/UIWizardNewVMPageBasic2.cpp" line="136"/>
@@ -15305,8 +15334,8 @@ Version %1</source>
<message>
<location filename="../src/converter/UIConverterBackendGlobal.cpp" line="52"/>
<location filename="../src/converter/UIConverterBackendGlobal.cpp" line="71"/>
- <location filename="../src/globals/VBoxGlobal.cpp" line="2528"/>
- <location filename="../src/globals/VBoxGlobal.cpp" line="2563"/>
+ <location filename="../src/globals/VBoxGlobal.cpp" line="2575"/>
+ <location filename="../src/globals/VBoxGlobal.cpp" line="2610"/>
<source>GB</source>
<comment>size suffix GBytes=1024 MBytes</comment>
<translation>GB</translation>
@@ -15314,8 +15343,8 @@ Version %1</source>
<message>
<location filename="../src/converter/UIConverterBackendGlobal.cpp" line="53"/>
<location filename="../src/converter/UIConverterBackendGlobal.cpp" line="72"/>
- <location filename="../src/globals/VBoxGlobal.cpp" line="2529"/>
- <location filename="../src/globals/VBoxGlobal.cpp" line="2565"/>
+ <location filename="../src/globals/VBoxGlobal.cpp" line="2576"/>
+ <location filename="../src/globals/VBoxGlobal.cpp" line="2612"/>
<source>TB</source>
<comment>size suffix TBytes=1024 GBytes</comment>
<translation>TB</translation>
@@ -15323,8 +15352,8 @@ Version %1</source>
<message>
<location filename="../src/converter/UIConverterBackendGlobal.cpp" line="54"/>
<location filename="../src/converter/UIConverterBackendGlobal.cpp" line="73"/>
- <location filename="../src/globals/VBoxGlobal.cpp" line="2530"/>
- <location filename="../src/globals/VBoxGlobal.cpp" line="2567"/>
+ <location filename="../src/globals/VBoxGlobal.cpp" line="2577"/>
+ <location filename="../src/globals/VBoxGlobal.cpp" line="2614"/>
<source>PB</source>
<comment>size suffix PBytes=1024 TBytes</comment>
<translation>PB</translation>
@@ -15422,42 +15451,42 @@ Version %1</source>
<translation>このベースハードディスクは以下の差分ハードディスクを使用して間接的に割り当てられます:</translation>
</message>
<message numerus="yes">
- <location filename="../src/globals/VBoxGlobal.h" line="164"/>
+ <location filename="../src/globals/VBoxGlobal.h" line="169"/>
<source>%n year(s)</source>
<translation>
<numerusform>%n 年</numerusform>
</translation>
</message>
<message numerus="yes">
- <location filename="../src/globals/VBoxGlobal.h" line="169"/>
+ <location filename="../src/globals/VBoxGlobal.h" line="174"/>
<source>%n month(s)</source>
<translation>
<numerusform>%n 月</numerusform>
</translation>
</message>
<message numerus="yes">
- <location filename="../src/globals/VBoxGlobal.h" line="174"/>
+ <location filename="../src/globals/VBoxGlobal.h" line="179"/>
<source>%n day(s)</source>
<translation>
<numerusform>%n 日</numerusform>
</translation>
</message>
<message numerus="yes">
- <location filename="../src/globals/VBoxGlobal.h" line="179"/>
+ <location filename="../src/globals/VBoxGlobal.h" line="184"/>
<source>%n hour(s)</source>
<translation>
<numerusform>%n 時間</numerusform>
</translation>
</message>
<message numerus="yes">
- <location filename="../src/globals/VBoxGlobal.h" line="184"/>
+ <location filename="../src/globals/VBoxGlobal.h" line="189"/>
<source>%n minute(s)</source>
<translation>
<numerusform>%n 分</numerusform>
</translation>
</message>
<message numerus="yes">
- <location filename="../src/globals/VBoxGlobal.h" line="189"/>
+ <location filename="../src/globals/VBoxGlobal.h" line="194"/>
<source>%n second(s)</source>
<translation>
<numerusform>%n 秒</numerusform>
diff --git a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_km_KH.ts b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_km_KH.ts
index 9bfc6bc..a288e20 100644
--- a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_km_KH.ts
+++ b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_km_KH.ts
@@ -818,6 +818,10 @@
<comment>new</comment>
<translation type="obsolete">ម៉ោនរូបភាពដំឡើងបន្ថែមភ្ញៀវ</translation>
</message>
+ <message>
+ <source>&Webcams</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIApplianceEditorWidget</name>
@@ -3861,6 +3865,14 @@ p, li { white-space: pre-wrap; }
<source>Select a filename for the screenshot ...</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>No Webcams Connected</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>No supported webcams connected to the host PC</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIMachineSettingsAudio</name>
@@ -5860,7 +5872,7 @@ network adapter name</comment>
</message>
<message>
<source><p>The virtual machine window is optimized to work in <b>%1 bit</b> color mode but the virtual display is currently set to <b>%2 bit</b>.</p><p>Please open the display properties dialog of the guest OS and select a <b>%3 bit</b> color mode, if it is available, for best possible performance of the virtual video subsystem.</p><p><b>Note</b>. Some operating systems, like [...]
- <translation><p>បង្អួចម៉ាស៊ីននិម្មិតត្រូវបានធ្វើឲ្យប្រសើរដើម្បីធ្វើការក្នុងរបៀបពណ៌ <b>%1 ប៊ីត</b> ប៉ុន្តែគុណភាពពណ៌នៃការបង្ហាញនិម្មិតបច្ចុប្បន្នត្រូវបានកំណត់ទៅ <b>%2 ប៊ីត</b> ។</p><p>សូមបើកប្រអប់លក្ខណៈសម្បត្តិបង្ហាញរបស់ប្រព័ន្ធប្រតិបត្តិការរបស់ម៉ាស៊ីនភ្ញៀវ ហើយជ្រើសរបៀបពណ៌ <b>%3 ប៊ីត</b> ប្រសិនបើមាន សម្រាប់ការអនុវត្តដ៏ល្អបំផុតរបស់ប្រព័ន្ធរងវីដែអូនិម្មិត ។</p& [...]
+ <translation type="obsolete"><p>បង្អួចម៉ាស៊ីននិម្មិតត្រូវបានធ្វើឲ្យប្រសើរដើម្បីធ្វើការក្នុងរបៀបពណ៌ <b>%1 ប៊ីត</b> ប៉ុន្តែគុណភាពពណ៌នៃការបង្ហាញនិម្មិតបច្ចុប្បន្នត្រូវបានកំណត់ទៅ <b>%2 ប៊ីត</b> ។</p><p>សូមបើកប្រអប់លក្ខណៈសម្បត្តិបង្ហាញរបស់ប្រព័ន្ធប្រតិបត្តិការរបស់ម៉ាស៊ីនភ្ញៀវ ហើយជ្រើសរបៀបពណ៌ <b>%3 ប៊ីត</b> ប្រសិនបើមាន សម្រាប់ការអនុវត្តដ៏ល្អបំផុតរបស់ប្រព័ន្ធរងវីដែអូ [...]
</message>
<message>
<source><p>You didn'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 window or the First Run Wizard.</p><p>Do you wish to continue?</p></source>
@@ -7117,6 +7129,18 @@ medium</comment>
<source><p>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 <b>Insert Guest Additions CD image</b> from the <b>Devices</b> menu. If they are installed but the machine is not yet fully starte [...]
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Failed to attach the webcam <b>%1</b> to the virtual machine <b>%2</b>.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to detach the webcam <b>%1</b> from the virtual machine <b>%2</b>.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p>The virtual screen is currently set to a <b>%1 bit</b> color mode. For better performance please change this to <b>%2 bit</b>. This can usually be done from the <b>Display</b> section of the guest operating system's Control Panel or System Settings.</p></source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIMiniProcessWidgetAdditions</name>
diff --git a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_ko.ts b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_ko.ts
index 3f2568b..f8fccbe 100644
--- a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_ko.ts
+++ b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_ko.ts
@@ -939,6 +939,10 @@
<comment>new</comment>
<translation type="obsolete">게스트 확장 설치 이미지를 마운트합니다</translation>
</message>
+ <message>
+ <source>&Webcams</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIActonPool</name>
@@ -4524,6 +4528,14 @@ p, li { white-space: pre-wrap; }
<source>Select a filename for the screenshot ...</source>
<translation>스크린샷 파일 이름 선택...</translation>
</message>
+ <message>
+ <source>No Webcams Connected</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>No supported webcams connected to the host PC</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIMachineSettingsAudio</name>
@@ -7005,7 +7017,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source><p>The virtual machine window is optimized to work in <b>%1 bit</b> color mode but the virtual display is currently set to <b>%2 bit</b>.</p><p>Please open the display properties dialog of the guest OS and select a <b>%3 bit</b> color mode, if it is available, for best possible performance of the virtual video subsystem.</p><p><b>Note</b>. Some operating systems, like [...]
- <translation><p>가상 머신 창은 <b>%1 비트</b> 모드에 최적화되어 있지만 현재 가상 디스플레이의 색 설정은 <b>%2 비트</b>입니다.</p><p>게스트 운영 체제의 성능을 향상시키려면 게스트 운영 체제의 디스플레이 속성을 여시고 사용 가능한 경우 <b>%3 비트</b> 모드를 선택하십시오.</p><p><b>메모</b>: OS/2 같은 일부 운영 체제는 실제로 32 비트 모드에서 작동하지만 24 비트 모드를 사용한다고 보고합니다. 만약 이 메시지가 나타나면 다른 색 품질을 선택하거나 게스트 운영 체제에서 필요한 색 품질(%4 비트)을 지원하지 않으면 이 메시지를 비활성화 시킬 수 있습니다.</p& [...]
+ <translation type="obsolete"><p>가상 머신 창은 <b>%1 비트</b> 모드에 최적화되어 있지만 현재 가상 디스플레이의 색 설정은 <b>%2 비트</b>입니다.</p><p>게스트 운영 체제의 성능을 향상시키려면 게스트 운영 체제의 디스플레이 속성을 여시고 사용 가능한 경우 <b>%3 비트</b> 모드를 선택하십시오.</p><p><b>메모</b>: OS/2 같은 일부 운영 체제는 실제로 32 비트 모드에서 작동하지만 24 비트 모드를 사용한다고 보고합니다. 만약 이 메시지가 나타나면 다른 색 품질을 선택하거나 게스트 운영 체제에서 필요한 색 품질(%4 비트)을 지원하지 않으면 이 메시지를 비활성화 시 [...]
</message>
<message>
<source><p>You didn'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 window or the First Run Wizard.</p><p>Do you wish to continue?</p></source>
@@ -8355,6 +8367,18 @@ p, li { white-space: pre-wrap; }
<comment>additions-new</comment>
<translation type="obsolete">마운트</translation>
</message>
+ <message>
+ <source>Failed to attach the webcam <b>%1</b> to the virtual machine <b>%2</b>.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to detach the webcam <b>%1</b> from the virtual machine <b>%2</b>.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p>The virtual screen is currently set to a <b>%1 bit</b> color mode. For better performance please change this to <b>%2 bit</b>. This can usually be done from the <b>Display</b> section of the guest operating system's Control Panel or System Settings.</p></source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIMiniProcessWidgetAdditions</name>
diff --git a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_lt.ts b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_lt.ts
index 634f5bf..d6332eb 100644
--- a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_lt.ts
+++ b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_lt.ts
@@ -951,6 +951,10 @@
<comment>new</comment>
<translation type="obsolete">Prijungti svečio papildinių disko atvaizdį</translation>
</message>
+ <message>
+ <source>&Webcams</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIApplianceEditorWidget</name>
@@ -4283,6 +4287,14 @@
<source>Select a filename for the screenshot ...</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>No Webcams Connected</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>No supported webcams connected to the host PC</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIMachineSettingsAudio</name>
@@ -6295,7 +6307,7 @@
</message>
<message>
<source><p>The virtual machine window is optimized to work in <b>%1 bit</b> color mode but the virtual display is currently set to <b>%2 bit</b>.</p><p>Please open the display properties dialog of the guest OS and select a <b>%3 bit</b> color mode, if it is available, for best possible performance of the virtual video subsystem.</p><p><b>Note</b>. Some operating systems, like [...]
- <translation><p>Virtualios mašinos langas sukonfigūruotas dirbti <b>%1 bitų</b> spalvų veiksenoje, tačiau virtualus ekranas šiuo metu naudoja <b>%2 bitų</b> veikseną.</p><p>Jei įmanoma, atverkite svečio OS ekrano nuostatas ir pasirinkite <b>%3 bitų</b> spalvų veikseną; taip užtikrinsite geriausią virtualios vaizdo posistemės veikimą.</p><p><b>Atminkite</b>. Kai kurios operacin [...]
+ <translation type="obsolete"><p>Virtualios mašinos langas sukonfigūruotas dirbti <b>%1 bitų</b> spalvų veiksenoje, tačiau virtualus ekranas šiuo metu naudoja <b>%2 bitų</b> veikseną.</p><p>Jei įmanoma, atverkite svečio OS ekrano nuostatas ir pasirinkite <b>%3 bitų</b> spalvų veikseną; taip užtikrinsite geriausią virtualios vaizdo posistemės veikimą.</p><p><b>Atminkite</b>. Kai [...]
</message>
<message>
<source><p>You didn'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 window or the First Run Wizard.</p><p>Do you wish to continue?</p></source>
@@ -7723,6 +7735,18 @@
<comment>additions-new</comment>
<translation type="obsolete">Prijungti</translation>
</message>
+ <message>
+ <source>Failed to attach the webcam <b>%1</b> to the virtual machine <b>%2</b>.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to detach the webcam <b>%1</b> from the virtual machine <b>%2</b>.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p>The virtual screen is currently set to a <b>%1 bit</b> color mode. For better performance please change this to <b>%2 bit</b>. This can usually be done from the <b>Display</b> section of the guest operating system's Control Panel or System Settings.</p></source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIMiniProcessWidgetAdditions</name>
diff --git a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_nl.ts b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_nl.ts
index 2cc2f92..4eeba25 100644
--- a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_nl.ts
+++ b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_nl.ts
@@ -256,7 +256,7 @@
</message>
<message>
<source>Show Session Information Window</source>
- <translation type="unfinished">Toon sessie-informatiedialoog</translation>
+ <translation>Toon sessie-informatievenster</translation>
</message>
<message>
<source>&Pause</source>
@@ -329,7 +329,7 @@
<message>
<source>&Insert Guest Additions CD image...</source>
<translatorcomment>Guest Additions als naam laten staan</translatorcomment>
- <translation type="unfinished">&Installeren Guest Additions...</translation>
+ <translation>&Installeren Guest Additions...</translation>
</message>
<message>
<source>Insert the Guest Additions disk file into the virtual drive</source>
@@ -830,6 +830,10 @@
<comment>new</comment>
<translation type="obsolete">Koppel Guest Additions installatie-image aan</translation>
</message>
+ <message>
+ <source>&Webcams</source>
+ <translation>&Webcams</translation>
+ </message>
</context>
<context>
<name>UIActonPool</name>
@@ -3785,6 +3789,14 @@
<source>Select a filename for the screenshot ...</source>
<translation>Geef een bestandsnaam op voor deze schermafdruk ...</translation>
</message>
+ <message>
+ <source>No Webcams Connected</source>
+ <translation>Er zijn geen webcams aangesloten</translation>
+ </message>
+ <message>
+ <source>No supported webcams connected to the host PC</source>
+ <translation>Er zijn geen ondersteunde webcams aan de host-PC verbonden</translation>
+ </message>
</context>
<context>
<name>UIMachineSettingsAudio</name>
@@ -4555,7 +4567,7 @@
</message>
<message>
<source>Window</source>
- <translation type="unfinished"></translation>
+ <translation>Venster</translation>
</message>
</context>
<context>
@@ -5795,7 +5807,7 @@
</message>
<message>
<source><p>The virtual machine window is optimized to work in <b>%1 bit</b> color mode but the virtual display is currently set to <b>%2 bit</b>.</p><p>Please open the display properties dialog of the guest OS and select a <b>%3 bit</b> color mode, if it is available, for best possible performance of the virtual video subsystem.</p><p><b>Note</b>. Some operating systems, like [...]
- <translation><p>Het venster van de virtuele machine is geöptimaliseerd om te werken in <b>%1 bits</b> kleurenmodus, echter de kleurkwaliteit van het virtuele beeldscherm staat op <b>%2 bit</b>.</p><p>Open de beeldscherm-eigenschappen in het gastbesturingssysteem en selecteer indien beschikbaar <b>%3 bits</b>kleurenmodus voor de beste prestatie van het video-subsysteem.</p><p><b>Let op:</b> Somm [...]
+ <translation type="obsolete"><p>Het venster van de virtuele machine is geöptimaliseerd om te werken in <b>%1 bits</b> kleurenmodus, echter de kleurkwaliteit van het virtuele beeldscherm staat op <b>%2 bit</b>.</p><p>Open de beeldscherm-eigenschappen in het gastbesturingssysteem en selecteer indien beschikbaar <b>%3 bits</b>kleurenmodus voor de beste prestatie van het video-subsysteem.</p><p><b>Let op [...]
</message>
<message>
<source><p>You didn'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 window or the First Run Wizard.</p><p>Do you wish to continue?</p></source>
@@ -6397,7 +6409,7 @@
</message>
<message>
<source><p>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 <b>Insert Guest Additions CD image</b> from the <b>Devices</b> menu. If they are installed but the machine is not yet fully starte [...]
- <translation type="unfinished"><p>De VirtualBox Guest Additions lijken niet beschikbaar op deze virtuele machine. Gedeelde mappen kunnen dan niet worden gebruikt. Om gedeelde mappen te kunnen gebruiken binnen de virtuele machine installeert u de Guest Additions indien deze nog niet zijn geïnstalleerd. Indien wel, moet u deze herinstalleren. Selecteer <b>Installeer Guest Additions</b> uit het menu <b>Machine</b>. Zijn de Guest Additions wel goed geïns [...]
+ <translation><p>De VirtualBox Guest Additions lijken niet beschikbaar op deze virtuele machine. Gedeelde mappen kunnen dan niet worden gebruikt. Om gedeelde mappen binnen de virtuele machine te kunnen gebruiken, installeert u de Guest Additions indien deze nog niet zijn geïnstalleerd. Indien wel, moet u deze herinstalleren. Selecteer <b>Installeer Guest Additions</b> uit het menu <b>Machine</b>. Zijn de Guest Additions wel goed geïnstalleerd maar is [...]
</message>
<message>
<source><p>The virtual machine window will be now switched to <b>fullscreen</b> mode. You can go back to windowed mode at any time by pressing <b>%1</b>.</p><p>Note that the <i>Host</i> key is currently defined as <b>%2</b>.</p><p>Note that the main menu bar is hidden in fullscreen mode. You can access it by pressing <b>Host+Home</b>.</p></source>
@@ -6925,6 +6937,21 @@
<comment>additions-new</comment>
<translation type="obsolete">Aankoppelen</translation>
</message>
+ <message>
+ <source>Failed to attach the webcam <b>%1</b> to the virtual machine <b>%2</b>.</source>
+ <translation>Het is niet gelukt webcam <b>%1</b> te koppelen aan virtuele machine <b>%2</b>.</translation>
+ </message>
+ <message>
+ <source>Failed to detach the webcam <b>%1</b> from the virtual machine <b>%2</b>.</source>
+ <translation>Het is niet gelukt webcam <b>%1</b> van virtuele machine <b>%2</b> los te koppelen.</translation>
+ </message>
+ <message>
+ <source><p>The virtual screen is currently set to a <b>%1 bit</b> color mode. For better performance please change this to <b>%2 bit</b>. This can usually be done from the <b>Display</b> section of the guest operating system's Control Panel or System Settings.</p></source>
+ <translatorcomment>In het Nederlands wordt dit afhankelijk van het OS vertaald:
+Windows: Beeldscherm en Configuratiescherm
+Linux: Schermen en Voorkeuren</translatorcomment>
+ <translation><p>Het virtuele scherm staat momenteel in <b>%1 bit</b>-colormodus. Verander dit in <b>%2 bit</b> voor een betere prestatie. Normaal gesproken kan dit via het menu-item <b>Beeldscherm</b> in het Configuratiescherm of via <b>Schermen</b> bij Voorkeuren van het gastbesturingssysteem (afhankelijk van de gast).</p></translation>
+ </message>
</context>
<context>
<name>UIMiniProcessWidgetUserManual</name>
diff --git a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_pl.ts b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_pl.ts
index 3cfe34b..01e14b5 100644
--- a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_pl.ts
+++ b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_pl.ts
@@ -976,6 +976,10 @@
<comment>new</comment>
<translation type="obsolete">Montuje obraz z instalatorem Dodatków dla goszczonych systemów (Guest Additions)</translation>
</message>
+ <message>
+ <source>&Webcams</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIApplianceEditorWidget</name>
@@ -4175,6 +4179,14 @@ p, li { white-space: pre-wrap; }
<source>Select a filename for the screenshot ...</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>No Webcams Connected</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>No supported webcams connected to the host PC</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIMachineSettingsAudio</name>
@@ -6730,7 +6742,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source><p>The virtual machine window is optimized to work in <b>%1 bit</b> color mode but the virtual display is currently set to <b>%2 bit</b>.</p><p>Please open the display properties dialog of the guest OS and select a <b>%3 bit</b> color mode, if it is available, for best possible performance of the virtual video subsystem.</p><p><b>Note</b>. Some operating systems, like [...]
- <translation><p>Okno maszyny wirtualnej jest zoptymalizowane do pracy w <b>%1 bitowym</b> trybie kolorów, natomiast w goszczonym systemie operacyjnym ustawiony jest aktualnie tryb <b>%2 bitowy</b>.</p><p>Proszę otworzyć okno ustawień ekranu w goszczonym sytemie i jeśli to możliwe, wybrać tryb <b>%3 bitowego</b> koloru, aby uzyskać najlepszą wydajność wirtualnego podsystemu wideo.</p><p>&l [...]
+ <translation type="obsolete"><p>Okno maszyny wirtualnej jest zoptymalizowane do pracy w <b>%1 bitowym</b> trybie kolorów, natomiast w goszczonym systemie operacyjnym ustawiony jest aktualnie tryb <b>%2 bitowy</b>.</p><p>Proszę otworzyć okno ustawień ekranu w goszczonym sytemie i jeśli to możliwe, wybrać tryb <b>%3 bitowego</b> koloru, aby uzyskać najlepszą wydajność wirtualnego podsystemu wideo.</ [...]
</message>
<message>
<source><p>A critical error has occurred while running the virtual machine and the machine execution has been stopped.</p><p>For help, please see the Community section on <a href=http://www.virtualbox.org>http://www.virtualbox.org</a> or your support contract. Please provide the contents of the log file <tt>VBox.log</tt> and the image file <tt>VBox.png</tt>, which you can find in the <nobr><b>%1</b></nobr& [...]
@@ -8048,6 +8060,18 @@ p, li { white-space: pre-wrap; }
<source><p>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 <b>Insert Guest Additions CD image</b> from the <b>Devices</b> menu. If they are installed but the machine is not yet fully starte [...]
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Failed to attach the webcam <b>%1</b> to the virtual machine <b>%2</b>.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to detach the webcam <b>%1</b> from the virtual machine <b>%2</b>.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p>The virtual screen is currently set to a <b>%1 bit</b> color mode. For better performance please change this to <b>%2 bit</b>. This can usually be done from the <b>Display</b> section of the guest operating system's Control Panel or System Settings.</p></source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIMiniProcessWidgetAdditions</name>
diff --git a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_pt.ts b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_pt.ts
index 879c355..9453edd 100644
--- a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_pt.ts
+++ b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_pt.ts
@@ -947,6 +947,10 @@
<comment>new</comment>
<translation type="obsolete">Monta a imagem de instalação das Adições de Convidado</translation>
</message>
+ <message>
+ <source>&Webcams</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIApplianceEditorWidget</name>
@@ -3982,6 +3986,14 @@
<source>Select a filename for the screenshot ...</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>No Webcams Connected</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>No supported webcams connected to the host PC</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIMachineSettingsAudio</name>
@@ -6348,7 +6360,7 @@
</message>
<message>
<source><p>The virtual machine window is optimized to work in <b>%1 bit</b> color mode but the virtual display is currently set to <b>%2 bit</b>.</p><p>Please open the display properties dialog of the guest OS and select a <b>%3 bit</b> color mode, if it is available, for best possible performance of the virtual video subsystem.</p><p><b>Note</b>. Some operating systems, like [...]
- <translation><p>A janela da máquina virtual está optimizada para funcionar em modo de cores <b>%1 bits</b>, mas o modo de cores do monitor virtual está definido como <b>%2 bits</b>.</p><p>Abra o diálogo de propriedades do monitor no sistema operativo convidado e seleccione um modo de cores <b>%3 bits</b> se estiver disponível, de forma a obter o melhor desempenho possível do sub-sistema de vídeo virt [...]
+ <translation type="obsolete"><p>A janela da máquina virtual está optimizada para funcionar em modo de cores <b>%1 bits</b>, mas o modo de cores do monitor virtual está definido como <b>%2 bits</b>.</p><p>Abra o diálogo de propriedades do monitor no sistema operativo convidado e seleccione um modo de cores <b>%3 bits</b> se estiver disponível, de forma a obter o melhor desempenho possível do sub-siste [...]
</message>
<message>
<source><p>A critical error has occurred while running the virtual machine and the machine execution has been stopped.</p><p>For help, please see the Community section on <a href=http://www.virtualbox.org>http://www.virtualbox.org</a> or your support contract. Please provide the contents of the log file <tt>VBox.log</tt> and the image file <tt>VBox.png</tt>, which you can find in the <nobr><b>%1</b></nobr& [...]
@@ -7514,6 +7526,18 @@
<source><p>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 <b>Insert Guest Additions CD image</b> from the <b>Devices</b> menu. If they are installed but the machine is not yet fully starte [...]
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Failed to attach the webcam <b>%1</b> to the virtual machine <b>%2</b>.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to detach the webcam <b>%1</b> from the virtual machine <b>%2</b>.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p>The virtual screen is currently set to a <b>%1 bit</b> color mode. For better performance please change this to <b>%2 bit</b>. This can usually be done from the <b>Display</b> section of the guest operating system's Control Panel or System Settings.</p></source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIMiniProcessWidgetAdditions</name>
diff --git a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_pt_BR.ts b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_pt_BR.ts
index 052fce0..0460e0b 100644
--- a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_pt_BR.ts
+++ b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_pt_BR.ts
@@ -364,7 +364,7 @@
</message>
<message>
<source>Show Session Information Window</source>
- <translation type="unfinished">Exibe Informações Sobre a Sessão</translation>
+ <translation>Exibe Janela de Informações Sobre a Sessão</translation>
</message>
<message>
<source>&Pause</source>
@@ -456,11 +456,11 @@
</message>
<message>
<source>&Insert Guest Additions CD image...</source>
- <translation type="unfinished">&Instalar Adicionais para Convidado...</translation>
+ <translation>&Inserir imagem de CD dos Adicionais para Convidado...</translation>
</message>
<message>
<source>Insert the Guest Additions disk file into the virtual drive</source>
- <translation type="unfinished">Montar a imagem de instalação dos Adicionais para Convidado</translation>
+ <translation>Inserir a imagem dos Adicionais para Convidado no drive virtual</translation>
</message>
<message>
<source>De&bug</source>
@@ -1096,6 +1096,10 @@
<comment>new</comment>
<translation type="obsolete">Montar a imagem de instalação dos Adicionais para Convidado</translation>
</message>
+ <message>
+ <source>&Webcams</source>
+ <translation>&Webcams</translation>
+ </message>
</context>
<context>
<name>UIApplianceEditorWidget</name>
@@ -4859,6 +4863,14 @@ p, li { white-space: pre-wrap; }
<source>Select a filename for the screenshot ...</source>
<translation>Selecione um nome para a tela capturada...</translation>
</message>
+ <message>
+ <source>No Webcams Connected</source>
+ <translation>Nenhuma Webcam Conectada</translation>
+ </message>
+ <message>
+ <source>No supported webcams connected to the host PC</source>
+ <translation>Não há webcam suportada conectada ao PC hospedeiro</translation>
+ </message>
</context>
<context>
<name>UIMachineSettingsAudio</name>
@@ -6050,7 +6062,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>Window</source>
- <translation type="unfinished"></translation>
+ <translation>Janela (&W)</translation>
</message>
</context>
<context>
@@ -7554,7 +7566,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source><p>The virtual machine window is optimized to work in <b>%1 bit</b> color mode but the virtual display is currently set to <b>%2 bit</b>.</p><p>Please open the display properties dialog of the guest OS and select a <b>%3 bit</b> color mode, if it is available, for best possible performance of the virtual video subsystem.</p><p><b>Note</b>. Some operating systems, like [...]
- <translation><p>A janela da máquina virtual está otimizada para trabalhar com o modo de cores de <b>%1 bits</b>, mas o modo de cores do monitor virtual está definido como <b>%2 bits</b>.</p><p>Abra o diálogo de propriedades do monitor no sistema operacional convidado e selecione um modo de cores de <b>%3 bits</b> se estiver disponível, de forma a obter a melhor performance possível do sub-sistema de [...]
+ <translation type="obsolete"><p>A janela da máquina virtual está otimizada para trabalhar com o modo de cores de <b>%1 bits</b>, mas o modo de cores do monitor virtual está definido como <b>%2 bits</b>.</p><p>Abra o diálogo de propriedades do monitor no sistema operacional convidado e selecione um modo de cores de <b>%3 bits</b> se estiver disponível, de forma a obter a melhor performance possível do [...]
</message>
<message>
<source><p>A critical error has occurred while running the virtual machine and the machine execution has been stopped.</p><p>For help, please see the Community section on <a href=http://www.virtualbox.org>http://www.virtualbox.org</a> or your support contract. Please provide the contents of the log file <tt>VBox.log</tt> and the image file <tt>VBox.png</tt>, which you can find in the <nobr><b>%1</b></nobr& [...]
@@ -7667,7 +7679,7 @@ p, li { white-space: pre-wrap; }
<message>
<source>Insert</source>
<comment>additions</comment>
- <translation type="unfinished">Montar</translation>
+ <translation>Inserir</translation>
</message>
<message>
<source><p>The host key is currently defined as <b>%1</b>.</p></source>
@@ -8446,7 +8458,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source><p>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 <b>Insert Guest Additions CD image</b> from the <b>Devices</b> menu. If they are installed but the machine is not yet fully starte [...]
- <translation type="unfinished"><p>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 <b>Instalar Adicionais para Convidado</b> no menu <b>Máquina</b>. Caso j [...]
+ <translation><p>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 <b>Inserir Imagem dos Adicionais para Convidado</b> no menu <b>Dispositivos</b>. Caso já e [...]
</message>
<message>
<source><p>The virtual machine window will be now switched to <b>fullscreen</b> mode. You can go back to windowed mode at any time by pressing <b>%1</b>.</p><p>Note that the <i>Host</i> key is currently defined as <b>%2</b>.</p><p>Note that the main menu bar is hidden in fullscreen mode. You can access it by pressing <b>Host+Home</b>.</p></source>
@@ -9004,6 +9016,18 @@ p, li { white-space: pre-wrap; }
<comment>additions-new</comment>
<translation type="obsolete">Montar</translation>
</message>
+ <message>
+ <source>Failed to attach the webcam <b>%1</b> to the virtual machine <b>%2</b>.</source>
+ <translation>Falha ao conectar a webcam <b>%1</b> à máquina virtual <b>%2</b>.</translation>
+ </message>
+ <message>
+ <source>Failed to detach the webcam <b>%1</b> from the virtual machine <b>%2</b>.</source>
+ <translation>Falha ao desconectar a webcam <b>%1</b> da máquina virtual <b>%2</b>.</translation>
+ </message>
+ <message>
+ <source><p>The virtual screen is currently set to a <b>%1 bit</b> color mode. For better performance please change this to <b>%2 bit</b>. This can usually be done from the <b>Display</b> section of the guest operating system's Control Panel or System Settings.</p></source>
+ <translation><p>A tela virtual está definida atualmente para o modo de cores <b>%1 bit</b>. Para melhor performance, mude para o modo de cores <b>%2 bit</b>. Normalmente isto pode ser feito na seção <b>Monitor</b> do Painel de Controle ou Configurações do Sistema do sistema convidado.</p></translation>
+ </message>
</context>
<context>
<name>UIMiniProcessWidgetAdditions</name>
@@ -12718,7 +12742,7 @@ Versão %1</translation>
</message>
<message>
<source>The actual default path value will be displayed after accepting the changes and opening this window again.</source>
- <translation type="unfinished">O valor padrão real será exibido após aceitar as mudanças e abrir este diálogo novamente.</translation>
+ <translation>O valor padrão real será exibido após aceitar as mudanças e abrir este diálogo novamente.</translation>
</message>
<message>
<source><not selected></source>
diff --git a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_ro.ts b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_ro.ts
index 70d414e..c444f05 100644
--- a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_ro.ts
+++ b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_ro.ts
@@ -921,6 +921,10 @@
<comment>new</comment>
<translation type="obsolete">Montează imaginea de instalare Guest Additions</translation>
</message>
+ <message>
+ <source>&Webcams</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIApplianceEditorWidget</name>
@@ -3878,6 +3882,14 @@ Acest director este folosit, dacă nu este explicit specificat altfel, atunci c
<source>Select a filename for the screenshot ...</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>No Webcams Connected</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>No supported webcams connected to the host PC</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIMachineSettingsAudio</name>
@@ -6299,7 +6311,7 @@ Acest director este folosit, dacă nu este explicit specificat altfel, atunci c
</message>
<message>
<source><p>The virtual machine window is optimized to work in <b>%1 bit</b> color mode but the virtual display is currently set to <b>%2 bit</b>.</p><p>Please open the display properties dialog of the guest OS and select a <b>%3 bit</b> color mode, if it is available, for best possible performance of the virtual video subsystem.</p><p><b>Note</b>. Some operating systems, like [...]
- <translation><p>Fereastra mașinii virtuale este optimizată pentru lucrul în modul de culori <b>%1 bit</b>, dar calitatea culorii al ecranului virtual este în prezent setată la <b>%2 bit</b>.</p><p>Vă rugăm deschideți dialogul de proprietăți ecran ale SO musafir și selectați modul de culoare <b>%3 bit</b>, dacă este disponibil, pentru cea mai bună performanță posibilă a subsistemului video virtual.< [...]
+ <translation type="obsolete"><p>Fereastra mașinii virtuale este optimizată pentru lucrul în modul de culori <b>%1 bit</b>, dar calitatea culorii al ecranului virtual este în prezent setată la <b>%2 bit</b>.</p><p>Vă rugăm deschideți dialogul de proprietăți ecran ale SO musafir și selectați modul de culoare <b>%3 bit</b>, dacă este disponibil, pentru cea mai bună performanță posibilă a subsistemului v [...]
</message>
<message>
<source><p>A critical error has occurred while running the virtual machine and the machine execution has been stopped.</p><p>For help, please see the Community section on <a href=http://www.virtualbox.org>http://www.virtualbox.org</a> or your support contract. Please provide the contents of the log file <tt>VBox.log</tt> and the image file <tt>VBox.png</tt>, which you can find in the <nobr><b>%1</b></nobr& [...]
@@ -7425,6 +7437,18 @@ Acest director este folosit, dacă nu este explicit specificat altfel, atunci c
<source><p>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 <b>Insert Guest Additions CD image</b> from the <b>Devices</b> menu. If they are installed but the machine is not yet fully starte [...]
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Failed to attach the webcam <b>%1</b> to the virtual machine <b>%2</b>.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to detach the webcam <b>%1</b> from the virtual machine <b>%2</b>.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p>The virtual screen is currently set to a <b>%1 bit</b> color mode. For better performance please change this to <b>%2 bit</b>. This can usually be done from the <b>Display</b> section of the guest operating system's Control Panel or System Settings.</p></source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIMiniProcessWidgetAdditions</name>
diff --git a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_ru.ts b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_ru.ts
index 6efd92b..f4b443a 100644
--- a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_ru.ts
+++ b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_ru.ts
@@ -5675,6 +5675,10 @@ p, li { white-space: pre-wrap; }
<source>If checked, this shared folder will be permanent.</source>
<translation>Если стоит галочка, выбранная общая папка будет постоянной для данной машины.</translation>
</message>
+ <message>
+ <source>Window</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIMachineSettingsSerial</name>
@@ -7066,7 +7070,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source><p>The virtual machine window is optimized to work in <b>%1 bit</b> color mode but the virtual display is currently set to <b>%2 bit</b>.</p><p>Please open the display properties dialog of the guest OS and select a <b>%3 bit</b> color mode, if it is available, for best possible performance of the virtual video subsystem.</p><p><b>Note</b>. Some operating systems, like [...]
- <translation><p>Окно виртуальной машины оптимизировано для работы в режиме <b>%1-битной</b> цветопередачи, однако в настоящий момент виртуальный дисплей работает в <b>%2-битном</b> режиме.</p><p>Откройте диалог свойств дисплея гостевой ОС и выберите <b>%3-битный</b> режим цветопередачи (если он доступен) для обеспечения наилучшей производительности виртуальной видеоподсистемы.</p><p><b>Примечание</b>. Н [...]
+ <translation type="obsolete"><p>Окно виртуальной машины оптимизировано для работы в режиме <b>%1-битной</b> цветопередачи, однако в настоящий момент виртуальный дисплей работает в <b>%2-битном</b> режиме.</p><p>Откройте диалог свойств дисплея гостевой ОС и выберите <b>%3-битный</b> режим цветопередачи (если он доступен) для обеспечения наилучшей производительности виртуальной видеоподсистемы.</p><p><b>Примеча [...]
</message>
<message>
<source><p>You didn'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 window or the First Run Wizard.</p><p>Do you wish to continue?</p></source>
@@ -8425,6 +8429,10 @@ p, li { white-space: pre-wrap; }
<comment>additions</comment>
<translation>Подключить</translation>
</message>
+ <message>
+ <source><p>The virtual screen is currently set to a <b>%1 bit</b> color mode. For better performance please change this to <b>%2 bit</b>. This can usually be done from the <b>Display</b> section of the guest operating system's Control Panel or System Settings.</p></source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIMiniProcessWidgetAdditions</name>
diff --git a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_sk.ts b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_sk.ts
index cb87637..194b1c7 100644
--- a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_sk.ts
+++ b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_sk.ts
@@ -923,6 +923,10 @@
<comment>new</comment>
<translation type="obsolete">Pripojí inštalačný obraz Hosťovských doplnkov</translation>
</message>
+ <message>
+ <source>&Webcams</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIApplianceEditorWidget</name>
@@ -4242,6 +4246,14 @@
<source>Select a filename for the screenshot ...</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>No Webcams Connected</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>No supported webcams connected to the host PC</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIMachineSettingsAudio</name>
@@ -6371,10 +6383,6 @@
<translation type="obsolete"><p>Nepodarilo sa stiahnuť obraz CD Hosťovských doplnkov VirtualBox z <nobr><a href="%1">%2</a>.</nobr></p><p>%3</p></translation>
</message>
<message>
- <source><p>The virtual machine window is optimized to work in <b>%1 bit</b> color mode but the virtual display is currently set to <b>%2 bit</b>.</p><p>Please open the display properties dialog of the guest OS and select a <b>%3 bit</b> color mode, if it is available, for best possible performance of the virtual video subsystem.</p><p><b>Note</b>. Some operating systems, like [...]
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>Failed to open the license file <nobr><b>%1</b></nobr>. Check file permissions.</source>
<translation type="unfinished"></translation>
</message>
@@ -7397,6 +7405,18 @@
<source><p>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 <b>Insert Guest Additions CD image</b> from the <b>Devices</b> menu. If they are installed but the machine is not yet fully starte [...]
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Failed to attach the webcam <b>%1</b> to the virtual machine <b>%2</b>.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to detach the webcam <b>%1</b> from the virtual machine <b>%2</b>.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p>The virtual screen is currently set to a <b>%1 bit</b> color mode. For better performance please change this to <b>%2 bit</b>. This can usually be done from the <b>Display</b> section of the guest operating system's Control Panel or System Settings.</p></source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIMiniProcessWidgetAdditions</name>
diff --git a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_sr.ts b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_sr.ts
index 1bfc471..efe4d42 100644
--- a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_sr.ts
+++ b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_sr.ts
@@ -890,6 +890,10 @@
<comment>new</comment>
<translation type="obsolete">Монтирај слику 'додатака госта'</translation>
</message>
+ <message>
+ <source>&Webcams</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIApplianceEditorWidget</name>
@@ -4303,6 +4307,14 @@ p, li { white-space: pre-wrap; }
<source>Select a filename for the screenshot ...</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>No Webcams Connected</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>No supported webcams connected to the host PC</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIMachineSettingsAudio</name>
@@ -6742,7 +6754,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source><p>The virtual machine window is optimized to work in <b>%1 bit</b> color mode but the virtual display is currently set to <b>%2 bit</b>.</p><p>Please open the display properties dialog of the guest OS and select a <b>%3 bit</b> color mode, if it is available, for best possible performance of the virtual video subsystem.</p><p><b>Note</b>. Some operating systems, like [...]
- <translation><p>Прозор машине је оптимизован за рад у <b>%1 бита</b> боје, али је актуелно <b>%2 бита</b>.</p><p>Молимо да отворите дијалог дисплеја госта и да одаберете <b>%3 бита</b> боја, ако је доступно, за најбоље перформансе подсистема.</p><p><b>Белешка</b>. Неки системи, као OS/2, могу радити у 32 бита али показује као 24 бита (16 милиона боја). Может [...]
+ <translation type="obsolete"><p>Прозор машине је оптимизован за рад у <b>%1 бита</b> боје, али је актуелно <b>%2 бита</b>.</p><p>Молимо да отворите дијалог дисплеја госта и да одаберете <b>%3 бита</b> боја, ако је доступно, за најбоље перформансе подсистема.</p><p><b>Белешка</b>. Неки системи, као OS/2, могу радити у 32 бита али показује као 24 бита (16 мили [...]
</message>
<message>
<source><p>You didn'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 window or the First Run Wizard.</p><p>Do you wish to continue?</p></source>
@@ -8081,6 +8093,18 @@ p, li { white-space: pre-wrap; }
<comment>additions-new</comment>
<translation type="obsolete">Монтирај</translation>
</message>
+ <message>
+ <source>Failed to attach the webcam <b>%1</b> to the virtual machine <b>%2</b>.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to detach the webcam <b>%1</b> from the virtual machine <b>%2</b>.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p>The virtual screen is currently set to a <b>%1 bit</b> color mode. For better performance please change this to <b>%2 bit</b>. This can usually be done from the <b>Display</b> section of the guest operating system's Control Panel or System Settings.</p></source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIMiniProcessWidgetAdditions</name>
diff --git a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_sv.ts b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_sv.ts
index 371c64a..f703ee7 100644
--- a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_sv.ts
+++ b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_sv.ts
@@ -991,6 +991,10 @@
<comment>new</comment>
<translation type="obsolete">Montera installationsavbildningen för Gästtillägg</translation>
</message>
+ <message>
+ <source>&Webcams</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIApplianceEditorWidget</name>
@@ -4649,6 +4653,14 @@ p, li { white-space: pre-wrap; }
<source>Select a filename for the screenshot ...</source>
<translation type="unfinished">Välj ett filnamn för skärmbilden ...</translation>
</message>
+ <message>
+ <source>No Webcams Connected</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>No supported webcams connected to the host PC</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIMachineSettingsAudio</name>
@@ -7289,7 +7301,7 @@ serial ports</comment>
</message>
<message>
<source><p>The virtual machine window is optimized to work in <b>%1 bit</b> color mode but the virtual display is currently set to <b>%2 bit</b>.</p><p>Please open the display properties dialog of the guest OS and select a <b>%3 bit</b> color mode, if it is available, for best possible performance of the virtual video subsystem.</p><p><b>Note</b>. Some operating systems, like [...]
- <translation><p>Det virtuella maskinfönstret är optimerat till att arbeta i <b>%1-bitars</b> färgläge men färgkvaliteten för den virtuella displayen är för närvarande inställd till <b>%2 bitar</b>.</p><p>Öppna dialogrutan för displayegenskaper i gästoperativsystemet och välj ett <b>%3-bitars</b> färgläge, om det finns tillgängligt, för bästa tänkbara prestanda för det virtuella grafiksystemet.</p><p><b& [...]
+ <translation type="obsolete"><p>Det virtuella maskinfönstret är optimerat till att arbeta i <b>%1-bitars</b> färgläge men färgkvaliteten för den virtuella displayen är för närvarande inställd till <b>%2 bitar</b>.</p><p>Öppna dialogrutan för displayegenskaper i gästoperativsystemet och välj ett <b>%3-bitars</b> färgläge, om det finns tillgängligt, för bästa tänkbara prestanda för det virtuella grafiksystemet.</p> [...]
</message>
<message>
<source><p>A critical error has occurred while running the virtual machine and the machine execution has been stopped.</p><p>For help, please see the Community section on <a href=http://www.virtualbox.org>http://www.virtualbox.org</a> or your support contract. Please provide the contents of the log file <tt>VBox.log</tt> and the image file <tt>VBox.png</tt>, which you can find in the <nobr><b>%1</b></nobr& [...]
@@ -8727,6 +8739,18 @@ serial ports</comment>
<comment>additions-new</comment>
<translation type="obsolete">Montera</translation>
</message>
+ <message>
+ <source>Failed to attach the webcam <b>%1</b> to the virtual machine <b>%2</b>.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to detach the webcam <b>%1</b> from the virtual machine <b>%2</b>.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p>The virtual screen is currently set to a <b>%1 bit</b> color mode. For better performance please change this to <b>%2 bit</b>. This can usually be done from the <b>Display</b> section of the guest operating system's Control Panel or System Settings.</p></source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIMiniProcessWidgetAdditions</name>
diff --git a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_tr.ts b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_tr.ts
index e3beb66..ec8ac9a 100644
--- a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_tr.ts
+++ b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_tr.ts
@@ -353,7 +353,7 @@
</message>
<message>
<source>Show Session Information Window</source>
- <translation type="unfinished">Oturum Bilgileri İletisi Göster</translation>
+ <translation>Oturum Bilgisi Penceresi Göster</translation>
</message>
<message>
<source>&Pause</source>
@@ -906,6 +906,10 @@
<source>Popup Menu</source>
<translation>Açılır Menü</translation>
</message>
+ <message>
+ <source>&Webcams</source>
+ <translation>&Web kameraları</translation>
+ </message>
</context>
<context>
<name>UIActonPool</name>
@@ -3756,6 +3760,14 @@
<source>Select a filename for the screenshot ...</source>
<translation>Ekran görüntüsü için bir dosya adı seçin...</translation>
</message>
+ <message>
+ <source>No Webcams Connected</source>
+ <translation>Bağlanmış Web Kameraları Yok</translation>
+ </message>
+ <message>
+ <source>No supported webcams connected to the host PC</source>
+ <translation>Anamakineye bağlanmış desteklenen web kameraları yok</translation>
+ </message>
</context>
<context>
<name>UIMachineSettingsAudio</name>
@@ -6107,7 +6119,7 @@
</message>
<message>
<source><p>The virtual machine window is optimized to work in <b>%1 bit</b> color mode but the virtual display is currently set to <b>%2 bit</b>.</p><p>Please open the display properties dialog of the guest OS and select a <b>%3 bit</b> color mode, if it is available, for best possible performance of the virtual video subsystem.</p><p><b>Note</b>. Some operating systems, like [...]
- <translation><p>Sanal makine penceresi <b>%1 bit</b> renk kipinde çalışması için uyarlandı ama sanal ekran şu anda <b>%2 bit</b> olarak ayarlı.</p><p>Sanal görüntü alt sisteminin mümkün olan en iyi performansı için eğer kullanılabilirse, lütfen misafir İS'nin ekran özellikleri iletisini açın ve <b>%3 bit</b> renk kipini seçin.</p><p><b>Not</b>. Bazı işletim sistemleri, OS [...]
+ <translation type="obsolete"><p>Sanal makine penceresi <b>%1 bit</b> renk kipinde çalışması için uyarlandı ama sanal ekran şu anda <b>%2 bit</b> olarak ayarlı.</p><p>Sanal görüntü alt sisteminin mümkün olan en iyi performansı için eğer kullanılabilirse, lütfen misafir İS'nin ekran özellikleri iletisini açın ve <b>%3 bit</b> renk kipini seçin.</p><p><b>Not</b>. Bazı işleti [...]
</message>
<message>
<source>Failed to find license files in <nobr><b>%1</b></nobr>.</source>
@@ -7333,6 +7345,18 @@
<comment>additions-new</comment>
<translation type="obsolete">Bağla</translation>
</message>
+ <message>
+ <source>Failed to attach the webcam <b>%1</b> to the virtual machine <b>%2</b>.</source>
+ <translation><b>%2</b> sanal makinesine <b>%1</b> web kamerasını takma başarısız.</translation>
+ </message>
+ <message>
+ <source>Failed to detach the webcam <b>%1</b> from the virtual machine <b>%2</b>.</source>
+ <translation><b>%2</b> sanal makinesinden <b>%1</b> web kamerasını çıkartma başarısız.</translation>
+ </message>
+ <message>
+ <source><p>The virtual screen is currently set to a <b>%1 bit</b> color mode. For better performance please change this to <b>%2 bit</b>. This can usually be done from the <b>Display</b> section of the guest operating system's Control Panel or System Settings.</p></source>
+ <translation><p>Sanal ekran şu anda <b>%1 bit</b> renk kipine ayarlı. Daha iyi performans için lütfen bunu <b>%2 bit</b> olarak değiştirin. Bu genelde misafir işletim sisteminin Denetim Masasının ya da Sistem Ayarlarının <b>Görüntü</b> bölümünden yapılabilir.</p></translation>
+ </message>
</context>
<context>
<name>UIMiniProcessWidgetAdditions</name>
diff --git a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_uk.ts b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_uk.ts
index 8ac3ecb..1667938 100644
--- a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_uk.ts
+++ b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_uk.ts
@@ -964,6 +964,10 @@
<comment>new</comment>
<translation type="obsolete">Змонтувати гостьові доповнення з установчого образу</translation>
</message>
+ <message>
+ <source>&Webcams</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIApplianceEditorWidget</name>
@@ -4326,6 +4330,14 @@ p, li { white-space: pre-wrap; }
<source>Select a filename for the screenshot ...</source>
<translation>Вибрати назву для файла змінку…</translation>
</message>
+ <message>
+ <source>No Webcams Connected</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>No supported webcams connected to the host PC</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIMachineSettingsAudio</name>
@@ -6771,7 +6783,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source><p>The virtual machine window is optimized to work in <b>%1 bit</b> color mode but the virtual display is currently set to <b>%2 bit</b>.</p><p>Please open the display properties dialog of the guest OS and select a <b>%3 bit</b> color mode, if it is available, for best possible performance of the virtual video subsystem.</p><p><b>Note</b>. Some operating systems, like [...]
- <translation><p>Вікно віртуальної машини оптимізоване для роботи в режимі <b>%1 біт</b> кольорів, але зараз встановлено <b>%2 біт</b> кольорів.</p><p>Будь ласка, відкрийте діалог властивостей екрана гостьової операційної системи і виберіть режим <b>%3 біт</b> кольорів, якщо це можливо, для найкращого виконання роботи віртуальної відеопідсистеми.</p><p><b>Майте на увазі</b>. Де [...]
+ <translation type="obsolete"><p>Вікно віртуальної машини оптимізоване для роботи в режимі <b>%1 біт</b> кольорів, але зараз встановлено <b>%2 біт</b> кольорів.</p><p>Будь ласка, відкрийте діалог властивостей екрана гостьової операційної системи і виберіть режим <b>%3 біт</b> кольорів, якщо це можливо, для найкращого виконання роботи віртуальної відеопідсистеми.</p><p><b>Майте на ува [...]
</message>
<message>
<source><p>You didn'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 window or the First Run Wizard.</p><p>Do you wish to continue?</p></source>
@@ -8159,6 +8171,18 @@ p, li { white-space: pre-wrap; }
<comment>additions-new</comment>
<translation type="obsolete">Змонтувати</translation>
</message>
+ <message>
+ <source>Failed to attach the webcam <b>%1</b> to the virtual machine <b>%2</b>.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to detach the webcam <b>%1</b> from the virtual machine <b>%2</b>.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p>The virtual screen is currently set to a <b>%1 bit</b> color mode. For better performance please change this to <b>%2 bit</b>. This can usually be done from the <b>Display</b> section of the guest operating system's Control Panel or System Settings.</p></source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIMiniProcessWidgetAdditions</name>
diff --git a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_xx_YY.ts b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_xx_YY.ts
index e5e0fe9..e6f8de8 100644
--- a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_xx_YY.ts
+++ b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_xx_YY.ts
@@ -704,6 +704,10 @@
<source>Show Session Information Window</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>&Webcams</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIApplianceEditorWidget</name>
@@ -2234,6 +2238,14 @@
<source>Select a filename for the screenshot ...</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>No Webcams Connected</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>No supported webcams connected to the host PC</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIMachineSettingsAudio</name>
@@ -3975,10 +3987,6 @@
<translation type="unfinished"></translation>
</message>
<message>
- <source><p>The virtual machine window is optimized to work in <b>%1 bit</b> color mode but the virtual display is currently set to <b>%2 bit</b>.</p><p>Please open the display properties dialog of the guest OS and select a <b>%3 bit</b> color mode, if it is available, for best possible performance of the virtual video subsystem.</p><p><b>Note</b>. Some operating systems, like [...]
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>Failed to open the license file <nobr><b>%1</b></nobr>. Check file permissions.</source>
<translation type="unfinished"></translation>
</message>
@@ -4781,6 +4789,18 @@
<source><p>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 <b>Insert Guest Additions CD image</b> from the <b>Devices</b> menu. If they are installed but the machine is not yet fully starte [...]
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Failed to attach the webcam <b>%1</b> to the virtual machine <b>%2</b>.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to detach the webcam <b>%1</b> from the virtual machine <b>%2</b>.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p>The virtual screen is currently set to a <b>%1 bit</b> color mode. For better performance please change this to <b>%2 bit</b>. This can usually be done from the <b>Display</b> section of the guest operating system's Control Panel or System Settings.</p></source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIMiniToolBar</name>
diff --git a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_zh_CN.ts b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_zh_CN.ts
index f7b0a87..eade6e6 100644
--- a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_zh_CN.ts
+++ b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_zh_CN.ts
@@ -251,7 +251,7 @@
</message>
<message>
<source>Show Session Information Window</source>
- <translation type="unfinished">显示当前运行状态信息</translation>
+ <translation>显示当前运行状态信息</translation>
</message>
<message>
<source>&Pause</source>
@@ -323,7 +323,7 @@
</message>
<message>
<source>&Insert Guest Additions CD image...</source>
- <translation type="unfinished">安装增强功能(&I)...</translation>
+ <translation>安装增强功能(&I)...</translation>
</message>
<message>
<source>Insert the Guest Additions disk file into the virtual drive</source>
@@ -825,6 +825,10 @@
<comment>new</comment>
<translation type="obsolete">打开增强功能包所在虚拟光盘</translation>
</message>
+ <message>
+ <source>&Webcams</source>
+ <translation>摄像头(&W)</translation>
+ </message>
</context>
<context>
<name>UIApplianceEditorWidget</name>
@@ -3748,6 +3752,14 @@
<source>Select a filename for the screenshot ...</source>
<translation>选择屏幕快照的文件名...</translation>
</message>
+ <message>
+ <source>No Webcams Connected</source>
+ <translation>没有连接摄像头</translation>
+ </message>
+ <message>
+ <source>No supported webcams connected to the host PC</source>
+ <translation>没有可用摄像头连接到主机</translation>
+ </message>
</context>
<context>
<name>UIMachineSettingsAudio</name>
@@ -4524,7 +4536,7 @@
</message>
<message>
<source>Window</source>
- <translation type="unfinished"></translation>
+ <translation>窗口</translation>
</message>
</context>
<context>
@@ -5737,7 +5749,7 @@
</message>
<message>
<source><p>The virtual machine window is optimized to work in <b>%1 bit</b> color mode but the virtual display is currently set to <b>%2 bit</b>.</p><p>Please open the display properties dialog of the guest OS and select a <b>%3 bit</b> color mode, if it is available, for best possible performance of the virtual video subsystem.</p><p><b>Note</b>. Some operating systems, like [...]
- <translation><p>虚拟电脑工作在 <b>%1 位</b> 颜色模式时性能最优, 但当前虚拟电脑的颜色质量被设置为 <b>%2 位</b>.</p><p>请打开虚拟电脑系统上的显示属性对话框,并选择 <b>%3 位</b> 颜色模式.</p><p><b>请注意</b>. 有些操作系统, 象 OS/2, 可以工作在 32 位颜色模式, 但切报告为 24 位 (1600万色). 您可以通过选择一个不同的颜色质量来看看该信息是否会消失,或者您可以直接禁止该信息如果您能确定该操作系统不支持您所要求的颜色质量 (%4 位) .</p></translation>
+ <translation type="obsolete"><p>虚拟电脑工作在 <b>%1 位</b> 颜色模式时性能最优, 但当前虚拟电脑的颜色质量被设置为 <b>%2 位</b>.</p><p>请打开虚拟电脑系统上的显示属性对话框,并选择 <b>%3 位</b> 颜色模式.</p><p><b>请注意</b>. 有些操作系统, 象 OS/2, 可以工作在 32 位颜色模式, 但切报告为 24 位 (1600万色). 您可以通过选择一个不同的颜色质量来看看该信息是否会消失,或者您可以直接禁止该信息如果您能确定该操作系统不支持您所要求的颜色质量 (%4 位) .</p></translation>
</message>
<message>
<source><p>You didn'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 window or the First Run Wizard.</p><p>Do you wish to continue?</p></source>
@@ -6353,7 +6365,7 @@
<message>
<source><p>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 <b>Insert Guest Additions CD image</b> from the <b>Devices</b> menu. If they are installed but the machine is not yet fully starte [...]
<translatorcomment>TODO</translatorcomment>
- <translation type="unfinished"><p>VirtualBox功能增强包似乎在该虚拟机中不可用,没有它们,共享文件夹将无法使用。要在虚拟机内部使用共享文件夹,未安装功能增强包的话请安装,如果已安装而无法正常工作,请重新安装,要安装请从<b>设备</b>菜单中选择<b>安装功能增强</b>。如果已安装而虚拟机尚未完全启动,那么一旦启动完毕,共享文件夹将变为可用。</p></translation>
+ <translation><p>VirtualBox功能增强包似乎在该虚拟机中不可用,没有它们,共享文件夹将无法使用。要在虚拟机内部使用共享文件夹,未安装功能增强包的话请安装,如果已安装而无法正常工作,请重新安装,要安装请从<b>设备</b>菜单中选择<b>安装功能增强</b>。如果已安装而虚拟机尚未完全启动,那么一旦启动完毕,共享文件夹将变为可用。</p></translation>
</message>
<message>
<source><p>The virtual machine window will be now switched to <b>fullscreen</b> mode. You can go back to windowed mode at any time by pressing <b>%1</b>.</p><p>Note that the <i>Host</i> key is currently defined as <b>%2</b>.</p><p>Note that the main menu bar is hidden in fullscreen mode. You can access it by pressing <b>Host+Home</b>.</p></source>
@@ -6880,6 +6892,18 @@
<comment>additions-new</comment>
<translation type="obsolete">分配</translation>
</message>
+ <message>
+ <source>Failed to attach the webcam <b>%1</b> to the virtual machine <b>%2</b>.</source>
+ <translation>不能分配摄像头 <b>%1</b> 到虚拟电脑 <b>%2</b>.</translation>
+ </message>
+ <message>
+ <source>Failed to detach the webcam <b>%1</b> from the virtual machine <b>%2</b>.</source>
+ <translation>不能将 摄像头 <b>%1</b> 从虚拟电脑 <b>%2</b> 中释放.</translation>
+ </message>
+ <message>
+ <source><p>The virtual screen is currently set to a <b>%1 bit</b> color mode. For better performance please change this to <b>%2 bit</b>. This can usually be done from the <b>Display</b> section of the guest operating system's Control Panel or System Settings.</p></source>
+ <translation><p>虚拟显示屏目前设置为 <b>%1 位</b>颜色模式。 需要更好显示效果请切换至 <b>%2 位</b>。 通常可在虚拟电脑中操作系统的控制面板或系统设置的 <b>显示</b> 部分设定。</p></translation>
+ </message>
</context>
<context>
<name>UIMiniProcessWidgetUserManual</name>
diff --git a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_zh_TW.ts b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_zh_TW.ts
index 639201c..126bf8e 100644
--- a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_zh_TW.ts
+++ b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_zh_TW.ts
@@ -195,10 +195,6 @@
<translation>取得虛擬機器的快照</translation>
</message>
<message>
- <source>Show Session Information Window</source>
- <translation type="unfinished">顯示工作階段資訊視窗</translation>
- </message>
- <message>
<source>&Pause</source>
<translation>暫停(&P)</translation>
</message>
@@ -697,17 +693,20 @@
<translation>Popup Menu</translation>
</message>
<message>
- <source>&Insert Guest Additions CD image...</source>
- <translation type="unfinished">插入 Guest Additions 安裝程式(&I)...</translation>
- </message>
- <message>
<source>Insert the Guest Additions disk file into the virtual drive</source>
<translation>插入 Guest Additions 磁碟檔案到虛擬磁碟機</translation>
</message>
<message>
<source>&Insert Guest Additions CD image...</source>
- <comment>new</comment>
- <translation type="obsolete">插入 Guest Additions 安裝程式(&I)...</translation>
+ <translation>插入 Guest Additions CD 映像(&I)...</translation>
+ </message>
+ <message>
+ <source>Show Session Information Window</source>
+ <translation>顯示工作階段資訊視窗</translation>
+ </message>
+ <message>
+ <source>&Webcams</source>
+ <translation>Webcams(&W)</translation>
</message>
</context>
<context>
@@ -2239,6 +2238,14 @@
<source>Select a filename for the screenshot ...</source>
<translation>選取快照的檔案名稱 ...</translation>
</message>
+ <message>
+ <source>No Webcams Connected</source>
+ <translation>未連接 Webcams</translation>
+ </message>
+ <message>
+ <source>No supported webcams connected to the host PC</source>
+ <translation>未連接支援的 Webcams 在主機電腦</translation>
+ </message>
</context>
<context>
<name>UIMachineSettingsAudio</name>
@@ -2896,10 +2903,6 @@
<translation>編輯共用</translation>
</message>
<message>
- <source>Dialog</source>
- <translation type="obsolete">Dialog</translation>
- </message>
- <message>
<source>Folder Path:</source>
<translation>資料夾路徑:</translation>
</message>
@@ -2921,7 +2924,7 @@
</message>
<message>
<source>&Make Permanent</source>
- <translation>永久性(&M)</translation>
+ <translation>設為永久(&M)</translation>
</message>
<message>
<source>When checked, the guest OS will try to automatically mount the shared folder on startup.</source>
@@ -2937,7 +2940,7 @@
</message>
<message>
<source>Window</source>
- <translation type="unfinished"></translation>
+ <translation>視窗</translation>
</message>
</context>
<context>
@@ -2949,7 +2952,7 @@
</message>
<message>
<source>When checked, enables the given serial port of the virtual machine.</source>
- <translation>勾選時,表示啟用給予的虛擬機器序列埠。</translation>
+ <translation>勾選時,虛擬機器啟用給予的序列埠。</translation>
</message>
<message>
<source>&Enable Serial Port</source>
@@ -2961,7 +2964,7 @@
</message>
<message>
<source>Selects the serial port number. You can choose one of the standard serial ports or select <b>User-defined</b> and specify port parameters manually.</source>
- <translation>選取序列埠號。您可以選擇標準序列埠之一,或是選擇<b>使用者定義</b>並手動指定連接埠參數。</translation>
+ <translation>選取序列埠號。 您可以選擇標準序列埠之一,或是選擇<b>使用者定義</b>並手動指定連接埠參數。</translation>
</message>
<message>
<source>&IRQ:</source>
@@ -2977,11 +2980,11 @@
</message>
<message>
<source>Controls the working mode of this serial port. If you select <b>Disconnected</b>, the guest OS will detect the serial port but will not be able to operate it.</source>
- <translation>控制這個序列埠的工作模式。如果您選取<b>已中斷連接</b>,客體作業系統將會偵測到序列埠但無法操作它。</translation>
+ <translation>控制這個序列埠的工作模式。 如果您選取<b>已中斷連接</b>,客體作業系統將偵測到序列埠但無法操作。</translation>
</message>
<message>
<source>If checked, the pipe specified in the <b>Port Path</b> field will be created by the virtual machine when it starts. Otherwise, the virtual machine will assume that the pipe exists and try to use it.</source>
- <translation>如果勾選,在<b>連接埠路徑</b>欄位中指定的管線將由虛擬機器於啟動時建立。 否則,虛擬機器將假設管線存在並嘗試使用它。</translation>
+ <translation>如果勾選,虛擬機器於啟動時將建立<b>連接埠路徑</b>欄位中指定的管線。 否則,虛擬機器將假設管線存在並嘗試使用。</translation>
</message>
<message>
<source>&Create Pipe</source>
@@ -2997,7 +3000,7 @@
</message>
<message>
<source>Holds the IRQ number of this serial port. This should be a whole number between <tt>0</tt> and <tt>255</tt>. Values greater than <tt>15</tt> may only be used if the <b>I/O APIC</b> setting is enabled for this virtual machine.</source>
- <translation>這個序列埠所使用的 IRQ 號碼。這應該是介於 <tt>0</tt> 與 <tt>255</tt> 之間的整數。 只有這部虛擬機器啟用 <b>I/O APIC</b> 時,才會使用大於 <tt>15</tt> 的值。</translation>
+ <translation>這個序列埠所使用的 IRQ 號碼。這應該是介於 <tt>0</tt> 與 <tt>255</tt> 之間的整數。 除非這部虛擬機器啟用 <b>I/O APIC</b> 時,才會使用大於 <tt>15</tt> 的值。</translation>
</message>
<message>
<source>Holds the base I/O port address of this serial port. Valid values are integer numbers in range from <tt>0</tt> to <tt>0xFFFF</tt>.</source>
@@ -3099,7 +3102,7 @@
</message>
<message>
<source>Removes the controller highlighted in the Storage Tree.</source>
- <translation>移除存放裝置樹中反白的控制器。</translation>
+ <translation>移除存放裝置樹中反白顯示的控制器。</translation>
</message>
<message>
<source>Adds a new attachment to the Storage Tree using currently selected controller as parent.</source>
@@ -3107,7 +3110,7 @@
</message>
<message>
<source>Removes the attachment highlighted in the Storage Tree.</source>
- <translation>移除存放裝置樹中反白的附件。</translation>
+ <translation>移除存放裝置樹中反白顯示的附件。</translation>
</message>
<message>
<source>Hard &Disk:</source>
@@ -3984,10 +3987,6 @@
<translation><p>從虛擬機器 <b>%3</b> 移除共用資料夾 <b>%1</b> (指向 <nobr><b>%2</b></nobr>) 時失敗。</p><p>請關閉客體作業系統中所有可能會用到這個共用資料夾的程式,並且再試一次。</p></translation>
</message>
<message>
- <source><p>The virtual machine window is optimized to work in <b>%1 bit</b> color mode but the virtual display is currently set to <b>%2 bit</b>.</p><p>Please open the display properties dialog of the guest OS and select a <b>%3 bit</b> color mode, if it is available, for best possible performance of the virtual video subsystem.</p><p><b>Note</b>. Some operating systems, like [...]
- <translation><p>虛擬機器視窗最佳化在 <b>%1 位元</b> 的色彩模式中工作,但是目前虛擬顯示設定為 <b>%2 位元</b>。</p><p>如果可用,請開啟客體作業系統的顯示內容對話方塊,並且選取 <b>%3 位元</b> 的色彩模式,作為虛擬視訊子系統的最佳效能。</p><p><b>請注意</b>,某些像是 OS/2 的作業系統,可能實際上作用於 32 位元模式,卻回報為 24 位元 (16 萬色) 。 您可以試著選取不同的色彩模式來查看這個訊息是否消失,如果您確定所要求的色彩模式 (%4 位元) 在客體作業系統中不可用,您可以現在簡單的停用訊息。</p></translation>
- </message>
- <message>
<source>Failed to open the license file <nobr><b>%1</b></nobr>. Check file permissions.</source>
<translation>開啟授權檔案 <nobr><b>%1</b></nobr> 失敗。 請檢查檔案權限。</translation>
</message>
@@ -4782,18 +4781,25 @@
<translation><p>您確定要移除 NAT 網路 <nobr><b>%1</b> 嗎?</nobr></p><p>如果一個或數個虛擬機器網路卡正在使用此網路,除非選擇不同的網路名稱或以不同的網路卡附加類型來修正其設定,否則這些網路卡將不再能使用。</p></translation>
</message>
<message>
- <source><p>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 <b>Insert Guest Additions CD image</b> from the <b>Devices</b> menu. If they are installed but the machine is not yet fully starte [...]
- <translation type="unfinished"><p>VirtualBox Guest Additions 似乎在這部虛擬機器不可使用,因此共用資料夾無法使用。 若要在虛擬機器內使用共用資料夾,如果未安裝則請安裝 Guest Additions ,或者如果是未正常動作則請重新安裝,從<b>裝置</b>功能表選取<b>插入 Guest Additions 安裝程式</b>。 如果已安裝但機器尚未完全啟動,則共用資料夾將在啟動後可以使用。</p></translation>
- </message>
- <message>
<source>Insert</source>
<comment>additions</comment>
<translation>插入</translation>
</message>
<message>
<source><p>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 <b>Insert Guest Additions CD image</b> from the <b>Devices</b> menu. If they are installed but the machine is not yet fully starte [...]
- <comment>new</comment>
- <translation type="obsolete"><p>VirtualBox Guest Additions 似乎在這部虛擬機器不可使用,因此共用資料夾無法使用。 若要在虛擬機器內使用共用資料夾,如果未安裝則請安裝 Guest Additions ,或者如果是未正常動作則請重新安裝,從<b>裝置</b>功能表選取<b>插入 Guest Additions 安裝程式</b>。 如果已安裝但機器尚未完全啟動,則共用資料夾將在啟動後可以使用。</p></translation>
+ <translation><p>VirtualBox Guest Additions 似乎在這部虛擬機器不可使用,因此共用資料夾無法使用。 若要在虛擬機器內使用共用資料夾,如果未安裝則請安裝 Guest Additions ,或者如果是未正常動作則請重新安裝,從<b>裝置</b>功能表選取<b>插入 Guest Additions CD 映像</b>。 如果已安裝但機器尚未完全啟動,則共用資料夾將在啟動後可以使用。</p></translation>
+ </message>
+ <message>
+ <source>Failed to attach the webcam <b>%1</b> to the virtual machine <b>%2</b>.</source>
+ <translation>附加 Webcam <b>%1</b> 到虛擬機器 <b>%2</b> 失敗。</translation>
+ </message>
+ <message>
+ <source>Failed to detach the webcam <b>%1</b> from the virtual machine <b>%2</b>.</source>
+ <translation>從虛擬機器 <b>%2</b> 附加 Webcam <b>%1</b> 失敗。</translation>
+ </message>
+ <message>
+ <source><p>The virtual screen is currently set to a <b>%1 bit</b> color mode. For better performance please change this to <b>%2 bit</b>. This can usually be done from the <b>Display</b> section of the guest operating system's Control Panel or System Settings.</p></source>
+ <translation><p>虛擬螢幕目前設成 <b>%1 位元</b>色彩模式。 為了更好的效能,請變更此為 <b>%2 位元</b>。 這通常能從客體作業系統的控制台或系統設定中的<b>顯示</b>區段完成。</p></translation>
</message>
</context>
<context>
diff --git a/src/VBox/Frontends/VirtualBox/nls/qt_it.ts b/src/VBox/Frontends/VirtualBox/nls/qt_it.ts
index b206f8c..38d66cc 100644
--- a/src/VBox/Frontends/VirtualBox/nls/qt_it.ts
+++ b/src/VBox/Frontends/VirtualBox/nls/qt_it.ts
@@ -1661,7 +1661,7 @@ Vuoi eliminarlo comunque?</translation>
</message>
<message>
<source>Server closed connection unexpectedly</source>
- <translation>Il server ha terminato inaspettatamente la connessione </translation>
+ <translation>Il server ha terminato inaspettatamente la connessione</translation>
</message>
<message>
<source>Connection refused</source>
@@ -1857,7 +1857,7 @@ Vuoi eliminarlo comunque?</translation>
</message>
<message>
<source>No space left on device</source>
- <translation>Non è rimasto spazio sul dispositivo</translation>
+ <translation>Spazio insufficiente sul dispositivo</translation>
</message>
<message>
<source>Unknown error</source>
@@ -1927,11 +1927,11 @@ Vuoi eliminarlo comunque?</translation>
</message>
<message>
<source>The file '%1' is not a valid Qt plugin.</source>
- <translation>Il file «%1» non è un'estensione Qt valida.</translation>
+ <translation>Il file '%1' non è un'estensione Qt valida.</translation>
</message>
<message>
<source>The plugin '%1' uses incompatible Qt library. (Cannot mix debug and release libraries.)</source>
- <translation>L'estensione «%1» utilizza una libreria Qt incompatibile. (Non è possibile mischiare librerie di debug e di rilascio.)</translation>
+ <translation>L'estensione '%1' utilizza una libreria Qt incompatibile. (Non è possibile mischiare librerie di debug e di rilascio.)</translation>
</message>
</context>
<context>
@@ -2442,19 +2442,19 @@ Vuoi eliminarlo comunque?</translation>
<name>QOCIResult</name>
<message>
<source>Unable to bind column for batch execute</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Impossibile associare la colonna per l'esecuzione sequenziale</translation>
</message>
<message>
<source>Unable to execute batch statement</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Impossibile eseguire l'istruzione sequenziale</translation>
</message>
<message>
<source>Unable to goto next</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Impossibile spostarsi al successivo</translation>
</message>
<message>
<source>Unable to alloc statement</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Impossibile allocare l'istruzione</translation>
</message>
<message>
<source>Unable to prepare statement</source>
@@ -3516,19 +3516,19 @@ Scegli un nome diverso.</translation>
</message>
<message>
<source>Bass Up</source>
- <translation type="unfinished"></translation>
+ <translation>Aumenta bassi</translation>
</message>
<message>
<source>Bass Down</source>
- <translation type="unfinished"></translation>
+ <translation>Riduci bassi</translation>
</message>
<message>
<source>Treble Up</source>
- <translation type="unfinished"></translation>
+ <translation>Aumenta alti</translation>
</message>
<message>
<source>Treble Down</source>
- <translation type="unfinished"></translation>
+ <translation>Riduci alti</translation>
</message>
<message>
<source>Media Play</source>
@@ -3778,7 +3778,7 @@ Scegli un nome diverso.</translation>
<name>QSocks5SocketEngine</name>
<message>
<source>Socks5 timeout error connecting to socks server</source>
- <translation>Connessione al server Socks5 fuori tempo massimo </translation>
+ <translation>Connessione al server Socks5 fuori tempo massimo</translation>
</message>
<message>
<source>Network operation timed out</source>
@@ -4475,19 +4475,19 @@ Scegli un nome diverso.</translation>
</message>
<message>
<source>version expected while reading the XML declaration</source>
- <translation type="unfinished"></translation>
+ <translation>versione attesa durante la lettura della dichiarazione XML</translation>
</message>
<message>
<source>wrong value for standalone declaration</source>
- <translation type="unfinished"></translation>
+ <translation>valore errato per la dichiarazione autonoma</translation>
</message>
<message>
<source>encoding declaration or standalone declaration expected while reading the XML declaration</source>
- <translation type="unfinished"></translation>
+ <translation>dichiarazione di codifica o dichiarazione autonoma attesa durante la lettura della dichiarazione XML</translation>
</message>
<message>
<source>standalone declaration expected while reading the XML declaration</source>
- <translation type="unfinished"></translation>
+ <translation>dichiarazione autonoma attesa durante la lettura della dichiarazione XML</translation>
</message>
<message>
<source>error occurred while parsing document type definition</source>
@@ -4626,15 +4626,15 @@ Scegli un nome diverso.</translation>
</message>
<message>
<source>%1 is an invalid processing instruction name.</source>
- <translation type="unfinished"></translation>
+ <translation>%1 non è un nome valido dell'istruzione di elaborazione.</translation>
</message>
<message>
<source>Invalid processing instruction name.</source>
- <translation type="unfinished"></translation>
+ <translation>Nome dell'istruzione di elaborazione non valido.</translation>
</message>
<message>
<source>Illegal namespace declaration.</source>
- <translation type="unfinished"></translation>
+ <translation>Dichiarazione dello spazio dei nomi non consentita.</translation>
</message>
<message>
<source>Invalid XML name.</source>
@@ -4654,7 +4654,7 @@ Scegli un nome diverso.</translation>
</message>
<message>
<source>Reference to external entity '%1' in attribute value.</source>
- <translation type="unfinished"></translation>
+ <translation>Riferimento all'entità esterna '%1' nel valore dell'attributo.</translation>
</message>
<message>
<source>Invalid character reference.</source>
@@ -4737,7 +4737,7 @@ Scegli un nome diverso.</translation>
</message>
<message>
<source>No operand in an integer division, %1, can be %2.</source>
- <translation type="unfinished"></translation>
+ <translation>Nessun operando in una divisione intera, %1, può essere %2.</translation>
</message>
<message>
<source>The first operand in an integer division, %1, cannot be infinity (%2).</source>
@@ -4789,11 +4789,11 @@ Scegli un nome diverso.</translation>
</message>
<message>
<source>Value %1 of type %2 exceeds maximum (%3).</source>
- <translation type="unfinished"></translation>
+ <translation>Il valore %1 di tipo %2 supera il massimo (%3).</translation>
</message>
<message>
<source>Value %1 of type %2 is below minimum (%3).</source>
- <translation type="unfinished"></translation>
+ <translation>Il valore %1 di tipo %2 è sotto il minimo (%3).</translation>
</message>
<message>
<source>A value of type %1 must contain an even number of digits. The value %2 does not.</source>
@@ -4801,11 +4801,11 @@ Scegli un nome diverso.</translation>
</message>
<message>
<source>%1 is not valid as a value of type %2.</source>
- <translation type="unfinished"></translation>
+ <translation>%1 non è un valore valido di tipo %2.</translation>
</message>
<message>
<source>Operator %1 cannot be used on type %2.</source>
- <translation type="unfinished"></translation>
+ <translation>L'operatore %1 non può essere utilizzato per il tipo %2.</translation>
</message>
<message>
<source>Operator %1 cannot be used on atomic values of type %2 and %3.</source>
@@ -4965,7 +4965,7 @@ Scegli un nome diverso.</translation>
</message>
<message>
<source>%1 and %2 match the start and end of a line.</source>
- <translation type="unfinished"></translation>
+ <translation>%1 e %2 corrispondo all'inizio e alla fine di una riga.</translation>
</message>
<message>
<source>Matches are case insensitive</source>
@@ -4997,7 +4997,7 @@ Scegli un nome diverso.</translation>
</message>
<message>
<source>The default collection is undefined</source>
- <translation type="unfinished"></translation>
+ <translation>La raccolta predefinita non è specificata</translation>
</message>
<message>
<source>%1 cannot be retrieved</source>
@@ -5013,7 +5013,7 @@ Scegli un nome diverso.</translation>
</message>
<message>
<source>%1 is not a whole number of minutes.</source>
- <translation type="unfinished"></translation>
+ <translation>%1 non è un numero intero di minuti.</translation>
</message>
<message>
<source>Required cardinality is %1; got cardinality %2.</source>
@@ -5053,7 +5053,7 @@ Scegli un nome diverso.</translation>
</message>
<message>
<source>No function with signature %1 is available</source>
- <translation type="unfinished"></translation>
+ <translation>Non è disponibile alcuna funzione con firma '%1'</translation>
</message>
<message>
<source>A default namespace declaration must occur before function, variable, and option declarations.</source>
@@ -5089,7 +5089,7 @@ Scegli un nome diverso.</translation>
</message>
<message>
<source>The target namespace of a %1 cannot be empty.</source>
- <translation type="unfinished"></translation>
+ <translation>Lo spazio dei nomi di destinazione di un %1 non può essere vuoto.</translation>
</message>
<message>
<source>The module import feature is not supported</source>
@@ -5117,7 +5117,7 @@ Scegli un nome diverso.</translation>
</message>
<message>
<source>A function already exists with the signature %1.</source>
- <translation type="unfinished"></translation>
+ <translation>Una funzione con firma %1 esiste già.</translation>
</message>
<message>
<source>No external functions are supported. All supported functions can be used directly, without first declaring them as external</source>
diff --git a/src/VBox/Frontends/VirtualBox/nls/qt_zh_CN.ts b/src/VBox/Frontends/VirtualBox/nls/qt_zh_CN.ts
index 24aff0d..f62bf20 100644
--- a/src/VBox/Frontends/VirtualBox/nls/qt_zh_CN.ts
+++ b/src/VBox/Frontends/VirtualBox/nls/qt_zh_CN.ts
@@ -2234,7 +2234,7 @@ Do you want to delete it anyway?</source>
</message>
<message>
<source><h3>About Qt</h3>%1<p>Qt is a C++ toolkit for cross-platform application development.</p><p>Qt provides single-source portability across MS Windows, Mac OS X, Linux, and all major commercial Unix variants. Qt is also available for embedded devices as Qt for Embedded Linux and Qt for Windows CE.</p><p>Qt is a Nokia product. See <a href="http://www.trolltech.com/qt/">www.trolltech.com/qt/&l [...]
- <translation type="unfinished"></translation>
+ <translation><h3>关于 Qt</h3>%1<p>Qt 是一种开发跨平台应用的 C++ 工具包。</p><p>Qt 提供单一代码移植性,适用于MS Windows, Mac OS X, Linux, 及主要的商业Unix。 Qt 亦可用于嵌入式设备,有 Qt Linux 嵌入版和 Qt Windows CE 版。</p><p>Qt 为 Nokia 产品。 访问 <a href="http://www.trolltech.com/qt/">www.trolltech.com/qt/</a> 获取更多信息。<b>注意</b>Qt新版位于 <a href="http://qt-project.org/">qt-project.org/</a> </p></translation>
</message>
</context>
<context>
@@ -2512,7 +2512,7 @@ Do you want to delete it anyway?</source>
<name>QODBCResult</name>
<message>
<source>QODBCResult::reset: Unable to set 'SQL_CURSOR_STATIC' as statement attribute. Please check your ODBC driver configuration</source>
- <translation>QODBCResult::reset: 不能把“SQL_CURSOR_STATIC”设置为语句属性。请检查你的ODBC驱动程序设置。</translation>
+ <translation>QODBCResult::reset: 不能把“SQL_CURSOR_STATIC”设置为语句属性。请检查你的ODBC驱动程序设置</translation>
</message>
<message>
<source>Unable to execute statement</source>
@@ -2851,7 +2851,8 @@ Please choose a different file name.</source>
</message>
<message>
<source>Executive</source>
- <translation type="unfinished">决策文书</translation>
+ <translatorcomment>TODO</translatorcomment>
+ <translation>决策文书</translation>
</message>
<message>
<source>Folio</source>
@@ -5261,7 +5262,7 @@ Please choose a different file name.</source>
</message>
<message>
<source>The namespace for a user defined function cannot be empty (try the predefined prefix %1 which exists for cases like this)</source>
- <translation type="unfinished"></translation>
+ <translation>用户定义的函数的命名空间不能为空(请试试预定义的前缀 %1,它就是用于这种情况的)</translation>
</message>
</context>
<context>
diff --git a/src/VBox/Frontends/VirtualBox/src/VBoxFBOverlay.cpp b/src/VBox/Frontends/VirtualBox/src/VBoxFBOverlay.cpp
index 4c2a431..3c7b8cb 100644
--- a/src/VBox/Frontends/VirtualBox/src/VBoxFBOverlay.cpp
+++ b/src/VBox/Frontends/VirtualBox/src/VBoxFBOverlay.cpp
@@ -42,6 +42,8 @@
/* Other VBox includes: */
#include <iprt/asm.h>
#include <iprt/semaphore.h>
+#include <iprt/memcache.h>
+
#include <VBox/VBoxGL2D.h>
#include <VBox/err.h>
@@ -66,8 +68,8 @@
#endif
#define VBOXQGL_STATE_NAMEBASE "QGLVHWAData"
-#define VBOXQGL_STATE_VERSION 3
-#define VBOXQGL_STATE_VERSION_PIPESAVED 3
+#define VBOXQGL_STATE_VERSION_PIPESAVED 3
+#define VBOXQGL_STATE_VERSION 3
#ifdef DEBUG
VBoxVHWADbgTimer::VBoxVHWADbgTimer(uint32_t cPeriods) :
@@ -174,6 +176,43 @@ static VBoxVHWAInfo g_VBoxVHWASupportInfo;
static bool g_bVBoxVHWAChecked = false;
static bool g_bVBoxVHWASupported = false;
+class VBoxVHWAEntriesCache
+{
+public:
+ VBoxVHWAEntriesCache()
+ {
+ int rc = RTMemCacheCreate(&mVBoxCmdEntryCache, sizeof (VBoxVHWACommandElement),
+ 0, /* size_t cbAlignment */
+ UINT32_MAX, /* uint32_t cMaxObjects */
+ NULL, /* PFNMEMCACHECTOR pfnCtor*/
+ NULL, /* PFNMEMCACHEDTOR pfnDtor*/
+ NULL, /* void *pvUser*/
+ 0 /* uint32_t fFlags*/
+ );
+ AssertRC(rc);
+ }
+
+ ~VBoxVHWAEntriesCache()
+ {
+ RTMemCacheDestroy(mVBoxCmdEntryCache);
+ }
+
+ VBoxVHWACommandElement * alloc()
+ {
+ return (VBoxVHWACommandElement*)RTMemCacheAlloc(mVBoxCmdEntryCache);
+ }
+
+ void free(VBoxVHWACommandElement * pEl)
+ {
+ RTMemCacheFree(mVBoxCmdEntryCache, pEl);
+ }
+
+private:
+ RTMEMCACHE mVBoxCmdEntryCache;
+};
+
+static VBoxVHWAEntriesCache g_VBoxCmdEntriesCache;
+
static struct VBOXVHWACMD * vhwaHHCmdCreate(VBOXVHWACMD_TYPE type, size_t size)
{
char *buf = (char*)malloc(VBOXVHWACMD_SIZE_FROMBODYSIZE(size));
@@ -210,20 +249,37 @@ class VBoxVHWACommandProcessEvent : public QEvent
{
public:
VBoxVHWACommandProcessEvent ()
- : QEvent ((QEvent::Type) VHWACommandProcessType)
+ : QEvent ((QEvent::Type) VHWACommandProcessType),
+ fProcessed(false)
{
#ifdef DEBUG_misha
g_EventCounter.inc();
#endif
}
-#ifdef DEBUG_misha
+
+ void setProcessed()
+ {
+ fProcessed = true;
+ }
+
~VBoxVHWACommandProcessEvent()
{
+ if (!fProcessed)
+ {
+ AssertMsgFailed(("VHWA command beinf destroyed unproceessed!"));
+ LogRel(("VHWA command being destroyed unproceessed!"));
+ }
+#ifdef DEBUG_misha
g_EventCounter.dec();
+#endif
}
-
+#ifdef DEBUG_misha
static uint32_t cPending() { return g_EventCounter.refs(); }
+#endif
+
private:
+ bool fProcessed;
+#ifdef DEBUG_misha
static VBoxVHWARefCounter g_EventCounter;
#endif
};
@@ -2538,6 +2594,7 @@ int VBoxVHWAImage::vhwaSurfaceDestroy(struct VBOXVHWACMD_SURF_DESTROY *pCmd)
}
else
{
+ Assert(pList);
Assert(pList->size() >= 1);
if(pList->size() > 1)
{
@@ -4175,44 +4232,10 @@ void VBoxQGLOverlay::updateAttachment(QWidget *pViewport, QObject *pPostEventObj
int VBoxQGLOverlay::reset()
{
- VBoxVHWACommandElement * pHead, * pTail;
- mCmdPipe.reset(&pHead, &pTail);
- if(pHead)
- {
- CDisplay display = mpSession->GetConsole().GetDisplay();
- Assert (!display.isNull());
-
- /* complete aborted commands */
- for(VBoxVHWACommandElement * pCur = pHead; pCur; pCur = pCur->mpNext)
- {
- switch(pCur->type())
- {
-#ifdef VBOX_WITH_VIDEOHWACCEL
- case VBOXVHWA_PIPECMD_VHWA:
- {
- struct VBOXVHWACMD * pCmd = pCur->vhwaCmd();
- pCmd->rc = VERR_INVALID_STATE;
- display.CompleteVHWACommand((BYTE*)pCmd);
- }
- break;
- case VBOXVHWA_PIPECMD_FUNC:
- /* should not happen, don't handle this for now */
- Assert(0);
- break;
-#endif
- case VBOXVHWA_PIPECMD_PAINT:
- break;
- default:
- /* should not happen, don't handle this for now */
- Assert(0);
- break;
- }
- }
+ CDisplay display = mpSession->GetConsole().GetDisplay();
+ Assert (!display.isNull());
- VBoxVHWACommandElement *pTest = mCmdPipe.detachCmdList(NULL, pHead, pTail);
- Assert(!pTest);
- NOREF(pTest);
- }
+ mCmdPipe.reset(&display);
resetGl();
@@ -4236,7 +4259,7 @@ int VBoxQGLOverlay::resetGl()
{
VBOXVHWACMD *pCmd = (*sIt);
VBOXVHWA_HH_CALLBACK_SET(pCmd, vbvaVHWAHHCommandFreeCmd, pCmd);
- mCmdPipe.postCmd(VBOXVHWA_PIPECMD_VHWA, pCmd, 0);
+ mCmdPipe.postCmd(VBOXVHWA_PIPECMD_VHWA, pCmd);
}
}
return VINF_SUCCESS;
@@ -4244,39 +4267,51 @@ int VBoxQGLOverlay::resetGl()
int VBoxQGLOverlay::onVHWACommand(struct VBOXVHWACMD * pCmd)
{
- uint32_t flags = 0;
+ Log(("VHWA Command >>> %#p, %d\n", pCmd, pCmd->enmCmd));
switch(pCmd->enmCmd)
{
case VBOXVHWACMD_TYPE_SURF_FLIP:
case VBOXVHWACMD_TYPE_SURF_OVERLAY_UPDATE:
case VBOXVHWACMD_TYPE_SURF_OVERLAY_SETPOSITION:
- flags |= VBOXVHWACMDPIPEC_COMPLETEEVENT;
break;
+ case VBOXVHWACMD_TYPE_HH_CONSTRUCT:
+ {
+ VBOXVHWACMD_HH_CONSTRUCT * pBody = VBOXVHWACMD_BODY(pCmd, VBOXVHWACMD_HH_CONSTRUCT);
+ pCmd->Flags &= ~VBOXVHWACMD_FLAG_HG_ASYNCH;
+ pCmd->rc = vhwaConstruct(pBody);
+ Log(("VHWA Command <<< Sync %#p, %d\n", pCmd, pCmd->enmCmd));
+ return VINF_SUCCESS;
+ }
case VBOXVHWACMD_TYPE_HH_RESET:
{
/* we do not post a reset command to the gui thread since this may lead to a deadlock
* when reset is initiated by the gui thread*/
pCmd->Flags &= ~VBOXVHWACMD_FLAG_HG_ASYNCH;
pCmd->rc = reset();
+ Log(("VHWA Command <<< Sync %#p, %d\n", pCmd, pCmd->enmCmd));
return VINF_SUCCESS;
}
case VBOXVHWACMD_TYPE_HH_ENABLE:
pCmd->Flags &= ~VBOXVHWACMD_FLAG_HG_ASYNCH;
pCmd->rc = VINF_SUCCESS;
+ Log(("VHWA Command <<< Sync %#p, %d\n", pCmd, pCmd->enmCmd));
return VINF_SUCCESS;
case VBOXVHWACMD_TYPE_HH_DISABLE:
pCmd->Flags &= ~VBOXVHWACMD_FLAG_HG_ASYNCH;
pCmd->rc = VINF_SUCCESS;
+ Log(("VHWA Command <<< Sync %#p, %d\n", pCmd, pCmd->enmCmd));
return VINF_SUCCESS;
case VBOXVHWACMD_TYPE_HH_SAVESTATE_SAVEBEGIN:
mCmdPipe.disable();
pCmd->Flags &= ~VBOXVHWACMD_FLAG_HG_ASYNCH;
pCmd->rc = VINF_SUCCESS;
+ Log(("VHWA Command <<< Sync %#p, %d\n", pCmd, pCmd->enmCmd));
return VINF_SUCCESS;
case VBOXVHWACMD_TYPE_HH_SAVESTATE_SAVEEND:
mCmdPipe.enable();
pCmd->Flags &= ~VBOXVHWACMD_FLAG_HG_ASYNCH;
pCmd->rc = VINF_SUCCESS;
+ Log(("VHWA Command <<< Sync %#p, %d\n", pCmd, pCmd->enmCmd));
return VINF_SUCCESS;
case VBOXVHWACMD_TYPE_HH_SAVESTATE_SAVEPERFORM:
{
@@ -4289,87 +4324,87 @@ int VBoxQGLOverlay::onVHWACommand(struct VBOXVHWACMD * pCmd)
}
pCmd->Flags &= ~VBOXVHWACMD_FLAG_HG_ASYNCH;
pCmd->rc = rc;
+ Log(("VHWA Command <<< Sync %#p, %d\n", pCmd, pCmd->enmCmd));
return VINF_SUCCESS;
}
case VBOXVHWACMD_TYPE_HH_SAVESTATE_LOADPERFORM:
{
VBOXVHWACMD_HH_SAVESTATE_LOADPERFORM *pLoad = VBOXVHWACMD_BODY(pCmd, VBOXVHWACMD_HH_SAVESTATE_LOADPERFORM);
PSSMHANDLE pSSM = pLoad->pSSM;
- uint32_t u32Version;
+ uint32_t u32Version = 0;
int rc = SSMR3GetU32(pSSM, &u32Version); Assert(RT_SUCCESS(rc) || rc == VERR_SSM_LOADED_TOO_MUCH);
if (RT_SUCCESS(rc))
{
rc = vhwaLoadExec(pSSM, u32Version); AssertRC(rc);
}
- else if (rc == VERR_SSM_LOADED_TOO_MUCH)
+ else
{
- rc = VINF_SUCCESS;
+ /* sanity */
+ u32Version = 0;
+
+ if (rc == VERR_SSM_LOADED_TOO_MUCH)
+ rc = VINF_SUCCESS;
}
pCmd->Flags &= ~VBOXVHWACMD_FLAG_HG_ASYNCH;
pCmd->rc = rc;
+ Log(("VHWA Command <<< Sync %#p, %d\n", pCmd, pCmd->enmCmd));
return VINF_SUCCESS;
}
+ case VBOXVHWACMD_TYPE_QUERY_INFO1:
+ {
+#ifdef RT_STRICT
+ VBOXVHWACMD_QUERYINFO1 * pBody = VBOXVHWACMD_BODY(pCmd, VBOXVHWACMD_QUERYINFO1);
+#endif
+ Assert(pBody->u.in.guestVersion.maj == VBOXVHWA_VERSION_MAJ);
+ Assert(pBody->u.in.guestVersion.min == VBOXVHWA_VERSION_MIN);
+ Assert(pBody->u.in.guestVersion.bld == VBOXVHWA_VERSION_BLD);
+ Assert(pBody->u.in.guestVersion.reserved == VBOXVHWA_VERSION_RSV);
+ /* do NOT break!! make it proceed asynchronously */
+ }
default:
break;
}
+
+ Log(("VHWA Command --- Going Async %#p, %d\n", pCmd, pCmd->enmCmd));
/* indicate that we process and complete the command asynchronously */
pCmd->Flags |= VBOXVHWACMD_FLAG_HG_ASYNCH;
- mCmdPipe.postCmd(VBOXVHWA_PIPECMD_VHWA, pCmd, flags);
- return VINF_SUCCESS;
+ mCmdPipe.postCmd(VBOXVHWA_PIPECMD_VHWA, pCmd);
+ return VINF_CALLBACK_RETURN;
}
void VBoxQGLOverlay::onVHWACommandEvent(QEvent * pEvent)
{
- Q_UNUSED(pEvent);
+ VBoxVHWACommandProcessEvent *pVhwaEvent = (VBoxVHWACommandProcessEvent*)pEvent;
+ /* sanity actually */
+ pVhwaEvent->setProcessed();
+
Assert(!mProcessingCommands);
mProcessingCommands = true;
Assert(!mGlCurrent);
mGlCurrent = false; /* just a fall-back */
- bool bFirstCmd = true;
- VBoxVHWACommandElement *pLast;
- VBoxVHWACommandElement * pFirst = mCmdPipe.detachCmdList(&pLast, NULL, NULL);
- while(pFirst) /* pFirst can be zero right after reset when all pending commands are flushed,
- * while events for those commands may still come along */
+ VBoxVHWACommandElement *pCmd = mCmdPipe.getCmd();
+ if (pCmd)
{
- VBoxVHWACommandElement * pLastProcessed = processCmdList(pFirst, bFirstCmd);
-
- if (pLastProcessed == pLast)
- {
- pFirst = mCmdPipe.detachCmdList(&pLast, pFirst, pLastProcessed);
- bFirstCmd = false;
- }
- else
- {
- mCmdPipe.putBack(pLastProcessed->mpNext, pLast, pFirst, pLastProcessed);
- break;
- }
+ processCmd(pCmd);
+ mCmdPipe.doneCmd();
}
mProcessingCommands = false;
repaint();
-// vboxOpExit();
mGlCurrent = false;
}
bool VBoxQGLOverlay::onNotifyUpdate(ULONG aX, ULONG aY,
ULONG aW, ULONG aH)
{
-#if 1
+ /* we do not to miss notify updates, because we have to update bg textures for it,
+ * so no not check for m_fIsMarkedAsUnused here,
+ * mOverlay will store the required info for us */
QRect r(aX, aY, aW, aH);
- mCmdPipe.postCmd(VBOXVHWA_PIPECMD_PAINT, &r, 0);
+ mCmdPipe.postCmd(VBOXVHWA_PIPECMD_PAINT, &r);
return true;
-#else
- /* We're not on the GUI thread and update() isn't thread safe in
- * Qt 4.3.x on the Win, Qt 3.3.x on the Mac (4.2.x is),
- * on Linux (didn't check Qt 4.x there) and probably on other
- * non-DOS platforms, so post the event instead. */
- QApplication::postEvent (mView,
- new VBoxRepaintEvent (aX, aY, aW, aH));
-
- return S_OK;
-#endif
}
void VBoxQGLOverlay::onResizeEventPostprocess (const VBoxFBSizeInfo &re, const QPoint & topLeft)
@@ -4377,17 +4412,23 @@ void VBoxQGLOverlay::onResizeEventPostprocess (const VBoxFBSizeInfo &re, const Q
mSizeInfo = re;
mContentsTopLeft = topLeft;
- if(mGlOn)
+ if (mGlOn)
{
+ Assert(mOverlayImage.hasSurfaces());
Assert(!mGlCurrent);
Assert(!mNeedOverlayRepaint);
mGlCurrent = false;
makeCurrent();
/* need to ensure we're in sync */
mNeedOverlayRepaint = vboxSynchGl();
+
+ if (!mOverlayImage.hasSurfaces())
+ vboxSetGlOn(false);
}
+ else
+ Assert(!mOverlayImage.hasSurfaces());
- if(!mOnResizeCmdList.empty())
+ if (!mOnResizeCmdList.empty())
{
for (VHWACommandList::const_iterator it = mOnResizeCmdList.begin();
it != mOnResizeCmdList.end(); ++ it)
@@ -4429,6 +4470,8 @@ void VBoxQGLOverlay::vboxDoVHWACmd(void *cmd)
CDisplay display = mpSession->GetConsole().GetDisplay();
Assert (!display.isNull());
+ Log(("VHWA Command <<< Async %#p, %d\n", cmd, ((VBOXVHWACMD *)cmd)->enmCmd));
+
display.CompleteVHWACommand((BYTE*)cmd);
}
@@ -4589,13 +4632,16 @@ void VBoxQGLOverlay::vboxDoVHWACmdExec(void *cmd)
case VBOXVHWACMD_TYPE_SURF_CANCREATE:
{
VBOXVHWACMD_SURF_CANCREATE * pBody = VBOXVHWACMD_BODY(pCmd, VBOXVHWACMD_SURF_CANCREATE);
+ Assert(!mGlOn == !mOverlayImage.hasSurfaces());
initGl();
makeCurrent();
pCmd->rc = mOverlayImage.vhwaSurfaceCanCreate(pBody);
+ Assert(!mGlOn == !mOverlayImage.hasSurfaces());
} break;
case VBOXVHWACMD_TYPE_SURF_CREATE:
{
VBOXVHWACMD_SURF_CREATE * pBody = VBOXVHWACMD_BODY(pCmd, VBOXVHWACMD_SURF_CREATE);
+ Assert(!mGlOn == !mOverlayImage.hasSurfaces());
initGl();
makeCurrent();
vboxSetGlOn(true);
@@ -4614,10 +4660,13 @@ void VBoxQGLOverlay::vboxDoVHWACmdExec(void *cmd)
vboxDoCheckUpdateViewport();
mNeedOverlayRepaint = true;
}
+
+ Assert(!mGlOn == !mOverlayImage.hasSurfaces());
} break;
case VBOXVHWACMD_TYPE_SURF_DESTROY:
{
VBOXVHWACMD_SURF_DESTROY * pBody = VBOXVHWACMD_BODY(pCmd, VBOXVHWACMD_SURF_DESTROY);
+ Assert(!mGlOn == !mOverlayImage.hasSurfaces());
initGl();
makeCurrent();
pCmd->rc = mOverlayImage.vhwaSurfaceDestroy(pBody);
@@ -4635,41 +4684,51 @@ void VBoxQGLOverlay::vboxDoVHWACmdExec(void *cmd)
vboxDoCheckUpdateViewport();
mNeedOverlayRepaint = true;
}
+ Assert(!mGlOn == !mOverlayImage.hasSurfaces());
} break;
case VBOXVHWACMD_TYPE_SURF_LOCK:
{
VBOXVHWACMD_SURF_LOCK * pBody = VBOXVHWACMD_BODY(pCmd, VBOXVHWACMD_SURF_LOCK);
+ Assert(!mGlOn == !mOverlayImage.hasSurfaces());
initGl();
makeCurrent();
pCmd->rc = mOverlayImage.vhwaSurfaceLock(pBody);
+ Assert(!mGlOn == !mOverlayImage.hasSurfaces());
} break;
case VBOXVHWACMD_TYPE_SURF_UNLOCK:
{
VBOXVHWACMD_SURF_UNLOCK * pBody = VBOXVHWACMD_BODY(pCmd, VBOXVHWACMD_SURF_UNLOCK);
+ Assert(!mGlOn == !mOverlayImage.hasSurfaces());
initGl();
makeCurrent();
pCmd->rc = vhwaSurfaceUnlock(pBody);
+ Assert(!mGlOn == !mOverlayImage.hasSurfaces());
/* mNeedOverlayRepaint is set inside the vhwaSurfaceUnlock */
} break;
case VBOXVHWACMD_TYPE_SURF_BLT:
{
VBOXVHWACMD_SURF_BLT * pBody = VBOXVHWACMD_BODY(pCmd, VBOXVHWACMD_SURF_BLT);
+ Assert(!mGlOn == !mOverlayImage.hasSurfaces());
initGl();
makeCurrent();
pCmd->rc = mOverlayImage.vhwaSurfaceBlt(pBody);
mNeedOverlayRepaint = true;
+ Assert(!mGlOn == !mOverlayImage.hasSurfaces());
} break;
case VBOXVHWACMD_TYPE_SURF_FLIP:
{
VBOXVHWACMD_SURF_FLIP * pBody = VBOXVHWACMD_BODY(pCmd, VBOXVHWACMD_SURF_FLIP);
+ Assert(!mGlOn == !mOverlayImage.hasSurfaces());
initGl();
makeCurrent();
pCmd->rc = mOverlayImage.vhwaSurfaceFlip(pBody);
mNeedOverlayRepaint = true;
+ Assert(!mGlOn == !mOverlayImage.hasSurfaces());
} break;
case VBOXVHWACMD_TYPE_SURF_OVERLAY_UPDATE:
{
VBOXVHWACMD_SURF_OVERLAY_UPDATE * pBody = VBOXVHWACMD_BODY(pCmd, VBOXVHWACMD_SURF_OVERLAY_UPDATE);
+ Assert(!mGlOn == !mOverlayImage.hasSurfaces());
initGl();
makeCurrent();
pCmd->rc = mOverlayImage.vhwaSurfaceOverlayUpdate(pBody);
@@ -4680,10 +4739,12 @@ void VBoxQGLOverlay::vboxDoVHWACmdExec(void *cmd)
}
vboxDoCheckUpdateViewport();
mNeedOverlayRepaint = true;
+ Assert(!mGlOn == !mOverlayImage.hasSurfaces());
} break;
case VBOXVHWACMD_TYPE_SURF_OVERLAY_SETPOSITION:
{
VBOXVHWACMD_SURF_OVERLAY_SETPOSITION * pBody = VBOXVHWACMD_BODY(pCmd, VBOXVHWACMD_SURF_OVERLAY_SETPOSITION);
+ Assert(!mGlOn == !mOverlayImage.hasSurfaces());
initGl();
makeCurrent();
pCmd->rc = mOverlayImage.vhwaSurfaceOverlaySetPosition(pBody);
@@ -4694,56 +4755,71 @@ void VBoxQGLOverlay::vboxDoVHWACmdExec(void *cmd)
}
vboxDoCheckUpdateViewport();
mNeedOverlayRepaint = true;
+ Assert(!mGlOn == !mOverlayImage.hasSurfaces());
} break;
#ifdef VBOX_WITH_WDDM
case VBOXVHWACMD_TYPE_SURF_COLORFILL:
{
VBOXVHWACMD_SURF_COLORFILL * pBody = VBOXVHWACMD_BODY(pCmd, VBOXVHWACMD_SURF_COLORFILL);
+ Assert(!mGlOn == !mOverlayImage.hasSurfaces());
initGl();
makeCurrent();
pCmd->rc = mOverlayImage.vhwaSurfaceColorFill(pBody);
mNeedOverlayRepaint = true;
+ Assert(!mGlOn == !mOverlayImage.hasSurfaces());
} break;
#endif
case VBOXVHWACMD_TYPE_SURF_COLORKEY_SET:
{
VBOXVHWACMD_SURF_COLORKEY_SET * pBody = VBOXVHWACMD_BODY(pCmd, VBOXVHWACMD_SURF_COLORKEY_SET);
+ Assert(!mGlOn == !mOverlayImage.hasSurfaces());
initGl();
makeCurrent();
pCmd->rc = mOverlayImage.vhwaSurfaceColorkeySet(pBody);
/* this is here to ensure we have color key changes picked up */
vboxDoCheckUpdateViewport();
mNeedOverlayRepaint = true;
+ Assert(!mGlOn == !mOverlayImage.hasSurfaces());
} break;
case VBOXVHWACMD_TYPE_QUERY_INFO1:
{
VBOXVHWACMD_QUERYINFO1 * pBody = VBOXVHWACMD_BODY(pCmd, VBOXVHWACMD_QUERYINFO1);
+ Assert(!mGlOn == !mOverlayImage.hasSurfaces());
initGl();
makeCurrent();
pCmd->rc = mOverlayImage.vhwaQueryInfo1(pBody);
+ Assert(!mGlOn == !mOverlayImage.hasSurfaces());
} break;
case VBOXVHWACMD_TYPE_QUERY_INFO2:
{
VBOXVHWACMD_QUERYINFO2 * pBody = VBOXVHWACMD_BODY(pCmd, VBOXVHWACMD_QUERYINFO2);
+ Assert(!mGlOn == !mOverlayImage.hasSurfaces());
initGl();
makeCurrent();
pCmd->rc = mOverlayImage.vhwaQueryInfo2(pBody);
+ Assert(!mGlOn == !mOverlayImage.hasSurfaces());
} break;
case VBOXVHWACMD_TYPE_ENABLE:
+ Assert(!mGlOn == !mOverlayImage.hasSurfaces());
initGl();
+ Assert(!mGlOn == !mOverlayImage.hasSurfaces());
case VBOXVHWACMD_TYPE_DISABLE:
pCmd->rc = VINF_SUCCESS;
break;
case VBOXVHWACMD_TYPE_HH_CONSTRUCT:
{
VBOXVHWACMD_HH_CONSTRUCT * pBody = VBOXVHWACMD_BODY(pCmd, VBOXVHWACMD_HH_CONSTRUCT);
+ Assert(!mGlOn == !mOverlayImage.hasSurfaces());
pCmd->rc = vhwaConstruct(pBody);
+ Assert(!mGlOn == !mOverlayImage.hasSurfaces());
} break;
#ifdef VBOX_WITH_WDDM
case VBOXVHWACMD_TYPE_SURF_GETINFO:
{
VBOXVHWACMD_SURF_GETINFO * pBody = VBOXVHWACMD_BODY(pCmd, VBOXVHWACMD_SURF_GETINFO);
+ Assert(!mGlOn == !mOverlayImage.hasSurfaces());
pCmd->rc = mOverlayImage.vhwaSurfaceGetInfo(pBody);
+ Assert(!mGlOn == !mOverlayImage.hasSurfaces());
} break;
#endif
default:
@@ -4849,14 +4925,10 @@ quint64 VBoxQGLOverlay::required2DOffscreenVideoMemory()
return _1M * 12;
}
-VBoxVHWACommandElement * VBoxQGLOverlay::processCmdList(VBoxVHWACommandElement * pCmd, bool bFirst)
+void VBoxQGLOverlay::processCmd(VBoxVHWACommandElement * pCmd)
{
- VBoxVHWACommandElement * pCur;
- do
+ switch(pCmd->type())
{
- pCur = pCmd;
- switch(pCmd->type())
- {
case VBOXVHWA_PIPECMD_PAINT:
addMainDirtyRect(pCmd->rect());
break;
@@ -4873,67 +4945,39 @@ VBoxVHWACommandElement * VBoxQGLOverlay::processCmdList(VBoxVHWACommandElement *
#endif
default:
Assert(0);
- }
-
- pCmd = pCmd->mpNext;
- if (!pCmd)
- break;
-
- if (!bFirst)
- {
- if (pCmd->isNewEvent())
- break;
- }
- else
- {
- Assert(pCur->isNewEvent());
- bFirst = false;
- }
- } while(1);
-
- return pCur;
+ }
}
-
VBoxVHWACommandElementProcessor::VBoxVHWACommandElementProcessor(QObject *pNotifyObject) :
m_pNotifyObject(pNotifyObject),
- mbNewEvent (false),
- mbProcessingList (false),
- mcDisabled (0)
+ mpCurCmd(NULL),
+ mbResetting(false),
+ mcDisabled(0)
{
int rc = RTCritSectInit(&mCritSect);
AssertRC(rc);
- for(int i = RT_ELEMENTS(mElementsBuffer) - 1; i >= 0; i--)
- {
- mFreeElements.push(&mElementsBuffer[i]);
- }
+ RTListInit(&mCommandList);
}
VBoxVHWACommandElementProcessor::~VBoxVHWACommandElementProcessor()
{
Assert(!m_NotifyObjectRefs.refs());
- Assert(m_CmdPipe.isEmpty());
- RTCritSectDelete(&mCritSect);
-}
+ RTListIsEmpty(&mCommandList);
-bool VBoxVHWACommandElementProcessor::completeCurrentEvent()
-{
- bool bActive = true;
- RTCritSectEnter(&mCritSect);
- mbNewEvent = true;
- if (!m_pNotifyObject)
- bActive = false;
- RTCritSectLeave(&mCritSect);
- return bActive;
+ RTCritSectDelete(&mCritSect);
}
-void VBoxVHWACommandElementProcessor::postCmd(VBOXVHWA_PIPECMD_TYPE aType, void * pvData, uint32_t flags)
+void VBoxVHWACommandElementProcessor::postCmd(VBOXVHWA_PIPECMD_TYPE aType, void * pvData)
{
QObject *pNotifyObject = NULL;
+
+ Log(("VHWA post %d %#p\n", aType, pvData));
+
/* 1. lock*/
RTCritSectEnter(&mCritSect);
- VBoxVHWACommandElement * pCmd = mFreeElements.pop();
+
+ VBoxVHWACommandElement * pCmd = g_VBoxCmdEntriesCache.alloc();
if(!pCmd)
{
VBOXQGLLOG(("!!!no more free elements!!!\n"));
@@ -4946,42 +4990,14 @@ void VBoxVHWACommandElementProcessor::postCmd(VBOXVHWA_PIPECMD_TYPE aType, void
}
pCmd->setData(aType, pvData);
- if((flags & VBOXVHWACMDPIPEC_NEWEVENT) != 0)
- mbNewEvent = true;
-
/* 2. if can add to current*/
- if(mbNewEvent || (!mbProcessingList && m_CmdPipe.isEmpty()))
- {
- pCmd->setNewEvent(true);
- mbNewEvent = false;
- if (m_pNotifyObject)
- {
- m_NotifyObjectRefs.inc(); /* ensure the parent does not get destroyed while we are using it */
- pNotifyObject = m_pNotifyObject;
-#ifdef DEBUG_misha
- checkConsistence();
-#endif
- }
- }
- else
- {
- pCmd->setNewEvent(false);
-#ifdef DEBUG_misha
- if (m_pNotifyObject)
- checkConsistence();
-#endif
- }
-
- m_CmdPipe.put(pCmd);
-#ifdef DEBUG_misha
if (m_pNotifyObject)
{
- checkConsistence(1);
+ m_NotifyObjectRefs.inc(); /* ensure the parent does not get destroyed while we are using it */
+ pNotifyObject = m_pNotifyObject;
}
-#endif
- if((flags & VBOXVHWACMDPIPEC_COMPLETEEVENT) != 0)
- mbNewEvent = true;
+ RTListAppend(&mCommandList, &pCmd->ListNode);
RTCritSectLeave(&mCritSect);
@@ -4993,50 +5009,9 @@ void VBoxVHWACommandElementProcessor::postCmd(VBOXVHWA_PIPECMD_TYPE aType, void
}
}
-#ifdef DEBUG_misha
-void VBoxVHWACommandElementProcessor::checkConsistence(uint32_t cEvents2Submit, const VBoxVHWACommandElementPipe *pPipe)
-{
- const VBoxVHWACommandElement *pLast;
- const VBoxVHWACommandElement *pFirst = pPipe ? pPipe->contentsRo(&pLast) : m_CmdPipe.contentsRo(&pLast);
- uint32_t cEvents = 0;
-
- for (const VBoxVHWACommandElement * pCur = pFirst; pCur; pCur = pCur->mpNext)
- {
- if (pCur->isNewEvent())
- {
- ++cEvents;
- Assert(cEvents <= VBoxVHWACommandProcessEvent::cPending() + cEvents2Submit);
- }
- }
-// Assert(cEvents == VBoxVHWACommandProcessEvent::cPending());
-}
-#endif
-
-void VBoxVHWACommandElementProcessor::putBack(class VBoxVHWACommandElement * pFirst2Put, VBoxVHWACommandElement * pLast2Put,
- class VBoxVHWACommandElement * pFirst2Free, VBoxVHWACommandElement * pLast2Free)
-{
- RTCritSectEnter(&mCritSect);
- if (pFirst2Free)
- mFreeElements.pusha(pFirst2Free, pLast2Free);
- m_CmdPipe.prepend(pFirst2Put, pLast2Put);
- mbProcessingList = false;
- Assert(pFirst2Put->isNewEvent());
-#ifdef DEBUG_misha
- Assert(VBoxVHWACommandProcessEvent::cPending());
- const VBoxVHWACommandElement *pLast;
- const VBoxVHWACommandElement *pFirst = m_CmdPipe.contentsRo(&pLast);
- Assert(pFirst);
- Assert(pLast);
- Assert(pFirst == pFirst2Put);
- checkConsistence();
-#endif
- RTCritSectLeave(&mCritSect);
-}
-
void VBoxVHWACommandElementProcessor::setNotifyObject(QObject *pNotifyObject)
{
int cEventsNeeded = 0;
- const VBoxVHWACommandElement * pFirst;
RTCritSectEnter(&mCritSect);
if (m_pNotifyObject == pNotifyObject)
{
@@ -5063,11 +5038,10 @@ void VBoxVHWACommandElementProcessor::setNotifyObject(QObject *pNotifyObject)
{
m_pNotifyObject = pNotifyObject;
- pFirst = m_CmdPipe.contentsRo(NULL);
- for (; pFirst; pFirst = pFirst->mpNext)
+ VBoxVHWACommandElement *pCur;
+ RTListForEachCpp(&mCommandList, pCur, VBoxVHWACommandElement, ListNode)
{
- if (pFirst->isNewEvent())
- ++cEventsNeeded;
+ ++cEventsNeeded;
}
if (cEventsNeeded)
@@ -5079,10 +5053,6 @@ void VBoxVHWACommandElementProcessor::setNotifyObject(QObject *pNotifyObject)
Assert(!m_pNotifyObject);
}
-#ifdef DEBUG_misha
- checkConsistence(cEventsNeeded);
-#endif
-
RTCritSectLeave(&mCritSect);
if (cEventsNeeded)
@@ -5098,98 +5068,130 @@ void VBoxVHWACommandElementProcessor::setNotifyObject(QObject *pNotifyObject)
}
}
-VBoxVHWACommandElement * VBoxVHWACommandElementProcessor::detachCmdList(VBoxVHWACommandElement **ppLast,
- VBoxVHWACommandElement * pFirst2Free, VBoxVHWACommandElement * pLast2Free)
+void VBoxVHWACommandElementProcessor::doneCmd()
{
- VBoxVHWACommandElement * pList = NULL;
- QObject * pNotifyObject = NULL;
+ VBoxVHWACommandElement * pEl;
RTCritSectEnter(&mCritSect);
- if (pFirst2Free)
- {
- mFreeElements.pusha(pFirst2Free, pLast2Free);
- }
+ pEl = mpCurCmd;
+ Assert(mpCurCmd);
+ mpCurCmd = NULL;
+ RTCritSectLeave(&mCritSect);
-#ifdef DEBUG_misha
- checkConsistence();
-#endif
+ if (pEl)
+ g_VBoxCmdEntriesCache.free(pEl);
+}
- if (!mcDisabled)
- {
- pList = m_CmdPipe.detachList(ppLast);
+VBoxVHWACommandElement * VBoxVHWACommandElementProcessor::getCmd()
+{
+ VBoxVHWACommandElement * pEl = NULL;
+ RTCritSectEnter(&mCritSect);
- if (pList)
- {
- /* assume the caller atomically calls detachCmdList to free the elements obtained now those and reset the state */
- mbProcessingList = true;
- RTCritSectLeave(&mCritSect);
- return pList;
- }
- else
- {
- mbProcessingList = false;
- }
+ Assert(!mpCurCmd);
+
+ if (mbResetting)
+ {
+ RTCritSectLeave(&mCritSect);
+ return NULL;
}
- else
+
+ if (mcDisabled)
{
- Assert(!mbProcessingList);
- if (!m_CmdPipe.isEmpty())
+ QObject * pNotifyObject = NULL;
+
+ if (!RTListIsEmpty(&mCommandList))
{
Assert(m_pNotifyObject);
if (m_pNotifyObject)
{
m_NotifyObjectRefs.inc(); /* ensure the parent does not get destroyed while we are using it */
pNotifyObject = m_pNotifyObject;
-#ifdef DEBUG_misha
- checkConsistence();
-#endif
}
}
- }
- RTCritSectLeave(&mCritSect);
+ RTCritSectLeave(&mCritSect);
- if (pNotifyObject)
+ if (pNotifyObject)
+ {
+ VBoxVHWACommandProcessEvent *pCurrentEvent = new VBoxVHWACommandProcessEvent();
+ QApplication::postEvent(pNotifyObject, pCurrentEvent);
+ m_NotifyObjectRefs.dec();
+ }
+ return NULL;
+ }
+
+ pEl = RTListGetFirstCpp(&mCommandList, VBoxVHWACommandElement, ListNode);
+ if (pEl)
{
- VBoxVHWACommandProcessEvent *pCurrentEvent = new VBoxVHWACommandProcessEvent();
- QApplication::postEvent(pNotifyObject, pCurrentEvent);
- m_NotifyObjectRefs.dec();
+ RTListNodeRemove(&pEl->ListNode);
+ mpCurCmd = pEl;
}
- return NULL;
+
+ RTCritSectLeave(&mCritSect);
+
+ return pEl;
}
/* it is currently assumed no one sends any new commands while reset is in progress */
-void VBoxVHWACommandElementProcessor::reset(VBoxVHWACommandElement ** ppHead, VBoxVHWACommandElement ** ppTail)
+void VBoxVHWACommandElementProcessor::reset(CDisplay *pDisplay)
{
- VBoxVHWACommandElementPipe pipe;
+ VBoxVHWACommandElement *pCur, *pNext;
+
RTCritSectEnter(&mCritSect);
- pipe.setFrom(&m_CmdPipe);
+ mbResetting = true;
- if(mbProcessingList)
+ if(mpCurCmd)
{
for(;;)
{
RTCritSectLeave(&mCritSect);
- RTThreadSleep(2000); /* 2 ms */
+ RTThreadSleep(2); /* 2 ms */
RTCritSectEnter(&mCritSect);
/* it is assumed no one sends any new commands while reset is in progress */
- if(!mbProcessingList)
+ if(!mpCurCmd)
{
break;
}
}
}
- Assert(!mbProcessingList);
+ RTCritSectLeave(&mCritSect);
+
+ RTListForEachSafeCpp(&mCommandList, pCur, pNext, VBoxVHWACommandElement, ListNode)
+ {
+ switch(pCur->type())
+ {
+#ifdef VBOX_WITH_VIDEOHWACCEL
+ case VBOXVHWA_PIPECMD_VHWA:
+ {
+ struct VBOXVHWACMD * pCmd = pCur->vhwaCmd();
+ pCmd->rc = VERR_INVALID_STATE;
+ Log(("VHWA Command <<< Async RESET %#p, %d\n", pCmd, pCmd->enmCmd));
+ pDisplay->CompleteVHWACommand((BYTE*)pCmd);
+ }
+ break;
+ case VBOXVHWA_PIPECMD_FUNC:
+ /* should not happen, don't handle this for now */
+ Assert(0);
+ break;
+#endif
+ case VBOXVHWA_PIPECMD_PAINT:
+ break;
+ default:
+ /* should not happen, don't handle this for now */
+ Assert(0);
+ break;
+ }
+
+ RTListNodeRemove(&pCur->ListNode);
+ g_VBoxCmdEntriesCache.free(pCur);
+ }
- pipe.prependFrom(&m_CmdPipe);
+ RTCritSectEnter(&mCritSect);
- if(!pipe.isEmpty())
- mbProcessingList = true;
+ mbResetting = false;
RTCritSectLeave(&mCritSect);
-
- *ppHead = pipe.detachList(ppTail);
}
#define VBOXVHWACOMMANDELEMENTLISTBEGIN_MAGIC 0x89abcdef
@@ -5234,7 +5236,7 @@ int VBoxVHWACommandElementProcessor::loadExec (struct SSMHANDLE * pSSM, uint32_t
if (RT_SUCCESS(rc))
{
QRect r = QRect(x, y, w, h);
- postCmd(VBOXVHWA_PIPECMD_PAINT, &r, 0);
+ postCmd(VBOXVHWA_PIPECMD_PAINT, &r);
}
break;
}
@@ -5247,7 +5249,7 @@ int VBoxVHWACommandElementProcessor::loadExec (struct SSMHANDLE * pSSM, uint32_t
if (RT_SUCCESS(rc))
{
- postCmd(VBOXVHWA_PIPECMD_VHWA, (VBOXVHWACMD*)(((uint8_t*)pvVRAM) + offCmd), 0);
+ postCmd(VBOXVHWA_PIPECMD_VHWA, (VBOXVHWACMD*)(((uint8_t*)pvVRAM) + offCmd));
}
break;
}
@@ -5280,10 +5282,10 @@ void VBoxVHWACommandElementProcessor::saveExec (struct SSMHANDLE * pSSM, void *p
rc = SSMR3PutU32(pSSM, VBOXVHWACOMMANDELEMENTLISTBEGIN_MAGIC); AssertRC(rc);
rc = SSMR3PutU32(pSSM, m_NotifyObjectRefs.refs()); AssertRC(rc);
- rc = SSMR3PutBool(pSSM, mbNewEvent); AssertRC(rc);
+ rc = SSMR3PutBool(pSSM, true); AssertRC(rc);
- const VBoxVHWACommandElement * pCur = m_CmdPipe.contentsRo(NULL);
- for (;pCur; pCur = pCur->mpNext)
+ VBoxVHWACommandElement *pCur;
+ RTListForEachCpp(&mCommandList, pCur, VBoxVHWACommandElement, ListNode)
{
rc = SSMR3PutU32(pSSM, pCur->type()); AssertRC(rc);
@@ -5294,12 +5296,12 @@ void VBoxVHWACommandElementProcessor::saveExec (struct SSMHANDLE * pSSM, void *p
rc = SSMR3PutS32(pSSM, pCur->rect().y()); AssertRC(rc);
rc = SSMR3PutS32(pSSM, pCur->rect().width()); AssertRC(rc);
rc = SSMR3PutS32(pSSM, pCur->rect().height()); AssertRC(rc);
- rc = SSMR3PutBool(pSSM, pCur->isNewEvent()); AssertRC(rc);
+ rc = SSMR3PutBool(pSSM, true); AssertRC(rc);
break;
case VBOXVHWA_PIPECMD_VHWA:
{
rc = SSMR3PutU32(pSSM, (uint32_t)((uintptr_t)((uint8_t*)pCur->vhwaCmd() - (uint8_t*)pvVRAM))); AssertRC(rc);
- rc = SSMR3PutBool(pSSM, pCur->isNewEvent()); AssertRC(rc);
+ rc = SSMR3PutBool(pSSM, true); AssertRC(rc);
break;
}
default:
@@ -5315,22 +5317,22 @@ void VBoxVHWACommandElementProcessor::lock()
{
RTCritSectEnter(&mCritSect);
- if(mbProcessingList)
+ if(mpCurCmd)
{
for(;;)
{
RTCritSectLeave(&mCritSect);
- RTThreadSleep(2000); /* 2 ms */
+ RTThreadSleep(2); /* 2 ms */
RTCritSectEnter(&mCritSect);
/* it is assumed no one sends any new commands while reset is in progress */
- if(!mbProcessingList)
+ if(!mpCurCmd)
{
break;
}
}
}
- Assert(!mbProcessingList);
+ Assert(!mpCurCmd);
}
void VBoxVHWACommandElementProcessor::unlock()
diff --git a/src/VBox/Frontends/VirtualBox/src/VBoxFBOverlay.h b/src/VBox/Frontends/VirtualBox/src/VBoxFBOverlay.h
index 2f248c9..fc96caf 100644
--- a/src/VBox/Frontends/VirtualBox/src/VBoxFBOverlay.h
+++ b/src/VBox/Frontends/VirtualBox/src/VBoxFBOverlay.h
@@ -35,16 +35,23 @@
/* COM includes: */
#include "COMEnums.h"
+#include "CDisplay.h"
+
/* Other VBox includes: */
#include <iprt/assert.h>
#include <iprt/critsect.h>
#include <iprt/asm.h>
#include <iprt/err.h>
+#include <iprt/list.h>
#include <VBox/VBoxGL2D.h>
#ifdef VBOXVHWA_PROFILE_FPS
# include <iprt/stream.h>
#endif /* VBOXVHWA_PROFILE_FPS */
+#ifndef S_FALSE
+# define S_FALSE ((HRESULT)1L)
+#endif
+
#ifdef DEBUG_misha
# define VBOXVHWA_PROFILE_FPS
#endif /* DEBUG_misha */
@@ -1008,6 +1015,18 @@ class VBoxVHWASurfList
public:
VBoxVHWASurfList() : mCurrent(NULL) {}
+
+ void moveTo(VBoxVHWASurfList *pDst)
+ {
+ for (SurfList::iterator it = mSurfaces.begin();
+ it != mSurfaces.end(); it = mSurfaces.begin())
+ {
+ pDst->add((*it));
+ }
+
+ Assert(empty());
+ }
+
void add(VBoxVHWASurfaceBase *pSurf)
{
VBoxVHWASurfList * pOld = pSurf->getComplexList();
@@ -1018,7 +1037,7 @@ public:
mSurfaces.push_back(pSurf);
pSurf->setComplexList(this);
}
-
+/*
void clear()
{
for (SurfList::iterator it = mSurfaces.begin();
@@ -1029,7 +1048,7 @@ public:
mSurfaces.clear();
mCurrent = NULL;
}
-
+*/
size_t size() const {return mSurfaces.size(); }
void remove(VBoxVHWASurfaceBase *pSurf)
@@ -1070,7 +1089,12 @@ public:
{
VBoxVHWASurfaceBase * old = mSurfVGA;
mSurfVGA = pVga;
- mPrimary.clear();
+ if (!mPrimary.empty())
+ {
+ VBoxVHWASurfList *pNewList = new VBoxVHWASurfList();
+ mPrimary.moveTo(pNewList);
+ Assert(mPrimary.empty());
+ }
if(pVga)
{
Assert(!pVga->getComplexList());
@@ -1188,10 +1212,6 @@ typedef struct VBOXVHWAFUNCCALLBACKINFO
class VBoxVHWACommandElement
{
public:
- VBoxVHWACommandElement() :
- bNewEvent(false)
- {}
-
void setVHWACmd(struct VBOXVHWACMD * pCmd)
{
mType = VBOXVHWA_PIPECMD_VHWA;
@@ -1229,15 +1249,12 @@ public:
}
}
- void setNewEvent(bool bNew) {bNewEvent = bNew;}
- bool isNewEvent() const { return bNewEvent; }
-
VBOXVHWA_PIPECMD_TYPE type() const {return mType;}
const QRect & rect() const {return mRect;}
struct VBOXVHWACMD * vhwaCmd() const {return u.mpCmd;}
const VBOXVHWAFUNCCALLBACKINFO & func() const {return u.mFuncCallback; }
- VBoxVHWACommandElement * mpNext;
+ RTLISTNODE ListNode;
private:
VBOXVHWA_PIPECMD_TYPE mType;
union
@@ -1246,141 +1263,6 @@ private:
VBOXVHWAFUNCCALLBACKINFO mFuncCallback;
}u;
QRect mRect;
- bool bNewEvent;
-};
-
-class VBoxVHWACommandElementPipe
-{
-public:
- VBoxVHWACommandElementPipe() :
- mpFirst(NULL),
- mpLast(NULL)
- {}
-
- void put(VBoxVHWACommandElement *pCmd)
- {
- if (mpLast)
- {
- Assert(mpFirst);
- mpLast->mpNext = pCmd;
- mpLast = pCmd;
- }
- else
- {
- Assert(!mpFirst);
- mpFirst = pCmd;
- mpLast = pCmd;
- }
- pCmd->mpNext= NULL;
-
- }
-
- void setFrom(VBoxVHWACommandElementPipe *pOther)
- {
- mpFirst = pOther->detachList(&mpLast);
- }
-
- void set(VBoxVHWACommandElement *pFirst, VBoxVHWACommandElement *pLast)
- {
- mpFirst = pFirst;
- mpLast = pLast;
- if (mpLast)
- mpLast->mpNext = NULL;
- }
-
- void prepend(VBoxVHWACommandElement *pFirst, VBoxVHWACommandElement *pLast)
- {
- if (!mpFirst)
- set(pFirst, pLast);
- else if (pLast)
- {
- pLast->mpNext = mpFirst;
- mpFirst = pFirst;
- }
- }
-
- void prependFrom(VBoxVHWACommandElementPipe *pOther)
- {
- VBoxVHWACommandElement *pFirst;
- VBoxVHWACommandElement *pLast;
- pFirst = pOther->detachList(&pLast);
- prepend(pFirst, pLast);
- }
-
- void append(VBoxVHWACommandElement *pFirst, VBoxVHWACommandElement *pLast)
- {
- if (!mpLast)
- set(pFirst, pLast);
- else if (pLast)
- {
- mpLast->mpNext = pFirst;
- mpLast = pLast;
- pLast->mpNext = NULL;
- }
- }
-
- VBoxVHWACommandElement * detachList(VBoxVHWACommandElement **ppLast)
- {
- if (mpLast)
- {
- VBoxVHWACommandElement * pHead = mpFirst;
- if (ppLast)
- *ppLast = mpLast;
- mpFirst = NULL;
- mpLast = NULL;
- return pHead;
- }
- if (ppLast)
- *ppLast = NULL;
- return NULL;
- }
-
-
-
- const VBoxVHWACommandElement * contentsRo (const VBoxVHWACommandElement **ppLast) const
- {
- if (ppLast)
- *ppLast = mpLast;
- return mpFirst;
- }
-
- bool isEmpty() const { return !mpLast; }
-
-private:
- VBoxVHWACommandElement *mpFirst;
- VBoxVHWACommandElement *mpLast;
-};
-
-class VBoxVHWACommandElementStack
-{
-public:
- VBoxVHWACommandElementStack() :
- mpFirst(NULL) {}
-
- void push(VBoxVHWACommandElement *pCmd)
- {
- pCmd->mpNext = mpFirst;
- mpFirst = pCmd;
- }
-
- void pusha(VBoxVHWACommandElement *pFirst, VBoxVHWACommandElement *pLast)
- {
- pLast->mpNext = mpFirst;
- mpFirst = pFirst;
- }
-
- VBoxVHWACommandElement * pop()
- {
- if(mpFirst)
- {
- VBoxVHWACommandElement * ret = mpFirst;
- mpFirst = ret->mpNext;
- return ret;
- }
- return NULL;
- }
-private:
- VBoxVHWACommandElement *mpFirst;
};
class VBoxVHWARefCounter
@@ -1424,20 +1306,15 @@ private:
volatile uint32_t m_cRefs;
};
-#define VBOXVHWACMDPIPEC_NEWEVENT 0x00000001
-#define VBOXVHWACMDPIPEC_COMPLETEEVENT 0x00000002
class VBoxVHWACommandElementProcessor
{
public:
VBoxVHWACommandElementProcessor(QObject *pNotifyObject);
~VBoxVHWACommandElementProcessor();
- void postCmd(VBOXVHWA_PIPECMD_TYPE aType, void * pvData, uint32_t flags);
- bool completeCurrentEvent();
- class VBoxVHWACommandElement * detachCmdList(class VBoxVHWACommandElement ** ppLast,
- class VBoxVHWACommandElement * pFirst2Free, VBoxVHWACommandElement * pLast2Free);
- void putBack(class VBoxVHWACommandElement * pFirst2Put, VBoxVHWACommandElement * pLast2Put,
- class VBoxVHWACommandElement * pFirst2Free, VBoxVHWACommandElement * pLast2Free);
- void reset(class VBoxVHWACommandElement ** ppHead, class VBoxVHWACommandElement ** ppTail);
+ void postCmd(VBOXVHWA_PIPECMD_TYPE aType, void * pvData);
+ VBoxVHWACommandElement *getCmd();
+ void doneCmd();
+ void reset(CDisplay *pDisplay);
void setNotifyObject(QObject *pNotifyObject);
int loadExec (struct SSMHANDLE * pSSM, uint32_t u32Version, void *pvVRAM);
void saveExec (struct SSMHANDLE * pSSM, void *pvVRAM);
@@ -1445,19 +1322,14 @@ public:
void enable();
void lock();
void unlock();
-#ifdef DEBUG_misha
- void checkConsistence(uint32_t cEvents2Submit = 0, const VBoxVHWACommandElementPipe *pPipe = NULL);
-#endif
private:
RTCRITSECT mCritSect;
- VBoxVHWACommandElementPipe m_CmdPipe;
+ RTLISTNODE mCommandList;
QObject *m_pNotifyObject;
VBoxVHWARefCounter m_NotifyObjectRefs;
- bool mbNewEvent;
- bool mbProcessingList;
+ VBoxVHWACommandElement *mpCurCmd;
+ bool mbResetting;
uint32_t mcDisabled;
- VBoxVHWACommandElementStack mFreeElements;
- VBoxVHWACommandElement mElementsBuffer[2048];
};
/* added to workaround this ** [VBox|UI] duplication */
@@ -1818,32 +1690,14 @@ public:
bool onNotifyUpdate (ULONG aX, ULONG aY,
ULONG aW, ULONG aH);
- /**
- * to be called on RequestResize framebuffer call
- * @return true if the request was processed & should not be forwarded to the framebuffer
- * false - otherwise */
- bool onRequestResize (ULONG aScreenId, ULONG uPixelFormat,
- BYTE * pVRAM, ULONG uBitsPerPixel, ULONG uBytesPerLine,
- ULONG uWidth, ULONG uHeight,
- HRESULT *pResult,
- BOOL * pbFinished)
+ void onNotifyUpdateIgnore (ULONG aX, ULONG aY,
+ ULONG aW, ULONG aH)
{
- Q_UNUSED(aScreenId);
- Q_UNUSED(uPixelFormat);
- Q_UNUSED(pVRAM);
- Q_UNUSED(uBitsPerPixel);
- Q_UNUSED(uBytesPerLine);
- Q_UNUSED(uWidth);
- Q_UNUSED(uHeight);
- Q_UNUSED(pbFinished);
-
- if (mCmdPipe.completeCurrentEvent())
- return false;
-
- /* TODO: more graceful resize handling */
- *pResult = E_FAIL;
-
- return true;
+ Q_UNUSED(aX);
+ Q_UNUSED(aY);
+ Q_UNUSED(aW);
+ Q_UNUSED(aH);
+ /* @todo: we actually should not miss notify updates, since we need to update the texture on it */
}
void onResizeEventPostprocess (const VBoxFBSizeInfo &re, const QPoint & topLeft);
@@ -1921,7 +1775,7 @@ private:
void vboxDoVHWACmd (void *cmd);
void addMainDirtyRect (const QRect & aRect);
void vboxCheckUpdateOverlay (const QRect & rect);
- VBoxVHWACommandElement * processCmdList (VBoxVHWACommandElement * pCmd, bool bFirst);
+ void processCmd (VBoxVHWACommandElement * pCmd);
int vhwaConstruct (struct VBOXVHWACMD_HH_CONSTRUCT *pCmd);
@@ -1979,7 +1833,26 @@ public:
STDMETHOD(ProcessVHWACommand)(BYTE *pCommand)
{
- return mOverlay.onVHWACommand ((struct VBOXVHWACMD*)pCommand);
+ int rc;
+ T::lock();
+ /* Make sure frame-buffer is used: */
+ if (T::m_fIsMarkedAsUnused)
+ {
+ LogRel2(("ProcessVHWACommand: Postponed!\n"));
+ /* Unlock access to frame-buffer: */
+ T::unlock();
+ /* tell client to pend ProcessVHWACommand */
+ return E_ACCESSDENIED;
+ }
+ rc = mOverlay.onVHWACommand ((struct VBOXVHWACMD*)pCommand);
+ T::unlock();
+ if (rc == VINF_CALLBACK_RETURN)
+ return S_OK;
+ else if (RT_SUCCESS(rc))
+ return S_FALSE;
+ else if (rc == VERR_INVALID_STATE)
+ return E_ACCESSDENIED;
+ return E_FAIL;
}
void doProcessVHWACommand (QEvent * pEvent)
@@ -1987,53 +1860,27 @@ public:
mOverlay.onVHWACommandEvent (pEvent);
}
- STDMETHOD(RequestResize) (ULONG aScreenId, ULONG aPixelFormat,
- BYTE *aVRAM, ULONG aBitsPerPixel, ULONG aBytesPerLine,
- ULONG aWidth, ULONG aHeight,
- BOOL *aFinished)
- {
- HRESULT result;
- if (mOverlay.onRequestResize (aScreenId, aPixelFormat,
- aVRAM, aBitsPerPixel, aBytesPerLine,
- aWidth, aHeight,
- &result,
- aFinished))
- {
- return result;
- }
- return T::RequestResize (aScreenId, aPixelFormat,
- aVRAM, aBitsPerPixel, aBytesPerLine,
- aWidth, aHeight,
- aFinished);
- }
-
STDMETHOD(NotifyUpdate) (ULONG aX, ULONG aY,
ULONG aW, ULONG aH)
{
- if (mOverlay.onNotifyUpdate (aX, aY, aW, aH))
- return S_OK;
- return T::NotifyUpdate (aX, aY, aW, aH);
- }
-
- STDMETHOD(VideoModeSupported) (ULONG uWidth, ULONG uHeight, ULONG uBPP,
- BOOL *pbSupported)
- {
- /* TODO: tmp workaround: the lock should be moved to the calling code??
- * otherwise we may end up calling a null View */
- /* Todo: can we call VideoModeSupported with the lock held?
- * if not we can introduce a ref counting for the mpView usage
- * to ensure it stays alive till we need it*/
- HRESULT hr = T::Lock();
- HRESULT retHr = S_OK;
- Assert(hr == S_OK);
- if (SUCCEEDED(hr))
+ HRESULT hr = S_OK;
+ T::lock();
+ /* Make sure frame-buffer is used: */
+ if (T::m_fIsMarkedAsUnused)
{
- if (mpView)
- retHr = T::VideoModeSupported(uWidth, uHeight, uBPP, pbSupported);
- hr = T::Unlock();
- Assert(hr == S_OK);
+ LogRel2(("NotifyUpdate: Ignored!\n"));
+ mOverlay.onNotifyUpdateIgnore (aX, aY, aW, aH);
+ /* Unlock access to frame-buffer: */
+ T::unlock();
+ /*can we actually ignore the notify update?*/
+ /* Ignore NotifyUpdate: */
+ return E_FAIL;
}
- return retHr;
+
+ if (!mOverlay.onNotifyUpdate (aX, aY, aW, aH))
+ hr = T::NotifyUpdate (aX, aY, aW, aH);
+ T::unlock();
+ return hr;
}
void resizeEvent (R *re)
@@ -2058,17 +1905,13 @@ public:
void setView(V * pView)
{
/* lock to ensure we do not collide with the EMT thread passing commands to us */
- HRESULT hr = T::Lock();
- Assert(hr == S_OK);
- if (SUCCEEDED(hr))
- {
- T::setView(pView);
- mpView = pView;
- mOverlay.updateAttachment(pView ? pView->viewport() : NULL, pView);
- hr = T::Unlock();
- Assert(hr == S_OK);
- }
+ T::lock();
+ T::setView(pView);
+ mpView = pView;
+ mOverlay.updateAttachment(pView ? pView->viewport() : NULL, pView);
+ T::unlock();
}
+
private:
VBoxQGLOverlay mOverlay;
V *mpView;
diff --git a/src/VBox/Frontends/VirtualBox/src/converter/UIConverterBackendGlobal.cpp b/src/VBox/Frontends/VirtualBox/src/converter/UIConverterBackendGlobal.cpp
index 7f05683..b833336 100644
--- a/src/VBox/Frontends/VirtualBox/src/converter/UIConverterBackendGlobal.cpp
+++ b/src/VBox/Frontends/VirtualBox/src/converter/UIConverterBackendGlobal.cpp
@@ -500,12 +500,16 @@ template<> QString toInternalString(const GlobalSettingsPageType &globalSettings
{
case GlobalSettingsPageType_General: strResult = "General"; break;
case GlobalSettingsPageType_Input: strResult = "Input"; break;
+#ifdef VBOX_GUI_WITH_NETWORK_MANAGER
case GlobalSettingsPageType_Update: strResult = "Update"; break;
+#endif /* VBOX_GUI_WITH_NETWORK_MANAGER */
case GlobalSettingsPageType_Language: strResult = "Language"; break;
case GlobalSettingsPageType_Display: strResult = "Display"; break;
case GlobalSettingsPageType_Network: strResult = "Network"; break;
case GlobalSettingsPageType_Extensions: strResult = "Extensions"; break;
+#ifdef VBOX_GUI_WITH_NETWORK_MANAGER
case GlobalSettingsPageType_Proxy: strResult = "Proxy"; break;
+#endif /* VBOX_GUI_WITH_NETWORK_MANAGER */
default:
{
AssertMsgFailed(("No text for settings page type=%d", globalSettingsPageType));
@@ -523,12 +527,16 @@ template<> GlobalSettingsPageType fromInternalString<GlobalSettingsPageType>(con
QStringList keys; QList<GlobalSettingsPageType> values;
keys << "General"; values << GlobalSettingsPageType_General;
keys << "Input"; values << GlobalSettingsPageType_Input;
+#ifdef VBOX_GUI_WITH_NETWORK_MANAGER
keys << "Update"; values << GlobalSettingsPageType_Update;
+#endif /* VBOX_GUI_WITH_NETWORK_MANAGER */
keys << "Language"; values << GlobalSettingsPageType_Language;
keys << "Display"; values << GlobalSettingsPageType_Display;
keys << "Network"; values << GlobalSettingsPageType_Network;
keys << "Extensions"; values << GlobalSettingsPageType_Extensions;
+#ifdef VBOX_GUI_WITH_NETWORK_MANAGER
keys << "Proxy"; values << GlobalSettingsPageType_Proxy;
+#endif /* VBOX_GUI_WITH_NETWORK_MANAGER */
/* Invalid type for unknown words: */
if (!keys.contains(strGlobalSettingsPageType, Qt::CaseInsensitive))
return GlobalSettingsPageType_Invalid;
@@ -543,12 +551,16 @@ template<> QPixmap toWarningPixmap(const GlobalSettingsPageType &type)
{
case GlobalSettingsPageType_General: return QPixmap(":/machine_warning_16px.png");
case GlobalSettingsPageType_Input: return QPixmap(":/hostkey_warning_16px.png");
+#ifdef VBOX_GUI_WITH_NETWORK_MANAGER
case GlobalSettingsPageType_Update: return QPixmap(":/refresh_warning_16px.png");
+#endif /* VBOX_GUI_WITH_NETWORK_MANAGER */
case GlobalSettingsPageType_Language: return QPixmap(":/site_warning_16px.png");
case GlobalSettingsPageType_Display: return QPixmap(":/vrdp_warning_16px.png");
case GlobalSettingsPageType_Network: return QPixmap(":/nw_warning_16px.png");
case GlobalSettingsPageType_Extensions: return QPixmap(":/extension_pack_warning_16px.png");
+#ifdef VBOX_GUI_WITH_NETWORK_MANAGER
case GlobalSettingsPageType_Proxy: return QPixmap(":/proxy_warning_16px.png");
+#endif /* VBOX_GUI_WITH_NETWORK_MANAGER */
default: AssertMsgFailed(("No pixmap for %d", type)); break;
}
return QPixmap();
diff --git a/src/VBox/Frontends/VirtualBox/src/extensions/QIRichTextLabel.cpp b/src/VBox/Frontends/VirtualBox/src/extensions/QIRichTextLabel.cpp
index 3ace605..67daa7b 100644
--- a/src/VBox/Frontends/VirtualBox/src/extensions/QIRichTextLabel.cpp
+++ b/src/VBox/Frontends/VirtualBox/src/extensions/QIRichTextLabel.cpp
@@ -32,13 +32,22 @@ QIRichTextLabel::QIRichTextLabel(QWidget *pParent)
{
/* Setup self: */
setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::Fixed);
+
/* Setup text-edit: */
m_pTextEdit->setReadOnly(true);
m_pTextEdit->setFocusPolicy(Qt::NoFocus);
m_pTextEdit->setFrameShape(QFrame::NoFrame);
- m_pTextEdit->viewport()->setAutoFillBackground(false);
m_pTextEdit->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
m_pTextEdit->setSizePolicy(QSizePolicy::Ignored, QSizePolicy::Ignored);
+
+ /* Tune text-edit viewport palette: */
+ m_pTextEdit->viewport()->setAutoFillBackground(false);
+ QPalette pal = m_pTextEdit->viewport()->palette();
+ pal.setColor(QPalette::Active, QPalette::Text, pal.color(QPalette::Active, QPalette::WindowText));
+ pal.setColor(QPalette::Inactive, QPalette::Text, pal.color(QPalette::Inactive, QPalette::WindowText));
+ pal.setColor(QPalette::Disabled, QPalette::Text, pal.color(QPalette::Disabled, QPalette::WindowText));
+ m_pTextEdit->viewport()->setPalette(pal);
+
/* Add into parent: */
QVBoxLayout *pMainLayout = new QVBoxLayout(this);
pMainLayout->setMargin(0);
diff --git a/src/VBox/Frontends/VirtualBox/src/globals/UIActionPool.cpp b/src/VBox/Frontends/VirtualBox/src/globals/UIActionPool.cpp
index 634535e..7541fce 100644
--- a/src/VBox/Frontends/VirtualBox/src/globals/UIActionPool.cpp
+++ b/src/VBox/Frontends/VirtualBox/src/globals/UIActionPool.cpp
@@ -431,6 +431,7 @@ protected:
}
};
+#ifdef VBOX_GUI_WITH_NETWORK_MANAGER
class UIActionSimpleNetworkAccessManager : public UIActionSimple
{
Q_OBJECT;
@@ -483,6 +484,7 @@ protected:
setStatusTip(QApplication::translate("UIActionPool", "Check for a new VirtualBox version"));
}
};
+#endif /* VBOX_GUI_WITH_NETWORK_MANAGER */
class UIActionSimpleAbout : public UIActionSimple
{
@@ -649,8 +651,10 @@ void UIActionPool::createActions()
m_pool[UIActionIndex_Simple_Contents] = new UIActionSimpleContents(this);
m_pool[UIActionIndex_Simple_WebSite] = new UIActionSimpleWebSite(this);
m_pool[UIActionIndex_Simple_ResetWarnings] = new UIActionSimpleResetWarnings(this);
+#ifdef VBOX_GUI_WITH_NETWORK_MANAGER
m_pool[UIActionIndex_Simple_NetworkAccessManager] = new UIActionSimpleNetworkAccessManager(this);
m_pool[UIActionIndex_Simple_CheckForUpdates] = new UIActionSimpleCheckForUpdates(this);
+#endif /* VBOX_GUI_WITH_NETWORK_MANAGER */
m_pool[UIActionIndex_Simple_About] = new UIActionSimpleAbout(this);
}
diff --git a/src/VBox/Frontends/VirtualBox/src/globals/UIActionPool.h b/src/VBox/Frontends/VirtualBox/src/globals/UIActionPool.h
index 01b5730..729c887 100644
--- a/src/VBox/Frontends/VirtualBox/src/globals/UIActionPool.h
+++ b/src/VBox/Frontends/VirtualBox/src/globals/UIActionPool.h
@@ -57,8 +57,10 @@ enum UIActionIndex
UIActionIndex_Simple_Contents,
UIActionIndex_Simple_WebSite,
UIActionIndex_Simple_ResetWarnings,
+#ifdef VBOX_GUI_WITH_NETWORK_MANAGER
UIActionIndex_Simple_NetworkAccessManager,
UIActionIndex_Simple_CheckForUpdates,
+#endif /* VBOX_GUI_WITH_NETWORK_MANAGER */
UIActionIndex_Simple_About,
/* Maximum index: */
diff --git a/src/VBox/Frontends/VirtualBox/src/globals/UIDefs.cpp b/src/VBox/Frontends/VirtualBox/src/globals/UIDefs.cpp
index b91ba08..1fad0f0 100644
--- a/src/VBox/Frontends/VirtualBox/src/globals/UIDefs.cpp
+++ b/src/VBox/Frontends/VirtualBox/src/globals/UIDefs.cpp
@@ -31,7 +31,6 @@ const char* UIDefs::GUI_RecentFolderFD = "GUI/RecentFolderFD";
const char* UIDefs::GUI_RecentListHD = "GUI/RecentListHD";
const char* UIDefs::GUI_RecentListCD = "GUI/RecentListCD";
const char* UIDefs::GUI_RecentListFD = "GUI/RecentListFD";
-const char* UIDefs::GUI_PreventApplicationUpdate = "GUI/PreventApplicationUpdate";
/* Selector-window definitions: */
const char* UIDefs::GUI_Input_SelectorShortcuts = "GUI/Input/SelectorShortcuts";
@@ -69,6 +68,7 @@ const char* UIDefs::GUI_SaveMountedAtRuntime = "GUI/SaveMountedAtRuntime";
const char* UIDefs::GUI_PassCAD = "GUI/PassCAD";
const char* UIDefs::GUI_DefaultCloseAction = "GUI/DefaultCloseAction";
const char* UIDefs::GUI_RestrictedStatusBarIndicators = "GUI/RestrictedStatusBarIndicators";
+const char* UIDefs::GUI_HidLedsSync = "GUI/HidLedsSync";
/* Settings dialogs stuff: */
const char* UIDefs::GUI_RestrictedGlobalSettingsPages = "GUI/RestrictedGlobalSettingsPages";
@@ -96,9 +96,12 @@ const char* UIDefs::GUI_Export_Bucket = "GUI/Export/Bucket";
const char* UIDefs::GUI_SuppressMessages = "GUI/SuppressMessages";
const char* UIDefs::GUI_InvertMessageOption = "GUI/InvertMessageOption";
+#ifdef VBOX_GUI_WITH_NETWORK_MANAGER
/* Update manager definitions: */
+const char* UIDefs::GUI_PreventApplicationUpdate = "GUI/PreventApplicationUpdate";
const char* UIDefs::GUI_UpdateDate = "GUI/UpdateDate";
const char* UIDefs::GUI_UpdateCheckCount = "GUI/UpdateCheckCount";
+#endif /* VBOX_GUI_WITH_NETWORK_MANAGER */
/* Information dialog definitions: */
const char* UIDefs::GUI_InfoDlgState = "GUI/InfoDlgState";
diff --git a/src/VBox/Frontends/VirtualBox/src/globals/UIDefs.h b/src/VBox/Frontends/VirtualBox/src/globals/UIDefs.h
index 975ee8e..4136179 100644
--- a/src/VBox/Frontends/VirtualBox/src/globals/UIDefs.h
+++ b/src/VBox/Frontends/VirtualBox/src/globals/UIDefs.h
@@ -1,11 +1,9 @@
/** @file
- *
- * VBox frontends: Qt GUI ("VirtualBox"):
- * Global declarations and functions
+ * VBox Qt GUI - UIDefs namespace and other global declarations.
*/
/*
- * Copyright (C) 2006-2012 Oracle Corporation
+ * Copyright (C) 2006-2013 Oracle Corporation
*
* This file is part of VirtualBox Open Source Edition (OSE), as
* available from http://www.virtualbox.org. This file is free software;
@@ -16,8 +14,8 @@
* hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
*/
-#ifndef __UIDefs_h__
-#define __UIDefs_h__
+#ifndef ___UIDefs_h___
+#define ___UIDefs_h___
/* Qt includes: */
#include <QEvent>
@@ -102,7 +100,6 @@ namespace UIDefs
extern const char* GUI_RecentListHD;
extern const char* GUI_RecentListCD;
extern const char* GUI_RecentListFD;
- extern const char* GUI_PreventApplicationUpdate;
/* Selector-window declarations: */
extern const char* GUI_Input_SelectorShortcuts;
@@ -140,6 +137,7 @@ namespace UIDefs
extern const char* GUI_PassCAD;
extern const char* GUI_DefaultCloseAction;
extern const char* GUI_RestrictedStatusBarIndicators;
+ extern const char* GUI_HidLedsSync;
/* Settings dialogs stuff: */
extern const char* GUI_RestrictedGlobalSettingsPages;
@@ -167,9 +165,12 @@ namespace UIDefs
extern const char* GUI_SuppressMessages;
extern const char* GUI_InvertMessageOption;
+#ifdef VBOX_GUI_WITH_NETWORK_MANAGER
/* Update manager declarations: */
+ extern const char* GUI_PreventApplicationUpdate;
extern const char* GUI_UpdateDate;
extern const char* GUI_UpdateCheckCount;
+#endif /* VBOX_GUI_WITH_NETWORK_MANAGER */
/* Information dialog declarations: */
extern const char* GUI_InfoDlgState;
@@ -273,6 +274,7 @@ enum UIVisualStateType
UIVisualStateType_Scale = RT_BIT(3),
UIVisualStateType_All = 0xFF
};
+Q_DECLARE_METATYPE(UIVisualStateType);
/* Details element type: */
enum DetailsElementType
@@ -300,12 +302,16 @@ enum GlobalSettingsPageType
GlobalSettingsPageType_Invalid,
GlobalSettingsPageType_General,
GlobalSettingsPageType_Input,
+#ifdef VBOX_GUI_WITH_NETWORK_MANAGER
GlobalSettingsPageType_Update,
+#endif /* VBOX_GUI_WITH_NETWORK_MANAGER */
GlobalSettingsPageType_Language,
GlobalSettingsPageType_Display,
GlobalSettingsPageType_Network,
GlobalSettingsPageType_Extensions,
+#ifdef VBOX_GUI_WITH_NETWORK_MANAGER
GlobalSettingsPageType_Proxy,
+#endif /* VBOX_GUI_WITH_NETWORK_MANAGER */
GlobalSettingsPageType_Max
};
Q_DECLARE_METATYPE(GlobalSettingsPageType);
@@ -350,14 +356,14 @@ Q_DECLARE_METATYPE(IndicatorType);
/* Machine close action: */
enum MachineCloseAction
{
- MachineCloseAction_Invalid,
- MachineCloseAction_SaveState,
- MachineCloseAction_Shutdown,
- MachineCloseAction_PowerOff,
- MachineCloseAction_PowerOff_RestoringSnapshot,
- MachineCloseAction_Max
+ MachineCloseAction_Invalid = 0,
+ MachineCloseAction_SaveState = RT_BIT(0),
+ MachineCloseAction_Shutdown = RT_BIT(1),
+ MachineCloseAction_PowerOff = RT_BIT(2),
+ MachineCloseAction_PowerOff_RestoringSnapshot = RT_BIT(3),
+ MachineCloseAction_All = 0xFF
};
Q_DECLARE_METATYPE(MachineCloseAction);
-#endif // __UIDefs_h__
+#endif /* !___UIDefs_h___ */
diff --git a/src/VBox/Frontends/VirtualBox/src/globals/UIMainEventListener.cpp b/src/VBox/Frontends/VirtualBox/src/globals/UIMainEventListener.cpp
index 917f362..2cf0150 100644
--- a/src/VBox/Frontends/VirtualBox/src/globals/UIMainEventListener.cpp
+++ b/src/VBox/Frontends/VirtualBox/src/globals/UIMainEventListener.cpp
@@ -132,13 +132,13 @@ STDMETHODIMP UIMainEventListener::HandleEvent(VBoxEventType_T /* type */, IEvent
case KVBoxEventType_OnSnapshotTaken:
{
CSnapshotTakenEvent es(pEvent);
- emit sigSnapshotChange(es.GetMachineId(), es.GetSnapshotId());
+ emit sigSnapshotTake(es.GetMachineId(), es.GetSnapshotId());
break;
}
case KVBoxEventType_OnSnapshotDeleted:
{
CSnapshotDeletedEvent es(pEvent);
- emit sigSnapshotChange(es.GetMachineId(), es.GetSnapshotId());
+ emit sigSnapshotDelete(es.GetMachineId(), es.GetSnapshotId());
break;
}
case KVBoxEventType_OnSnapshotChanged:
diff --git a/src/VBox/Frontends/VirtualBox/src/globals/UIMainEventListener.h b/src/VBox/Frontends/VirtualBox/src/globals/UIMainEventListener.h
index ff25cf6..f80690b 100644
--- a/src/VBox/Frontends/VirtualBox/src/globals/UIMainEventListener.h
+++ b/src/VBox/Frontends/VirtualBox/src/globals/UIMainEventListener.h
@@ -62,6 +62,8 @@ signals:
void sigExtraDataChange(QString strId, QString strKey, QString strValue);
void sigMachineRegistered(QString strId, bool fRegistered);
void sigSessionStateChange(QString strId, KSessionState state);
+ void sigSnapshotTake(QString strId, QString strSnapshotId);
+ void sigSnapshotDelete(QString strId, QString strSnapshotId);
void sigSnapshotChange(QString strId, QString strSnapshotId);
/* All Console Signals */
void sigMousePointerShapeChange(bool fVisible, bool fAlpha, QPoint hotCorner, QSize size, QVector<uint8_t> shape);
diff --git a/src/VBox/Frontends/VirtualBox/src/globals/UIMessageCenter.cpp b/src/VBox/Frontends/VirtualBox/src/globals/UIMessageCenter.cpp
index 8dfe4e8..0da45ea 100644
--- a/src/VBox/Frontends/VirtualBox/src/globals/UIMessageCenter.cpp
+++ b/src/VBox/Frontends/VirtualBox/src/globals/UIMessageCenter.cpp
@@ -34,8 +34,10 @@
#include "UIMessageCenter.h"
#include "UISelectorWindow.h"
#include "UIProgressDialog.h"
-#include "UINetworkManager.h"
-#include "UINetworkManagerDialog.h"
+#ifdef VBOX_GUI_WITH_NETWORK_MANAGER
+# include "UINetworkManager.h"
+# include "UINetworkManagerDialog.h"
+#endif /* VBOX_GUI_WITH_NETWORK_MANAGER */
#include "UIModalWindowManager.h"
#include "UIMedium.h"
#ifdef VBOX_OSE
@@ -1981,6 +1983,16 @@ void UIMessageCenter::remindAboutGuestAdditionsAreNotActive() const
"remindAboutGuestAdditionsAreNotActive");
}
+void UIMessageCenter::cannotMountGuestAdditions(const QString &strMachineName) const
+{
+ alert(0, MessageType_Error,
+ tr("<p>Could not insert the <b>VirtualBox Guest Additions</b> disk image file into the virtual machine <b>%1</b>, "
+ "as the machine has no CD/DVD drives. Please add a drive using the storage page of the "
+ "virtual machine settings window.</p>")
+ .arg(strMachineName));
+}
+
+#ifdef VBOX_GUI_WITH_NETWORK_MANAGER
bool UIMessageCenter::confirmCancelingAllNetworkRequests() const
{
return questionBinary(windowManager().networkManagerOrMainWindowShown(), MessageType_Question,
@@ -2052,15 +2064,6 @@ bool UIMessageCenter::proposeMountGuestAdditions(const QString &strUrl, const QS
tr("Insert", "additions"));
}
-void UIMessageCenter::cannotMountGuestAdditions(const QString &strMachineName) const
-{
- alert(0, MessageType_Error,
- tr("<p>Could not insert the <b>VirtualBox Guest Additions</b> disk image file into the virtual machine <b>%1</b>, "
- "as the machine has no CD/DVD drives. Please add a drive using the storage page of the "
- "virtual machine settings window.</p>")
- .arg(strMachineName));
-}
-
void UIMessageCenter::cannotUpdateGuestAdditions(const CProgress &progress) const
{
error(0, MessageType_Error,
@@ -2149,6 +2152,7 @@ bool UIMessageCenter::proposeInstallExtentionPack(const QString &strExtPackName,
0 /* auto-confirm id */,
tr("Install", "extension pack"));
}
+#endif /* VBOX_GUI_WITH_NETWORK_MANAGER */
bool UIMessageCenter::confirmInstallExtensionPack(const QString &strPackName, const QString &strPackVersion,
const QString &strPackDescription, QWidget *pParent /* = 0*/) const
diff --git a/src/VBox/Frontends/VirtualBox/src/globals/UIMessageCenter.h b/src/VBox/Frontends/VirtualBox/src/globals/UIMessageCenter.h
index 80c8c4f..72b9ff2 100644
--- a/src/VBox/Frontends/VirtualBox/src/globals/UIMessageCenter.h
+++ b/src/VBox/Frontends/VirtualBox/src/globals/UIMessageCenter.h
@@ -299,7 +299,9 @@ public:
void cannotToggleVRDEServer(const CVRDEServer &server, const QString &strMachineName, bool fEnable);
void cannotToggleVideoCapture(const CMachine &machine, bool fEnable);
void remindAboutGuestAdditionsAreNotActive() const;
+ void cannotMountGuestAdditions(const QString &strMachineName) const;
+#ifdef VBOX_GUI_WITH_NETWORK_MANAGER
/* API: Network management warnings: */
bool confirmCancelingAllNetworkRequests() const;
void showUpdateSuccess(const QString &strVersion, const QString &strLink) const;
@@ -311,7 +313,6 @@ public:
bool confirmDownloadGuestAdditions(const QString &strUrl, qulonglong uSize) const;
void cannotSaveGuestAdditions(const QString &strURL, const QString &strTarget) const;
bool proposeMountGuestAdditions(const QString &strUrl, const QString &strSrc) const;
- void cannotMountGuestAdditions(const QString &strMachineName) const;
void cannotUpdateGuestAdditions(const CProgress &progress) const;
bool cannotFindUserManual(const QString &strMissedLocation) const;
bool confirmDownloadUserManual(const QString &strURL, qulonglong uSize) const;
@@ -321,6 +322,9 @@ public:
bool confirmDownloadExtensionPack(const QString &strExtPackName, const QString &strURL, qulonglong uSize) const;
void cannotSaveExtensionPack(const QString &strExtPackName, const QString &strFrom, const QString &strTo) const;
bool proposeInstallExtentionPack(const QString &strExtPackName, const QString &strFrom, const QString &strTo) const;
+#endif /* VBOX_GUI_WITH_NETWORK_MANAGER */
+
+ /* API: Extension-pack warnings: */
bool confirmInstallExtensionPack(const QString &strPackName, const QString &strPackVersion, const QString &strPackDescription, QWidget *pParent = 0) const;
bool confirmReplaceExtensionPack(const QString &strPackName, const QString &strPackVersionNew, const QString &strPackVersionOld,
const QString &strPackDescription, QWidget *pParent = 0) const;
diff --git a/src/VBox/Frontends/VirtualBox/src/globals/UIModalWindowManager.cpp b/src/VBox/Frontends/VirtualBox/src/globals/UIModalWindowManager.cpp
index ba631cc..d41fb06 100644
--- a/src/VBox/Frontends/VirtualBox/src/globals/UIModalWindowManager.cpp
+++ b/src/VBox/Frontends/VirtualBox/src/globals/UIModalWindowManager.cpp
@@ -19,8 +19,10 @@
/* GUI includes: */
#include "UIModalWindowManager.h"
-#include "UINetworkManagerDialog.h"
-#include "UINetworkManager.h"
+#ifdef VBOX_GUI_WITH_NETWORK_MANAGER
+# include "UINetworkManagerDialog.h"
+# include "UINetworkManager.h"
+#endif /* VBOX_GUI_WITH_NETWORK_MANAGER */
#include "UISelectorWindow.h"
#include "UIProgressDialog.h"
#include "VBoxGlobal.h"
@@ -100,12 +102,14 @@ QWidget* UIModalWindowManager::mainWindowShown() const
return 0;
}
+#ifdef VBOX_GUI_WITH_NETWORK_MANAGER
QWidget* UIModalWindowManager::networkManagerOrMainWindowShown() const
{
/* It may happen that this method is called before network-manager initialization
* or when the network-manager is hidden, return main application window in this case: */
return gNetworkManager && gNetworkManager->window()->isVisible() ? gNetworkManager->window() : mainWindowShown();
}
+#endif /* VBOX_GUI_WITH_NETWORK_MANAGER */
QWidget* UIModalWindowManager::realParentWindow(QWidget *pWidget)
{
diff --git a/src/VBox/Frontends/VirtualBox/src/globals/UIModalWindowManager.h b/src/VBox/Frontends/VirtualBox/src/globals/UIModalWindowManager.h
index 8a0f55b..70cfd17 100644
--- a/src/VBox/Frontends/VirtualBox/src/globals/UIModalWindowManager.h
+++ b/src/VBox/Frontends/VirtualBox/src/globals/UIModalWindowManager.h
@@ -47,7 +47,9 @@ public:
/* API: Main application window stuff: */
QWidget* mainWindowShown() const;
+#ifdef VBOX_GUI_WITH_NETWORK_MANAGER
QWidget* networkManagerOrMainWindowShown() const;
+#endif /* VBOX_GUI_WITH_NETWORK_MANAGER */
private slots:
diff --git a/src/VBox/Frontends/VirtualBox/src/globals/UIPopupCenter.cpp b/src/VBox/Frontends/VirtualBox/src/globals/UIPopupCenter.cpp
index 70b53cd..4bf679b 100644
--- a/src/VBox/Frontends/VirtualBox/src/globals/UIPopupCenter.cpp
+++ b/src/VBox/Frontends/VirtualBox/src/globals/UIPopupCenter.cpp
@@ -478,15 +478,10 @@ void UIPopupCenter::forgetAboutPausedVMInput(QWidget *pParent)
void UIPopupCenter::remindAboutWrongColorDepth(QWidget *pParent, ulong uRealBPP, ulong uWantedBPP)
{
alert(pParent, "remindAboutWrongColorDepth",
- QApplication::translate("UIMessageCenter", "<p>The virtual machine window is optimized to work in <b>%1 bit</b> color mode "
- "but the virtual display is currently set to <b>%2 bit</b>.</p>"
- "<p>Please open the display properties dialog of the guest OS and select a <b>%3 bit</b> color mode, "
- "if it is available, for best possible performance of the virtual video subsystem.</p>"
- "<p><b>Note</b>. Some operating systems, like OS/2, may actually work in 32 bit mode "
- "but report it as 24 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 bit) is not available in the guest OS.</p>")
- .arg(uWantedBPP).arg(uRealBPP).arg(uWantedBPP).arg(uWantedBPP),
+ QApplication::translate("UIMessageCenter", "<p>The virtual screen is currently set to a <b>%1 bit</b> color mode. For better "
+ "performance please change this to <b>%2 bit</b>. This can usually be done from the"
+ " <b>Display</b> section of the guest operating system's Control Panel or System Settings.</p>")
+ .arg(uRealBPP).arg(uWantedBPP),
true);
}
diff --git a/src/VBox/Frontends/VirtualBox/src/globals/VBoxGlobal.cpp b/src/VBox/Frontends/VirtualBox/src/globals/VBoxGlobal.cpp
index 0d4626a..b2ea408 100644
--- a/src/VBox/Frontends/VirtualBox/src/globals/VBoxGlobal.cpp
+++ b/src/VBox/Frontends/VirtualBox/src/globals/VBoxGlobal.cpp
@@ -33,7 +33,9 @@
#include <QTimer>
#include <QDir>
#include <QLocale>
-#include <QNetworkProxy>
+#ifdef VBOX_GUI_WITH_NETWORK_MANAGER
+# include <QNetworkProxy>
+#endif /* VBOX_GUI_WITH_NETWORK_MANAGER */
#include <QSpinBox>
#include <QStyleOptionSpinBox>
@@ -65,8 +67,10 @@
#include "UIActionPoolRuntime.h"
#include "UIExtraDataEventHandler.h"
#include "QIFileDialog.h"
-#include "UINetworkManager.h"
-#include "UIUpdateManager.h"
+#ifdef VBOX_GUI_WITH_NETWORK_MANAGER
+# include "UINetworkManager.h"
+# include "UIUpdateManager.h"
+#endif /* VBOX_GUI_WITH_NETWORK_MANAGER */
#include "UIMachine.h"
#include "UISession.h"
#include "UIConverter.h"
@@ -463,7 +467,11 @@ QWidget* VBoxGlobal::activeMachineWindow()
*/
bool VBoxGlobal::is3DAvailableWorker() const
{
+#ifdef VBOX_WITH_CROGL
bool fSupported = VBoxOglIs3DAccelerationSupported();
+#else
+ bool fSupported = false;
+#endif
unconst(this)->m3DAvailable = fSupported;
return fSupported;
}
@@ -1677,6 +1685,7 @@ CSession VBoxGlobal::openSession(const QString &strId, KLockType lockType /* = K
return session;
}
+#ifdef VBOX_GUI_WITH_NETWORK_MANAGER
void VBoxGlobal::reloadProxySettings()
{
UIProxyManager proxyManager(settings().proxySettings());
@@ -1708,6 +1717,7 @@ void VBoxGlobal::reloadProxySettings()
QNetworkProxy::setApplicationProxy(QNetworkProxy(QNetworkProxy::NoProxy));
}
}
+#endif /* VBOX_GUI_WITH_NETWORK_MANAGER */
void VBoxGlobal::createMedium(const UIMedium &medium)
{
@@ -1717,14 +1727,6 @@ void VBoxGlobal::createMedium(const UIMedium &medium)
m_pMediumEnumerator->createMedium(medium);
}
-void VBoxGlobal::updateMedium(const UIMedium &medium)
-{
- /* Update medium of medium-enumerator: */
- QReadLocker cleanupRacePreventor(&m_mediumEnumeratorDtorRwLock);
- if (m_pMediumEnumerator)
- m_pMediumEnumerator->updateMedium(medium);
-}
-
void VBoxGlobal::deleteMedium(const QString &strMediumID)
{
/* Delete medium from medium-enumerator: */
@@ -3412,12 +3414,14 @@ bool VBoxGlobal::isApprovedByExtraData(CMachine &machine, const QString &strExtr
|| strExtraDataValue == "1";
}
+#ifdef VBOX_GUI_WITH_NETWORK_MANAGER
/* static */
bool VBoxGlobal::shouldWeAllowApplicationUpdate(CVirtualBox &vbox)
{
/* 'true' if disabling is not approved by the extra-data: */
return !isApprovedByExtraData(vbox, GUI_PreventApplicationUpdate);
}
+#endif /* VBOX_GUI_WITH_NETWORK_MANAGER */
/* static */
bool VBoxGlobal::shouldWeShowMachine(CMachine &machine)
@@ -3528,6 +3532,12 @@ bool VBoxGlobal::shouldWeAllowSnapshotOperations(CMachine &machine,
return !isApprovedByExtraData(machine, GUI_PreventSnapshotOperations);
}
+/** Returns default machine close action for passed @a machine. */
+MachineCloseAction VBoxGlobal::defaultMachineCloseAction(CMachine &machine)
+{
+ return gpConverter->fromInternalString<MachineCloseAction>(machine.GetExtraData(GUI_DefaultCloseAction));
+}
+
/* static */
RuntimeMenuType VBoxGlobal::restrictedRuntimeMenuTypes(CMachine &machine)
{
@@ -3585,11 +3595,11 @@ QList<IndicatorType> VBoxGlobal::restrictedStatusBarIndicators(CMachine &machine
return result;
}
-/* static */
-QList<MachineCloseAction> VBoxGlobal::restrictedMachineCloseActions(CMachine &machine)
+/** Returns merged restricted machine close actions for passed @a machine. */
+MachineCloseAction VBoxGlobal::restrictedMachineCloseActions(CMachine &machine)
{
/* Prepare result: */
- QList<MachineCloseAction> result;
+ MachineCloseAction result = MachineCloseAction_Invalid;
/* Load restricted machine-close-actions: */
QString strList(machine.GetExtraData(GUI_RestrictedCloseActions));
QStringList list = strList.split(',');
@@ -3598,7 +3608,7 @@ QList<MachineCloseAction> VBoxGlobal::restrictedMachineCloseActions(CMachine &ma
{
MachineCloseAction value = gpConverter->fromInternalString<MachineCloseAction>(strValue);
if (value != MachineCloseAction_Invalid)
- result << value;
+ result = static_cast<MachineCloseAction>(result | value);
}
/* Return result: */
return result;
@@ -3792,8 +3802,10 @@ void VBoxGlobal::sltGUILanguageChange(QString strLang)
void VBoxGlobal::sltProcessGlobalSettingChange()
{
+#ifdef VBOX_GUI_WITH_NETWORK_MANAGER
/* Reload proxy settings: */
reloadProxySettings();
+#endif /* VBOX_GUI_WITH_NETWORK_MANAGER */
}
// Protected members
@@ -4347,8 +4359,6 @@ void VBoxGlobal::prepare()
/* Prepare medium-enumerator: */
connect(m_pMediumEnumerator, SIGNAL(sigMediumCreated(const QString&)),
this, SIGNAL(sigMediumCreated(const QString&)));
- connect(m_pMediumEnumerator, SIGNAL(sigMediumUpdated(const QString&)),
- this, SIGNAL(sigMediumUpdated(const QString&)));
connect(m_pMediumEnumerator, SIGNAL(sigMediumDeleted(const QString&)),
this, SIGNAL(sigMediumDeleted(const QString&)));
connect(m_pMediumEnumerator, SIGNAL(sigMediumEnumerationStarted()),
@@ -4382,11 +4392,13 @@ void VBoxGlobal::prepare()
UIActionPool::createTemporary(UIActionPoolType_Runtime);
}
+#ifdef VBOX_GUI_WITH_NETWORK_MANAGER
/* Create network manager: */
UINetworkManager::create();
/* Schedule update manager: */
UIUpdateManager::schedule();
+#endif /* VBOX_GUI_WITH_NETWORK_MANAGER */
}
void VBoxGlobal::cleanup()
@@ -4395,11 +4407,13 @@ void VBoxGlobal::cleanup()
* which could de called from the other threads: */
m_sfCleanupInProgress = true;
+#ifdef VBOX_GUI_WITH_NETWORK_MANAGER
/* Shutdown update manager: */
UIUpdateManager::shutdown();
/* Destroy network manager: */
UINetworkManager::destroy();
+#endif /* VBOX_GUI_WITH_NETWORK_MANAGER */
/* Destroy action pool: */
UIActionPool::destroy();
diff --git a/src/VBox/Frontends/VirtualBox/src/globals/VBoxGlobal.h b/src/VBox/Frontends/VirtualBox/src/globals/VBoxGlobal.h
index b9bc2a1..791c17c 100644
--- a/src/VBox/Frontends/VirtualBox/src/globals/VBoxGlobal.h
+++ b/src/VBox/Frontends/VirtualBox/src/globals/VBoxGlobal.h
@@ -247,11 +247,12 @@ public:
/** Shortcut to openSession (aId, true). */
CSession openExistingSession(const QString &aId) { return openSession(aId, KLockType_Shared); }
+#ifdef VBOX_GUI_WITH_NETWORK_MANAGER
void reloadProxySettings();
+#endif /* VBOX_GUI_WITH_NETWORK_MANAGER */
/* API: Medium-processing stuff: */
void createMedium(const UIMedium &medium);
- void updateMedium(const UIMedium &medium);
void deleteMedium(const QString &strMediumID);
QString openMediumWithFileOpenDialog(UIMediumType mediumType, QWidget *pParent = 0,
const QString &strDefaultFolder = QString(), bool fUseLastFolder = true);
@@ -349,7 +350,9 @@ public:
/* Extra-data settings stuff: */
static bool isApprovedByExtraData(CVirtualBox &vbox, const QString &strExtraDataKey);
static bool isApprovedByExtraData(CMachine &machine, const QString &strExtraDataKey);
+#ifdef VBOX_GUI_WITH_NETWORK_MANAGER
static bool shouldWeAllowApplicationUpdate(CVirtualBox &vbox);
+#endif /* VBOX_GUI_WITH_NETWORK_MANAGER */
static bool shouldWeShowMachine(CMachine &machine);
static bool shouldWeAllowMachineReconfiguration(CMachine &machine,
bool fIncludingMachineGeneralCheck = false,
@@ -358,10 +361,11 @@ public:
bool fIncludingMachineGeneralCheck = false);
static bool shouldWeAutoMountGuestScreens(CMachine &machine, bool fIncludingSanityCheck = true);
static bool shouldWeAllowSnapshotOperations(CMachine &machine, bool fIncludingSanityCheck = true);
+ static MachineCloseAction defaultMachineCloseAction(CMachine &machine);
static RuntimeMenuType restrictedRuntimeMenuTypes(CMachine &machine);
static UIVisualStateType restrictedVisualStateTypes(CMachine &machine);
static QList<IndicatorType> restrictedStatusBarIndicators(CMachine &machine);
- static QList<MachineCloseAction> restrictedMachineCloseActions(CMachine &machine);
+ static MachineCloseAction restrictedMachineCloseActions(CMachine &machine);
static QList<GlobalSettingsPageType> restrictedGlobalSettingsPages(CVirtualBox &vbox);
static QList<MachineSettingsPageType> restrictedMachineSettingsPages(CMachine &machine);
@@ -379,7 +383,6 @@ signals:
/* Notifiers: Medium-processing stuff: */
void sigMediumCreated(const QString &strMediumID);
- void sigMediumUpdated(const QString &strMediumID);
void sigMediumDeleted(const QString &strMediumID);
/* Notifiers: Medium-enumeration stuff: */
diff --git a/src/VBox/Frontends/VirtualBox/src/medium/UIMedium.cpp b/src/VBox/Frontends/VirtualBox/src/medium/UIMedium.cpp
index 9dec2db..ee4de12 100644
--- a/src/VBox/Frontends/VirtualBox/src/medium/UIMedium.cpp
+++ b/src/VBox/Frontends/VirtualBox/src/medium/UIMedium.cpp
@@ -79,6 +79,7 @@ UIMedium& UIMedium::operator=(const UIMedium &other)
m_strLastAccessError = other.lastAccessError();
m_result = other.result();
+ m_strKey = other.key();
m_strId = other.id();
m_strName = other.name();
m_strLocation = other.location();
@@ -168,6 +169,9 @@ void UIMedium::refresh()
m_strId = m_medium.isNull() ? nullID() : m_medium.GetId();
+ if (m_strKey.isNull() && !m_strId.isNull())
+ m_strKey = m_strId;
+
m_fHostDrive = m_medium.isNull() ? false : m_medium.GetHostDrive();
if (m_medium.isNull())
@@ -361,6 +365,17 @@ void UIMedium::refresh()
m_noDiffs.isSet = false;
}
+void UIMedium::updateParentID()
+{
+ m_strParentID = nullID();
+ if (m_type == UIMediumType_HardDisk)
+ {
+ CMedium parentMedium = m_medium.GetParent();
+ if (!parentMedium.isNull())
+ m_strParentID = parentMedium.GetId();
+ }
+}
+
UIMedium UIMedium::parent() const
{
/* Redirect call to VBoxGlobal: */
diff --git a/src/VBox/Frontends/VirtualBox/src/medium/UIMedium.h b/src/VBox/Frontends/VirtualBox/src/medium/UIMedium.h
index 3bb8ecd..85a2ccd 100644
--- a/src/VBox/Frontends/VirtualBox/src/medium/UIMedium.h
+++ b/src/VBox/Frontends/VirtualBox/src/medium/UIMedium.h
@@ -137,6 +137,9 @@ public:
return fNoDiffs ? m_noDiffs.result : m_result;
}
+ QString key() const { return m_strKey; }
+ void setKey(const QString &strKey) { m_strKey = strKey; }
+
QString id() const { return m_strId; }
QString name(bool fNoDiffs = false) const { return fNoDiffs ? root().m_strName : m_strName; }
QString location(bool fNoDiffs = false) const { return fNoDiffs ? root().m_strLocation : m_strLocation; }
@@ -195,6 +198,7 @@ public:
const QList <QString> &curStateMachineIds() const { return m_curStateMachineIds; }
/* API: Parent/Root stuff: */
+ void updateParentID();
QString parentID() const { return m_strParentID; }
QString rootID() const { return m_strRootID; }
UIMedium parent() const;
@@ -232,6 +236,7 @@ private:
QString m_strLastAccessError;
COMResult m_result;
+ QString m_strKey;
QString m_strId;
QString m_strName;
QString m_strLocation;
diff --git a/src/VBox/Frontends/VirtualBox/src/medium/UIMediumEnumerator.cpp b/src/VBox/Frontends/VirtualBox/src/medium/UIMediumEnumerator.cpp
index a07e8f8..05b8aa6 100644
--- a/src/VBox/Frontends/VirtualBox/src/medium/UIMediumEnumerator.cpp
+++ b/src/VBox/Frontends/VirtualBox/src/medium/UIMediumEnumerator.cpp
@@ -27,6 +27,7 @@
/* COM includes: */
#include "COMEnums.h"
#include "CMachine.h"
+#include "CSnapshot.h"
#include "CMediumAttachment.h"
@@ -69,8 +70,10 @@ UIMediumEnumerator::UIMediumEnumerator(ulong uWorkerCount /* = 3*/, ulong uWorke
/* Prepare Main event handlers: */
connect(gVBoxEvents, SIGNAL(sigMachineDataChange(QString)), this, SLOT(sltHandleMachineUpdate(QString)));
- connect(gVBoxEvents, SIGNAL(sigMachineRegistered(QString, bool)), this, SLOT(sltHandleMachineUpdate(QString)));
+ connect(gVBoxEvents, SIGNAL(sigSnapshotTake(QString, QString)), this, SLOT(sltHandleMachineUpdate(QString)));
+ connect(gVBoxEvents, SIGNAL(sigSnapshotDelete(QString, QString)), this, SLOT(sltHandleSnapshotDeleted(QString, QString)));
connect(gVBoxEvents, SIGNAL(sigSnapshotChange(QString, QString)), this, SLOT(sltHandleMachineUpdate(QString)));
+ connect(gVBoxEvents, SIGNAL(sigMachineRegistered(QString, bool)), this, SLOT(sltHandleMachineRegistration(QString, bool)));
/* Prepare thread-pool: */
m_pThreadPool = new UIThreadPool(uWorkerCount, uWorkerTimeout);
@@ -106,44 +109,33 @@ UIMedium UIMediumEnumerator::medium(const QString &strMediumID)
void UIMediumEnumerator::createMedium(const UIMedium &medium)
{
/* Get medium ID: */
- QString strMediumID = medium.id();
- LogRelFlow(("UIMediumEnumerator: Medium with ID={%s} created.\n", strMediumID.toAscii().constData()));
+ const QString strMediumID = medium.id();
+ /* Do not create UIMedium(s) with incorrect ID: */
+ AssertReturnVoid(!strMediumID.isNull());
+ AssertReturnVoid(strMediumID != UIMedium::nullID());
/* Make sure medium doesn't exists already: */
AssertReturnVoid(!m_mediums.contains(strMediumID));
/* Insert medium: */
m_mediums[strMediumID] = medium;
+ LogRel(("UIMediumEnumerator: Medium with key={%s} created.\n", strMediumID.toAscii().constData()));
/* Notify listener: */
emit sigMediumCreated(strMediumID);
}
-void UIMediumEnumerator::updateMedium(const UIMedium &medium)
-{
- /* Get medium ID: */
- QString strMediumID = medium.id();
- LogRelFlow(("UIMediumEnumerator: Medium with ID={%s} updated.\n", strMediumID.toAscii().constData()));
-
- /* Make sure medium still exists: */
- AssertReturnVoid(m_mediums.contains(strMediumID));
-
- /* Update medium: */
- m_mediums[strMediumID] = medium;
-
- /* Notify listener: */
- emit sigMediumUpdated(strMediumID);
-}
-
void UIMediumEnumerator::deleteMedium(const QString &strMediumID)
{
- LogRelFlow(("UIMediumEnumerator: Medium with ID={%s} removed.\n", strMediumID.toAscii().constData()));
-
+ /* Do not delete UIMedium(s) with incorrect ID: */
+ AssertReturnVoid(!strMediumID.isNull());
+ AssertReturnVoid(strMediumID != UIMedium::nullID());
/* Make sure medium still exists: */
AssertReturnVoid(m_mediums.contains(strMediumID));
/* Remove medium: */
m_mediums.remove(strMediumID);
+ LogRel(("UIMediumEnumerator: Medium with key={%s} deleted.\n", strMediumID.toAscii().constData()));
/* Notify listener: */
emit sigMediumDeleted(strMediumID);
@@ -168,92 +160,115 @@ void UIMediumEnumerator::enumerateMediums()
m_mediums = mediums;
/* Notify listener: */
- LogRelFlow(("UIMediumEnumerator: Medium-enumeration started...\n"));
+ LogRel(("UIMediumEnumerator: Medium-enumeration started...\n"));
m_fMediumEnumerationInProgress = true;
emit sigMediumEnumerationStarted();
- /* Start enumeration for all the new mediums: */
+ /* Start enumeration for UIMedium(s) with correct ID: */
foreach (const QString &strMediumID, m_mediums.keys())
- createMediumEnumerationTask(m_mediums[strMediumID]);
+ if (!strMediumID.isNull() && strMediumID != UIMedium::nullID())
+ createMediumEnumerationTask(m_mediums[strMediumID]);
}
void UIMediumEnumerator::sltHandleMachineUpdate(QString strMachineID)
{
- LogRelFlow(("UIMediumEnumerator: Machine event received, ID = %s\n", strMachineID.toAscii().constData()));
-
- /* Compose a map of previous usage: */
- QStringList oldUsage;
- foreach (const QString &strMediumID, mediumIDs())
- {
- const UIMedium &uimedium = m_mediums[strMediumID];
- const QList<QString> &machineIDs = uimedium.curStateMachineIds();
- if (machineIDs.contains(strMachineID))
- oldUsage << strMediumID;
- }
- LogRelFlow(("UIMediumEnumerator: Old usage: %s\n", oldUsage.isEmpty() ? "<empty>" : oldUsage.join(", ").toAscii().constData()));
-
- /* Compose a map of current usage: */
- QStringList newUsage;
- QMap<QString, CMedium> newMediumMap;
- CMachine machine = vboxGlobal().virtualBox().FindMachine(strMachineID);
- if (!machine.isNull())
- {
- foreach (const CMediumAttachment &attachment, machine.GetMediumAttachments())
- {
- CMedium cmedium = attachment.GetMedium();
- if (cmedium.isNull())
- continue;
- QString strMediumID = cmedium.GetId();
- newMediumMap.insert(strMediumID, cmedium);
- newUsage << strMediumID;
- }
- }
- LogRelFlow(("UIMediumEnumerator: New usage: %s\n", newUsage.isEmpty() ? "<empty>" : newUsage.join(", ").toAscii().constData()));
-
- /* Manipulations over the sets: */
- QSet<QString> oldSet = oldUsage.toSet();
- QSet<QString> newSet = newUsage.toSet();
+ LogRel(("UIMediumEnumerator: Machine (or snapshot) event received, ID = %s\n",
+ strMachineID.toAscii().constData()));
+
+ /* Gather previously used UIMedium IDs: */
+ QStringList previousUIMediumIDs;
+ calculateCachedUsage(strMachineID, previousUIMediumIDs, true /* take into account current state only */);
+ LogRel(("UIMediumEnumerator: Old usage: %s\n",
+ previousUIMediumIDs.isEmpty() ? "<empty>" : previousUIMediumIDs.join(", ").toAscii().constData()));
+
+ /* Gather currently used CMediums and their IDs: */
+ CMediumMap currentCMediums;
+ QStringList currentCMediumIDs;
+ calculateActualUsage(strMachineID, currentCMediums, currentCMediumIDs, true /* take into account current state only */);
+ LogRel(("UIMediumEnumerator: New usage: %s\n",
+ currentCMediumIDs.isEmpty() ? "<empty>" : currentCMediumIDs.join(", ").toAscii().constData()));
+
+ /* Determine excluded/included mediums: */
+ QSet<QString> oldSet = previousUIMediumIDs.toSet();
+ QSet<QString> newSet = currentCMediumIDs.toSet();
QSet<QString> excludedSet = oldSet - newSet;
QSet<QString> includedSet = newSet - oldSet;
QStringList excludedList = excludedSet.toList();
QStringList includedList = includedSet.toList();
if (!excludedList.isEmpty())
- LogRelFlow(("UIMediumEnumerator: Items excluded from machine usage: %s\n", excludedList.join(", ").toAscii().constData()));
+ LogRel(("UIMediumEnumerator: Items excluded from usage: %s\n", excludedList.join(", ").toAscii().constData()));
if (!includedList.isEmpty())
- LogRelFlow(("UIMediumEnumerator: Items included into machine usage: %s\n", includedList.join(", ").toAscii().constData()));
+ LogRel(("UIMediumEnumerator: Items included into usage: %s\n", includedList.join(", ").toAscii().constData()));
+
+ /* Update cache for excluded UIMediums: */
+ recacheFromCachedUsage(excludedList);
- /* For each of excluded items: */
- foreach (const QString &strExcludedMediumID, excludedList)
+ /* Update cache for included CMediums: */
+ recacheFromActualUsage(currentCMediums, includedList);
+
+ LogRel(("UIMediumEnumerator: Machine (or snapshot) event processed, ID = %s\n",
+ strMachineID.toAscii().constData()));
+}
+
+void UIMediumEnumerator::sltHandleMachineRegistration(QString strMachineID, bool fRegistered)
+{
+ LogRel(("UIMediumEnumerator: Machine %s event received, ID = %s\n",
+ fRegistered ? "registration" : "unregistration",
+ strMachineID.toAscii().constData()));
+
+ /* Machine was registered: */
+ if (fRegistered)
{
- /* Make sure this medium still in our map: */
- if (!m_mediums.contains(strExcludedMediumID))
- continue;
- /* Remove UIMedium if it was closed already: */
- const UIMedium &uimedium = m_mediums[strExcludedMediumID];
- if (uimedium.medium().GetId() != strExcludedMediumID)
- {
- deleteMedium(strExcludedMediumID);
- continue;
- }
- /* Enumerate UIMedium if CMedium still exists: */
- createMediumEnumerationTask(uimedium);
+ /* Gather currently used CMediums and their IDs: */
+ CMediumMap currentCMediums;
+ QStringList currentCMediumIDs;
+ calculateActualUsage(strMachineID, currentCMediums, currentCMediumIDs, false /* take into account current state only */);
+ LogRel(("UIMediumEnumerator: New usage: %s\n",
+ currentCMediumIDs.isEmpty() ? "<empty>" : currentCMediumIDs.join(", ").toAscii().constData()));
+ /* Update cache with currently used CMediums: */
+ recacheFromActualUsage(currentCMediums, currentCMediumIDs);
}
-
- /* For each of included items: */
- foreach (const QString &strIncludedMediumID, includedList)
+ /* Machine was unregistered: */
+ else
{
- /* Create UIMedium if it is not in our map: */
- if (!m_mediums.contains(strIncludedMediumID))
- {
- const CMedium &cmedium = newMediumMap[strIncludedMediumID];
- UIMedium uimedium(cmedium, UIMediumDefs::mediumTypeToLocal(cmedium.GetDeviceType()));
- createMedium(uimedium);
- }
- /* Enumerate UIMedium in any case: */
- createMediumEnumerationTask(m_mediums[strIncludedMediumID]);
+ /* Gather previously used UIMedium IDs: */
+ QStringList previousUIMediumIDs;
+ calculateCachedUsage(strMachineID, previousUIMediumIDs, false /* take into account current state only */);
+ LogRel(("UIMediumEnumerator: Old usage: %s\n",
+ previousUIMediumIDs.isEmpty() ? "<empty>" : previousUIMediumIDs.join(", ").toAscii().constData()));
+ /* Update cache for previously used UIMediums: */
+ recacheFromCachedUsage(previousUIMediumIDs);
}
- LogRelFlow(("UIMediumEnumerator: Machine event processed, ID = %s\n", strMachineID.toAscii().constData()));
+ LogRel(("UIMediumEnumerator: Machine %s event processed, ID = %s\n",
+ fRegistered ? "registration" : "unregistration",
+ strMachineID.toAscii().constData()));
+}
+
+void UIMediumEnumerator::sltHandleSnapshotDeleted(QString strMachineID, QString strSnapshotID)
+{
+ LogRel(("UIMediumEnumerator: Snapshot-deleted event received, Machine ID = {%s}, Snapshot ID = {%s}\n",
+ strMachineID.toAscii().constData(), strSnapshotID.toAscii().constData()));
+
+ /* Gather previously used UIMedium IDs: */
+ QStringList previousUIMediumIDs;
+ calculateCachedUsage(strMachineID, previousUIMediumIDs, false /* take into account current state only */);
+ LogRel(("UIMediumEnumerator: Old usage: %s\n",
+ previousUIMediumIDs.isEmpty() ? "<empty>" : previousUIMediumIDs.join(", ").toAscii().constData()));
+
+ /* Gather currently used CMediums and their IDs: */
+ CMediumMap currentCMediums;
+ QStringList currentCMediumIDs;
+ calculateActualUsage(strMachineID, currentCMediums, currentCMediumIDs, true /* take into account current state only */);
+ LogRel(("UIMediumEnumerator: New usage: %s\n",
+ currentCMediumIDs.isEmpty() ? "<empty>" : currentCMediumIDs.join(", ").toAscii().constData()));
+
+ /* Update everything: */
+ recacheFromCachedUsage(previousUIMediumIDs);
+ recacheFromActualUsage(currentCMediums, currentCMediumIDs);
+
+ LogRel(("UIMediumEnumerator: Snapshot-deleted event processed, Machine ID = {%s}, Snapshot ID = {%s}\n",
+ strMachineID.toAscii().constData(), strSnapshotID.toAscii().constData()));
}
void UIMediumEnumerator::sltHandleMediumEnumerationTaskComplete(UITask *pTask)
@@ -262,29 +277,58 @@ void UIMediumEnumerator::sltHandleMediumEnumerationTaskComplete(UITask *pTask)
int iIndexOfTask = m_tasks.indexOf(pTask);
AssertReturnVoid(iIndexOfTask != -1);
- /* Get medium: */
- UIMedium medium = pTask->data().value<UIMedium>();
- QString strMediumID = medium.id();
- LogRelFlow(("UIMediumEnumerator: Medium with ID={%s} enumerated.\n", strMediumID.toAscii().constData()));
+ /* Get enumerated UIMedium: */
+ const UIMedium uimedium = pTask->data().value<UIMedium>();
+ const QString strUIMediumKey = uimedium.key();
+ LogRel2(("UIMediumEnumerator: Medium with key={%s} enumerated.\n", strUIMediumKey.toAscii().constData()));
/* Delete task: */
delete m_tasks.takeAt(iIndexOfTask);
- /* Make sure such medium still exists: */
- if (!m_mediums.contains(strMediumID))
- return;
+ /* Make sure such UIMedium still exists: */
+ AssertReturnVoid(m_mediums.contains(strUIMediumKey));
- /* Update enumerated medium: */
- m_mediums[strMediumID] = medium;
+ /* Check if UIMedium ID was changed: */
+ const QString strUIMediumID = uimedium.id();
+ /* UIMedium ID was changed to null string: */
+ if (strUIMediumID.isNull())
+ {
+ /* Delete this medium: */
+ m_mediums.remove(strUIMediumKey);
+ LogRel(("UIMediumEnumerator: Medium with key={%s} closed and deleted (after enumeration).\n", strUIMediumKey.toAscii().constData()));
+ /* And notify listener about delete: */
+ emit sigMediumDeleted(strUIMediumKey);
+ }
+ /* UIMedium ID was changed to something proper: */
+ else if (strUIMediumID != strUIMediumKey)
+ {
+ /* We have to reinject enumerated medium: */
+ m_mediums.remove(strUIMediumKey);
+ m_mediums[strUIMediumID] = uimedium;
+ m_mediums[strUIMediumID].setKey(strUIMediumID);
+ LogRel(("UIMediumEnumerator: Medium with key={%s} has it changed to {%s}.\n", strUIMediumKey.toAscii().constData(),
+ strUIMediumID.toAscii().constData()));
+
+ /* And notify listener about delete/create: */
+ emit sigMediumDeleted(strUIMediumKey);
+ emit sigMediumCreated(strUIMediumID);
+ }
+ /* UIMedium ID was not changed: */
+ else
+ {
+ /* Just update enumerated medium: */
+ m_mediums[strUIMediumID] = uimedium;
+ LogRel2(("UIMediumEnumerator: Medium with key={%s} updated.\n", strUIMediumID.toAscii().constData()));
- /* Notify listener: */
- emit sigMediumEnumerated(strMediumID);
+ /* And notify listener about update: */
+ emit sigMediumEnumerated(strUIMediumID);
+ }
/* If there are no more tasks we know about: */
if (m_tasks.isEmpty())
{
/* Notify listener: */
- LogRelFlow(("UIMediumEnumerator: Medium-enumeration finished!\n"));
+ LogRel(("UIMediumEnumerator: Medium-enumeration finished!\n"));
m_fMediumEnumerationInProgress = false;
emit sigMediumEnumerationFinished();
}
@@ -352,6 +396,168 @@ void UIMediumEnumerator::addHardDisksToMap(const CMediumVector &inputMediums, UI
}
}
+/**
+ * Calculates last known UIMedium <i>usage</i> based on cached data.
+ * @param strMachineID describes the machine we are calculating <i>usage</i> for.
+ * @param previousUIMediumIDs receives UIMedium IDs used in cached data.
+ * @param fTakeIntoAccountCurrentStateOnly defines whether we should take into accound current VM state only.
+ */
+void UIMediumEnumerator::calculateCachedUsage(const QString &strMachineID, QStringList &previousUIMediumIDs, bool fTakeIntoAccountCurrentStateOnly) const
+{
+ /* For each the UIMedium ID cache have: */
+ foreach (const QString &strMediumID, mediumIDs())
+ {
+ /* Get corresponding UIMedium: */
+ const UIMedium &uimedium = m_mediums[strMediumID];
+ /* Get the list of the machines this UIMedium attached to.
+ * Take into account current-state only if necessary. */
+ const QList<QString> &machineIDs = fTakeIntoAccountCurrentStateOnly ?
+ uimedium.curStateMachineIds() : uimedium.machineIds();
+ /* Add this UIMedium ID to previous usage if necessary: */
+ if (machineIDs.contains(strMachineID))
+ previousUIMediumIDs << strMediumID;
+ }
+}
+
+/**
+ * Calculates new CMedium <i>usage</i> based on actual data.
+ * @param strMachineID describes the machine we are calculating <i>usage</i> for.
+ * @param currentCMediums receives CMedium used in actual data.
+ * @param currentCMediumIDs receives CMedium IDs used in actual data.
+ * @param fTakeIntoAccountCurrentStateOnly defines whether we should take into accound current VM state only.
+ */
+void UIMediumEnumerator::calculateActualUsage(const QString &strMachineID, CMediumMap ¤tCMediums, QStringList ¤tCMediumIDs, bool fTakeIntoAccountCurrentStateOnly) const
+{
+ /* Search for corresponding machine: */
+ CMachine machine = vboxGlobal().virtualBox().FindMachine(strMachineID);
+ AssertReturnVoid(!machine.isNull());
+
+ /* Calculate actual usage starting from root-snapshot if necessary: */
+ if (!fTakeIntoAccountCurrentStateOnly)
+ calculateActualUsage(machine.FindSnapshot(QString()), currentCMediums, currentCMediumIDs);
+ /* Calculate actual usage for current machine state: */
+ calculateActualUsage(machine, currentCMediums, currentCMediumIDs);
+}
+
+/**
+ * Calculates new CMedium <i>usage</i> based on actual data.
+ * @param snapshot is reference we are calculating <i>usage</i> for.
+ * @param currentCMediums receives CMedium used in actual data.
+ * @param currentCMediumIDs receives CMedium IDs used in actual data.
+ */
+void UIMediumEnumerator::calculateActualUsage(const CSnapshot &snapshot, CMediumMap ¤tCMediums, QStringList ¤tCMediumIDs) const
+{
+ /* Check passed snapshot: */
+ if (snapshot.isNull())
+ return;
+
+ /* Calculate actual usage for passed snapshot machine: */
+ calculateActualUsage(snapshot.GetMachine(), currentCMediums, currentCMediumIDs);
+
+ /* Iterate through passed snapshot children: */
+ foreach (const CSnapshot &childSnapshot, snapshot.GetChildren())
+ calculateActualUsage(childSnapshot, currentCMediums, currentCMediumIDs);
+}
+
+/**
+ * Calculates new CMedium <i>usage</i> based on actual data.
+ * @param machine is reference we are calculating <i>usage</i> for.
+ * @param currentCMediums receives CMedium used in actual data.
+ * @param currentCMediumIDs receives CMedium IDs used in actual data.
+ */
+void UIMediumEnumerator::calculateActualUsage(const CMachine &machine, CMediumMap ¤tCMediums, QStringList ¤tCMediumIDs) const
+{
+ /* Check passed machine: */
+ AssertReturnVoid(!machine.isNull());
+
+ /* For each the attachment machine have: */
+ foreach (const CMediumAttachment &attachment, machine.GetMediumAttachments())
+ {
+ /* Get corresponding CMedium: */
+ CMedium cmedium = attachment.GetMedium();
+ if (!cmedium.isNull())
+ {
+ /* Make sure that CMedium was not yet closed: */
+ const QString strCMediumID = cmedium.GetId();
+ if (cmedium.isOk() && !strCMediumID.isNull())
+ {
+ /* Add this CMedium to current usage: */
+ currentCMediums.insert(strCMediumID, cmedium);
+ currentCMediumIDs << strCMediumID;
+ }
+ }
+ }
+}
+
+/**
+ * Updates cache using known changes in cached data.
+ * @param previousUIMediumIDs reflects UIMedium IDs used in cached data.
+ */
+void UIMediumEnumerator::recacheFromCachedUsage(const QStringList &previousUIMediumIDs)
+{
+ /* For each of previously used UIMedium ID: */
+ foreach (const QString &strMediumID, previousUIMediumIDs)
+ {
+ /* Make sure this ID still in our map: */
+ if (m_mediums.contains(strMediumID))
+ {
+ /* Get corresponding UIMedium: */
+ UIMedium &uimedium = m_mediums[strMediumID];
+
+ /* If corresponding CMedium still exists: */
+ CMedium cmedium = uimedium.medium();
+ if (!cmedium.GetId().isNull() && cmedium.isOk())
+ {
+ /* Refresh UIMedium parent first of all: */
+ uimedium.updateParentID();
+ /* Enumerate corresponding UIMedium: */
+ createMediumEnumerationTask(uimedium);
+ }
+ /* If corresponding CMedium was closed already: */
+ else
+ {
+ /* Uncache corresponding UIMedium: */
+ m_mediums.remove(strMediumID);
+ LogRel(("UIMediumEnumerator: Medium with key={%s} uncached.\n", strMediumID.toAscii().constData()));
+
+ /* And notify listeners: */
+ emit sigMediumDeleted(strMediumID);
+ }
+ }
+ }
+}
+
+/**
+ * Updates cache using known changes in actual data.
+ * @param currentCMediums reflects CMedium used in actual data.
+ * @param currentCMediumIDs reflects CMedium IDs used in actual data.
+ */
+void UIMediumEnumerator::recacheFromActualUsage(const CMediumMap ¤tCMediums, const QStringList ¤tCMediumIDs)
+{
+ /* For each of currently used CMedium ID: */
+ foreach (const QString &strCMediumID, currentCMediumIDs)
+ {
+ /* If that ID is not in our map: */
+ if (!m_mediums.contains(strCMediumID))
+ {
+ /* Create new UIMedium: */
+ const CMedium &cmedium = currentCMediums[strCMediumID];
+ UIMedium uimedium(cmedium, UIMediumDefs::mediumTypeToLocal(cmedium.GetDeviceType()));
+ QString strUIMediumKey = uimedium.key();
+
+ /* Cache created UIMedium: */
+ m_mediums.insert(strUIMediumKey, uimedium);
+ LogRel(("UIMediumEnumerator: Medium with key={%s} cached.\n", strUIMediumKey.toAscii().constData()));
+
+ /* And notify listeners: */
+ emit sigMediumCreated(strUIMediumKey);
+ }
+
+ /* Enumerate corresponding UIMedium: */
+ createMediumEnumerationTask(m_mediums[strCMediumID]);
+ }
+}
+
#include "UIMediumEnumerator.moc"
diff --git a/src/VBox/Frontends/VirtualBox/src/medium/UIMediumEnumerator.h b/src/VBox/Frontends/VirtualBox/src/medium/UIMediumEnumerator.h
index a4870a1..072fd26 100644
--- a/src/VBox/Frontends/VirtualBox/src/medium/UIMediumEnumerator.h
+++ b/src/VBox/Frontends/VirtualBox/src/medium/UIMediumEnumerator.h
@@ -27,6 +27,9 @@
class UIThreadPool;
class UITask;
+/* Typedefs: */
+typedef QMap<QString, CMedium> CMediumMap;
+
/* Medium-enumerator prototype.
* Manages access to medium information using thread-pool interface. */
class UIMediumEnumerator : public QObject
@@ -37,7 +40,6 @@ signals:
/* Notifiers: Medium-operations stuff: */
void sigMediumCreated(const QString &strMediumID);
- void sigMediumUpdated(const QString &strMediumID);
void sigMediumDeleted(const QString &strMediumID);
/* Notifiers: Medium-enumeration stuff: */
@@ -55,7 +57,6 @@ public:
QList<QString> mediumIDs() const;
UIMedium medium(const QString &strMediumID);
void createMedium(const UIMedium &medium);
- void updateMedium(const UIMedium &medium);
void deleteMedium(const QString &strMediumID);
/* API: Medium-enumeration stuff: */
@@ -64,8 +65,12 @@ public:
private slots:
- /* Handler: Machine stuff: */
+ /** Handles machine-data-change and snapshot-change events. */
void sltHandleMachineUpdate(QString strMachineID);
+ /** Handles machine-[un]registration events. */
+ void sltHandleMachineRegistration(QString strMachineID, bool fRegistered);
+ /** Handles snapshot-deleted events. */
+ void sltHandleSnapshotDeleted(QString strMachineID, QString strSnapshotID);
/* Handler: Medium-enumeration stuff: */
void sltHandleMediumEnumerationTaskComplete(UITask *pTask);
@@ -78,6 +83,14 @@ private:
void addMediumsToMap(const CMediumVector &inputMediums, UIMediumMap &outputMediums, UIMediumType mediumType);
void addHardDisksToMap(const CMediumVector &inputMediums, UIMediumMap &outputMediums);
+ /* Helpers: Medium re-caching stuff: */
+ void calculateCachedUsage(const QString &strMachineID, QStringList &previousUIMediumIDs, bool fTakeIntoAccountCurrentStateOnly) const;
+ void calculateActualUsage(const QString &strMachineID, CMediumMap ¤tCMediums, QStringList ¤tCMediumIDs, bool fTakeIntoAccountCurrentStateOnly) const;
+ void calculateActualUsage(const CSnapshot &snapshot, CMediumMap ¤tCMediums, QStringList ¤tCMediumIDs) const;
+ void calculateActualUsage(const CMachine &machine, CMediumMap ¤tCMediums, QStringList ¤tCMediumIDs) const;
+ void recacheFromCachedUsage(const QStringList &previousUIMediumIDs);
+ void recacheFromActualUsage(const CMediumMap ¤tCMediums, const QStringList ¤tCMediumIDs);
+
/* Variables: */
UIThreadPool *m_pThreadPool;
bool m_fMediumEnumerationInProgress;
diff --git a/src/VBox/Frontends/VirtualBox/src/medium/UIMediumManager.cpp b/src/VBox/Frontends/VirtualBox/src/medium/UIMediumManager.cpp
index d89108e..0d66c24 100644
--- a/src/VBox/Frontends/VirtualBox/src/medium/UIMediumManager.cpp
+++ b/src/VBox/Frontends/VirtualBox/src/medium/UIMediumManager.cpp
@@ -59,17 +59,17 @@ class UIMediumItem : public QTreeWidgetItem
public:
/* Medium-item type: */
- enum { MediaItemType = QTreeWidgetItem::UserType + 1 };
+ enum { Type = QTreeWidgetItem::UserType + 1 };
/* Constructor: Top-level item: */
UIMediumItem(const UIMedium &medium, QTreeWidget *pParent)
- : QTreeWidgetItem(pParent, MediaItemType)
+ : QTreeWidgetItem(pParent, Type)
, m_medium(medium)
{ refresh(); }
/* Constructor: Child item: */
UIMediumItem(const UIMedium &medium, UIMediumItem *pParent)
- : QTreeWidgetItem(pParent, MediaItemType)
+ : QTreeWidgetItem(pParent, Type)
, m_medium(medium)
{ refresh(); }
@@ -88,8 +88,8 @@ public:
refresh();
}
- /* API: Type stuff: */
- UIMediumType type() const { return m_medium.type(); }
+ /* API: Medium-type stuff: */
+ UIMediumType mediumType() const { return m_medium.type(); }
/* API: State stuff: */
KMediumState state() const { return m_medium.state(); }
@@ -145,25 +145,32 @@ private:
};
-/* Medium-item: */
-class UIMediumItemIterator : public QTreeWidgetItemIterator
+/** Functor allowing to check if passed UIMediumItem is suitable by ID. */
+class CheckIfSuitableByID : public CheckIfSuitableBy
{
public:
+ /** Constructor. */
+ CheckIfSuitableByID(const QString &strID) : m_strID(strID) {}
- UIMediumItemIterator(QTreeWidget *pTree)
- : QTreeWidgetItemIterator(pTree) {}
+private:
+ /** Determines whether passed UIMediumItem is suitable by ID. */
+ bool isItSuitable(UIMediumItem *pItem) const { return pItem->id() == m_strID; }
+ /** Holds the ID to compare to. */
+ QString m_strID;
+};
- UIMediumItem* operator*()
- {
- QTreeWidgetItem *pItem = QTreeWidgetItemIterator::operator*();
- return pItem && pItem->type() == UIMediumItem::MediaItemType ?
- static_cast<UIMediumItem*>(pItem) : 0;
- }
+/** Functor allowing to check if passed UIMediumItem is suitable by @a state. */
+class CheckIfSuitableByState : public CheckIfSuitableBy
+{
+public:
+ /** Constructor. */
+ CheckIfSuitableByState(KMediumState state) : m_state(state) {}
- UIMediumItemIterator& operator++()
- {
- return static_cast<UIMediumItemIterator&>(QTreeWidgetItemIterator::operator++());
- }
+private:
+ /** Determines whether passed UIMediumItem is suitable by @a state. */
+ bool isItSuitable(UIMediumItem *pItem) const { return pItem->state() == m_state; }
+ /** Holds the @a state to compare to. */
+ KMediumState m_state;
};
@@ -263,11 +270,6 @@ void UIMediumManager::showModeless(QWidget *pCenterWidget /* = 0*/, bool fRefres
void UIMediumManager::refreshAll()
{
- // TODO (Planned to 4.3.release by Dsen)
- // Currently we just restarting medium-enumeration which is *very* expensive.
- // To make it proper way, we have to invalidate mediums which were known as *related*
- // to machine who's event called for *full-refresh* and start medium-enumeration.
- // But medium-enumeration itself should update *only* invalidated mediums.
vboxGlobal().startMediumEnumeration();
}
@@ -339,42 +341,6 @@ void UIMediumManager::sltHandleMediumCreated(const QString &strMediumID)
sltHandleCurrentItemChanged(pMediumItem);
}
-void UIMediumManager::sltHandleMediumUpdated(const QString &strMediumID)
-{
- /* Search for corresponding medium: */
- UIMedium medium = vboxGlobal().medium(strMediumID);
-
- /* Ignore non-interesting mediums: */
- if ((medium.isNull()) || (medium.isHostDrive()))
- return;
-
- /* Ignore mediums (and their children) which are
- * marked as hidden or attached to hidden machines only: */
- if (isMediumAttachedToHiddenMachinesOnly(medium))
- return;
-
- /* Prepare medium-item: */
- UIMediumItem *pMediumItem = 0;
- switch (medium.type())
- {
- case UIMediumType_HardDisk: pMediumItem = searchItem(mTwHD, medium.id()); break;
- case UIMediumType_DVD: pMediumItem = searchItem(mTwCD, medium.id()); break;
- case UIMediumType_Floppy: pMediumItem = searchItem(mTwFD, medium.id()); break;
- default: AssertFailed();
- }
- AssertPtrReturnVoid(pMediumItem);
-
- /* Update medium-item: */
- pMediumItem->setMedium(medium);
-
- /* Update tab-icons: */
- updateTabIcons(pMediumItem, ItemAction_Updated);
-
- /* Update stuff if that was current-item updated: */
- if (pMediumItem == currentTreeWidget()->currentItem())
- sltHandleCurrentItemChanged(pMediumItem);
-}
-
void UIMediumManager::sltHandleMediumDeleted(const QString &strMediumID)
{
/* Get tree/item: */
@@ -385,7 +351,7 @@ void UIMediumManager::sltHandleMediumDeleted(const QString &strMediumID)
foreach (UIMediumType type, types)
{
pTree = treeWidget(type);
- pMediumItem = searchItem(pTree, strMediumID);
+ pMediumItem = searchItem(pTree, CheckIfSuitableByID(strMediumID));
if (pMediumItem)
break;
}
@@ -420,28 +386,11 @@ void UIMediumManager::sltHandleMediumEnumerationStart()
mTabWidget->setTabIcon(CDTab, m_iconCD);
mTabWidget->setTabIcon(FDTab, m_iconFD);
- /* Load mediums: */
+ /* Repopulate all medium-items: */
QList<QString> mediumIDs = vboxGlobal().mediumIDs();
- QList<QString> loadedMediumIDs;
prepareToRefresh(mediumIDs.size());
- while (!mediumIDs.isEmpty())
- {
- /* Get first available medium: */
- QString strMediumID = mediumIDs.first();
- UIMedium medium = vboxGlobal().medium(strMediumID);
- /* Make sure medium parent (if any) is already in list: */
- while (medium.parentID() != UIMedium::nullID() &&
- !loadedMediumIDs.contains(medium.parentID()))
- {
- medium = medium.parent();
- strMediumID = medium.id();
- }
- /* Insert resulting medium into tree: */
- int iItemIndex = mediumIDs.indexOf(strMediumID);
- AssertReturnVoid(iItemIndex != -1);
- loadedMediumIDs.append(mediumIDs.takeAt(iItemIndex));
+ foreach (const QString &strMediumID, mediumIDs)
sltHandleMediumCreated(strMediumID);
- }
/* Select the first item to be the current one
* if the previous saved item was not selected yet. */
@@ -461,8 +410,41 @@ void UIMediumManager::sltHandleMediumEnumerationStart()
void UIMediumManager::sltHandleMediumEnumerated(const QString &strMediumID)
{
- /* Handle medium-update: */
- sltHandleMediumUpdated(strMediumID);
+ /* Search for corresponding medium: */
+ UIMedium medium = vboxGlobal().medium(strMediumID);
+
+ /* Ignore non-interesting mediums: */
+ if ((medium.isNull()) || (medium.isHostDrive()))
+ return;
+
+ /* Ignore mediums (and their children) which are
+ * marked as hidden or attached to hidden machines only: */
+ if (isMediumAttachedToHiddenMachinesOnly(medium))
+ return;
+
+ /* Search for corresponding medium-item: */
+ UIMediumItem *pMediumItem = 0;
+ switch (medium.type())
+ {
+ case UIMediumType_HardDisk: pMediumItem = searchItem(mTwHD, CheckIfSuitableByID(medium.id())); break;
+ case UIMediumType_DVD: pMediumItem = searchItem(mTwCD, CheckIfSuitableByID(medium.id())); break;
+ case UIMediumType_Floppy: pMediumItem = searchItem(mTwFD, CheckIfSuitableByID(medium.id())); break;
+ default: AssertFailed();
+ }
+
+ /* If medium-item was not found it's time to create it: */
+ if (!pMediumItem)
+ return sltHandleMediumCreated(strMediumID);
+
+ /* Update medium-item: */
+ pMediumItem->setMedium(medium);
+
+ /* Update tab-icons: */
+ updateTabIcons(pMediumItem, ItemAction_Updated);
+
+ /* Update stuff if that was current-item updated: */
+ if (pMediumItem == currentTreeWidget()->currentItem())
+ sltHandleCurrentItemChanged(pMediumItem);
/* Advance progress-bar: */
m_pProgressBar->setValue(m_pProgressBar->value() + 1);
@@ -527,7 +509,7 @@ void UIMediumManager::sltRemoveMedium()
/* Remember ID/type as they may get lost after the closure/deletion: */
QString strMediumID = pMediumItem->id();
AssertReturnVoid(!strMediumID.isNull());
- UIMediumType type = pMediumItem->type();
+ UIMediumType type = pMediumItem->mediumType();
/* Confirm medium removal: */
if (!msgCenter().confirmMediumRemoval(pMediumItem->medium(), this))
@@ -654,9 +636,6 @@ void UIMediumManager::sltReleaseMedium()
foreach (const QString &strMachineId, machineIds)
if (!releaseMediumFrom(pMediumItem->medium(), strMachineId))
break;
-
- /* Inform others about medium changes: */
- vboxGlobal().updateMedium(pMediumItem->medium());
}
void UIMediumManager::sltHandleCurrentTabChanged()
@@ -763,26 +742,6 @@ void UIMediumManager::sltHandleContextMenuCall(const QPoint &position)
}
}
-void UIMediumManager::sltHandleMachineStateChanged(QString, KMachineState state)
-{
- switch (state)
- {
- case KMachineState_PoweredOff:
- case KMachineState_Aborted:
- case KMachineState_Saved:
- case KMachineState_Teleported:
- case KMachineState_Starting:
- case KMachineState_Restoring:
- case KMachineState_TeleportingIn:
- {
- refreshAll();
- break;
- }
- default:
- break;
- }
-}
-
void UIMediumManager::sltMakeRequestForTableAdjustment()
{
/* We have to perform tables adjustment only after all the [auto]resize
@@ -881,8 +840,6 @@ void UIMediumManager::prepareThis()
/* Configure medium-processing connections: */
connect(&vboxGlobal(), SIGNAL(sigMediumCreated(const QString&)),
this, SLOT(sltHandleMediumCreated(const QString&)));
- connect(&vboxGlobal(), SIGNAL(sigMediumUpdated(const QString&)),
- this, SLOT(sltHandleMediumUpdated(const QString&)));
connect(&vboxGlobal(), SIGNAL(sigMediumDeleted(const QString&)),
this, SLOT(sltHandleMediumDeleted(const QString&)));
@@ -1170,24 +1127,12 @@ void UIMediumManager::populateTreeWidgets()
{
/* Emulate (possible partial) medium-enumeration: */
QList<QString> mediumIDs = vboxGlobal().mediumIDs();
- QList<QString> loadedMediumIDs;
prepareToRefresh(mediumIDs.size());
- while (!mediumIDs.isEmpty())
+ foreach (const QString &strMediumID, mediumIDs)
{
- /* Get first available medium: */
- QString strMediumID = mediumIDs.first();
- UIMedium medium = vboxGlobal().medium(strMediumID);
- /* Make sure medium parent (if any) is already in list: */
- while (medium.parentID() != UIMedium::nullID() &&
- !loadedMediumIDs.contains(medium.parentID()))
- {
- medium = medium.parent();
- strMediumID = medium.id();
- }
- /* Insert resulting medium into tree: */
- int iItemIndex = mediumIDs.indexOf(strMediumID);
- AssertReturnVoid(iItemIndex != -1);
- loadedMediumIDs.append(mediumIDs.takeAt(iItemIndex));
+ /* Get corresponding medium: */
+ const UIMedium medium = vboxGlobal().medium(strMediumID);
+ /* Create corresponding medium-item: */
sltHandleMediumCreated(strMediumID);
/* Advance progress-bar only for created mediums: */
if (medium.state() != KMediumState_NotCreated)
@@ -1497,26 +1442,38 @@ void UIMediumManager::setCurrentItem(QTreeWidget *pTree, QTreeWidgetItem *pItem)
UIMediumItem* UIMediumManager::toMediumItem(QTreeWidgetItem *pItem) const
{
/* Return UIMediumItem based on QTreeWidgetItem if it is valid: */
- if (pItem && pItem->type() == UIMediumItem::MediaItemType)
+ if (pItem && pItem->type() == UIMediumItem::Type)
return static_cast<UIMediumItem*>(pItem);
/* Null by default: */
return 0;
}
-UIMediumItem* UIMediumManager::searchItem(QTreeWidget *pTree, const QString &strId) const
+UIMediumItem* UIMediumManager::searchItem(QTreeWidget *pTree, const CheckIfSuitableBy &functor) const
{
- /* Make sure passed ID is valid: */
- if (strId.isNull())
+ /* Make sure argument is valid: */
+ if (!pTree)
return 0;
- /* Iterate other all the mediums of passed tree: */
- UIMediumItemIterator iterator(pTree);
- while (*iterator)
- {
- if ((*iterator)->id() == strId)
- return *iterator;
- ++iterator;
- }
+ /* Return wrapper: */
+ return searchItem(pTree->invisibleRootItem(), functor);
+}
+
+UIMediumItem* UIMediumManager::searchItem(QTreeWidgetItem *pParentItem, const CheckIfSuitableBy &functor) const
+{
+ /* Make sure argument is valid: */
+ if (!pParentItem)
+ return 0;
+
+ /* Verify passed item if it is of 'medium' type too: */
+ if (UIMediumItem *pMediumParentItem = toMediumItem(pParentItem))
+ if (functor.isItSuitable(pMediumParentItem))
+ return pMediumParentItem;
+
+ /* Iterate other all the children: */
+ for (int iChildIndex = 0; iChildIndex < pParentItem->childCount(); ++iChildIndex)
+ if (UIMediumItem *pMediumChildItem = toMediumItem(pParentItem->child(iChildIndex)))
+ if (UIMediumItem *pRequiredMediumChildItem = searchItem(pMediumChildItem, functor))
+ return pRequiredMediumChildItem;
/* Null by default: */
return 0;
@@ -1527,19 +1484,38 @@ UIMediumItem* UIMediumManager::createHardDiskItem(QTreeWidget *pTree, const UIMe
/* Make sure passed medium is valid: */
AssertReturn(!medium.medium().isNull(), 0);
- /* Prepare medium-item: */
- UIMediumItem *pMediumItem = 0;
- CMedium parent = medium.medium().GetParent();
+ /* Search for medium-item: */
+ UIMediumItem *pMediumItem = searchItem(pTree, CheckIfSuitableByID(medium.id()));
- /* First try to create item under corresponding parent: */
- if (!parent.isNull())
- if (UIMediumItem *pRoot = searchItem(pTree, parent.GetId()))
- pMediumItem = new UIMediumItem(medium, pRoot);
- /* Else just create item as top-level one: */
+ /* If medium-item do not exists: */
if (!pMediumItem)
- pMediumItem = new UIMediumItem(medium, pTree);
+ {
+ /* If medium have a parent: */
+ if (medium.parentID() != UIMedium::nullID())
+ {
+ /* Try to find parent medium-item: */
+ UIMediumItem *pParentMediumItem = searchItem(pTree, CheckIfSuitableByID(medium.parentID()));
+ /* If parent medium-item was not found: */
+ if (!pParentMediumItem)
+ {
+ /* Make sure such corresponding parent medium is already cached! */
+ UIMedium parentMedium = vboxGlobal().medium(medium.parentID());
+ if (parentMedium.isNull())
+ AssertMsgFailed(("Parent medium with ID={%s} was not found!\n", medium.parentID().toAscii().constData()));
+ /* Try to create parent medium-item: */
+ else
+ pParentMediumItem = createHardDiskItem(pTree, parentMedium);
+ }
+ /* If parent medium-item was found: */
+ if (pParentMediumItem)
+ pMediumItem = new UIMediumItem(medium, pParentMediumItem);
+ }
+ /* Else just create item as top-level one: */
+ if (!pMediumItem)
+ pMediumItem = new UIMediumItem(medium, pTree);
+ }
- /* Return created item: */
+ /* Return medium-item: */
return pMediumItem;
}
@@ -1552,7 +1528,7 @@ void UIMediumManager::updateTabIcons(UIMediumItem *pMediumItem, ItemAction actio
int iTab = -1;
const QIcon *pIcon = 0;
bool *pfInaccessible = 0;
- switch (pMediumItem->type())
+ switch (pMediumItem->mediumType())
{
case UIMediumType_HardDisk:
iTab = HDTab;
@@ -1611,20 +1587,10 @@ void UIMediumManager::updateTabIcons(UIMediumItem *pMediumItem, ItemAction actio
if (fCheckRest)
{
- *pfInaccessible = false;
-
- QTreeWidget *pTree = pMediumItem->treeWidget();
-
- /* Find the first pfInaccessible item to be in charge: */
- UIMediumItemIterator it(pTree);
- for (; *it; ++ it)
- {
- if (*it != pMediumItem && (*it)->state() == KMediumState_Inaccessible)
- {
- *pfInaccessible = true;
- break;
- }
- }
+ /* Find the first KMediumState_Inaccessible item to be in charge: */
+ UIMediumItem *pInaccessibleMediumItem =
+ searchItem(pMediumItem->treeWidget(), CheckIfSuitableByState(KMediumState_Inaccessible));
+ *pfInaccessible = !!pInaccessibleMediumItem;
}
if (*pfInaccessible)
diff --git a/src/VBox/Frontends/VirtualBox/src/medium/UIMediumManager.h b/src/VBox/Frontends/VirtualBox/src/medium/UIMediumManager.h
index 7514c3e..ac25fa2 100644
--- a/src/VBox/Frontends/VirtualBox/src/medium/UIMediumManager.h
+++ b/src/VBox/Frontends/VirtualBox/src/medium/UIMediumManager.h
@@ -36,6 +36,14 @@ class UIMediumItem;
class UIEnumerationProgressBar;
class UIMedium;
+/** Functor interface allowing to check if passed UIMediumItem is suitable. */
+class CheckIfSuitableBy
+{
+public:
+ /** Determines whether passed UIMediumItem is suitable. */
+ virtual bool isItSuitable(UIMediumItem *pItem) const = 0;
+};
+
/* Medium Manager Dialog: */
class UIMediumManager : public QIWithRetranslateUI2<QIMainDialog>, public Ui::UIMediumManager
{
@@ -65,7 +73,6 @@ private slots:
/* Handlers: Medium-processing stuff: */
void sltHandleMediumCreated(const QString &strMediumID);
- void sltHandleMediumUpdated(const QString &strMediumID);
void sltHandleMediumDeleted(const QString &strMediumID);
/* Handlers: Medium-enumeration stuff: */
@@ -85,9 +92,6 @@ private slots:
void sltHandleDoubleClick();
void sltHandleContextMenuCall(const QPoint &position);
- /* Handler: Machine stuff: */
- void sltHandleMachineStateChanged(QString strId, KMachineState state);
-
/* Handlers: Geometry stuff: */
void sltMakeRequestForTableAdjustment();
void sltPerformTablesAdjustment();
@@ -137,7 +141,8 @@ private:
QTreeWidget* currentTreeWidget() const;
void setCurrentItem(QTreeWidget *pTree, QTreeWidgetItem *pItem);
UIMediumItem* toMediumItem(QTreeWidgetItem *pItem) const;
- UIMediumItem* searchItem(QTreeWidget *pTree, const QString &strId) const;
+ UIMediumItem* searchItem(QTreeWidget *pTree, const CheckIfSuitableBy &functor) const;
+ UIMediumItem* searchItem(QTreeWidgetItem *pParentItem, const CheckIfSuitableBy &functor) const;
UIMediumItem* createHardDiskItem(QTreeWidget *pTree, const UIMedium &medium) const;
/* Internal API: Tab-widget access stuff: */
diff --git a/src/VBox/Frontends/VirtualBox/src/platform/darwin/DarwinKeyboard.cpp b/src/VBox/Frontends/VirtualBox/src/platform/darwin/DarwinKeyboard.cpp
index f1e531f..ba26fe3 100644
--- a/src/VBox/Frontends/VirtualBox/src/platform/darwin/DarwinKeyboard.cpp
+++ b/src/VBox/Frontends/VirtualBox/src/platform/darwin/DarwinKeyboard.cpp
@@ -23,7 +23,6 @@
#define LOG_GROUP LOG_GROUP_GUI
#define VBOX_WITH_KBD_LEDS_SYNC
-//#define VBOX_WITH_KBD_SCROLL_LED_SYNC
//#define VBOX_WITHOUT_KBD_LEDS_SYNC_FILTERING
#include "DarwinKeyboard.h"
@@ -39,17 +38,22 @@
#ifdef VBOX_WITH_KBD_LEDS_SYNC
# include <iprt/err.h>
# include <iprt/semaphore.h>
+# include <VBox/sup.h>
+# include <IOKit/IOMessage.h>
+# include <IOKit/usb/IOUSBLib.h>
+# include <IOKit/IOMessage.h>
#endif
#ifdef USE_HID_FOR_MODIFIERS
# include <mach/mach.h>
# include <mach/mach_error.h>
-# include <IOKit/IOKitLib.h>
-# include <IOKit/IOCFPlugIn.h>
# include <IOKit/hid/IOHIDUsageTables.h>
# include <CoreFoundation/CoreFoundation.h>
#endif
-# include <IOKit/usb/USB.h>
+
+#include <IOKit/IOKitLib.h>
+#include <IOKit/IOCFPlugIn.h>
+#include <IOKit/usb/USB.h>
#include <IOKit/hid/IOHIDLib.h>
#include <ApplicationServices/ApplicationServices.h>
#include <Carbon/Carbon.h>
@@ -314,6 +318,7 @@ typedef struct VBoxKbdState_t {
void *pParentContainer; /** A pointer to a VBoxHidsState_t instance where VBoxKbdState_t instance is stored */
CFIndex idxPosition; /** Position in global storage (used to simplify CFArray navigation when removing detached device) */
uint64_t cCapsLockTimeout; /** KBD CAPS LOCK key hold timeout (some Apple keyboards only) */
+ uint32_t idLocation; /** HID Location ID: unique for an USB device registered in the system */
} VBoxKbdState_t;
/* A struct that used to pass input event info from IOKit callback to a Carbon one */
@@ -321,7 +326,6 @@ typedef struct VBoxKbdEvent_t {
VBoxKbdState_t *pKbd;
uint32_t iKeyCode;
uint64_t tsKeyDown;
- uint64_t tsKeyUp;
} VBoxKbdEvent_t;
/* HID LEDs synchronization data: IOKit specific data. */
@@ -333,6 +337,12 @@ typedef struct VBoxHidsState_t {
CFMutableArrayRef pFifoEventQueue; /** This queue will be appended in IOKit input callback. Carbon input callback will extract data from it */
RTSEMMUTEX fifoEventQueueLock; /** Lock for pFifoEventQueue */
+ io_iterator_t pUsbHidDeviceMatchNotify; /** IOService notification reference: USB HID device matching */
+ io_iterator_t pUsbHidGeneralInterestNotify; /** IOService notification reference: USB HID general interest
+ notifications (IOService messages) */
+ IONotificationPortRef pNotificationPrortRef; /** IOService notification port reference: used for both notification
+ types - device match and device general interest message */
+
/* Carbon events data */
CFMachPortRef pTapRef;
CFRunLoopSourceRef pLoopSourceRef;
@@ -504,11 +514,11 @@ void DarwinDisableGlobalHotKeys(bool fDisable)
{
if (enmMode != kCGSGlobalHotKeyEnable)
return;
- enmMode = kCGSGlobalHotKeyDisable;
+ enmMode = kCGSGlobalHotKeyDisableExceptUniversalAccess;
}
else
{
- if (enmMode != kCGSGlobalHotKeyDisable)
+ if (enmMode != kCGSGlobalHotKeyDisableExceptUniversalAccess)
return;
enmMode = kCGSGlobalHotKeyEnable;
}
@@ -1270,6 +1280,11 @@ static int darwinLedElementSetValue(IOHIDDeviceRef hidDevice, IOHIDElementRef el
IOHIDValueRef valueRef;
IOReturn rc = kIOReturnError;
+ /* Try to resume suspended keyboard devices. Abort if failed in order to avoid GUI freezes. */
+ int rc1 = SUPR3ResumeSuspendedKeyboards();
+ if (RT_FAILURE(rc1))
+ return rc1;
+
valueRef = IOHIDValueCreateWithIntegerValue(kCFAllocatorDefault, element, 0, (fEnabled) ? 1 : 0);
if (valueRef)
{
@@ -1292,6 +1307,11 @@ static int darwinLedElementGetValue(IOHIDDeviceRef hidDevice, IOHIDElementRef el
IOReturn rc;
CFIndex integerValue;
+ /* Try to resume suspended keyboard devices. Abort if failed in order to avoid GUI freezes. */
+ int rc1 = SUPR3ResumeSuspendedKeyboards();
+ if (RT_FAILURE(rc1))
+ return rc1;
+
rc = IOHIDDeviceGetValue(hidDevice, element, &valueRef);
if (rc == kIOReturnSuccess)
{
@@ -1342,11 +1362,9 @@ static int darwinSetDeviceLedsState(IOHIDDeviceRef hidDevice, CFDictionaryRef el
case kHIDUsage_LED_CapsLock:
rc = darwinLedElementSetValue(hidDevice, element, fCapsLockOn);
break;
-#ifdef VBOX_WITH_KBD_SCROLL_LED_SYNC
case kHIDUsage_LED_ScrollLock:
rc = darwinLedElementSetValue(hidDevice, element, fScrollLockOn);
break;
-#endif
}
if (rc != 0)
{
@@ -1389,11 +1407,9 @@ static int darwinGetDeviceLedsState(IOHIDDeviceRef hidDevice, CFDictionaryRef el
case kHIDUsage_LED_CapsLock:
rc = darwinLedElementGetValue(hidDevice, element, fCapsLockOn);
break;
-#ifdef VBOX_WITH_KBD_SCROLL_LED_SYNC
case kHIDUsage_LED_ScrollLock:
rc = darwinLedElementGetValue(hidDevice, element, fScrollLockOn);
break;
-#endif
}
if (rc != 0)
{
@@ -1442,6 +1458,12 @@ static uint32_t darwinHidProductId(IOHIDDeviceRef pHidDeviceRef)
return darwinQueryIntProperty(pHidDeviceRef, CFSTR(kIOHIDProductIDKey));
}
+/** Get HID Location ID */
+static uint32_t darwinHidLocationId(IOHIDDeviceRef pHidDeviceRef)
+{
+ return darwinQueryIntProperty(pHidDeviceRef, CFSTR(kIOHIDLocationIDKey));
+}
+
/** Some keyboard devices might freeze after LEDs manipulation. We filter out such devices here.
* In the list below, devices that known to have such issues. If you want to add new device,
* then add it here. Currently, we only filter devices by Vendor ID.
@@ -1458,9 +1480,9 @@ static bool darwinHidDeviceSupported(IOHIDDeviceRef pHidDeviceRef)
if (productId == 0x8001) /* GK-04008/C keyboard */
fSupported = false;
}
- else if (vendorId == 0x05AC) /* Apple */
+ if (vendorId == 0xE6A) /* Megawin Technology */
{
- if (productId == 0x0263) /* Apple Internal Keyboard */
+ if (productId == 0x6001) /* Japanese flexible keyboard */
fSupported = false;
}
@@ -1472,6 +1494,116 @@ static bool darwinHidDeviceSupported(IOHIDDeviceRef pHidDeviceRef)
#endif
}
+/** IOKit key press callback helper: take care about key-down event.
+ * This code should be executed within a critical section under pHidState->fifoEventQueueLock. */
+static void darwinHidInputCbKeyDown(VBoxKbdState_t *pKbd, uint32_t iKeyCode, VBoxHidsState_t *pHidState)
+{
+ VBoxKbdEvent_t *pEvent = (VBoxKbdEvent_t *)malloc(sizeof(VBoxKbdEvent_t));
+
+ if (pEvent)
+ {
+ /* Queue Key-Down event. */
+ pEvent->tsKeyDown = RTTimeSystemMilliTS();
+ pEvent->pKbd = pKbd;
+ pEvent->iKeyCode = iKeyCode;
+
+ CFArrayAppendValue(pHidState->pFifoEventQueue, (void *)pEvent);
+
+ LogRel2(("IOHID: KBD %d: Modifier Key-Down event\n", (int)pKbd->idxPosition));
+ }
+ else
+ LogRel2(("IOHID: Modifier Key-Up event. Unable to find memory for KBD %d event\n", (int)pKbd->idxPosition));
+}
+
+/** IOkit and Carbon key press callbacks helper: CapsLock timeout checker.
+ *
+ * Returns FALSE if CAPS LOCK timeout not occurred and its state still was not switched (Apple kbd).
+ * Returns TRUE if CAPS LOCK timeout occurred and its state was switched (Apple kbd).
+ * Returns TRUE for non-Apple kbd. */
+static bool darwinKbdCapsEventMatches(VBoxKbdEvent_t *pEvent, bool fCapsLed)
+{
+ /* CapsLock timeout is only applicable if conditions
+ * below are satisfied:
+ *
+ * a) Key pressed on Apple keyboard
+ * b) CapsLed is OFF at the moment when CapsLock key is pressed
+ */
+
+ bool fAppleKeyboard = (pEvent->pKbd->cCapsLockTimeout > 0);
+
+ /* Apple keyboard */
+ if (fAppleKeyboard && !fCapsLed)
+ {
+ uint64_t tsDiff = RTTimeSystemMilliTS() - pEvent->tsKeyDown;
+ if (tsDiff < pEvent->pKbd->cCapsLockTimeout)
+ return false;
+ }
+
+ return true;
+}
+
+/** IOKit key press callback helper: take care about key-up event.
+ * This code should be executed within a critical section under pHidState->fifoEventQueueLock. */
+static void darwinHidInputCbKeyUp(VBoxKbdState_t *pKbd, uint32_t iKeyCode, VBoxHidsState_t *pHidState)
+{
+ CFIndex iQueue = 0;
+ VBoxKbdEvent_t *pEvent = NULL;
+
+ /* Key-up event assumes that key-down event occured previously. If so, an event
+ * data should be in event queue. Attempt to find it. */
+ for (CFIndex i = 0; i < CFArrayGetCount(pHidState->pFifoEventQueue); i++)
+ {
+ VBoxKbdEvent_t *pCachedEvent = (VBoxKbdEvent_t *)CFArrayGetValueAtIndex(pHidState->pFifoEventQueue, i);
+
+ if (pCachedEvent && pCachedEvent->pKbd == pKbd && pCachedEvent->iKeyCode == iKeyCode)
+ {
+ pEvent = pCachedEvent;
+ iQueue = i;
+ break;
+ }
+ }
+
+ /* Event found. */
+ if (pEvent)
+ {
+ /* NUM LOCK should not have timeout and its press should immidiately trigger Carbon callback.
+ * Therefore, if it is still in queue this is a problem because it was not handled by Carbon callback.
+ * This mean that NUM LOCK is most likely out of sync. */
+ if (iKeyCode == kHIDUsage_KeypadNumLock)
+ {
+ LogRel2(("IOHID: KBD %d: Modifier Key-Up event. Key-Down event was not habdled by Carbon callback. "
+ "NUM LOCK is most likely out of sync\n", (int)pKbd->idxPosition));
+ }
+ else if (iKeyCode == kHIDUsage_KeyboardCapsLock)
+ {
+ /* If CAPS LOCK key-press event still not match CAPS LOCK timeout criteria, Carbon callback
+ * should not be triggered for this event at all. Threfore, event should be removed from queue. */
+ if (!darwinKbdCapsEventMatches(pEvent, pHidState->guestState.fCapsLockOn))
+ {
+ free(pEvent);
+ CFArrayRemoveValueAtIndex(pHidState->pFifoEventQueue, iQueue);
+
+ LogRel2(("IOHID: KBD %d: Modifier Key-Up event on Apple keyboard. Key-Down event was triggered %llu ms "
+ "ago. Carbon event should not be triggered, removed from queue\n", (int)pKbd->idxPosition,
+ RTTimeSystemMilliTS() - pEvent->tsKeyDown));
+ }
+ else
+ {
+ /* CAPS LOCK key-press event matches to CAPS LOCK timeout criteria and still present in queue.
+ * This might mean that Carbon callback was triggered for this event, but cached keyboard state was not updated.
+ * It also might mean that Carbon callback still was not triggered, but it will be soon.
+ * Threfore, CAPS LOCK might be out of sync. */
+ LogRel2(("IOHID: KBD %d: Modifier Key-Up event. Key-Down event was triggered %llu ms "
+ "ago and still was not handled by Carbon callback. CAPS LOCK might out of sync if "
+ "Carbon will not handle this\n", (int)pKbd->idxPosition, RTTimeSystemMilliTS() - pEvent->tsKeyDown));
+ }
+ }
+ }
+ else
+ LogRel2(("IOHID: KBD %d: Modifier Key-Up event. Modifier state change was "
+ "successfully handled by Carbon callback\n", (int)pKbd->idxPosition));
+}
+
/** IOKit key press callback. Triggered before Carbon callback. We remember which keyboard produced a keypress here. */
static void darwinHidInputCallback(void *pData, IOReturn unused, void *unused1, IOHIDValueRef pValueRef)
{
@@ -1493,75 +1625,19 @@ static void darwinHidInputCallback(void *pData, IOReturn unused, void *unused1,
if (pKbd && pKbd->pParentContainer)
{
- bool fKeyDown = (IOHIDValueGetIntegerValue(pValueRef) == 1);
-
+ bool fKeyDown = (IOHIDValueGetIntegerValue(pValueRef) == 1);
VBoxHidsState_t *pHidState = (VBoxHidsState_t *)pKbd->pParentContainer;
- VBoxKbdEvent_t *pEvent = NULL;;
- CFIndex iQueue = 0;
AssertReturnVoid(pHidState);
if (RT_FAILURE(RTSemMutexRequest(pHidState->fifoEventQueueLock, RT_INDEFINITE_WAIT)))
return ;
- /* Allocate new event data on Key-Down, find a cached one on Key-Up */
+ /* Handle corresponding event. */
if (fKeyDown)
- pEvent = (VBoxKbdEvent_t *)malloc(sizeof(VBoxKbdEvent_t));
+ darwinHidInputCbKeyDown(pKbd, usage, pHidState);
else
- {
- for (CFIndex i = 0; i < CFArrayGetCount(pHidState->pFifoEventQueue); i++)
- {
- VBoxKbdEvent_t *pCachedEvent = (VBoxKbdEvent_t *)CFArrayGetValueAtIndex(pHidState->pFifoEventQueue, i);
- if (pCachedEvent && pCachedEvent->pKbd == pKbd && pCachedEvent->iKeyCode == usage)
- {
- pEvent = pCachedEvent;
- iQueue = i;
- break;
- }
- }
- }
-
- if (pEvent)
- {
- if (usage == kHIDUsage_KeyboardCapsLock && pKbd->cCapsLockTimeout)
- {
- if (fKeyDown)
- pEvent->tsKeyDown = RTTimeSystemMilliTS();
- else
- pEvent->tsKeyUp = RTTimeSystemMilliTS();
- }
-
- if (fKeyDown)
- {
- LogRel2(("IOHID: KBD %d: Modifier Key-Down\n", (int)pKbd->idxPosition));
-
- pEvent->pKbd = pKbd;
- pEvent->iKeyCode = usage;
- pEvent->tsKeyUp = 0;
-
- /* Append FIFO event queue */
- CFArrayAppendValue(pHidState->pFifoEventQueue, (void *)pEvent);
- }
- else
- {
- uint64_t tsDiff = pEvent->tsKeyUp - pEvent->tsKeyDown;
- if (tsDiff < pKbd->cCapsLockTimeout)
- {
- free(pEvent);
- CFArrayRemoveValueAtIndex(pHidState->pFifoEventQueue, iQueue);
- LogRel2(("IOHID: KBD %d: Modifier Key-Up (Key-Down %llu ms ago). Apple keyboard, removed from queue\n", (int)pKbd->idxPosition, tsDiff));
- }
- else
- LogRel2(("IOHID: KBD %d: Modifier Key-Up (Key-Down %llu ms ago)\n", (int)pKbd->idxPosition, tsDiff));
- }
- }
- else
- {
- if (fKeyDown)
- LogRel2(("IOHID: unable to find memory to queue KBD %d event\n", (int)pKbd->idxPosition));
- else
- LogRel2(("IOHID: unable to find KBD %d event in queue\n", (int)pKbd->idxPosition));
- }
+ darwinHidInputCbKeyUp(pKbd, usage, pHidState);
RTSemMutexRelease(pHidState->fifoEventQueueLock);
}
@@ -1570,8 +1646,44 @@ static void darwinHidInputCallback(void *pData, IOReturn unused, void *unused1,
}
}
-/** Carbon key press callback. Triggered after IOKit callback. We update keyboard (catched in darwinHidInputCallback()) internal state here. */
-static CGEventRef darwinCarbonGlobalKeyPressCallback(CGEventTapProxy unused, CGEventType unused1, CGEventRef pEventRef, void *pData)
+/** Carbon key press callback helper: find last occured KBD event in queue
+ * (ignoring those events which do not match CAPS LOCK timeout criteria).
+ * Once event found, it is removed from queue. This code should be executed
+ * within a critical section under pHidState->fifoEventQueueLock. */
+static VBoxKbdEvent_t *darwinCarbonCbFindEvent(VBoxHidsState_t *pHidState)
+{
+ VBoxKbdEvent_t *pEvent = NULL;
+
+ for (CFIndex i = 0; i < CFArrayGetCount(pHidState->pFifoEventQueue); i++)
+ {
+ pEvent = (VBoxKbdEvent_t *)CFArrayGetValueAtIndex(pHidState->pFifoEventQueue, i);
+
+ /* Paranoia: skip potentially dangerous data items. */
+ if (!pEvent || !pEvent->pKbd) continue;
+
+ if ( pEvent->iKeyCode == kHIDUsage_KeypadNumLock
+ || (pEvent->iKeyCode == kHIDUsage_KeyboardCapsLock && darwinKbdCapsEventMatches(pEvent, pHidState->guestState.fCapsLockOn)))
+ {
+ /* Found one. Remove it from queue. */
+ CFArrayRemoveValueAtIndex(pHidState->pFifoEventQueue, i);
+
+ LogRel2(("CARBON: Found event in queue: %d (KBD %d, tsKeyDown=%llu, pressed %llu ms ago)\n", (int)i,
+ (int)pEvent->pKbd->idxPosition, pEvent->tsKeyDown, RTTimeSystemMilliTS() - pEvent->tsKeyDown));
+
+ break;
+ }
+ else
+ LogRel2(("CARBON: Skip keyboard event from KBD %d, key pressed %llu ms ago\n",
+ (int)pEvent->pKbd->idxPosition, RTTimeSystemMilliTS() - pEvent->tsKeyDown));
+
+ pEvent = NULL;
+ }
+
+ return pEvent;
+}
+
+/** Carbon key press callback. Triggered after IOKit callback. */
+static CGEventRef darwinCarbonCallback(CGEventTapProxy unused, CGEventType unused1, CGEventRef pEventRef, void *pData)
{
(void)unused;
(void)unused1;
@@ -1590,38 +1702,15 @@ static CGEventRef darwinCarbonGlobalKeyPressCallback(CGEventTapProxy unused, CGE
if (key == kHIDUsage_KeyboardCapsLock ||
key == kHIDUsage_KeypadNumLock)
{
- /* Extract last touched state from FIFO event queue */
- VBoxKbdEvent_t *pEvent = NULL;
- CFIndex iEvent = 0;
-
- /* Find last occured KBD event in queue (ignoring those events which not match CAPS LOCK timeout criteria). */
- for (CFIndex i = 0; i < CFArrayGetCount(pHidState->pFifoEventQueue); i++)
- {
- pEvent = (VBoxKbdEvent_t *)CFArrayGetValueAtIndex(pHidState->pFifoEventQueue, i);
- if (!pEvent) continue;
- if (!pEvent->pKbd) continue;
-
- if (pEvent->iKeyCode == kHIDUsage_KeypadNumLock
- || pEvent->iKeyCode == kHIDUsage_KeyboardCapsLock)
- {
- /* Found one. Keep its index in queue in order to remove it later. */
- iEvent = i;
- LogRel2(("CARBON: Found event in queue: %d (KBD %d, tsKeyDown=%llu, pressed %llu ms ago)\n", (int)i, (int)pEvent->pKbd->idxPosition, pEvent->tsKeyDown, RTTimeSystemMilliTS() - pEvent->tsKeyDown));
- break;
- }
- else
- LogRel2(("CARBON: skip CAPS LOCK event %d (KBD %d) (tsKeyDown=%llu, pressed %llu ms ago)\n", (int)i, (int)pEvent->pKbd->idxPosition, pEvent->tsKeyDown, RTTimeSystemMilliTS() - pEvent->tsKeyDown));
-
- pEvent = NULL;
- }
-
+ /* Attempt to find an event queued by IOKit callback. */
+ VBoxKbdEvent_t *pEvent = darwinCarbonCbFindEvent(pHidState);
if (pEvent)
{
VBoxKbdState_t *pKbd = pEvent->pKbd;
LogRel2(("CARBON: KBD %d: caps=%s, num=%s. tsKeyDown=%llu, tsKeyUp=%llu [tsDiff=%llu ms]. %d events in queue.\n",
(int)pKbd->idxPosition, VBOX_BOOL_TO_STR_STATE(fCaps), VBOX_BOOL_TO_STR_STATE(fNum),
- pEvent->tsKeyDown, pEvent->tsKeyUp, pEvent->tsKeyUp - pEvent->tsKeyDown,
+ pEvent->tsKeyDown, RTTimeSystemMilliTS(), RTTimeSystemMilliTS() - pEvent->tsKeyDown,
CFArrayGetCount(pHidState->pFifoEventQueue)));
pKbd->LED.fCapsLockOn = fCaps;
@@ -1633,19 +1722,21 @@ static CGEventRef darwinCarbonGlobalKeyPressCallback(CGEventTapProxy unused, CGE
CFDictionaryRef elementMatchingDict = darwinQueryLedElementMatchingDictionary();
if (elementMatchingDict)
{
- (void)darwinSetDeviceLedsState(pKbd->pDevice, elementMatchingDict, pHidState->guestState.fNumLockOn,
- pHidState->guestState.fCapsLockOn, pHidState->guestState.fScrollLockOn);
+ (void)darwinSetDeviceLedsState(pKbd->pDevice,
+ elementMatchingDict,
+ pHidState->guestState.fNumLockOn,
+ pHidState->guestState.fCapsLockOn,
+ pHidState->guestState.fScrollLockOn);
CFRelease(elementMatchingDict);
}
}
- /* Forget event */
- CFArrayRemoveValueAtIndex(pHidState->pFifoEventQueue, iEvent);
free(pEvent);
}
else
- LogRel2(("CARBON: No KBD to take care when modifier key has been pressed: caps=%s, num=%s\n", VBOX_BOOL_TO_STR_STATE(fCaps), VBOX_BOOL_TO_STR_STATE(fNum)));
+ LogRel2(("CARBON: No KBD to take care when modifier key has been pressed: caps=%s, num=%s (%d events in queue)\n",
+ VBOX_BOOL_TO_STR_STATE(fCaps), VBOX_BOOL_TO_STR_STATE(fNum), CFArrayGetCount(pHidState->pFifoEventQueue)));
}
RTSemMutexRelease(pHidState->fifoEventQueueLock);
@@ -1653,6 +1744,220 @@ static CGEventRef darwinCarbonGlobalKeyPressCallback(CGEventTapProxy unused, CGE
return pEventRef;
}
+/** Helper function to obtain interface for IOUSBInterface IOService. */
+static IOUSBDeviceInterface ** darwinQueryUsbHidInterfaceInterface(io_service_t service)
+{
+ kern_return_t rc;
+ IOCFPlugInInterface **ppPluginInterface = NULL;
+ SInt32 iScore;
+
+ rc = IOCreatePlugInInterfaceForService(service, kIOUSBInterfaceUserClientTypeID,
+ kIOCFPlugInInterfaceID, &ppPluginInterface, &iScore);
+
+ if (rc == kIOReturnSuccess && ppPluginInterface != NULL)
+ {
+ IOUSBDeviceInterface **ppUsbDeviceInterface = NULL;
+
+ rc = (*ppPluginInterface)->QueryInterface(ppPluginInterface, CFUUIDGetUUIDBytes(kIOUSBInterfaceInterfaceID),
+ (LPVOID *)&ppUsbDeviceInterface);
+ IODestroyPlugInInterface(ppPluginInterface);
+
+ if (rc == kIOReturnSuccess && ppUsbDeviceInterface != NULL)
+ return ppUsbDeviceInterface;
+ else
+ LogRel2(("Failed to query plugin interface for USB device\n"));
+
+ }
+ else
+ LogRel2(("Failed to create plugin interface for USB device\n"));
+
+ return NULL;
+}
+
+/** Helper function for IOUSBInterface IOService general interest notification callback: resync LEDs. */
+static void darwinUsbHidResyncLeds(VBoxKbdState_t *pKbd)
+{
+ AssertReturnVoid(pKbd);
+
+ VBoxHidsState_t *pHidState = (VBoxHidsState_t *)pKbd->pParentContainer;
+ CFDictionaryRef elementMatchingDict = darwinQueryLedElementMatchingDictionary();
+ if (elementMatchingDict)
+ {
+ LogRel2(("Do HID device resync at location 0x%X \n", pKbd->idLocation));
+ (void)darwinSetDeviceLedsState(pKbd->pDevice, elementMatchingDict,
+ pHidState->guestState.fNumLockOn, pHidState->guestState.fCapsLockOn, pHidState->guestState.fScrollLockOn);
+ CFRelease(elementMatchingDict);
+ }
+}
+
+/** IOUSBInterface IOService general interest notification callback. When we receive it, we do
+ * silently resync kbd which has just changed its state. */
+static void darwinUsbHidGeneralInterestCb(void *pData, io_service_t unused1, natural_t msg, void *unused2)
+{
+ NOREF(unused1);
+ NOREF(unused2);
+
+ AssertReturnVoid(pData);
+ VBoxKbdState_t *pKbd = (VBoxKbdState_t *)pData;
+
+ switch (msg)
+ {
+ case kIOUSBMessagePortHasBeenSuspended:
+ {
+ LogRel2(("IOUSBInterface IOService general interest notification kIOUSBMessagePortHasBeenSuspended for KBD %d (Location ID: 0x%X)\n",
+ (int)(pKbd->idxPosition), pKbd->idLocation));
+ break;
+ }
+
+ case kIOUSBMessagePortHasBeenResumed:
+ {
+ LogRel2(("IOUSBInterface IOService general interest notification kIOUSBMessagePortHasBeenResumed for KBD %d (Location ID: 0x%X)\n",
+ (int)(pKbd->idxPosition), pKbd->idLocation));
+ break;
+ }
+
+ case kIOUSBMessagePortHasBeenReset:
+ {
+ LogRel2(("IOUSBInterface IOService general interest notification kIOUSBMessagePortHasBeenReset for KBD %d (Location ID: 0x%X)\n",
+ (int)(pKbd->idxPosition), pKbd->idLocation));
+ darwinUsbHidResyncLeds(pKbd);
+ break;
+ }
+
+ case kIOUSBMessageCompositeDriverReconfigured:
+ {
+ LogRel2(("IOUSBInterface IOService general interest notification kIOUSBMessageCompositeDriverReconfigured for KBD %d (Location ID: 0x%X)\n",
+ (int)(pKbd->idxPosition), pKbd->idLocation));
+ break;
+ }
+
+ case kIOMessageServiceWasClosed:
+ {
+ LogRel2(("IOUSBInterface IOService general interest notification kIOMessageServiceWasClosed for KBD %d (Location ID: 0x%X)\n",
+ (int)(pKbd->idxPosition), pKbd->idLocation));
+ break;
+ }
+
+ default:
+ LogRel2(("IOUSBInterface IOService general interest notification 0x%X for KBD %d (Location ID: 0x%X)\n",
+ msg, (int)(pKbd->idxPosition), pKbd->idLocation));
+ }
+}
+
+/** Get pre-cached KBD device by its Location ID. */
+static VBoxKbdState_t * darwinUsbHidQueryKbdByLocationId(uint32_t idLocation, VBoxHidsState_t *pHidState)
+{
+ AssertReturn(pHidState, NULL);
+
+ for (CFIndex i = 0; i < CFArrayGetCount(pHidState->pDeviceCollection); i++)
+ {
+ VBoxKbdState_t *pKbd = (VBoxKbdState_t *)CFArrayGetValueAtIndex(pHidState->pDeviceCollection, i);
+ if (pKbd && pKbd->idLocation == idLocation)
+ {
+ LogRel2(("Lookup USB HID Device by location ID 0x%X: found match\n", idLocation));
+ return pKbd;
+ }
+ }
+
+ LogRel2(("Lookup USB HID Device by location ID 0x%X: no matches found:\n", idLocation));
+
+ return NULL;
+}
+
+/** IOUSBInterface IOService match notification callback: issued when IOService instantinates.
+ * We subscribe to general interest notifications for available IOServices here. */
+static void darwinUsbHidDeviceMatchCb(void *pData, io_iterator_t iter)
+{
+ AssertReturnVoid(pData);
+
+ io_service_t service;
+ VBoxHidsState_t *pHidState = (VBoxHidsState_t *)pData;
+
+ while ((service = IOIteratorNext(iter)))
+ {
+ kern_return_t rc;
+
+ IOUSBDeviceInterface **ppUsbDeviceInterface = darwinQueryUsbHidInterfaceInterface(service);
+
+ if (ppUsbDeviceInterface)
+ {
+ uint8_t idDeviceClass, idDeviceSubClass;
+ UInt32 idLocation;
+
+ rc = (*ppUsbDeviceInterface)->GetLocationID (ppUsbDeviceInterface, &idLocation); AssertMsg(rc == 0, ("Failed to get Location ID"));
+ rc = (*ppUsbDeviceInterface)->GetDeviceClass (ppUsbDeviceInterface, &idDeviceClass); AssertMsg(rc == 0, ("Failed to get Device Class"));
+ rc = (*ppUsbDeviceInterface)->GetDeviceSubClass(ppUsbDeviceInterface, &idDeviceSubClass); AssertMsg(rc == 0, ("Failed to get Device Subclass"));
+
+ if (idDeviceClass == kUSBHIDInterfaceClass && idDeviceSubClass == kUSBHIDBootInterfaceSubClass)
+ {
+ VBoxKbdState_t *pKbd = darwinUsbHidQueryKbdByLocationId((uint32_t)idLocation, pHidState);
+
+ if (pKbd)
+ {
+ rc = IOServiceAddInterestNotification(pHidState->pNotificationPrortRef, service, kIOGeneralInterest,
+ darwinUsbHidGeneralInterestCb, pKbd, &pHidState->pUsbHidGeneralInterestNotify);
+
+ AssertMsg(rc == 0, ("Failed to add general interest notification"));
+
+ LogRel2(("Found HID device at location 0x%X: class 0x%X, subclass 0x%X\n", idLocation, idDeviceClass, idDeviceSubClass));
+ }
+ }
+
+ rc = (*ppUsbDeviceInterface)->Release(ppUsbDeviceInterface); AssertMsg(rc == 0, ("Failed to release USB device interface"));
+ }
+
+ IOObjectRelease(service);
+ }
+}
+
+/** Register IOUSBInterface IOService match notification callback in order to recync KBD
+ * device when it reports state change. */
+static int darwinUsbHidSubscribeInterestNotifications(VBoxHidsState_t *pHidState)
+{
+ AssertReturn(pHidState, kIOReturnBadArgument);
+
+ int rc = kIOReturnNoMemory;
+ CFDictionaryRef pDictionary = IOServiceMatching(kIOUSBInterfaceClassName);
+
+ if (pDictionary)
+ {
+ pHidState->pNotificationPrortRef = IONotificationPortCreate(kIOMasterPortDefault);
+ if (pHidState->pNotificationPrortRef)
+ {
+ CFRunLoopAddSource(CFRunLoopGetCurrent(), IONotificationPortGetRunLoopSource(pHidState->pNotificationPrortRef), kCFRunLoopDefaultMode);
+
+ rc = IOServiceAddMatchingNotification(pHidState->pNotificationPrortRef, kIOMatchedNotification,
+ pDictionary, darwinUsbHidDeviceMatchCb, pHidState, &pHidState->pUsbHidDeviceMatchNotify);
+
+ if (rc == kIOReturnSuccess && &pHidState->pUsbHidDeviceMatchNotify != NULL)
+ {
+ darwinUsbHidDeviceMatchCb(pHidState, pHidState->pUsbHidDeviceMatchNotify);
+ LogRel2(("Successfully subscribed to IOUSBInterface IOService match notifications\n"));
+ }
+ else
+ LogRel2(("Failed to subscribe to IOUSBInterface IOService match notifications: subscription error 0x%X\n", rc));
+ }
+ else
+ LogRel2(("Failed to subscribe to IOUSBInterface IOService match notifications: unable to create notification port\n"));
+ }
+ else
+ LogRel2(("Failed to subscribe to IOUSBInterface IOService match notifications: no memory\n"));
+
+ return rc;
+}
+
+/** Remove IOUSBInterface IOService match notification subscription. */
+static void darwinUsbHidUnsubscribeInterestNotifications(VBoxHidsState_t *pHidState)
+{
+ AssertReturnVoid(pHidState);
+
+ CFRunLoopRemoveSource(CFRunLoopGetCurrent(), IONotificationPortGetRunLoopSource(pHidState->pNotificationPrortRef), kCFRunLoopDefaultMode);
+ IONotificationPortDestroy(pHidState->pNotificationPrortRef);
+ pHidState->pNotificationPrortRef = NULL;
+
+ LogRel2(("Successfully un-subscribed from IOUSBInterface IOService match notifications\n"));
+}
+
/** This callback is called when user physically removes HID device. We remove device from cache here. */
static void darwinHidRemovalCallback(void *pData, IOReturn unused, void *unused1)
{
@@ -1707,6 +2012,7 @@ static void darwinHidAddDevice(VBoxHidsState_t *pHidState, IOHIDDeviceRef pDevic
pKbd->pDevice = pDevice;
pKbd->pParentContainer = (void *)pHidState;
pKbd->idxPosition = CFArrayGetCount(pHidState->pDeviceCollection);
+ pKbd->idLocation = darwinHidLocationId(pDevice);
/* Some Apple keyboards have CAPS LOCK key timeout. According to corresponding
* kext plist files, it is equals to 75 ms. For such devices we only add info into our FIFO event
@@ -1742,8 +2048,9 @@ static void darwinHidAddDevice(VBoxHidsState_t *pHidState, IOHIDDeviceRef pDevic
CFArrayAppendValue(pHidState->pDeviceCollection, (void *)pKbd);
LogRel2(("Saved LEDs for KBD %d (%p): fNumLockOn=%s, fCapsLockOn=%s, fScrollLockOn=%s\n",
- (int)pKbd->idxPosition, pKbd, VBOX_BOOL_TO_STR_STATE(pKbd->LED.fNumLockOn), VBOX_BOOL_TO_STR_STATE(pKbd->LED.fCapsLockOn),
- VBOX_BOOL_TO_STR_STATE(pKbd->LED.fScrollLockOn)));
+ (int)pKbd->idxPosition, pKbd, VBOX_BOOL_TO_STR_STATE(pKbd->LED.fNumLockOn), VBOX_BOOL_TO_STR_STATE(pKbd->LED.fCapsLockOn),
+ VBOX_BOOL_TO_STR_STATE(pKbd->LED.fScrollLockOn)));
+
if (fApplyLedState)
{
rc = darwinSetDeviceLedsState(pKbd->pDevice, elementMatchingDict, pHidState->guestState.fNumLockOn,
@@ -1778,7 +2085,7 @@ static void darwinHidMatchingCallback(void *pData, IOReturn unused, void *unused
}
/** Register Carbon key press callback. */
-static int darwinAddCarbonGlobalKeyPressHandler(VBoxHidsState_t *pHidState)
+static int darwinAddCarbonHandler(VBoxHidsState_t *pHidState)
{
CFMachPortRef pTapRef;
CGEventMask fMask = CGEventMaskBit(kCGEventFlagsChanged);
@@ -1798,7 +2105,7 @@ static int darwinAddCarbonGlobalKeyPressHandler(VBoxHidsState_t *pHidState)
return kIOReturnError;
}
- pTapRef = CGEventTapCreate(kCGSessionEventTap, kCGTailAppendEventTap, 0, fMask, darwinCarbonGlobalKeyPressCallback, (void *)pHidState);
+ pTapRef = CGEventTapCreate(kCGSessionEventTap, kCGTailAppendEventTap, 0, fMask, darwinCarbonCallback, (void *)pHidState);
if (pTapRef)
{
CFRunLoopSourceRef pLoopSourceRef;
@@ -1825,7 +2132,7 @@ static int darwinAddCarbonGlobalKeyPressHandler(VBoxHidsState_t *pHidState)
}
/** Remove Carbon key press callback. */
-static void darwinRemoveCarbonGlobalKeyPressHandler(VBoxHidsState_t *pHidState)
+static void darwinRemoveCarbonHandler(VBoxHidsState_t *pHidState)
{
AssertReturnVoid(pHidState);
AssertReturnVoid(pHidState->pTapRef);
@@ -1871,7 +2178,7 @@ void * DarwinHidDevicesKeepLedsState(void)
pHidState->pDeviceCollection = CFArrayCreateMutable(kCFAllocatorDefault, 0, NULL);
if (pHidState->pDeviceCollection)
{
- if (darwinAddCarbonGlobalKeyPressHandler(pHidState) == 0)
+ if (darwinAddCarbonHandler(pHidState) == 0)
{
/* Populate cache with HID devices */
CFSetRef pDevicesSet = IOHIDManagerCopyDevices(pHidState->hidManagerRef);
@@ -1901,7 +2208,10 @@ void * DarwinHidDevicesKeepLedsState(void)
pHidState->guestState.fCapsLockOn =
pHidState->guestState.fScrollLockOn = false;
- return pHidState;
+ /* Finally, subscribe to USB HID notifications in order to prevent LED artifacts on
+ automatic power management */
+ if (darwinUsbHidSubscribeInterestNotifications(pHidState) == 0)
+ return pHidState;
}
}
@@ -1939,8 +2249,10 @@ int DarwinHidDevicesApplyAndReleaseLedsState(void *pState)
AssertReturn(pHidState, kIOReturnError);
+ darwinUsbHidUnsubscribeInterestNotifications(pHidState);
+
/* Need to unregister Carbon stuff first */
- darwinRemoveCarbonGlobalKeyPressHandler(pHidState);
+ darwinRemoveCarbonHandler(pHidState);
CFDictionaryRef elementMatchingDict = darwinQueryLedElementMatchingDictionary();
if (elementMatchingDict)
diff --git a/src/VBox/Frontends/VirtualBox/src/platform/darwin/UICocoaApplication.h b/src/VBox/Frontends/VirtualBox/src/platform/darwin/UICocoaApplication.h
index c9b785a..1628bce 100644
--- a/src/VBox/Frontends/VirtualBox/src/platform/darwin/UICocoaApplication.h
+++ b/src/VBox/Frontends/VirtualBox/src/platform/darwin/UICocoaApplication.h
@@ -34,6 +34,7 @@ class UICocoaApplication
{
public:
static UICocoaApplication* instance();
+ void hide();
~UICocoaApplication();
void registerForNativeEvents(uint32_t fMask, PFNVBOXCACALLBACK pfnCallback, void *pvUser);
diff --git a/src/VBox/Frontends/VirtualBox/src/platform/darwin/UICocoaApplication.mm b/src/VBox/Frontends/VirtualBox/src/platform/darwin/UICocoaApplication.mm
index c451471..a7d8727 100644
--- a/src/VBox/Frontends/VirtualBox/src/platform/darwin/UICocoaApplication.mm
+++ b/src/VBox/Frontends/VirtualBox/src/platform/darwin/UICocoaApplication.mm
@@ -173,6 +173,11 @@ UICocoaApplication* UICocoaApplication::instance()
return m_pInstance;
}
+void UICocoaApplication::hide()
+{
+ [m_pNative hide:m_pNative];
+}
+
UICocoaApplication::UICocoaApplication()
{
/* Make sure our private NSApplication object is created */
diff --git a/src/VBox/Frontends/VirtualBox/src/runtime/UIFrameBufferQImage.cpp b/src/VBox/Frontends/VirtualBox/src/runtime/UIFrameBufferQImage.cpp
index b6955ac..b326585 100644
--- a/src/VBox/Frontends/VirtualBox/src/runtime/UIFrameBufferQImage.cpp
+++ b/src/VBox/Frontends/VirtualBox/src/runtime/UIFrameBufferQImage.cpp
@@ -139,7 +139,7 @@ void UIFrameBufferQImage::resizeEvent(UIResizeEvent *pEvent)
}
/* Remind if requested: */
- if (bRemind)
+ if (bRemind && m_pMachineView->uisession()->isGuestAdditionsActive())
popupCenter().remindAboutWrongColorDepth(m_pMachineView->machineWindow(),
pEvent->bitsPerPixel(), 32);
else
diff --git a/src/VBox/Frontends/VirtualBox/src/runtime/UIFrameBufferQuartz2D.cpp b/src/VBox/Frontends/VirtualBox/src/runtime/UIFrameBufferQuartz2D.cpp
index bc84c74..a90e526 100644
--- a/src/VBox/Frontends/VirtualBox/src/runtime/UIFrameBufferQuartz2D.cpp
+++ b/src/VBox/Frontends/VirtualBox/src/runtime/UIFrameBufferQuartz2D.cpp
@@ -234,7 +234,7 @@ void UIFrameBufferQuartz2D::resizeEvent(UIResizeEvent *aEvent)
setImageRef(m_image);
#endif
- if (remind)
+ if (remind && m_pMachineView->uisession()->isGuestAdditionsActive())
popupCenter().remindAboutWrongColorDepth(m_pMachineView->machineWindow(),
aEvent->bitsPerPixel(), 32);
else
diff --git a/src/VBox/Frontends/VirtualBox/src/runtime/UIMachine.cpp b/src/VBox/Frontends/VirtualBox/src/runtime/UIMachine.cpp
index fd0bd60..fb985cd 100644
--- a/src/VBox/Frontends/VirtualBox/src/runtime/UIMachine.cpp
+++ b/src/VBox/Frontends/VirtualBox/src/runtime/UIMachine.cpp
@@ -1,12 +1,10 @@
/* $Id: UIMachine.cpp $ */
/** @file
- *
- * VBox frontends: Qt GUI ("VirtualBox"):
- * UIMachine class implementation
+ * VBox Qt GUI - UIMachine class implementation.
*/
/*
- * Copyright (C) 2010-2012 Oracle Corporation
+ * Copyright (C) 2010-2013 Oracle Corporation
*
* This file is part of VirtualBox Open Source Edition (OSE), as
* available from http://www.virtualbox.org. This file is free software;
@@ -17,9 +15,6 @@
* hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
*/
-/* Global includes: */
-#include <QTimer>
-
/* Local includes: */
#include "VBoxGlobal.h"
#include "UIMachine.h"
@@ -36,24 +31,18 @@ class UIVisualState : public QObject
{
Q_OBJECT;
-signals:
-
- /* Signal to change-state: */
- void sigChangeVisualState(UIVisualStateType newVisualStateType);
-
public:
/* Constructor: */
- UIVisualState(QObject *pParent, UISession *pSession)
+ UIVisualState(QObject *pParent, UISession *pSession, UIVisualStateType type)
: QObject(pParent)
+ , m_type(type)
, m_pSession(pSession)
, m_pMachineLogic(0)
#ifdef Q_WS_MAC
, m_fadeToken(kCGDisplayFadeReservationInvalidToken)
#endif /* Q_WS_MAC */
{
- /* Connect state-change handler: */
- connect(this, SIGNAL(sigChangeVisualState(UIVisualStateType)), parent(), SLOT(sltChangeVisualState(UIVisualStateType)));
}
/* Destructor: */
@@ -70,13 +59,13 @@ public:
}
/* Visual state type getter: */
- virtual UIVisualStateType visualStateType() const = 0;
+ UIVisualStateType visualStateType() const { return m_type; }
/* Machine logic getter: */
UIMachineLogic* machineLogic() const { return m_pMachineLogic; }
/* Method to prepare change one visual state to another: */
- virtual bool prepareChange(UIVisualStateType previousVisualStateType)
+ bool prepareChange(UIVisualStateType previousVisualStateType)
{
m_pMachineLogic = UIMachineLogic::create(this, m_pSession, visualStateType());
bool fResult = m_pMachineLogic->checkAvailability();
@@ -99,14 +88,14 @@ public:
}
/* Method to change one visual state to another: */
- virtual void change()
+ void change()
{
/* Prepare the logic object: */
m_pMachineLogic->prepare();
}
/* Method to finish change one visual state to another: */
- virtual void finishChange()
+ void finishChange()
{
#ifdef Q_WS_MAC
/* If there is a valid fade token, fade back to normal color in any
@@ -124,6 +113,7 @@ public:
protected:
/* Variables: */
+ UIVisualStateType m_type;
UISession *m_pSession;
UIMachineLogic *m_pMachineLogic;
#ifdef Q_WS_MAC
@@ -131,237 +121,6 @@ protected:
#endif /* Q_WS_MAC */
};
-/* Normal visual state implementation: */
-class UIVisualStateNormal : public UIVisualState
-{
- Q_OBJECT;
-
-public:
-
- /* Constructor: */
- UIVisualStateNormal(QObject *pParent, UISession *pSession)
- : UIVisualState(pParent, pSession) {}
-
-private slots:
-
- /* State-change handlers: */
- void sltGoToFullscreenMode() { emit sigChangeVisualState(UIVisualStateType_Fullscreen); }
- void sltGoToSeamlessMode() { emit sigChangeVisualState(UIVisualStateType_Seamless); }
- void sltGoToScaleMode() { emit sigChangeVisualState(UIVisualStateType_Scale); }
-
-private:
-
- /* Visual state type getter: */
- UIVisualStateType visualStateType() const { return UIVisualStateType_Normal; }
-
- /* Method to change previous visual state to this one: */
- void change()
- {
- /* Call to base-class: */
- UIVisualState::change();
-
- /* Connect action handlers: */
- connect(gActionPool->action(UIActionIndexRuntime_Toggle_Fullscreen), SIGNAL(triggered(bool)),
- this, SLOT(sltGoToFullscreenMode()), Qt::QueuedConnection);
- connect(gActionPool->action(UIActionIndexRuntime_Toggle_Seamless), SIGNAL(triggered(bool)),
- this, SLOT(sltGoToSeamlessMode()), Qt::QueuedConnection);
- connect(gActionPool->action(UIActionIndexRuntime_Toggle_Scale), SIGNAL(triggered(bool)),
- this, SLOT(sltGoToScaleMode()), Qt::QueuedConnection);
- }
-};
-
-/* Fullscreen visual state implementation: */
-class UIVisualStateFullscreen : public UIVisualState
-{
- Q_OBJECT;
-
-public:
-
- /* Constructor: */
- UIVisualStateFullscreen(QObject *pParent, UISession *pSession)
- : UIVisualState(pParent, pSession)
- {
- /* This visual state should take care of own action: */
- QAction *pActionFullscreen = gActionPool->action(UIActionIndexRuntime_Toggle_Fullscreen);
- if (!pActionFullscreen->isChecked())
- {
- pActionFullscreen->blockSignals(true);
- pActionFullscreen->setChecked(true);
- QTimer::singleShot(0, pActionFullscreen, SLOT(sltUpdate()));
- pActionFullscreen->blockSignals(false);
- }
- }
-
- /* Destructor: */
- virtual ~UIVisualStateFullscreen()
- {
- /* This visual state should take care of own action: */
- QAction *pActionFullscreen = gActionPool->action(UIActionIndexRuntime_Toggle_Fullscreen);
- if (pActionFullscreen->isChecked())
- {
- pActionFullscreen->blockSignals(true);
- pActionFullscreen->setChecked(false);
- QTimer::singleShot(0, pActionFullscreen, SLOT(sltUpdate()));
- pActionFullscreen->blockSignals(false);
- }
- }
-
-private slots:
-
- /* State-change handlers: */
- void sltGoToNormalMode() { emit sigChangeVisualState(UIVisualStateType_Normal); }
- void sltGoToSeamlessMode() { emit sigChangeVisualState(UIVisualStateType_Seamless); }
- void sltGoToScaleMode() { emit sigChangeVisualState(UIVisualStateType_Scale); }
-
-private:
-
- /* Visual state type getter: */
- UIVisualStateType visualStateType() const { return UIVisualStateType_Fullscreen; }
-
- /* Method to change previous visual state to this one: */
- void change()
- {
- /* Call to base-class: */
- UIVisualState::change();
-
- /* Connect action handlers: */
- connect(gActionPool->action(UIActionIndexRuntime_Toggle_Fullscreen), SIGNAL(triggered(bool)),
- this, SLOT(sltGoToNormalMode()), Qt::QueuedConnection);
- connect(gActionPool->action(UIActionIndexRuntime_Toggle_Seamless), SIGNAL(triggered(bool)),
- this, SLOT(sltGoToSeamlessMode()), Qt::QueuedConnection);
- connect(gActionPool->action(UIActionIndexRuntime_Toggle_Scale), SIGNAL(triggered(bool)),
- this, SLOT(sltGoToScaleMode()), Qt::QueuedConnection);
- }
-};
-
-/* Seamless visual state implementation: */
-class UIVisualStateSeamless : public UIVisualState
-{
- Q_OBJECT;
-
-public:
-
- /* Constructor: */
- UIVisualStateSeamless(QObject *pParent, UISession *pSession)
- : UIVisualState(pParent, pSession)
- {
- /* This visual state should take care of own action: */
- QAction *pActionSeamless = gActionPool->action(UIActionIndexRuntime_Toggle_Seamless);
- if (!pActionSeamless->isChecked())
- {
- pActionSeamless->blockSignals(true);
- pActionSeamless->setChecked(true);
- QTimer::singleShot(0, pActionSeamless, SLOT(sltUpdate()));
- pActionSeamless->blockSignals(false);
- }
- }
-
- /* Destructor: */
- virtual ~UIVisualStateSeamless()
- {
- /* This visual state should take care of own action: */
- QAction *pActionSeamless = gActionPool->action(UIActionIndexRuntime_Toggle_Seamless);
- if (pActionSeamless->isChecked())
- {
- pActionSeamless->blockSignals(true);
- pActionSeamless->setChecked(false);
- QTimer::singleShot(0, pActionSeamless, SLOT(sltUpdate()));
- pActionSeamless->blockSignals(false);
- }
- }
-
-private slots:
-
- /* State-change handlers: */
- void sltGoToNormalMode() { emit sigChangeVisualState(UIVisualStateType_Normal); }
- void sltGoToFullscreenMode() { emit sigChangeVisualState(UIVisualStateType_Fullscreen); }
- void sltGoToScaleMode() { emit sigChangeVisualState(UIVisualStateType_Scale); }
-
-private:
-
- /* Visual state type getter: */
- UIVisualStateType visualStateType() const { return UIVisualStateType_Seamless; }
-
- /* Method to change previous visual state to this one: */
- void change()
- {
- /* Call to base-class: */
- UIVisualState::change();
-
- /* Connect action handlers: */
- connect(gActionPool->action(UIActionIndexRuntime_Toggle_Seamless), SIGNAL(triggered(bool)),
- this, SLOT(sltGoToNormalMode()), Qt::QueuedConnection);
- connect(gActionPool->action(UIActionIndexRuntime_Toggle_Fullscreen), SIGNAL(triggered(bool)),
- this, SLOT(sltGoToFullscreenMode()), Qt::QueuedConnection);
- connect(gActionPool->action(UIActionIndexRuntime_Toggle_Scale), SIGNAL(triggered(bool)),
- this, SLOT(sltGoToScaleMode()), Qt::QueuedConnection);
- }
-};
-
-/* Scale visual state implementation: */
-class UIVisualStateScale : public UIVisualState
-{
- Q_OBJECT;
-
-public:
-
- /* Constructor: */
- UIVisualStateScale(QObject *pParent, UISession *pSession)
- : UIVisualState(pParent, pSession)
- {
- /* This visual state should take care of own action: */
- QAction *pActionScale = gActionPool->action(UIActionIndexRuntime_Toggle_Scale);
- if (!pActionScale->isChecked())
- {
- pActionScale->blockSignals(true);
- pActionScale->setChecked(true);
- QTimer::singleShot(0, pActionScale, SLOT(sltUpdate()));
- pActionScale->blockSignals(false);
- }
- }
-
- /* Destructor: */
- virtual ~UIVisualStateScale()
- {
- /* This visual state should take care of own action: */
- QAction *pActionScale = gActionPool->action(UIActionIndexRuntime_Toggle_Scale);
- if (pActionScale->isChecked())
- {
- pActionScale->blockSignals(true);
- pActionScale->setChecked(false);
- QTimer::singleShot(0, pActionScale, SLOT(sltUpdate()));
- pActionScale->blockSignals(false);
- }
- }
-
-private slots:
-
- /* State-change handlers: */
- void sltGoToNormalMode() { emit sigChangeVisualState(UIVisualStateType_Normal); }
- void sltGoToFullscreenMode() { emit sigChangeVisualState(UIVisualStateType_Fullscreen); }
- void sltGoToSeamlessMode() { emit sigChangeVisualState(UIVisualStateType_Seamless); }
-
-private:
-
- /* Visual state type getter: */
- UIVisualStateType visualStateType() const { return UIVisualStateType_Scale; }
-
- /* Method to change previous visual state to this one: */
- void change()
- {
- /* Call to base-class: */
- UIVisualState::change();
-
- /* Connect action handlers: */
- connect(gActionPool->action(UIActionIndexRuntime_Toggle_Scale), SIGNAL(triggered(bool)),
- this, SLOT(sltGoToNormalMode()), Qt::QueuedConnection);
- connect(gActionPool->action(UIActionIndexRuntime_Toggle_Fullscreen), SIGNAL(triggered(bool)),
- this, SLOT(sltGoToFullscreenMode()), Qt::QueuedConnection);
- connect(gActionPool->action(UIActionIndexRuntime_Toggle_Seamless), SIGNAL(triggered(bool)),
- this, SLOT(sltGoToSeamlessMode()), Qt::QueuedConnection);
- }
-};
-
UIMachine::UIMachine(UIMachine **ppSelf, const CSession &session)
: QObject(0)
, m_ppThis(ppSelf)
@@ -387,6 +146,12 @@ UIMachine::UIMachine(UIMachine **ppSelf, const CSession &session)
/* Load machine settings: */
loadMachineSettings();
+ /* Prepare async visual-state change handler: */
+ qRegisterMetaType<UIVisualStateType>();
+ connect(this, SIGNAL(sigRequestAsyncVisualStateChange(UIVisualStateType)),
+ this, SLOT(sltChangeVisualState(UIVisualStateType)),
+ Qt::QueuedConnection);
+
/* Enter default (normal) state */
enterInitialVisualState();
}
@@ -424,44 +189,18 @@ QWidget* UIMachine::activeWindow() const
return machineLogic()->activeMachineWindow();
}
+void UIMachine::asyncChangeVisualState(UIVisualStateType visualStateType)
+{
+ emit sigRequestAsyncVisualStateChange(visualStateType);
+}
+
void UIMachine::sltChangeVisualState(UIVisualStateType newVisualStateType)
{
/* Create new state: */
- UIVisualState *pNewVisualState = 0;
- switch (newVisualStateType)
- {
- case UIVisualStateType_Normal:
- {
- /* Create normal visual state: */
- pNewVisualState = new UIVisualStateNormal(this, m_pSession);
- break;
- }
- case UIVisualStateType_Fullscreen:
- {
- /* Create fullscreen visual state: */
- pNewVisualState = new UIVisualStateFullscreen(this, m_pSession);
- break;
- }
- case UIVisualStateType_Seamless:
- {
- /* Create seamless visual state: */
- pNewVisualState = new UIVisualStateSeamless(this, m_pSession);
- break;
- }
- case UIVisualStateType_Scale:
- {
- /* Create scale visual state: */
- pNewVisualState = new UIVisualStateScale(this, m_pSession);
- break;
- }
- default:
- break;
- }
+ UIVisualState *pNewVisualState = new UIVisualState(this, m_pSession, newVisualStateType);
/* Get previous visual state type: */
- UIVisualStateType previousVisualStateType = UIVisualStateType_Normal;
- if (m_pVisualState)
- previousVisualStateType = m_pVisualState->visualStateType();
+ UIVisualStateType previousVisualStateType = m_pVisualState ? m_pVisualState->visualStateType() : UIVisualStateType_Normal;
/* First we have to check if the selected mode is available at all.
* Only then we delete the old mode and switch to the new mode. */
@@ -497,8 +236,7 @@ UIMachineLogic* UIMachine::machineLogic() const
{
if (m_pVisualState && m_pVisualState->machineLogic())
return m_pVisualState->machineLogic();
- else
- return 0;
+ return 0;
}
void UIMachine::loadMachineSettings()
@@ -510,7 +248,7 @@ void UIMachine::loadMachineSettings()
/* Load extra-data settings: */
{
- /* Machine while saving own settings will save "yes" only for current
+ /* Machine while saving own settings will save "on" only for current
* visual representation mode if its differs from normal mode of course.
* But user can alter extra data manually in machine xml file and set there
* more than one visual representation mode flags. Shame on such user!
@@ -539,7 +277,7 @@ void UIMachine::loadMachineSettings()
fIsSomeExtendedModeChosen = true;
/* We can't enter seamless mode initially,
* so we should ask ui-session for that: */
- uisession()->setSeamlessModeRequested(true);
+ uisession()->setRequestedVisualState(UIVisualStateType_Seamless);
}
}
@@ -564,17 +302,36 @@ void UIMachine::saveMachineSettings()
/* Save extra-data settings: */
{
- /* Set 'scale' flag: */
- machine.SetExtraData(GUI_Scale, m_pVisualState &&
- m_pVisualState->visualStateType() == UIVisualStateType_Scale ? "on" : QString());
-
- /* Set 'seamless' flag: */
- machine.SetExtraData(GUI_Seamless, m_pVisualState &&
- m_pVisualState->visualStateType() == UIVisualStateType_Seamless ? "on" : QString());
-
- /* Set 'fullscreen' flag: */
- machine.SetExtraData(GUI_Fullscreen, m_pVisualState &&
- m_pVisualState->visualStateType() == UIVisualStateType_Fullscreen ? "on" : QString());
+ /* Prepare extra-data values: */
+ QString strFullscreenRequested;
+ QString strSeamlessRequested;
+ QString strScaleRequested;
+ /* Check if some state was requested: */
+ if (uisession()->requestedVisualState() != UIVisualStateType_Invalid)
+ {
+ switch (uisession()->requestedVisualState())
+ {
+ case UIVisualStateType_Fullscreen: strFullscreenRequested = "on"; break;
+ case UIVisualStateType_Seamless: strSeamlessRequested = "on"; break;
+ case UIVisualStateType_Scale: strScaleRequested = "on"; break;
+ default: break;
+ }
+ }
+ /* Check if some state still exists: */
+ else if (m_pVisualState)
+ {
+ switch (m_pVisualState->visualStateType())
+ {
+ case UIVisualStateType_Fullscreen: strFullscreenRequested = "on"; break;
+ case UIVisualStateType_Seamless: strSeamlessRequested = "on"; break;
+ case UIVisualStateType_Scale: strScaleRequested = "on"; break;
+ default: break;
+ }
+ }
+ /* Rewrite extra-data values: */
+ machine.SetExtraData(GUI_Fullscreen, strFullscreenRequested);
+ machine.SetExtraData(GUI_Seamless, strSeamlessRequested);
+ machine.SetExtraData(GUI_Scale, strScaleRequested);
}
}
diff --git a/src/VBox/Frontends/VirtualBox/src/runtime/UIMachine.h b/src/VBox/Frontends/VirtualBox/src/runtime/UIMachine.h
index 9dc67fb..c8b9628 100644
--- a/src/VBox/Frontends/VirtualBox/src/runtime/UIMachine.h
+++ b/src/VBox/Frontends/VirtualBox/src/runtime/UIMachine.h
@@ -1,11 +1,9 @@
/** @file
- *
- * VBox frontends: Qt GUI ("VirtualBox"):
- * UIMachine class declaration
+ * VBox Qt GUI - UIMachine class declaration.
*/
/*
- * Copyright (C) 2010-2012 Oracle Corporation
+ * Copyright (C) 2010-2013 Oracle Corporation
*
* This file is part of VirtualBox Open Source Edition (OSE), as
* available from http://www.virtualbox.org. This file is free software;
@@ -16,8 +14,8 @@
* hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
*/
-#ifndef __UIMachine_h__
-#define __UIMachine_h__
+#ifndef ___UIMachine_h___
+#define ___UIMachine_h___
/* Qt includes: */
#include <QObject>
@@ -40,6 +38,11 @@ class UIMachine : public QObject
{
Q_OBJECT;
+signals:
+
+ /** Requests async visual-state change. */
+ void sigRequestAsyncVisualStateChange(UIVisualStateType visualStateType);
+
public:
/* Virtual Machine constructor/destructor: */
@@ -55,6 +58,9 @@ public:
bool isVisualStateAllowedSeamless() const { return m_allowedVisualStateTypes & UIVisualStateType_Seamless; }
bool isVisualStateAllowedScale() const { return m_allowedVisualStateTypes & UIVisualStateType_Scale; }
+ /** Requests async visual-state change. */
+ void asyncChangeVisualState(UIVisualStateType visualStateType);
+
private slots:
/* Visual state-change handler: */
@@ -86,5 +92,5 @@ private:
friend class UISession;
};
-#endif // __UIMachine_h__
+#endif /* !___UIMachine_h___ */
diff --git a/src/VBox/Frontends/VirtualBox/src/runtime/UIMachineLogic.cpp b/src/VBox/Frontends/VirtualBox/src/runtime/UIMachineLogic.cpp
index dddecef..3a46c3e 100644
--- a/src/VBox/Frontends/VirtualBox/src/runtime/UIMachineLogic.cpp
+++ b/src/VBox/Frontends/VirtualBox/src/runtime/UIMachineLogic.cpp
@@ -1,8 +1,6 @@
/* $Id: UIMachineLogic.cpp $ */
/** @file
- *
- * VBox frontends: Qt GUI ("VirtualBox"):
- * UIMachineLogic class implementation
+ * VBox Qt GUI - UIMachineLogic class implementation.
*/
/*
@@ -32,8 +30,10 @@
/* GUI includes: */
#include "QIFileDialog.h"
#include "UIActionPoolRuntime.h"
-#include "UINetworkManager.h"
-#include "UIDownloaderAdditions.h"
+#ifdef VBOX_GUI_WITH_NETWORK_MANAGER
+# include "UINetworkManager.h"
+# include "UIDownloaderAdditions.h"
+#endif /* VBOX_GUI_WITH_NETWORK_MANAGER */
#include "UIIconPool.h"
#include "UIKeyboardHandler.h"
#include "UIMouseHandler.h"
@@ -248,6 +248,8 @@ void UIMachineLogic::cleanup()
/* Cleanup handlers: */
cleanupHandlers();
+ /* Cleanup action connections: */
+ cleanupActionConnections();
/* Cleanup action groups: */
cleanupActionGroups();
}
@@ -508,8 +510,12 @@ void UIMachineLogic::sltKeyboardLedsChanged()
{
/* Here we have to update host LED lock states using values provided by UISession:
* [bool] uisession() -> isNumLock(), isCapsLock(), isScrollLock() can be used for that. */
- LogRelFlow(("UIMachineLogic::sltKeyboardLedsChanged: Updating host LED lock states (NOT IMPLEMENTED).\n"));
+
+ if (!isHidLedsSyncEnabled())
+ return;
+
#ifdef Q_WS_MAC
+ LogRelFlow(("UIMachineLogic::sltKeyboardLedsChanged: Updating host LED lock states.\n"));
DarwinHidDevicesBroadcastLeds(m_pHostLedsState, uisession()->isNumLock(), uisession()->isCapsLock(), uisession()->isScrollLock());
#endif
}
@@ -671,6 +677,14 @@ void UIMachineLogic::retranslateUi()
}
}
+bool UIMachineLogic::isHidLedsSyncEnabled()
+{
+ QString strHidLedsSyncSettings = session().GetMachine().GetExtraData(GUI_HidLedsSync);
+ if (strHidLedsSyncSettings == "1")
+ return true;
+ return false;
+}
+
#ifdef Q_WS_MAC
void UIMachineLogic::updateDockOverlay()
{
@@ -708,8 +722,8 @@ void UIMachineLogic::prepareRequiredFeatures()
void UIMachineLogic::prepareSessionConnections()
{
/* We should check for entering/exiting requested modes: */
- connect(uisession(), SIGNAL(sigMachineStarted()), this, SLOT(sltCheckRequestedModes()));
- connect(uisession(), SIGNAL(sigAdditionsStateChange()), this, SLOT(sltCheckRequestedModes()));
+ connect(uisession(), SIGNAL(sigMachineStarted()), this, SLOT(sltCheckForRequestedVisualStateType()));
+ connect(uisession(), SIGNAL(sigAdditionsStateChange()), this, SLOT(sltCheckForRequestedVisualStateType()));
/* Machine state-change updater: */
connect(uisession(), SIGNAL(sigMachineStateChange()), this, SLOT(sltMachineStateChanged()));
@@ -1091,34 +1105,6 @@ bool UIMachineLogic::eventFilter(QObject *pWatched, QEvent *pEvent)
return QIWithRetranslateUI3<QObject>::eventFilter(pWatched, pEvent);
}
-void UIMachineLogic::sltCheckRequestedModes()
-{
- /* Do not try to enter extended mode if machine was not started yet: */
- if (!uisession()->isRunning() && !uisession()->isPaused())
- return;
-
- /* If seamless mode is requested, supported and we are NOT currently in seamless mode: */
- if (uisession()->isSeamlessModeRequested() &&
- uisession()->isGuestSupportsSeamless() &&
- visualStateType() != UIVisualStateType_Seamless)
- {
- uisession()->setSeamlessModeRequested(false);
- QAction *pSeamlessModeAction = gActionPool->action(UIActionIndexRuntime_Toggle_Seamless);
- AssertMsg(!pSeamlessModeAction->isChecked(), ("Seamless action should not be triggered before us!\n"));
- QTimer::singleShot(0, pSeamlessModeAction, SLOT(trigger()));
- }
- /* If seamless mode is NOT requested, NOT supported and we are currently in seamless mode: */
- else if (!uisession()->isSeamlessModeRequested() &&
- !uisession()->isGuestSupportsSeamless() &&
- visualStateType() == UIVisualStateType_Seamless)
- {
- uisession()->setSeamlessModeRequested(true);
- QAction *pSeamlessModeAction = gActionPool->action(UIActionIndexRuntime_Toggle_Seamless);
- AssertMsg(pSeamlessModeAction->isChecked(), ("Seamless action should not be triggered before us!\n"));
- QTimer::singleShot(0, pSeamlessModeAction, SLOT(trigger()));
- }
-}
-
void UIMachineLogic::sltToggleGuestAutoresize(bool fEnabled)
{
/* Do not process if window(s) missed! */
@@ -2190,6 +2176,7 @@ void UIMachineLogic::sltInstallGuestAdditions()
return uisession()->sltInstallGuestAdditionsFrom(path);
}
+#ifdef VBOX_GUI_WITH_NETWORK_MANAGER
/* If downloader is running already: */
if (UIDownloaderAdditions::current())
{
@@ -2206,6 +2193,7 @@ void UIMachineLogic::sltInstallGuestAdditions()
/* Start downloading: */
pDl->start();
}
+#endif /* VBOX_GUI_WITH_NETWORK_MANAGER */
}
#ifdef VBOX_WITH_DEBUGGER_GUI
@@ -2327,8 +2315,11 @@ void UIMachineLogic::sltSwitchKeyboardLedsToGuestLeds()
/* Here we have to update host LED lock states using values provided by UISession registry.
* [bool] uisession() -> isNumLock(), isCapsLock(), isScrollLock() can be used for that. */
- LogRelFlow(("UIMachineLogic::sltSwitchKeyboardLedsToGuestLeds: keep host LED lock states and broadcast guest's ones (NOT IMPLEMENTED).\n"));
+ if (!isHidLedsSyncEnabled())
+ return;
+
#ifdef Q_WS_MAC
+ LogRelFlow(("UIMachineLogic::sltSwitchKeyboardLedsToGuestLeds: keep host LED lock states and broadcast guest's ones.\n"));
if (m_pHostLedsState == NULL)
m_pHostLedsState = DarwinHidDevicesKeepLedsState();
DarwinHidDevicesBroadcastLeds(m_pHostLedsState, uisession()->isNumLock(), uisession()->isCapsLock(), uisession()->isScrollLock());
@@ -2343,10 +2334,13 @@ void UIMachineLogic::sltSwitchKeyboardLedsToPreviousLeds()
// strDt.toAscii().constData(),
// session().GetMachine().GetName().toAscii().constData());
- LogRelFlow(("UIMachineLogic::sltSwitchKeyboardLedsToPreviousLeds: restore host LED lock states (NOT IMPLEMENTED).\n"));
+ if (!isHidLedsSyncEnabled())
+ return;
/* Here we have to restore host LED lock states. */
#ifdef Q_WS_MAC
+ LogRelFlow(("UIMachineLogic::sltSwitchKeyboardLedsToPreviousLeds: restore host LED lock states.\n"));
+
if (m_pHostLedsState)
{
DarwinHidDevicesApplyAndReleaseLedsState(m_pHostLedsState);
diff --git a/src/VBox/Frontends/VirtualBox/src/runtime/UIMachineLogic.h b/src/VBox/Frontends/VirtualBox/src/runtime/UIMachineLogic.h
index ac4cfe3..130c5ef 100644
--- a/src/VBox/Frontends/VirtualBox/src/runtime/UIMachineLogic.h
+++ b/src/VBox/Frontends/VirtualBox/src/runtime/UIMachineLogic.h
@@ -1,7 +1,5 @@
/** @file
- *
- * VBox frontends: Qt GUI ("VirtualBox"):
- * UIMachineLogic class declaration
+ * VBox Qt GUI - UIMachineLogic class declaration.
*/
/*
@@ -16,8 +14,8 @@
* hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
*/
-#ifndef __UIMachineLogic_h__
-#define __UIMachineLogic_h__
+#ifndef ___UIMachineLogic_h___
+#define ___UIMachineLogic_h___
/* GUI includes: */
#include "UIDefs.h"
@@ -101,6 +99,9 @@ public:
protected slots:
+ /** Checks if some visual-state type was requested. */
+ virtual void sltCheckForRequestedVisualStateType() {}
+
/* Console callback handlers: */
virtual void sltMachineStateChanged();
virtual void sltAdditionsStateChanged();
@@ -131,6 +132,7 @@ protected:
void setMouseHandler(UIMouseHandler *pMouseHandler);
void addMachineWindow(UIMachineWindow *pMachineWindow);
void retranslateUi();
+ bool isHidLedsSyncEnabled();
#ifdef Q_WS_MAC
bool isDockIconPreviewEnabled() const { return m_fIsDockIconEnabled; }
void setDockIconPreviewEnabled(bool fIsDockIconPreviewEnabled) { m_fIsDockIconEnabled = fIsDockIconPreviewEnabled; }
@@ -164,7 +166,7 @@ protected:
virtual void cleanupMachineWindows() = 0;
virtual void cleanupHandlers();
//virtual void cleanupOtherConnections() {}
- //virtual void cleanupActionConnections() {}
+ virtual void cleanupActionConnections() {}
virtual void cleanupActionGroups();
//virtual void cleanupSessionConnections() {}
//virtual void cleanupRequiredFeatures() {}
@@ -174,9 +176,6 @@ protected:
private slots:
- /* Mode request watch dog: */
- void sltCheckRequestedModes();
-
/* "Machine" menu functionality: */
void sltToggleGuestAutoresize(bool fEnabled);
void sltAdjustWindow();
@@ -280,5 +279,5 @@ private:
friend class UIMachineWindow;
};
-#endif // __UIMachineLogic_h__
+#endif /* !___UIMachineLogic_h___ */
diff --git a/src/VBox/Frontends/VirtualBox/src/runtime/UIMachineMenuBar.cpp b/src/VBox/Frontends/VirtualBox/src/runtime/UIMachineMenuBar.cpp
index f06b576..d1f00f0 100644
--- a/src/VBox/Frontends/VirtualBox/src/runtime/UIMachineMenuBar.cpp
+++ b/src/VBox/Frontends/VirtualBox/src/runtime/UIMachineMenuBar.cpp
@@ -1,8 +1,6 @@
/* $Id: UIMachineMenuBar.cpp $ */
/** @file
- *
- * VBox frontends: Qt GUI ("VirtualBox"):
- * UIMachineMenuBar class implementation
+ * VBox Qt GUI - UIMachineMenuBar class implementation.
*/
/*
@@ -29,51 +27,64 @@
#include "UIActionPoolRuntime.h"
#include "VBoxGlobal.h"
#include "UIMessageCenter.h"
-#include "UIExtraDataEventHandler.h"
#include "UIImageTools.h"
-#include "UINetworkManager.h"
-#include "VBoxGlobal.h"
-#include "UISession.h"
+#ifdef VBOX_GUI_WITH_NETWORK_MANAGER
+# include "UINetworkManager.h"
+#endif /* VBOX_GUI_WITH_NETWORK_MANAGER */
/* COM includes: */
#include "CMachine.h"
-/* Helper QMenu reimplementation which allows
- * to highlight first menu item for popped up menu: */
+
+/**
+ * QMenu sub-class with extended functionality.
+ * Allows to highlight first menu item for popped up menu.
+ */
class QIMenu : public QMenu
{
Q_OBJECT;
public:
+ /** Constructor. */
QIMenu() : QMenu(0) {}
private slots:
- void sltSelectFirstAction()
+ /** Highlights first menu action for popped up menu. */
+ void sltHighlightFirstAction()
{
#ifdef Q_WS_WIN
activateWindow();
-#endif
+#endif /* Q_WS_WIN */
QMenu::focusNextChild();
}
};
+
+/**
+ * QMenuBar sub-class with extended functionality.
+ * Reflects BETA label when necessary.
+ */
class UIMenuBar: public QMenuBar
{
+ Q_OBJECT;
+
public:
+ /** Constructor. */
UIMenuBar(QWidget *pParent = 0)
- : QMenuBar(pParent)
- , m_fShowBetaLabel(false)
+ : QMenuBar(pParent)
+ , m_fShowBetaLabel(false)
{
- /* Check for beta versions */
+ /* Check for beta versions: */
if (vboxGlobal().isBeta())
m_fShowBetaLabel = true;
}
protected:
+ /** Paint-event reimplementation. */
void paintEvent(QPaintEvent *pEvent)
{
QMenuBar::paintEvent(pEvent);
@@ -95,15 +106,13 @@ protected:
private:
- /* Private member vars */
+ /** Reflects whether we should show BETA label or not. */
bool m_fShowBetaLabel;
};
-UIMachineMenuBar::UIMachineMenuBar(UISession *pSession, const CMachine &machine)
- /* On the Mac we add some items only the first time, cause otherwise they
- * will be merged more than once to the application menu by Qt. */
+
+UIMachineMenuBar::UIMachineMenuBar(UISession *pSession)
: m_pSession(pSession)
- , m_machine(machine)
{
}
@@ -166,8 +175,7 @@ QList<QMenu*> UIMachineMenuBar::prepareSubMenus(RuntimeMenuType fOptions /* = Ru
/* Debug submenu: */
if (fOptions & RuntimeMenuType_Debug)
{
- CMachine machine; /** @todo we should try get the machine here. But we'll
- * probably be fine with the cached values. */
+ CMachine machine = m_pSession->session().GetMachine();
if (vboxGlobal().isDebuggerEnabled(machine))
{
QMenu *pMenuDebug = gActionPool->action(UIActionIndexRuntime_Menu_Debug)->menu();
@@ -175,7 +183,7 @@ QList<QMenu*> UIMachineMenuBar::prepareSubMenus(RuntimeMenuType fOptions /* = Ru
preparedSubMenus << pMenuDebug;
}
}
-#endif
+#endif /* VBOX_WITH_DEBUGGER_GUI */
/* Help submenu: */
if (fOptions & RuntimeMenuType_Help)
@@ -197,7 +205,7 @@ void UIMachineMenuBar::prepareMenuMachine(QMenu *pMenu)
/* Machine submenu: */
pMenu->addAction(gActionPool->action(UIActionIndexRuntime_Simple_SettingsDialog));
- if (vboxGlobal().shouldWeAllowSnapshotOperations(m_machine))
+ if (m_pSession->isSnapshotOperationsAllowed())
pMenu->addAction(gActionPool->action(UIActionIndexRuntime_Simple_TakeSnapshot));
else
gActionPool->action(UIActionIndexRuntime_Simple_TakeSnapshot)->setEnabled(false);
@@ -209,7 +217,7 @@ void UIMachineMenuBar::prepareMenuMachine(QMenu *pMenu)
pMenu->addAction(gActionPool->action(UIActionIndexRuntime_Simple_TypeCAD));
#ifdef Q_WS_X11
pMenu->addAction(gActionPool->action(UIActionIndexRuntime_Simple_TypeCABS));
-#endif
+#endif /* Q_WS_X11 */
pMenu->addSeparator();
pMenu->addAction(gActionPool->action(UIActionIndexRuntime_Toggle_Pause));
pMenu->addAction(gActionPool->action(UIActionIndexRuntime_Simple_Reset));
@@ -218,6 +226,8 @@ void UIMachineMenuBar::prepareMenuMachine(QMenu *pMenu)
pMenu->addSeparator();
#endif /* !Q_WS_MAC */
pMenu->addAction(gActionPool->action(UIActionIndexRuntime_Simple_Close));
+ if (m_pSession->isAllCloseActionsRestricted())
+ gActionPool->action(UIActionIndexRuntime_Simple_Close)->setEnabled(false);
}
void UIMachineMenuBar::prepareMenuView(QMenu *pMenu)
@@ -227,9 +237,9 @@ void UIMachineMenuBar::prepareMenuView(QMenu *pMenu)
return;
/* View submenu: */
- bool fIsAllowedFullscreen = uisession()->isVisualStateAllowedFullscreen();
- bool fIsAllowedSeamless = uisession()->isVisualStateAllowedSeamless();
- bool fIsAllowedScale = uisession()->isVisualStateAllowedScale();
+ bool fIsAllowedFullscreen = m_pSession->isVisualStateAllowedFullscreen();
+ bool fIsAllowedSeamless = m_pSession->isVisualStateAllowedSeamless();
+ bool fIsAllowedScale = m_pSession->isVisualStateAllowedScale();
gActionPool->action(UIActionIndexRuntime_Toggle_Fullscreen)->setEnabled(fIsAllowedFullscreen);
if (fIsAllowedFullscreen)
pMenu->addAction(gActionPool->action(UIActionIndexRuntime_Toggle_Fullscreen));
@@ -294,7 +304,9 @@ void UIMachineMenuBar::prepareMenuHelp(QMenu *pMenu)
pMenu->addSeparator();
pMenu->addAction(gActionPool->action(UIActionIndex_Simple_ResetWarnings));
pMenu->addSeparator();
+#ifdef VBOX_GUI_WITH_NETWORK_MANAGER
pMenu->addAction(gActionPool->action(UIActionIndex_Simple_NetworkAccessManager));
+#endif /* VBOX_GUI_WITH_NETWORK_MANAGER */
#ifndef Q_WS_MAC
pMenu->addSeparator();
#endif /* !Q_WS_MAC */
@@ -307,8 +319,10 @@ void UIMachineMenuBar::prepareMenuHelp(QMenu *pMenu)
&msgCenter(), SLOT(sltShowHelpWebDialog()));
VBoxGlobal::connect(gActionPool->action(UIActionIndex_Simple_ResetWarnings), SIGNAL(triggered()),
&msgCenter(), SLOT(sltResetSuppressedMessages()));
+#ifdef VBOX_GUI_WITH_NETWORK_MANAGER
VBoxGlobal::connect(gActionPool->action(UIActionIndex_Simple_NetworkAccessManager), SIGNAL(triggered()),
gNetworkManager, SLOT(show()));
+#endif /* VBOX_GUI_WITH_NETWORK_MANAGER */
VBoxGlobal::connect(gActionPool->action(UIActionIndex_Simple_About), SIGNAL(triggered()),
&msgCenter(), SLOT(sltShowHelpAboutDialog()));
}
diff --git a/src/VBox/Frontends/VirtualBox/src/runtime/UIMachineMenuBar.h b/src/VBox/Frontends/VirtualBox/src/runtime/UIMachineMenuBar.h
index b4a80f3..f3e671b 100644
--- a/src/VBox/Frontends/VirtualBox/src/runtime/UIMachineMenuBar.h
+++ b/src/VBox/Frontends/VirtualBox/src/runtime/UIMachineMenuBar.h
@@ -1,11 +1,9 @@
/** @file
- *
- * VBox frontends: Qt GUI ("VirtualBox"):
- * UIMachineMenuBar class declaration
+ * VBox Qt GUI - UIMachineMenuBar class declaration.
*/
/*
- * Copyright (C) 2010-2011 Oracle Corporation
+ * Copyright (C) 2010-2013 Oracle Corporation
*
* This file is part of VirtualBox Open Source Edition (OSE), as
* available from http://www.virtualbox.org. This file is free software;
@@ -16,51 +14,56 @@
* hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
*/
-#ifndef __UIMachineMenuBar_h__
-#define __UIMachineMenuBar_h__
-
-/* Local includes */
-#include "UIDefs.h"
+#ifndef ___UIMachineMenuBar_h___
+#define ___UIMachineMenuBar_h___
-/* Global includes */
+/* Qt includes: */
#include <QList>
-/* COM includes: */
-#include "COMEnums.h"
-#include "CMachine.h"
+/* GUI includes: */
+#include "UIDefs.h"
-/* Global forwards */
+/* Forward declarations: */
class QMenu;
class QMenuBar;
class UISession;
+/**
+ * Menubar factory for virtual machine (Runtime UI).
+ * Provides client with the new menu/menubar whenever it necessary.
+ */
class UIMachineMenuBar
{
public:
- UIMachineMenuBar(UISession *pSession, const CMachine &machine);
+ /** Constructor. Stores UI session pointer for further needs. */
+ UIMachineMenuBar(UISession *pSession);
+ /** Provides client with new menu. */
QMenu* createMenu(RuntimeMenuType fOptions = RuntimeMenuType_All);
+ /** Provides client with new menubar. */
QMenuBar* createMenuBar(RuntimeMenuType fOptions = RuntimeMenuType_All);
-protected:
+private:
+ /** Populates all the sub-menus client need. */
QList<QMenu*> prepareSubMenus(RuntimeMenuType fOptions = RuntimeMenuType_All);
+ /** Populates <b>Machine</b> sub-menu. */
void prepareMenuMachine(QMenu *pMenu);
+ /** Populates <b>View</b> sub-menu. */
void prepareMenuView(QMenu *pMenu);
+ /** Populates <b>Devices</b> sub-menu. */
void prepareMenuDevices(QMenu *pMenu);
#ifdef VBOX_WITH_DEBUGGER_GUI
+ /** Populates <b>Debug</b> sub-menu. */
void prepareMenuDebug(QMenu *pMenu);
-#endif
+#endif /* VBOX_WITH_DEBUGGER_GUI */
+ /** Populates <b>Help</b> sub-menu. */
void prepareMenuHelp(QMenu *pMenu);
- /* Helper: UI session stuff: */
- UISession* uisession() const { return m_pSession; }
-
- /* Variables: */
+ /** Contains pointer to parent UI session. */
UISession *m_pSession;
- CMachine m_machine;
};
-#endif /* __UIMachineMenuBar_h__ */
+#endif /* !___UIMachineMenuBar_h___ */
diff --git a/src/VBox/Frontends/VirtualBox/src/runtime/UIMachineView.cpp b/src/VBox/Frontends/VirtualBox/src/runtime/UIMachineView.cpp
index 9d35757..24851df 100644
--- a/src/VBox/Frontends/VirtualBox/src/runtime/UIMachineView.cpp
+++ b/src/VBox/Frontends/VirtualBox/src/runtime/UIMachineView.cpp
@@ -218,66 +218,59 @@ void UIMachineView::sltHandleRequestResize(int iPixelFormat, uchar *pVRAM,
int iBitsPerPixel, int iBytesPerLine,
int iWidth, int iHeight)
{
+ // TODO: Move to appropriate place!
/* Some situations require frame-buffer resize-events to be ignored at all,
* leaving machine-window, machine-view and frame-buffer sizes preserved: */
if (uisession()->isGuestResizeIgnored())
return;
- /* If only the pitch has changed (or nothing at all!) we only update the
- * frame-buffer and don't touch the window. This prevents unwanted resizes
- * when entering or exiting fullscreen on X.Org guests and when
- * re-attaching the frame-buffer on a view switch. */
- bool fResize = (ulong)iWidth != frameBuffer()->width()
- || (ulong)iHeight != frameBuffer()->height();
-
/* If machine-window is visible: */
if (uisession()->isScreenVisible(m_uScreenId))
{
- /* Apply current window size to frame-buffer: */
+ // TODO: Move to appropriate place!
+ /* Adjust 'scale' mode for current machine-view size: */
if (visualStateType() == UIVisualStateType_Scale)
frameBuffer()->setScaledSize(size());
- /* Compose guest resize-event: */
- UIResizeEvent resizeEvent(iPixelFormat, pVRAM,
- iBitsPerPixel, iBytesPerLine,
- iWidth, iHeight);
+ /* Is there a proposal for frame-buffer resize? */
+ bool fResizeProposed = (ulong)iWidth != frameBuffer()->width() ||
+ (ulong)iHeight != frameBuffer()->height();
- /* Perform frame-buffer resize if parent window is visible: */
+ /* Perform frame-buffer mode-change: */
+ UIResizeEvent resizeEvent(iPixelFormat, pVRAM, iBitsPerPixel, iBytesPerLine, iWidth, iHeight);
frameBuffer()->resizeEvent(&resizeEvent);
- }
- /* If resize actually happens and machine-window is visible: */
- if (fResize && uisession()->isScreenVisible(m_uScreenId))
- {
- /* Scale-mode doesn't need this: */
- if (visualStateType() != UIVisualStateType_Scale)
+ /* Was framebuffer actually resized? */
+ if (fResizeProposed)
{
- /* Reapply maximum size restriction for machine-view: */
- setMaximumSize(sizeHint());
+ /* Scale-mode doesn't need this.. */
+ if (visualStateType() != UIVisualStateType_Scale)
+ {
+ /* Adjust maximum-size restriction for machine-view: */
+ setMaximumSize(sizeHint());
- /* Disable the resize hint override hack: */
- m_sizeHintOverride = QSize(-1, -1);
+ /* Disable the resize hint override hack: */
+ m_sizeHintOverride = QSize(-1, -1);
- /* Perform machine-view resize: */
- resize(iWidth, iHeight);
- }
+ /* Force machine-window update own layout: */
+ QCoreApplication::sendPostedEvents(0, QEvent::LayoutRequest);
- /* Let our toplevel widget calculate its sizeHint properly: */
- QCoreApplication::sendPostedEvents(0, QEvent::LayoutRequest);
+ /* Update machine-view sliders: */
+ updateSliders();
-#ifdef Q_WS_MAC
- machineLogic()->updateDockIconSize(screenId(), iWidth, iHeight);
-#endif /* Q_WS_MAC */
+ /* By some reason Win host forgets to update machine-window central-widget
+ * after main-layout was updated, let's do it for all the hosts: */
+ machineWindow()->centralWidget()->update();
- /* Scale-mode doesn't need this: */
- if (visualStateType() != UIVisualStateType_Scale)
- {
- /* Update machine-view sliders: */
- updateSliders();
+ /* Normalize machine-window geometry: */
+ if (visualStateType() == UIVisualStateType_Normal)
+ machineWindow()->normalizeGeometry(true /* adjust position */);
+ }
- /* Normalize machine-window geometry: */
- if (visualStateType() == UIVisualStateType_Normal)
- machineWindow()->normalizeGeometry(true /* adjust position */);
+#ifdef Q_WS_MAC
+ /* Update MacOS X dock icon size: */
+ machineLogic()->updateDockIconSize(screenId(), iWidth, iHeight);
+#endif /* Q_WS_MAC */
}
}
@@ -625,6 +618,11 @@ void UIMachineView::cleanupFrameBuffer()
/* Process pending framebuffer events: */
QApplication::sendPostedEvents(this, QEvent::MetaCall);
+#ifdef VBOX_WITH_VIDEOHWACCEL
+ if (m_fAccelerate2DVideo)
+ QApplication::sendPostedEvents(this, VHWACommandProcessType);
+#endif /* VBOX_WITH_VIDEOHWACCEL */
+
/* Temporarily detach the framebuffer from IDisplay before detaching
* from view in order to respect the thread synchonisation logic (see UIFrameBuffer.h).
* Note: VBOX_WITH_CROGL additionally requires us to call SetFramebuffer
diff --git a/src/VBox/Frontends/VirtualBox/src/runtime/UIMachineWindow.cpp b/src/VBox/Frontends/VirtualBox/src/runtime/UIMachineWindow.cpp
index 69e37e7..db528ac 100644
--- a/src/VBox/Frontends/VirtualBox/src/runtime/UIMachineWindow.cpp
+++ b/src/VBox/Frontends/VirtualBox/src/runtime/UIMachineWindow.cpp
@@ -252,34 +252,40 @@ void UIMachineWindow::closeEvent(QCloseEvent *pEvent)
if (!uisession()->isRunning() && !uisession()->isPaused() && !uisession()->isStuck())
return;
+ /* Get machine: */
+ CMachine m = machine();
+
/* If there is a close hook script defined: */
- QString strScript = machine().GetExtraData(GUI_CloseActionHook);
+ QString strScript = m.GetExtraData(GUI_CloseActionHook);
if (!strScript.isEmpty())
{
/* Execute asynchronously and leave: */
- QProcess::startDetached(strScript, QStringList() << machine().GetId());
+ QProcess::startDetached(strScript, QStringList() << m.GetId());
return;
}
/* Choose the close action: */
MachineCloseAction closeAction = MachineCloseAction_Invalid;
- /* If there IS default close-action defined: */
- QString strDefaultAction = machine().GetExtraData(GUI_DefaultCloseAction);
- if (!strDefaultAction.isEmpty())
+ /* If default close-action defined and not restricted: */
+ MachineCloseAction defaultCloseAction = uisession()->defaultCloseAction();
+ MachineCloseAction restrictedCloseActions = uisession()->restrictedCloseActions();
+ if ((defaultCloseAction != MachineCloseAction_Invalid) &&
+ !(restrictedCloseActions & defaultCloseAction))
{
- /* Parse the close-action which was defined: */
- closeAction = gpConverter->fromInternalString<MachineCloseAction>(strDefaultAction);
- /* If VM is stuck, and the default close-action is not 'power-off',
- * we should ask the user about what to do: */
- if (uisession()->isStuck() &&
- closeAction != MachineCloseAction_PowerOff)
- closeAction = MachineCloseAction_Invalid;
- /* If the default-action is 'power-off',
- * we should check if its possible to discard machine-state: */
- if (closeAction == MachineCloseAction_PowerOff &&
- machine().GetSnapshotCount() > 0)
- closeAction = MachineCloseAction_PowerOff_RestoringSnapshot;
+ switch (defaultCloseAction)
+ {
+ /* If VM is stuck, and the default close-action is 'save-state' or 'shutdown',
+ * we should ask the user about what to do: */
+ case MachineCloseAction_SaveState:
+ case MachineCloseAction_Shutdown:
+ closeAction = uisession()->isStuck() ? MachineCloseAction_Invalid : defaultCloseAction;
+ break;
+ /* Otherwise we just use what we have: */
+ default:
+ closeAction = defaultCloseAction;
+ break;
+ }
}
/* If the close-action still undefined: */
@@ -287,7 +293,9 @@ void UIMachineWindow::closeEvent(QCloseEvent *pEvent)
{
/* Prepare close-dialog: */
QWidget *pParentDlg = windowManager().realParentWindow(this);
- QPointer<UIVMCloseDialog> pCloseDlg = new UIVMCloseDialog(pParentDlg, machine(), session());
+ QPointer<UIVMCloseDialog> pCloseDlg = new UIVMCloseDialog(pParentDlg, m,
+ session().GetConsole().GetGuestEnteredACPIMode(),
+ restrictedCloseActions);
/* Make sure close-dialog is valid: */
if (pCloseDlg->isValid())
@@ -318,8 +326,8 @@ void UIMachineWindow::closeEvent(QCloseEvent *pEvent)
}
else
{
- /* Else user misconfigured .vbox file, 'power-off' will be the action: */
- closeAction = MachineCloseAction_PowerOff;
+ /* Else user misconfigured .vbox file, we will reject closing UI: */
+ closeAction = MachineCloseAction_Invalid;
}
/* Cleanup close-dialog: */
diff --git a/src/VBox/Frontends/VirtualBox/src/runtime/UISession.cpp b/src/VBox/Frontends/VirtualBox/src/runtime/UISession.cpp
index ef286e3..89debb9 100644
--- a/src/VBox/Frontends/VirtualBox/src/runtime/UISession.cpp
+++ b/src/VBox/Frontends/VirtualBox/src/runtime/UISession.cpp
@@ -1,12 +1,10 @@
/* $Id: UISession.cpp $ */
/** @file
- *
- * VBox frontends: Qt GUI ("VirtualBox"):
- * UISession stuff implementation
+ * VBox Qt GUI - UISession class implementation.
*/
/*
- * Copyright (C) 2006-2012 Oracle Corporation
+ * Copyright (C) 2006-2013 Oracle Corporation
*
* This file is part of VirtualBox Open Source Edition (OSE), as
* available from http://www.virtualbox.org. This file is free software;
@@ -79,47 +77,43 @@
#include "CSnapshot.h"
#include "CMedium.h"
+#ifdef VBOX_GUI_WITH_KEYS_RESET_HANDLER
+static void signalHandlerSIGUSR1(int sig, siginfo_t *, void *);
+#endif
+
#ifdef Q_WS_MAC
/**
* MacOS X: Application Services: Core Graphics: Display reconfiguration callback.
*
- * Notifies about @a display configuration change.
- * Corresponding change described by CoreGraphics @a flags.
- * Calls for corresponding UISession slots through @a pHandlerObject to handle this callback.
+ * Notifies UISession about @a display configuration change.
+ * Corresponding change described by Core Graphics @a flags.
+ * Uses UISession @a pHandler to process this change.
*
- * @note Last argument (@a pHandlerObject) must always be valid pointer to UISession object.
- * @note Calls for UISession::sltHandleHostScreenCountChange() if display count was changed.
- * @note Calls for UISession::sltHandleHostScreenGeometryChange() if display mode was changed.
+ * @note Last argument (@a pHandler) must always be valid pointer to UISession object.
+ * @note Calls for UISession::sltHandleHostDisplayAboutToChange() slot if display configuration changed.
*/
-void cgDisplayReconfigurationCallback(CGDirectDisplayID display, CGDisplayChangeSummaryFlags flags, void *pHandlerObject)
+void cgDisplayReconfigurationCallback(CGDirectDisplayID display, CGDisplayChangeSummaryFlags flags, void *pHandler)
{
+ /* Which flags we are handling? */
+ int iHandledFlags = kCGDisplayAddFlag /* display added */
+ | kCGDisplayRemoveFlag /* display removed */
+ | kCGDisplaySetModeFlag /* display mode changed */;
+
/* Handle 'display-add' case: */
if (flags & kCGDisplayAddFlag)
- {
LogRelFlow(("UISession::cgDisplayReconfigurationCallback: Display added.\n"));
-
- /* Ask receiver to handle our callback, can't believe I'm using r_c here... */
- UISession *pReceiver = reinterpret_cast<UISession*>(pHandlerObject);
- QTimer::singleShot(0, pReceiver, SLOT(sltHandleHostScreenCountChange()));
- }
/* Handle 'display-remove' case: */
else if (flags & kCGDisplayRemoveFlag)
- {
LogRelFlow(("UISession::cgDisplayReconfigurationCallback: Display removed.\n"));
-
- /* Ask receiver to handle our callback, can't believe I'm using r_c here... */
- UISession *pReceiver = reinterpret_cast<UISession*>(pHandlerObject);
- QTimer::singleShot(0, pReceiver, SLOT(sltHandleHostScreenCountChange()));
- }
/* Handle 'mode-set' case: */
else if (flags & kCGDisplaySetModeFlag)
- {
LogRelFlow(("UISession::cgDisplayReconfigurationCallback: Display mode changed.\n"));
- /* Ask receiver to handle our callback, can't believe I'm using r_c here... */
- UISession *pReceiver = reinterpret_cast<UISession*>(pHandlerObject);
- QTimer::singleShot(0, pReceiver, SLOT(sltHandleHostScreenGeometryChange()));
- }
+ /* Ask handler to process our callback: */
+ if (flags & iHandledFlags)
+ QTimer::singleShot(0, static_cast<UISession*>(pHandler),
+ SLOT(sltHandleHostDisplayAboutToChange()));
+
Q_UNUSED(display);
}
#endif /* Q_WS_MAC */
@@ -133,14 +127,21 @@ UISession::UISession(UIMachine *pMachine, CSession &sessionReference)
, m_pMenuPool(0)
, m_machineStatePrevious(KMachineState_Null)
, m_machineState(session().GetMachine().GetState())
+ , m_requestedVisualStateType(UIVisualStateType_Invalid)
#ifdef Q_WS_WIN
, m_alphaCursor(0)
#endif /* Q_WS_WIN */
+#ifdef Q_WS_MAC
+ , m_pWatchdogDisplayChange(0)
+#endif /* Q_WS_MAC */
+ , m_defaultCloseAction(MachineCloseAction_Invalid)
+ , m_restrictedCloseActions(MachineCloseAction_Invalid)
+ , m_fAllCloseActionsRestricted(false)
+ , m_fSnapshotOperationsAllowed(true)
/* Common flags: */
, m_fIsFirstTimeStarted(false)
, m_fIsIgnoreRuntimeMediumsChanging(false)
, m_fIsGuestResizeIgnored(false)
- , m_fIsSeamlessModeRequested(false)
, m_fIsAutoCaptureDisabled(false)
, m_fReconfigurable(false)
/* Guest additions flags: */
@@ -499,6 +500,11 @@ bool UISession::isVisualStateAllowedScale() const
return m_pMachine->isVisualStateAllowedScale();
}
+void UISession::changeVisualState(UIVisualStateType visualStateType)
+{
+ m_pMachine->asyncChangeVisualState(visualStateType);
+}
+
bool UISession::setPause(bool fOn)
{
CConsole console = session().GetConsole();
@@ -645,6 +651,38 @@ void UISession::sltInstallGuestAdditionsFrom(const QString &strSource)
}
}
+void UISession::sltChangeVisualStateToNormal()
+{
+ /* Reset requests: */
+ setRequestedVisualState(UIVisualStateType_Invalid);
+ /* Request change: */
+ m_pMachine->asyncChangeVisualState(UIVisualStateType_Normal);
+}
+
+void UISession::sltChangeVisualStateToFullscreen()
+{
+ /* Reset requests: */
+ setRequestedVisualState(UIVisualStateType_Invalid);
+ /* Request change: */
+ m_pMachine->asyncChangeVisualState(UIVisualStateType_Fullscreen);
+}
+
+void UISession::sltChangeVisualStateToSeamless()
+{
+ /* Reset requests: */
+ setRequestedVisualState(UIVisualStateType_Invalid);
+ /* Request change: */
+ m_pMachine->asyncChangeVisualState(UIVisualStateType_Seamless);
+}
+
+void UISession::sltChangeVisualStateToScale()
+{
+ /* Reset requests: */
+ setRequestedVisualState(UIVisualStateType_Invalid);
+ /* Request change: */
+ m_pMachine->asyncChangeVisualState(UIVisualStateType_Scale);
+}
+
void UISession::sltCloseRuntimeUI()
{
/* First, we have to hide any opened modal/popup widgets.
@@ -821,6 +859,77 @@ void UISession::sltGuestMonitorChange(KGuestMonitorChangedEventType changeType,
emit sigGuestMonitorChange(changeType, uScreenId, screenGeo);
}
+#ifdef RT_OS_DARWIN
+/**
+ * MacOS X: Restarts display-reconfiguration watchdog timer from the beginning.
+ * @note Watchdog is trying to determine display reconfiguration in
+ * UISession::sltCheckIfHostDisplayChanged() slot every 500ms for 40 tries.
+ */
+void UISession::sltHandleHostDisplayAboutToChange()
+{
+ LogRelFlow(("UISession::sltHandleHostDisplayAboutToChange()\n"));
+
+ if (m_pWatchdogDisplayChange->isActive())
+ m_pWatchdogDisplayChange->stop();
+ m_pWatchdogDisplayChange->setProperty("tryNumber", 1);
+ m_pWatchdogDisplayChange->start();
+}
+
+/**
+ * MacOS X: Determines display reconfiguration.
+ * @note Calls for UISession::sltHandleHostScreenCountChange() if screen count changed.
+ * @note Calls for UISession::sltHandleHostScreenGeometryChange() if screen geometry changed.
+ */
+void UISession::sltCheckIfHostDisplayChanged()
+{
+ LogRelFlow(("UISession::sltCheckIfHostDisplayChanged()\n"));
+
+ /* Acquire desktop wrapper: */
+ QDesktopWidget *pDesktop = QApplication::desktop();
+
+ /* Check if display count changed: */
+ if (pDesktop->screenCount() != m_screens.size())
+ {
+ /* Recache display data: */
+ recacheDisplayData();
+ /* Reset watchdog: */
+ m_pWatchdogDisplayChange->setProperty("tryNumber", 0);
+ /* Notify listeners about screen-count changed: */
+ return sltHandleHostScreenCountChange();
+ }
+ else
+ {
+ /* Check if at least one display geometry changed: */
+ for (int iScreenIndex = 0; iScreenIndex < pDesktop->screenCount(); ++iScreenIndex)
+ {
+ if (pDesktop->screenGeometry(iScreenIndex) != m_screens.at(iScreenIndex))
+ {
+ /* Recache display data: */
+ recacheDisplayData();
+ /* Reset watchdog: */
+ m_pWatchdogDisplayChange->setProperty("tryNumber", 0);
+ /* Notify listeners about screen-geometry changed: */
+ return sltHandleHostScreenGeometryChange();
+ }
+ }
+ }
+
+ /* Check if watchdog expired, restart if not: */
+ int cTryNumber = m_pWatchdogDisplayChange->property("tryNumber").toInt();
+ if (cTryNumber > 0 && cTryNumber < 40)
+ {
+ /* Restart watchdog again: */
+ m_pWatchdogDisplayChange->setProperty("tryNumber", ++cTryNumber);
+ m_pWatchdogDisplayChange->start();
+ }
+ else
+ {
+ /* Reset watchdog: */
+ m_pWatchdogDisplayChange->setProperty("tryNumber", 0);
+ }
+}
+#endif /* RT_OS_DARWIN */
+
void UISession::sltHandleHostScreenCountChange()
{
LogRelFlow(("UISession: Host-screen count changed.\n"));
@@ -925,6 +1034,10 @@ void UISession::prepareConnections()
{
connect(this, SIGNAL(sigCloseRuntimeUI()), this, SLOT(sltCloseRuntimeUI()));
+#ifdef Q_WS_MAC
+ /* Install native display reconfiguration callback: */
+ CGDisplayRegisterReconfigurationCallback(cgDisplayReconfigurationCallback, this);
+#else /* !Q_WS_MAC */
/* Install Qt display reconfiguration callbacks: */
connect(QApplication::desktop(), SIGNAL(screenCountChanged(int)),
this, SLOT(sltHandleHostScreenCountChange()));
@@ -932,15 +1045,24 @@ void UISession::prepareConnections()
this, SLOT(sltHandleHostScreenGeometryChange()));
connect(QApplication::desktop(), SIGNAL(workAreaResized(int)),
this, SLOT(sltHandleHostScreenGeometryChange()));
-
-#ifdef Q_WS_MAC
- /* Install display reconfiguration callback: */
- CGDisplayRegisterReconfigurationCallback(cgDisplayReconfigurationCallback, this);
-#endif /* Q_WS_MAC */
+#endif /* !Q_WS_MAC */
}
void UISession::prepareScreens()
{
+#ifdef Q_WS_MAC
+ /* Recache display data: */
+ recacheDisplayData();
+ /* Prepare display-change watchdog: */
+ m_pWatchdogDisplayChange = new QTimer(this);
+ {
+ m_pWatchdogDisplayChange->setInterval(500);
+ m_pWatchdogDisplayChange->setSingleShot(true);
+ connect(m_pWatchdogDisplayChange, SIGNAL(timeout()),
+ this, SLOT(sltCheckIfHostDisplayChanged()));
+ }
+#endif /* Q_WS_MAC */
+
/* Get machine: */
CMachine machine = m_session.GetMachine();
@@ -974,7 +1096,7 @@ void UISession::prepareFramebuffers()
void UISession::prepareMenuPool()
{
- m_pMenuPool = new UIMachineMenuBar(this, session().GetMachine());
+ m_pMenuPool = new UIMachineMenuBar(this);
}
void UISession::loadSessionSettings()
@@ -1006,6 +1128,18 @@ void UISession::loadSessionSettings()
m_fReconfigurable = VBoxGlobal::shouldWeAllowMachineReconfiguration(machine);
updateSessionSettings();
+ /* What is the default close action and the restricted are? */
+ m_defaultCloseAction = vboxGlobal().defaultMachineCloseAction(machine);
+ m_restrictedCloseActions = vboxGlobal().restrictedMachineCloseActions(machine);
+ m_fAllCloseActionsRestricted = (m_restrictedCloseActions & MachineCloseAction_SaveState)
+ && (m_restrictedCloseActions & MachineCloseAction_Shutdown)
+ && (m_restrictedCloseActions & MachineCloseAction_PowerOff);
+ // Close VM Dialog hides PowerOff_RestoringSnapshot implicitly if PowerOff is hidden..
+ // && (m_restrictedCloseActions & MachineCloseAction_PowerOff_RestoringSnapshot);
+
+ /* Should we allow snapshot operations? */
+ m_fSnapshotOperationsAllowed = vboxGlobal().shouldWeAllowSnapshotOperations(machine);
+
#if 0 /* Disabled for now! */
# ifdef Q_WS_WIN
/* Disable host screen-saver if requested: */
@@ -1528,6 +1662,18 @@ void UISession::setFrameBuffer(ulong uScreenId, UIFrameBuffer* pFrameBuffer)
m_frameBufferVector[(int)uScreenId] = pFrameBuffer;
}
+#ifdef Q_WS_MAC
+/** MacOS X: Recaches display-configuration data. */
+void UISession::recacheDisplayData()
+{
+ /* Recache display data: */
+ m_screens.clear();
+ QDesktopWidget *pDesktop = QApplication::desktop();
+ for (int iScreenIndex = 0; iScreenIndex < pDesktop->screenCount(); ++iScreenIndex)
+ m_screens << pDesktop->screenGeometry(iScreenIndex);
+}
+#endif /* Q_WS_MAC */
+
#ifdef VBOX_GUI_WITH_KEYS_RESET_HANDLER
/**
* Custom signal handler. When switching VTs, we might not get release events
@@ -1536,7 +1682,7 @@ void UISession::setFrameBuffer(ulong uScreenId, UIFrameBuffer* pFrameBuffer)
* this hack.
*/
/* static */
-void UISession::signalHandlerSIGUSR1(int sig, siginfo_t * /* pInfo */, void * /*pSecret */)
+static void signalHandlerSIGUSR1(int sig, siginfo_t * /* pInfo */, void * /*pSecret */)
{
/* only SIGUSR1 is interesting */
if (sig == SIGUSR1)
diff --git a/src/VBox/Frontends/VirtualBox/src/runtime/UISession.h b/src/VBox/Frontends/VirtualBox/src/runtime/UISession.h
index 52aecd4..15e2906 100644
--- a/src/VBox/Frontends/VirtualBox/src/runtime/UISession.h
+++ b/src/VBox/Frontends/VirtualBox/src/runtime/UISession.h
@@ -1,11 +1,9 @@
/** @file
- *
- * VBox frontends: Qt GUI ("VirtualBox"):
- * UISession class declaration
+ * VBox Qt GUI - UISession class declaration.
*/
/*
- * Copyright (C) 2010-2012 Oracle Corporation
+ * Copyright (C) 2010-2013 Oracle Corporation
*
* This file is part of VirtualBox Open Source Edition (OSE), as
* available from http://www.virtualbox.org. This file is free software;
@@ -16,8 +14,8 @@
* hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
*/
-#ifndef ___UIConsole_h___
-#define ___UIConsole_h___
+#ifndef ___UISession_h___
+#define ___UISession_h___
/* Qt includes: */
#include <QObject>
@@ -34,15 +32,6 @@
/* Forward declarations: */
class QMenu;
class QMenuBar;
-#ifdef VBOX_GUI_WITH_KEYS_RESET_HANDLER
-# ifdef Q_WS_MAC
-struct __siginfo;
-typedef struct __siginfo siginfo_t;
-# else /* Q_WS_MAC */
-struct siginfo;
-typedef struct siginfo siginfo_t;
-# endif /* !Q_WS_MAC */
-#endif /* VBOX_GUI_WITH_KEYS_RESET_HANDLER */
class UIFrameBuffer;
class UIMachine;
class UIMachineLogic;
@@ -104,10 +93,32 @@ public:
QMenuBar* newMenuBar(RuntimeMenuType fOptions = RuntimeMenuType_All);
QCursor cursor() const { return m_cursor; }
+ /** @name Application Close configuration stuff.
+ * @{ */
+ /** Returns default close action. */
+ MachineCloseAction defaultCloseAction() const { return m_defaultCloseAction; }
+ /** Returns merged restricted close actions. */
+ MachineCloseAction restrictedCloseActions() const { return m_restrictedCloseActions; }
+ /** Returns whether all the close actions are restricted. */
+ bool isAllCloseActionsRestricted() const { return m_fAllCloseActionsRestricted; }
+ /** @} */
+
+ /** @name Snapshot Operations configuration stuff.
+ * @{ */
+ /** Returns whether we should allow snapshot operations. */
+ bool isSnapshotOperationsAllowed() const { return m_fSnapshotOperationsAllowed; }
+ /** @} */
+
/* API: Visual-state stuff: */
bool isVisualStateAllowedFullscreen() const;
bool isVisualStateAllowedSeamless() const;
bool isVisualStateAllowedScale() const;
+ /** Requests visual-state change. */
+ void changeVisualState(UIVisualStateType visualStateType);
+ /** Requests visual-state to be entered when possible. */
+ void setRequestedVisualState(UIVisualStateType visualStateType) { m_requestedVisualStateType = visualStateType; }
+ /** Returns requested visual-state to be entered when possible. */
+ UIVisualStateType requestedVisualState() const { return m_requestedVisualStateType; }
bool isSaved() const { return machineState() == KMachineState_Saved; }
bool isTurnedOff() const { return machineState() == KMachineState_PoweredOff ||
@@ -125,7 +136,6 @@ public:
bool isFirstTimeStarted() const { return m_fIsFirstTimeStarted; }
bool isIgnoreRuntimeMediumsChanging() const { return m_fIsIgnoreRuntimeMediumsChanging; }
bool isGuestResizeIgnored() const { return m_fIsGuestResizeIgnored; }
- bool isSeamlessModeRequested() const { return m_fIsSeamlessModeRequested; }
bool isAutoCaptureDisabled() const { return m_fIsAutoCaptureDisabled; }
/* Guest additions state getters: */
@@ -155,7 +165,6 @@ public:
bool unpause() { return setPause(false); }
bool setPause(bool fOn);
void setGuestResizeIgnored(bool fIsGuestResizeIgnored) { m_fIsGuestResizeIgnored = fIsGuestResizeIgnored; }
- void setSeamlessModeRequested(bool fIsSeamlessModeRequested) { m_fIsSeamlessModeRequested = fIsSeamlessModeRequested; }
void setAutoCaptureDisabled(bool fIsAutoCaptureDisabled) { m_fIsAutoCaptureDisabled = fIsAutoCaptureDisabled; }
void forgetPreviousMachineState() { m_machineStatePrevious = m_machineState; }
@@ -220,6 +229,15 @@ public slots:
private slots:
+ /** Requests visual-state change to 'normal' (window). */
+ void sltChangeVisualStateToNormal();
+ /** Requests visual-state change to 'fullscreen'. */
+ void sltChangeVisualStateToFullscreen();
+ /** Requests visual-state change to 'seamless'. */
+ void sltChangeVisualStateToSeamless();
+ /** Requests visual-state change to 'scale'. */
+ void sltChangeVisualStateToScale();
+
/* Handler: Close Runtime UI stuff: */
void sltCloseRuntimeUI();
@@ -233,7 +251,11 @@ private slots:
void sltVideoCaptureChange();
void sltGuestMonitorChange(KGuestMonitorChangedEventType changeType, ulong uScreenId, QRect screenGeo);
- /* Handlers: Host callback stuff: */
+ /* Handlers: Display reconfiguration stuff: */
+#ifdef RT_OS_DARWIN
+ void sltHandleHostDisplayAboutToChange();
+ void sltCheckIfHostDisplayChanged();
+#endif /* RT_OS_DARWIN */
void sltHandleHostScreenCountChange();
void sltHandleHostScreenGeometryChange();
@@ -268,9 +290,10 @@ private:
bool preparePowerUp();
int countOfVisibleWindows();
-#ifdef VBOX_GUI_WITH_KEYS_RESET_HANDLER
- static void signalHandlerSIGUSR1(int sig, siginfo_t *pInfo, void *pSecret);
-#endif /* VBOX_GUI_WITH_KEYS_RESET_HANDLER */
+#ifdef Q_WS_MAC
+ /* Helper: Display reconfiguration stuff: */
+ void recacheDisplayData();
+#endif /* Q_WS_MAC */
/* Private variables: */
UIMachine *m_pMachine;
@@ -288,15 +311,47 @@ private:
KMachineState m_machineStatePrevious;
KMachineState m_machineState;
QCursor m_cursor;
+
+ /** @name Visual-state configuration variables.
+ ** @{ */
+ /** Determines which visual-state should be entered when possible. */
+ UIVisualStateType m_requestedVisualStateType;
+ /** @} */
+
#if defined(Q_WS_WIN)
HCURSOR m_alphaCursor;
#endif
+#ifdef Q_WS_MAC
+ /** @name MacOS X: Display reconfiguration variables.
+ * @{ */
+ /** MacOS X: Watchdog timer looking for display reconfiguration. */
+ QTimer *m_pWatchdogDisplayChange;
+ /** MacOS X: A list of display geometries we currently have. */
+ QList<QRect> m_screens;
+ /** @} */
+#endif /* Q_WS_MAC */
+
+ /** @name Application Close configuration variables.
+ * @{ */
+ /** Default close action. */
+ MachineCloseAction m_defaultCloseAction;
+ /** Merged restricted close actions. */
+ MachineCloseAction m_restrictedCloseActions;
+ /** Determines whether all the close actions are restricted. */
+ bool m_fAllCloseActionsRestricted;
+ /** @} */
+
+ /** @name Snapshot Operations configuration variables.
+ * @{ */
+ /** Determines whether we should allow snapshot operations. */
+ bool m_fSnapshotOperationsAllowed;
+ /** @} */
+
/* Common flags: */
bool m_fIsFirstTimeStarted : 1;
bool m_fIsIgnoreRuntimeMediumsChanging : 1;
bool m_fIsGuestResizeIgnored : 1;
- bool m_fIsSeamlessModeRequested : 1;
bool m_fIsAutoCaptureDisabled : 1;
bool m_fReconfigurable : 1;
@@ -326,4 +381,5 @@ private:
friend class UIConsoleEventHandler;
};
-#endif // !___UIConsole_h___
+#endif /* !___UISession_h___ */
+
diff --git a/src/VBox/Frontends/VirtualBox/src/runtime/UIVMCloseDialog.cpp b/src/VBox/Frontends/VirtualBox/src/runtime/UIVMCloseDialog.cpp
index f242592..62ebfe1 100644
--- a/src/VBox/Frontends/VirtualBox/src/runtime/UIVMCloseDialog.cpp
+++ b/src/VBox/Frontends/VirtualBox/src/runtime/UIVMCloseDialog.cpp
@@ -38,26 +38,29 @@
# include "UIConverter.h"
/* COM includes: */
+# include "CMachine.h"
# include "CSession.h"
# include "CConsole.h"
# include "CSnapshot.h"
#endif /* !VBOX_WITH_PRECOMPILED_HEADERS */
-UIVMCloseDialog::UIVMCloseDialog(QWidget *pParent, const CMachine &machine, const CSession &session)
+UIVMCloseDialog::UIVMCloseDialog(QWidget *pParent, CMachine &machine,
+ bool fIsACPIEnabled, MachineCloseAction restictedCloseActions)
: QIWithRetranslateUI<QIDialog>(pParent)
+ , m_machine(machine)
+ , m_restictedCloseActions(restictedCloseActions)
+ , m_fIsACPIEnabled(fIsACPIEnabled)
, m_fValid(false)
- , m_fIsACPIEnabled(false)
, m_lastCloseAction(MachineCloseAction_Invalid)
{
/* Prepare: */
prepare();
/* Configure: */
- setSizeGripEnabled(false);
- configure(machine, session);
+ configure();
- /* Retranslate finally: */
+ /* Retranslate: */
retranslateUi();
}
@@ -269,25 +272,23 @@ void UIVMCloseDialog::prepare()
pMainLayout->addItem(pTopLayout);
pMainLayout->addWidget(pButtonBox);
}
+ /* Prepare size-grip token: */
+ setSizeGripEnabled(false);
}
-void UIVMCloseDialog::configure(const CMachine &machine, const CSession &session)
+void UIVMCloseDialog::configure()
{
- /* Assign machine: */
- m_machine = machine;
-
- /* Get machine-state: */
+ /* Get actual machine-state: */
KMachineState machineState = m_machine.GetState();
/* Assign pixmap: */
setPixmap(vboxGlobal().vmGuestOSTypeIcon(m_machine.GetOSTypeId()));
/* Check which close-actions are resticted: */
- QList<MachineCloseAction> restictedCloseActions = vboxGlobal().restrictedMachineCloseActions(m_machine);
- bool fIsStateSavingAllowed = !restictedCloseActions.contains(MachineCloseAction_SaveState);
- bool fIsACPIShutdownAllowed = !restictedCloseActions.contains(MachineCloseAction_Shutdown);
- bool fIsPowerOffAllowed = !restictedCloseActions.contains(MachineCloseAction_PowerOff);
- bool fIsPowerOffAndRestoreAllowed = fIsPowerOffAllowed && !restictedCloseActions.contains(MachineCloseAction_PowerOff_RestoringSnapshot);
+ bool fIsStateSavingAllowed = !(m_restictedCloseActions & MachineCloseAction_SaveState);
+ bool fIsACPIShutdownAllowed = !(m_restictedCloseActions & MachineCloseAction_Shutdown);
+ bool fIsPowerOffAllowed = !(m_restictedCloseActions & MachineCloseAction_PowerOff);
+ bool fIsPowerOffAndRestoreAllowed = fIsPowerOffAllowed && !(m_restictedCloseActions & MachineCloseAction_PowerOff_RestoringSnapshot);
/* Make 'Save state' button visible/hidden depending on restriction: */
setSaveButtonVisible(fIsStateSavingAllowed);
@@ -295,8 +296,6 @@ void UIVMCloseDialog::configure(const CMachine &machine, const CSession &session
setSaveButtonEnabled(machineState != KMachineState_Stuck);
/* Make 'Shutdown button' visible/hidden depending on restriction: */
setShutdownButtonVisible(fIsACPIShutdownAllowed);
- /* Make 'Shutdown button' enabled/disabled depending on ACPI-state & machine-state: */
- m_fIsACPIEnabled = session.GetConsole().GetGuestEnteredACPIMode();
setShutdownButtonEnabled(m_fIsACPIEnabled && machineState != KMachineState_Stuck);
/* Make 'Power off' button visible/hidden depending on restriction: */
setPowerOffButtonVisible(fIsPowerOffAllowed);
diff --git a/src/VBox/Frontends/VirtualBox/src/runtime/UIVMCloseDialog.h b/src/VBox/Frontends/VirtualBox/src/runtime/UIVMCloseDialog.h
index 31d04ec..2bc0038 100644
--- a/src/VBox/Frontends/VirtualBox/src/runtime/UIVMCloseDialog.h
+++ b/src/VBox/Frontends/VirtualBox/src/runtime/UIVMCloseDialog.h
@@ -24,12 +24,9 @@
#include "QIDialog.h"
#include "UIDefs.h"
-/* COM includes: */
-#include "COMEnums.h"
-#include "CMachine.h"
-
/* Forward declarations: */
-class CSession;
+enum MachineCloseAction;
+class CMachine;
class QLabel;
class QRadioButton;
class QCheckBox;
@@ -42,7 +39,8 @@ class UIVMCloseDialog : public QIWithRetranslateUI<QIDialog>
public:
/* Constructor: */
- UIVMCloseDialog(QWidget *pParent, const CMachine &machine, const CSession &session);
+ UIVMCloseDialog(QWidget *pParent, CMachine &machine,
+ bool fIsACPIEnabled, MachineCloseAction restictedCloseActions);
/* API: Validation stuff: */
bool isValid() const { return m_fValid; }
@@ -74,7 +72,7 @@ private:
/* Helpers: Prepare stuff: */
void prepare();
- void configure(const CMachine &machine, const CSession &session);
+ void configure();
/* Helper: Translate stuff: */
void retranslateUi();
@@ -97,9 +95,10 @@ private:
QCheckBox *m_pDiscardCheckBox;
/* Variables: */
- bool m_fValid;
- CMachine m_machine;
+ CMachine &m_machine;
+ const MachineCloseAction m_restictedCloseActions;
bool m_fIsACPIEnabled;
+ bool m_fValid;
QString m_strDiscardCheckBoxText;
MachineCloseAction m_lastCloseAction;
};
diff --git a/src/VBox/Frontends/VirtualBox/src/runtime/fullscreen/UIMachineLogicFullscreen.cpp b/src/VBox/Frontends/VirtualBox/src/runtime/fullscreen/UIMachineLogicFullscreen.cpp
index 09814b1..71934b7 100644
--- a/src/VBox/Frontends/VirtualBox/src/runtime/fullscreen/UIMachineLogicFullscreen.cpp
+++ b/src/VBox/Frontends/VirtualBox/src/runtime/fullscreen/UIMachineLogicFullscreen.cpp
@@ -1,8 +1,6 @@
/* $Id: UIMachineLogicFullscreen.cpp $ */
/** @file
- *
- * VBox frontends: Qt GUI ("VirtualBox"):
- * UIMachineLogicFullscreen class implementation
+ * VBox Qt GUI - UIMachineLogicFullscreen class implementation.
*/
/*
@@ -163,6 +161,30 @@ void UIMachineLogicFullscreen::prepareActionGroups()
/* Adjust-window action isn't allowed in fullscreen: */
gActionPool->action(UIActionIndexRuntime_Simple_AdjustWindow)->setVisible(false);
+
+ /* Take care of view-action toggle state: */
+ UIAction *pActionFullscreen = gActionPool->action(UIActionIndexRuntime_Toggle_Fullscreen);
+ if (!pActionFullscreen->isChecked())
+ {
+ pActionFullscreen->blockSignals(true);
+ pActionFullscreen->setChecked(true);
+ pActionFullscreen->blockSignals(false);
+ pActionFullscreen->update();
+ }
+}
+
+void UIMachineLogicFullscreen::prepareActionConnections()
+{
+ /* Call to base-class: */
+ UIMachineLogic::prepareActionConnections();
+
+ /* "View" actions connections: */
+ connect(gActionPool->action(UIActionIndexRuntime_Toggle_Fullscreen), SIGNAL(triggered(bool)),
+ uisession(), SLOT(sltChangeVisualStateToNormal()));
+ connect(gActionPool->action(UIActionIndexRuntime_Toggle_Seamless), SIGNAL(triggered(bool)),
+ uisession(), SLOT(sltChangeVisualStateToSeamless()));
+ connect(gActionPool->action(UIActionIndexRuntime_Toggle_Scale), SIGNAL(triggered(bool)),
+ uisession(), SLOT(sltChangeVisualStateToScale()));
}
#ifdef Q_WS_MAC
@@ -238,13 +260,37 @@ void UIMachineLogicFullscreen::cleanupMachineWindows()
#endif/* Q_WS_MAC */
}
-void UIMachineLogicFullscreen::cleanupActionGroups()
+void UIMachineLogicFullscreen::cleanupActionConnections()
{
+ /* "View" actions disconnections: */
+ disconnect(gActionPool->action(UIActionIndexRuntime_Toggle_Fullscreen), SIGNAL(triggered(bool)),
+ uisession(), SLOT(sltChangeVisualStateToNormal()));
+ disconnect(gActionPool->action(UIActionIndexRuntime_Toggle_Seamless), SIGNAL(triggered(bool)),
+ uisession(), SLOT(sltChangeVisualStateToSeamless()));
+ disconnect(gActionPool->action(UIActionIndexRuntime_Toggle_Scale), SIGNAL(triggered(bool)),
+ uisession(), SLOT(sltChangeVisualStateToScale()));
+
/* Call to base-class: */
- UIMachineLogic::cleanupActionGroups();
+ UIMachineLogic::cleanupActionConnections();
+}
+
+void UIMachineLogicFullscreen::cleanupActionGroups()
+{
+ /* Take care of view-action toggle state: */
+ UIAction *pActionFullscreen = gActionPool->action(UIActionIndexRuntime_Toggle_Fullscreen);
+ if (pActionFullscreen->isChecked())
+ {
+ pActionFullscreen->blockSignals(true);
+ pActionFullscreen->setChecked(false);
+ pActionFullscreen->blockSignals(false);
+ pActionFullscreen->update();
+ }
/* Reenable adjust-window action: */
gActionPool->action(UIActionIndexRuntime_Simple_AdjustWindow)->setVisible(true);
+
+ /* Call to base-class: */
+ UIMachineLogic::cleanupActionGroups();
}
#ifdef Q_WS_MAC
diff --git a/src/VBox/Frontends/VirtualBox/src/runtime/fullscreen/UIMachineLogicFullscreen.h b/src/VBox/Frontends/VirtualBox/src/runtime/fullscreen/UIMachineLogicFullscreen.h
index af0e0ab..a60b86d 100644
--- a/src/VBox/Frontends/VirtualBox/src/runtime/fullscreen/UIMachineLogicFullscreen.h
+++ b/src/VBox/Frontends/VirtualBox/src/runtime/fullscreen/UIMachineLogicFullscreen.h
@@ -1,7 +1,5 @@
/** @file
- *
- * VBox frontends: Qt GUI ("VirtualBox"):
- * UIMachineLogicFullscreen class declaration
+ * VBox Qt GUI - UIMachineLogicFullscreen class declaration.
*/
/*
@@ -16,8 +14,8 @@
* hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
*/
-#ifndef __UIMachineLogicFullscreen_h__
-#define __UIMachineLogicFullscreen_h__
+#ifndef ___UIMachineLogicFullscreen_h___
+#define ___UIMachineLogicFullscreen_h___
/* Local includes: */
#include "UIMachineLogic.h"
@@ -60,6 +58,7 @@ private:
/* Prepare helpers: */
void prepareActionGroups();
+ void prepareActionConnections();
#ifdef Q_WS_MAC
void prepareOtherConnections();
#endif /* Q_WS_MAC */
@@ -72,6 +71,7 @@ private:
#ifdef Q_WS_MAC
//void cleanupOtherConnections() {}
#endif /* Q_WS_MAC */
+ void cleanupActionConnections();
void cleanupActionGroups();
#ifdef Q_WS_MAC
@@ -87,5 +87,5 @@ private:
friend class UIMachineViewFullscreen;
};
-#endif // __UIMachineLogicFullscreen_h__
+#endif /* !___UIMachineLogicFullscreen_h___ */
diff --git a/src/VBox/Frontends/VirtualBox/src/runtime/fullscreen/UIMachineWindowFullscreen.cpp b/src/VBox/Frontends/VirtualBox/src/runtime/fullscreen/UIMachineWindowFullscreen.cpp
index 34a973b..3e0b4f7 100644
--- a/src/VBox/Frontends/VirtualBox/src/runtime/fullscreen/UIMachineWindowFullscreen.cpp
+++ b/src/VBox/Frontends/VirtualBox/src/runtime/fullscreen/UIMachineWindowFullscreen.cpp
@@ -57,7 +57,7 @@ void UIMachineWindowFullscreen::sltPopupMainMenu()
if (m_pMainMenu && !m_pMainMenu->isEmpty())
{
m_pMainMenu->popup(geometry().center());
- QTimer::singleShot(0, m_pMainMenu, SLOT(sltSelectFirstAction()));
+ QTimer::singleShot(0, m_pMainMenu, SLOT(sltHighlightFirstAction()));
}
}
diff --git a/src/VBox/Frontends/VirtualBox/src/runtime/normal/UIMachineLogicNormal.cpp b/src/VBox/Frontends/VirtualBox/src/runtime/normal/UIMachineLogicNormal.cpp
index 340dc78..f8102f0 100644
--- a/src/VBox/Frontends/VirtualBox/src/runtime/normal/UIMachineLogicNormal.cpp
+++ b/src/VBox/Frontends/VirtualBox/src/runtime/normal/UIMachineLogicNormal.cpp
@@ -1,12 +1,10 @@
/* $Id: UIMachineLogicNormal.cpp $ */
/** @file
- *
- * VBox frontends: Qt GUI ("VirtualBox"):
- * UIMachineLogicNormal class implementation
+ * VBox Qt GUI - UIMachineLogicNormal class implementation.
*/
/*
- * Copyright (C) 2010-2012 Oracle Corporation
+ * Copyright (C) 2010-2013 Oracle Corporation
*
* This file is part of VirtualBox Open Source Edition (OSE), as
* available from http://www.virtualbox.org. This file is free software;
@@ -27,9 +25,6 @@
#include "UIActionPoolRuntime.h"
#include "UIMachineLogicNormal.h"
#include "UIMachineWindow.h"
-#include "UIDownloaderAdditions.h"
-#include "UIDownloaderUserManual.h"
-#include "UIDownloaderExtensionPack.h"
#ifdef Q_WS_MAC
#include "VBoxUtils.h"
#endif /* Q_WS_MAC */
@@ -45,6 +40,32 @@ bool UIMachineLogicNormal::checkAvailability()
return true;
}
+void UIMachineLogicNormal::sltCheckForRequestedVisualStateType()
+{
+ /* Do not try to change visual-state type if machine was not started yet: */
+ if (!uisession()->isRunning() && !uisession()->isPaused())
+ return;
+
+ /* Check requested visual-state types: */
+ switch (uisession()->requestedVisualState())
+ {
+ /* If 'seamless' visual-state type is requested: */
+ case UIVisualStateType_Seamless:
+ {
+ /* And supported: */
+ if (uisession()->isGuestSupportsSeamless())
+ {
+ LogRel(("UIMachineLogicNormal: Going 'seamless' as requested...\n"));
+ uisession()->setRequestedVisualState(UIVisualStateType_Invalid);
+ uisession()->changeVisualState(UIVisualStateType_Seamless);
+ }
+ break;
+ }
+ default:
+ break;
+ }
+}
+
void UIMachineLogicNormal::sltPrepareNetworkAdaptersMenu()
{
QMenu *menu = qobject_cast<QMenu*>(sender());
@@ -80,10 +101,18 @@ void UIMachineLogicNormal::sltPrepareMouseIntegrationMenu()
void UIMachineLogicNormal::prepareActionConnections()
{
- /* Base class connections: */
+ /* Call to base-class: */
UIMachineLogic::prepareActionConnections();
- /* This class connections: */
+ /* "View" actions connections: */
+ connect(gActionPool->action(UIActionIndexRuntime_Toggle_Fullscreen), SIGNAL(triggered(bool)),
+ uisession(), SLOT(sltChangeVisualStateToFullscreen()));
+ connect(gActionPool->action(UIActionIndexRuntime_Toggle_Seamless), SIGNAL(triggered(bool)),
+ uisession(), SLOT(sltChangeVisualStateToSeamless()));
+ connect(gActionPool->action(UIActionIndexRuntime_Toggle_Scale), SIGNAL(triggered(bool)),
+ uisession(), SLOT(sltChangeVisualStateToScale()));
+
+ /* "Device" actions connections: */
connect(gActionPool->action(UIActionIndexRuntime_Menu_Network)->menu(), SIGNAL(aboutToShow()),
this, SLOT(sltPrepareNetworkAdaptersMenu()));
connect(gActionPool->action(UIActionIndexRuntime_Menu_SharedFolders)->menu(), SIGNAL(aboutToShow()),
@@ -133,3 +162,17 @@ void UIMachineLogicNormal::cleanupMachineWindows()
UIMachineWindow::destroy(pMachineWindow);
}
+void UIMachineLogicNormal::cleanupActionConnections()
+{
+ /* "View" actions disconnections: */
+ disconnect(gActionPool->action(UIActionIndexRuntime_Toggle_Fullscreen), SIGNAL(triggered(bool)),
+ uisession(), SLOT(sltChangeVisualStateToFullscreen()));
+ disconnect(gActionPool->action(UIActionIndexRuntime_Toggle_Seamless), SIGNAL(triggered(bool)),
+ uisession(), SLOT(sltChangeVisualStateToSeamless()));
+ disconnect(gActionPool->action(UIActionIndexRuntime_Toggle_Scale), SIGNAL(triggered(bool)),
+ uisession(), SLOT(sltChangeVisualStateToScale()));
+
+ /* Call to base-class: */
+ UIMachineLogic::cleanupActionConnections();
+}
+
diff --git a/src/VBox/Frontends/VirtualBox/src/runtime/normal/UIMachineLogicNormal.h b/src/VBox/Frontends/VirtualBox/src/runtime/normal/UIMachineLogicNormal.h
index 63e0fa0..880a685 100644
--- a/src/VBox/Frontends/VirtualBox/src/runtime/normal/UIMachineLogicNormal.h
+++ b/src/VBox/Frontends/VirtualBox/src/runtime/normal/UIMachineLogicNormal.h
@@ -1,11 +1,9 @@
/** @file
- *
- * VBox frontends: Qt GUI ("VirtualBox"):
- * UIMachineLogicNormal class declaration
+ * VBox Qt GUI - UIMachineLogicNormal class declaration.
*/
/*
- * Copyright (C) 2010-2012 Oracle Corporation
+ * Copyright (C) 2010-2013 Oracle Corporation
*
* This file is part of VirtualBox Open Source Edition (OSE), as
* available from http://www.virtualbox.org. This file is free software;
@@ -16,8 +14,8 @@
* hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
*/
-#ifndef __UIMachineLogicNormal_h__
-#define __UIMachineLogicNormal_h__
+#ifndef ___UIMachineLogicNormal_h___
+#define ___UIMachineLogicNormal_h___
/* Local includes: */
#include "UIMachineLogic.h"
@@ -37,6 +35,9 @@ protected:
private slots:
+ /** Checks if some visual-state type was requested. */
+ void sltCheckForRequestedVisualStateType();
+
/* Windowed mode functionality: */
void sltPrepareNetworkAdaptersMenu();
void sltPrepareSharedFoldersMenu();
@@ -51,11 +52,11 @@ private:
/* Cleanup helpers: */
void cleanupMachineWindows();
- //void cleanupActionConnections() {}
+ void cleanupActionConnections();
/* Friend classes: */
friend class UIMachineLogic;
};
-#endif // __UIMachineLogicNormal_h__
+#endif /* !___UIMachineLogicNormal_h___ */
diff --git a/src/VBox/Frontends/VirtualBox/src/runtime/scale/UIMachineLogicScale.cpp b/src/VBox/Frontends/VirtualBox/src/runtime/scale/UIMachineLogicScale.cpp
index 96c4ca0..b423ea4 100644
--- a/src/VBox/Frontends/VirtualBox/src/runtime/scale/UIMachineLogicScale.cpp
+++ b/src/VBox/Frontends/VirtualBox/src/runtime/scale/UIMachineLogicScale.cpp
@@ -1,12 +1,10 @@
/* $Id: UIMachineLogicScale.cpp $ */
/** @file
- *
- * VBox frontends: Qt GUI ("VirtualBox"):
- * UIMachineLogicScale class implementation
+ * VBox Qt GUI - UIMachineLogicScale class implementation.
*/
/*
- * Copyright (C) 2010-2012 Oracle Corporation
+ * Copyright (C) 2010-2013 Oracle Corporation
*
* This file is part of VirtualBox Open Source Edition (OSE), as
* available from http://www.virtualbox.org. This file is free software;
@@ -24,8 +22,6 @@
#include "UIActionPoolRuntime.h"
#include "UIMachineLogicScale.h"
#include "UIMachineWindow.h"
-#include "UIDownloaderAdditions.h"
-#include "UIDownloaderExtensionPack.h"
#ifdef Q_WS_MAC
#include "VBoxUtils.h"
#endif /* Q_WS_MAC */
@@ -58,9 +54,32 @@ void UIMachineLogicScale::prepareActionGroups()
/* Guest auto-resize isn't allowed in scale-mode: */
gActionPool->action(UIActionIndexRuntime_Toggle_GuestAutoresize)->setVisible(false);
-
/* Adjust-window isn't allowed in scale-mode: */
gActionPool->action(UIActionIndexRuntime_Simple_AdjustWindow)->setVisible(false);
+
+ /* Take care of view-action toggle state: */
+ UIAction *pActionScale = gActionPool->action(UIActionIndexRuntime_Toggle_Scale);
+ if (!pActionScale->isChecked())
+ {
+ pActionScale->blockSignals(true);
+ pActionScale->setChecked(true);
+ pActionScale->blockSignals(false);
+ pActionScale->update();
+ }
+}
+
+void UIMachineLogicScale::prepareActionConnections()
+{
+ /* Call to base-class: */
+ UIMachineLogic::prepareActionConnections();
+
+ /* "View" actions connections: */
+ connect(gActionPool->action(UIActionIndexRuntime_Toggle_Scale), SIGNAL(triggered(bool)),
+ uisession(), SLOT(sltChangeVisualStateToNormal()));
+ connect(gActionPool->action(UIActionIndexRuntime_Toggle_Fullscreen), SIGNAL(triggered(bool)),
+ uisession(), SLOT(sltChangeVisualStateToFullscreen()));
+ connect(gActionPool->action(UIActionIndexRuntime_Toggle_Seamless), SIGNAL(triggered(bool)),
+ uisession(), SLOT(sltChangeVisualStateToSeamless()));
}
void UIMachineLogicScale::prepareMachineWindows()
@@ -102,15 +121,39 @@ void UIMachineLogicScale::cleanupMachineWindows()
UIMachineWindow::destroy(pMachineWindow);
}
-void UIMachineLogicScale::cleanupActionGroups()
+void UIMachineLogicScale::cleanupActionConnections()
{
+ /* "View" actions disconnections: */
+ disconnect(gActionPool->action(UIActionIndexRuntime_Toggle_Scale), SIGNAL(triggered(bool)),
+ uisession(), SLOT(sltChangeVisualStateToNormal()));
+ disconnect(gActionPool->action(UIActionIndexRuntime_Toggle_Fullscreen), SIGNAL(triggered(bool)),
+ uisession(), SLOT(sltChangeVisualStateToFullscreen()));
+ disconnect(gActionPool->action(UIActionIndexRuntime_Toggle_Seamless), SIGNAL(triggered(bool)),
+ uisession(), SLOT(sltChangeVisualStateToSeamless()));
+
/* Call to base-class: */
- UIMachineLogic::cleanupActionGroups();
+ UIMachineLogic::cleanupActionConnections();
+
+}
+
+void UIMachineLogicScale::cleanupActionGroups()
+{
+ /* Take care of view-action toggle state: */
+ UIAction *pActionScale = gActionPool->action(UIActionIndexRuntime_Toggle_Scale);
+ if (pActionScale->isChecked())
+ {
+ pActionScale->blockSignals(true);
+ pActionScale->setChecked(false);
+ pActionScale->blockSignals(false);
+ pActionScale->update();
+ }
/* Reenable guest-autoresize action: */
gActionPool->action(UIActionIndexRuntime_Toggle_GuestAutoresize)->setVisible(true);
-
/* Reenable adjust-window action: */
gActionPool->action(UIActionIndexRuntime_Simple_AdjustWindow)->setVisible(true);
+
+ /* Call to base-class: */
+ UIMachineLogic::cleanupActionGroups();
}
diff --git a/src/VBox/Frontends/VirtualBox/src/runtime/scale/UIMachineLogicScale.h b/src/VBox/Frontends/VirtualBox/src/runtime/scale/UIMachineLogicScale.h
index 914d7fd..1e11b5b 100644
--- a/src/VBox/Frontends/VirtualBox/src/runtime/scale/UIMachineLogicScale.h
+++ b/src/VBox/Frontends/VirtualBox/src/runtime/scale/UIMachineLogicScale.h
@@ -1,11 +1,9 @@
/** @file
- *
- * VBox frontends: Qt GUI ("VirtualBox"):
- * UIMachineLogicScale class declaration
+ * VBox Qt GUI - UIMachineLogicScale class declaration.
*/
/*
- * Copyright (C) 2010-2012 Oracle Corporation
+ * Copyright (C) 2010-2013 Oracle Corporation
*
* This file is part of VirtualBox Open Source Edition (OSE), as
* available from http://www.virtualbox.org. This file is free software;
@@ -16,8 +14,8 @@
* hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
*/
-#ifndef __UIMachineLogicScale_h__
-#define __UIMachineLogicScale_h__
+#ifndef ___UIMachineLogicScale_h___
+#define ___UIMachineLogicScale_h___
/* Local includes: */
#include "UIMachineLogic.h"
@@ -39,15 +37,17 @@ private:
/* Prepare helpers: */
void prepareActionGroups();
+ void prepareActionConnections();
void prepareMachineWindows();
/* Cleanup helpers: */
void cleanupMachineWindows();
+ void cleanupActionConnections();
void cleanupActionGroups();
/* Friend classes: */
friend class UIMachineLogic;
};
-#endif // __UIMachineLogicScale_h__
+#endif /* !___UIMachineLogicScale_h___ */
diff --git a/src/VBox/Frontends/VirtualBox/src/runtime/scale/UIMachineWindowScale.cpp b/src/VBox/Frontends/VirtualBox/src/runtime/scale/UIMachineWindowScale.cpp
index 11f17f0..3407365 100644
--- a/src/VBox/Frontends/VirtualBox/src/runtime/scale/UIMachineWindowScale.cpp
+++ b/src/VBox/Frontends/VirtualBox/src/runtime/scale/UIMachineWindowScale.cpp
@@ -49,7 +49,7 @@ void UIMachineWindowScale::sltPopupMainMenu()
if (m_pMainMenu && !m_pMainMenu->isEmpty())
{
m_pMainMenu->popup(geometry().center());
- QTimer::singleShot(0, m_pMainMenu, SLOT(sltSelectFirstAction()));
+ QTimer::singleShot(0, m_pMainMenu, SLOT(sltHighlightFirstAction()));
}
}
diff --git a/src/VBox/Frontends/VirtualBox/src/runtime/seamless/UIMachineLogicSeamless.cpp b/src/VBox/Frontends/VirtualBox/src/runtime/seamless/UIMachineLogicSeamless.cpp
index 6ec9171..714da24 100644
--- a/src/VBox/Frontends/VirtualBox/src/runtime/seamless/UIMachineLogicSeamless.cpp
+++ b/src/VBox/Frontends/VirtualBox/src/runtime/seamless/UIMachineLogicSeamless.cpp
@@ -1,8 +1,6 @@
/* $Id: UIMachineLogicSeamless.cpp $ */
/** @file
- *
- * VBox frontends: Qt GUI ("VirtualBox"):
- * UIMachineLogicSeamless class implementation
+ * VBox Qt GUI - UIMachineLogicSeamless class implementation.
*/
/*
@@ -110,6 +108,21 @@ void UIMachineLogicSeamless::notifyAbout3DOverlayVisibilityChange(bool)
}
}
+void UIMachineLogicSeamless::sltCheckForRequestedVisualStateType()
+{
+ /* Do not try to change visual-state type if machine was not started yet: */
+ if (!uisession()->isRunning() && !uisession()->isPaused())
+ return;
+
+ /* If 'seamless' visual-state type is no more supported: */
+ if (!uisession()->isGuestSupportsSeamless())
+ {
+ LogRel(("UIMachineLogicSeamless: Leaving 'seamless' as it is no more supported...\n"));
+ uisession()->setRequestedVisualState(UIVisualStateType_Seamless);
+ uisession()->changeVisualState(UIVisualStateType_Normal);
+ }
+}
+
void UIMachineLogicSeamless::sltMachineStateChanged()
{
/* Call to base-class: */
@@ -163,12 +176,34 @@ void UIMachineLogicSeamless::prepareActionGroups()
/* Guest auto-resize isn't allowed in seamless: */
gActionPool->action(UIActionIndexRuntime_Toggle_GuestAutoresize)->setVisible(false);
-
/* Adjust-window isn't allowed in seamless: */
gActionPool->action(UIActionIndexRuntime_Simple_AdjustWindow)->setVisible(false);
-
/* Disable mouse-integration isn't allowed in seamless: */
gActionPool->action(UIActionIndexRuntime_Toggle_MouseIntegration)->setVisible(false);
+
+ /* Take care of view-action toggle state: */
+ UIAction *pActionSeamless = gActionPool->action(UIActionIndexRuntime_Toggle_Seamless);
+ if (!pActionSeamless->isChecked())
+ {
+ pActionSeamless->blockSignals(true);
+ pActionSeamless->setChecked(true);
+ pActionSeamless->blockSignals(false);
+ pActionSeamless->update();
+ }
+}
+
+void UIMachineLogicSeamless::prepareActionConnections()
+{
+ /* Call to base-class: */
+ UIMachineLogic::prepareActionConnections();
+
+ /* "View" actions connections: */
+ connect(gActionPool->action(UIActionIndexRuntime_Toggle_Seamless), SIGNAL(triggered(bool)),
+ uisession(), SLOT(sltChangeVisualStateToNormal()));
+ connect(gActionPool->action(UIActionIndexRuntime_Toggle_Fullscreen), SIGNAL(triggered(bool)),
+ uisession(), SLOT(sltChangeVisualStateToFullscreen()));
+ connect(gActionPool->action(UIActionIndexRuntime_Toggle_Scale), SIGNAL(triggered(bool)),
+ uisession(), SLOT(sltChangeVisualStateToScale()));
}
void UIMachineLogicSeamless::prepareMachineWindows()
@@ -222,18 +257,40 @@ void UIMachineLogicSeamless::cleanupMachineWindows()
UIMachineWindow::destroy(pMachineWindow);
}
-void UIMachineLogicSeamless::cleanupActionGroups()
+void UIMachineLogicSeamless::cleanupActionConnections()
{
+ /* "View" actions disconnections: */
+ disconnect(gActionPool->action(UIActionIndexRuntime_Toggle_Seamless), SIGNAL(triggered(bool)),
+ uisession(), SLOT(sltChangeVisualStateToNormal()));
+ disconnect(gActionPool->action(UIActionIndexRuntime_Toggle_Fullscreen), SIGNAL(triggered(bool)),
+ uisession(), SLOT(sltChangeVisualStateToFullscreen()));
+ disconnect(gActionPool->action(UIActionIndexRuntime_Toggle_Scale), SIGNAL(triggered(bool)),
+ uisession(), SLOT(sltChangeVisualStateToScale()));
+
/* Call to base-class: */
- UIMachineLogic::cleanupActionGroups();
+ UIMachineLogic::cleanupActionConnections();
+}
+
+void UIMachineLogicSeamless::cleanupActionGroups()
+{
+ /* Take care of view-action toggle state: */
+ UIAction *pActionSeamless = gActionPool->action(UIActionIndexRuntime_Toggle_Seamless);
+ if (pActionSeamless->isChecked())
+ {
+ pActionSeamless->blockSignals(true);
+ pActionSeamless->setChecked(false);
+ pActionSeamless->blockSignals(false);
+ pActionSeamless->update();
+ }
/* Reenable guest-autoresize action: */
gActionPool->action(UIActionIndexRuntime_Toggle_GuestAutoresize)->setVisible(true);
-
/* Reenable adjust-window action: */
gActionPool->action(UIActionIndexRuntime_Simple_AdjustWindow)->setVisible(true);
-
/* Reenable mouse-integration action: */
gActionPool->action(UIActionIndexRuntime_Toggle_MouseIntegration)->setVisible(true);
+
+ /* Call to base-class: */
+ UIMachineLogic::cleanupActionGroups();
}
diff --git a/src/VBox/Frontends/VirtualBox/src/runtime/seamless/UIMachineLogicSeamless.h b/src/VBox/Frontends/VirtualBox/src/runtime/seamless/UIMachineLogicSeamless.h
index 6bb66a4..8bebedd 100644
--- a/src/VBox/Frontends/VirtualBox/src/runtime/seamless/UIMachineLogicSeamless.h
+++ b/src/VBox/Frontends/VirtualBox/src/runtime/seamless/UIMachineLogicSeamless.h
@@ -1,7 +1,5 @@
/** @file
- *
- * VBox frontends: Qt GUI ("VirtualBox"):
- * UIMachineLogicSeamless class declaration
+ * VBox Qt GUI - UIMachineLogicSeamless class declaration.
*/
/*
@@ -16,8 +14,8 @@
* hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
*/
-#ifndef __UIMachineLogicSeamless_h__
-#define __UIMachineLogicSeamless_h__
+#ifndef ___UIMachineLogicSeamless_h___
+#define ___UIMachineLogicSeamless_h___
/* Local includes: */
#include "UIMachineLogic.h"
@@ -49,6 +47,9 @@ protected:
private slots:
+ /** Checks if some visual-state type was requested. */
+ void sltCheckForRequestedVisualStateType();
+
/* Handler: Console callback stuff: */
void sltMachineStateChanged();
@@ -59,12 +60,14 @@ private:
/* Prepare helpers: */
void prepareActionGroups();
+ void prepareActionConnections();
void prepareMachineWindows();
void prepareMenu();
/* Cleanup helpers: */
//void cleanupMenu() {}
void cleanupMachineWindows();
+ void cleanupActionConnections();
void cleanupActionGroups();
/* Variables: */
@@ -76,5 +79,5 @@ private:
friend class UIMachineViewSeamless;
};
-#endif // __UIMachineLogicSeamless_h__
+#endif /* !___UIMachineLogicSeamless_h___ */
diff --git a/src/VBox/Frontends/VirtualBox/src/runtime/seamless/UIMachineWindowSeamless.cpp b/src/VBox/Frontends/VirtualBox/src/runtime/seamless/UIMachineWindowSeamless.cpp
index 3545e3a..bc87b27 100644
--- a/src/VBox/Frontends/VirtualBox/src/runtime/seamless/UIMachineWindowSeamless.cpp
+++ b/src/VBox/Frontends/VirtualBox/src/runtime/seamless/UIMachineWindowSeamless.cpp
@@ -66,7 +66,7 @@ void UIMachineWindowSeamless::sltPopupMainMenu()
if (m_pMainMenu && !m_pMainMenu->isEmpty())
{
m_pMainMenu->popup(geometry().center());
- QTimer::singleShot(0, m_pMainMenu, SLOT(sltSelectFirstAction()));
+ QTimer::singleShot(0, m_pMainMenu, SLOT(sltHighlightFirstAction()));
}
}
diff --git a/src/VBox/Frontends/VirtualBox/src/selector/UISelectorWindow.cpp b/src/VBox/Frontends/VirtualBox/src/selector/UISelectorWindow.cpp
index f350510..0844c34 100644
--- a/src/VBox/Frontends/VirtualBox/src/selector/UISelectorWindow.cpp
+++ b/src/VBox/Frontends/VirtualBox/src/selector/UISelectorWindow.cpp
@@ -33,11 +33,13 @@
#include "QISplitter.h"
#include "QIFileDialog.h"
#include "UIBar.h"
-#include "UINetworkManager.h"
-#include "UINetworkManagerIndicator.h"
-#include "UIUpdateManager.h"
-#include "UIDownloaderUserManual.h"
-#include "UIDownloaderExtensionPack.h"
+#ifdef VBOX_GUI_WITH_NETWORK_MANAGER
+# include "UINetworkManager.h"
+# include "UINetworkManagerIndicator.h"
+# include "UIUpdateManager.h"
+# include "UIDownloaderUserManual.h"
+# include "UIDownloaderExtensionPack.h"
+#endif /* VBOX_GUI_WITH_NETWORK_MANAGER */
#include "UIIconPool.h"
#include "UIWizardCloneVM.h"
#include "UIWizardExportApp.h"
@@ -63,6 +65,9 @@
# include "VBoxUtils.h"
# include "UIWindowMenuManager.h"
# include "UIImageTools.h"
+# if 0 /* disabled until #7112 resolved */
+# include "UICocoaApplication.h"
+# endif /* disabled until #7112 resolved */
#endif /* Q_WS_MAC */
/* Other VBox stuff: */
@@ -332,7 +337,11 @@ void UISelectorWindow::sltShowPreferencesDialog()
void UISelectorWindow::sltPerformExit()
{
+#if 0 /* disabled until #7112 resolved */
+ QApplication::quit();
+#else /* disabled until #7112 resolved */
close();
+#endif /* disabled until #7112 resolved */
}
void UISelectorWindow::sltShowAddMachineDialog(const QString &strFileName /* = QString() */)
@@ -1053,8 +1062,23 @@ void UISelectorWindow::polishEvent(QShowEvent*)
}
#ifdef Q_WS_MAC
+# if 0 /* disabled until #7112 resolved */
+/** MacOS X host: Hides VM selector UI instead of closing. */
+void UISelectorWindow::closeEvent(QCloseEvent *pEvent)
+{
+ pEvent->ignore();
+ UICocoaApplication::instance()->hide();
+}
+# endif /* disabled until #7112 resolved */
+
bool UISelectorWindow::eventFilter(QObject *pObject, QEvent *pEvent)
{
+# if 0 /* disabled until #7112 resolved */
+ /* If we got broadcast qApp close-event, quit app.. */
+ if (pObject == qApp && pEvent->type() == QEvent::Close)
+ return true;
+# endif /* disabled until #7112 resolved */
+
/* Ignore for non-active window: */
if (!isActiveWindow())
return QIWithRetranslateUI2<QMainWindow>::eventFilter(pObject, pEvent);
@@ -1321,6 +1345,7 @@ void UISelectorWindow::prepareMenuHelp(QMenu *pMenu)
pMenu->addSeparator();
m_pResetWarningsAction = gActionPool->action(UIActionIndex_Simple_ResetWarnings);
pMenu->addAction(m_pResetWarningsAction);
+#ifdef VBOX_GUI_WITH_NETWORK_MANAGER
pMenu->addSeparator();
m_pNetworkAccessManager = gActionPool->action(UIActionIndex_Simple_NetworkAccessManager);
pMenu->addAction(m_pNetworkAccessManager);
@@ -1330,6 +1355,7 @@ void UISelectorWindow::prepareMenuHelp(QMenu *pMenu)
pMenu->addAction(m_pUpdateAction);
else
m_pUpdateAction->setEnabled(false);
+#endif /* VBOX_GUI_WITH_NETWORK_MANAGER */
#ifndef Q_WS_MAC
pMenu->addSeparator();
#endif /* !Q_WS_MAC */
@@ -1339,6 +1365,7 @@ void UISelectorWindow::prepareMenuHelp(QMenu *pMenu)
void UISelectorWindow::prepareStatusBar()
{
+#ifdef VBOX_GUI_WITH_NETWORK_MANAGER
/* Setup statusbar policy: */
statusBar()->setContextMenuPolicy(Qt::CustomContextMenu);
@@ -1346,6 +1373,7 @@ void UISelectorWindow::prepareStatusBar()
QIStateIndicator *pIndicator = gNetworkManager->indicator();
statusBar()->addPermanentWidget(pIndicator);
pIndicator->updateAppearance();
+#endif /* VBOX_GUI_WITH_NETWORK_MANAGER */
}
void UISelectorWindow::prepareWidgets()
@@ -1461,8 +1489,10 @@ void UISelectorWindow::prepareConnections()
connect(m_pHelpAction, SIGNAL(triggered()), &msgCenter(), SLOT(sltShowHelpHelpDialog()));
connect(m_pWebAction, SIGNAL(triggered()), &msgCenter(), SLOT(sltShowHelpWebDialog()));
connect(m_pResetWarningsAction, SIGNAL(triggered()), &msgCenter(), SLOT(sltResetSuppressedMessages()));
+#ifdef VBOX_GUI_WITH_NETWORK_MANAGER
connect(m_pNetworkAccessManager, SIGNAL(triggered()), gNetworkManager, SLOT(show()));
connect(m_pUpdateAction, SIGNAL(triggered()), gUpdateManager, SLOT(sltForceCheck()));
+#endif /* VBOX_GUI_WITH_NETWORK_MANAGER */
connect(m_pAboutAction, SIGNAL(triggered()), &msgCenter(), SLOT(sltShowHelpAboutDialog()));
/* Status-bar connections: */
@@ -1493,6 +1523,8 @@ void UISelectorWindow::prepareConnections()
/* Global event handlers: */
connect(gVBoxEvents, SIGNAL(sigMachineStateChange(QString, KMachineState)), this, SLOT(sltStateChanged(QString)));
connect(gVBoxEvents, SIGNAL(sigSessionStateChange(QString, KSessionState)), this, SLOT(sltStateChanged(QString)));
+ connect(gVBoxEvents, SIGNAL(sigSnapshotTake(QString, QString)), this, SLOT(sltSnapshotChanged(QString)));
+ connect(gVBoxEvents, SIGNAL(sigSnapshotDelete(QString, QString)), this, SLOT(sltSnapshotChanged(QString)));
connect(gVBoxEvents, SIGNAL(sigSnapshotChange(QString, QString)), this, SLOT(sltSnapshotChanged(QString)));
}
diff --git a/src/VBox/Frontends/VirtualBox/src/selector/UISelectorWindow.h b/src/VBox/Frontends/VirtualBox/src/selector/UISelectorWindow.h
index 627b302..64b05ba 100644
--- a/src/VBox/Frontends/VirtualBox/src/selector/UISelectorWindow.h
+++ b/src/VBox/Frontends/VirtualBox/src/selector/UISelectorWindow.h
@@ -25,7 +25,6 @@
/* GUI includes: */
#include "QIWithRetranslateUI.h"
-#include "UINetworkDefs.h"
/* Forward declarations: */
class QISplitter;
@@ -111,6 +110,9 @@ private:
void showEvent(QShowEvent *pEvent);
void polishEvent(QShowEvent *pEvent);
#ifdef Q_WS_MAC
+# if 0 /* disabled until #7112 resolved */
+ void closeEvent(QCloseEvent *pEvent);
+# endif /* disabled until #7112 resolved */
bool eventFilter(QObject *pObject, QEvent *pEvent);
#endif /* Q_WS_MAC */
diff --git a/src/VBox/Frontends/VirtualBox/src/selector/UIVMDesktop.cpp b/src/VBox/Frontends/VirtualBox/src/selector/UIVMDesktop.cpp
index 6a6dee7..438ed51 100644
--- a/src/VBox/Frontends/VirtualBox/src/selector/UIVMDesktop.cpp
+++ b/src/VBox/Frontends/VirtualBox/src/selector/UIVMDesktop.cpp
@@ -22,6 +22,9 @@
#include <QStackedLayout>
#include <QStackedWidget>
#include <QToolButton>
+#ifdef Q_WS_MAC
+# include <QTimer>
+#endif /* Q_WS_MAC */
/* GUI includes */
#include "UIBar.h"
@@ -228,7 +231,14 @@ UIVMDesktop::UIVMDesktop(UIToolBar *pToolBar, QAction *pRefreshAction, QWidget *
m_pHeaderBtn->setIcon(Dtls, UIIconPool::iconSet(":/vm_settings_16px.png"));
m_pHeaderBtn->setIcon(Snap, UIIconPool::iconSet(":/snapshot_take_16px.png",
":/snapshot_take_disabled_16px.png"));
- m_pHeaderBtn->animateClick(0);
+#ifdef Q_WS_MAC
+ /* Cocoa stuff should be async...
+ * Do not ask me why but otherwise
+ * it conflicts with native handlers. */
+ QTimer::singleShot(0, this, SLOT(sltInit()));
+#else /* !Q_WS_MAC */
+ sltInit();
+#endif /* !Q_WS_MAC */
/* Prepare main layout: */
QVBoxLayout *pMainLayout = new QVBoxLayout(this);
@@ -325,6 +335,11 @@ void UIVMDesktop::lockSnapshots()
m_pHeaderBtn->setEnabled(Snap, false);
}
+void UIVMDesktop::sltInit()
+{
+ m_pHeaderBtn->animateClick(0);
+}
+
void UIVMDesktop::retranslateUi()
{
m_pHeaderBtn->setTitle(Dtls, tr("&Details"));
diff --git a/src/VBox/Frontends/VirtualBox/src/selector/UIVMDesktop.h b/src/VBox/Frontends/VirtualBox/src/selector/UIVMDesktop.h
index 4a821a5..fe4cc0a 100644
--- a/src/VBox/Frontends/VirtualBox/src/selector/UIVMDesktop.h
+++ b/src/VBox/Frontends/VirtualBox/src/selector/UIVMDesktop.h
@@ -62,6 +62,11 @@ public:
void updateSnapshots(UIVMItem *pVMItem, const CMachine& machine);
void lockSnapshots();
+private slots:
+
+ /** Initialization handler. */
+ void sltInit();
+
private:
/* Helper: Translate stuff: */
diff --git a/src/VBox/Frontends/VirtualBox/src/selector/UIVirtualBoxEventHandler.cpp b/src/VBox/Frontends/VirtualBox/src/selector/UIVirtualBoxEventHandler.cpp
index ff989c7..ca488a9 100644
--- a/src/VBox/Frontends/VirtualBox/src/selector/UIVirtualBoxEventHandler.cpp
+++ b/src/VBox/Frontends/VirtualBox/src/selector/UIVirtualBoxEventHandler.cpp
@@ -83,6 +83,14 @@ UIVirtualBoxEventHandler::UIVirtualBoxEventHandler()
this, SIGNAL(sigSessionStateChange(QString, KSessionState)),
Qt::QueuedConnection);
+ connect(pListener->getWrapped(), SIGNAL(sigSnapshotTake(QString, QString)),
+ this, SIGNAL(sigSnapshotTake(QString, QString)),
+ Qt::QueuedConnection);
+
+ connect(pListener->getWrapped(), SIGNAL(sigSnapshotDelete(QString, QString)),
+ this, SIGNAL(sigSnapshotDelete(QString, QString)),
+ Qt::QueuedConnection);
+
connect(pListener->getWrapped(), SIGNAL(sigSnapshotChange(QString, QString)),
this, SIGNAL(sigSnapshotChange(QString, QString)),
Qt::QueuedConnection);
diff --git a/src/VBox/Frontends/VirtualBox/src/selector/UIVirtualBoxEventHandler.h b/src/VBox/Frontends/VirtualBox/src/selector/UIVirtualBoxEventHandler.h
index 828e159..742aac9 100644
--- a/src/VBox/Frontends/VirtualBox/src/selector/UIVirtualBoxEventHandler.h
+++ b/src/VBox/Frontends/VirtualBox/src/selector/UIVirtualBoxEventHandler.h
@@ -37,6 +37,8 @@ signals:
void sigMachineDataChange(QString strId);
void sigMachineRegistered(QString strId, bool fRegistered);
void sigSessionStateChange(QString strId, KSessionState state);
+ void sigSnapshotTake(QString strId, QString strSnapshotId);
+ void sigSnapshotDelete(QString strId, QString strSnapshotId);
void sigSnapshotChange(QString strId, QString strSnapshotId);
private:
diff --git a/src/VBox/Frontends/VirtualBox/src/selector/VBoxSnapshotsWgt.cpp b/src/VBox/Frontends/VirtualBox/src/selector/VBoxSnapshotsWgt.cpp
index 62b55cc..40a9b3c 100644
--- a/src/VBox/Frontends/VirtualBox/src/selector/VBoxSnapshotsWgt.cpp
+++ b/src/VBox/Frontends/VirtualBox/src/selector/VBoxSnapshotsWgt.cpp
@@ -1017,7 +1017,8 @@ void VBoxSnapshotsWgt::populateSnapshots (const CSnapshot &aSnapshot, QTreeWidge
new SnapshotWgtItem (mTreeWidget, aSnapshot);
item->recache();
- if (mMachine.GetCurrentSnapshot().GetId() == aSnapshot.GetId())
+ CSnapshot curSnapshot = mMachine.GetCurrentSnapshot();
+ if (!curSnapshot.isNull() && curSnapshot.GetId() == aSnapshot.GetId())
{
item->setBold (true);
mCurSnapshotItem = item;
diff --git a/src/VBox/Frontends/VirtualBox/src/selector/graphics/chooser/UIGChooserModel.cpp b/src/VBox/Frontends/VirtualBox/src/selector/graphics/chooser/UIGChooserModel.cpp
index fa88b65..15a92f3 100644
--- a/src/VBox/Frontends/VirtualBox/src/selector/graphics/chooser/UIGChooserModel.cpp
+++ b/src/VBox/Frontends/VirtualBox/src/selector/graphics/chooser/UIGChooserModel.cpp
@@ -1218,6 +1218,10 @@ void UIGChooserModel::prepareConnections()
this, SLOT(sltMachineRegistered(QString, bool)));
connect(gVBoxEvents, SIGNAL(sigSessionStateChange(QString, KSessionState)),
this, SLOT(sltSessionStateChanged(QString, KSessionState)));
+ connect(gVBoxEvents, SIGNAL(sigSnapshotTake(QString, QString)),
+ this, SLOT(sltSnapshotChanged(QString, QString)));
+ connect(gVBoxEvents, SIGNAL(sigSnapshotDelete(QString, QString)),
+ this, SLOT(sltSnapshotChanged(QString, QString)));
connect(gVBoxEvents, SIGNAL(sigSnapshotChange(QString, QString)),
this, SLOT(sltSnapshotChanged(QString, QString)));
}
@@ -1459,7 +1463,7 @@ void UIGChooserModel::unregisterMachines(const QStringList &ids)
continue;
}
}
- else if (iResultCode == AlertButton_Choice2)
+ else if (iResultCode == AlertButton_Choice2 || iResultCode == AlertButton_Ok)
{
/* Unregister machine first: */
CMediumVector mediums = machine.Unregister(KCleanupMode_DetachAllReturnHardDisksOnly);
diff --git a/src/VBox/Frontends/VirtualBox/src/selector/graphics/details/UIGDetailsSet.cpp b/src/VBox/Frontends/VirtualBox/src/selector/graphics/details/UIGDetailsSet.cpp
index 89bbcc7..cc83d46 100644
--- a/src/VBox/Frontends/VirtualBox/src/selector/graphics/details/UIGDetailsSet.cpp
+++ b/src/VBox/Frontends/VirtualBox/src/selector/graphics/details/UIGDetailsSet.cpp
@@ -342,6 +342,8 @@ void UIGDetailsSet::prepareConnections()
connect(gVBoxEvents, SIGNAL(sigMachineStateChange(QString, KMachineState)), this, SLOT(sltMachineStateChange(QString)));
connect(gVBoxEvents, SIGNAL(sigMachineDataChange(QString)), this, SLOT(sltMachineAttributesChange(QString)));
connect(gVBoxEvents, SIGNAL(sigSessionStateChange(QString, KSessionState)), this, SLOT(sltMachineAttributesChange(QString)));
+ connect(gVBoxEvents, SIGNAL(sigSnapshotTake(QString, QString)), this, SLOT(sltMachineAttributesChange(QString)));
+ connect(gVBoxEvents, SIGNAL(sigSnapshotDelete(QString, QString)), this, SLOT(sltMachineAttributesChange(QString)));
connect(gVBoxEvents, SIGNAL(sigSnapshotChange(QString, QString)), this, SLOT(sltMachineAttributesChange(QString)));
/* Meidum-enumeration connections: */
diff --git a/src/VBox/Frontends/VirtualBox/src/settings/UISettingsDialogSpecific.cpp b/src/VBox/Frontends/VirtualBox/src/settings/UISettingsDialogSpecific.cpp
index 1c4a9aa..3017278 100644
--- a/src/VBox/Frontends/VirtualBox/src/settings/UISettingsDialogSpecific.cpp
+++ b/src/VBox/Frontends/VirtualBox/src/settings/UISettingsDialogSpecific.cpp
@@ -35,12 +35,16 @@
#include "UIGlobalSettingsGeneral.h"
#include "UIGlobalSettingsInput.h"
-#include "UIGlobalSettingsUpdate.h"
+#ifdef VBOX_GUI_WITH_NETWORK_MANAGER
+# include "UIGlobalSettingsUpdate.h"
+#endif /* VBOX_GUI_WITH_NETWORK_MANAGER */
#include "UIGlobalSettingsLanguage.h"
#include "UIGlobalSettingsDisplay.h"
#include "UIGlobalSettingsNetwork.h"
#include "UIGlobalSettingsExtension.h"
-#include "UIGlobalSettingsProxy.h"
+#ifdef VBOX_GUI_WITH_NETWORK_MANAGER
+# include "UIGlobalSettingsProxy.h"
+#endif /* VBOX_GUI_WITH_NETWORK_MANAGER */
#include "UIMachineSettingsGeneral.h"
#include "UIMachineSettingsSystem.h"
@@ -354,6 +358,7 @@ UISettingsDialogGlobal::UISettingsDialogGlobal(QWidget *pParent)
iPageIndex, "#input", pSettingsPage);
break;
}
+#ifdef VBOX_GUI_WITH_NETWORK_MANAGER
/* Update page: */
case GlobalSettingsPageType_Update:
{
@@ -363,6 +368,7 @@ UISettingsDialogGlobal::UISettingsDialogGlobal(QWidget *pParent)
iPageIndex, "#update", pSettingsPage);
break;
}
+#endif /* VBOX_GUI_WITH_NETWORK_MANAGER */
/* Language page: */
case GlobalSettingsPageType_Language:
{
@@ -399,6 +405,7 @@ UISettingsDialogGlobal::UISettingsDialogGlobal(QWidget *pParent)
iPageIndex, "#extensions", pSettingsPage);
break;
}
+#ifdef VBOX_GUI_WITH_NETWORK_MANAGER
/* Proxy page: */
case GlobalSettingsPageType_Proxy:
{
@@ -408,6 +415,7 @@ UISettingsDialogGlobal::UISettingsDialogGlobal(QWidget *pParent)
iPageIndex, "#proxy", pSettingsPage);
break;
}
+#endif /* VBOX_GUI_WITH_NETWORK_MANAGER */
default:
break;
}
@@ -489,8 +497,10 @@ void UISettingsDialogGlobal::retranslateUi()
/* Input page: */
m_pSelector->setItemText(GlobalSettingsPageType_Input, tr("Input"));
+#ifdef VBOX_GUI_WITH_NETWORK_MANAGER
/* Update page: */
m_pSelector->setItemText(GlobalSettingsPageType_Update, tr("Update"));
+#endif /* VBOX_GUI_WITH_NETWORK_MANAGER */
/* Language page: */
m_pSelector->setItemText(GlobalSettingsPageType_Language, tr("Language"));
@@ -504,8 +514,10 @@ void UISettingsDialogGlobal::retranslateUi()
/* Extension page: */
m_pSelector->setItemText(GlobalSettingsPageType_Extensions, tr("Extensions"));
+#ifdef VBOX_GUI_WITH_NETWORK_MANAGER
/* Proxy page: */
m_pSelector->setItemText(GlobalSettingsPageType_Proxy, tr("Proxy"));
+#endif /* VBOX_GUI_WITH_NETWORK_MANAGER */
/* Polish the selector: */
m_pSelector->polish();
diff --git a/src/VBox/Frontends/VirtualBox/src/settings/machine/UIMachineSettingsStorage.cpp b/src/VBox/Frontends/VirtualBox/src/settings/machine/UIMachineSettingsStorage.cpp
index ce3480c..df783a1 100644
--- a/src/VBox/Frontends/VirtualBox/src/settings/machine/UIMachineSettingsStorage.cpp
+++ b/src/VBox/Frontends/VirtualBox/src/settings/machine/UIMachineSettingsStorage.cpp
@@ -1832,9 +1832,7 @@ UIMachineSettingsStorage::UIMachineSettingsStorage()
/* Setup connections: */
connect(&vboxGlobal(), SIGNAL(sigMediumEnumerated(const QString&)),
- this, SLOT(sltHandleMediumUpdated(const QString&)));
- connect(&vboxGlobal(), SIGNAL(sigMediumUpdated(const QString&)),
- this, SLOT(sltHandleMediumUpdated(const QString&)));
+ this, SLOT(sltHandleMediumEnumerated(const QString&)));
connect(&vboxGlobal(), SIGNAL(sigMediumDeleted(const QString&)),
this, SLOT(sltHandleMediumDeleted(const QString&)));
connect (mAddCtrAction, SIGNAL (triggered (bool)), this, SLOT (addController()));
@@ -2269,7 +2267,7 @@ void UIMachineSettingsStorage::showEvent (QShowEvent *aEvent)
UISettingsPageMachine::showEvent (aEvent);
}
-void UIMachineSettingsStorage::sltHandleMediumUpdated(const QString &strMediumID)
+void UIMachineSettingsStorage::sltHandleMediumEnumerated(const QString &strMediumID)
{
/* Search for corresponding medium: */
UIMedium medium = vboxGlobal().medium(strMediumID);
diff --git a/src/VBox/Frontends/VirtualBox/src/settings/machine/UIMachineSettingsStorage.h b/src/VBox/Frontends/VirtualBox/src/settings/machine/UIMachineSettingsStorage.h
index 4aad146..a22c313 100644
--- a/src/VBox/Frontends/VirtualBox/src/settings/machine/UIMachineSettingsStorage.h
+++ b/src/VBox/Frontends/VirtualBox/src/settings/machine/UIMachineSettingsStorage.h
@@ -682,7 +682,7 @@ protected:
private slots:
/* Handlers: Medium-processing stuff: */
- void sltHandleMediumUpdated(const QString &strMediumID);
+ void sltHandleMediumEnumerated(const QString &strMediumID);
void sltHandleMediumDeleted(const QString &strMediumID);
void addController();
diff --git a/src/VBox/Frontends/VirtualBox/src/settings/machine/UIMachineSettingsSystem.cpp b/src/VBox/Frontends/VirtualBox/src/settings/machine/UIMachineSettingsSystem.cpp
index 9872bc0..e3b752d 100644
--- a/src/VBox/Frontends/VirtualBox/src/settings/machine/UIMachineSettingsSystem.cpp
+++ b/src/VBox/Frontends/VirtualBox/src/settings/machine/UIMachineSettingsSystem.cpp
@@ -660,7 +660,7 @@ void UIMachineSettingsSystem::prepareTabProcessor()
{
/* Load configuration: */
CSystemProperties properties = vboxGlobal().virtualBox().GetSystemProperties();
- uint hostCPUs = vboxGlobal().host().GetProcessorCount();
+ uint hostCPUs = vboxGlobal().host().GetProcessorOnlineCoreCount();
m_uMinGuestCPU = properties.GetMinGuestCPUCount();
m_uMaxGuestCPU = qMin(2 * hostCPUs, (uint)properties.GetMaxGuestCPUCount());
m_uMinGuestCPUExecCap = 1;
diff --git a/src/VBox/Frontends/VirtualBox/src/widgets/UIApplianceEditorWidget.cpp b/src/VBox/Frontends/VirtualBox/src/widgets/UIApplianceEditorWidget.cpp
index a2bc27e..c898772 100644
--- a/src/VBox/Frontends/VirtualBox/src/widgets/UIApplianceEditorWidget.cpp
+++ b/src/VBox/Frontends/VirtualBox/src/widgets/UIApplianceEditorWidget.cpp
@@ -945,6 +945,10 @@ QWidget *VirtualSystemDelegate::createEditor(QWidget *pParent, const QStyleOptio
ModelItem *item = static_cast<ModelItem*>(index.internalPointer());
QWidget *editor = item->createEditor(pParent, styleOption, index);
+ /* Allow UILineTextEdit to commit data early: */
+ if (editor && qobject_cast<UILineTextEdit*>(editor))
+ connect(editor, SIGNAL(sigFinished(QWidget*)), this, SIGNAL(commitData(QWidget*)));
+
if (editor == NULL)
return QItemDelegate::createEditor(pParent, styleOption, index);
else
diff --git a/src/VBox/Frontends/VirtualBox/src/widgets/UILineTextEdit.cpp b/src/VBox/Frontends/VirtualBox/src/widgets/UILineTextEdit.cpp
index 4608f8a..bc1bb53 100644
--- a/src/VBox/Frontends/VirtualBox/src/widgets/UILineTextEdit.cpp
+++ b/src/VBox/Frontends/VirtualBox/src/widgets/UILineTextEdit.cpp
@@ -118,6 +118,10 @@ void UILineTextEdit::edit()
UITextEditor te(this);
te.setText(m_strText);
if (te.exec() == QDialog::Accepted)
+ {
m_strText = te.text();
+ /* Notify listener(s) about we finished: */
+ emit sigFinished(this);
+ }
}
diff --git a/src/VBox/Frontends/VirtualBox/src/widgets/UILineTextEdit.h b/src/VBox/Frontends/VirtualBox/src/widgets/UILineTextEdit.h
index 99d2c57..eac628f 100644
--- a/src/VBox/Frontends/VirtualBox/src/widgets/UILineTextEdit.h
+++ b/src/VBox/Frontends/VirtualBox/src/widgets/UILineTextEdit.h
@@ -63,6 +63,11 @@ class UILineTextEdit: public QIWithRetranslateUI<QPushButton>
{
Q_OBJECT;
+signals:
+
+ /* Notifier: Editing stuff: */
+ void sigFinished(QWidget *pThis);
+
public:
UILineTextEdit(QWidget *pParent = NULL);
diff --git a/src/VBox/Frontends/VirtualBox/src/widgets/VBoxMediaComboBox.cpp b/src/VBox/Frontends/VirtualBox/src/widgets/VBoxMediaComboBox.cpp
index a04658a..98edb9a 100644
--- a/src/VBox/Frontends/VirtualBox/src/widgets/VBoxMediaComboBox.cpp
+++ b/src/VBox/Frontends/VirtualBox/src/widgets/VBoxMediaComboBox.cpp
@@ -43,8 +43,6 @@ VBoxMediaComboBox::VBoxMediaComboBox (QWidget *aParent)
/* Setup medium-processing handlers: */
connect(&vboxGlobal(), SIGNAL(sigMediumCreated(const QString&)),
this, SLOT(sltHandleMediumCreated(const QString&)));
- connect(&vboxGlobal(), SIGNAL(sigMediumUpdated(const QString&)),
- this, SLOT(sltHandleMediumUpdated(const QString&)));
connect(&vboxGlobal(), SIGNAL(sigMediumDeleted(const QString&)),
this, SLOT(sltHandleMediumDeleted(const QString&)));
@@ -52,7 +50,7 @@ VBoxMediaComboBox::VBoxMediaComboBox (QWidget *aParent)
connect(&vboxGlobal(), SIGNAL(sigMediumEnumerationStarted()),
this, SLOT(sltHandleMediumEnumerationStart()));
connect(&vboxGlobal(), SIGNAL(sigMediumEnumerated(const QString&)),
- this, SLOT(sltHandleMediumUpdated(const QString&)));
+ this, SLOT(sltHandleMediumEnumerated(const QString&)));
/* Setup other connections */
connect (this, SIGNAL (activated (int)),
@@ -193,7 +191,7 @@ void VBoxMediaComboBox::sltHandleMediumCreated(const QString &strMediumID)
QComboBox::setCurrentIndex(count() - 1);
}
-void VBoxMediaComboBox::sltHandleMediumUpdated(const QString &strMediumID)
+void VBoxMediaComboBox::sltHandleMediumEnumerated(const QString &strMediumID)
{
/* Search for corresponding medium: */
UIMedium medium = vboxGlobal().medium(strMediumID);
diff --git a/src/VBox/Frontends/VirtualBox/src/widgets/VBoxMediaComboBox.h b/src/VBox/Frontends/VirtualBox/src/widgets/VBoxMediaComboBox.h
index 6c48ca2..e8f4569 100644
--- a/src/VBox/Frontends/VirtualBox/src/widgets/VBoxMediaComboBox.h
+++ b/src/VBox/Frontends/VirtualBox/src/widgets/VBoxMediaComboBox.h
@@ -53,7 +53,7 @@ protected slots:
/* Handlers: Medium-processing stuff: */
void sltHandleMediumCreated(const QString &strMediumID);
- void sltHandleMediumUpdated(const QString &strMediumID);
+ void sltHandleMediumEnumerated(const QString &strMediumID);
void sltHandleMediumDeleted(const QString &strMediumID);
/* Handler: Medium-enumeration stuff: */
diff --git a/src/VBox/HostDrivers/Support/SUPDrv.c b/src/VBox/HostDrivers/Support/SUPDrv.c
index 256f6b2..b9e7ceb 100644
--- a/src/VBox/HostDrivers/Support/SUPDrv.c
+++ b/src/VBox/HostDrivers/Support/SUPDrv.c
@@ -137,6 +137,7 @@ static void supdrvGipUpdate(PSUPDRVDEVEXT pDevExt, uint64_t u64N
static void supdrvGipUpdatePerCpu(PSUPDRVDEVEXT pDevExt, uint64_t u64NanoTS, uint64_t u64TSC,
RTCPUID idCpu, uint8_t idApic, uint64_t iTick);
static void supdrvGipInitCpu(PSUPGLOBALINFOPAGE pGip, PSUPGIPCPU pCpu, uint64_t u64NanoTS);
+static int supdrvIOCtl_ResumeSuspendedKbds(void);
/*******************************************************************************
@@ -1890,6 +1891,15 @@ static int supdrvIOCtlInnerUnrestricted(uintptr_t uIOCtl, PSUPDRVDEVEXT pDevExt,
return 0;
}
+ case SUP_CTL_CODE_NO_SIZE(SUP_IOCTL_RESUME_SUSPENDED_KBDS):
+ {
+ /* validate */
+ REQ_CHECK_SIZES(SUP_IOCTL_RESUME_SUSPENDED_KBDS);
+
+ pReqHdr->rc = supdrvIOCtl_ResumeSuspendedKbds();
+ return 0;
+ }
+
default:
Log(("Unknown IOCTL %#lx\n", (long)uIOCtl));
break;
@@ -3383,6 +3393,9 @@ SUPR0DECL(void) SUPR0ResumeVTxOnCpu(bool fSuspended)
*/
SUPR0DECL(int) SUPR0QueryVTCaps(PSUPDRVSESSION pSession, uint32_t *pfCaps)
{
+ int rc = VERR_UNSUPPORTED_CPU;
+ RTTHREADPREEMPTSTATE PreemptState = RTTHREADPREEMPTSTATE_INITIALIZER;
+
/*
* Input validation.
*/
@@ -3390,10 +3403,8 @@ SUPR0DECL(int) SUPR0QueryVTCaps(PSUPDRVSESSION pSession, uint32_t *pfCaps)
AssertPtrReturn(pfCaps, VERR_INVALID_POINTER);
*pfCaps = 0;
-
- /** @todo r=ramshankar: Although we're only reading CPUIDs/MSRs here which
- * should be identical on all CPUs on the system, it's probably
- * cleaner to prevent migration nonetheless? */
+ /* We may modify MSRs and re-read them, disable preemption so we make sure we don't migrate CPUs. */
+ RTThreadPreemptDisable(&PreemptState);
if (ASMHasCpuId())
{
uint32_t fFeaturesECX, fFeaturesEDX, uDummy;
@@ -3421,7 +3432,6 @@ SUPR0DECL(int) SUPR0QueryVTCaps(PSUPDRVSESSION pSession, uint32_t *pfCaps)
bool fVmxAllowed = RT_BOOL(u64FeatMsr & MSR_IA32_FEATURE_CONTROL_VMXON);
/* Check if the LOCK bit is set but excludes the required VMXON bit. */
- int rc = VERR_HM_IPE_1;
if (fMsrLocked)
{
if (fInSmxMode && !fSmxVmxAllowed)
@@ -3471,15 +3481,13 @@ SUPR0DECL(int) SUPR0QueryVTCaps(PSUPDRVSESSION pSession, uint32_t *pfCaps)
if (vtCaps.n.allowed1 & VMX_VMCS_CTRL_PROC_EXEC2_EPT)
*pfCaps |= SUPVTCAPS_NESTED_PAGING;
}
- return VINF_SUCCESS;
}
- return rc;
}
- return VERR_VMX_NO_VMX;
+ else
+ rc = VERR_VMX_NO_VMX;
}
-
- if ( ASMIsAmdCpuEx(uVendorEBX, uVendorECX, uVendorEDX)
- && ASMIsValidStdRange(uMaxId))
+ else if ( ASMIsAmdCpuEx(uVendorEBX, uVendorECX, uVendorEDX)
+ && ASMIsValidStdRange(uMaxId))
{
uint32_t fExtFeaturesEcx, uExtMaxId;
ASMCpuId(0x80000000, &uExtMaxId, &uDummy, &uDummy, &uDummy);
@@ -3503,15 +3511,18 @@ SUPR0DECL(int) SUPR0QueryVTCaps(PSUPDRVSESSION pSession, uint32_t *pfCaps)
if (fSvmFeatures & AMD_CPUID_SVM_FEATURE_EDX_NESTED_PAGING)
*pfCaps |= SUPVTCAPS_NESTED_PAGING;
- return VINF_SUCCESS;
+ rc = VINF_SUCCESS;
}
- return VERR_SVM_DISABLED;
+ else
+ rc = VERR_SVM_DISABLED;
}
- return VERR_SVM_NO_SVM;
+ else
+ rc = VERR_SVM_NO_SVM;
}
}
- return VERR_UNSUPPORTED_CPU;
+ RTThreadPreemptRestore(&PreemptState);
+ return rc;
}
@@ -6065,3 +6076,18 @@ static void supdrvGipUpdatePerCpu(PSUPDRVDEVEXT pDevExt, uint64_t u64NanoTS, uin
}
}
+/**
+ * Resume built-in keyboard on MacBook Air and Pro hosts.
+ * If there is no built-in keyboard device, return success anyway.
+ *
+ * @returns 0 on Mac OS X platform, VERR_NOT_IMPLEMENTED on the other ones.
+ */
+static int supdrvIOCtl_ResumeSuspendedKbds(void)
+{
+#if defined(RT_OS_DARWIN)
+ return supdrvDarwinResumeSuspendedKbds();
+#else
+ return VERR_NOT_IMPLEMENTED;
+#endif
+}
+
diff --git a/src/VBox/HostDrivers/Support/SUPDrvIOC.h b/src/VBox/HostDrivers/Support/SUPDrvIOC.h
index bbcb19e..6d19ebc 100644
--- a/src/VBox/HostDrivers/Support/SUPDrvIOC.h
+++ b/src/VBox/HostDrivers/Support/SUPDrvIOC.h
@@ -1,4 +1,4 @@
-/* $Revision: 83575 $ */
+/* $Revision: 91386 $ */
/** @file
* VirtualBox Support Driver - IOCtl definitions.
*/
@@ -193,7 +193,7 @@ typedef SUPREQHDR *PSUPREQHDR;
* @todo Pending work on next major version change:
* - Remove RTSpinlockReleaseNoInts.
*/
-#define SUPDRV_IOC_VERSION 0x001a0005
+#define SUPDRV_IOC_VERSION 0x001a0007
/** SUP_IOCTL_COOKIE. */
typedef struct SUPCOOKIE
@@ -1332,6 +1332,18 @@ typedef struct SUPTRACERUMODFIREPROBE
/** @} */
+/** @name SUP_IOCTL_RESUME_SUSPENDED_KBDS
+ * Resume suspended keyboard devices if any found in the system.
+ *
+ * @{
+ */
+#define SUP_IOCTL_RESUME_SUSPENDED_KBDS SUP_CTL_CODE_SIZE(35, SUP_IOCTL_RESUME_SUSPENDED_KBDS_SIZE)
+#define SUP_IOCTL_RESUME_SUSPENDED_KBDS_SIZE sizeof(SUPREQHDR)
+#define SUP_IOCTL_RESUME_SUSPENDED_KBDS_SIZE_IN sizeof(SUPREQHDR)
+#define SUP_IOCTL_RESUME_SUSPENDED_KBDS_SIZE_OUT sizeof(SUPREQHDR)
+/** @} */
+
+
#pragma pack() /* paranoia */
#endif
diff --git a/src/VBox/HostDrivers/Support/SUPDrvInternal.h b/src/VBox/HostDrivers/Support/SUPDrvInternal.h
index cdef505..cca6c30 100644
--- a/src/VBox/HostDrivers/Support/SUPDrvInternal.h
+++ b/src/VBox/HostDrivers/Support/SUPDrvInternal.h
@@ -684,6 +684,11 @@ int VBOXCALL supdrvOSLdrLoad(PSUPDRVDEVEXT pDevExt, PSUPDRVLDRIMAGE pImage, c
void VBOXCALL supdrvOSLdrUnload(PSUPDRVDEVEXT pDevExt, PSUPDRVLDRIMAGE pImage);
+#if defined(RT_OS_DARWIN)
+int VBOXCALL supdrvDarwinResumeSuspendedKbds(void);
+#endif
+
+
/*******************************************************************************
* Shared Functions *
*******************************************************************************/
diff --git a/src/VBox/HostDrivers/Support/SUPLib.cpp b/src/VBox/HostDrivers/Support/SUPLib.cpp
index 9b0d80d..d408bf2 100644
--- a/src/VBox/HostDrivers/Support/SUPLib.cpp
+++ b/src/VBox/HostDrivers/Support/SUPLib.cpp
@@ -2741,3 +2741,26 @@ DECLASM(void) suplibTracerFireProbe(PVTGPROBELOC pProbeLoc, PSUPTRACERUMODFIREPR
suplibOsIOCtl(&g_supLibData, SUP_IOCTL_TRACER_UMOD_FIRE_PROBE, pReq, SUP_IOCTL_TRACER_UMOD_FIRE_PROBE_SIZE);
}
+
+SUPR3DECL(int) SUPR3ResumeSuspendedKeyboards(void)
+{
+#ifdef RT_OS_DARWIN
+ /*
+ * Issue IOCtl to the SUPDRV kernel module.
+ */
+ SUPREQHDR Req;
+ Req.u32Cookie = g_u32Cookie;
+ Req.u32SessionCookie= g_u32SessionCookie;
+ Req.cbIn = SUP_IOCTL_RESUME_SUSPENDED_KBDS_SIZE_IN;
+ Req.cbOut = SUP_IOCTL_RESUME_SUSPENDED_KBDS_SIZE_OUT;
+ Req.fFlags = SUPREQHDR_FLAGS_DEFAULT;
+ Req.rc = VERR_INTERNAL_ERROR;
+ int rc = suplibOsIOCtl(&g_supLibData, SUP_IOCTL_RESUME_SUSPENDED_KBDS, &Req, SUP_IOCTL_RESUME_SUSPENDED_KBDS_SIZE);
+ if (RT_SUCCESS(rc))
+ rc = Req.rc;
+ return rc;
+#else /* !RT_OS_DARWIN */
+ return VERR_NOT_SUPPORTED;
+#endif
+}
+
diff --git a/src/VBox/HostDrivers/Support/darwin/SUPDrv-darwin.cpp b/src/VBox/HostDrivers/Support/darwin/SUPDrv-darwin.cpp
index 66f8a39..33803bc 100644
--- a/src/VBox/HostDrivers/Support/darwin/SUPDrv-darwin.cpp
+++ b/src/VBox/HostDrivers/Support/darwin/SUPDrv-darwin.cpp
@@ -66,6 +66,9 @@
#include <IOKit/IOUserClient.h>
#include <IOKit/pwr_mgt/RootDomain.h>
#include <IOKit/IODeviceTreeSupport.h>
+#include <IOKit/usb/IOUSBHIDDriver.h>
+#include <IOKit/bluetooth/IOBluetoothHIDDriver.h>
+#include <IOKit/bluetooth/IOBluetoothHIDDriverTypes.h>
#ifdef VBOX_WITH_HOST_VMX
# include <libkern/version.h>
@@ -943,6 +946,72 @@ void VBOXCALL supdrvOSLdrUnload(PSUPDRVDEVEXT pDevExt, PSUPDRVLDRIMAGE pImage)
/**
+ * Resume Bluetooth keyboard.
+ * If there is no Bluetooth keyboard device connected to the system we just ignore this.
+ */
+static void supdrvDarwinResumeBluetoothKbd(void)
+{
+ OSDictionary *pDictionary = IOService::serviceMatching("AppleBluetoothHIDKeyboard");
+ if (pDictionary)
+ {
+ OSIterator *pIter;
+ IOBluetoothHIDDriver *pDriver;
+
+ pIter = IOService::getMatchingServices(pDictionary);
+ if (pIter)
+ {
+ while ((pDriver = (IOBluetoothHIDDriver *)pIter->getNextObject()))
+ if (pDriver->isKeyboard())
+ (void)pDriver->hidControl(IOBTHID_CONTROL_EXIT_SUSPEND);
+
+ pIter->release();
+ }
+ pDictionary->release();
+ }
+}
+
+/**
+ * Resume built-in keyboard on MacBook Air and Pro hosts.
+ * If there is no built-in keyboard device attached to the system we just ignore this.
+ */
+static void supdrvDarwinResumeBuiltinKbd(void)
+{
+ /*
+ * AppleUSBTCKeyboard KEXT is responsible for built-in keyboard management.
+ * We resume keyboard by accessing to its IOService. */
+ OSDictionary *pDictionary = IOService::serviceMatching("AppleUSBTCKeyboard");
+ if (pDictionary)
+ {
+ OSIterator *pIter;
+ IOUSBHIDDriver *pDriver;
+
+ pIter = IOService::getMatchingServices(pDictionary);
+ if (pIter)
+ {
+ while ((pDriver = (IOUSBHIDDriver *)pIter->getNextObject()))
+ if (pDriver->IsPortSuspended())
+ pDriver->SuspendPort(false, 0);
+
+ pIter->release();
+ }
+ pDictionary->release();
+ }
+}
+
+
+/**
+ * Resume suspended keyboard devices (if any).
+ */
+int VBOXCALL supdrvDarwinResumeSuspendedKbds(void)
+{
+ supdrvDarwinResumeBuiltinKbd();
+ supdrvDarwinResumeBluetoothKbd();
+
+ return 0;
+}
+
+
+/**
* Converts an IPRT error code to a darwin error code.
*
* @returns corresponding darwin error code.
diff --git a/src/VBox/HostDrivers/Support/darwin/load.sh b/src/VBox/HostDrivers/Support/darwin/load.sh
new file mode 100755
index 0000000..d7ba333
--- /dev/null
+++ b/src/VBox/HostDrivers/Support/darwin/load.sh
@@ -0,0 +1,154 @@
+#!/bin/bash
+# $Id: load.sh $
+## @file
+# For development.
+#
+
+#
+# Copyright (C) 2006-2010 Oracle Corporation
+#
+# This file is part of VirtualBox Open Source Edition (OSE), as
+# available from http://www.virtualbox.org. This file is free software;
+# you can redistribute it and/or modify it under the terms of the GNU
+# General Public License (GPL) as published by the Free Software
+# Foundation, in version 2 as it comes in the "COPYING" file of the
+# VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+# hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+#
+# The contents of this file may alternatively be used under the terms
+# of the Common Development and Distribution License Version 1.0
+# (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+# VirtualBox OSE distribution, in which case the provisions of the
+# CDDL are applicable instead of those of the GPL.
+#
+# You may elect to license modified versions of this file under the
+# terms and conditions of either the GPL or the CDDL or both.
+#
+
+XNU_VERSION=`LC_ALL=C uname -r | LC_ALL=C cut -d . -f 1`
+DRVNAME="VBoxDrv.kext"
+BUNDLE="org.virtualbox.kext.VBoxDrv"
+
+DIR=`dirname "$0"`
+DIR=`cd "$DIR" && pwd`
+DIR="$DIR/$DRVNAME"
+if [ ! -d "$DIR" ]; then
+ echo "Cannot find $DIR or it's not a directory..."
+ exit 1;
+fi
+if [ -n "$*" ]; then
+ OPTS="$*"
+else
+ OPTS="-t"
+fi
+
+# Make sure VBoxUSB is unloaded as it might be using symbols from us.
+LOADED=`kextstat -b org.virtualbox.kext.VBoxUSB -l`
+if test -n "$LOADED"; then
+ echo "load.sh: Unloading org.virtualbox.kext.VBoxUSB..."
+ sudo kextunload -v 6 -b org.virtualbox.kext.VBoxUSB
+ LOADED=`kextstat -b org.virtualbox.kext.VBoxUSB -l`
+ if test -n "$LOADED"; then
+ echo "load.sh: failed to unload org.virtualbox.kext.VBoxUSB, see above..."
+ exit 1;
+ fi
+ echo "load.sh: Successfully unloaded org.virtualbox.kext.VBoxUSB"
+fi
+
+# Make sure VBoxNetFlt is unloaded as it might be using symbols from us.
+LOADED=`kextstat -b org.virtualbox.kext.VBoxNetFlt -l`
+if test -n "$LOADED"; then
+ echo "load.sh: Unloading org.virtualbox.kext.VBoxNetFlt..."
+ sudo kextunload -v 6 -b org.virtualbox.kext.VBoxNetFlt
+ LOADED=`kextstat -b org.virtualbox.kext.VBoxNetFlt -l`
+ if test -n "$LOADED"; then
+ echo "load.sh: failed to unload org.virtualbox.kext.VBoxNetFlt, see above..."
+ exit 1;
+ fi
+ echo "load.sh: Successfully unloaded org.virtualbox.kext.VBoxNetFlt"
+fi
+
+# Make sure VBoxNetAdp is unloaded as it might be using symbols from us.
+LOADED=`kextstat -b org.virtualbox.kext.VBoxNetAdp -l`
+if test -n "$LOADED"; then
+ echo "load.sh: Unloading org.virtualbox.kext.VBoxNetAdp..."
+ sudo kextunload -v 6 -b org.virtualbox.kext.VBoxNetAdp
+ LOADED=`kextstat -b org.virtualbox.kext.VBoxNetAdp -l`
+ if test -n "$LOADED"; then
+ echo "load.sh: failed to unload org.virtualbox.kext.VBoxNetAdp, see above..."
+ exit 1;
+ fi
+ echo "load.sh: Successfully unloaded org.virtualbox.kext.VBoxNetAdp"
+fi
+
+# Try unload any existing instance first.
+LOADED=`kextstat -b $BUNDLE -l`
+if test -n "$LOADED"; then
+ echo "load.sh: Unloading $BUNDLE..."
+ sudo kextunload -v 6 -b $BUNDLE
+ LOADED=`kextstat -b $BUNDLE -l`
+ if test -n "$LOADED"; then
+ echo "load.sh: failed to unload $BUNDLE, see above..."
+ exit 1;
+ fi
+ echo "load.sh: Successfully unloaded $BUNDLE"
+fi
+
+set -e
+
+# Copy the .kext to the symbols directory and tweak the kextload options.
+if test -n "$VBOX_DARWIN_SYMS"; then
+ echo "load.sh: copying the extension the symbol area..."
+ rm -Rf "$VBOX_DARWIN_SYMS/$DRVNAME"
+ mkdir -p "$VBOX_DARWIN_SYMS"
+ cp -R "$DIR" "$VBOX_DARWIN_SYMS/"
+ OPTS="$OPTS -s $VBOX_DARWIN_SYMS/ "
+ sync
+fi
+
+trap "sudo chown -R `whoami` $DIR; exit 1" INT
+trap "sudo chown -R `whoami` $DIR; exit 1" ERR
+# On smbfs, this might succeed just fine but make no actual changes,
+# so we might have to temporarily copy the driver to a local directory.
+if sudo chown -R root:wheel "$DIR"; then
+ OWNER=`/usr/bin/stat -f "%u" "$DIR"`
+else
+ OWNER=1000
+fi
+if test "$OWNER" -ne 0; then
+ TMP_DIR=/tmp/loaddrv.tmp
+ echo "load.sh: chown didn't work on $DIR, using temp location $TMP_DIR/$DRVNAME"
+
+ # clean up first (no sudo rm)
+ if test -e "$TMP_DIR"; then
+ sudo chown -R `whoami` "$TMP_DIR"
+ rm -Rf "$TMP_DIR"
+ fi
+
+ # make a copy and switch over DIR
+ mkdir -p "$TMP_DIR/"
+ sudo cp -Rp "$DIR" "$TMP_DIR/"
+ DIR="$TMP_DIR/$DRVNAME"
+
+ # retry
+ sudo chown -R root:wheel "$DIR"
+fi
+sudo chmod -R o-rwx "$DIR"
+sync
+echo "load.sh: loading $DIR..."
+
+if [ "$XNU_VERSION" -ge "10" ]; then
+ echo "${SCRIPT_NAME}.sh: loading $DIR... (kextutil $OPTS \"$DIR\")"
+ sudo kextutil $OPTS "$DIR"
+else
+ sudo kextload $OPTS "$DIR"
+fi
+sync
+sudo chown -R `whoami` "$DIR"
+#sudo chmod 666 /dev/vboxdrv
+kextstat | grep org.virtualbox.kext
+if [ -n "${VBOX_DARWIN_SYMS}" -a "$XNU_VERSION" -ge "10" ]; then
+ dsymutil -o "${VBOX_DARWIN_SYMS}/${DRVNAME}.dSYM" "${DIR}/Contents/MacOS/`basename -s .kext ${DRVNAME}`"
+ sync
+fi
+
diff --git a/src/VBox/HostDrivers/Support/freebsd/SUPDrv-freebsd.c b/src/VBox/HostDrivers/Support/freebsd/SUPDrv-freebsd.c
index e437cd3..f0166b9 100644
--- a/src/VBox/HostDrivers/Support/freebsd/SUPDrv-freebsd.c
+++ b/src/VBox/HostDrivers/Support/freebsd/SUPDrv-freebsd.c
@@ -291,7 +291,7 @@ static void VBoxDrvFreeBSDDtr(void *pData)
/*
* Close the session.
*/
- supdrvSessionRelease(&g_VBoxDrvFreeBSDDevExt, pSession);
+ supdrvSessionRelease(pSession);
ASMAtomicDecU32(&g_cUsers);
}
diff --git a/src/VBox/HostDrivers/Support/solaris/SUPLib-solaris.cpp b/src/VBox/HostDrivers/Support/solaris/SUPLib-solaris.cpp
index a65055f..602854f 100644
--- a/src/VBox/HostDrivers/Support/solaris/SUPLib-solaris.cpp
+++ b/src/VBox/HostDrivers/Support/solaris/SUPLib-solaris.cpp
@@ -52,6 +52,7 @@
#include <sys/fcntl.h>
#include <sys/ioctl.h>
+#include <sys/zone.h>
#include <fcntl.h>
#include <errno.h>
@@ -59,15 +60,20 @@
#include <sys/mman.h>
#include <stdlib.h>
#include <stdio.h>
+#include <zone.h>
/*******************************************************************************
* Defined Constants And Macros *
*******************************************************************************/
/** Solaris device link - system. */
-#define DEVICE_NAME_SYS "/devices/pseudo/vboxdrv at 0:vboxdrv"
+#define DEVICE_NAME_SYS "/devices/pseudo/vboxdrv at 0:vboxdrv"
/** Solaris device link - user. */
-#define DEVICE_NAME_USR "/devices/pseudo/vboxdrv at 0:vboxdrvu"
+#define DEVICE_NAME_USR "/devices/pseudo/vboxdrv at 0:vboxdrvu"
+/** Solaris device link - system (non-global zone). */
+#define DEVICE_NAME_SYS_ZONE "/dev/vboxdrv"
+/** Solaris device link - user (non-global zone). */
+#define DEVICE_NAME_USR_ZONE "/dev/vboxdrvu"
@@ -103,7 +109,11 @@ int suplibOsInit(PSUPLIBDATA pThis, bool fPreInited, bool fUnrestricted)
/*
* Try to open the device.
*/
- const char *pszDeviceNm = fUnrestricted ? DEVICE_NAME_SYS : DEVICE_NAME_USR;
+ const char *pszDeviceNm;
+ if (getzoneid() == GLOBAL_ZONEID)
+ pszDeviceNm = fUnrestricted ? DEVICE_NAME_SYS : DEVICE_NAME_USR;
+ else
+ pszDeviceNm = fUnrestricted ? DEVICE_NAME_SYS_ZONE : DEVICE_NAME_USR_ZONE;
int hDevice = open(pszDeviceNm, O_RDWR, 0);
if (hDevice < 0)
{
diff --git a/src/VBox/HostDrivers/VBoxNetAdp/darwin/VBoxNetAdp-darwin.cpp b/src/VBox/HostDrivers/VBoxNetAdp/darwin/VBoxNetAdp-darwin.cpp
index ad8c06a..5bebdbe 100644
--- a/src/VBox/HostDrivers/VBoxNetAdp/darwin/VBoxNetAdp-darwin.cpp
+++ b/src/VBox/HostDrivers/VBoxNetAdp/darwin/VBoxNetAdp-darwin.cpp
@@ -232,6 +232,58 @@ static errno_t vboxNetAdpDarwinBpfSend(ifnet_t pIface, u_int32_t uLinkType, mbuf
return 0;
}
+
+/**
+ * Constructs and submits a dummy packet to ifnet_input(). This is a workaround
+ * for "stuck dock icon" issue. When the first packet goes through the interface
+ * DLIL grabs a reference to the thread that submits the packet and holds it
+ * until the interface is destroyed. By submitting this dummy we make DLIL grab
+ * the thread of a non-GUI process.
+ *
+ * Most of this function was copied from vboxNetFltDarwinMBufFromSG().
+ *
+ * @returns VBox status code.
+ * @param pIfNet The interface that will hold the reference to the calling
+ * thread. We submit dummy as if it was coming from this interface.
+ */
+static int vboxNetSendDummy(ifnet_t pIfNet)
+{
+ int rc = 0;
+ size_t cbTotal = 50; /* No Ethernet header */
+ mbuf_how_t How = MBUF_WAITOK;
+
+ mbuf_t pPkt = NULL;
+ errno_t err = mbuf_allocpacket(How, cbTotal, NULL, &pPkt);
+ if (!err)
+ {
+ /* Skip zero sized memory buffers (paranoia). */
+ mbuf_t pCur = pPkt;
+ while (pCur && !mbuf_maxlen(pCur))
+ pCur = mbuf_next(pCur);
+ Assert(pCur);
+
+ /* Set the required packet header attributes. */
+ mbuf_pkthdr_setlen(pPkt, cbTotal);
+ mbuf_pkthdr_setheader(pPkt, mbuf_data(pCur));
+
+ mbuf_setlen(pCur, cbTotal);
+ memset(mbuf_data(pCur), 0, cbTotal);
+
+ mbuf_pkthdr_setrcvif(pPkt, pIfNet); /* will crash without this. */
+
+ errno_t err = ifnet_input(pIfNet, pPkt, NULL);
+ if (err)
+ {
+ rc = RTErrConvertFromErrno(err);
+ mbuf_freem(pPkt);
+ }
+ }
+ else
+ rc = RTErrConvertFromErrno(err);
+
+ return rc;
+}
+
int vboxNetAdpOsCreate(PVBOXNETADP pThis, PCRTMAC pMACAddress)
{
int rc;
@@ -294,6 +346,7 @@ int vboxNetAdpOsCreate(PVBOXNETADP pThis, PCRTMAC pMACAddress)
if (!err)
{
ifnet_set_mtu(pThis->u.s.pIface, VBOXNETADP_MTU);
+ vboxNetSendDummy(pThis->u.s.pIface);
return VINF_SUCCESS;
}
else
diff --git a/src/VBox/HostDrivers/VBoxUSB/darwin/USBLib-darwin.cpp b/src/VBox/HostDrivers/VBoxUSB/darwin/USBLib-darwin.cpp
index 2443eda..04324b9 100644
--- a/src/VBox/HostDrivers/VBoxUSB/darwin/USBLib-darwin.cpp
+++ b/src/VBox/HostDrivers/VBoxUSB/darwin/USBLib-darwin.cpp
@@ -4,7 +4,7 @@
*/
/*
- * Copyright (C) 2007-2010 Oracle Corporation
+ * Copyright (C) 2007-2013 Oracle Corporation
*
* This file is part of VirtualBox Open Source Edition (OSE), as
* available from http://www.virtualbox.org. This file is free software;
diff --git a/src/VBox/HostDrivers/VBoxUSB/darwin/VBoxUSB.cpp b/src/VBox/HostDrivers/VBoxUSB/darwin/VBoxUSB.cpp
index 580f4dc..a2a2aeb 100644
--- a/src/VBox/HostDrivers/VBoxUSB/darwin/VBoxUSB.cpp
+++ b/src/VBox/HostDrivers/VBoxUSB/darwin/VBoxUSB.cpp
@@ -8,7 +8,7 @@
*/
/*
- * Copyright (C) 2006-2010 Oracle Corporation
+ * Copyright (C) 2006-2013 Oracle Corporation
*
* This file is part of VirtualBox Open Source Edition (OSE), as
* available from http://www.virtualbox.org. This file is free software;
diff --git a/src/VBox/HostDrivers/VBoxUSB/darwin/VBoxUSBInterface.h b/src/VBox/HostDrivers/VBoxUSB/darwin/VBoxUSBInterface.h
index 2353043..eeeb6fd 100644
--- a/src/VBox/HostDrivers/VBoxUSB/darwin/VBoxUSBInterface.h
+++ b/src/VBox/HostDrivers/VBoxUSB/darwin/VBoxUSBInterface.h
@@ -4,7 +4,7 @@
*/
/*
- * Copyright (C) 2007-2010 Oracle Corporation
+ * Copyright (C) 2007-2013 Oracle Corporation
*
* This file is part of VirtualBox Open Source Edition (OSE), as
* available from http://www.virtualbox.org. This file is free software;
diff --git a/src/VBox/HostServices/SharedOpenGL/crserverlib/server_presenter.cpp b/src/VBox/HostServices/SharedOpenGL/crserverlib/server_presenter.cpp
index a3806a9..0c9354c 100644
--- a/src/VBox/HostServices/SharedOpenGL/crserverlib/server_presenter.cpp
+++ b/src/VBox/HostServices/SharedOpenGL/crserverlib/server_presenter.cpp
@@ -940,6 +940,7 @@ crServerDispatchVBoxTexPresent(GLuint texture, GLuint cfg, GLint xPos, GLint yPo
if (!pDisplay)
{
crWarning("crServerDisplayGet Failed");
+ CrDemEntryRelease(pEntry);
return;
}
}
@@ -967,13 +968,15 @@ crServerDispatchVBoxTexPresent(GLuint texture, GLuint cfg, GLint xPos, GLint yPo
if (!RT_SUCCESS(rc))
{
crWarning("CrDpEntryRegionsAdd Failed rc %d", rc);
+ /* no need to release anything, as CrDpEntryRegionsAdd would do everything for us as needed */
// if (pEntry)
// CrDemEntryRelease(pEntry);
- return;
}
}
else
{
+ if (pEntry)
+ CrDemEntryRelease(pEntry);
CrDpRegionsClear(pDisplay);
}
diff --git a/src/VBox/HostServices/SharedOpenGL/render/renderspu_cocoa_helper.m b/src/VBox/HostServices/SharedOpenGL/render/renderspu_cocoa_helper.m
index 7d69687..d28962b 100644
--- a/src/VBox/HostServices/SharedOpenGL/render/renderspu_cocoa_helper.m
+++ b/src/VBox/HostServices/SharedOpenGL/render/renderspu_cocoa_helper.m
@@ -949,20 +949,26 @@ static void vboxCtxLeave(PVBOX_CR_RENDER_CTX_INFO pCtxInfo)
NSRect newFrame = NSZeroRect;
DEBUG_MSG(("OVIW(%p): reshape\n", (void*)self));
-
- /* Getting the right screen coordinates of the parents frame is a little bit
- * complicated. */
+
parentFrame = [m_pParentView frame];
- parentPos = [[m_pParentView window] convertBaseToScreen:[[m_pParentView superview] convertPointToBase:NSMakePoint(parentFrame.origin.x, parentFrame.origin.y + parentFrame.size.height)]];
- parentFrame.origin.x = parentPos.x;
- parentFrame.origin.y = parentPos.y;
-
- /* Calculate the new screen coordinates of the overlay window. */
+ DEBUG_MSG(("FIXED parentFrame [%f:%f], [%f:%f]\n", parentFrame.origin.x, parentFrame.origin.y, parentFrame.size.width, parentFrame.size.height));
+ parentPos = parentFrame.origin;
+ parentPos.y += parentFrame.size.height;
+ DEBUG_MSG(("FIXED(view) parentPos [%f:%f]\n", parentPos.x, parentPos.y));
+ parentPos = [m_pParentView convertPoint:parentPos toView:nil];
+ DEBUG_MSG(("FIXED parentPos(win) [%f:%f]\n", parentPos.x, parentPos.y));
+ parentPos = [[m_pParentView window] convertBaseToScreen:parentPos];
+ DEBUG_MSG(("FIXED parentPos(screen) [%f:%f]\n", parentPos.x, parentPos.y));
+ parentFrame.origin = parentPos;
+
childPos = NSMakePoint(m_Pos.x, m_Pos.y + m_Size.height);
- childPos = [[m_pParentView window] convertBaseToScreen:[[m_pParentView superview] convertPointToBase:childPos]];
-
- /* Make a frame out of it. */
+ DEBUG_MSG(("FIXED(view) childPos [%f:%f]\n", childPos.x, childPos.y));
+ childPos = [m_pParentView convertPoint:childPos toView:nil];
+ DEBUG_MSG(("FIXED(win) childPos [%f:%f]\n", childPos.x, childPos.y));
+ childPos = [[m_pParentView window] convertBaseToScreen:childPos];
+ DEBUG_MSG(("FIXED childPos(screen) [%f:%f]\n", childPos.x, childPos.y));
childFrame = NSMakeRect(childPos.x, childPos.y, m_Size.width, m_Size.height);
+ DEBUG_MSG(("FIXED childFrame [%f:%f], [%f:%f]\n", childFrame.origin.x, childFrame.origin.y, childFrame.size.width, childFrame.size.height));
/* We have to make sure that the overlay window will not be displayed out
* of the parent window. So intersect both frames & use the result as the new
@@ -982,7 +988,7 @@ static void vboxCtxLeave(PVBOX_CR_RENDER_CTX_INFO pCtxInfo)
(void*)self,
newFrame.origin.x, newFrame.origin.y,
newFrame.size.width, newFrame.size.height));
-
+
/* Later we have to correct the texture position in the case the window is
* out of the parents window frame. So save the shift values for later use. */
m_RootRect.origin.x = newFrame.origin.x - childFrame.origin.x;
diff --git a/src/VBox/Installer/darwin/VBoxKEXTs/VirtualBoxStartup.sh b/src/VBox/Installer/darwin/VBoxKEXTs/VirtualBoxStartup.sh
index 624eb89..c132ccd 100755
--- a/src/VBox/Installer/darwin/VBoxKEXTs/VirtualBoxStartup.sh
+++ b/src/VBox/Installer/darwin/VBoxKEXTs/VirtualBoxStartup.sh
@@ -85,8 +85,8 @@ StartService()
VBOX_LINKNAME=`echo "$VBOX_TRG" | sed -e 's|-'"${VBOX_ARCH}"'$||' `
if test "$VBOX_LINKNAME" != "$VBOX_TRG"; then
rm -f "$VBOX_LINKNAME"
- if ! ln -vh "$VBOX_TRG" "$VBOX_LINKNAME"; then
- ConsoleMessage "Error: ln -vh $VBOX_TRG $VBOX_LINKNAME failed"
+ if ! /bin/ln -vh "$VBOX_TRG" "$VBOX_LINKNAME"; then
+ ConsoleMessage "Error: /bin/ln -vh $VBOX_TRG $VBOX_LINKNAME failed"
VBOX_RC=1
fi
else
diff --git a/src/VBox/Installer/darwin/VirtualBox/postflight b/src/VBox/Installer/darwin/VirtualBox/postflight
index e04cec5..5727131 100755
--- a/src/VBox/Installer/darwin/VirtualBox/postflight
+++ b/src/VBox/Installer/darwin/VirtualBox/postflight
@@ -33,7 +33,7 @@ do
exit 1;
fi
rm -f "$linkname"
- ln -vh "$trg" "$linkname"
+ /bin/ln -vh "$trg" "$linkname"
done
#
diff --git a/src/VBox/Installer/darwin/VirtualBox_mpkg/distribution.dist b/src/VBox/Installer/darwin/VirtualBox_mpkg/distribution.dist
index 34d43de..82cd329 100644
--- a/src/VBox/Installer/darwin/VirtualBox_mpkg/distribution.dist
+++ b/src/VBox/Installer/darwin/VirtualBox_mpkg/distribution.dist
@@ -55,7 +55,7 @@
{
/* Embedded scripts are not available here. So, just do a command
line checking for running VMs instead. */
- rcScript = system.run('/bin/sh', '-c', '/bin/ps -e | /usr/bin/grep -E "VirtualBoxVM.*startvm|VBoxNetDHCP|VBoxNetNAT" | /usr/bin/grep -qv grep');
+ rcScript = system.run('/bin/sh', '-c', '/bin/ps -e | /usr/bin/grep -E "VirtualBox.*startvm|VBoxNetDHCP|VBoxNetNAT|VBoxHeadless|VBoxSVC" | /usr/bin/grep -qv grep');
result = (rcScript != 0);
system.log("system.run /bin/sh .. returned: " + rcScript + " result=" + result);
} catch (e) { system.log(e); result = false; }
diff --git a/src/VBox/Installer/solaris/VBoxZoneAccess.c b/src/VBox/Installer/solaris/VBoxZoneAccess.c
index 5b07726..5ec8c30 100644
--- a/src/VBox/Installer/solaris/VBoxZoneAccess.c
+++ b/src/VBox/Installer/solaris/VBoxZoneAccess.c
@@ -30,11 +30,12 @@
* Defined Constants And Macros *
*******************************************************************************/
#define DEVICE_NAME "/devices/pseudo/vboxdrv at 0:vboxdrv"
-
+#define DEVICE_NAME_USR "/devices/pseudo/vboxdrv at 0:vboxdrvu"
int main(int argc, char *argv[])
{
int hDevice = -1;
+ int hDeviceUsr = -1;
/* Check root permissions. */
if (geteuid() != 0)
@@ -56,11 +57,22 @@ int main(int argc, char *argv[])
return errno;
}
+ /* Open the user device. */
+ hDeviceUsr = open(DEVICE_NAME_USR, O_RDWR, 0);
+ if (hDeviceUsr < 0)
+ {
+ fprintf(stderr, "Failed to open '%s'. errno=%d\n", DEVICE_NAME_USR, errno);
+ close(hDevice);
+ return errno;
+ }
+
/* Mark the file handle close on exec. */
- if (fcntl(hDevice, F_SETFD, FD_CLOEXEC) != 0)
+ if ( fcntl(hDevice, F_SETFD, FD_CLOEXEC) != 0
+ || fcntl(hDeviceUsr, F_SETFD, FD_CLOEXEC) != 0)
{
fprintf(stderr, "Failed to set close on exec. errno=%d\n", errno);
close(hDevice);
+ close(hDeviceUsr);
return errno;
}
@@ -69,6 +81,7 @@ int main(int argc, char *argv[])
sleep(500000000U);
close(hDevice);
+ close(hDeviceUsr);
return 0;
}
diff --git a/src/VBox/Installer/solaris/vboxconfig.sh b/src/VBox/Installer/solaris/vboxconfig.sh
index cea7af9..80e7ea6 100755
--- a/src/VBox/Installer/solaris/vboxconfig.sh
+++ b/src/VBox/Installer/solaris/vboxconfig.sh
@@ -618,11 +618,10 @@ install_drivers()
fi
## Add vboxdrv to devlink.tab (KEEP TABS!)
- # clean up devlink.tab (KEEP TABS!)
if test -f "$PKG_INSTALL_ROOT/etc/devlink.tab"; then
sed -e '/name=vboxdrv/d' -e '/name=vboxdrvu/d' "$PKG_INSTALL_ROOT/etc/devlink.tab" > "$PKG_INSTALL_ROOT/etc/devlink.vbox"
- #echo "type=ddi_pseudo;name=vboxdrv;minor=vboxdrv \D" >> "$PKG_INSTALL_ROOT/etc/devlink.vbox"
- #echo "type=ddi_pseudo;name=vboxdrv;minor=vboxdrvu \M0" >> "$PKG_INSTALL_ROOT/etc/devlink.vbox"
+ echo "type=ddi_pseudo;name=vboxdrv;minor=vboxdrv \D" >> "$PKG_INSTALL_ROOT/etc/devlink.vbox"
+ echo "type=ddi_pseudo;name=vboxdrv;minor=vboxdrvu \M0" >> "$PKG_INSTALL_ROOT/etc/devlink.vbox"
mv -f "$PKG_INSTALL_ROOT/etc/devlink.vbox" "$PKG_INSTALL_ROOT/etc/devlink.tab"
else
errorprint "Missing $PKG_INSTALL_ROOT/etc/devlink.tab, aborting install"
@@ -632,10 +631,10 @@ install_drivers()
# Create the device link for non-remote installs (not really relevant any more)
if test "$REMOTEINST" -eq 0; then
/usr/sbin/devfsadm -i "$MOD_VBOXDRV"
- #if test $? -ne 0 || test ! -h "/dev/vboxdrv" || test ! -h "/dev/vboxdrvu" ; then
- # errorprint "Failed to create device link for $MOD_VBOXDRV."
- # exit 1
- #fi
+ if test $? -ne 0 || test ! -h "/dev/vboxdrv" || test ! -h "/dev/vboxdrvu" ; then
+ errorprint "Failed to create device link for $MOD_VBOXDRV."
+ exit 1
+ fi
fi
# Load VBoxNetAdp
@@ -717,11 +716,11 @@ remove_drivers()
{
fatal=$1
- # Remove vboxdrv from devlink.tab
+ # Remove vboxdrv[u] from devlink.tab
if test -f "$PKG_INSTALL_ROOT/etc/devlink.tab"; then
devlinkfound=`cat "$PKG_INSTALL_ROOT/etc/devlink.tab" | grep vboxdrv`
if test -n "$devlinkfound"; then
- sed -e '/name=vboxdrv/d' "$PKG_INSTALL_ROOT/etc/devlink.tab" > "$PKG_INSTALL_ROOT/etc/devlink.vbox"
+ sed -e '/name=vboxdrv/d' -e '/name=vboxdrvu/d' "$PKG_INSTALL_ROOT/etc/devlink.tab" > "$PKG_INSTALL_ROOT/etc/devlink.vbox"
mv -f "$PKG_INSTALL_ROOT/etc/devlink.vbox" "$PKG_INSTALL_ROOT/etc/devlink.tab"
fi
diff --git a/src/VBox/Installer/win/NLS/de_DE.wxl b/src/VBox/Installer/win/NLS/de_DE.wxl
index a7d095f..8f666ba 100644
--- a/src/VBox/Installer/win/NLS/de_DE.wxl
+++ b/src/VBox/Installer/win/NLS/de_DE.wxl
@@ -119,6 +119,7 @@
<String Id="Customize2Dlg_Desc">Bitte unten die gewünschten Optionen auswählen:</String>
<String Id="Customize2Dlg_CreateShortcut">Verknüpfung auf dem Desktop anlegen</String>
<String Id="Customize2Dlg_CreateQuickLaunch">Verknüpfung in der Schnellstartleiste anlegen</String>
+ <String Id="Customize2Dlg_RegisterFileExtensions">Dateizuordnungen registrieren</String>
<!---->
diff --git a/src/VBox/Installer/win/NLS/en_US.wxl b/src/VBox/Installer/win/NLS/en_US.wxl
index dd7f128..8ffa834 100644
--- a/src/VBox/Installer/win/NLS/en_US.wxl
+++ b/src/VBox/Installer/win/NLS/en_US.wxl
@@ -123,6 +123,7 @@
<String Id="Customize2Dlg_Desc">Please choose from the options below:</String>
<String Id="Customize2Dlg_CreateShortcut">Create a shortcut on the desktop</String>
<String Id="Customize2Dlg_CreateQuickLaunch">Create a shortcut in the Quick Launch Bar</String>
+ <String Id="Customize2Dlg_RegisterFileExtensions">Register file associations</String>
<!---->
diff --git a/src/VBox/Installer/win/NLS/fa_IR.wxl b/src/VBox/Installer/win/NLS/fa_IR.wxl
index 59328ba..37b7f67 100644
--- a/src/VBox/Installer/win/NLS/fa_IR.wxl
+++ b/src/VBox/Installer/win/NLS/fa_IR.wxl
@@ -90,6 +90,7 @@
<String Id="Customize2Dlg_Desc">لطفاً از گزینه های زیر انتخاب کنید:</String>
<String Id="Customize2Dlg_CreateShortcut">ایجاد یک میانبر روی دسکتاپ</String>
<String Id="Customize2Dlg_CreateQuickLaunch">ایجاد یک میانبر در اِجرای سریع</String>
+ <String Id="Customize2Dlg_RegisterFileExtensions">ثبت نام انجمن فایل</String>
<!---->
<String Id="WarnDisconNetIfacesDlg_Title">هشدار:</String>
<String Id="WarnDisconNetIfacesDlg_Title2">رابط های شبکه</String>
diff --git a/src/VBox/Installer/win/NLS/fr_FR.wxl b/src/VBox/Installer/win/NLS/fr_FR.wxl
index d8b0f92..fa3d77f 100644
--- a/src/VBox/Installer/win/NLS/fr_FR.wxl
+++ b/src/VBox/Installer/win/NLS/fr_FR.wxl
@@ -117,6 +117,7 @@
<String Id="Customize2Dlg_Desc">Veuillez choisir une des options suivantes:</String>
<String Id="Customize2Dlg_CreateShortcut">Créer un raccourci sur le bureau</String>
<String Id="Customize2Dlg_CreateQuickLaunch">Créer un raccourci dans la barre de lancement rapide</String>
+ <String Id="Customize2Dlg_RegisterFileExtensions">Inscription des associations de fichiers</String>
<!---->
diff --git a/src/VBox/Installer/win/NLS/it_IT.wxl b/src/VBox/Installer/win/NLS/it_IT.wxl
index db71fda..98e6bc3 100644
--- a/src/VBox/Installer/win/NLS/it_IT.wxl
+++ b/src/VBox/Installer/win/NLS/it_IT.wxl
@@ -90,6 +90,7 @@
<String Id="Customize2Dlg_Desc">Scegli dalle opzioni seguenti:</String>
<String Id="Customize2Dlg_CreateShortcut">Crea una scorciatoia sul desktop</String>
<String Id="Customize2Dlg_CreateQuickLaunch">Crea una scorciatoia nella barra di avvio veloce</String>
+ <String Id="Customize2Dlg_RegisterFileExtensions">Registrati associazioni di file</String>
<!---->
<String Id="WarnDisconNetIfacesDlg_Title">Avviso:</String>
<String Id="WarnDisconNetIfacesDlg_Title2">Interfacce di rete</String>
diff --git a/src/VBox/Installer/win/NLS/zh_TW.wxl b/src/VBox/Installer/win/NLS/zh_TW.wxl
index b3b3c05..383a812 100644
--- a/src/VBox/Installer/win/NLS/zh_TW.wxl
+++ b/src/VBox/Installer/win/NLS/zh_TW.wxl
@@ -123,6 +123,7 @@
<String Id="Customize2Dlg_Desc">請選擇以下選項:</String>
<String Id="Customize2Dlg_CreateShortcut">在桌面建立捷徑</String>
<String Id="Customize2Dlg_CreateQuickLaunch">在快速啟動列建立捷徑</String>
+ <String Id="Customize2Dlg_RegisterFileExtensions">註冊文件關聯</String>
<!---->
diff --git a/src/VBox/Installer/win/UserInterface.wxi b/src/VBox/Installer/win/UserInterface.wxi
index a119059..9886bef 100644
--- a/src/VBox/Installer/win/UserInterface.wxi
+++ b/src/VBox/Installer/win/UserInterface.wxi
@@ -334,6 +334,10 @@
Property="INSTALLQUICKLAUNCHSHORTCUT" CheckBoxValue="1">
<Text>!(loc.Customize2Dlg_CreateQuickLaunch)</Text>
</Control>
+ <Control Id="RegisterFileExtensionsCheckBox" Type="CheckBox" X="25" Y="135" Width="200" Height="17"
+ Property="REGISTERFILEEXTENSIONS" CheckBoxValue="1">
+ <Text>!(loc.Customize2Dlg_RegisterFileExtensions)</Text>
+ </Control>
<Control Id="Next" Type="PushButton" X="236" Y="243" Width="56" Height="17"
Default="yes" Cancel="yes" Text="!(loc.ButtonText_Next)">
diff --git a/src/VBox/Installer/win/VirtualBox.wxs b/src/VBox/Installer/win/VirtualBox.wxs
index 57b8245..ea14897 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-2012 Oracle Corporation
+ Copyright (C) 2006-2013 Oracle Corporation
This file is part of VirtualBox Open Source Edition (OSE), as
available from http://www.virtualbox.org. This file is free software;
@@ -116,6 +116,7 @@
<Property Id="ARPURLUPDATEINFO">http://www.virtualbox.org</Property>
<Property Id="INSTALLDESKTOPSHORTCUT" Value="1"></Property>
<Property Id="INSTALLQUICKLAUNCHSHORTCUT" Value="1"></Property>
+ <Property Id="REGISTERFILEEXTENSIONS" Value="1"></Property>
<Property Id="STARTVBOX" Value="1"></Property>
<!-- Install the product for all users on the system -->
@@ -368,7 +369,7 @@
<!--
- <Component Id="Cp_StartMenuShortcut" Guid="1C137D24-E599-47BD-98D0-2F62F202A8EA" Win64="$(var.Property_Win64)">
+ <Component Id="cp_StartMenuShortcut" Guid="1C137D24-E599-47BD-98D0-2F62F202A8EA" Win64="$(var.Property_Win64)">
<RegistryValue Root="HKCU" Key="$(var.Property_RegKeyInstall)" Type="string"
Value="installed" KeyPath="yes" />
<Shortcut Id="ShortcutStartMenuVBox" Directory="ProgramMenuDir"
@@ -378,14 +379,8 @@
<!---->
- <!-- All Binaries, DLLs (except COM) and drivers are in one component because they belong together. Additional
- binaries e.g. test tools, utilities etc. should be in another component so they"re clearly separated. -->
- <Component Id="cp_MainBinaries" Guid="5C8FE57A-F744-4DE0-AA3F-A563F486AD98" Win64="$(var.Property_Win64)">
-
- <!-- Set required environment variables. -->
- <Environment Id="env_VBoxInstallDir" Action="set" Name="VBOX_INSTALL_PATH"
- System="yes" Part="last" Permanent="no" Value="[INSTALLDIR]" />
-
+ <Component Id="cp_RegisterExtensions" Guid="FEB8943E-5D60-4E2D-846F-458207019D40" Win64="$(var.Property_Win64)">
+ <Condition>REGISTERFILEEXTENSIONS</Condition>
<!-- Register file extensions. Note: Extension Id's *must not* be changed! These specify the actual
file extension to handle. Also, here would be the place to add more fancy DDE stuff later.
Important: The IDs in "IconIndex" *must* be matching "Resources\resource.h". -->
@@ -421,6 +416,15 @@
<ProgId Id="progId_VirtualBox.Shell.hdd" Description="Virtual Hard Disk" Icon="file_VBoxRes.dll" IconIndex="-306">
<Extension Id="hdd" ContentType="application/x-virtualbox-hdd" />
</ProgId>
+ </Component> <!-- RegisterExtensions -->
+
+ <!-- All Binaries, DLLs (except COM) and drivers are in one component because they belong together. Additional
+ binaries e.g. test tools, utilities etc. should be in another component so they"re clearly separated. -->
+ <Component Id="cp_MainBinaries" Guid="5C8FE57A-F744-4DE0-AA3F-A563F486AD98" Win64="$(var.Property_Win64)">
+
+ <!-- Set required environment variables. -->
+ <Environment Id="env_VBoxInstallDir" Action="set" Name="VBOX_INSTALL_PATH"
+ System="yes" Part="last" Permanent="no" Value="[INSTALLDIR]" />
<!-- Files -->
<?if $(env.VBOX_WITH_DOCS_PACKING) = "yes" ?>
@@ -700,6 +704,7 @@
<ComponentRef Id="cp_StartMenuVBox" />
<ComponentRef Id="cp_DesktopShortcut" />
<ComponentRef Id="cp_QuickLaunchVBox" />
+ <ComponentRef Id="cp_RegisterExtensions" />
<?if $(env.VBOX_WITH_DOCS_PACKING) = "yes" ?>
<ComponentRef Id="cp_Docs" />
@@ -817,7 +822,7 @@
<?if $(env.VBOX_WITH_NETFLT) = "yes" ?>
<!-- Create host-only interfaces on first-time install. -->
<Custom Action="ca_CreateHostOnlyInterfaceArgs" Before="ca_CreateHostOnlyInterface" ><![CDATA[&VBoxNetworkAdp=3]]></Custom>
- <Custom Action="ca_CreateHostOnlyInterface" Before="InstallFinalize" ><![CDATA[&VBoxNetworkAdp=3]]></Custom>
+ <Custom Action="ca_CreateHostOnlyInterface" Before="InstallFinalize" ><![CDATA[&VBoxNetworkAdp=3]]></Custom>
<!-- Don't remove the host-only interfaces on update, only on uninstall. -->
<Custom Action="ca_RemoveHostOnlyInterfaces" After="ca_UninstallNetFlt" ><![CDATA[(NOT UPGRADINGPRODUCTCODE) AND (REMOVE="ALL")]]></Custom>
<!-- First stop the existing host-only interfaces on update ... -->
diff --git a/src/VBox/Main/cbinding/Makefile.kmk b/src/VBox/Main/cbinding/Makefile.kmk
index 6bf0a0b..fb80762 100644
--- a/src/VBox/Main/cbinding/Makefile.kmk
+++ b/src/VBox/Main/cbinding/Makefile.kmk
@@ -29,7 +29,6 @@ XpComCSamples_INST = \
$(INST_SDK)bindings/xpcom/cbinding/samples/
XpComCSamples_SOURCES = \
tstXPCOMCGlue.c \
- tstXPCOMCEvent.c \
makefile.tstXPCOMCGlue=>Makefile
INSTALLS += XpComCGlue
@@ -118,22 +117,6 @@ if !defined(VBOX_ONLY_SDK) && defined(VBOX_WITH_XPCOM)
tstXPCOMCGlue.c
tstXPCOMCGlue_LIBS = \
$(VBoxXPCOMCGlue_1_TARGET)
-
- #
- # The event listener testcase.
- #
- PROGRAMS += tstXPCOMCEvent
- tstXPCOMCEvent_TEMPLATE = VBOXR3TSTEXE
- tstXPCOMCEvent_INCS = \
- $(VBOX_PATH_SDK)/bindings/xpcom/include \
- $(VBOX_PATH_SDK)/bindings/xpcom/cbinding
- tstXPCOMCEvent_INTERMEDIATES = \
- $(VBOX_PATH_SDK)/bindings/xpcom/cbinding/VBoxXPCOMCGlue.h \
- $(VBOX_PATH_SDK)/bindings/xpcom/include/VBoxCAPI_v$(VBOX_API_VERSION).h
- tstXPCOMCEvent_SOURCES = \
- tstXPCOMCEvent.c
- tstXPCOMCEvent_LIBS = \
- $(VBoxXPCOMCGlue_1_TARGET)
endif
endif # ! VBOX_ONLY_SDK
diff --git a/src/VBox/Main/cbinding/VBoxCAPI_v4_2.h b/src/VBox/Main/cbinding/VBoxCAPI_v4_2.h
index 61b6d65..1db8217 100644
--- a/src/VBox/Main/cbinding/VBoxCAPI_v4_2.h
+++ b/src/VBox/Main/cbinding/VBoxCAPI_v4_2.h
@@ -2858,11 +2858,11 @@ struct IVFSExplorer_vtbl
PRUint32 *aNamesSize,
PRUnichar *** aNames,
PRUint32 *aTypesSize,
- PRUint32* aTypes,
+ PRUint32** aTypes,
PRUint32 *aSizesSize,
- PRUint32* aSizes,
+ PRUint32** aSizes,
PRUint32 *aModesSize,
- PRUint32* aModes
+ PRUint32** aModes
);
nsresult (*Exists)(
@@ -2966,7 +2966,7 @@ struct IVirtualSystemDescription_vtbl
nsresult (*GetDescription)(
IVirtualSystemDescription *pThis,
PRUint32 *aTypesSize,
- PRUint32* aTypes,
+ PRUint32** aTypes,
PRUint32 *aRefsSize,
PRUnichar *** aRefs,
PRUint32 *aOvfValuesSize,
@@ -2981,7 +2981,7 @@ struct IVirtualSystemDescription_vtbl
IVirtualSystemDescription *pThis,
PRUint32 aType,
PRUint32 *aTypesSize,
- PRUint32* aTypes,
+ PRUint32** aTypes,
PRUint32 *aRefsSize,
PRUnichar *** aRefs,
PRUint32 *aOvfValuesSize,
@@ -3171,7 +3171,7 @@ struct IInternalMachineControl_vtbl
PRUint32 *valueSize,
PRUnichar *** value,
PRUint32 *timestampSize,
- PRInt64* timestamp,
+ PRInt64** timestamp,
PRUint32 *flagsSize,
PRUnichar *** flags
);
@@ -3905,7 +3905,7 @@ struct IMachine_vtbl
PRUint32 *valueSize,
PRUnichar *** value,
PRUint32 *timestampSize,
- PRInt64* timestamp,
+ PRInt64** timestamp,
PRUint32 *flagsSize,
PRUnichar *** flags
);
@@ -5408,7 +5408,7 @@ struct IGuest_vtbl
PRUint32 *formatSize,
PRUnichar *** format,
PRUint32 *allowedActionsSize,
- PRUint32* allowedActions,
+ PRUint32** allowedActions,
PRUint32 * defaultAction
);
@@ -5835,7 +5835,7 @@ struct IMediumFormat_vtbl
PRUint32 *extensionsSize,
PRUnichar *** extensions,
PRUint32 *typeSize,
- PRUint32* type
+ PRUint32** type
);
nsresult (*DescribeProperties)(
@@ -5845,9 +5845,9 @@ struct IMediumFormat_vtbl
PRUint32 *descriptionSize,
PRUnichar *** description,
PRUint32 *typesSize,
- PRUint32* types,
+ PRUint32** types,
PRUint32 *flagsSize,
- PRUint32* flags,
+ PRUint32** flags,
PRUint32 *defaultsSize,
PRUnichar *** defaults
);
@@ -6987,7 +6987,7 @@ struct IInternalSessionControl_vtbl
PRUint32 *valueSize,
PRUnichar *** value,
PRUint32 *timestampSize,
- PRInt64* timestamp,
+ PRInt64** timestamp,
PRUint32 *flagsSize,
PRUnichar *** flags
);
@@ -7206,17 +7206,17 @@ struct IPerformanceCollector_vtbl
PRUint32 *returnMetricNamesSize,
PRUnichar *** returnMetricNames,
PRUint32 *returnObjectsSize,
- nsISupports ** returnObjects,
+ nsISupports *** returnObjects,
PRUint32 *returnUnitsSize,
PRUnichar *** returnUnits,
PRUint32 *returnScalesSize,
- PRUint32* returnScales,
+ PRUint32** returnScales,
PRUint32 *returnSequenceNumbersSize,
- PRUint32* returnSequenceNumbers,
+ PRUint32** returnSequenceNumbers,
PRUint32 *returnDataIndicesSize,
- PRUint32* returnDataIndices,
+ PRUint32** returnDataIndices,
PRUint32 *returnDataLengthsSize,
- PRUint32* returnDataLengths,
+ PRUint32** returnDataLengths,
PRUint32 *returnDataSize,
PRInt32** returnData
);
@@ -8825,22 +8825,133 @@ typedef struct VBOXXPCOMC
/** The structure version. */
unsigned uVersion;
+ /** Gets the VirtualBox version, major * 1000000 + minor * 1000 + patch. */
unsigned int (*pfnGetVersion)(void);
+ /** Gets the VirtualBox API version, major * 1000 + minor, e.g. 4003. */
+ unsigned int (*pfnGetAPIVersion)(void);
+
+ /**
+ * New and preferred way to initialize the C bindings for an API client.
+ *
+ * This way is much more flexible, as it can easily handle multiple
+ * sessions (important with more complicated API clients, including
+ * multithreaded ones), and even VBoxSVC crashes can be detected and
+ * processed appropriately by listening for events from the associated
+ * event source in VirtualBoxClient. It is completely up to the client
+ * to decide what to do (terminate or continue after getting new
+ * object references to server-side objects). Must be called in the
+ * primary thread of the client, later API use can be done in any
+ * thread.
+ *
+ * Note that the returned reference is owned by the caller, and thus it's
+ * the caller's responsibility to handle the reference count appropriately.
+ *
+ * @param pszVirtualBoxClientIID pass IVIRTUALBOXCLIENT_IID_STR
+ * @param ppVirtualBoxClient output parameter for VirtualBoxClient
+ * reference, handled as usual with XPCOM.
+ * @returns XPCOM error code
+ */
+ nsresult (*pfnClientInitialize)(const char *pszVirtualBoxClientIID,
+ IVirtualBoxClient **ppVirtualBoxClient);
+ /**
+ * Uninitialize the C bindings for an API client.
+ *
+ * Should be called when the API client is about to terminate and does
+ * not want to use the C bindings any more. It will invalidate all
+ * object references. It is possible, however, to change one's mind,
+ * and call pfnClientInitialize again to continue using the API, as long
+ * as none of the object references from before the re-initialization
+ * are used. Must be called from the primary thread of the client.
+ */
+ void (*pfnClientUninitialize)(void);
+
+ /**
+ * Deprecated way to initialize the C bindings and getting important
+ * object references. Kept for backwards compatibility.
+ *
+ * If any returned reference is NULL then the initialization failed.
+ * Note that the returned references are owned by the C bindings. The
+ * number of calls to Release in the client code must match the number
+ * of calls to AddRef, and additionally at no point in time there can
+ * be more Release calls than AddRef calls.
+ *
+ * @param pszVirtualBoxIID pass IVIRTUALBOX_IID_STR
+ * @param ppVirtualBox output parameter for VirtualBox reference,
+ * owned by C bindings
+ * @param pszSessionIID pass ISESSION_IID_STR
+ * @param ppSession output parameter for Session reference,
+ * owned by C bindings
+ */
void (*pfnComInitialize)(const char *pszVirtualBoxIID,
IVirtualBox **ppVirtualBox,
const char *pszSessionIID,
ISession **ppSession);
+ /**
+ * Deprecated way to uninitialize the C bindings for an API client.
+ * Kept for backwards compatibility and must be used if the C bindings
+ * were initialized using pfnComInitialize. */
void (*pfnComUninitialize)(void);
+ /**
+ * Free memory managed by XPCOM.
+ *
+ * @param pv pointer to memory block to be freed
+ */
void (*pfnComUnallocMem)(void *pv);
- void (*pfnUtf16Free)(PRUnichar *pwszString);
- void (*pfnUtf8Free)(char *pszString);
+ /**
+ * Convert string from UTF-16 encoding to UTF-8 encoding.
+ *
+ * @param pwszString input string
+ * @param ppszString output string
+ * @returns IPRT status code
+ */
int (*pfnUtf16ToUtf8)(const PRUnichar *pwszString, char **ppszString);
+ /**
+ * Convert string from UTF-8 encoding to UTF-16 encoding.
+ *
+ * @param pszString input string
+ * @param ppwszString output string
+ * @returns IPRT status code
+ */
int (*pfnUtf8ToUtf16)(const char *pszString, PRUnichar **ppwszString);
+ /**
+ * Free memory returned by pfnUtf16ToUtf8. Do not use for anything else.
+ *
+ * @param pszString string to be freed.
+ */
+ void (*pfnUtf8Free)(char *pszString);
+ /**
+ * Free memory returned by pfnUtf8ToUtf16. Do not use for anything else.
+ *
+ * @param pwszString string to be freed.
+ */
+ void (*pfnUtf16Free)(PRUnichar *pwszString);
- void (*pfnGetEventQueue)(nsIEventQueue **eventQueue);
+ /**
+ * Get main XPCOM event queue.
+ *
+ * @param ppEventQueue output parameter for nsIEventQueue reference,
+ * owned by C bindings.
+ */
+ void (*pfnGetEventQueue)(nsIEventQueue **ppEventQueue);
+
+ /**
+ * Get current XPCOM exception.
+ *
+ * @param ppException output parameter for nsIException reference,
+ * may be @c NULL if no exception object has been created by
+ * a previous XPCOM call.
+ * @returns XPCOM error code
+ */
+ nsresult (*pfnGetException)(nsIException **ppException);
+ /**
+ * Clears current XPCOM exception.
+ *
+ * @returns XPCOM error code
+ */
+ nsresult (*pfnClearException)(void);
/** Tail version, same as uVersion. */
unsigned uEndVersion;
@@ -8851,7 +8962,7 @@ typedef VBOXXPCOMC const *PCVBOXXPCOM;
/** The current interface version.
* For use with VBoxGetXPCOMCFunctions and to be found in
* VBOXXPCOMC::uVersion. */
-#define VBOX_XPCOMC_VERSION 0x00020000U
+#define VBOX_XPCOMC_VERSION 0x00030000U
VBOXXPCOMC_DECL(PCVBOXXPCOM) VBoxGetXPCOMCFunctions(unsigned uVersion);
/** Typedef for VBoxGetXPCOMCFunctions. */
diff --git a/src/VBox/Main/cbinding/VBoxXPCOMC.cpp b/src/VBox/Main/cbinding/VBoxXPCOMC.cpp
index 201d545..ceed755 100644
--- a/src/VBox/Main/cbinding/VBoxXPCOMC.cpp
+++ b/src/VBox/Main/cbinding/VBoxXPCOMC.cpp
@@ -4,7 +4,7 @@
*/
/*
- * Copyright (C) 2009-2012 Oracle Corporation
+ * Copyright (C) 2009-2013 Oracle Corporation
*
* This file is part of VirtualBox Open Source Edition (OSE), as
* available from http://www.virtualbox.org. This file is free software;
@@ -19,6 +19,7 @@
#include <nsMemory.h>
#include <nsIServiceManager.h>
#include <nsEventQueueUtils.h>
+#include <nsIExceptionService.h>
#include <iprt/string.h>
#include <iprt/env.h>
@@ -30,12 +31,16 @@
using namespace std;
-static ISession *Session = NULL;
-static IVirtualBox *Ivirtualbox = NULL;
-static nsIComponentManager *manager = NULL;
-static nsIEventQueue *eventQ = NULL;
+/* The following 3 object references should be eliminated once the legacy
+ * way to initialize the XPCOM C bindings is removed. */
+static ISession *g_Session = NULL;
+static IVirtualBox *g_VirtualBox = NULL;
+static nsIComponentManager *g_Manager = NULL;
+
+static nsIEventQueue *g_EventQueue = NULL;
static void VBoxComUninitialize(void);
+static void VBoxClientUninitialize(void);
static int
VBoxUtf16ToUtf8(const PRUnichar *pwszString, char **ppszString)
@@ -65,9 +70,7 @@ static void
VBoxComUnallocMem(void *ptr)
{
if (ptr)
- {
nsMemory::Free(ptr);
- }
}
static void
@@ -93,7 +96,7 @@ VBoxComInitialize(const char *pszVirtualBoxIID, IVirtualBox **ppVirtualBox,
return;
}
- rc = NS_GetComponentManager (&manager);
+ rc = NS_GetComponentManager(&g_Manager);
if (NS_FAILED(rc))
{
Log(("Cbinding: Could not get component manager! rc=%Rhrc\n", rc));
@@ -101,7 +104,7 @@ VBoxComInitialize(const char *pszVirtualBoxIID, IVirtualBox **ppVirtualBox,
return;
}
- rc = NS_GetMainEventQ (&eventQ);
+ rc = NS_GetMainEventQ(&g_EventQueue);
if (NS_FAILED(rc))
{
Log(("Cbinding: Could not get xpcom event queue! rc=%Rhrc\n", rc));
@@ -109,10 +112,10 @@ VBoxComInitialize(const char *pszVirtualBoxIID, IVirtualBox **ppVirtualBox,
return;
}
- rc = manager->CreateInstanceByContractID(NS_VIRTUALBOX_CONTRACTID,
- nsnull,
- virtualBoxIID,
- (void **)ppVirtualBox);
+ rc = g_Manager->CreateInstanceByContractID(NS_VIRTUALBOX_CONTRACTID,
+ nsnull,
+ virtualBoxIID,
+ (void **)&g_VirtualBox);
if (NS_FAILED(rc))
{
Log(("Cbinding: Could not instantiate VirtualBox object! rc=%Rhrc\n",rc));
@@ -122,10 +125,10 @@ VBoxComInitialize(const char *pszVirtualBoxIID, IVirtualBox **ppVirtualBox,
Log(("Cbinding: IVirtualBox object created.\n"));
- rc = manager->CreateInstanceByContractID (NS_SESSION_CONTRACTID,
- nsnull,
- sessionIID,
- (void **)ppSession);
+ rc = g_Manager->CreateInstanceByContractID(NS_SESSION_CONTRACTID,
+ nsnull,
+ sessionIID,
+ (void **)&g_Session);
if (NS_FAILED(rc))
{
Log(("Cbinding: Could not instantiate Session object! rc=%Rhrc\n",rc));
@@ -135,51 +138,210 @@ VBoxComInitialize(const char *pszVirtualBoxIID, IVirtualBox **ppVirtualBox,
Log(("Cbinding: ISession object created.\n"));
- /* Store ppSession & ppVirtualBox so that VBoxComUninitialize
- * can later take care of them while cleanup
- */
- Session = *ppSession;
- Ivirtualbox = *ppVirtualBox;
-
+ *ppSession = g_Session;
+ *ppVirtualBox = g_VirtualBox;
}
static void
VBoxComInitializeV1(IVirtualBox **ppVirtualBox, ISession **ppSession)
{
- /* stub that always fails. */
- *ppVirtualBox = NULL;
- *ppSession = NULL;
+ VBoxComInitialize(IVIRTUALBOX_IID_STR, ppVirtualBox,
+ ISESSION_IID_STR, ppSession);
}
static void
VBoxComUninitialize(void)
{
- if (Session)
- NS_RELEASE(Session); // decrement refcount
- if (Ivirtualbox)
- NS_RELEASE(Ivirtualbox); // decrement refcount
- if (eventQ)
- NS_RELEASE(eventQ); // decrement refcount
- if (manager)
- NS_RELEASE(manager); // decrement refcount
+ if (g_Session)
+ {
+ NS_RELEASE(g_Session);
+ g_Session = NULL;
+ }
+ if (g_VirtualBox)
+ {
+ NS_RELEASE(g_VirtualBox);
+ g_VirtualBox = NULL;
+ }
+ if (g_EventQueue)
+ {
+ NS_RELEASE(g_EventQueue);
+ g_EventQueue = NULL;
+ }
+ if (g_Manager)
+ {
+ NS_RELEASE(g_Manager);
+ g_Manager = NULL;
+ }
com::Shutdown();
- Log(("Cbinding: Cleaned up the created IVirtualBox and ISession Objects.\n"));
+ Log(("Cbinding: Cleaned up the created objects.\n"));
}
static void
-VBoxGetEventQueue(nsIEventQueue **eventQueue)
+VBoxGetEventQueue(nsIEventQueue **ppEventQueue)
{
- *eventQueue = eventQ;
+ *ppEventQueue = g_EventQueue;
}
-static uint32_t
-VBoxVersion(void)
+static nsresult
+VBoxGetException(nsIException **ppException)
+{
+ nsresult rc;
+
+ *ppException = NULL;
+ nsIServiceManager *mgr = NULL;
+ rc = NS_GetServiceManager(&mgr);
+ if (NS_FAILED(rc) || !mgr)
+ return rc;
+
+ nsIID esid = NS_IEXCEPTIONSERVICE_IID;
+ nsIExceptionService *es = NULL;
+ rc = mgr->GetServiceByContractID(NS_EXCEPTIONSERVICE_CONTRACTID, esid, (void **)&es);
+ if (NS_FAILED(rc) || !es)
+ {
+ NS_RELEASE(mgr);
+ return rc;
+ }
+
+ nsIExceptionManager *em;
+ rc = es->GetCurrentExceptionManager(&em);
+ if (NS_FAILED(rc) || !em)
+ {
+ NS_RELEASE(es);
+ NS_RELEASE(mgr);
+ return rc;
+ }
+
+ nsIException *ex;
+ rc = em->GetCurrentException(&ex);
+ if (NS_FAILED(rc))
+ {
+ NS_RELEASE(em);
+ NS_RELEASE(es);
+ NS_RELEASE(mgr);
+ return rc;
+ }
+
+ *ppException = ex;
+ NS_RELEASE(em);
+ NS_RELEASE(es);
+ NS_RELEASE(mgr);
+ return rc;
+}
+
+static nsresult
+VBoxClearException(void)
+{
+ nsresult rc;
+
+ nsIServiceManager *mgr = NULL;
+ rc = NS_GetServiceManager(&mgr);
+ if (NS_FAILED(rc) || !mgr)
+ return rc;
+
+ nsIID esid = NS_IEXCEPTIONSERVICE_IID;
+ nsIExceptionService *es = NULL;
+ rc = mgr->GetServiceByContractID(NS_EXCEPTIONSERVICE_CONTRACTID, esid, (void **)&es);
+ if (NS_FAILED(rc) || !es)
+ {
+ NS_RELEASE(mgr);
+ return rc;
+ }
+
+ nsIExceptionManager *em;
+ rc = es->GetCurrentExceptionManager(&em);
+ if (NS_FAILED(rc) || !em)
+ {
+ NS_RELEASE(es);
+ NS_RELEASE(mgr);
+ return rc;
+ }
+
+ rc = em->SetCurrentException(NULL);
+ NS_RELEASE(em);
+ NS_RELEASE(es);
+ NS_RELEASE(mgr);
+ return rc;
+}
+
+static nsresult
+VBoxClientInitialize(const char *pszVirtualBoxClientIID, IVirtualBoxClient **ppVirtualBoxClient)
+{
+ nsresult rc;
+ nsID virtualBoxClientIID;
+ nsID sessionIID;
+
+ *ppVirtualBoxClient = NULL;
+
+ /* convert the string representation of UUID to nsIID type */
+ if (!virtualBoxClientIID.Parse(pszVirtualBoxClientIID))
+ return NS_ERROR_INVALID_ARG;
+
+ rc = com::Initialize();
+ if (NS_FAILED(rc))
+ {
+ Log(("Cbinding: XPCOM could not be initialized! rc=%Rhrc\n", rc));
+ VBoxClientUninitialize();
+ return rc;
+ }
+
+ nsIComponentManager *pManager;
+ rc = NS_GetComponentManager(&pManager);
+ if (NS_FAILED(rc))
+ {
+ Log(("Cbinding: Could not get component manager! rc=%Rhrc\n", rc));
+ VBoxClientUninitialize();
+ return rc;
+ }
+
+ rc = NS_GetMainEventQ(&g_EventQueue);
+ if (NS_FAILED(rc))
+ {
+ Log(("Cbinding: Could not get xpcom event queue! rc=%Rhrc\n", rc));
+ VBoxClientUninitialize();
+ return rc;
+ }
+
+ rc = pManager->CreateInstanceByContractID(NS_VIRTUALBOXCLIENT_CONTRACTID,
+ nsnull,
+ virtualBoxClientIID,
+ (void **)ppVirtualBoxClient);
+ if (NS_FAILED(rc))
+ {
+ Log(("Cbinding: Could not instantiate VirtualBoxClient object! rc=%Rhrc\n",rc));
+ VBoxClientUninitialize();
+ return rc;
+ }
+
+ NS_RELEASE(pManager);
+ pManager = NULL;
+
+ Log(("Cbinding: IVirtualBoxClient object created.\n"));
+
+ return NS_OK;
+}
+
+static void
+VBoxClientUninitialize(void)
{
- uint32_t version = 0;
+ if (g_EventQueue)
+ {
+ NS_RELEASE(g_EventQueue);
+ g_EventQueue = NULL;
+ }
+ com::Shutdown();
+ Log(("Cbinding: Cleaned up the created objects.\n"));
+}
- version = (VBOX_VERSION_MAJOR * 1000 * 1000) + (VBOX_VERSION_MINOR * 1000) + (VBOX_VERSION_BUILD);
+static unsigned int
+VBoxVersion(void)
+{
+ return VBOX_VERSION_MAJOR * 1000 * 1000 + VBOX_VERSION_MINOR * 1000 + VBOX_VERSION_BUILD;
+}
- return version;
+static unsigned int
+VBoxAPIVersion(void)
+{
+ return VBOX_VERSION_MAJOR * 1000 + VBOX_VERSION_MINOR + (VBOX_VERSION_BUILD > 50 ? 1 : 0);
}
VBOXXPCOMC_DECL(PCVBOXXPCOM)
@@ -194,18 +356,24 @@ VBoxGetXPCOMCFunctions(unsigned uVersion)
VBOX_XPCOMC_VERSION,
VBoxVersion,
+ VBoxAPIVersion,
+
+ VBoxClientInitialize,
+ VBoxClientUninitialize,
VBoxComInitialize,
VBoxComUninitialize,
VBoxComUnallocMem,
- VBoxUtf16Free,
- VBoxUtf8Free,
VBoxUtf16ToUtf8,
VBoxUtf8ToUtf16,
+ VBoxUtf8Free,
+ VBoxUtf16Free,
VBoxGetEventQueue,
+ VBoxGetException,
+ VBoxClearException,
VBOX_XPCOMC_VERSION
};
@@ -214,6 +382,61 @@ VBoxGetXPCOMCFunctions(unsigned uVersion)
return &s_Functions;
/*
+ * Legacy interface version 2.0.
+ */
+ static const struct VBOXXPCOMCV2
+ {
+ /** The size of the structure. */
+ unsigned cb;
+ /** The structure version. */
+ unsigned uVersion;
+
+ unsigned int (*pfnGetVersion)(void);
+
+ void (*pfnComInitialize)(const char *pszVirtualBoxIID,
+ IVirtualBox **ppVirtualBox,
+ const char *pszSessionIID,
+ ISession **ppSession);
+
+ void (*pfnComUninitialize)(void);
+
+ void (*pfnComUnallocMem)(void *pv);
+ void (*pfnUtf16Free)(PRUnichar *pwszString);
+ void (*pfnUtf8Free)(char *pszString);
+
+ int (*pfnUtf16ToUtf8)(const PRUnichar *pwszString, char **ppszString);
+ int (*pfnUtf8ToUtf16)(const char *pszString, PRUnichar **ppwszString);
+
+ void (*pfnGetEventQueue)(nsIEventQueue **ppEventQueue);
+
+ /** Tail version, same as uVersion. */
+ unsigned uEndVersion;
+ } s_Functions_v2_0 =
+ {
+ sizeof(s_Functions_v2_0),
+ 0x00020000U,
+
+ VBoxVersion,
+
+ VBoxComInitialize,
+ VBoxComUninitialize,
+
+ VBoxComUnallocMem,
+ VBoxUtf16Free,
+ VBoxUtf8Free,
+
+ VBoxUtf16ToUtf8,
+ VBoxUtf8ToUtf16,
+
+ VBoxGetEventQueue,
+
+ 0x00020000U
+ };
+
+ if ((uVersion & 0xffff0000U) == 0x00020000U)
+ return (PCVBOXXPCOM)&s_Functions_v2_0;
+
+ /*
* Legacy interface version 1.0.
*/
static const struct VBOXXPCOMCV1
diff --git a/src/VBox/Main/cbinding/VBoxXPCOMCGlue.c b/src/VBox/Main/cbinding/VBoxXPCOMCGlue.c
index 3484ad6..0513480 100644
--- a/src/VBox/Main/cbinding/VBoxXPCOMCGlue.c
+++ b/src/VBox/Main/cbinding/VBoxXPCOMCGlue.c
@@ -1,10 +1,10 @@
-/* $Revision: 66985 $ */
+/* $Revision: 90721 $ */
/** @file
* Glue code for dynamically linking to VBoxXPCOMC.
*/
/*
- * Copyright (C) 2008-2010 Oracle Corporation
+ * Copyright (C) 2008-2013 Oracle Corporation
*
* Permission is hereby granted, free of charge, to any person
* obtaining a copy of this software and associated documentation
@@ -37,6 +37,7 @@
#include <stdarg.h>
#include <stdint.h>
#include <dlfcn.h>
+#include <pthread.h>
#include "VBoxXPCOMCGlue.h"
@@ -67,6 +68,18 @@ PCVBOXXPCOM g_pVBoxFuncs = NULL;
/** Pointer to VBoxGetXPCOMCFunctions for the loaded VBoxXPCOMC so/dylib/dll. */
PFNVBOXGETXPCOMCFUNCTIONS g_pfnGetFunctions = NULL;
+typedef void FNDUMMY(void);
+typedef FNDUMMY *PFNDUMMY;
+/** Just a dummy global structure containing a bunch of
+ * function pointers to code which is wanted in the link.
+ * In this case this is for helping gdb as it gets hideously
+ * confused if the application doesn't drag in pthreads.
+ */
+PFNDUMMY g_apfnVBoxXPCOMCGlue[] =
+{
+ (PFNDUMMY)pthread_create
+};
+
/**
* Wrapper for setting g_szVBoxErrMsg. Can be an empty stub.
diff --git a/src/VBox/Main/cbinding/makefile.tstXPCOMCGlue b/src/VBox/Main/cbinding/makefile.tstXPCOMCGlue
index 42f84f0..2615a82 100644
--- a/src/VBox/Main/cbinding/makefile.tstXPCOMCGlue
+++ b/src/VBox/Main/cbinding/makefile.tstXPCOMCGlue
@@ -1,5 +1,5 @@
-# $Revision: 88618 $
-## @file makefile.tstLinuxC
+# $Revision: 90721 $
+## @file makefile.tstXPCOMCGlue
# Makefile for sample program illustrating use of C binding for XPCOM.
#
@@ -23,22 +23,16 @@ CC = gcc
CFLAGS = -g -Wall
.PHONY: all
-all: tstXPCOMCGlue tstXPCOMCEvent
+all: tstXPCOMCGlue
.PHONY: clean
clean:
- rm -f tstXPCOMCGlue.o tstXPCOMCGlue VBoxXPCOMCGlue.o tstXPCOMCEvent.o tstXPCOMCEvent
+ rm -f tstXPCOMCGlue.o tstXPCOMCGlue VBoxXPCOMCGlue.o
tstXPCOMCGlue: tstXPCOMCGlue.o VBoxXPCOMCGlue.o
- $(CC) -o $@ $^ -ldl
-
-tstXPCOMCGlue.o: tstXPCOMCGlue.c
- $(CC) $(CFLAGS) $(INCS_XPCOM) $(GLUE_INC) -o $@ -c $<
-
-tstXPCOMCEvent: tstXPCOMCEvent.o VBoxXPCOMCGlue.o
$(CC) -o $@ $^ -ldl -lpthread
-tstXPCOMCEvent.o: tstXPCOMCEvent.c
+tstXPCOMCGlue.o: tstXPCOMCGlue.c
$(CC) $(CFLAGS) $(INCS_XPCOM) $(GLUE_INC) -o $@ -c $<
VBoxXPCOMCGlue.o: $(GLUE_DIR)/VBoxXPCOMCGlue.c
diff --git a/src/VBox/Main/cbinding/tstXPCOMCEvent.c b/src/VBox/Main/cbinding/tstXPCOMCEvent.c
deleted file mode 100644
index b282f29..0000000
--- a/src/VBox/Main/cbinding/tstXPCOMCEvent.c
+++ /dev/null
@@ -1,745 +0,0 @@
-/* $Revision: 88618 $ */
-/** @file tstXPCOMCEvent.c
- * Demonstrator program to illustrate use of C bindings of Main API,
- * and in particular how to handle active event listeners (event delivery
- * through callbacks). The code is derived from tstXPCOMCGlue.c, so keep
- * the diffs to the original code as small as possible.
- *
- * Linux only at the moment due to shared library magic in the Makefile.
- */
-
-/*
- * Copyright (C) 2009-2013 Oracle Corporation
- *
- * This file is part of VirtualBox Open Source Edition (OSE), as
- * available from http://www.virtualbox.org. This file is free software;
- * you can redistribute it and/or modify it under the terms of the GNU
- * General Public License (GPL) as published by the Free Software
- * Foundation, in version 2 as it comes in the "COPYING" file of the
- * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
- * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
- */
-
-/*******************************************************************************
-* Header Files *
-*******************************************************************************/
-#include "VBoxXPCOMCGlue.h"
-#include <stdio.h>
-#include <string.h>
-#include <stdlib.h>
-#include <unistd.h>
-#include <signal.h>
-#include <sys/poll.h>
-
-/*******************************************************************************
-* Global Variables *
-*******************************************************************************/
-/** Set by signal handler. */
-static volatile int g_fStop = 0;
-
-int volatile g_refcount = 0;
-
-/* #define for printing nsID type UUID's */
-
-#define printUUID(iid) \
-{\
- printf(#iid ": {%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x}\n",\
- (unsigned)(iid)->m0,\
- (unsigned)(iid)->m1,\
- (unsigned)(iid)->m2,\
- (unsigned)(iid)->m3[0],\
- (unsigned)(iid)->m3[1],\
- (unsigned)(iid)->m3[2],\
- (unsigned)(iid)->m3[3],\
- (unsigned)(iid)->m3[4],\
- (unsigned)(iid)->m3[5],\
- (unsigned)(iid)->m3[6],\
- (unsigned)(iid)->m3[7]);\
-}\
-
-static const char *GetStateName(PRUint32 machineState)
-{
- switch (machineState)
- {
- case MachineState_Null: return "<null>";
- case MachineState_PoweredOff: return "PoweredOff";
- case MachineState_Saved: return "Saved";
- case MachineState_Teleported: return "Teleported";
- case MachineState_Aborted: return "Aborted";
- case MachineState_Running: return "Running";
- case MachineState_Paused: return "Paused";
- case MachineState_Stuck: return "Stuck";
- case MachineState_Teleporting: return "Teleporting";
- case MachineState_LiveSnapshotting: return "LiveSnapshotting";
- case MachineState_Starting: return "Starting";
- case MachineState_Stopping: return "Stopping";
- case MachineState_Saving: return "Saving";
- case MachineState_Restoring: return "Restoring";
- case MachineState_TeleportingPausedVM: return "TeleportingPausedVM";
- case MachineState_TeleportingIn: return "TeleportingIn";
- case MachineState_FaultTolerantSyncing: return "FaultTolerantSyncing";
- case MachineState_DeletingSnapshotOnline: return "DeletingSnapshotOnline";
- case MachineState_DeletingSnapshotPaused: return "DeletingSnapshotPaused";
- case MachineState_RestoringSnapshot: return "RestoringSnapshot";
- case MachineState_DeletingSnapshot: return "DeletingSnapshot";
- case MachineState_SettingUp: return "SettingUp";
- default: return "no idea";
- }
-}
-
-/**
- * Event handler function
- */
-static nsresult HandleEvent(IEventListener *pThis, IEvent *event)
-{
- enum VBoxEventType evType;
- nsresult rc;
-
- if (!event)
- {
- printf("event null\n");
- return 0;
- }
-
- evType = VBoxEventType_Invalid;
- rc = event->vtbl->GetType(event, &evType);
- if (NS_FAILED(rc))
- {
- printf("cannot get event type, rc=%#x\n", rc);
- return 0;
- }
-
- switch (evType)
- {
- case VBoxEventType_OnMousePointerShapeChanged:
- printf("OnMousePointerShapeChanged\n");
- break;
-
- case VBoxEventType_OnMouseCapabilityChanged:
- printf("OnMouseCapabilityChanged\n");
- break;
-
- case VBoxEventType_OnKeyboardLedsChanged:
- printf("OnMouseCapabilityChanged\n");
- break;
-
- case VBoxEventType_OnStateChanged:
- {
- static const nsID istateChangedEventUUID = ISTATECHANGEDEVENT_IID;
- IStateChangedEvent *ev = NULL;
- enum MachineState state;
- rc = event->vtbl->nsisupports.QueryInterface((nsISupports *)event, &istateChangedEventUUID, (void **)&ev);
- if (NS_FAILED(rc))
- {
- printf("cannot get StateChangedEvent interface, rc=%#x\n", rc);
- return 0;
- }
- if (!ev)
- {
- printf("StateChangedEvent reference null\n");
- return 0;
- }
- rc = ev->vtbl->GetState(ev, &state);
- if (NS_FAILED(rc))
- printf("warning: cannot get state, rc=%#x\n", rc);
- ev->vtbl->ievent.nsisupports.Release((nsISupports *)ev);
- printf("OnStateChanged: %s\n", GetStateName(state));
-
- fflush(stdout);
- if ( state == MachineState_PoweredOff
- || state == MachineState_Saved
- || state == MachineState_Teleported
- || state == MachineState_Aborted
- )
- g_fStop = 1;
- break;
- }
-
- case VBoxEventType_OnAdditionsStateChanged:
- printf("OnAdditionsStateChanged\n");
- break;
-
- case VBoxEventType_OnNetworkAdapterChanged:
- printf("OnNetworkAdapterChanged\n");
- break;
-
- case VBoxEventType_OnSerialPortChanged:
- printf("OnSerialPortChanged\n");
- break;
-
- case VBoxEventType_OnParallelPortChanged:
- printf("OnParallelPortChanged\n");
- break;
-
- case VBoxEventType_OnStorageControllerChanged:
- printf("OnStorageControllerChanged\n");
- break;
-
- case VBoxEventType_OnMediumChanged:
- printf("OnMediumChanged\n");
- break;
-
- case VBoxEventType_OnVRDEServerChanged:
- printf("OnVRDEServerChanged\n");
- break;
-
- case VBoxEventType_OnUSBControllerChanged:
- printf("OnUSBControllerChanged\n");
- break;
-
- case VBoxEventType_OnUSBDeviceStateChanged:
- printf("OnUSBDeviceStateChanged\n");
- break;
-
- case VBoxEventType_OnSharedFolderChanged:
- printf("OnSharedFolderChanged\n");
- break;
-
- case VBoxEventType_OnRuntimeError:
- printf("OnRuntimeError\n");
- break;
-
- case VBoxEventType_OnCanShowWindow:
- printf("OnCanShowWindow\n");
- break;
-
- case VBoxEventType_OnShowWindow:
- printf("OnShowWindow\n");
- break;
-
- default:
- printf("unknown event: %d\n", evType);
- }
-
- return 0;
-}
-
-static nsresult AddRef(nsISupports *pThis)
-{
- nsresult c;
-
- c = ++g_refcount;
- printf("AddRef: %d\n", c);
- return c;
-}
-
-static nsresult Release(nsISupports *pThis)
-{
- nsresult c;
-
- c = --g_refcount;
- printf("Release: %d\n", c);
- if (c == 0)
- {
- /* delete object */
- free(pThis->vtbl);
- free(pThis);
- }
- return c;
-}
-
-static nsresult QueryInterface(nsISupports *pThis, const nsID *iid, void **resultp)
-{
- static const nsID ieventListenerUUID = IEVENTLISTENER_IID;
- static const nsID isupportIID = NS_ISUPPORTS_IID;
-
- /* match iid */
- if ( memcmp(iid, &ieventListenerUUID, sizeof(nsID)) == 0
- || memcmp(iid, &isupportIID, sizeof(nsID)) == 0)
- {
- ++g_refcount;
- printf("QueryInterface: %d\n", g_refcount);
- *resultp = pThis;
- return NS_OK;
- }
-
- /* printf("event listener QueryInterface didn't find a matching interface\n"); */
- printUUID(iid);
- printUUID(&ieventListenerUUID);
- return NS_NOINTERFACE;
-}
-
-/**
- * Signal handler, terminate event listener.
- *
- * @param iSig The signal number (ignored).
- */
-static void sigIntHandler(int iSig)
-{
- printf("sigIntHandler\n");
- (void)iSig;
- g_fStop = 1;
-}
-
-/**
- * Register event listener for the selected VM.
- *
- * @param virtualBox ptr to IVirtualBox object
- * @param session ptr to ISession object
- * @param id identifies the machine to start
- * @param queue handle to the event queue
- */
-static void registerEventListener(IVirtualBox *virtualBox, ISession *session, PRUnichar *machineId, nsIEventQueue *queue)
-{
- IConsole *console = NULL;
- nsresult rc;
-
- rc = session->vtbl->GetConsole(session, &console);
- if ((NS_SUCCEEDED(rc)) && console)
- {
- IEventSource *es = NULL;
- rc = console->vtbl->GetEventSource(console, &es);
- if (NS_SUCCEEDED(rc) && es)
- {
- PRUint32 interestingEvents[] =
- {
- VBoxEventType_OnMousePointerShapeChanged,
- VBoxEventType_OnMouseCapabilityChanged,
- VBoxEventType_OnKeyboardLedsChanged,
- VBoxEventType_OnStateChanged,
- VBoxEventType_OnAdditionsStateChanged,
- VBoxEventType_OnNetworkAdapterChanged,
- VBoxEventType_OnSerialPortChanged,
- VBoxEventType_OnParallelPortChanged,
- VBoxEventType_OnStorageControllerChanged,
- VBoxEventType_OnMediumChanged,
- VBoxEventType_OnVRDEServerChanged,
- VBoxEventType_OnUSBControllerChanged,
- VBoxEventType_OnUSBDeviceStateChanged,
- VBoxEventType_OnSharedFolderChanged,
- VBoxEventType_OnRuntimeError,
- VBoxEventType_OnCanShowWindow,
- VBoxEventType_OnShowWindow
- };
- IEventListener *consoleListener = NULL;
- consoleListener = calloc(1, sizeof(IEventListener));
- consoleListener->vtbl = calloc(1, sizeof(struct IEventListener_vtbl));
-
- if (consoleListener && consoleListener->vtbl)
- {
- consoleListener->vtbl->nsisupports.AddRef = &AddRef;
- consoleListener->vtbl->nsisupports.Release = &Release;
- consoleListener->vtbl->nsisupports.QueryInterface = &QueryInterface;
- consoleListener->vtbl->HandleEvent = &HandleEvent;
- g_refcount = 1;
-
- rc = es->vtbl->RegisterListener(es, consoleListener,
- sizeof(interestingEvents) / sizeof(interestingEvents[0]),
- interestingEvents, 1 /* active */);
- if (NS_SUCCEEDED(rc))
- {
- /* crude way to show how it works, but any
- * great ideas anyone?
- */
- PRInt32 fd;
- int ret;
-
- printf("Entering event loop, PowerOff the machine to exit or press Ctrl-C to terminate\n");
- fflush(stdout);
- signal(SIGINT, sigIntHandler);
-
- fd = queue->vtbl->GetEventQueueSelectFD(queue);
- if (fd >= 0)
- {
- while (!g_fStop)
- {
- struct pollfd pfd;
-
- pfd.fd = fd;
- pfd.events = POLLIN | POLLERR | POLLHUP;
- pfd.revents = 0;
-
- ret = poll(&pfd, 1, 250);
-
- if (ret <= 0)
- continue;
-
- if (pfd.revents & POLLHUP)
- g_fStop = 1;
-
- queue->vtbl->ProcessPendingEvents(queue);
- }
- }
- else
- {
- while (!g_fStop)
- {
- PLEvent *pEvent = NULL;
- rc = queue->vtbl->WaitForEvent(queue, &pEvent);
- /*printf("event: %p rc=%x\n", (void *)pEvent, rc);*/
- if (NS_SUCCEEDED(rc))
- queue->vtbl->HandleEvent(queue, pEvent);
- }
- }
- signal(SIGINT, SIG_DFL);
- }
- es->vtbl->UnregisterListener(es, consoleListener);
- consoleListener->vtbl->nsisupports.Release((nsISupports *)consoleListener);
- }
- else
- {
- printf("Failed while allocating memory for console event listener.\n");
- }
- es->vtbl->nsisupports.Release((nsISupports *)es);
- }
- console->vtbl->nsisupports.Release((nsISupports *)console);
- }
-}
-
-/**
- * Start a VM.
- *
- * @param virtualBox ptr to IVirtualBox object
- * @param session ptr to ISession object
- * @param id identifies the machine to start
- * @param queue handle to the event queue
- */
-
-static void startVM(IVirtualBox *virtualBox, ISession *session, PRUnichar *id, nsIEventQueue *queue)
-{
- nsresult rc;
- IMachine *machine = NULL;
- IProgress *progress = NULL;
- PRUnichar *env = NULL;
- PRUnichar *sessionType;
-
- rc = virtualBox->vtbl->FindMachine(virtualBox, id, &machine);
-
- if (NS_FAILED(rc) || !machine)
- {
- fprintf(stderr, "Error: Couldn't get the machine handle.\n");
- return;
- }
-
- g_pVBoxFuncs->pfnUtf8ToUtf16("gui", &sessionType);
-
- rc = machine->vtbl->LaunchVMProcess(machine,
- session,
- sessionType,
- env,
- &progress
- );
-
- g_pVBoxFuncs->pfnUtf16Free(sessionType);
-
- if (NS_FAILED(rc))
- {
- fprintf(stderr, "Error: OpenRemoteSession failed.\n");
- }
- else
- {
- PRBool completed;
- PRInt32 resultCode;
-
- printf("Waiting for the remote session to open...\n");
- progress->vtbl->WaitForCompletion(progress, -1);
-
- rc = progress->vtbl->GetCompleted(progress, &completed);
- if (NS_FAILED(rc))
- {
- fprintf (stderr, "Error: GetCompleted status failed.\n");
- }
-
- progress->vtbl->GetResultCode(progress, &resultCode);
- if (NS_FAILED(resultCode))
- {
- IVirtualBoxErrorInfo *errorInfo;
- PRUnichar *textUtf16;
- char *text;
-
- progress->vtbl->GetErrorInfo(progress, &errorInfo);
- errorInfo->vtbl->GetText(errorInfo, &textUtf16);
- g_pVBoxFuncs->pfnUtf16ToUtf8(textUtf16, &text);
- printf("Error: %s\n", text);
-
- g_pVBoxFuncs->pfnComUnallocMem(textUtf16);
- g_pVBoxFuncs->pfnUtf8Free(text);
- }
- else
- {
- fprintf(stderr, "Remote session has been successfully opened.\n");
- registerEventListener(virtualBox, session, id, queue);
- }
- progress->vtbl->nsisupports.Release((nsISupports *)progress);
- }
-
- /* It's important to always release resources. */
- machine->vtbl->nsisupports.Release((nsISupports *)machine);
-}
-
-/**
- * List the registered VMs.
- *
- * @param virtualBox ptr to IVirtualBox object
- * @param session ptr to ISession object
- * @param queue handle to the event queue
- */
-static void listVMs(IVirtualBox *virtualBox, ISession *session, nsIEventQueue *queue)
-{
- nsresult rc;
- IMachine **machines = NULL;
- PRUint32 machineCnt = 0;
- PRUint32 i;
- unsigned start_id;
-
- /*
- * Get the list of all registered VMs.
- */
-
- rc = virtualBox->vtbl->GetMachines(virtualBox, &machineCnt, &machines);
- if (NS_FAILED(rc))
- {
- fprintf(stderr, "could not get list of machines, rc=%08x\n",
- (unsigned)rc);
- return;
- }
-
- if (machineCnt == 0)
- {
- printf("\tNo VMs\n");
- return;
- }
-
- printf("VM List:\n\n");
-
- /*
- * Iterate through the collection.
- */
-
- for (i = 0; i < machineCnt; ++i)
- {
- IMachine *machine = machines[i];
- PRBool isAccessible = PR_FALSE;
-
- printf("\tMachine #%u\n", (unsigned)i);
-
- if (!machine)
- {
- printf("\t(skipped, NULL)\n");
- continue;
- }
-
- machine->vtbl->GetAccessible(machine, &isAccessible);
-
- if (isAccessible)
- {
- PRUnichar *machineNameUtf16;
- char *machineName;
-
- machine->vtbl->GetName(machine, &machineNameUtf16);
- g_pVBoxFuncs->pfnUtf16ToUtf8(machineNameUtf16,&machineName);
- printf("\tName: %s\n", machineName);
-
- g_pVBoxFuncs->pfnUtf8Free(machineName);
- g_pVBoxFuncs->pfnComUnallocMem(machineNameUtf16);
- }
- else
- {
- printf("\tName: <inaccessible>\n");
- }
-
- {
- PRUnichar *uuidUtf16 = NULL;
- char *uuidUtf8 = NULL;
-
- machine->vtbl->GetId(machine, &uuidUtf16);
- g_pVBoxFuncs->pfnUtf16ToUtf8(uuidUtf16, &uuidUtf8);
- printf("\tUUID: %s\n", uuidUtf8);
-
- g_pVBoxFuncs->pfnUtf8Free(uuidUtf8);
- g_pVBoxFuncs->pfnUtf16Free(uuidUtf16);
- }
-
- if (isAccessible)
- {
- {
- PRUnichar *configFile;
- char *configFile1 = calloc((size_t)64, (size_t)1);
-
- machine->vtbl->GetSettingsFilePath(machine, &configFile);
- g_pVBoxFuncs->pfnUtf16ToUtf8(configFile, &configFile1);
- printf("\tConfig file: %s\n", configFile1);
-
- free(configFile1);
- g_pVBoxFuncs->pfnComUnallocMem(configFile);
- }
-
- {
- PRUint32 memorySize;
-
- machine->vtbl->GetMemorySize(machine, &memorySize);
- printf("\tMemory size: %uMB\n", memorySize);
- }
-
- {
- PRUnichar *typeId;
- PRUnichar *osNameUtf16;
- char *osName;
- IGuestOSType *osType = NULL;
-
- machine->vtbl->GetOSTypeId(machine, &typeId);
- virtualBox->vtbl->GetGuestOSType(virtualBox, typeId, &osType);
- osType->vtbl->GetDescription(osType, &osNameUtf16);
- g_pVBoxFuncs->pfnUtf16ToUtf8(osNameUtf16,&osName);
- printf("\tGuest OS: %s\n\n", osName);
-
- osType->vtbl->nsisupports.Release((nsISupports *)osType);
- g_pVBoxFuncs->pfnUtf8Free(osName);
- g_pVBoxFuncs->pfnComUnallocMem(osNameUtf16);
- g_pVBoxFuncs->pfnComUnallocMem(typeId);
- }
- }
- }
-
- /*
- * Let the user chose a machine to start.
- */
-
- printf("Type Machine# to start (0 - %u) or 'quit' to do nothing: ",
- (unsigned)(machineCnt - 1));
- fflush(stdout);
-
- if (scanf("%u", &start_id) == 1 && start_id < machineCnt)
- {
- IMachine *machine = machines[start_id];
-
- if (machine)
- {
- PRUnichar *uuidUtf16 = NULL;
-
- machine->vtbl->GetId(machine, &uuidUtf16);
- startVM(virtualBox, session, uuidUtf16, queue);
-
- g_pVBoxFuncs->pfnUtf16Free(uuidUtf16);
- }
- }
-
- /*
- * Don't forget to release the objects in the array.
- */
-
- for (i = 0; i < machineCnt; ++i)
- {
- IMachine *machine = machines[i];
-
- if (machine)
- {
- machine->vtbl->nsisupports.Release((nsISupports *)machine);
- }
- }
-}
-
-/* Main - Start the ball rolling. */
-
-int main(int argc, char **argv)
-{
- IVirtualBox *vbox = NULL;
- ISession *session = NULL;
- nsIEventQueue *queue = NULL;
- PRUint32 revision = 0;
- PRUnichar *versionUtf16 = NULL;
- PRUnichar *homefolderUtf16 = NULL;
- nsresult rc; /* Result code of various function (method) calls. */
-
- printf("Starting Main\n");
-
- /*
- * VBoxComInitialize does all the necessary startup action and
- * provides us with pointers to vbox and session handles.
- * It should be matched by a call to VBoxComUninitialize(vbox)
- * when done.
- */
-
- if (VBoxCGlueInit() != 0)
- {
- fprintf(stderr, "%s: FATAL: VBoxCGlueInit failed: %s\n",
- argv[0], g_szVBoxErrMsg);
- return EXIT_FAILURE;
- }
-
- g_pVBoxFuncs->pfnComInitialize(IVIRTUALBOX_IID_STR, &vbox,
- ISESSION_IID_STR, &session);
- if (vbox == NULL)
- {
- fprintf(stderr, "%s: FATAL: could not get vbox handle\n", argv[0]);
- return EXIT_FAILURE;
- }
- if (session == NULL)
- {
- fprintf(stderr, "%s: FATAL: could not get session handle\n", argv[0]);
- return EXIT_FAILURE;
- }
- g_pVBoxFuncs->pfnGetEventQueue(&queue);
- printf("Got the event queue: %p\n", (void *)queue);
-
- /*
- * Now ask for revision, version and home folder information of
- * this vbox. Were not using fancy macros here so it
- * remains easy to see how we access C++'s vtable.
- */
-
- printf("----------------------------------------------------\n");
-
- /* 1. Revision */
-
- rc = vbox->vtbl->GetRevision(vbox, &revision);
- if (NS_SUCCEEDED(rc))
- {
- printf("\tRevision: %u\n", revision);
- }
- else
- {
- fprintf(stderr, "%s: GetRevision() returned %08x\n",
- argv[0], (unsigned)rc);
- }
-
- /* 2. Version */
-
- rc = vbox->vtbl->GetVersion(vbox, &versionUtf16);
- if (NS_SUCCEEDED(rc))
- {
- char *version = NULL;
- g_pVBoxFuncs->pfnUtf16ToUtf8(versionUtf16, &version);
- printf("\tVersion: %s\n", version);
- g_pVBoxFuncs->pfnUtf8Free(version);
- g_pVBoxFuncs->pfnComUnallocMem(versionUtf16);
- }
- else
- {
- fprintf(stderr, "%s: GetVersion() returned %08x\n",
- argv[0], (unsigned)rc);
- }
-
- /* 3. Home Folder */
-
- rc = vbox->vtbl->GetHomeFolder(vbox, &homefolderUtf16);
- if (NS_SUCCEEDED(rc))
- {
- char *homefolder = NULL;
- g_pVBoxFuncs->pfnUtf16ToUtf8(homefolderUtf16, &homefolder);
- printf("\tHomeFolder: %s\n", homefolder);
- g_pVBoxFuncs->pfnUtf8Free(homefolder);
- g_pVBoxFuncs->pfnComUnallocMem(homefolderUtf16);
- }
- else
- {
- fprintf(stderr, "%s: GetHomeFolder() returned %08x\n",
- argv[0], (unsigned)rc);
- }
-
- listVMs(vbox, session, queue);
- session->vtbl->UnlockMachine(session);
-
- printf("----------------------------------------------------\n");
-
- /*
- * Do as mom told us: always clean up after yourself.
- */
-
- g_pVBoxFuncs->pfnComUninitialize();
- VBoxCGlueTerm();
- printf("Finished Main\n");
-
- return 0;
-}
-/* vim: set ts=4 sw=4 et: */
diff --git a/src/VBox/Main/cbinding/tstXPCOMCGlue.c b/src/VBox/Main/cbinding/tstXPCOMCGlue.c
index 90d1fcc..cd67a4c 100644
--- a/src/VBox/Main/cbinding/tstXPCOMCGlue.c
+++ b/src/VBox/Main/cbinding/tstXPCOMCGlue.c
@@ -1,6 +1,11 @@
-/* $Revision: 88618 $ */
+/* $Revision: 90721 $ */
/** @file tstXPCOMCGlue.c
- * Demonstrator program to illustrate use of C bindings of Main API.
+ * Demonstrator program to illustrate use of C bindings of Main API, including
+ * how to retrieve all available error information.
+ *
+ * This includes code which shows how to handle active event listeners
+ * (event delivery through callbacks), which is not so frequently seen in
+ * other samples which mostly use passive event listeners.
*
* Linux only at the moment due to shared library magic in the Makefile.
*/
@@ -24,15 +29,445 @@
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
+#include <unistd.h>
+#include <signal.h>
+#include <sys/poll.h>
+
+/*******************************************************************************
+* Global Variables *
+*******************************************************************************/
+/** Set by signal handler. */
+static volatile int g_fStop = 0;
+
+static const char *GetStateName(PRUint32 machineState)
+{
+ switch (machineState)
+ {
+ case MachineState_Null: return "<null>";
+ case MachineState_PoweredOff: return "PoweredOff";
+ case MachineState_Saved: return "Saved";
+ case MachineState_Teleported: return "Teleported";
+ case MachineState_Aborted: return "Aborted";
+ case MachineState_Running: return "Running";
+ case MachineState_Paused: return "Paused";
+ case MachineState_Stuck: return "Stuck";
+ case MachineState_Teleporting: return "Teleporting";
+ case MachineState_LiveSnapshotting: return "LiveSnapshotting";
+ case MachineState_Starting: return "Starting";
+ case MachineState_Stopping: return "Stopping";
+ case MachineState_Saving: return "Saving";
+ case MachineState_Restoring: return "Restoring";
+ case MachineState_TeleportingPausedVM: return "TeleportingPausedVM";
+ case MachineState_TeleportingIn: return "TeleportingIn";
+ case MachineState_FaultTolerantSyncing: return "FaultTolerantSyncing";
+ case MachineState_DeletingSnapshotOnline: return "DeletingSnapshotOnline";
+ case MachineState_DeletingSnapshotPaused: return "DeletingSnapshotPaused";
+ case MachineState_RestoringSnapshot: return "RestoringSnapshot";
+ case MachineState_DeletingSnapshot: return "DeletingSnapshot";
+ case MachineState_SettingUp: return "SettingUp";
+ default: return "no idea";
+ }
+}
+
+struct IEventListenerDemo_vtbl
+{
+ struct IEventListener_vtbl ieventlistener;
+};
+
+typedef struct IEventListenerDemo
+{
+ struct IEventListenerDemo_vtbl *vtbl;
+
+ int refcount;
+} IEventListenerDemo;
/**
- * Start a VM.
+ * Event handler function
+ */
+static nsresult IEventListenerDemo_HandleEvent(IEventListener *pThis, IEvent *event)
+{
+ enum VBoxEventType evType;
+ nsresult rc;
+
+ if (!event)
+ {
+ printf("event null\n");
+ return NS_OK;
+ }
+
+ evType = VBoxEventType_Invalid;
+ rc = event->vtbl->GetType(event, &evType);
+ if (NS_FAILED(rc))
+ {
+ printf("cannot get event type, rc=%#x\n", rc);
+ return NS_OK;
+ }
+
+ switch (evType)
+ {
+ case VBoxEventType_OnMousePointerShapeChanged:
+ printf("OnMousePointerShapeChanged\n");
+ break;
+
+ case VBoxEventType_OnMouseCapabilityChanged:
+ printf("OnMouseCapabilityChanged\n");
+ break;
+
+ case VBoxEventType_OnKeyboardLedsChanged:
+ printf("OnMouseCapabilityChanged\n");
+ break;
+
+ case VBoxEventType_OnStateChanged:
+ {
+ static const nsID istateChangedEventUUID = ISTATECHANGEDEVENT_IID;
+ IStateChangedEvent *ev = NULL;
+ enum MachineState state;
+ rc = event->vtbl->nsisupports.QueryInterface((nsISupports *)event, &istateChangedEventUUID, (void **)&ev);
+ if (NS_FAILED(rc))
+ {
+ printf("cannot get StateChangedEvent interface, rc=%#x\n", rc);
+ return NS_OK;
+ }
+ if (!ev)
+ {
+ printf("StateChangedEvent reference null\n");
+ return NS_OK;
+ }
+ rc = ev->vtbl->GetState(ev, &state);
+ if (NS_FAILED(rc))
+ printf("warning: cannot get state, rc=%#x\n", rc);
+ ev->vtbl->ievent.nsisupports.Release((nsISupports *)ev);
+ printf("OnStateChanged: %s\n", GetStateName(state));
+
+ fflush(stdout);
+ if ( state == MachineState_PoweredOff
+ || state == MachineState_Saved
+ || state == MachineState_Teleported
+ || state == MachineState_Aborted
+ )
+ g_fStop = 1;
+ break;
+ }
+
+ case VBoxEventType_OnAdditionsStateChanged:
+ printf("OnAdditionsStateChanged\n");
+ break;
+
+ case VBoxEventType_OnNetworkAdapterChanged:
+ printf("OnNetworkAdapterChanged\n");
+ break;
+
+ case VBoxEventType_OnSerialPortChanged:
+ printf("OnSerialPortChanged\n");
+ break;
+
+ case VBoxEventType_OnParallelPortChanged:
+ printf("OnParallelPortChanged\n");
+ break;
+
+ case VBoxEventType_OnStorageControllerChanged:
+ printf("OnStorageControllerChanged\n");
+ break;
+
+ case VBoxEventType_OnMediumChanged:
+ printf("OnMediumChanged\n");
+ break;
+
+ case VBoxEventType_OnVRDEServerChanged:
+ printf("OnVRDEServerChanged\n");
+ break;
+
+ case VBoxEventType_OnUSBControllerChanged:
+ printf("OnUSBControllerChanged\n");
+ break;
+
+ case VBoxEventType_OnUSBDeviceStateChanged:
+ printf("OnUSBDeviceStateChanged\n");
+ break;
+
+ case VBoxEventType_OnSharedFolderChanged:
+ printf("OnSharedFolderChanged\n");
+ break;
+
+ case VBoxEventType_OnRuntimeError:
+ printf("OnRuntimeError\n");
+ break;
+
+ case VBoxEventType_OnCanShowWindow:
+ printf("OnCanShowWindow\n");
+ break;
+ case VBoxEventType_OnShowWindow:
+ printf("OnShowWindow\n");
+ break;
+
+ default:
+ printf("unknown event: %d\n", evType);
+ }
+
+ return NS_OK;
+}
+
+static nsresult IEventListenerDemo_QueryInterface(nsISupports *pThis, const nsID *iid, void **resultp)
+{
+ static const nsID ieventListenerUUID = IEVENTLISTENER_IID;
+ static const nsID isupportIID = NS_ISUPPORTS_IID;
+
+ /* match iid */
+ if ( memcmp(iid, &ieventListenerUUID, sizeof(nsID)) == 0
+ || memcmp(iid, &isupportIID, sizeof(nsID)) == 0)
+ {
+ pThis->vtbl->AddRef(pThis);
+ *resultp = pThis;
+ return NS_OK;
+ }
+
+ return NS_NOINTERFACE;
+}
+
+static nsresult IEventListenerDemo_AddRef(nsISupports *pThis)
+{
+ return ++(((IEventListenerDemo *)pThis)->refcount);
+}
+
+static nsresult IEventListenerDemo_Release(nsISupports *pThis)
+{
+ nsresult c;
+
+ c = --(((IEventListenerDemo *)pThis)->refcount);
+ if (c == 0)
+ free(pThis);
+ return c;
+}
+
+struct IEventListenerDemo_vtbl_int_gcc
+{
+ ptrdiff_t offset_to_top;
+ void *typeinfo;
+ struct IEventListenerDemo_vtbl vtbl;
+};
+
+static struct IEventListenerDemo_vtbl_int_gcc g_IEventListenerDemo_vtbl_int_gcc =
+{
+ 0, /* offset_to_top */
+ NULL, /* typeinfo, not vital */
+ {
+ {
+ {
+ IEventListenerDemo_QueryInterface,
+ IEventListenerDemo_AddRef,
+ IEventListenerDemo_Release
+ },
+ IEventListenerDemo_HandleEvent
+ }
+ }
+};
+
+/**
+ * Signal handler, terminate event listener.
+ *
+ * @param iSig The signal number (ignored).
+ */
+static void sigIntHandler(int iSig)
+{
+ (void)iSig;
+ g_fStop = 1;
+}
+
+/**
+ * Register event listener for the selected VM.
*
* @param virtualBox ptr to IVirtualBox object
* @param session ptr to ISession object
* @param id identifies the machine to start
+ * @param queue handle to the event queue
*/
-static void startVM(IVirtualBox *virtualBox, ISession *session, PRUnichar *id)
+static void registerEventListener(IVirtualBox *virtualBox, ISession *session, PRUnichar *machineId, nsIEventQueue *queue)
+{
+ IConsole *console = NULL;
+ nsresult rc;
+
+ rc = session->vtbl->GetConsole(session, &console);
+ if ((NS_SUCCEEDED(rc)) && console)
+ {
+ IEventSource *es = NULL;
+ rc = console->vtbl->GetEventSource(console, &es);
+ if (NS_SUCCEEDED(rc) && es)
+ {
+ PRUint32 interestingEvents[] =
+ {
+ VBoxEventType_OnMousePointerShapeChanged,
+ VBoxEventType_OnMouseCapabilityChanged,
+ VBoxEventType_OnKeyboardLedsChanged,
+ VBoxEventType_OnStateChanged,
+ VBoxEventType_OnAdditionsStateChanged,
+ VBoxEventType_OnNetworkAdapterChanged,
+ VBoxEventType_OnSerialPortChanged,
+ VBoxEventType_OnParallelPortChanged,
+ VBoxEventType_OnStorageControllerChanged,
+ VBoxEventType_OnMediumChanged,
+ VBoxEventType_OnVRDEServerChanged,
+ VBoxEventType_OnUSBControllerChanged,
+ VBoxEventType_OnUSBDeviceStateChanged,
+ VBoxEventType_OnSharedFolderChanged,
+ VBoxEventType_OnRuntimeError,
+ VBoxEventType_OnCanShowWindow,
+ VBoxEventType_OnShowWindow
+ };
+ IEventListenerDemo *consoleListener = NULL;
+ consoleListener = calloc(1, sizeof(IEventListenerDemo));
+ if (consoleListener)
+ {
+ consoleListener->vtbl = &(g_IEventListenerDemo_vtbl_int_gcc.vtbl);
+ consoleListener->vtbl->ieventlistener.nsisupports.AddRef((nsISupports *)consoleListener);
+
+ rc = es->vtbl->RegisterListener(es, (IEventListener *)consoleListener,
+ sizeof(interestingEvents) / sizeof(interestingEvents[0]),
+ interestingEvents, 1 /* active */);
+ if (NS_SUCCEEDED(rc))
+ {
+ /* Just wait here for events, no easy way to do this better
+ * as there's not much to do after this completes. */
+ PRInt32 fd;
+ int ret;
+ printf("Entering event loop, PowerOff the machine to exit or press Ctrl-C to terminate\n");
+ fflush(stdout);
+ signal(SIGINT, sigIntHandler);
+
+ fd = queue->vtbl->GetEventQueueSelectFD(queue);
+ if (fd >= 0)
+ {
+ while (!g_fStop)
+ {
+ struct pollfd pfd;
+
+ pfd.fd = fd;
+ pfd.events = POLLIN | POLLERR | POLLHUP;
+ pfd.revents = 0;
+
+ ret = poll(&pfd, 1, 250);
+
+ if (ret <= 0)
+ continue;
+
+ if (pfd.revents & POLLHUP)
+ g_fStop = 1;
+
+ queue->vtbl->ProcessPendingEvents(queue);
+ }
+ }
+ else
+ {
+ while (!g_fStop)
+ {
+ PLEvent *pEvent = NULL;
+ rc = queue->vtbl->WaitForEvent(queue, &pEvent);
+ if (NS_SUCCEEDED(rc))
+ queue->vtbl->HandleEvent(queue, pEvent);
+ }
+ }
+ signal(SIGINT, SIG_DFL);
+ }
+ es->vtbl->UnregisterListener(es, (IEventListener *)consoleListener);
+ consoleListener->vtbl->ieventlistener.nsisupports.Release((nsISupports *)consoleListener);
+ }
+ else
+ {
+ printf("Failed while allocating memory for console event listener.\n");
+ }
+ es->vtbl->nsisupports.Release((nsISupports *)es);
+ }
+ console->vtbl->nsisupports.Release((nsISupports *)console);
+ }
+}
+
+/**
+ * Print detailed error information if available.
+ * @param pszExecutable string with the executable name
+ * @param pszErrorMsg string containing the code location specific error message
+ * @param rc XPCOM result code
+ */
+static void PrintErrorInfo(const char *pszExecutable, const char *pszErrorMsg, nsresult rc)
+{
+ nsIException *ex;
+ nsresult rc2 = NS_OK;
+ fprintf(stderr, "%s: %s (rc=%#010x)\n", pszExecutable, pszErrorMsg, (unsigned)rc);
+ rc2 = g_pVBoxFuncs->pfnGetException(&ex);
+ if (NS_SUCCEEDED(rc2))
+ {
+ static const nsID vbei = IVIRTUALBOXERRORINFO_IID;
+ IVirtualBoxErrorInfo *ei;
+ rc2 = ex->vtbl->nsisupports.QueryInterface((nsISupports *)ex, &vbei, (void **)&ei);
+ if (NS_FAILED(rc2))
+ ei = NULL;
+ if (ei)
+ {
+ /* got extended error info, maybe multiple infos */
+ do
+ {
+ PRInt32 resultCode = NS_OK;
+ PRUnichar *componentUtf16 = NULL;
+ char *component = NULL;
+ PRUnichar *textUtf16 = NULL;
+ char *text = NULL;
+ IVirtualBoxErrorInfo *ei_next = NULL;
+ fprintf(stderr, "Extended error info (IVirtualBoxErrorInfo):\n");
+
+ ei->vtbl->GetResultCode(ei, &resultCode);
+ fprintf(stderr, " resultCode=%#010x\n", (unsigned)resultCode);
+
+ ei->vtbl->GetComponent(ei, &componentUtf16);
+ g_pVBoxFuncs->pfnUtf16ToUtf8(componentUtf16, &component);
+ g_pVBoxFuncs->pfnComUnallocMem(componentUtf16);
+ fprintf(stderr, " component=%s\n", component);
+ g_pVBoxFuncs->pfnUtf8Free(component);
+
+ ei->vtbl->GetText(ei, &textUtf16);
+ g_pVBoxFuncs->pfnUtf16ToUtf8(textUtf16, &text);
+ g_pVBoxFuncs->pfnComUnallocMem(textUtf16);
+ fprintf(stderr, " text=%s\n", text);
+ g_pVBoxFuncs->pfnUtf8Free(text);
+
+ rc2 = ei->vtbl->GetNext(ei, &ei_next);
+ if (NS_FAILED(rc2))
+ ei_next = NULL;
+ ei->vtbl->nsiexception.nsisupports.Release((nsISupports *)ei);
+ ei = ei_next;
+ }
+ while (ei);
+ }
+ else
+ {
+ /* got basic error info */
+ nsresult resultCode = NS_OK;
+ PRUnichar *messageUtf16 = NULL;
+ char *message = NULL;
+ fprintf(stderr, "Basic error info (nsIException):\n");
+
+ ex->vtbl->GetResult(ex, &resultCode);
+ fprintf(stderr, " resultCode=%#010x\n", resultCode);
+
+ ex->vtbl->GetMessage(ex, &messageUtf16);
+ g_pVBoxFuncs->pfnUtf16ToUtf8(messageUtf16, &message);
+ g_pVBoxFuncs->pfnComUnallocMem(messageUtf16);
+ fprintf(stderr, " message=%s\n", message);
+ g_pVBoxFuncs->pfnUtf8Free(message);
+ }
+
+ ex->vtbl->nsisupports.Release((nsISupports *)ex);
+ g_pVBoxFuncs->pfnClearException();
+ }
+}
+
+/**
+ * Start a VM.
+ *
+ * @param argv0 executable name
+ * @param virtualBox ptr to IVirtualBox object
+ * @param session ptr to ISession object
+ * @param id identifies the machine to start
+ * @param queue ptr to event queue
+ */
+static void startVM(const char *argv0, IVirtualBox *virtualBox, ISession *session, PRUnichar *id, nsIEventQueue *queue)
{
nsresult rc;
IMachine *machine = NULL;
@@ -41,29 +476,21 @@ static void startVM(IVirtualBox *virtualBox, ISession *session, PRUnichar *id)
PRUnichar *sessionType;
rc = virtualBox->vtbl->FindMachine(virtualBox, id, &machine);
-
if (NS_FAILED(rc) || !machine)
{
- fprintf(stderr, "Error: Couldn't get the machine handle.\n");
+ PrintErrorInfo(argv0, "Error: Couldn't get the Machine reference", rc);
return;
}
g_pVBoxFuncs->pfnUtf8ToUtf16("gui", &sessionType);
-
rc = machine->vtbl->LaunchVMProcess(machine,
session,
sessionType,
env,
&progress
);
-
g_pVBoxFuncs->pfnUtf16Free(sessionType);
-
- if (NS_FAILED(rc))
- {
- fprintf(stderr, "Error: OpenRemoteSession failed.\n");
- }
- else
+ if (NS_SUCCEEDED(rc))
{
PRBool completed;
PRInt32 resultCode;
@@ -73,9 +500,7 @@ static void startVM(IVirtualBox *virtualBox, ISession *session, PRUnichar *id)
rc = progress->vtbl->GetCompleted(progress, &completed);
if (NS_FAILED(rc))
- {
- fprintf (stderr, "Error: GetCompleted status failed.\n");
- }
+ fprintf(stderr, "Error: GetCompleted status failed\n");
progress->vtbl->GetResultCode(progress, &resultCode);
if (NS_FAILED(resultCode))
@@ -94,10 +519,16 @@ static void startVM(IVirtualBox *virtualBox, ISession *session, PRUnichar *id)
}
else
{
- fprintf(stderr, "Remote session has been successfully opened.\n");
+ fprintf(stderr, "VM process has been successfully started\n");
+
+ /* Kick off the event listener demo part, which is quite separate.
+ * Ignore it if you need a more basic sample. */
+ registerEventListener(virtualBox, session, id, queue);
}
progress->vtbl->nsisupports.Release((nsISupports *)progress);
}
+ else
+ PrintErrorInfo(argv0, "Error: LaunchVMProcess failed", rc);
/* It's important to always release resources. */
machine->vtbl->nsisupports.Release((nsISupports *)machine);
@@ -106,10 +537,12 @@ static void startVM(IVirtualBox *virtualBox, ISession *session, PRUnichar *id)
/**
* List the registered VMs.
*
- * @param virtualBox ptr to IVirtualBox object
- * @param session ptr to ISession object
+ * @param argv0 executable name
+ * @param virtualBox ptr to IVirtualBox object
+ * @param session ptr to ISession object
+ * @param queue ptr to event queue
*/
-static void listVMs(IVirtualBox *virtualBox, ISession *session)
+static void listVMs(const char *argv0, IVirtualBox *virtualBox, ISession *session, nsIEventQueue *queue)
{
nsresult rc;
IMachine **machines = NULL;
@@ -124,8 +557,7 @@ static void listVMs(IVirtualBox *virtualBox, ISession *session)
rc = virtualBox->vtbl->GetMachines(virtualBox, &machineCnt, &machines);
if (NS_FAILED(rc))
{
- fprintf(stderr, "could not get list of machines, rc=%08x\n",
- (unsigned)rc);
+ PrintErrorInfo(argv0, "could not get list of machines", rc);
return;
}
@@ -163,10 +595,9 @@ static void listVMs(IVirtualBox *virtualBox, ISession *session)
machine->vtbl->GetName(machine, &machineNameUtf16);
g_pVBoxFuncs->pfnUtf16ToUtf8(machineNameUtf16,&machineName);
+ g_pVBoxFuncs->pfnComUnallocMem(machineNameUtf16);
printf("\tName: %s\n", machineName);
-
g_pVBoxFuncs->pfnUtf8Free(machineName);
- g_pVBoxFuncs->pfnComUnallocMem(machineNameUtf16);
}
else
{
@@ -174,29 +605,27 @@ static void listVMs(IVirtualBox *virtualBox, ISession *session)
}
{
- PRUnichar *uuidUtf16 = NULL;
- char *uuidUtf8 = NULL;
+ PRUnichar *uuidUtf16;
+ char *uuidUtf8;
machine->vtbl->GetId(machine, &uuidUtf16);
g_pVBoxFuncs->pfnUtf16ToUtf8(uuidUtf16, &uuidUtf8);
+ g_pVBoxFuncs->pfnComUnallocMem(uuidUtf16);
printf("\tUUID: %s\n", uuidUtf8);
-
g_pVBoxFuncs->pfnUtf8Free(uuidUtf8);
- g_pVBoxFuncs->pfnUtf16Free(uuidUtf16);
}
if (isAccessible)
{
{
- PRUnichar *configFile;
- char *configFile1 = calloc((size_t)64, (size_t)1);
-
- machine->vtbl->GetSettingsFilePath(machine, &configFile);
- g_pVBoxFuncs->pfnUtf16ToUtf8(configFile, &configFile1);
- printf("\tConfig file: %s\n", configFile1);
-
- free(configFile1);
- g_pVBoxFuncs->pfnComUnallocMem(configFile);
+ PRUnichar *configFileUtf16;
+ char *configFileUtf8;
+
+ machine->vtbl->GetSettingsFilePath(machine, &configFileUtf16);
+ g_pVBoxFuncs->pfnUtf16ToUtf8(configFileUtf16, &configFileUtf8);
+ g_pVBoxFuncs->pfnComUnallocMem(configFileUtf16);
+ printf("\tConfig file: %s\n", configFileUtf8);
+ g_pVBoxFuncs->pfnUtf8Free(configFileUtf8);
}
{
@@ -214,14 +643,14 @@ static void listVMs(IVirtualBox *virtualBox, ISession *session)
machine->vtbl->GetOSTypeId(machine, &typeId);
virtualBox->vtbl->GetGuestOSType(virtualBox, typeId, &osType);
+ g_pVBoxFuncs->pfnComUnallocMem(typeId);
osType->vtbl->GetDescription(osType, &osNameUtf16);
g_pVBoxFuncs->pfnUtf16ToUtf8(osNameUtf16,&osName);
+ g_pVBoxFuncs->pfnComUnallocMem(osNameUtf16);
printf("\tGuest OS: %s\n\n", osName);
+ g_pVBoxFuncs->pfnUtf8Free(osName);
osType->vtbl->nsisupports.Release((nsISupports *)osType);
- g_pVBoxFuncs->pfnUtf8Free(osName);
- g_pVBoxFuncs->pfnComUnallocMem(osNameUtf16);
- g_pVBoxFuncs->pfnComUnallocMem(typeId);
}
}
}
@@ -243,9 +672,8 @@ static void listVMs(IVirtualBox *virtualBox, ISession *session)
PRUnichar *uuidUtf16 = NULL;
machine->vtbl->GetId(machine, &uuidUtf16);
- startVM(virtualBox, session, uuidUtf16);
-
- g_pVBoxFuncs->pfnUtf16Free(uuidUtf16);
+ startVM(argv0, virtualBox, session, uuidUtf16, queue);
+ g_pVBoxFuncs->pfnComUnallocMem(uuidUtf16);
}
}
@@ -262,27 +690,24 @@ static void listVMs(IVirtualBox *virtualBox, ISession *session)
machine->vtbl->nsisupports.Release((nsISupports *)machine);
}
}
+ if (machines)
+ g_pVBoxFuncs->pfnComUnallocMem(machines);
}
/* Main - Start the ball rolling. */
int main(int argc, char **argv)
{
+ IVirtualBoxClient *vboxclient = NULL;
IVirtualBox *vbox = NULL;
ISession *session = NULL;
+ nsIEventQueue *queue = NULL;
PRUint32 revision = 0;
PRUnichar *versionUtf16 = NULL;
PRUnichar *homefolderUtf16 = NULL;
nsresult rc; /* Result code of various function (method) calls. */
- printf("Starting Main\n");
-
- /*
- * VBoxComInitialize does all the necessary startup action and
- * provides us with pointers to vbox and session handles.
- * It should be matched by a call to VBoxComUninitialize(vbox)
- * when done.
- */
+ printf("Starting main()\n");
if (VBoxCGlueInit() != 0)
{
@@ -291,39 +716,50 @@ int main(int argc, char **argv)
return EXIT_FAILURE;
}
- g_pVBoxFuncs->pfnComInitialize(IVIRTUALBOX_IID_STR, &vbox,
- ISESSION_IID_STR, &session);
- if (vbox == NULL)
{
- fprintf(stderr, "%s: FATAL: could not get vbox handle\n", argv[0]);
+ unsigned ver = g_pVBoxFuncs->pfnGetVersion();
+ printf("VirtualBox version: %u.%u.%u\n", ver / 1000000, ver / 1000 % 1000, ver % 1000);
+ ver = g_pVBoxFuncs->pfnGetAPIVersion();
+ printf("VirtualBox API version: %u.%u\n", ver / 1000, ver % 1000);
+ }
+
+ g_pVBoxFuncs->pfnClientInitialize(IVIRTUALBOXCLIENT_IID_STR, &vboxclient);
+ if (vboxclient == NULL)
+ {
+ fprintf(stderr, "%s: FATAL: could not get VirtualBoxClient reference\n", argv[0]);
return EXIT_FAILURE;
}
- if (session == NULL)
+
+ printf("----------------------------------------------------\n");
+
+ rc = vboxclient->vtbl->GetVirtualBox(vboxclient, &vbox);
+ if (NS_FAILED(rc) || !vbox)
+ {
+ PrintErrorInfo(argv[0], "FATAL: could not get VirtualBox reference", rc);
+ return EXIT_FAILURE;
+ }
+ rc = vboxclient->vtbl->GetSession(vboxclient, &session);
+ if (NS_FAILED(rc) || !session)
{
- fprintf(stderr, "%s: FATAL: could not get session handle\n", argv[0]);
+ PrintErrorInfo(argv[0], "FATAL: could not get Session reference", rc);
return EXIT_FAILURE;
}
+ g_pVBoxFuncs->pfnGetEventQueue(&queue);
+
/*
* Now ask for revision, version and home folder information of
* this vbox. Were not using fancy macros here so it
* remains easy to see how we access C++'s vtable.
*/
- printf("----------------------------------------------------\n");
-
/* 1. Revision */
rc = vbox->vtbl->GetRevision(vbox, &revision);
if (NS_SUCCEEDED(rc))
- {
printf("\tRevision: %u\n", revision);
- }
else
- {
- fprintf(stderr, "%s: GetRevision() returned %08x\n",
- argv[0], (unsigned)rc);
- }
+ PrintErrorInfo(argv[0], "GetRevision() failed", rc);
/* 2. Version */
@@ -337,10 +773,7 @@ int main(int argc, char **argv)
g_pVBoxFuncs->pfnComUnallocMem(versionUtf16);
}
else
- {
- fprintf(stderr, "%s: GetVersion() returned %08x\n",
- argv[0], (unsigned)rc);
- }
+ PrintErrorInfo(argv[0], "GetVersion() failed", rc);
/* 3. Home Folder */
@@ -354,12 +787,9 @@ int main(int argc, char **argv)
g_pVBoxFuncs->pfnComUnallocMem(homefolderUtf16);
}
else
- {
- fprintf(stderr, "%s: GetHomeFolder() returned %08x\n",
- argv[0], (unsigned)rc);
- }
+ PrintErrorInfo(argv[0], "GetHomeFolder() failed", rc);
- listVMs(vbox, session);
+ listVMs(argv[0], vbox, session, queue);
session->vtbl->UnlockMachine(session);
printf("----------------------------------------------------\n");
@@ -368,9 +798,24 @@ int main(int argc, char **argv)
* Do as mom told us: always clean up after yourself.
*/
- g_pVBoxFuncs->pfnComUninitialize();
+ if (session)
+ {
+ session->vtbl->nsisupports.Release((nsISupports *)session);
+ session = NULL;
+ }
+ if (vbox)
+ {
+ vbox->vtbl->nsisupports.Release((nsISupports *)vbox);
+ vbox = NULL;
+ }
+ if (vboxclient)
+ {
+ vboxclient->vtbl->nsisupports.Release((nsISupports *)vboxclient);
+ vboxclient = NULL;
+ }
+ g_pVBoxFuncs->pfnClientUninitialize();
VBoxCGlueTerm();
- printf("Finished Main\n");
+ printf("Finished main()\n");
return 0;
}
diff --git a/src/VBox/Main/cbinding/xpcidl.xsl b/src/VBox/Main/cbinding/xpcidl.xsl
index c1220c7..71deff3 100644
--- a/src/VBox/Main/cbinding/xpcidl.xsl
+++ b/src/VBox/Main/cbinding/xpcidl.xsl
@@ -5,7 +5,7 @@
* A template to generate a XPCOM IDL compatible interface definition file
* from the generic interface definition expressed in XML.
- Copyright (C) 2008-2012 Oracle Corporation
+ Copyright (C) 2008-2013 Oracle Corporation
This file is part of VirtualBox Open Source Edition (OSE), as
available from http://www.virtualbox.org. This file is free software;
@@ -1007,22 +1007,133 @@ typedef struct VBOXXPCOMC
/** The structure version. */
unsigned uVersion;
+ /** Gets the VirtualBox version, major * 1000000 + minor * 1000 + patch. */
unsigned int (*pfnGetVersion)(void);
+ /** Gets the VirtualBox API version, major * 1000 + minor, e.g. 4003. */
+ unsigned int (*pfnGetAPIVersion)(void);
+
+ /**
+ * New and preferred way to initialize the C bindings for an API client.
+ *
+ * This way is much more flexible, as it can easily handle multiple
+ * sessions (important with more complicated API clients, including
+ * multithreaded ones), and even VBoxSVC crashes can be detected and
+ * processed appropriately by listening for events from the associated
+ * event source in VirtualBoxClient. It is completely up to the client
+ * to decide what to do (terminate or continue after getting new
+ * object references to server-side objects). Must be called in the
+ * primary thread of the client, later API use can be done in any
+ * thread.
+ *
+ * Note that the returned reference is owned by the caller, and thus it's
+ * the caller's responsibility to handle the reference count appropriately.
+ *
+ * @param pszVirtualBoxClientIID pass IVIRTUALBOXCLIENT_IID_STR
+ * @param ppVirtualBoxClient output parameter for VirtualBoxClient
+ * reference, handled as usual with XPCOM.
+ * @returns XPCOM error code
+ */
+ nsresult (*pfnClientInitialize)(const char *pszVirtualBoxClientIID,
+ IVirtualBoxClient **ppVirtualBoxClient);
+ /**
+ * Uninitialize the C bindings for an API client.
+ *
+ * Should be called when the API client is about to terminate and does
+ * not want to use the C bindings any more. It will invalidate all
+ * object references. It is possible, however, to change one's mind,
+ * and call pfnClientInitialize again to continue using the API, as long
+ * as none of the object references from before the re-initialization
+ * are used. Must be called from the primary thread of the client.
+ */
+ void (*pfnClientUninitialize)(void);
+
+ /**
+ * Deprecated way to initialize the C bindings and getting important
+ * object references. Kept for backwards compatibility.
+ *
+ * If any returned reference is NULL then the initialization failed.
+ * Note that the returned references are owned by the C bindings. The
+ * number of calls to Release in the client code must match the number
+ * of calls to AddRef, and additionally at no point in time there can
+ * be more Release calls than AddRef calls.
+ *
+ * @param pszVirtualBoxIID pass IVIRTUALBOX_IID_STR
+ * @param ppVirtualBox output parameter for VirtualBox reference,
+ * owned by C bindings
+ * @param pszSessionIID pass ISESSION_IID_STR
+ * @param ppSession output parameter for Session reference,
+ * owned by C bindings
+ */
void (*pfnComInitialize)(const char *pszVirtualBoxIID,
IVirtualBox **ppVirtualBox,
const char *pszSessionIID,
ISession **ppSession);
+ /**
+ * Deprecated way to uninitialize the C bindings for an API client.
+ * Kept for backwards compatibility and must be used if the C bindings
+ * were initialized using pfnComInitialize. */
void (*pfnComUninitialize)(void);
+ /**
+ * Free memory managed by XPCOM.
+ *
+ * @param pv pointer to memory block to be freed
+ */
void (*pfnComUnallocMem)(void *pv);
- void (*pfnUtf16Free)(PRUnichar *pwszString);
- void (*pfnUtf8Free)(char *pszString);
+ /**
+ * Convert string from UTF-16 encoding to UTF-8 encoding.
+ *
+ * @param pwszString input string
+ * @param ppszString output string
+ * @returns IPRT status code
+ */
int (*pfnUtf16ToUtf8)(const PRUnichar *pwszString, char **ppszString);
+ /**
+ * Convert string from UTF-8 encoding to UTF-16 encoding.
+ *
+ * @param pszString input string
+ * @param ppwszString output string
+ * @returns IPRT status code
+ */
int (*pfnUtf8ToUtf16)(const char *pszString, PRUnichar **ppwszString);
+ /**
+ * Free memory returned by pfnUtf16ToUtf8. Do not use for anything else.
+ *
+ * @param pszString string to be freed.
+ */
+ void (*pfnUtf8Free)(char *pszString);
+ /**
+ * Free memory returned by pfnUtf8ToUtf16. Do not use for anything else.
+ *
+ * @param pwszString string to be freed.
+ */
+ void (*pfnUtf16Free)(PRUnichar *pwszString);
- void (*pfnGetEventQueue)(nsIEventQueue **eventQueue);
+ /**
+ * Get main XPCOM event queue.
+ *
+ * @param ppEventQueue output parameter for nsIEventQueue reference,
+ * owned by C bindings.
+ */
+ void (*pfnGetEventQueue)(nsIEventQueue **ppEventQueue);
+
+ /**
+ * Get current XPCOM exception.
+ *
+ * @param ppException output parameter for nsIException reference,
+ * may be @c NULL if no exception object has been created by
+ * a previous XPCOM call.
+ * @returns XPCOM error code
+ */
+ nsresult (*pfnGetException)(nsIException **ppException);
+ /**
+ * Clears current XPCOM exception.
+ *
+ * @returns XPCOM error code
+ */
+ nsresult (*pfnClearException)(void);
/** Tail version, same as uVersion. */
unsigned uEndVersion;
@@ -1033,7 +1144,7 @@ typedef VBOXXPCOMC const *PCVBOXXPCOM;
/** The current interface version.
* For use with VBoxGetXPCOMCFunctions and to be found in
* VBOXXPCOMC::uVersion. */
-#define VBOX_XPCOMC_VERSION 0x00020000U
+#define VBOX_XPCOMC_VERSION 0x00030000U
VBOXXPCOMC_DECL(PCVBOXXPCOM) VBoxGetXPCOMCFunctions(unsigned uVersion);
/** Typedef for VBoxGetXPCOMCFunctions. */
@@ -1773,10 +1884,7 @@ typedef PCVBOXXPCOM (*PFNVBOXGETXPCOMCFUNCTIONS)(unsigned uVersion);
</xsl:when>
<xsl:when test="@dir='out'">
<xsl:apply-templates select="@type" mode="forwarder"/>
- <xsl:if test="@type='wstring'">
- <xsl:text>*</xsl:text>
- </xsl:if>
- <xsl:text>*</xsl:text>
+ <xsl:text>**</xsl:text>
</xsl:when>
<xsl:when test="@dir='return'">
<xsl:apply-templates select="@type" mode="forwarder"/>
diff --git a/src/VBox/Main/glue/vboxapi.py b/src/VBox/Main/glue/vboxapi.py
index 87f2400..3cda567 100644
--- a/src/VBox/Main/glue/vboxapi.py
+++ b/src/VBox/Main/glue/vboxapi.py
@@ -16,7 +16,7 @@ Foundation, in version 2 as it comes in the "COPYING" file of the
VirtualBox OSE distribution. VirtualBox OSE is distributed in the
hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
"""
-__version__ = "$Revision: 88749 $"
+__version__ = "$Revision: 91042 $"
# Note! To set Python bitness on OSX use 'export VERSIONER_PYTHON_PREFER_32_BIT=yes'
@@ -43,7 +43,7 @@ if VBoxSdkDir is None:
# Will be set by the installer
VBoxSdkDir = "%VBOX_SDK_PATH%"
else:
- VBoxBinDir = os.path.abspath(VBoxSdkDir);
+ VBoxSdkDir = os.path.abspath(VBoxSdkDir);
os.environ["VBOX_PROGRAM_PATH"] = VBoxBinDir
os.environ["VBOX_SDK_PATH"] = VBoxSdkDir
diff --git a/src/VBox/Main/idl/VirtualBox.xidl b/src/VBox/Main/idl/VirtualBox.xidl
index 24b340b..9e65d3e 100644
--- a/src/VBox/Main/idl/VirtualBox.xidl
+++ b/src/VBox/Main/idl/VirtualBox.xidl
@@ -9981,13 +9981,16 @@
<desc>No flag set.</desc>
</const>
<const name="Recursive" value="1">
- <desc>Copy directories recursively.</desc>
+ <desc>Copy directories recursively.
+ This flag is not implemented yet.</desc>
</const>
<const name="Update" value="2">
- <desc>Only copy when the source file is newer than the destination file or when the destination file is missing.</desc>
+ <desc>Only copy when the source file is newer than the destination file
+ or when the destination file is missing. This flag is not implemented
+ yet.</desc>
</const>
<const name="FollowLinks" value="4">
- <desc>Follow symbolic links.</desc>
+ <desc>Follow symbolic links. This flag is not implemented yet.</desc>
</const>
</enum>
diff --git a/src/VBox/Main/idl/comimpl.xsl b/src/VBox/Main/idl/comimpl.xsl
index f01b9dc..59ae42b 100644
--- a/src/VBox/Main/idl/comimpl.xsl
+++ b/src/VBox/Main/idl/comimpl.xsl
@@ -195,7 +195,7 @@
<xsl:when test="$safearray='yes'">
<xsl:variable name="elemtype">
<xsl:call-template name="typeIdl2Back">
- <xsl:with-param name="type" select="@type" />
+ <xsl:with-param name="type" select="$type" />
<xsl:with-param name="safearray" select="''" />
<xsl:with-param name="dir" select="'in'" />
</xsl:call-template>
@@ -218,7 +218,7 @@
<xsl:when test="$safearray='yes'">
<xsl:variable name="elemtype">
<xsl:call-template name="typeIdl2Back">
- <xsl:with-param name="type" select="@type" />
+ <xsl:with-param name="type" select="$type" />
<xsl:with-param name="safearray" select="''" />
<xsl:with-param name="dir" select="'in'" />
</xsl:call-template>
@@ -327,10 +327,10 @@
</xsl:variable>
<xsl:choose>
- <xsl:when test="$extends='IEvent'">
+ <xsl:when test="$name='IEvent'">
<xsl:value-of select=" '#ifdef VBOX_WITH_XPCOM
'" />
<xsl:value-of select="concat('NS_DECL_CLASSINFO(', $impl, ')
')" />
- <xsl:value-of select="concat('NS_IMPL_THREADSAFE_ISUPPORTS',$depth,'_CI(', $impl, ', ', $name, $parents, ', IEvent)
')" />
+ <xsl:value-of select="concat('NS_IMPL_THREADSAFE_ISUPPORTS',$depth,'_CI(', $impl, $parents, ', IEvent)
')" />
<xsl:value-of select=" '#endif
'"/>
</xsl:when>
<xsl:when test="//interface[@name=$extends]">
@@ -338,7 +338,7 @@
<xsl:with-param name="impl" select="$impl" />
<xsl:with-param name="name" select="$extends" />
<xsl:with-param name="depth" select="$depth+1" />
- <xsl:with-param name="parents" select="concat($parents, ', ', @name)" />
+ <xsl:with-param name="parents" select="concat($parents, ', ', $name)" />
</xsl:call-template>
</xsl:when>
<xsl:otherwise>
@@ -591,7 +591,7 @@ private:
<xsl:call-template name="genImplList">
<xsl:with-param name="impl" select="$implName" />
<xsl:with-param name="name" select="@name" />
- <xsl:with-param name="depth" select="'2'" />
+ <xsl:with-param name="depth" select="'1'" />
<xsl:with-param name="parents" select="''" />
</xsl:call-template>
diff --git a/src/VBox/Main/include/DHCPServerImpl.h b/src/VBox/Main/include/DHCPServerImpl.h
index 2e46a83..c740f16 100644
--- a/src/VBox/Main/include/DHCPServerImpl.h
+++ b/src/VBox/Main/include/DHCPServerImpl.h
@@ -42,6 +42,10 @@ class DHCPServerRunner: public NetworkServiceRunner
public:
DHCPServerRunner():NetworkServiceRunner(DHCP_EXECUTABLE_NAME){}
virtual ~DHCPServerRunner(){};
+
+ static const std::string kDsrKeyGateway;
+ static const std::string kDsrKeyLowerIp;
+ static const std::string kDsrKeyUpperIp;
};
/**
diff --git a/src/VBox/Main/include/DisplayImpl.h b/src/VBox/Main/include/DisplayImpl.h
index b9489e6..4e57f7d 100644
--- a/src/VBox/Main/include/DisplayImpl.h
+++ b/src/VBox/Main/include/DisplayImpl.h
@@ -84,8 +84,8 @@ typedef struct _DISPLAYFBINFO
void *pvVRAM;
uint32_t bpp;
uint32_t cbLine;
- int w;
- int h;
+ uint32_t w;
+ uint32_t h;
uint16_t flags;
} pendingResize;
@@ -142,11 +142,11 @@ public:
int registerSSM(PUVM pUVM);
// public methods only for internal purposes
- int handleDisplayResize(unsigned uScreenId, uint32_t bpp, void *pvVRAM, uint32_t cbLine, int w, int h, uint16_t flags);
+ int handleDisplayResize(unsigned uScreenId, uint32_t bpp, void *pvVRAM, uint32_t cbLine, uint32_t w, uint32_t h, uint16_t flags);
void handleDisplayUpdateLegacy(int x, int y, int cx, int cy);
void handleDisplayUpdate(unsigned uScreenId, int x, int y, int w, int h);
#ifdef VBOX_WITH_VIDEOHWACCEL
- void handleVHWACommandProcess(PPDMIDISPLAYCONNECTOR pInterface, PVBOXVHWACMD pCommand);
+ int handleVHWACommandProcess(PVBOXVHWACMD pCommand);
#endif
#ifdef VBOX_WITH_CRHGSMI
void handleCrHgsmiCommandProcess(PPDMIDISPLAYCONNECTOR pInterface, PVBOXVDMACMD_CHROMIUM_CMD pCmd, uint32_t cbCmd);
@@ -202,7 +202,7 @@ public:
private:
- void updateDisplayData(void);
+ int updateDisplayData(void);
#ifdef VBOX_WITH_CRHGSMI
void setupCrHgsmiData(void);
@@ -224,7 +224,7 @@ private:
static DECLCALLBACK(void) displayProcessDisplayDataCallback(PPDMIDISPLAYCONNECTOR pInterface, void *pvVRAM, unsigned uScreenId);
#ifdef VBOX_WITH_VIDEOHWACCEL
- static DECLCALLBACK(void) displayVHWACommandProcess(PPDMIDISPLAYCONNECTOR pInterface, PVBOXVHWACMD pCommand);
+ static DECLCALLBACK(int) displayVHWACommandProcess(PPDMIDISPLAYCONNECTOR pInterface, PVBOXVHWACMD pCommand);
#endif
#ifdef VBOX_WITH_CRHGSMI
@@ -265,8 +265,8 @@ private:
void *mLastAddress;
uint32_t mLastBytesPerLine;
uint32_t mLastBitsPerPixel;
- int mLastWidth;
- int mLastHeight;
+ uint32_t mLastWidth;
+ uint32_t mLastHeight;
uint16_t mLastFlags;
VBVAMEMORY *mpVbvaMemory;
diff --git a/src/VBox/Main/include/GuestCtrlImplPrivate.h b/src/VBox/Main/include/GuestCtrlImplPrivate.h
index 61764ab..bd8a0f4 100644
--- a/src/VBox/Main/include/GuestCtrlImplPrivate.h
+++ b/src/VBox/Main/include/GuestCtrlImplPrivate.h
@@ -149,6 +149,7 @@ struct GuestFsObjData
/** Helper function to extract the data from
* a certin VBoxService tool's guest stream block. */
int FromLs(const GuestProcessStreamBlock &strmBlk);
+ int FromMkTemp(const GuestProcessStreamBlock &strmBlk);
int FromStat(const GuestProcessStreamBlock &strmBlk);
int64_t mAccessTime;
@@ -284,6 +285,8 @@ public:
size_t GetCount(void) const;
+ int GetRc(void) const;
+
const char* GetString(const char *pszKey) const;
int GetUInt32Ex(const char *pszKey, uint32_t *puVal) const;
@@ -638,6 +641,8 @@ public:
protected:
+ virtual int onRemove(void) = 0;
+
/** Callback dispatcher -- must be implemented by the actual object. */
virtual int callbackDispatcher(PVBOXGUESTCTRLHOSTCBCTX pCbCtx, PVBOXGUESTCTRLHOSTCALLBACK pSvcCb) = 0;
diff --git a/src/VBox/Main/include/GuestDirectoryImpl.h b/src/VBox/Main/include/GuestDirectoryImpl.h
index 99070f1..7c454ea 100644
--- a/src/VBox/Main/include/GuestDirectoryImpl.h
+++ b/src/VBox/Main/include/GuestDirectoryImpl.h
@@ -63,6 +63,7 @@ public:
* @{ */
int callbackDispatcher(PVBOXGUESTCTRLHOSTCBCTX pCbCtx, PVBOXGUESTCTRLHOSTCALLBACK pSvcCb);
static Utf8Str guestErrorToString(int guestRc);
+ int onRemove(void);
static HRESULT setErrorExternal(VirtualBoxBase *pInterface, int guestRc);
/** @} */
diff --git a/src/VBox/Main/include/GuestFileImpl.h b/src/VBox/Main/include/GuestFileImpl.h
index e6bc7df..7890cb4 100644
--- a/src/VBox/Main/include/GuestFileImpl.h
+++ b/src/VBox/Main/include/GuestFileImpl.h
@@ -86,6 +86,7 @@ public:
static Utf8Str guestErrorToString(int guestRc);
int onFileNotify(PVBOXGUESTCTRLHOSTCBCTX pCbCtx, PVBOXGUESTCTRLHOSTCALLBACK pSvcCbData);
int onGuestDisconnected(PVBOXGUESTCTRLHOSTCBCTX pCbCtx, PVBOXGUESTCTRLHOSTCALLBACK pSvcCbData);
+ int onRemove(void);
int openFile(uint32_t uTimeoutMS, int *pGuestRc);
int readData(uint32_t uSize, uint32_t uTimeoutMS, void* pvData, uint32_t cbData, uint32_t* pcbRead);
int readDataAt(uint64_t uOffset, uint32_t uSize, uint32_t uTimeoutMS, void* pvData, size_t cbData, size_t* pcbRead);
diff --git a/src/VBox/Main/include/GuestProcessImpl.h b/src/VBox/Main/include/GuestProcessImpl.h
index e296e00..95564b4 100644
--- a/src/VBox/Main/include/GuestProcessImpl.h
+++ b/src/VBox/Main/include/GuestProcessImpl.h
@@ -76,6 +76,7 @@ public:
int callbackDispatcher(PVBOXGUESTCTRLHOSTCBCTX pCbCtx, PVBOXGUESTCTRLHOSTCALLBACK pSvcCb);
inline int checkPID(uint32_t uPID);
static Utf8Str guestErrorToString(int guestRc);
+ int onRemove(void);
int readData(uint32_t uHandle, uint32_t uSize, uint32_t uTimeoutMS, void *pvData, size_t cbData, uint32_t *pcbRead, int *pGuestRc);
static HRESULT setErrorExternal(VirtualBoxBase *pInterface, int guestRc);
int startProcess(uint32_t uTimeoutMS, int *pGuestRc);
diff --git a/src/VBox/Main/include/GuestSessionImpl.h b/src/VBox/Main/include/GuestSessionImpl.h
index 63d4150..263ed6d 100644
--- a/src/VBox/Main/include/GuestSessionImpl.h
+++ b/src/VBox/Main/include/GuestSessionImpl.h
@@ -342,7 +342,7 @@ public:
int directoryRemoveFromList(GuestDirectory *pDirectory);
int directoryRemoveInternal(const Utf8Str &strPath, uint32_t uFlags, int *pGuestRc);
int directoryCreateInternal(const Utf8Str &strPath, uint32_t uMode, uint32_t uFlags, int *pGuestRc);
- int objectCreateTempInternal(const Utf8Str &strTemplate, const Utf8Str &strPath, bool fDirectory, const Utf8Str &strName, int *pGuestRc);
+ int objectCreateTempInternal(const Utf8Str &strTemplate, const Utf8Str &strPath, bool fDirectory, Utf8Str &strName, int *pGuestRc);
int directoryOpenInternal(const GuestDirectoryOpenInfo &openInfo, ComObjPtr<GuestDirectory> &pDirectory, int *pGuestRc);
int directoryQueryInfoInternal(const Utf8Str &strPath, GuestFsObjData &objData, int *pGuestRc);
int dispatchToDirectory(PVBOXGUESTCTRLHOSTCBCTX pCtxCb, PVBOXGUESTCTRLHOSTCALLBACK pSvcCb);
@@ -364,6 +364,7 @@ public:
ULONG getId(void) { return mData.mSession.mID; }
static Utf8Str guestErrorToString(int guestRc);
HRESULT isReadyExternal(void);
+ int onRemove(void);
int onSessionStatusChange(PVBOXGUESTCTRLHOSTCBCTX pCbCtx, PVBOXGUESTCTRLHOSTCALLBACK pSvcCbData);
int startSessionInternal(int *pGuestRc);
int startSessionAsync(void);
diff --git a/src/VBox/Main/include/MachineImpl.h b/src/VBox/Main/include/MachineImpl.h
index 0b619a3..cea78f3 100644
--- a/src/VBox/Main/include/MachineImpl.h
+++ b/src/VBox/Main/include/MachineImpl.h
@@ -790,9 +790,7 @@ public:
ComPtr<IInternalSessionControl> *aControl = NULL)
{ return isSessionOpen(aMachine, aControl, true /* aAllowClosing */); }
-#ifndef VBOX_WITH_GENERIC_SESSION_WATCHER
bool checkForSpawnFailure();
-#endif /* !VBOX_WITH_GENERIC_SESSION_WATCHER */
HRESULT prepareRegister();
diff --git a/src/VBox/Main/include/NATNetworkImpl.h b/src/VBox/Main/include/NATNetworkImpl.h
index fe131e3..1ce0769 100644
--- a/src/VBox/Main/include/NATNetworkImpl.h
+++ b/src/VBox/Main/include/NATNetworkImpl.h
@@ -48,7 +48,7 @@ class NATNetworkServiceRunner: public NetworkServiceRunner
{
public:
NATNetworkServiceRunner(): NetworkServiceRunner(NATSR_EXECUTABLE_NAME){}
- virtual ~NATNetworkServiceRunner(){}
+ ~NATNetworkServiceRunner(){}
};
class ATL_NO_VTABLE NATNetwork :
diff --git a/src/VBox/Main/include/NetworkServiceRunner.h b/src/VBox/Main/include/NetworkServiceRunner.h
index da32559..f0ec275 100644
--- a/src/VBox/Main/include/NetworkServiceRunner.h
+++ b/src/VBox/Main/include/NetworkServiceRunner.h
@@ -21,18 +21,7 @@
#include <iprt/mem.h>
#include <VBox/com/string.h>
-typedef enum
-{
- NETCFG_NAME = 1,
- NETCFG_NETNAME,
- NETCFG_TRUNKTYPE,
- NETCFG_TRUNKNAME,
- NETCFG_MACADDRESS,
- NETCFG_IPADDRESS,
- NETCFG_NETMASK,
- NETCFG_VERBOSE,
- NETCFG_NOTOPT_MAXVAL
-} NETCFG;
+#include <string>
#define TRUNKTYPE_WHATEVER "whatever"
#define TRUNKTYPE_NETFLT "netflt"
@@ -42,43 +31,27 @@ typedef enum
class NetworkServiceRunner
{
public:
- NetworkServiceRunner(const char *aProcName)
- : mProcName(aProcName)
- , mProcess(NIL_RTPROCESS)
- {
- RT_ZERO(mOptionEnabled);
- };
- ~NetworkServiceRunner()
- {
- stop(); /* don't leave abandoned servers */
- }
-
- int setOption(NETCFG opt, const char *val, bool enabled)
- {
- if (opt == 0 || opt >= NETCFG_NOTOPT_MAXVAL)
- return VERR_INVALID_PARAMETER;
- if (isRunning())
- return VERR_INVALID_STATE;
-
- mOptions[opt] = val;
- mOptionEnabled[opt] = enabled;
- return VINF_SUCCESS;
- }
+ NetworkServiceRunner(const char *aProcName);
+ virtual ~NetworkServiceRunner();
- int setOption(NETCFG opt, const com::Utf8Str &val, bool enabled)
- {
- return setOption(opt, val.c_str(), enabled);
- }
+ int setOption(const std::string& key, const std::string& val);
int start();
int stop();
bool isRunning();
void detachFromServer();
+
+ static const std::string kNsrKeyName;
+ static const std::string kNsrKeyNetwork;
+ static const std::string kNsrKeyTrunkType;
+ static const std::string kNsrTrunkName;
+ static const std::string kNsrMacAddress;
+ static const std::string kNsrIpAddress;
+ static const std::string kNsrIpNetmask;
+ static const std::string kNsrKeyNeedMain;
+
private:
- com::Utf8Str mOptions[NETCFG_NOTOPT_MAXVAL];
- bool mOptionEnabled[NETCFG_NOTOPT_MAXVAL];
- const char *mProcName;
- RTPROCESS mProcess;
+ struct Data;
+ Data *m;
};
-
diff --git a/src/VBox/Main/include/Wrapper.h b/src/VBox/Main/include/Wrapper.h
index e9aec4c..36f8016 100644
--- a/src/VBox/Main/include/Wrapper.h
+++ b/src/VBox/Main/include/Wrapper.h
@@ -305,7 +305,7 @@ public:
{
}
- ComTypeInConverter(A *aSrc) : mSrc(mSrc)
+ ComTypeInConverter(A *aSrc) : mSrc(aSrc)
{
}
diff --git a/src/VBox/Main/src-client/ConsoleImpl.cpp b/src/VBox/Main/src-client/ConsoleImpl.cpp
index d5b5a7e..5fd97bf 100644
--- a/src/VBox/Main/src-client/ConsoleImpl.cpp
+++ b/src/VBox/Main/src-client/ConsoleImpl.cpp
@@ -373,7 +373,7 @@ public:
return S_OK;
}
private:
- Console *mConsole;
+ ComObjPtr<Console> mConsole;
};
typedef ListenerImpl<VmEventListener, Console*> VmEventListenerImpl;
diff --git a/src/VBox/Main/src-client/ConsoleImpl2.cpp b/src/VBox/Main/src-client/ConsoleImpl2.cpp
index 6cb19bc..01d06a1 100644
--- a/src/VBox/Main/src-client/ConsoleImpl2.cpp
+++ b/src/VBox/Main/src-client/ConsoleImpl2.cpp
@@ -965,28 +965,34 @@ int Console::configConstructorInner(PUVM pUVM, PVM pVM, AutoWriteLock *pAlock)
/*
* Hardware virtualization extensions.
*/
+ BOOL fSupportsHwVirtEx;
+ hrc = host->GetProcessorFeature(ProcessorFeature_HWVirtEx, &fSupportsHwVirtEx); H();
+
BOOL fIsGuest64Bit;
hrc = pMachine->GetCPUProperty(CPUPropertyType_LongMode, &fIsGuest64Bit); H();
- BOOL fSupportsLongMode;
- hrc = host->GetProcessorFeature(ProcessorFeature_LongMode, &fSupportsLongMode); H();
- if (!fSupportsLongMode && fIsGuest64Bit)
+ if (fIsGuest64Bit)
{
- LogRel(("WARNING! 64-bit guest type selected but the host CPU does NOT support 64-bit.\n"));
- fIsGuest64Bit = FALSE;
+ BOOL fSupportsLongMode;
+ hrc = host->GetProcessorFeature(ProcessorFeature_LongMode, &fSupportsLongMode); H();
+ if (!fSupportsLongMode)
+ {
+ LogRel(("WARNING! 64-bit guest type selected but the host CPU does NOT support 64-bit.\n"));
+ fIsGuest64Bit = FALSE;
+ }
+ if (!fSupportsHwVirtEx)
+ {
+ LogRel(("WARNING! 64-bit guest type selected but the host CPU does NOT support HW virtualization.\n"));
+ fIsGuest64Bit = FALSE;
+ }
}
BOOL fHMEnabled;
- hrc = pMachine->GetHWVirtExProperty(HWVirtExPropertyType_Enabled, &fHMEnabled); H();
+ hrc = pMachine->GetHWVirtExProperty(HWVirtExPropertyType_Enabled, &fHMEnabled); H();
if (cCpus > 1 && !fHMEnabled)
{
LogRel(("Forced fHMEnabled to TRUE by SMP guest.\n"));
fHMEnabled = TRUE;
}
- if (!fHMEnabled && fIsGuest64Bit)
- {
- LogRel(("WARNING! 64-bit guest type selected on host without hardware virtualization (VT-x or AMD-V).\n"));
- fIsGuest64Bit = FALSE;
- }
BOOL fHMForced;
#ifdef VBOX_WITH_RAW_MODE
@@ -1037,7 +1043,7 @@ int Console::configConstructorInner(PUVM pUVM, PVM pVM, AutoWriteLock *pAlock)
/* /HM/xzy */
PCFGMNODE pHM;
InsertConfigNode(pRoot, "HM", &pHM);
- InsertConfigInteger(pRoot, "HMForced", fHMForced);
+ InsertConfigInteger(pHM, "HMForced", fHMForced);
if (fHMEnabled)
{
/* Indicate whether 64-bit guests are supported or not. */
@@ -1049,8 +1055,7 @@ int Console::configConstructorInner(PUVM pUVM, PVM pVM, AutoWriteLock *pAlock)
#endif
/** @todo Not exactly pretty to check strings; VBOXOSTYPE would be better, but that requires quite a bit of API change in Main. */
- if ( !fIsGuest64Bit
- && fIOAPIC
+ if ( fIOAPIC
&& ( osTypeId == "WindowsNT4"
|| osTypeId == "Windows2000"
|| osTypeId == "WindowsXP"
@@ -1165,7 +1170,7 @@ int Console::configConstructorInner(PUVM pUVM, PVM pVM, AutoWriteLock *pAlock)
hrc = bwGroups[i]->COMGETTER(Name)(strName.asOutParam()); H();
hrc = bwGroups[i]->COMGETTER(Type)(&enmType); H();
- hrc = bwGroups[i]->COMGETTER(MaxBytesPerSec)(&cMaxBytesPerSec); H();
+ hrc = bwGroups[i]->COMGETTER(MaxBytesPerSec)(&cMaxBytesPerSec); H();
if (enmType == BandwidthGroupType_Disk)
{
@@ -1353,7 +1358,7 @@ int Console::configConstructorInner(PUVM pUVM, PVM pVM, AutoWriteLock *pAlock)
Mouse *pMouse = mMouse;
PointingHIDType_T aPointingHID;
- hrc = pMachine->COMGETTER(PointingHIDType)(&aPointingHID); H();
+ hrc = pMachine->COMGETTER(PointingHIDType)(&aPointingHID); H();
InsertConfigNode(pInst, "LUN#1", &pLunL0);
InsertConfigString(pLunL0, "Driver", "MouseQueue");
InsertConfigNode(pLunL0, "Config", &pCfg);
@@ -1507,6 +1512,11 @@ int Console::configConstructorInner(PUVM pUVM, PVM pVM, AutoWriteLock *pAlock)
}
InsertConfigString(pBiosCfg, szParamName, pszBootDevice);
}
+
+ /** @todo @bugref{7145}: We might want to enable this by default for new VMs. For now,
+ * this is required for Windows 2012 guests. */
+ if (osTypeId == "Windows2012_64")
+ InsertConfigInteger(pBiosCfg, "DmiExposeMemoryTable", 1); /* boolean */
}
else
{
@@ -2509,33 +2519,17 @@ int Console::configConstructorInner(PUVM pUVM, PVM pVM, AutoWriteLock *pAlock)
/* Virtual USB Mouse/Tablet */
if ( aPointingHID == PointingHIDType_USBMouse
- || aPointingHID == PointingHIDType_ComboMouse
|| aPointingHID == PointingHIDType_USBTablet
|| aPointingHID == PointingHIDType_USBMultiTouch)
- InsertConfigNode(pUsbDevices, "HidMouse", &pDev);
- if (aPointingHID == PointingHIDType_USBMouse)
{
+ InsertConfigNode(pUsbDevices, "HidMouse", &pDev);
InsertConfigNode(pDev, "0", &pInst);
InsertConfigNode(pInst, "Config", &pCfg);
- InsertConfigString(pCfg, "Mode", "relative");
- InsertConfigNode(pInst, "LUN#0", &pLunL0);
- InsertConfigString(pLunL0, "Driver", "MouseQueue");
- InsertConfigNode(pLunL0, "Config", &pCfg);
- InsertConfigInteger(pCfg, "QueueSize", 128);
-
- InsertConfigNode(pLunL0, "AttachedDriver", &pLunL1);
- InsertConfigString(pLunL1, "Driver", "MainMouse");
- InsertConfigNode(pLunL1, "Config", &pCfg);
- InsertConfigInteger(pCfg, "Object", (uintptr_t)pMouse);
- }
- if ( aPointingHID == PointingHIDType_USBTablet
- || aPointingHID == PointingHIDType_USBMultiTouch)
- {
- InsertConfigNode(pDev, "1", &pInst);
- InsertConfigNode(pInst, "Config", &pCfg);
-
- InsertConfigString(pCfg, "Mode", "absolute");
+ if (aPointingHID == PointingHIDType_USBMouse)
+ InsertConfigString(pCfg, "Mode", "relative");
+ else
+ InsertConfigString(pCfg, "Mode", "absolute");
InsertConfigNode(pInst, "LUN#0", &pLunL0);
InsertConfigString(pLunL0, "Driver", "MouseQueue");
InsertConfigNode(pLunL0, "Config", &pCfg);
@@ -2548,7 +2542,7 @@ int Console::configConstructorInner(PUVM pUVM, PVM pVM, AutoWriteLock *pAlock)
}
if (aPointingHID == PointingHIDType_USBMultiTouch)
{
- InsertConfigNode(pDev, "2", &pInst);
+ InsertConfigNode(pDev, "1", &pInst);
InsertConfigNode(pInst, "Config", &pCfg);
InsertConfigString(pCfg, "Mode", "multitouch");
@@ -4992,7 +4986,11 @@ int Console::configNetwork(const char *pszDevice,
/* Stop the hostonly DHCP Server */
}
- if (!networkName.isEmpty())
+ /*
+ * NAT networks start their DHCP server theirself, see NATNetwork::Start()
+ */
+ if ( !networkName.isEmpty()
+ && eAttachmentType != NetworkAttachmentType_NATNetwork)
{
/*
* Until we implement service reference counters DHCP Server will be stopped
diff --git a/src/VBox/Main/src-client/DisplayImpl.cpp b/src/VBox/Main/src-client/DisplayImpl.cpp
index 1768567..547104c 100644
--- a/src/VBox/Main/src-client/DisplayImpl.cpp
+++ b/src/VBox/Main/src-client/DisplayImpl.cpp
@@ -633,7 +633,7 @@ STDMETHODIMP Display::HandleEvent(IEvent * aEvent)
static int callFramebufferResize (IFramebuffer *pFramebuffer, unsigned uScreenId,
ULONG pixelFormat, void *pvVRAM,
uint32_t bpp, uint32_t cbLine,
- int w, int h)
+ uint32_t w, uint32_t h)
{
Assert (pFramebuffer);
@@ -665,7 +665,7 @@ static int callFramebufferResize (IFramebuffer *pFramebuffer, unsigned uScreenId
* @thread EMT
*/
int Display::handleDisplayResize (unsigned uScreenId, uint32_t bpp, void *pvVRAM,
- uint32_t cbLine, int w, int h, uint16_t flags)
+ uint32_t cbLine, uint32_t w, uint32_t h, uint16_t flags)
{
LogRel(("Display::handleDisplayResize(): uScreenId = %d, pvVRAM=%p "
"w=%d h=%d bpp=%d cbLine=0x%X, flags=0x%X\n",
@@ -678,12 +678,15 @@ int Display::handleDisplayResize (unsigned uScreenId, uint32_t bpp, void *pvVRAM
return VINF_SUCCESS;
}
- mLastAddress = pvVRAM;
- mLastBytesPerLine = cbLine;
- mLastBitsPerPixel = bpp,
- mLastWidth = w;
- mLastHeight = h;
- mLastFlags = flags;
+ if (uScreenId == VBOX_VIDEO_PRIMARY_SCREEN)
+ {
+ mLastAddress = pvVRAM;
+ mLastBytesPerLine = cbLine;
+ mLastBitsPerPixel = bpp;
+ mLastWidth = w;
+ mLastHeight = h;
+ mLastFlags = flags;
+ }
ULONG pixelFormat;
@@ -729,6 +732,10 @@ int Display::handleDisplayResize (unsigned uScreenId, uint32_t bpp, void *pvVRAM
return VINF_VGA_RESIZE_IN_PROGRESS;
}
+ /* Framebuffer will be invalid during resize, make sure that it is not accessed. */
+ if (uScreenId == VBOX_VIDEO_PRIMARY_SCREEN)
+ mpDrv->pUpPort->pfnSetRenderVRAM (mpDrv->pUpPort, false);
+
int rc = callFramebufferResize (maFramebuffers[uScreenId].pFramebuffer, uScreenId,
pixelFormat, pvVRAM, bpp, cbLine, w, h);
if (rc == VINF_VGA_RESIZE_IN_PROGRESS)
@@ -793,11 +800,17 @@ void Display::handleResizeCompletedEMT (void)
continue;
}
+ /* Inform VRDP server about the change of display parameters.
+ * Must be done before calling NotifyUpdate below.
+ */
+ LogRelFlowFunc(("Calling VRDP\n"));
+ mParent->consoleVRDPServer()->SendResize();
+
/* @todo Merge these two 'if's within one 'if (!pFBInfo->pFramebuffer.isNull())' */
if (uScreenId == VBOX_VIDEO_PRIMARY_SCREEN && !pFBInfo->pFramebuffer.isNull())
{
/* Primary framebuffer has completed the resize. Update the connector data for VGA device. */
- updateDisplayData();
+ int rc2 = updateDisplayData();
/* Check the framebuffer pixel format to setup the rendering in VGA device. */
BOOL usesGuestVRAM = FALSE;
@@ -808,7 +821,7 @@ void Display::handleResizeCompletedEMT (void)
/* If the primary framebuffer is disabled, tell the VGA device to not to copy
* pixels from VRAM to the framebuffer.
*/
- if (pFBInfo->fDisabled)
+ if (pFBInfo->fDisabled || RT_FAILURE(rc2))
mpDrv->pUpPort->pfnSetRenderVRAM (mpDrv->pUpPort, false);
else
mpDrv->pUpPort->pfnSetRenderVRAM (mpDrv->pUpPort,
@@ -864,10 +877,6 @@ void Display::handleResizeCompletedEMT (void)
}
#endif /* DEBUG_sunlover */
- /* Inform VRDP server about the change of display parameters. */
- LogRelFlowFunc(("Calling VRDP\n"));
- mParent->consoleVRDPServer()->SendResize();
-
#if defined(VBOX_WITH_HGCM) && defined(VBOX_WITH_CROGL)
{
BOOL is3denabled;
@@ -3182,13 +3191,13 @@ STDMETHODIMP Display::ViewportChanged(ULONG aScreenId, ULONG x, ULONG y, ULONG w
*
* @thread EMT
*/
-void Display::updateDisplayData(void)
+int Display::updateDisplayData(void)
{
LogRelFlowFunc(("\n"));
/* the driver might not have been constructed yet */
if (!mpDrv)
- return;
+ return VINF_SUCCESS;
#ifdef VBOX_STRICT
/*
@@ -3229,6 +3238,14 @@ void Display::updateDisplayData(void)
rc = pFramebuffer->COMGETTER(Height) (&height);
AssertComRC (rc);
+ if ( (width != mLastWidth && mLastWidth != 0)
+ || (height != mLastHeight && mLastHeight != 0))
+ {
+ LogRel(("updateDisplayData: size mismatch w %d(%d) h %d(%d)\n",
+ width, mLastWidth, height, mLastHeight));
+ return VERR_INVALID_STATE;
+ }
+
mpDrv->IConnector.pu8Data = (uint8_t *) address;
mpDrv->IConnector.cbScanline = bytesPerLine;
mpDrv->IConnector.cBits = bitsPerPixel;
@@ -3245,6 +3262,7 @@ void Display::updateDisplayData(void)
mpDrv->IConnector.cy = 0;
}
LogRelFlowFunc(("leave\n"));
+ return VINF_SUCCESS;
}
#ifdef VBOX_WITH_CRHGSMI
@@ -3809,48 +3827,42 @@ DECLCALLBACK(void) Display::displayProcessDisplayDataCallback(PPDMIDISPLAYCONNEC
#ifdef VBOX_WITH_VIDEOHWACCEL
-void Display::handleVHWACommandProcess(PPDMIDISPLAYCONNECTOR pInterface, PVBOXVHWACMD pCommand)
+#ifndef S_FALSE
+# define S_FALSE ((HRESULT)1L)
+#endif
+
+int Display::handleVHWACommandProcess(PVBOXVHWACMD pCommand)
{
unsigned id = (unsigned)pCommand->iDisplay;
int rc = VINF_SUCCESS;
- if (id < mcMonitors)
- {
- IFramebuffer *pFramebuffer = maFramebuffers[id].pFramebuffer;
-#ifdef DEBUG_misha
- Assert (pFramebuffer);
-#endif
+ if (id >= mcMonitors)
+ return VERR_INVALID_PARAMETER;
- if (pFramebuffer != NULL)
- {
- HRESULT hr = pFramebuffer->ProcessVHWACommand((BYTE*)pCommand);
- if (FAILED(hr))
- {
- rc = (hr == E_NOTIMPL) ? VERR_NOT_IMPLEMENTED : VERR_GENERAL_FAILURE;
- }
- }
- else
- {
- rc = VERR_NOT_IMPLEMENTED;
- }
- }
- else
- {
- rc = VERR_INVALID_PARAMETER;
- }
+ ComPtr<IFramebuffer> pFramebuffer;
+ AutoReadLock arlock(this COMMA_LOCKVAL_SRC_POS);
+ pFramebuffer = maFramebuffers[id].pFramebuffer;
+ arlock.release();
- if (RT_FAILURE(rc))
- {
- /* tell the guest the command is complete */
- pCommand->Flags &= (~VBOXVHWACMD_FLAG_HG_ASYNCH);
- pCommand->rc = rc;
- }
+ if (pFramebuffer == NULL)
+ return VERR_INVALID_STATE; /* notify we can not handle request atm */
+
+ HRESULT hr = pFramebuffer->ProcessVHWACommand((BYTE*)pCommand);
+ if (hr == S_FALSE)
+ return VINF_SUCCESS;
+ else if (SUCCEEDED(hr))
+ return VINF_CALLBACK_RETURN;
+ else if (hr == E_ACCESSDENIED)
+ return VERR_INVALID_STATE; /* notify we can not handle request atm */
+ else if (hr == E_NOTIMPL)
+ return VERR_NOT_IMPLEMENTED;
+ return VERR_GENERAL_FAILURE;
}
-DECLCALLBACK(void) Display::displayVHWACommandProcess(PPDMIDISPLAYCONNECTOR pInterface, PVBOXVHWACMD pCommand)
+DECLCALLBACK(int) Display::displayVHWACommandProcess(PPDMIDISPLAYCONNECTOR pInterface, PVBOXVHWACMD pCommand)
{
PDRVMAINDISPLAY pDrv = PDMIDISPLAYCONNECTOR_2_MAINDISPLAY(pInterface);
- pDrv->pDisplay->handleVHWACommandProcess(pInterface, pCommand);
+ return pDrv->pDisplay->handleVHWACommandProcess(pCommand);
}
#endif
diff --git a/src/VBox/Main/src-client/GuestCtrlImpl.cpp b/src/VBox/Main/src-client/GuestCtrlImpl.cpp
index e36b4f6..384d5f5 100644
--- a/src/VBox/Main/src-client/GuestCtrlImpl.cpp
+++ b/src/VBox/Main/src-client/GuestCtrlImpl.cpp
@@ -129,7 +129,7 @@ STDMETHODIMP Guest::UpdateGuestAdditions(IN_BSTR aSource, ComSafeArrayIn(IN_BSTR
uint32_t fFlags = AdditionsUpdateFlag_None;
if (aFlags)
{
- com::SafeArray<CopyFileFlag_T> flags(ComSafeArrayInArg(aFlags));
+ com::SafeArray<AdditionsUpdateFlag_T> flags(ComSafeArrayInArg(aFlags));
for (size_t i = 0; i < flags.size(); i++)
fFlags |= flags[i];
}
@@ -312,8 +312,16 @@ int Guest::dispatchToSession(PVBOXGUESTCTRLHOSTCBCTX pCtxCb, PVBOXGUESTCTRLHOSTC
break;
default:
+ /*
+ * Try processing generic messages which might
+ * (or might not) supported by certain objects.
+ * If the message either is not found or supported
+ * by the approprirate object, try handling it
+ * in this session object.
+ */
rc = pSession->dispatchToObject(pCtxCb, pSvcCb);
- if (rc == VERR_NOT_FOUND)
+ if ( rc == VERR_NOT_FOUND
+ || rc == VERR_NOT_SUPPORTED)
{
alock.acquire();
@@ -346,29 +354,34 @@ int Guest::sessionRemove(GuestSession *pSession)
int rc = VERR_NOT_FOUND;
- LogFlowFunc(("Closing session (ID=%RU32) ...\n", pSession->getId()));
+ LogFlowThisFunc(("Removing session (ID=%RU32) ...\n", pSession->getId()));
GuestSessions::iterator itSessions = mData.mGuestSessions.begin();
while (itSessions != mData.mGuestSessions.end())
{
if (pSession == itSessions->second)
{
+#ifdef DEBUG_andy
+ ULONG cRefs = pSession->AddRef();
+ Assert(cRefs >= 2);
+ LogFlowThisFunc(("pCurSession=%p, cRefs=%RU32\n", pSession, cRefs - 2));
+ pSession->Release();
+#endif
/* Make sure to consume the pointer before the one of the
* iterator gets released. */
ComObjPtr<GuestSession> pCurSession = pSession;
- LogFlowFunc(("Removing session (pSession=%p, ID=%RU32) (now total %ld sessions)\n",
- pSession, pSession->getId(), mData.mGuestSessions.size() - 1));
-
- itSessions->second->Release();
+ LogFlowThisFunc(("Removing session (pSession=%p, ID=%RU32) (now total %ld sessions)\n",
+ pSession, pSession->getId(), mData.mGuestSessions.size() - 1));
+ rc = pSession->onRemove();
mData.mGuestSessions.erase(itSessions);
alock.release(); /* Release lock before firing off event. */
fireGuestSessionRegisteredEvent(mEventSource, pCurSession,
false /* Unregistered */);
- rc = VINF_SUCCESS;
+ pCurSession.setNull();
break;
}
@@ -481,7 +494,7 @@ STDMETHODIMP Guest::CreateSession(IN_BSTR aUser, IN_BSTR aPassword, IN_BSTR aDom
/* Do not allow anonymous sessions (with system rights) with public API. */
if (RT_UNLIKELY((aUser) == NULL || *(aUser) == '\0'))
return setError(E_INVALIDARG, tr("No user name specified"));
- if (RT_UNLIKELY((aPassword) == NULL || *(aPassword) == '\0'))
+ if (RT_UNLIKELY((aPassword) == NULL)) /* Allow empty passwords. */
return setError(E_INVALIDARG, tr("No password specified"));
CheckComArgOutPointerValid(aGuestSession);
/* Rest is optional. */
diff --git a/src/VBox/Main/src-client/GuestCtrlPrivate.cpp b/src/VBox/Main/src-client/GuestCtrlPrivate.cpp
index 6d8927c..1b0fb66 100644
--- a/src/VBox/Main/src-client/GuestCtrlPrivate.cpp
+++ b/src/VBox/Main/src-client/GuestCtrlPrivate.cpp
@@ -326,6 +326,32 @@ int GuestFsObjData::FromLs(const GuestProcessStreamBlock &strmBlk)
return rc;
}
+int GuestFsObjData::FromMkTemp(const GuestProcessStreamBlock &strmBlk)
+{
+ LogFlowFunc(("\n"));
+
+ int rc;
+
+ try
+ {
+#ifdef DEBUG
+ strmBlk.DumpToLog();
+#endif
+ /* Object name. */
+ mName = strmBlk.GetString("name");
+ if (mName.isEmpty()) throw VERR_NOT_FOUND;
+ /* Assign the stream block's rc. */
+ rc = strmBlk.GetRc();
+ }
+ catch (int rc2)
+ {
+ rc = rc2;
+ }
+
+ LogFlowFuncLeaveRC(rc);
+ return rc;
+}
+
int GuestFsObjData::FromStat(const GuestProcessStreamBlock &strmBlk)
{
LogFlowFunc(("\n"));
@@ -465,6 +491,21 @@ size_t GuestProcessStreamBlock::GetCount(void) const
}
/**
+ * Gets the return code (name = "rc") of this stream block.
+ *
+ * @return IPRT status code.
+ */
+int GuestProcessStreamBlock::GetRc(void) const
+{
+ const char *pszValue = GetString("rc");
+ if (pszValue)
+ {
+ return RTStrToInt16(pszValue);
+ }
+ return VERR_NOT_FOUND;
+}
+
+/**
* Returns a string value of a specified key.
*
* @return uint32_t Pointer to string to return, NULL if not found / on failure.
@@ -906,8 +947,10 @@ int GuestBase::generateContextID(uint32_t uSessionID, uint32_t uObjectID, uint32
*puContextID = uNewContextID;
+#if 0
LogFlowThisFunc(("mNextContextID=%RU32, uSessionID=%RU32, uObjectID=%RU32, uCount=%RU32, uNewContextID=%RU32\n",
mNextContextID, uSessionID, uObjectID, uCount, uNewContextID));
+#endif
return VINF_SUCCESS;
}
@@ -937,6 +980,8 @@ int GuestBase::registerWaitEvent(uint32_t uSessionID, uint32_t uObjectID,
GuestWaitEvent *pEvent = new GuestWaitEvent(uContextID, lstEvents);
AssertPtr(pEvent);
+ LogFlowThisFunc(("New event=%p, CID=%RU32\n", pEvent, uContextID));
+
/* Insert event into matching event group. This is for faster per-group
* lookup of all events later. */
for (GuestEventTypes::const_iterator itEvents = lstEvents.begin();
@@ -974,14 +1019,14 @@ int GuestBase::signalWaitEvent(VBoxEventType_T aType, IEvent *aEvent)
#endif
if (RT_SUCCESS(rc))
{
- GuestEventGroup::iterator itGroups = mWaitEventGroups.find(aType);
- if (itGroups != mWaitEventGroups.end())
+ GuestEventGroup::iterator itGroup = mWaitEventGroups.find(aType);
+ if (itGroup != mWaitEventGroups.end())
{
- for (GuestWaitEvents::iterator itEvents = itGroups->second.begin();
- itEvents != itGroups->second.end(); itEvents++)
+ GuestWaitEvents::iterator itEvents = itGroup->second.begin();
+ while (itEvents != itGroup->second.end())
{
#ifdef DEBUG
- LogFlowThisFunc(("Signalling event=%p, type=%ld (CID %RU32: Sesion=%RU32, Object=%RU32, Count=%RU32) ...\n",
+ LogFlowThisFunc(("Signalling event=%p, type=%ld (CID %RU32: Session=%RU32, Object=%RU32, Count=%RU32) ...\n",
itEvents->second, aType, itEvents->first,
VBOX_GUESTCTRL_CONTEXTID_GET_SESSION(itEvents->first),
VBOX_GUESTCTRL_CONTEXTID_GET_OBJECT(itEvents->first),
@@ -992,6 +1037,39 @@ int GuestBase::signalWaitEvent(VBoxEventType_T aType, IEvent *aEvent)
int rc2 = itEvents->second->SignalExternal(aEvent);
if (RT_SUCCESS(rc))
rc = rc2;
+
+ if (RT_SUCCESS(rc2))
+ {
+ /* Remove the event from all other event groups (except the
+ * original one!) because it was signalled. */
+ AssertPtr(itEvents->second);
+ const GuestEventTypes evTypes = itEvents->second->Types();
+ for (GuestEventTypes::const_iterator itType = evTypes.begin();
+ itType != evTypes.end(); itType++)
+ {
+ if ((*itType) != aType) /* Only remove all other groups. */
+ {
+ /* Get current event group. */
+ GuestEventGroup::iterator evGroup = mWaitEventGroups.find((*itType));
+ Assert(evGroup != mWaitEventGroups.end());
+
+ /* Lookup event in event group. */
+ GuestWaitEvents::iterator evEvent = evGroup->second.find(itEvents->first /* Context ID */);
+ Assert(evEvent != evGroup->second.end());
+
+ LogFlowThisFunc(("Removing event=%p (type %ld)\n", evEvent->second, (*itType)));
+ evGroup->second.erase(evEvent);
+
+ LogFlowThisFunc(("%zu events for type=%ld left\n",
+ evGroup->second.size(), aType));
+ }
+ }
+
+ /* Remove the event from the passed-in event group. */
+ itGroup->second.erase(itEvents++);
+ }
+ else
+ itEvents++;
#ifdef DEBUG
cEvents++;
#endif
@@ -1051,6 +1129,8 @@ void GuestBase::unregisterWaitEvent(GuestWaitEvent *pEvent)
int rc = RTCritSectEnter(&mWaitEventCritSect);
if (RT_SUCCESS(rc))
{
+ LogFlowThisFunc(("pEvent=%p\n", pEvent));
+
const GuestEventTypes lstTypes = pEvent->Types();
for (GuestEventTypes::const_iterator itEvents = lstTypes.begin();
itEvents != lstTypes.end(); itEvents++)
@@ -1061,7 +1141,7 @@ void GuestBase::unregisterWaitEvent(GuestWaitEvent *pEvent)
{
if (itCurEvent->second == pEvent)
{
- mWaitEventGroups[(*itEvents)].erase(itCurEvent);
+ mWaitEventGroups[(*itEvents)].erase(itCurEvent++);
break;
}
else
@@ -1200,7 +1280,8 @@ int GuestWaitEventBase::Init(uint32_t uCID)
int GuestWaitEventBase::SignalInternal(int rc, int guestRc,
const GuestWaitEventPayload *pPayload)
{
- AssertReturn(!mfAborted, VERR_CANCELLED);
+ if (ASMAtomicReadBool(&mfAborted))
+ return VERR_CANCELLED;
#ifdef VBOX_STRICT
if (rc == VERR_GSTCTL_GUEST_ERROR)
@@ -1281,6 +1362,9 @@ int GuestWaitEvent::Cancel(void)
AssertReturn(!mfAborted, VERR_CANCELLED);
ASMAtomicWriteBool(&mfAborted, true);
+#ifdef DEBUG_andy
+ LogFlowThisFunc(("Cancelling %p ...\n"));
+#endif
return RTSemEventSignal(mEventSem);
}
diff --git a/src/VBox/Main/src-client/GuestDirectoryImpl.cpp b/src/VBox/Main/src-client/GuestDirectoryImpl.cpp
index b5486f5..0d83eb4 100644
--- a/src/VBox/Main/src-client/GuestDirectoryImpl.cpp
+++ b/src/VBox/Main/src-client/GuestDirectoryImpl.cpp
@@ -132,7 +132,7 @@ int GuestDirectory::init(Console *pConsole, GuestSession *pSession,
*/
void GuestDirectory::uninit(void)
{
- LogFlowThisFunc(("\n"));
+ LogFlowThisFuncEnter();
/* Enclose the state transition Ready->InUninit->NotReady. */
AutoUninitSpan autoUninitSpan(this);
@@ -247,6 +247,20 @@ Utf8Str GuestDirectory::guestErrorToString(int guestRc)
return strError;
}
+/**
+ * Called by IGuestSession right before this directory gets
+ * removed from the public directory list.
+ */
+int GuestDirectory::onRemove(void)
+{
+ LogFlowThisFuncEnter();
+
+ int vrc = VINF_SUCCESS;
+
+ LogFlowFuncLeaveRC(vrc);
+ return vrc;
+}
+
/* static */
HRESULT GuestDirectory::setErrorExternal(VirtualBoxBase *pInterface, int guestRc)
{
@@ -269,14 +283,10 @@ STDMETHODIMP GuestDirectory::Close(void)
AutoCaller autoCaller(this);
if (FAILED(autoCaller.rc())) return autoCaller.rc();
- AssertPtr(mSession);
- int rc = mSession->directoryRemoveFromList(this);
- AssertRC(rc);
-
HRESULT hr = S_OK;
int guestRc;
- rc = mData.mProcessTool.Terminate(30 * 1000, &guestRc);
+ int rc = mData.mProcessTool.Terminate(30 * 1000, &guestRc);
if (RT_FAILURE(rc))
{
switch (rc)
@@ -298,12 +308,10 @@ STDMETHODIMP GuestDirectory::Close(void)
}
}
- /*
- * Release autocaller before calling uninit.
- */
- autoCaller.release();
-
- uninit();
+ AssertPtr(mSession);
+ int rc2 = mSession->directoryRemoveFromList(this);
+ if (RT_SUCCESS(rc))
+ rc = rc2;
LogFlowThisFunc(("Returning rc=%Rrc\n", rc));
return hr;
diff --git a/src/VBox/Main/src-client/GuestFileImpl.cpp b/src/VBox/Main/src-client/GuestFileImpl.cpp
index 35c2b0b..4bd3c57 100644
--- a/src/VBox/Main/src-client/GuestFileImpl.cpp
+++ b/src/VBox/Main/src-client/GuestFileImpl.cpp
@@ -1,4 +1,3 @@
-
/* $Id: GuestFileImpl.cpp $ */
/** @file
* VirtualBox Main - Guest file handling.
@@ -57,13 +56,14 @@ public:
HRESULT init(GuestFile *pFile)
{
+ AssertPtrReturn(pFile, E_POINTER);
mFile = pFile;
return S_OK;
}
void uninit(void)
{
- mFile.setNull();
+ mFile = NULL;
}
STDMETHOD(HandleEvent)(VBoxEventType_T aType, IEvent *aEvent)
@@ -75,17 +75,17 @@ public:
case VBoxEventType_OnGuestFileRead:
case VBoxEventType_OnGuestFileWrite:
{
- Assert(!mFile.isNull());
+ AssertPtrReturn(mFile, E_POINTER);
int rc2 = mFile->signalWaitEvent(aType, aEvent);
#ifdef DEBUG_andy
- LogFlowFunc(("Signalling events of type=%ld, file=%p resulted in rc=%Rrc\n",
+ LogFlowFunc(("Signalling events of type=%RU32, file=%p resulted in rc=%Rrc\n",
aType, mFile, rc2));
#endif
break;
}
default:
- AssertMsgFailed(("Unhandled event %ld\n", aType));
+ AssertMsgFailed(("Unhandled event %RU32\n", aType));
break;
}
@@ -94,7 +94,7 @@ public:
private:
- ComObjPtr<GuestFile> mFile;
+ GuestFile *mFile;
};
typedef ListenerImpl<GuestFileListener, GuestFile*> GuestFileListenerImpl;
@@ -107,7 +107,7 @@ DEFINE_EMPTY_CTOR_DTOR(GuestFile)
HRESULT GuestFile::FinalConstruct(void)
{
- LogFlowThisFunc(("\n"));
+ LogFlowThisFuncEnter();
return BaseFinalConstruct();
}
@@ -224,20 +224,16 @@ int GuestFile::init(Console *pConsole, GuestSession *pSession,
*/
void GuestFile::uninit(void)
{
- LogFlowThisFunc(("\n"));
-
/* Enclose the state transition Ready->InUninit->NotReady. */
AutoUninitSpan autoUninitSpan(this);
if (autoUninitSpan.uninitDone())
return;
+ LogFlowThisFuncEnter();
+
#ifdef VBOX_WITH_GUEST_CONTROL
baseUninit();
-
- mEventSource->UnregisterListener(mLocalListener);
- unconst(mEventSource).setNull();
#endif
-
LogFlowThisFuncLeave();
}
@@ -706,6 +702,34 @@ int GuestFile::onGuestDisconnected(PVBOXGUESTCTRLHOSTCBCTX pCbCtx, PVBOXGUESTCTR
return vrc;
}
+/**
+ * Called by IGuestSession right before this file gets removed
+ * from the public file list.
+ */
+int GuestFile::onRemove(void)
+{
+ LogFlowThisFuncEnter();
+
+ AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS);
+
+ int vrc = VINF_SUCCESS;
+
+ /*
+ * Note: The event source stuff holds references to this object,
+ * so make sure that this is cleaned up *before* calling uninit().
+ */
+ if (!mEventSource.isNull())
+ {
+ mEventSource->UnregisterListener(mLocalListener);
+
+ mLocalListener.setNull();
+ unconst(mEventSource).setNull();
+ }
+
+ LogFlowFuncLeaveRC(vrc);
+ return vrc;
+}
+
int GuestFile::openFile(uint32_t uTimeoutMS, int *pGuestRc)
{
LogFlowThisFuncEnter();
@@ -938,7 +962,7 @@ int GuestFile::setFileStatus(FileStatus_T fileStatus, int fileRc)
AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS);
- LogFlowThisFunc(("oldStatus=%ld, newStatus=%ld, fileRc=%Rrc\n",
+ LogFlowThisFunc(("oldStatus=%RU32, newStatus=%RU32, fileRc=%Rrc\n",
mData.mStatus, fileStatus, fileRc));
#ifdef VBOX_STRICT
@@ -980,17 +1004,25 @@ int GuestFile::waitForOffsetChange(GuestWaitEvent *pEvent,
{
AssertPtrReturn(pEvent, VERR_INVALID_POINTER);
+ VBoxEventType_T evtType;
+ ComPtr<IEvent> pIEvent;
int vrc = waitForEvent(pEvent, uTimeoutMS,
- NULL /* Event type */, NULL /* IEvent */);
+ &evtType, pIEvent.asOutParam());
if (RT_SUCCESS(vrc))
{
- Assert(pEvent->Payload().Size() == sizeof(CALLBACKDATA_FILE_NOTIFY));
- const PCALLBACKDATA_FILE_NOTIFY pvCbData =
- (PCALLBACKDATA_FILE_NOTIFY)pEvent->Payload().Raw();
- Assert(pvCbData->uType == GUEST_FILE_NOTIFYTYPE_SEEK);
+ if (evtType == VBoxEventType_OnGuestFileOffsetChanged)
+ {
+ if (puOffset)
+ {
+ ComPtr<IGuestFileOffsetChangedEvent> pFileEvent = pIEvent;
+ Assert(!pFileEvent.isNull());
- if (puOffset)
- *puOffset = pvCbData->u.seek.uOffActual;
+ HRESULT hr = pFileEvent->COMGETTER(Offset)((LONG64*)puOffset);
+ ComAssertComRC(hr);
+ }
+ }
+ else
+ vrc = VWRN_GSTCTL_OBJECTSTATE_CHANGED;
}
return vrc;
@@ -1002,27 +1034,40 @@ int GuestFile::waitForRead(GuestWaitEvent *pEvent,
{
AssertPtrReturn(pEvent, VERR_INVALID_POINTER);
+ VBoxEventType_T evtType;
+ ComPtr<IEvent> pIEvent;
int vrc = waitForEvent(pEvent, uTimeoutMS,
- NULL /* Event type */, NULL /* IEvent */);
+ &evtType, pIEvent.asOutParam());
if (RT_SUCCESS(vrc))
{
- Assert(pEvent->Payload().Size() == sizeof(CALLBACKDATA_FILE_NOTIFY));
- const PCALLBACKDATA_FILE_NOTIFY pvCbData =
- (PCALLBACKDATA_FILE_NOTIFY)pEvent->Payload().Raw();
- Assert(pvCbData->uType == GUEST_FILE_NOTIFYTYPE_READ);
-
- uint32_t cbRead = pvCbData->u.read.cbData;
- if ( cbRead
- && cbRead <= cbData)
+ if (evtType == VBoxEventType_OnGuestFileRead)
{
- memcpy(pvData,
- pvCbData->u.read.pvData, cbRead);
+ ComPtr<IGuestFileReadEvent> pFileEvent = pIEvent;
+ Assert(!pFileEvent.isNull());
+
+ HRESULT hr;
+ if (pvData)
+ {
+ com::SafeArray <BYTE> data;
+ hr = pFileEvent->COMGETTER(Data)(ComSafeArrayAsOutParam(data));
+ ComAssertComRC(hr);
+ size_t cbRead = data.size();
+ if ( cbRead
+ && cbRead <= cbData)
+ {
+ memcpy(pvData, data.raw(), data.size());
+ }
+ else
+ vrc = VERR_BUFFER_OVERFLOW;
+ }
+ if (pcbRead)
+ {
+ hr = pFileEvent->COMGETTER(Processed)((ULONG*)pcbRead);
+ ComAssertComRC(hr);
+ }
}
else
- vrc = VERR_BUFFER_OVERFLOW;
-
- if (pcbRead)
- *pcbRead = cbRead;
+ vrc = VWRN_GSTCTL_OBJECTSTATE_CHANGED;
}
return vrc;
@@ -1032,20 +1077,41 @@ int GuestFile::waitForStatusChange(GuestWaitEvent *pEvent, uint32_t uTimeoutMS,
FileStatus_T *pFileStatus, int *pGuestRc)
{
AssertPtrReturn(pEvent, VERR_INVALID_POINTER);
+ /* pFileStatus is optional. */
+ VBoxEventType_T evtType;
+ ComPtr<IEvent> pIEvent;
int vrc = waitForEvent(pEvent, uTimeoutMS,
- NULL /* Event type */, NULL /* IEvent */);
+ &evtType, pIEvent.asOutParam());
if (RT_SUCCESS(vrc))
{
- Assert(pEvent->Payload().Size() == sizeof(CALLBACKDATA_FILE_NOTIFY));
- const PCALLBACKDATA_FILE_NOTIFY pvCbData =
- (PCALLBACKDATA_FILE_NOTIFY)pEvent->Payload().Raw();
- /* Note: pvCbData->uType can be different types. */;
+ Assert(evtType == VBoxEventType_OnGuestFileStateChanged);
+ ComPtr<IGuestFileStateChangedEvent> pFileEvent = pIEvent;
+ Assert(!pFileEvent.isNull());
+ HRESULT hr;
+ if (pFileStatus)
+ {
+ hr = pFileEvent->COMGETTER(Status)(pFileStatus);
+ ComAssertComRC(hr);
+ }
+
+ ComPtr<IVirtualBoxErrorInfo> errorInfo;
+ hr = pFileEvent->COMGETTER(Error)(errorInfo.asOutParam());
+ ComAssertComRC(hr);
+
+ LONG lGuestRc;
+ hr = errorInfo->COMGETTER(ResultDetail)(&lGuestRc);
+ ComAssertComRC(hr);
+ LogFlowThisFunc(("resultDetail=%RI32 (%Rrc)\n",
+ lGuestRc, lGuestRc));
+
+ if (RT_FAILURE((int)lGuestRc))
+ vrc = VERR_GSTCTL_GUEST_ERROR;
if (pGuestRc)
- *pGuestRc = pvCbData->rc; /* int vs. uint32_t */
+ *pGuestRc = (int)lGuestRc;
}
return vrc;
@@ -1056,17 +1122,25 @@ int GuestFile::waitForWrite(GuestWaitEvent *pEvent,
{
AssertPtrReturn(pEvent, VERR_INVALID_POINTER);
+ VBoxEventType_T evtType;
+ ComPtr<IEvent> pIEvent;
int vrc = waitForEvent(pEvent, uTimeoutMS,
- NULL /* Event type */, NULL /* IEvent */);
+ &evtType, pIEvent.asOutParam());
if (RT_SUCCESS(vrc))
{
- Assert(pEvent->Payload().Size() == sizeof(CALLBACKDATA_FILE_NOTIFY));
- const PCALLBACKDATA_FILE_NOTIFY pvCbData =
- (PCALLBACKDATA_FILE_NOTIFY)pEvent->Payload().Raw();
- Assert(pvCbData->uType == GUEST_FILE_NOTIFYTYPE_WRITE);
+ if (evtType == VBoxEventType_OnGuestFileWrite)
+ {
+ if (pcbWritten)
+ {
+ ComPtr<IGuestFileWriteEvent> pFileEvent = pIEvent;
+ Assert(!pFileEvent.isNull());
- if (pcbWritten)
- *pcbWritten = pvCbData->u.write.cbWritten;
+ HRESULT hr = pFileEvent->COMGETTER(Processed)((ULONG*)pcbWritten);
+ ComAssertComRC(hr);
+ }
+ }
+ else
+ vrc = VWRN_GSTCTL_OBJECTSTATE_CHANGED;
}
return vrc;
diff --git a/src/VBox/Main/src-client/GuestFsObjInfoImpl.cpp b/src/VBox/Main/src-client/GuestFsObjInfoImpl.cpp
index 99219da..64547ed 100644
--- a/src/VBox/Main/src-client/GuestFsObjInfoImpl.cpp
+++ b/src/VBox/Main/src-client/GuestFsObjInfoImpl.cpp
@@ -1,7 +1,6 @@
-
/* $Id: GuestFsObjInfoImpl.cpp $ */
/** @file
- * VirtualBox Main - XXX.
+ * VirtualBox Main - Guest file system object information handling.
*/
/*
diff --git a/src/VBox/Main/src-client/GuestImpl.cpp b/src/VBox/Main/src-client/GuestImpl.cpp
index a322fcb..e41a6f6 100644
--- a/src/VBox/Main/src-client/GuestImpl.cpp
+++ b/src/VBox/Main/src-client/GuestImpl.cpp
@@ -158,7 +158,7 @@ void Guest::uninit()
{
#ifdef DEBUG
ULONG cRefs = itSessions->second->AddRef();
- LogFlowThisFunc(("pSession=%p, cRefs=%RU32\n", (GuestSession *)itSessions->second, cRefs > 0 ? cRefs - 1 : 0));
+ LogFlowThisFunc(("sessionID=%RU32, cRefs=%RU32\n", itSessions->first, cRefs > 1 ? cRefs - 1 : 0));
itSessions->second->Release();
#endif
itSessions->second->uninit();
diff --git a/src/VBox/Main/src-client/GuestProcessImpl.cpp b/src/VBox/Main/src-client/GuestProcessImpl.cpp
index 6a121cf..cfd2d1d 100644
--- a/src/VBox/Main/src-client/GuestProcessImpl.cpp
+++ b/src/VBox/Main/src-client/GuestProcessImpl.cpp
@@ -1,4 +1,3 @@
-
/* $Id: GuestProcessImpl.cpp $ */
/** @file
* VirtualBox Main - Guest process handling.
@@ -97,13 +96,14 @@ public:
HRESULT init(GuestProcess *pProcess)
{
+ AssertPtrReturn(pProcess, E_POINTER);
mProcess = pProcess;
return S_OK;
}
void uninit(void)
{
- mProcess.setNull();
+ mProcess = NULL;
}
STDMETHOD(HandleEvent)(VBoxEventType_T aType, IEvent *aEvent)
@@ -114,17 +114,17 @@ public:
case VBoxEventType_OnGuestProcessInputNotify:
case VBoxEventType_OnGuestProcessOutput:
{
- Assert(!mProcess.isNull());
+ AssertPtrReturn(mProcess, E_POINTER);
int rc2 = mProcess->signalWaitEvent(aType, aEvent);
#ifdef DEBUG
- LogFlowThisFunc(("Signalling events of type=%ld, process=%p resulted in rc=%Rrc\n",
+ LogFlowThisFunc(("Signalling events of type=%RU32, pProcess=%p resulted in rc=%Rrc\n",
aType, &mProcess, rc2));
#endif
break;
}
default:
- AssertMsgFailed(("Unhandled event %ld\n", aType));
+ AssertMsgFailed(("Unhandled event %RU32\n", aType));
break;
}
@@ -133,7 +133,7 @@ public:
private:
- ComObjPtr<GuestProcess> mProcess;
+ GuestProcess *mProcess;
};
typedef ListenerImpl<GuestProcessListener, GuestProcess*> GuestProcessListenerImpl;
@@ -255,17 +255,16 @@ int GuestProcess::init(Console *aConsole, GuestSession *aSession,
/**
* Uninitializes the instance.
- * Called from FinalRelease().
+ * Called from FinalRelease() or IGuestSession::uninit().
*/
void GuestProcess::uninit(void)
{
- LogFlowThisFuncEnter();
-
/* Enclose the state transition Ready->InUninit->NotReady. */
AutoUninitSpan autoUninitSpan(this);
if (autoUninitSpan.uninitDone())
return;
+#ifdef VBOX_WITH_GUEST_CONTROL
LogFlowThisFunc(("mCmd=%s, PID=%RU32\n",
mData.mProcess.mCommand.c_str(), mData.mPID));
@@ -275,17 +274,11 @@ void GuestProcess::uninit(void)
/* Note: Don't return here yet; first uninit all other stuff in
* case of failure. */
-#ifdef VBOX_WITH_GUEST_CONTROL
baseUninit();
- mEventSource->UnregisterListener(mLocalListener);
-
- mLocalListener.setNull();
- unconst(mEventSource).setNull();
-#endif
-
LogFlowThisFunc(("Returning rc=%Rrc, guestRc=%Rrc\n",
vrc, guestRc));
+#endif
}
// implementation of public getters/setters for attributes
@@ -526,31 +519,28 @@ int GuestProcess::callbackDispatcher(PVBOXGUESTCTRLHOSTCBCTX pCbCtx, PVBOXGUESTC
* been discarded there and the same context ID was reused by
* a process B. Process B in turn then has a different guest PID.
*
+ * Note: This also can happen when restoring from a saved state which
+ * had a guest process running.
+ *
* @return IPRT status code.
* @param uPID PID to check.
*/
inline int GuestProcess::checkPID(uint32_t uPID)
{
+ int rc = VINF_SUCCESS;
+
/* Was there a PID assigned yet? */
if (mData.mPID)
{
- /*
-
- */
- if (mSession->getProtocolVersion() < 2)
+ if (RT_UNLIKELY(mData.mPID != uPID))
{
- /* Simply ignore the stale requests. */
- return (mData.mPID == uPID)
- ? VINF_SUCCESS : VERR_NOT_FOUND;
+ LogFlowFunc(("Stale guest process (PID=%RU32) sent data to a newly started process (pProcesS=%p, PID=%RU32, status=%RU32)\n",
+ uPID, this, mData.mPID, mData.mStatus));
+ rc = VERR_NOT_FOUND;
}
-#ifndef DEBUG_andy
- /* This should never happen! */
- AssertReleaseMsg(mData.mPID == uPID, ("Unterminated guest process (guest PID %RU32) sent data to a newly started process (host PID %RU32)\n",
- uPID, mData.mPID));
-#endif
}
- return VINF_SUCCESS;
+ return rc;
}
/* static */
@@ -822,7 +812,7 @@ int GuestProcess::onProcessStatusChange(PVBOXGUESTCTRLHOSTCBCTX pCbCtx, PVBOXGUE
}
}
- LogFlowThisFunc(("Got rc=%Rrc, procSts=%ld, procRc=%Rrc\n",
+ LogFlowThisFunc(("Got rc=%Rrc, procSts=%RU32, procRc=%Rrc\n",
vrc, procStatus, procRc));
/* Set the process status. */
@@ -871,6 +861,34 @@ int GuestProcess::onProcessOutput(PVBOXGUESTCTRLHOSTCBCTX pCbCtx, PVBOXGUESTCTRL
return vrc;
}
+/**
+ * Called by IGuestSession right before this process gets
+ * removed from the public process list.
+ */
+int GuestProcess::onRemove(void)
+{
+ LogFlowThisFuncEnter();
+
+ AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS);
+
+ int vrc = VINF_SUCCESS;
+
+ /*
+ * Note: The event source stuff holds references to this object,
+ * so make sure that this is cleaned up *before* calling uninit().
+ */
+ if (!mEventSource.isNull())
+ {
+ mEventSource->UnregisterListener(mLocalListener);
+
+ mLocalListener.setNull();
+ unconst(mEventSource).setNull();
+ }
+
+ LogFlowFuncLeaveRC(vrc);
+ return vrc;
+}
+
int GuestProcess::readData(uint32_t uHandle, uint32_t uSize, uint32_t uTimeoutMS,
void *pvData, size_t cbData, uint32_t *pcbRead, int *pGuestRc)
{
@@ -958,7 +976,7 @@ int GuestProcess::setProcessStatus(ProcessStatus_T procStatus, int procRc)
AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS);
- LogFlowThisFunc(("oldStatus=%ld, newStatus=%ld, procRc=%Rrc\n",
+ LogFlowThisFunc(("oldStatus=%RU32, newStatus=%RU32, procRc=%Rrc\n",
mData.mStatus, procStatus, procRc));
if (procStatus == ProcessStatus_Error)
@@ -1232,50 +1250,52 @@ int GuestProcess::terminateProcess(uint32_t uTimeoutMS, int *pGuestRc)
AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS);
+ int vrc = VINF_SUCCESS;
+
if (mData.mStatus != ProcessStatus_Started)
{
- LogFlowThisFunc(("Process not started (yet), nothing to terminate\n"));
- return VINF_SUCCESS; /* Nothing to do (anymore). */
+ LogFlowThisFunc(("Process not in started state (state is %RU32), skipping termination\n",
+ mData.mStatus));
}
-
- int vrc = VINF_SUCCESS;
-
- AssertPtr(mSession);
- /* Note: VBox < 4.3 (aka protocol version 1) does not
- * support this, so just skip. */
- if (mSession->getProtocolVersion() < 2)
- vrc = VERR_NOT_SUPPORTED;
-
- if (RT_SUCCESS(vrc))
+ else
{
- GuestWaitEvent *pEvent = NULL;
- GuestEventTypes eventTypes;
- try
- {
- eventTypes.push_back(VBoxEventType_OnGuestProcessStateChanged);
+ AssertPtr(mSession);
+ /* Note: VBox < 4.3 (aka protocol version 1) does not
+ * support this, so just skip. */
+ if (mSession->getProtocolVersion() < 2)
+ vrc = VERR_NOT_SUPPORTED;
- vrc = registerWaitEvent(eventTypes, &pEvent);
- }
- catch (std::bad_alloc)
+ if (RT_SUCCESS(vrc))
{
- vrc = VERR_NO_MEMORY;
- }
+ GuestWaitEvent *pEvent = NULL;
+ GuestEventTypes eventTypes;
+ try
+ {
+ eventTypes.push_back(VBoxEventType_OnGuestProcessStateChanged);
- if (RT_FAILURE(vrc))
- return vrc;
+ vrc = registerWaitEvent(eventTypes, &pEvent);
+ }
+ catch (std::bad_alloc)
+ {
+ vrc = VERR_NO_MEMORY;
+ }
- VBOXHGCMSVCPARM paParms[4];
- int i = 0;
- paParms[i++].setUInt32(pEvent->ContextID());
- paParms[i++].setUInt32(mData.mPID);
+ if (RT_FAILURE(vrc))
+ return vrc;
- alock.release(); /* Drop the write lock before sending. */
+ VBOXHGCMSVCPARM paParms[4];
+ int i = 0;
+ paParms[i++].setUInt32(pEvent->ContextID());
+ paParms[i++].setUInt32(mData.mPID);
- vrc = sendCommand(HOST_EXEC_TERMINATE, i, paParms);
- if (RT_SUCCESS(vrc))
- vrc = waitForStatusChange(pEvent, uTimeoutMS,
- NULL /* ProcessStatus */, pGuestRc);
- unregisterWaitEvent(pEvent);
+ alock.release(); /* Drop the write lock before sending. */
+
+ vrc = sendCommand(HOST_EXEC_TERMINATE, i, paParms);
+ if (RT_SUCCESS(vrc))
+ vrc = waitForStatusChange(pEvent, uTimeoutMS,
+ NULL /* ProcessStatus */, pGuestRc);
+ unregisterWaitEvent(pEvent);
+ }
}
LogFlowFuncLeaveRC(vrc);
@@ -1294,57 +1314,60 @@ ProcessWaitResult_T GuestProcess::waitFlagsToResultEx(uint32_t fWaitFlags,
case ProcessStatus_TerminatedNormally:
case ProcessStatus_TerminatedSignal:
case ProcessStatus_TerminatedAbnormally:
- waitResult = ProcessWaitResult_Terminate;
- break;
case ProcessStatus_Down:
+ /* Nothing to wait for anymore. */
waitResult = ProcessWaitResult_Terminate;
break;
case ProcessStatus_TimedOutKilled:
- /* Fall through is intentional. */
case ProcessStatus_TimedOutAbnormally:
+ /* Dito. */
waitResult = ProcessWaitResult_Timeout;
break;
- case ProcessStatus_Error:
- waitResult = ProcessWaitResult_Error;
- break;
-
case ProcessStatus_Started:
- {
switch (oldStatus)
{
+ case ProcessStatus_Undefined:
case ProcessStatus_Starting:
+ /* Also wait for process start. */
if (fWaitFlags & ProcessWaitForFlag_Start)
- {
waitResult = ProcessWaitResult_Start;
- }
else
{
/*
- * If ProcessCreateFlag_WaitForProcessStartOnly was specified on process creation the
- * caller is not interested in getting further process statuses -- so just don't notify
- * anything here anymore and return.
- */
+ * If ProcessCreateFlag_WaitForProcessStartOnly was specified on process creation the
+ * caller is not interested in getting further process statuses -- so just don't notify
+ * anything here anymore and return.
+ */
if (uProcFlags & ProcessCreateFlag_WaitForProcessStartOnly)
waitResult = ProcessWaitResult_Start;
}
break;
+ case ProcessStatus_Started:
+ /* Only wait for process start. */
+ if (fWaitFlags == ProcessWaitForFlag_Start)
+ waitResult = ProcessWaitResult_Start;
+ break;
+
default:
- /* No result available (yet). */
+ AssertMsgFailed(("Unhandled old status %RU32 before new status 'started'\n",
+ oldStatus));
+ waitResult = ProcessWaitResult_Start;
break;
}
break;
- }
- case ProcessStatus_Undefined:
- case ProcessStatus_Starting:
- /* No result available yet. */
+ case ProcessStatus_Error:
+ /* Nothing to wait for anymore. */
+ waitResult = ProcessWaitResult_Error;
break;
- default:
- AssertMsgFailed(("Unhandled process status %ld\n", newStatus));
+ case ProcessStatus_Undefined:
+ case ProcessStatus_Starting:
+ /* No result available yet, leave wait
+ * flags untouched. */
break;
}
@@ -1373,7 +1396,7 @@ ProcessWaitResult_T GuestProcess::waitFlagsToResultEx(uint32_t fWaitFlags,
}
#ifdef DEBUG
- LogFlowFunc(("oldStatus=%ld, newStatus=%ld, fWaitFlags=0x%x, waitResult=%ld\n",
+ LogFlowFunc(("oldStatus=%RU32, newStatus=%RU32, fWaitFlags=0x%x, waitResult=%RU32\n",
oldStatus, newStatus, fWaitFlags, waitResult));
#endif
return waitResult;
@@ -1405,6 +1428,7 @@ int GuestProcess::waitFor(uint32_t fWaitFlags, ULONG uTimeoutMS,
AssertMsg(RT_FAILURE(mData.mLastError), ("No error rc (%Rrc) set when guest process indicated an error\n", mData.mLastError));
if (pGuestRc)
*pGuestRc = mData.mLastError; /* Return last set error. */
+ LogFlowThisFunc(("Process is in error state (guestRc=%Rrc)\n", mData.mLastError));
return VERR_GSTCTL_GUEST_ERROR;
}
@@ -1415,10 +1439,13 @@ int GuestProcess::waitFor(uint32_t fWaitFlags, ULONG uTimeoutMS,
{
if (pGuestRc)
*pGuestRc = mData.mLastError; /* Return last set error (if any). */
+ LogFlowThisFunc(("Nothing to wait for (guestRc=%Rrc)\n", mData.mLastError));
return RT_SUCCESS(mData.mLastError) ? VINF_SUCCESS : VERR_GSTCTL_GUEST_ERROR;
}
- alock.release(); /* Release lock before waiting. */
+ /* Adjust timeout. Passing 0 means RT_INDEFINITE_WAIT. */
+ if (!uTimeoutMS)
+ uTimeoutMS = RT_INDEFINITE_WAIT;
int vrc;
@@ -1438,6 +1465,8 @@ int GuestProcess::waitFor(uint32_t fWaitFlags, ULONG uTimeoutMS,
if (RT_FAILURE(vrc))
return vrc;
+ alock.release(); /* Release lock before waiting. */
+
/*
* Do the actual waiting.
*/
@@ -1464,7 +1493,7 @@ int GuestProcess::waitFor(uint32_t fWaitFlags, ULONG uTimeoutMS,
waitResult = waitFlagsToResultEx(fWaitFlags, curStatus, newStatus,
mData.mProcess.mFlags, mSession->getProtocolVersion());
#ifdef DEBUG
- LogFlowThisFunc(("Got new status change: fWaitFlags=0x%x, newStatus=%ld, waitResult=%ld\n",
+ LogFlowThisFunc(("Got new status change: fWaitFlags=0x%x, newStatus=%RU32, waitResult=%RU32\n",
fWaitFlags, newStatus, waitResult));
#endif
if (ProcessWaitResult_None != waitResult) /* We got a waiting result. */
@@ -1478,7 +1507,7 @@ int GuestProcess::waitFor(uint32_t fWaitFlags, ULONG uTimeoutMS,
unregisterWaitEvent(pEvent);
- LogFlowThisFunc(("Returned waitResult=%ld, newStatus=%ld, rc=%Rrc\n",
+ LogFlowThisFunc(("Returned waitResult=%RU32, newStatus=%RU32, rc=%Rrc\n",
waitResult, newStatus, vrc));
return vrc;
}
@@ -1491,7 +1520,7 @@ int GuestProcess::waitForInputNotify(GuestWaitEvent *pEvent, uint32_t uHandle, u
VBoxEventType_T evtType;
ComPtr<IEvent> pIEvent;
int vrc = waitForEvent(pEvent, uTimeoutMS,
- &evtType, pIEvent.asOutParam());
+ &evtType, pIEvent.asOutParam());
if (RT_SUCCESS(vrc))
{
if (evtType == VBoxEventType_OnGuestProcessInputNotify)
@@ -1537,7 +1566,7 @@ int GuestProcess::waitForOutput(GuestWaitEvent *pEvent, uint32_t uHandle, uint32
do
{
vrc = waitForEvent(pEvent, uTimeoutMS,
- &evtType, pIEvent.asOutParam());
+ &evtType, pIEvent.asOutParam());
if (RT_SUCCESS(vrc))
{
if (evtType == VBoxEventType_OnGuestProcessOutput)
@@ -1632,7 +1661,7 @@ int GuestProcess::waitForStatusChange(GuestWaitEvent *pEvent, uint32_t uTimeoutM
hr = errorInfo->COMGETTER(ResultDetail)(&lGuestRc);
ComAssertComRC(hr);
- LogFlowThisFunc(("procStatus=%RU32, resultDetail=%RI32 (rc=%Rrc)\n",
+ LogFlowThisFunc(("Got procStatus=%RU32, guestRc=%RI32 (%Rrc)\n",
procStatus, lGuestRc, lGuestRc));
if (RT_FAILURE((int)lGuestRc))
@@ -1764,6 +1793,8 @@ STDMETHODIMP GuestProcess::Read(ULONG aHandle, ULONG aToRead, ULONG aTimeoutMS,
#ifndef VBOX_WITH_GUEST_CONTROL
ReturnComNotImplemented();
#else
+ LogFlowThisFuncEnter();
+
if (aToRead == 0)
return setError(E_INVALIDARG, tr("The size to read is zero"));
CheckComArgOutSafeArrayPointerValid(aData);
@@ -1844,10 +1875,12 @@ STDMETHODIMP GuestProcess::Terminate(void)
}
}
- /* Remove the process from our internal session list. Only an API client
- * now may hold references to it. */
+ /* Remove process from guest session list. Now only API clients
+ * still can hold references to it. */
AssertPtr(mSession);
- mSession->processRemoveFromList(this);
+ int rc2 = mSession->processRemoveFromList(this);
+ if (RT_SUCCESS(vrc))
+ vrc = rc2;
LogFlowFuncLeaveRC(vrc);
return hr;
@@ -2000,7 +2033,8 @@ STDMETHODIMP GuestProcess::WriteArray(ULONG aHandle, ComSafeArrayIn(ProcessInput
///////////////////////////////////////////////////////////////////////////////
GuestProcessTool::GuestProcessTool(void)
- : pSession(NULL)
+ : pSession(NULL),
+ pProcess(NULL)
{
}
@@ -2025,8 +2059,9 @@ int GuestProcessTool::Init(GuestSession *pGuestSession, const GuestProcessStartu
int vrc = pSession->processCreateExInteral(mStartupInfo, pProcess);
if (RT_SUCCESS(vrc))
- vrc = fAsync ? pProcess->startProcessAsync() : pProcess->startProcess(30 * 1000 /* 30s timeout */,
- pGuestRc);
+ vrc = fAsync
+ ? pProcess->startProcessAsync()
+ : pProcess->startProcess(30 * 1000 /* 30s timeout */, pGuestRc);
if ( RT_SUCCESS(vrc)
&& !fAsync
@@ -2069,20 +2104,20 @@ int GuestProcessTool::GetCurrentBlock(uint32_t uHandle, GuestProcessStreamBlock
bool GuestProcessTool::IsRunning(void)
{
- AssertReturn(!pProcess.isNull(), true);
+ AssertReturn(!pProcess.isNull(), false);
ProcessStatus_T procStatus = ProcessStatus_Undefined;
HRESULT hr = pProcess->COMGETTER(Status(&procStatus));
Assert(SUCCEEDED(hr));
- if ( procStatus != ProcessStatus_Started
- && procStatus != ProcessStatus_Paused
- && procStatus != ProcessStatus_Terminating)
+ if ( procStatus == ProcessStatus_Started
+ || procStatus == ProcessStatus_Paused
+ || procStatus == ProcessStatus_Terminating)
{
- return false;
+ return true;
}
- return true;
+ return false;
}
/* static */
@@ -2128,18 +2163,17 @@ int GuestProcessTool::RunEx( GuestSession *pGuestSession,
{
/* Make sure the process runs until completion. */
vrc = procTool.Wait(GUESTPROCESSTOOL_FLAG_NONE, &guestRc);
-
- Assert(RT_SUCCESS(guestRc));
- guestRc = procTool.TerminatedOk(NULL /* Exit code */);
- if (pGuestRc)
- *pGuestRc = guestRc;
- }
- else if (vrc == VERR_GSTCTL_GUEST_ERROR)
- {
- if (pGuestRc)
- *pGuestRc = guestRc;
+ if (RT_SUCCESS(vrc))
+ {
+ guestRc = procTool.TerminatedOk(NULL /* Exit code */);
+ if (RT_FAILURE(guestRc))
+ vrc = VERR_GSTCTL_GUEST_ERROR;
+ }
}
+ if (pGuestRc)
+ *pGuestRc = guestRc;
+
LogFlowFunc(("Returned rc=%Rrc, guestRc=%Rrc\n", vrc, guestRc));
return vrc;
}
@@ -2284,7 +2318,7 @@ int GuestProcessTool::WaitEx(uint32_t fFlags, GuestProcessStreamBlock *pStrmBlkO
break;
default:
- AssertReleaseMsgFailed(("Unhandled process wait result %ld\n", waitRes));
+ AssertMsgFailed(("Unhandled process wait result %RU32\n", waitRes));
break;
}
@@ -2352,7 +2386,10 @@ int GuestProcessTool::WaitEx(uint32_t fFlags, GuestProcessStreamBlock *pStrmBlkO
#undef UPDATE_AND_CHECK_ELAPSED_TIME
#undef GET_REMAINING_TIME
- LogFlowThisFunc(("Loop ended with rc=%Rrc, guestRc=%Rrc, waitRes=%ld\n",
+ if (RT_FAILURE(guestRc))
+ vrc = VERR_GSTCTL_GUEST_ERROR;
+
+ LogFlowThisFunc(("Loop ended with rc=%Rrc, guestRc=%Rrc, waitRes=%RU32\n",
vrc, guestRc, waitRes));
if (pGuestRc)
*pGuestRc = guestRc;
@@ -2369,11 +2406,6 @@ int GuestProcessTool::Terminate(uint32_t uTimeoutMS, int *pGuestRc)
if (!pProcess.isNull())
{
rc = pProcess->terminateProcess(uTimeoutMS, pGuestRc);
-
- Assert(pSession);
- int rc2 = pSession->processRemoveFromList(pProcess);
- AssertRC(rc2);
-
pProcess.setNull();
}
else
diff --git a/src/VBox/Main/src-client/GuestSessionImpl.cpp b/src/VBox/Main/src-client/GuestSessionImpl.cpp
index d8f283d..31de6b1 100644
--- a/src/VBox/Main/src-client/GuestSessionImpl.cpp
+++ b/src/VBox/Main/src-client/GuestSessionImpl.cpp
@@ -1,4 +1,3 @@
-
/* $Id: GuestSessionImpl.cpp $ */
/** @file
* VirtualBox Main - Guest session handling.
@@ -97,13 +96,14 @@ public:
HRESULT init(GuestSession *pSession)
{
+ AssertPtrReturn(pSession, E_POINTER);
mSession = pSession;
return S_OK;
}
void uninit(void)
{
- mSession.setNull();
+ mSession = NULL;
}
STDMETHOD(HandleEvent)(VBoxEventType_T aType, IEvent *aEvent)
@@ -112,17 +112,17 @@ public:
{
case VBoxEventType_OnGuestSessionStateChanged:
{
- Assert(!mSession.isNull());
+ AssertPtrReturn(mSession, E_POINTER);
int rc2 = mSession->signalWaitEvent(aType, aEvent);
#ifdef DEBUG_andy
- LogFlowFunc(("Signalling events of type=%ld, session=%p resulted in rc=%Rrc\n",
+ LogFlowFunc(("Signalling events of type=%RU32, session=%p resulted in rc=%Rrc\n",
aType, mSession, rc2));
#endif
break;
}
default:
- AssertMsgFailed(("Unhandled event %ld\n", aType));
+ AssertMsgFailed(("Unhandled event %RU32\n", aType));
break;
}
@@ -131,7 +131,7 @@ public:
private:
- ComObjPtr<GuestSession> mSession;
+ GuestSession *mSession;
};
typedef ListenerImpl<GuestSessionListener, GuestSession*> GuestSessionListenerImpl;
@@ -144,7 +144,7 @@ DEFINE_EMPTY_CTOR_DTOR(GuestSession)
HRESULT GuestSession::FinalConstruct(void)
{
- LogFlowThisFunc(("\n"));
+ LogFlowThisFuncEnter();
return BaseFinalConstruct();
}
@@ -273,50 +273,58 @@ int GuestSession::init(Guest *pGuest, const GuestSessionStartupInfo &ssInfo,
*/
void GuestSession::uninit(void)
{
- LogFlowThisFuncEnter();
-
/* Enclose the state transition Ready->InUninit->NotReady. */
AutoUninitSpan autoUninitSpan(this);
if (autoUninitSpan.uninitDone())
return;
+ LogFlowThisFuncEnter();
+
int rc = VINF_SUCCESS;
#ifdef VBOX_WITH_GUEST_CONTROL
- LogFlowThisFunc(("Closing directories (%RU64 total)\n",
+ AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS);
+
+ LogFlowThisFunc(("Closing directories (%zu total)\n",
mData.mDirectories.size()));
for (SessionDirectories::iterator itDirs = mData.mDirectories.begin();
itDirs != mData.mDirectories.end(); ++itDirs)
{
- itDirs->second->Release();
+ Assert(mData.mNumObjects);
+ mData.mNumObjects--;
+ itDirs->second->onRemove();
+ itDirs->second->uninit();
}
mData.mDirectories.clear();
- LogFlowThisFunc(("Closing files (%RU64 total)\n",
+ LogFlowThisFunc(("Closing files (%zu total)\n",
mData.mFiles.size()));
for (SessionFiles::iterator itFiles = mData.mFiles.begin();
itFiles != mData.mFiles.end(); ++itFiles)
{
- itFiles->second->Release();
+ Assert(mData.mNumObjects);
+ mData.mNumObjects--;
+ itFiles->second->onRemove();
+ itFiles->second->uninit();
}
mData.mFiles.clear();
- LogFlowThisFunc(("Closing processes (%RU64 total)\n",
+ LogFlowThisFunc(("Closing processes (%zu total)\n",
mData.mProcesses.size()));
for (SessionProcesses::iterator itProcs = mData.mProcesses.begin();
itProcs != mData.mProcesses.end(); ++itProcs)
{
- itProcs->second->Release();
+ Assert(mData.mNumObjects);
+ mData.mNumObjects--;
+ itProcs->second->onRemove();
+ itProcs->second->uninit();
}
mData.mProcesses.clear();
- LogFlowThisFunc(("mNumObjects=%RU32\n", mData.mNumObjects));
+ AssertMsg(mData.mNumObjects == 0,
+ ("mNumObjects=%RU32 when it should be 0\n", mData.mNumObjects));
baseUninit();
-
- mEventSource->UnregisterListener(mLocalListener);
- unconst(mEventSource).setNull();
-
#endif /* VBOX_WITH_GUEST_CONTROL */
LogFlowFuncLeaveRC(rc);
}
@@ -656,7 +664,7 @@ int GuestSession::closeSession(uint32_t uFlags, uint32_t uTimeoutMS, int *pGuest
if (mData.mStatus != GuestSessionStatus_Started)
{
- LogFlowThisFunc(("Session ID=%RU32 not started (anymore), status now is: %ld\n",
+ LogFlowThisFunc(("Session ID=%RU32 not started (anymore), status now is: %RU32\n",
mData.mSession.mID, mData.mStatus));
return VINF_SUCCESS;
}
@@ -716,8 +724,14 @@ int GuestSession::directoryCreateInternal(const Utf8Str &strPath, uint32_t uMode
try
{
/* Construct arguments. */
- if (uFlags & DirectoryCreateFlag_Parents)
- procInfo.mArguments.push_back(Utf8Str("--parents")); /* We also want to create the parent directories. */
+ if (uFlags)
+ {
+ if (uFlags & DirectoryCreateFlag_Parents)
+ procInfo.mArguments.push_back(Utf8Str("--parents")); /* We also want to create the parent directories. */
+ else
+ vrc = VERR_INVALID_PARAMETER;
+ }
+
if (uMode)
{
procInfo.mArguments.push_back(Utf8Str("--mode")); /* Set the creation mode. */
@@ -775,25 +789,39 @@ int GuestSession::directoryRemoveFromList(GuestDirectory *pDirectory)
{
AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS);
- for (SessionDirectories::iterator itDirs = mData.mDirectories.begin();
- itDirs != mData.mDirectories.end(); ++itDirs)
+ int rc = VERR_NOT_FOUND;
+
+ SessionDirectories::iterator itDirs = mData.mDirectories.begin();
+ while (itDirs != mData.mDirectories.end())
{
if (pDirectory == itDirs->second)
{
+ /* Make sure to consume the pointer before the one of the
+ * iterator gets released. */
+ ComObjPtr<GuestDirectory> pDir = pDirectory;
+
Bstr strName;
HRESULT hr = itDirs->second->COMGETTER(DirectoryName)(strName.asOutParam());
ComAssertComRC(hr);
Assert(mData.mDirectories.size());
- LogFlowFunc(("Removing directory \"%s\" (Session: %RU32) (now total %ld directories)\n",
- Utf8Str(strName).c_str(), mData.mSession.mID, mData.mDirectories.size() - 1));
+ Assert(mData.mNumObjects);
+ LogFlowFunc(("Removing directory \"%s\" (Session: %RU32) (now total %zu processes, %RU32 objects)\n",
+ Utf8Str(strName).c_str(), mData.mSession.mID, mData.mDirectories.size() - 1, mData.mNumObjects - 1));
+ rc = pDirectory->onRemove();
mData.mDirectories.erase(itDirs);
- return VINF_SUCCESS;
+ mData.mNumObjects--;
+
+ pDir.setNull();
+ break;
}
+
+ itDirs++;
}
- return VERR_NOT_FOUND;
+ LogFlowFuncLeaveRC(rc);
+ return rc;
}
int GuestSession::directoryRemoveInternal(const Utf8Str &strPath, uint32_t uFlags,
@@ -837,10 +865,10 @@ int GuestSession::directoryRemoveInternal(const Utf8Str &strPath, uint32_t uFlag
}
int GuestSession::objectCreateTempInternal(const Utf8Str &strTemplate, const Utf8Str &strPath,
- bool fDirectory, const Utf8Str &strName, int *pGuestRc)
+ bool fDirectory, Utf8Str &strName, int *pGuestRc)
{
- LogFlowThisFunc(("strTemplate=%s, strPath=%s, fDirectory=%RTbool, strName=%s\n",
- strTemplate.c_str(), strPath.c_str(), fDirectory, strName.c_str()));
+ LogFlowThisFunc(("strTemplate=%s, strPath=%s, fDirectory=%RTbool\n",
+ strTemplate.c_str(), strPath.c_str(), fDirectory));
int vrc = VINF_SUCCESS;
@@ -865,8 +893,35 @@ int GuestSession::objectCreateTempInternal(const Utf8Str &strTemplate, const Utf
vrc = VERR_NO_MEMORY;
}
+ /** @todo Use an internal HGCM command for this operation, since
+ * we now can run in a user-dedicated session. */
+ int guestRc; GuestCtrlStreamObjects stdOut;
if (RT_SUCCESS(vrc))
- vrc = GuestProcessTool::Run(this, procInfo, pGuestRc);
+ vrc = GuestProcessTool::RunEx(this, procInfo,
+ &stdOut, 1 /* cStrmOutObjects */,
+ &guestRc);
+ if ( RT_SUCCESS(vrc)
+ && RT_SUCCESS(guestRc))
+ {
+ GuestFsObjData objData;
+ if (!stdOut.empty())
+ {
+ vrc = objData.FromMkTemp(stdOut.at(0));
+ if (RT_FAILURE(vrc))
+ {
+ guestRc = vrc;
+ vrc = VERR_GSTCTL_GUEST_ERROR;
+ }
+ }
+ else
+ vrc = VERR_NO_DATA;
+
+ if (RT_SUCCESS(vrc))
+ strName = objData.mName;
+ }
+
+ if (pGuestRc)
+ *pGuestRc = guestRc;
LogFlowFuncLeaveRC(vrc);
return vrc;
@@ -937,7 +992,7 @@ int GuestSession::directoryOpenInternal(const GuestDirectoryOpenInfo &openInfo,
mData.mNumObjects++;
Assert(mData.mNumObjects <= VBOX_GUESTCTRL_MAX_OBJECTS);
- LogFlowFunc(("Added new guest directory \"%s\" (Session: %RU32) (now total %ld dirs, %ld objects)\n",
+ LogFlowFunc(("Added new guest directory \"%s\" (Session: %RU32) (now total %zu dirs, %RU32 objects)\n",
openInfo.mPath.c_str(), mData.mSession.mID, mData.mFiles.size(), mData.mNumObjects));
alock.release(); /* Release lock before firing off event. */
@@ -974,7 +1029,7 @@ int GuestSession::dispatchToDirectory(PVBOXGUESTCTRLHOSTCBCTX pCtxCb, PVBOXGUEST
uint32_t uDirID = VBOX_GUESTCTRL_CONTEXTID_GET_OBJECT(pCtxCb->uContextID);
#ifdef DEBUG
- LogFlowFunc(("uDirID=%RU32 (%RU32 total)\n",
+ LogFlowFunc(("uDirID=%RU32 (%zu total)\n",
uDirID, mData.mFiles.size()));
#endif
int rc;
@@ -1007,7 +1062,7 @@ int GuestSession::dispatchToFile(PVBOXGUESTCTRLHOSTCBCTX pCtxCb, PVBOXGUESTCTRLH
uint32_t uFileID = VBOX_GUESTCTRL_CONTEXTID_GET_OBJECT(pCtxCb->uContextID);
#ifdef DEBUG
- LogFlowFunc(("uFileID=%RU32 (%RU32 total)\n",
+ LogFlowFunc(("uFileID=%RU32 (%zu total)\n",
uFileID, mData.mFiles.size()));
#endif
int rc;
@@ -1089,7 +1144,7 @@ int GuestSession::dispatchToProcess(PVBOXGUESTCTRLHOSTCBCTX pCtxCb, PVBOXGUESTCT
uint32_t uProcessID = VBOX_GUESTCTRL_CONTEXTID_GET_OBJECT(pCtxCb->uContextID);
#ifdef DEBUG
- LogFlowFunc(("uProcessID=%RU32 (%RU32 total)\n",
+ LogFlowFunc(("uProcessID=%RU32 (%zu total)\n",
uProcessID, mData.mProcesses.size()));
#endif
int rc;
@@ -1097,6 +1152,12 @@ int GuestSession::dispatchToProcess(PVBOXGUESTCTRLHOSTCBCTX pCtxCb, PVBOXGUESTCT
= mData.mProcesses.find(uProcessID);
if (itProc != mData.mProcesses.end())
{
+#ifdef DEBUG_andy
+ ULONG cRefs = itProc->second->AddRef();
+ Assert(cRefs >= 2);
+ LogFlowFunc(("pProcess=%p, cRefs=%RU32\n", &itProc->second, cRefs - 1));
+ itProc->second->Release();
+#endif
ComObjPtr<GuestProcess> pProcess(itProc->second);
Assert(!pProcess.isNull());
@@ -1166,8 +1227,10 @@ int GuestSession::fileRemoveFromList(GuestFile *pFile)
{
AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS);
- for (SessionFiles::iterator itFiles = mData.mFiles.begin();
- itFiles != mData.mFiles.end(); ++itFiles)
+ int rc = VERR_NOT_FOUND;
+
+ SessionFiles::iterator itFiles = mData.mFiles.begin();
+ while (itFiles != mData.mFiles.end())
{
if (pFile == itFiles->second)
{
@@ -1180,12 +1243,10 @@ int GuestSession::fileRemoveFromList(GuestFile *pFile)
ComAssertComRC(hr);
Assert(mData.mNumObjects);
- LogFlowThisFunc(("Removing guest file \"%s\" (Session: %RU32) (now total %ld files, %ld objects)\n",
+ LogFlowThisFunc(("Removing guest file \"%s\" (Session: %RU32) (now total %zu files, %RU32 objects)\n",
Utf8Str(strName).c_str(), mData.mSession.mID, mData.mFiles.size() - 1, mData.mNumObjects - 1));
- pFile->cancelWaitEvents();
- pFile->Release();
-
+ rc = pFile->onRemove();
mData.mFiles.erase(itFiles);
mData.mNumObjects--;
@@ -1193,11 +1254,15 @@ int GuestSession::fileRemoveFromList(GuestFile *pFile)
fireGuestFileRegisteredEvent(mEventSource, this, pCurFile,
false /* Unregistered */);
- return VINF_SUCCESS;
+ pCurFile.setNull();
+ break;
}
+
+ itFiles++;
}
- return VERR_NOT_FOUND;
+ LogFlowFuncLeaveRC(rc);
+ return rc;
}
int GuestSession::fileRemoveInternal(const Utf8Str &strPath, int *pGuestRc)
@@ -1303,7 +1368,7 @@ int GuestSession::fileOpenInternal(const GuestFileOpenInfo &openInfo,
mData.mNumObjects++;
Assert(mData.mNumObjects <= VBOX_GUESTCTRL_MAX_OBJECTS);
- LogFlowFunc(("Added new guest file \"%s\" (Session: %RU32) (now total %ld files, %ld objects)\n",
+ LogFlowFunc(("Added new guest file \"%s\" (Session: %RU32) (now total %zu files, %RU32 objects)\n",
openInfo.mFileName.c_str(), mData.mSession.mID, mData.mFiles.size(), mData.mNumObjects));
alock.release(); /* Release lock before firing off event. */
@@ -1394,7 +1459,12 @@ int GuestSession::fsQueryInfoInternal(const Utf8Str &strPath, GuestFsObjData &ob
vrc = VERR_NO_DATA;
}
- LogFlowFuncLeaveRC(vrc);
+ if ( vrc == VERR_GSTCTL_GUEST_ERROR
+ && pGuestRc)
+ *pGuestRc = guestRc;
+
+ LogFlowThisFunc(("Returning rc=%Rrc, guestRc=%Rrc\n",
+ vrc, guestRc));
return vrc;
}
@@ -1482,6 +1552,34 @@ HRESULT GuestSession::isReadyExternal(void)
return S_OK;
}
+/**
+ * Called by IGuest right before this session gets removed from
+ * the public session list.
+ */
+int GuestSession::onRemove(void)
+{
+ LogFlowThisFuncEnter();
+
+ AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS);
+
+ int vrc = VINF_SUCCESS;
+
+ /*
+ * Note: The event source stuff holds references to this object,
+ * so make sure that this is cleaned up *before* calling uninit.
+ */
+ if (!mEventSource.isNull())
+ {
+ mEventSource->UnregisterListener(mLocalListener);
+
+ mLocalListener.setNull();
+ unconst(mEventSource).setNull();
+ }
+
+ LogFlowFuncLeaveRC(vrc);
+ return vrc;
+}
+
/** No locking! */
int GuestSession::onSessionStatusChange(PVBOXGUESTCTRLHOSTCBCTX pCbCtx, PVBOXGUESTCTRLHOSTCALLBACK pSvcCbData)
{
@@ -1751,35 +1849,40 @@ int GuestSession::processRemoveFromList(GuestProcess *pProcess)
HRESULT hr = pProcess->COMGETTER(PID)(&uPID);
ComAssertComRC(hr);
- LogFlowFunc(("Closing process (PID=%RU32) ...\n", uPID));
+ LogFlowFunc(("Removing process (PID=%RU32) ...\n", uPID));
SessionProcesses::iterator itProcs = mData.mProcesses.begin();
while (itProcs != mData.mProcesses.end())
{
if (pProcess == itProcs->second)
{
- /* Make sure to consume the pointer before the one of thfe
+#ifdef DEBUG_andy
+ ULONG cRefs = pProcess->AddRef();
+ Assert(cRefs >= 2);
+ LogFlowFunc(("pProcess=%p, cRefs=%RU32\n", pProcess, cRefs - 1));
+ pProcess->Release();
+#endif
+ /* Make sure to consume the pointer before the one of the
* iterator gets released. */
- ComObjPtr<GuestProcess> pCurProcess = pProcess;
+ ComObjPtr<GuestProcess> pProc = pProcess;
- hr = pCurProcess->COMGETTER(PID)(&uPID);
+ hr = pProc->COMGETTER(PID)(&uPID);
ComAssertComRC(hr);
+ Assert(mData.mProcesses.size());
Assert(mData.mNumObjects);
- LogFlowFunc(("Removing process ID=%RU32 (Session: %RU32), guest PID=%RU32 (now total %ld processes, %ld objects)\n",
+ LogFlowFunc(("Removing process ID=%RU32 (Session: %RU32), guest PID=%RU32 (now total %zu processes, %RU32 objects)\n",
pProcess->getObjectID(), mData.mSession.mID, uPID, mData.mProcesses.size() - 1, mData.mNumObjects - 1));
- pProcess->cancelWaitEvents();
- pProcess->Release();
-
+ rc = pProcess->onRemove();
mData.mProcesses.erase(itProcs);
mData.mNumObjects--;
alock.release(); /* Release lock before firing off event. */
- fireGuestProcessRegisteredEvent(mEventSource, this /* Session */, pCurProcess,
+ fireGuestProcessRegisteredEvent(mEventSource, this /* Session */, pProc,
uPID, false /* Process unregistered */);
- rc = VINF_SUCCESS;
+ pProc.setNull();
break;
}
@@ -1895,9 +1998,11 @@ int GuestSession::processCreateExInteral(GuestProcessStartupInfo &procInfo, ComO
mData.mNumObjects++;
Assert(mData.mNumObjects <= VBOX_GUESTCTRL_MAX_OBJECTS);
- LogFlowFunc(("Added new process (Session: %RU32) with process ID=%RU32 (now total %ld processes, %ld objects)\n",
+ LogFlowFunc(("Added new process (Session: %RU32) with process ID=%RU32 (now total %zu processes, %RU32 objects)\n",
mData.mSession.mID, uNewProcessID, mData.mProcesses.size(), mData.mNumObjects));
+ alock.release(); /* Release lock before firing off event. */
+
fireGuestProcessRegisteredEvent(mEventSource, this /* Session */, pProcess,
0 /* PID */, true /* Process registered */);
}
@@ -1988,7 +2093,7 @@ HRESULT GuestSession::setErrorExternal(VirtualBoxBase *pInterface, int guestRc)
/* Does not do locking; caller is responsible for that! */
int GuestSession::setSessionStatus(GuestSessionStatus_T sessionStatus, int sessionRc)
{
- LogFlowThisFunc(("oldStatus=%ld, newStatus=%ld, sessionRc=%Rrc\n",
+ LogFlowThisFunc(("oldStatus=%RU32, newStatus=%RU32, sessionRc=%Rrc\n",
mData.mStatus, sessionStatus, sessionRc));
if (sessionStatus == GuestSessionStatus_Error)
@@ -2173,7 +2278,7 @@ int GuestSession::waitFor(uint32_t fWaitFlags, ULONG uTimeoutMS, GuestSessionWai
break;
default:
- AssertMsgFailed(("Unhandled session status %ld\n", mData.mStatus));
+ AssertMsgFailed(("Unhandled session status %RU32\n", mData.mStatus));
return VERR_NOT_IMPLEMENTED;
}
}
@@ -2203,12 +2308,12 @@ int GuestSession::waitFor(uint32_t fWaitFlags, ULONG uTimeoutMS, GuestSessionWai
break;
default:
- AssertMsgFailed(("Unhandled session status %ld\n", mData.mStatus));
+ AssertMsgFailed(("Unhandled session status %RU32\n", mData.mStatus));
return VERR_NOT_IMPLEMENTED;
}
}
- LogFlowThisFunc(("sessionStatus=%ld, sessionRc=%Rrc, waitResult=%ld\n",
+ LogFlowThisFunc(("sessionStatus=%RU32, sessionRc=%Rrc, waitResult=%RU32\n",
mData.mStatus, mData.mRC, waitResult));
/* No waiting needed? Return immediately using the last set error. */
@@ -2313,7 +2418,7 @@ int GuestSession::waitForStatusChange(GuestWaitEvent *pEvent, uint32_t fWaitFlag
if (pGuestRc)
*pGuestRc = (int)lGuestRc;
- LogFlowThisFunc(("Status changed event for session ID=%RU32, new status is: %ld (%Rrc)\n",
+ LogFlowThisFunc(("Status changed event for session ID=%RU32, new status is: %RU32 (%Rrc)\n",
mData.mSession.mID, sessionStatus,
RT_SUCCESS((int)lGuestRc) ? VINF_SUCCESS : (int)lGuestRc));
}
@@ -2515,7 +2620,8 @@ STDMETHODIMP GuestSession::DirectoryCreate(IN_BSTR aPath, ULONG aMode,
switch (rc)
{
case VERR_GSTCTL_GUEST_ERROR:
- hr = GuestProcess::setErrorExternal(this, guestRc);
+ /** @todo Handle VERR_NOT_EQUAL (meaning process exit code <> 0). */
+ hr = setError(VBOX_E_IPRT_ERROR, tr("Directory creation failed: Could not create directory"));
break;
case VERR_INVALID_PARAMETER:
@@ -2526,10 +2632,6 @@ STDMETHODIMP GuestSession::DirectoryCreate(IN_BSTR aPath, ULONG aMode,
hr = setError(VBOX_E_IPRT_ERROR, tr("Directory creation failed: Unexpectedly aborted"));
break;
- case VERR_CANT_CREATE:
- hr = setError(VBOX_E_IPRT_ERROR, tr("Directory creation failed: Could not create directory"));
- break;
-
default:
hr = setError(VBOX_E_IPRT_ERROR, tr("Directory creation failed: %Rrc"), rc);
break;
@@ -3482,7 +3584,7 @@ STDMETHODIMP GuestSession::ProcessGet(ULONG aPID, IGuestProcess **aProcess)
#ifndef VBOX_WITH_GUEST_CONTROL
ReturnComNotImplemented();
#else
- LogFlowThisFunc(("aPID=%RU32\n", aPID));
+ LogFlowThisFunc(("PID=%RU32\n", aPID));
CheckComArgOutPointerValid(aProcess);
if (aPID == 0)
diff --git a/src/VBox/Main/src-client/GuestSessionImplTasks.cpp b/src/VBox/Main/src-client/GuestSessionImplTasks.cpp
index d576baf..759020d 100644
--- a/src/VBox/Main/src-client/GuestSessionImplTasks.cpp
+++ b/src/VBox/Main/src-client/GuestSessionImplTasks.cpp
@@ -303,6 +303,7 @@ int SessionTaskCopyTo::Run(void)
}
else
{
+ rc = VINF_SUCCESS;
pFile = mSourceFile;
/* Size + offset are optional. */
}
@@ -316,10 +317,15 @@ int SessionTaskCopyTo::Run(void)
/* Startup process. */
ComObjPtr<GuestProcess> pProcess; int guestRc;
- rc = pSession->processCreateExInteral(procInfo, pProcess);
if (RT_SUCCESS(rc))
+ rc = pSession->processCreateExInteral(procInfo, pProcess);
+ if (RT_SUCCESS(rc))
+ {
+ Assert(!pProcess.isNull());
rc = pProcess->startProcess(30 * 1000 /* 30s timeout */,
&guestRc);
+ }
+
if (RT_FAILURE(rc))
{
switch (rc)
@@ -462,8 +468,8 @@ int SessionTaskCopyTo::Run(void)
break;
} /* for */
- LogFlowThisFunc(("Copy loop ended with rc=%Rrc, cbWrittenTotal=%RU64, cbFileSize=%RU64\n",
- rc, cbWrittenTotal, mSourceSize));
+ LogFlowThisFunc(("Copy loop ended with rc=%Rrc, cbToRead=%RU64, cbWrittenTotal=%RU64, cbFileSize=%RU64\n",
+ rc, cbToRead, cbWrittenTotal, mSourceSize));
if ( !fCanceled
|| RT_SUCCESS(rc))
@@ -531,8 +537,6 @@ int SessionTaskCopyTo::Run(void)
rc = setProgressSuccess();
}
}
-
- pProcess->Release();
} /* processCreateExInteral */
if (!mSourceFile) /* Only close locally opened files. */
@@ -595,7 +599,7 @@ int SessionTaskCopyFrom::Run(void)
* Note: There will be races between querying file size + reading the guest file's
* content because we currently *do not* lock down the guest file when doing the
* actual operations.
- ** @todo Implement guest file locking!
+ ** @todo Use the IGuestFile API for locking down the file on the guest!
*/
GuestFsObjData objData; int guestRc;
int rc = pSession->fileQueryInfoInternal(Utf8Str(mSource), objData, &guestRc);
@@ -771,7 +775,7 @@ int SessionTaskCopyFrom::Run(void)
/* If nothing was transfered but the file size was > 0 then "vbox_cat" wasn't able to write
* to the destination -> access denied. */
setProgressErrorMsg(VBOX_E_IPRT_ERROR,
- Utf8StrFmt(GuestSession::tr("Access denied when copying file \"%s\" to \"%s\""),
+ Utf8StrFmt(GuestSession::tr("Unable to write \"%s\" to \"%s\": Access denied"),
mSource.c_str(), mDest.c_str()));
rc = VERR_GENERAL_FAILURE; /* Fudge. */
}
@@ -802,8 +806,6 @@ int SessionTaskCopyFrom::Run(void)
rc = setProgressSuccess();
}
}
-
- pProcess->Release();
}
RTFileClose(fileDest);
diff --git a/src/VBox/Main/src-client/SessionImpl.cpp b/src/VBox/Main/src-client/SessionImpl.cpp
index 26d2e8f..6d2cbbd 100644
--- a/src/VBox/Main/src-client/SessionImpl.cpp
+++ b/src/VBox/Main/src-client/SessionImpl.cpp
@@ -528,10 +528,11 @@ STDMETHODIMP Session::Uninitialize()
return S_OK;
}
-#ifndef DEBUG_andy /* Don't bug me -- now time to fix this at the moment. */
- AssertReturn(mState == SessionState_Locked ||
- mState == SessionState_Spawning, VBOX_E_INVALID_VM_STATE);
-#endif
+ AssertMsgReturn( mState == SessionState_Locked
+ || mState == SessionState_Spawning,
+ ("Session is in wrong state (%ld), expected locked (%ld) or spawning (%ld)\n",
+ mState, SessionState_Locked, SessionState_Spawning),
+ VBOX_E_INVALID_VM_STATE);
/* close ourselves */
rc = unlockMachine(false /* aFinalRelease */, true /* aFromServer */);
diff --git a/src/VBox/Main/src-server/ApplianceImpl.cpp b/src/VBox/Main/src-server/ApplianceImpl.cpp
index 5a66dec..3f48b04 100644
--- a/src/VBox/Main/src-server/ApplianceImpl.cpp
+++ b/src/VBox/Main/src-server/ApplianceImpl.cpp
@@ -1558,8 +1558,8 @@ std::list<VirtualSystemDescriptionEntry*> VirtualSystemDescription::findByType(V
}
/**
- * Private method; delete all records from the list
- * m->llDescriptions that match the given type.
+ * Private method; delete all records from the list
+ * m->llDescriptions that match the given type.
* @param aType
* @return
*/
diff --git a/src/VBox/Main/src-server/ApplianceImplExport.cpp b/src/VBox/Main/src-server/ApplianceImplExport.cpp
index 5518a74..a1fa7da 100644
--- a/src/VBox/Main/src-server/ApplianceImplExport.cpp
+++ b/src/VBox/Main/src-server/ApplianceImplExport.cpp
@@ -372,7 +372,7 @@ STDMETHODIMP Machine::ExportTo(IAppliance *aAppliance, IN_BSTR location, IVirtua
* 3. only ISO image is exported
*/
- //1. no host drive CD/DVD image
+ //1. no host drive CD/DVD image
BOOL fHostDrive = false;
rc = pMedium->COMGETTER(HostDrive)(&fHostDrive);
if (FAILED(rc)) throw rc;
@@ -380,7 +380,7 @@ STDMETHODIMP Machine::ExportTo(IAppliance *aAppliance, IN_BSTR location, IVirtua
if(fHostDrive)
continue;
- //2. the image must be accessible and readable
+ //2. the image must be accessible and readable
MediumState_T ms;
rc = pMedium->RefreshState(&ms);
if (FAILED(rc)) throw rc;
@@ -388,7 +388,7 @@ STDMETHODIMP Machine::ExportTo(IAppliance *aAppliance, IN_BSTR location, IVirtua
if (ms != MediumState_Created)
continue;
- //3. only ISO image is exported
+ //3. only ISO image is exported
Bstr bstrLocation;
rc = pMedium->COMGETTER(Location)(bstrLocation.asOutParam());
if (FAILED(rc)) throw rc;
diff --git a/src/VBox/Main/src-server/ApplianceImplImport.cpp b/src/VBox/Main/src-server/ApplianceImplImport.cpp
index d136a18..d757080 100644
--- a/src/VBox/Main/src-server/ApplianceImplImport.cpp
+++ b/src/VBox/Main/src-server/ApplianceImplImport.cpp
@@ -2104,7 +2104,6 @@ HRESULT Appliance::verifyManifestFile(const Utf8Str &strFile, ImportStack &stack
return rc;
}
-
/**
* Helper that converts VirtualSystem attachment values into VirtualBox attachment values.
* Throws HRESULT values on errors!
@@ -2415,7 +2414,7 @@ void Appliance::importOneDiskImage(const ovf::DiskImage &di,
RTPathFilename(strSourceOVF.c_str()), vrc);
}
}
- catch (HRESULT arc)
+ catch (HRESULT /*arc*/)
{
throw;
}
@@ -2460,22 +2459,14 @@ void Appliance::importOneDiskImage(const ovf::DiskImage &di,
else
{
/* We need a proper source format description */
- ComObjPtr<MediumFormat> srcFormat;
/* Which format to use? */
- Utf8Str strSrcFormat = "VDI";
-
- std::set<Utf8Str> listURIs = Appliance::URIFromTypeOfVirtualDiskFormat("VMDK");
- std::set<Utf8Str>::const_iterator itr = listURIs.find(di.strFormat);
-
- if (itr != listURIs.end())
- {
- strSrcFormat = "VMDK";
- }
+ Utf8Str strSrcFormat = typeOfVirtualDiskFormatFromURI(di.strFormat);
- srcFormat = pSysProps->mediumFormat(strSrcFormat);
+ ComObjPtr<MediumFormat> srcFormat = pSysProps->mediumFormat(strSrcFormat);
if (srcFormat.isNull())
throw setError(VBOX_E_NOT_SUPPORTED,
- tr("Could not find a valid medium format for the source disk '%s'"),
+ tr("Could not find a valid medium format for the source disk '%s' "
+ "Check correctness of the image format URL in the OVF description file."),
RTPathFilename(strSourceOVF.c_str()));
/* Clone the source disk image */
@@ -2488,8 +2479,6 @@ void Appliance::importOneDiskImage(const ovf::DiskImage &di,
pProgress);
if (FAILED(rc)) throw rc;
-
-
/* Advance to the next operation. */
/* operation's weight, as set up with the IProgress originally */
stack.pProgress->SetNextOperation(BstrFmt(tr("Importing virtual disk image '%s'"),
@@ -2969,12 +2958,17 @@ void Appliance::importMachineGeneric(const ovf::VirtualSystem &vsysThis,
if (FAILED(rc)) throw rc;
stack.fSessionOpen = false;
}
- catch(HRESULT /* aRC */)
+ catch(HRESULT aRC)
{
+ com::ErrorInfo info;
+
if (stack.fSessionOpen)
stack.pSession->UnlockMachine();
- throw;
+ if (info.isFullAvailable())
+ throw setError(aRC, Utf8Str(info.getText()).c_str());
+ else
+ throw setError(aRC, "Unknown error during OVF import");
}
}
@@ -2991,10 +2985,17 @@ void Appliance::importMachineGeneric(const ovf::VirtualSystem &vsysThis,
if (FAILED(rc)) throw rc;
stack.fSessionOpen = true;
+ /* get VM name from virtual system description. Only one record is possible (size of list is equal 1). */
+ std::list<VirtualSystemDescriptionEntry*> vmName = vsdescThis->findByType(VirtualSystemDescriptionType_Name);
+ std::list<VirtualSystemDescriptionEntry*>::iterator vmNameIt = vmName.begin();
+ VirtualSystemDescriptionEntry* vmNameEntry = *vmNameIt;
+
ovf::DiskImagesMap::const_iterator oit = stack.mapDisks.begin();
std::set<RTCString> disksResolvedNames;
- while(oit != stack.mapDisks.end())
+ uint32_t cImportedDisks = 0;
+
+ while(oit != stack.mapDisks.end() && cImportedDisks != avsdeHDs.size())
{
ovf::DiskImage diCurrent = oit->second;
ovf::VirtualDisksMap::const_iterator itVDisk = vsysThis.mapVirtualDisks.begin();
@@ -3022,9 +3023,13 @@ void Appliance::importMachineGeneric(const ovf::VirtualSystem &vsysThis,
}
}
if (!vsdeTargetHD)
- throw setError(E_FAIL,
- tr("Internal inconsistency looking up disk image '%s'"),
- diCurrent.strHref.c_str());
+ {
+ /* possible case if a disk image belongs to other virtual system (OVF package with multiple VMs inside) */
+ LogWarning(("OVA/OVF import: Disk image %s was missed during import of VM %s\n",
+ oit->first.c_str(), vmNameEntry->strOvf.c_str()));
+ ++oit;
+ continue;
+ }
//diCurrent.strDiskId contains the disk identifier (e.g. "vmdisk1"), which should exist
//in the virtual system's disks map under that ID and also in the global images map
@@ -3078,13 +3083,11 @@ void Appliance::importMachineGeneric(const ovf::VirtualSystem &vsysThis,
break;
}
if (itDiskImage == stack.mapDisks.end())
- {
throw setError(E_FAIL,
tr("Internal inconsistency looking up disk image '%s'. "
"Check compliance OVA package structure and file names "
- "references in the section <References> in the OVF file."),
+ "references in the section <References> in the OVF file"),
availableImage.c_str());
- }
/* replace with a new found disk image */
diCurrent = *(&itDiskImage->second);
@@ -3108,6 +3111,10 @@ void Appliance::importMachineGeneric(const ovf::VirtualSystem &vsysThis,
}
}
if (!vsdeTargetHD)
+ /*
+ * in this case it's an error because something wrong with OVF description file.
+ * May be VB imports OVA package with wrong file sequence inside the archive.
+ */
throw setError(E_FAIL,
tr("Internal inconsistency looking up disk image '%s'"),
diCurrent.strHref.c_str());
@@ -3155,7 +3162,8 @@ void Appliance::importMachineGeneric(const ovf::VirtualSystem &vsysThis,
// now use the new uuid to attach the disk image to our new machine
ComPtr<IMachine> sMachine;
rc = stack.pSession->COMGETTER(Machine)(sMachine.asOutParam());
- if (FAILED(rc)) throw rc;
+ if (FAILED(rc))
+ throw rc;
// find the hard disk controller to which we should attach
ovf::HardDiskController hdc = (*vsysThis.mapControllers.find(ovfVdisk.idController)).second;
@@ -3185,14 +3193,16 @@ void Appliance::importMachineGeneric(const ovf::VirtualSystem &vsysThis,
false,
dvdImage.asOutParam());
- if (FAILED(rc)) throw rc;
+ if (FAILED(rc))
+ throw rc;
rc = sMachine->AttachDevice(mhda.controllerType.raw(),// wstring name
mhda.lControllerPort, // long controllerPort
mhda.lDevice, // long device
DeviceType_DVD, // DeviceType_T type
dvdImage);
- if (FAILED(rc)) throw rc;
+ if (FAILED(rc))
+ throw rc;
}
else
{
@@ -3202,30 +3212,51 @@ void Appliance::importMachineGeneric(const ovf::VirtualSystem &vsysThis,
DeviceType_HardDisk, // DeviceType_T type
pTargetHD);
- if (FAILED(rc)) throw rc;
+ if (FAILED(rc))
+ throw rc;
}
stack.llHardDiskAttachments.push_back(mhda);
rc = sMachine->SaveSettings();
- if (FAILED(rc)) throw rc;
+ if (FAILED(rc))
+ throw rc;
/* restore */
vsdeTargetHD->strVboxCurrent = savedVboxCurrent;
+ ++cImportedDisks;
+
} // end while(oit != stack.mapDisks.end())
+ /*
+ * quantity of the imported disks isn't equal to the size of the avsdeHDs list.
+ */
+ if(cImportedDisks < avsdeHDs.size())
+ {
+ LogWarning(("Not all disk images were imported for VM %s. Check OVF description file.",
+ vmNameEntry->strOvf.c_str()));
+ }
+
// only now that we're done with all disks, close the session
rc = stack.pSession->UnlockMachine();
- if (FAILED(rc)) throw rc;
+
+ if (FAILED(rc))
+ throw rc;
+
stack.fSessionOpen = false;
}
- catch(HRESULT /* aRC */)
+ catch(HRESULT aRC)
{
+ com::ErrorInfo info;
+
if (stack.fSessionOpen)
stack.pSession->UnlockMachine();
- throw;
+ if (info.isFullAvailable())
+ throw setError(aRC, Utf8Str(info.getText()).c_str());
+ else
+ throw setError(aRC, "Unknown error during OVF import");
}
}
}
@@ -3394,7 +3425,7 @@ void Appliance::importVBoxMachine(ComObjPtr<VirtualSystemDescription> &vsdescThi
* failures. A long fixed bug, however the OVF files are long lived. */
settings::StorageControllersList &llControllers = config.storageMachine.llStorageControllers;
Guid hdUuid;
- uint32_t cHardDisks = 0;
+ uint32_t cDisks = 0;
bool fInconsistent = false;
bool fRepairDuplicate = false;
settings::StorageControllersList::iterator it3;
@@ -3418,8 +3449,8 @@ void Appliance::importVBoxMachine(ComObjPtr<VirtualSystemDescription> &vsdescThi
else if (it4->deviceType == DeviceType_HardDisk)
{
const Guid &thisUuid = it4->uuid;
- cHardDisks++;
- if (cHardDisks == 1)
+ cDisks++;
+ if (cDisks == 1)
{
if (hdUuid.isZero())
hdUuid = thisUuid;
@@ -3438,18 +3469,23 @@ void Appliance::importVBoxMachine(ComObjPtr<VirtualSystemDescription> &vsdescThi
}
}
/* paranoia... */
- if (fInconsistent || cHardDisks == 1)
+ if (fInconsistent || cDisks == 1)
fRepairDuplicate = false;
/*
* step 2: scan the machine config for media attachments
*/
+ /* get VM name from virtual system description. Only one record is possible (size of list is equal 1). */
+ std::list<VirtualSystemDescriptionEntry*> vmName = vsdescThis->findByType(VirtualSystemDescriptionType_Name);
+ std::list<VirtualSystemDescriptionEntry*>::iterator vmNameIt = vmName.begin();
+ VirtualSystemDescriptionEntry* vmNameEntry = *vmNameIt;
+
/* Get all hard disk descriptions. */
std::list<VirtualSystemDescriptionEntry*> avsdeHDs = vsdescThis->findByType(VirtualSystemDescriptionType_HardDiskImage);
std::list<VirtualSystemDescriptionEntry*>::iterator avsdeHDsIt = avsdeHDs.begin();
/* paranoia - if there is no 1:1 match do not try to repair. */
- if (cHardDisks != avsdeHDs.size())
+ if (cDisks != avsdeHDs.size())
fRepairDuplicate = false;
// there must be an image in the OVF disk structs with the same UUID
@@ -3457,7 +3493,9 @@ void Appliance::importVBoxMachine(ComObjPtr<VirtualSystemDescription> &vsdescThi
ovf::DiskImagesMap::const_iterator oit = stack.mapDisks.begin();
std::set<RTCString> disksResolvedNames;
- while(oit != stack.mapDisks.end())
+ uint32_t cImportedDisks = 0;
+
+ while(oit != stack.mapDisks.end() && cImportedDisks != avsdeHDs.size())
{
ovf::DiskImage diCurrent = oit->second;
@@ -3479,10 +3517,15 @@ void Appliance::importVBoxMachine(ComObjPtr<VirtualSystemDescription> &vsdescThi
break;
}
}
+
if (!vsdeTargetHD)
- throw setError(E_FAIL,
- tr("Internal inconsistency looking up disk image '%s'"),
- oit->first.c_str());
+ {
+ /* possible case if a disk image belongs to other virtual system (OVF package with multiple VMs inside) */
+ LogWarning(("OVA/OVF import: Disk image %s was missed during import of VM %s\n",
+ oit->first.c_str(), vmNameEntry->strOvf.c_str()));
+ ++oit;
+ continue;
+ }
}
/*
@@ -3552,6 +3595,10 @@ void Appliance::importVBoxMachine(ComObjPtr<VirtualSystemDescription> &vsdescThi
}
}
if (!vsdeTargetHD)
+ /*
+ * in this case it's an error because something wrong with OVF description file.
+ * May be VB imports OVA package with wrong file sequence inside the archive.
+ */
throw setError(E_FAIL,
tr("Internal inconsistency looking up disk image '%s'"),
diCurrent.strHref.c_str());
@@ -3691,9 +3738,20 @@ void Appliance::importVBoxMachine(ComObjPtr<VirtualSystemDescription> &vsdescThi
"but the OVF describes no such image"),
strUuid.c_str());
+ ++cImportedDisks;
+
}// while(oit != stack.mapDisks.end())
/*
+ * quantity of the imported disks isn't equal to the size of the avsdeHDs list.
+ */
+ if(cImportedDisks < avsdeHDs.size())
+ {
+ LogWarning(("Not all disk images were imported for VM %s. Check OVF description file.",
+ vmNameEntry->strOvf.c_str()));
+ }
+
+ /*
* step 4): create the machine and have it import the config
*/
diff --git a/src/VBox/Main/src-server/ClientWatcher.cpp b/src/VBox/Main/src-server/ClientWatcher.cpp
index 54bd62c..6d2cd3f 100644
--- a/src/VBox/Main/src-server/ClientWatcher.cpp
+++ b/src/VBox/Main/src-server/ClientWatcher.cpp
@@ -691,7 +691,6 @@ DECLCALLBACK(int) VirtualBox::ClientWatcher::worker(RTTHREAD /* thread */, void
#elif defined(VBOX_WITH_GENERIC_SESSION_WATCHER)
- bool update = false;
bool updateSpawned = false;
do
@@ -732,35 +731,22 @@ DECLCALLBACK(int) VirtualBox::ClientWatcher::worker(RTTHREAD /* thread */, void
if (!autoCaller.isOk())
break;
- if (RT_SUCCESS(rc) || update || updateSpawned)
+ /** @todo this quite big effort for catching machines in spawning
+ * state which can't be caught by the token mechanism (as the token
+ * can't be in the other process yet) could be eliminated if the
+ * reaping is made smarter, having cross-reference information
+ * from the pid to the corresponding machine object. Both cases do
+ * more or less the same thing anyway. */
+ if (RT_SUCCESS(rc) || updateSpawned)
{
/* RT_SUCCESS(rc) means an update event is signaled */
-#if 0
// get reference to the machines list in VirtualBox
VirtualBox::MachinesOList &allMachines = that->mVirtualBox->getMachinesList();
// lock the machines list for reading
AutoReadLock thatLock(allMachines.getLockHandle() COMMA_LOCKVAL_SRC_POS);
- if (RT_SUCCESS(rc) || update)
- {
- /* obtain a new set of opened machines */
- machines.clear();
-
- for (MachinesOList::iterator it = allMachines.begin();
- it != allMachines.end();
- ++it)
- {
- ComObjPtr<SessionMachine> sm;
- if ((*it)->isSessionOpenOrClosing(sm))
- machines.push_back(sm);
- }
-
- cnt = machines.size();
- LogFlowFunc(("UPDATE: direct session count = %d\n", cnt));
- }
-
if (RT_SUCCESS(rc) || updateSpawned)
{
/* obtain a new set of spawned machines */
@@ -778,23 +764,13 @@ DECLCALLBACK(int) VirtualBox::ClientWatcher::worker(RTTHREAD /* thread */, void
LogFlowFunc(("UPDATE: spawned session count = %d\n", cntSpawned));
}
- // machines lock unwinds here
-#else
NOREF(cnt);
-#endif
+ // machines lock unwinds here
}
-#if 0
- update = false;
- for (size_t i = 0; i < cnt; ++i)
- update |= (machines[i])->checkForDeath();
-
updateSpawned = false;
for (size_t i = 0; i < cntSpawned; ++i)
updateSpawned |= (spawnedMachines[i])->checkForSpawnFailure();
-#else
- NOREF(cntSpawned);
-#endif
/* reap child processes */
{
diff --git a/src/VBox/Main/src-server/DHCPServerImpl.cpp b/src/VBox/Main/src-server/DHCPServerImpl.cpp
index 6f8aa0c..7a46068 100644
--- a/src/VBox/Main/src-server/DHCPServerImpl.cpp
+++ b/src/VBox/Main/src-server/DHCPServerImpl.cpp
@@ -17,6 +17,7 @@
* hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
*/
+#include <string>
#include "NetworkServiceRunner.h"
#include "DHCPServerImpl.h"
#include "AutoCaller.h"
@@ -31,6 +32,10 @@
// constructor / destructor
/////////////////////////////////////////////////////////////////////////////
+const std::string DHCPServerRunner::kDsrKeyGateway = "--gateway";
+const std::string DHCPServerRunner::kDsrKeyLowerIp = "--lower-ip";
+const std::string DHCPServerRunner::kDsrKeyUpperIp = "--upper-ip";
+
DHCPServer::DHCPServer()
: mVirtualBox(NULL)
@@ -280,6 +285,10 @@ STDMETHODIMP DHCPServer::AddGlobalOption(DhcpOpt_T aOption, IN_BSTR aValue)
m.GlobalDhcpOptions.insert(
DhcpOptValuePair(aOption, Utf8Str(aValue)));
+ /* Indirect way to understand that we're on NAT network */
+ if (aOption == DhcpOpt_Router)
+ m.dhcp.setOption(NetworkServiceRunner::kNsrKeyNeedMain, "on");
+
alock.release();
AutoWriteLock vboxLock(mVirtualBox COMMA_LOCKVAL_SRC_POS);
@@ -470,13 +479,13 @@ STDMETHODIMP DHCPServer::Start(IN_BSTR aNetworkName, IN_BSTR aTrunkName, IN_BSTR
return S_OK;
/* Commmon Network Settings */
- m.dhcp.setOption(NETCFG_NETNAME, Utf8Str(aNetworkName), true);
+ m.dhcp.setOption(NetworkServiceRunner::kNsrKeyNetwork, Utf8Str(aNetworkName).c_str());
Bstr tmp(aTrunkName);
if (!tmp.isEmpty())
- m.dhcp.setOption(NETCFG_TRUNKNAME, Utf8Str(tmp), true);
- m.dhcp.setOption(NETCFG_TRUNKTYPE, Utf8Str(aTrunkType), true);
+ m.dhcp.setOption(NetworkServiceRunner::kNsrTrunkName, Utf8Str(tmp).c_str());
+ m.dhcp.setOption(NetworkServiceRunner::kNsrKeyTrunkType, Utf8Str(aTrunkType).c_str());
/* XXX: should this MAC default initialization moved to NetworkServiceRunner? */
char strMAC[32];
@@ -486,9 +495,11 @@ STDMETHODIMP DHCPServer::Start(IN_BSTR aNetworkName, IN_BSTR aTrunkName, IN_BSTR
guid.raw()->au8[0],
guid.raw()->au8[1],
guid.raw()->au8[2]);
- m.dhcp.setOption(NETCFG_MACADDRESS, strMAC, true);
- m.dhcp.setOption(NETCFG_IPADDRESS, Utf8Str(m.IPAddress), true);
- m.dhcp.setOption(NETCFG_NETMASK, Utf8Str(m.GlobalDhcpOptions[DhcpOpt_SubnetMask]), true);
+ m.dhcp.setOption(NetworkServiceRunner::kNsrMacAddress, strMAC);
+ m.dhcp.setOption(NetworkServiceRunner::kNsrIpAddress, Utf8Str(m.IPAddress).c_str());
+ m.dhcp.setOption(NetworkServiceRunner::kNsrIpNetmask, Utf8Str(m.GlobalDhcpOptions[DhcpOpt_SubnetMask]).c_str());
+ m.dhcp.setOption(DHCPServerRunner::kDsrKeyLowerIp, Utf8Str(m.lowerIP).c_str());
+ m.dhcp.setOption(DHCPServerRunner::kDsrKeyUpperIp, Utf8Str(m.upperIP).c_str());
/* XXX: This parameters Dhcp Server will fetch via API */
return RT_FAILURE(m.dhcp.start()) ? E_FAIL : S_OK;
diff --git a/src/VBox/Main/src-server/HostDnsService.cpp b/src/VBox/Main/src-server/HostDnsService.cpp
index be7c8f9..0e5cbc5 100644
--- a/src/VBox/Main/src-server/HostDnsService.cpp
+++ b/src/VBox/Main/src-server/HostDnsService.cpp
@@ -28,7 +28,6 @@
#include <algorithm>
#include <string>
-#include <vector>
#include "HostDnsService.h"
@@ -36,29 +35,35 @@ static HostDnsMonitor *g_monitor;
/* Lockee */
-Lockee::Lockee(){ RTCritSectInit(&mLock);}
-
-
-Lockee::~Lockee(){RTCritSectDelete(&mLock);}
+Lockee::Lockee()
+{
+ RTCritSectInit(&mLock);
+}
+Lockee::~Lockee()
+{
+ RTCritSectDelete(&mLock);
+}
-const RTCRITSECT* Lockee::lock() const {return &mLock;}
+const RTCRITSECT* Lockee::lock() const
+{
+ return &mLock;
+}
/* ALock */
-ALock::ALock(const Lockee *l):lck(l)
+ALock::ALock(const Lockee *aLockee)
+ : lockee(aLockee)
{
- RTCritSectEnter(const_cast<PRTCRITSECT>(lck->lock()));
+ RTCritSectEnter(const_cast<PRTCRITSECT>(lockee->lock()));
}
ALock::~ALock()
{
- RTCritSectLeave(const_cast<PRTCRITSECT>(lck->lock()));
+ RTCritSectLeave(const_cast<PRTCRITSECT>(lockee->lock()));
}
-
-
-inline static void detachVectorOfString(const std::vector<std::string>& v,
- ComSafeArrayOut(BSTR, aBstrArray))
+inline static void detachVectorOfString(const std::vector<std::string>& v,
+ ComSafeArrayOut(BSTR, aBstrArray))
{
com::SafeArray<BSTR> aBstr(v.size());
@@ -72,81 +77,96 @@ inline static void detachVectorOfString(const std::vector<std::string>& v,
aBstr.detachTo(ComSafeArrayOutArg(aBstrArray));
}
-
struct HostDnsMonitor::Data
{
- std::vector<HostDnsMonitorProxy> proxies;
+ std::vector<PCHostDnsMonitorProxy> proxies;
HostDnsInformation info;
};
-
struct HostDnsMonitorProxy::Data
{
- Data(const HostDnsMonitor* mon, const VirtualBox* vbox):
- info(NULL), virtualbox(vbox), monitor(mon), fModified(true){}
-
- virtual ~Data() {if (info) delete info;}
+ Data(const HostDnsMonitor *aMonitor, const VirtualBox *aParent)
+ : info(NULL)
+ , virtualbox(aParent)
+ , monitor(aMonitor)
+ , fModified(true)
+ {}
+
+ virtual ~Data()
+ {
+ if (info)
+ {
+ delete info;
+ info = NULL;
+ }
+ }
HostDnsInformation *info;
const VirtualBox *virtualbox;
- const HostDnsMonitor* monitor;
+ const HostDnsMonitor *monitor;
bool fModified;
};
-HostDnsMonitor::HostDnsMonitor():m(NULL){}
-
-
-HostDnsMonitor::~HostDnsMonitor(){if (m) delete m;}
+HostDnsMonitor::HostDnsMonitor()
+ : m(NULL)
+{
+}
+HostDnsMonitor::~HostDnsMonitor()
+{
+ if (m)
+ {
+ delete m;
+ m = NULL;
+ }
+}
-const HostDnsMonitor* HostDnsMonitor::getHostDnsMonitor()
+const HostDnsMonitor *HostDnsMonitor::getHostDnsMonitor()
{
/* XXX: Moved initialization from HostImpl.cpp */
if (!g_monitor)
{
- g_monitor =
# if defined (RT_OS_DARWIN)
- new HostDnsServiceDarwin();
+ g_monitor = new HostDnsServiceDarwin();
# elif defined(RT_OS_WINDOWS)
- new HostDnsServiceWin();
+ g_monitor = new HostDnsServiceWin();
# elif defined(RT_OS_LINUX)
- new HostDnsServiceLinux();
+ g_monitor = new HostDnsServiceLinux();
# elif defined(RT_OS_SOLARIS)
- new HostDnsServiceSolaris();
+ g_monitor = new HostDnsServiceSolaris();
+# elif defined(RT_OS_FREEBSD)
+ g_monitor = new HostDnsServiceFreebsd();
# elif defined(RT_OS_OS2)
- new HostDnsServiceOs2();
+ g_monitor = new HostDnsServiceOs2();
# else
- new HostDnsService();
+ g_monitor = new HostDnsService();
# endif
- g_monitor->init();
+ g_monitor->init();
}
+
return g_monitor;
}
-
-void HostDnsMonitor::addMonitorProxy(const HostDnsMonitorProxy& proxy) const
+void HostDnsMonitor::addMonitorProxy(PCHostDnsMonitorProxy proxy) const
{
ALock l(this);
m->proxies.push_back(proxy);
-
- proxy.notify();
+ proxy->notify();
}
-
-void HostDnsMonitor::releaseMonitorProxy(const HostDnsMonitorProxy& proxy) const
+void HostDnsMonitor::releaseMonitorProxy(PCHostDnsMonitorProxy proxy) const
{
ALock l(this);
- std::vector<HostDnsMonitorProxy>::iterator it;
+ std::vector<PCHostDnsMonitorProxy>::iterator it;
it = std::find(m->proxies.begin(), m->proxies.end(), proxy);
if (it == m->proxies.end())
return;
-
+
m->proxies.erase(it);
}
-
void HostDnsMonitor::shutdown()
{
if (g_monitor)
@@ -156,64 +176,63 @@ void HostDnsMonitor::shutdown()
}
}
-
-const HostDnsInformation& HostDnsMonitor::getInfo() const
+const HostDnsInformation &HostDnsMonitor::getInfo() const
{
return m->info;
}
-
void HostDnsMonitor::notifyAll() const
{
ALock l(this);
- std::vector<HostDnsMonitorProxy>::const_iterator it;
+ std::vector<PCHostDnsMonitorProxy>::const_iterator it;
for (it = m->proxies.begin(); it != m->proxies.end(); ++it)
- it->notify();
+ (*it)->notify();
}
-
-void HostDnsMonitor::setInfo(const HostDnsInformation& info)
+void HostDnsMonitor::setInfo(const HostDnsInformation &info)
{
ALock l(this);
m->info = info;
}
-
HRESULT HostDnsMonitor::init()
{
m = new HostDnsMonitor::Data();
return S_OK;
}
+
/* HostDnsMonitorProxy */
-HostDnsMonitorProxy::HostDnsMonitorProxy():m(NULL){}
+HostDnsMonitorProxy::HostDnsMonitorProxy()
+ : m(NULL)
+{
+}
HostDnsMonitorProxy::~HostDnsMonitorProxy()
{
- if (m && m->monitor)
+ if (m)
{
- m->monitor->releaseMonitorProxy(*this);
+ if (m->monitor)
+ m->monitor->releaseMonitorProxy(this);
delete m;
+ m = NULL;
}
}
-
-void HostDnsMonitorProxy::init(const HostDnsMonitor* mon, const VirtualBox* aParent)
+void HostDnsMonitorProxy::init(const HostDnsMonitor *mon, const VirtualBox* aParent)
{
m = new HostDnsMonitorProxy::Data(mon, aParent);
- m->monitor->addMonitorProxy(*this);
+ m->monitor->addMonitorProxy(this);
updateInfo();
}
-
void HostDnsMonitorProxy::notify() const
{
m->fModified = true;
const_cast<VirtualBox *>(m->virtualbox)->onHostNameResolutionConfigurationChange();
}
-
-STDMETHODIMP HostDnsMonitorProxy::COMGETTER(NameServers)(ComSafeArrayOut(BSTR, aNameServers))
+HRESULT HostDnsMonitorProxy::GetNameServers(ComSafeArrayOut(BSTR, aNameServers))
{
AssertReturn(m && m->info, E_FAIL);
ALock l(this);
@@ -226,8 +245,7 @@ STDMETHODIMP HostDnsMonitorProxy::COMGETTER(NameServers)(ComSafeArrayOut(BSTR, a
return S_OK;
}
-
-STDMETHODIMP HostDnsMonitorProxy::COMGETTER(DomainName)(BSTR *aDomainName)
+HRESULT HostDnsMonitorProxy::GetDomainName(BSTR *aDomainName)
{
AssertReturn(m && m->info, E_FAIL);
ALock l(this);
@@ -240,8 +258,7 @@ STDMETHODIMP HostDnsMonitorProxy::COMGETTER(DomainName)(BSTR *aDomainName)
return S_OK;
}
-
-STDMETHODIMP HostDnsMonitorProxy::COMGETTER(SearchStrings)(ComSafeArrayOut(BSTR, aSearchStrings))
+HRESULT HostDnsMonitorProxy::GetSearchStrings(ComSafeArrayOut(BSTR, aSearchStrings))
{
AssertReturn(m && m->info, E_FAIL);
ALock l(this);
@@ -254,29 +271,25 @@ STDMETHODIMP HostDnsMonitorProxy::COMGETTER(SearchStrings)(ComSafeArrayOut(BSTR,
return S_OK;
}
-
-bool HostDnsMonitorProxy::operator==(const HostDnsMonitorProxy& rhs)
+bool HostDnsMonitorProxy::operator==(PCHostDnsMonitorProxy& rhs)
{
- if (!m || rhs.m) return false;
-
+ if (!m || !rhs->m)
+ return false;
+
/**
* we've assigned to the same instance of VirtualBox.
*/
- return m->virtualbox == rhs.m->virtualbox;
+ return m->virtualbox == rhs->m->virtualbox;
}
void HostDnsMonitorProxy::updateInfo()
{
- HostDnsInformation *i = new HostDnsInformation(m->monitor->getInfo());
+ HostDnsInformation *info = new HostDnsInformation(m->monitor->getInfo());
HostDnsInformation *old = m->info;
+ m->info = info;
if (old)
- {
- m->info = i;
delete old;
- }
- else
- m->info = i;
-
+
m->fModified = false;
}
diff --git a/src/VBox/Main/src-server/HostDnsService.h b/src/VBox/Main/src-server/HostDnsService.h
index 696dfe7..094f9da 100644
--- a/src/VBox/Main/src-server/HostDnsService.h
+++ b/src/VBox/Main/src-server/HostDnsService.h
@@ -23,74 +23,70 @@
#include <iprt/critsect.h>
#include <iprt/types.h>
-
#include <list>
+#include <vector>
typedef std::list<com::Utf8Str> Utf8StrList;
typedef Utf8StrList::iterator Utf8StrListIterator;
+class HostDnsMonitorProxy;
+typedef const HostDnsMonitorProxy *PCHostDnsMonitorProxy;
class Lockee
{
- public:
+ public:
Lockee();
virtual ~Lockee();
const RTCRITSECT* lock() const;
- private:
+ private:
RTCRITSECT mLock;
};
-
class ALock
{
- public:
+ public:
ALock(const Lockee *l);
~ALock();
- private:
- const Lockee *lck;
+ private:
+ const Lockee *lockee;
};
-
-struct HostDnsInformation
+class HostDnsInformation
{
+ public:
std::vector<std::string> servers;
std::string domain;
std::vector<std::string> searchList;
};
-
-class HostDnsMonitorProxy;
-
/**
* This class supposed to be a real DNS monitor object it should be singleton,
* it lifecycle starts and ends together with VBoxSVC.
- *
*/
-class HostDnsMonitor:public Lockee
+class HostDnsMonitor : public Lockee
{
- public:
- static const HostDnsMonitor* getHostDnsMonitor();
+ public:
+ static const HostDnsMonitor *getHostDnsMonitor();
static void shutdown();
- void addMonitorProxy(const HostDnsMonitorProxy&) const;
- void releaseMonitorProxy(const HostDnsMonitorProxy&) const;
- const HostDnsInformation& getInfo() const;
+ void addMonitorProxy(PCHostDnsMonitorProxy) const;
+ void releaseMonitorProxy(PCHostDnsMonitorProxy) const;
+ const HostDnsInformation &getInfo() const;
virtual HRESULT init();
-
- protected:
+ protected:
void notifyAll() const;
- void setInfo(const HostDnsInformation&);
+ void setInfo(const HostDnsInformation &);
HostDnsMonitor();
virtual ~HostDnsMonitor();
- private:
- HostDnsMonitor(const HostDnsMonitor&);
- HostDnsMonitor& operator= (const HostDnsMonitor&);
+ private:
+ HostDnsMonitor(const HostDnsMonitor &);
+ HostDnsMonitor& operator= (const HostDnsMonitor &);
- public:
+ public:
struct Data;
Data *m;
};
@@ -98,67 +94,67 @@ class HostDnsMonitor:public Lockee
/**
* This class supposed to be a proxy for events on changing Host Name Resolving configurations.
*/
-class HostDnsMonitorProxy: public Lockee
+class HostDnsMonitorProxy : public Lockee
{
- public:
+ public:
HostDnsMonitorProxy();
~HostDnsMonitorProxy();
- void init(const HostDnsMonitor* mon, const VirtualBox* aParent);
+ void init(const HostDnsMonitor *aMonitor, const VirtualBox *aParent);
void notify() const;
-
- STDMETHOD(COMGETTER(NameServers))(ComSafeArrayOut(BSTR, aNameServers));
- STDMETHOD(COMGETTER(DomainName))(BSTR *aDomainName);
- STDMETHOD(COMGETTER(SearchStrings))(ComSafeArrayOut(BSTR, aSearchStrings));
- bool operator==(const HostDnsMonitorProxy&);
+ HRESULT GetNameServers(ComSafeArrayOut(BSTR, aNameServers));
+ HRESULT GetDomainName(BSTR *aDomainName);
+ HRESULT GetSearchStrings(ComSafeArrayOut(BSTR, aSearchStrings));
- private:
+ bool operator==(PCHostDnsMonitorProxy&);
+
+ private:
void updateInfo();
- private:
+ private:
struct Data;
Data *m;
};
# ifdef RT_OS_DARWIN
-class HostDnsServiceDarwin: public HostDnsMonitor
+class HostDnsServiceDarwin : public HostDnsMonitor
{
- public:
+ public:
HostDnsServiceDarwin();
~HostDnsServiceDarwin();
HRESULT init();
- private:
+ private:
HRESULT updateInfo();
static void hostDnsServiceStoreCallback(void *store, void *arrayRef, void *info);
};
# endif
# ifdef RT_OS_WINDOWS
-class HostDnsServiceWin: public HostDnsMonitor
+class HostDnsServiceWin : public HostDnsMonitor
{
- public:
+ public:
HostDnsServiceWin();
~HostDnsServiceWin();
HRESULT init();
- private:
+ private:
void strList2List(std::vector<std::string>& lst, char *strLst);
HRESULT updateInfo();
};
# endif
-# if defined(RT_OS_SOLARIS) || defined(RT_OS_LINUX) || defined(RT_OS_OS2)
+# if defined(RT_OS_SOLARIS) || defined(RT_OS_LINUX) || defined(RT_OS_OS2) || defined(RT_OS_FREEBSD)
class HostDnsServiceResolvConf: public HostDnsMonitor
-{
- public:
- HostDnsServiceResolvConf():m(NULL){}
+{
+ public:
+ HostDnsServiceResolvConf() : m(NULL) {}
virtual ~HostDnsServiceResolvConf();
virtual HRESULT init(const char *aResolvConfFileName);
const std::string& resolvConf();
- protected:
+ protected:
HRESULT readResolvConf();
- protected:
+ protected:
struct Data;
Data *m;
};
@@ -166,18 +162,18 @@ class HostDnsServiceResolvConf: public HostDnsMonitor
/**
* XXX: https://blogs.oracle.com/praks/entry/file_events_notification
*/
-class HostDnsServiceSolaris: public HostDnsServiceResolvConf
+class HostDnsServiceSolaris : public HostDnsServiceResolvConf
{
- public:
+ public:
HostDnsServiceSolaris(){}
~HostDnsServiceSolaris(){}
HRESULT init(){ return HostDnsServiceResolvConf::init("/etc/resolv.conf");}
};
# elif defined(RT_OS_LINUX)
-class HostDnsServiceLinux: public HostDnsServiceResolvConf
+class HostDnsServiceLinux : public HostDnsServiceResolvConf
{
- public:
+ public:
HostDnsServiceLinux(){}
~HostDnsServiceLinux();
HRESULT init() {return init("/etc/resolv.conf");}
@@ -186,10 +182,19 @@ class HostDnsServiceLinux: public HostDnsServiceResolvConf
static int hostMonitoringRoutine(RTTHREAD ThreadSelf, void *pvUser);
};
-# elif defined(RT_OS_OS2)
-class HostDnsServiceOs2: public HostDnsServiceResolvConf
+# elif defined(RT_OS_FREEBSD)
+class HostDnsServiceFreebsd: public HostDnsServiceResolvConf
{
public:
+ HostDnsServiceFreebsd(){}
+ ~HostDnsServiceFreebsd(){}
+ HRESULT init(){ return HostDnsServiceResolvConf::init("/etc/resolv.conf");}
+};
+
+# elif defined(RT_OS_OS2)
+class HostDnsServiceOs2 : public HostDnsServiceResolvConf
+{
+ public:
HostDnsServiceOs2(){}
~HostDnsServiceOs2(){}
/* XXX: \\MPTN\\ETC should be taken from environment variable ETC */
diff --git a/src/VBox/Main/src-server/HostDnsServiceResolvConf.cpp b/src/VBox/Main/src-server/HostDnsServiceResolvConf.cpp
index 0845b41..931c7fd 100644
--- a/src/VBox/Main/src-server/HostDnsServiceResolvConf.cpp
+++ b/src/VBox/Main/src-server/HostDnsServiceResolvConf.cpp
@@ -22,7 +22,6 @@ typedef int socklen_t;
#include <VBox/log.h>
#include <string>
-#include <vector>
#include "HostDnsService.h"
@@ -34,13 +33,11 @@ struct HostDnsServiceResolvConf::Data
std::string resolvConfFilename;
};
-
-const std::string& HostDnsServiceResolvConf::resolvConf()
+const std::string &HostDnsServiceResolvConf::resolvConf()
{
return m->resolvConfFilename;
}
-
static int fileGets(RTFILE File, void *pvBuf, size_t cbBufSize, size_t *pcbRead)
{
size_t cbRead;
@@ -68,13 +65,15 @@ static int fileGets(RTFILE File, void *pvBuf, size_t cbBufSize, size_t *pcbRead)
return rc;
}
-
HostDnsServiceResolvConf::~HostDnsServiceResolvConf()
{
- if (m) delete m;
+ if (m)
+ {
+ delete m;
+ m = NULL;
+ }
}
-
HRESULT HostDnsServiceResolvConf::init(const char *aResolvConfFileName)
{
HostDnsMonitor::init();
@@ -85,7 +84,6 @@ HRESULT HostDnsServiceResolvConf::init(const char *aResolvConfFileName)
return S_OK;
}
-
HRESULT HostDnsServiceResolvConf::readResolvConf()
{
char buff[256];
@@ -121,7 +119,8 @@ HRESULT HostDnsServiceResolvConf::readResolvConf()
cNameserversFound++;
}
- if ((!strncmp(buff, "domain", 6) || !strncmp(buff, "search", 6)))
+ if ( !strncmp(buff, "domain", 6)
+ || !strncmp(buff, "search", 6))
{
char *tok;
char *saveptr;
diff --git a/src/VBox/Main/src-server/HostImpl.cpp b/src/VBox/Main/src-server/HostImpl.cpp
index b4fffb5..bb94c24 100644
--- a/src/VBox/Main/src-server/HostImpl.cpp
+++ b/src/VBox/Main/src-server/HostImpl.cpp
@@ -227,7 +227,7 @@ struct Host::Data
HostPowerService *pHostPowerService;
/** Host's DNS informaton fetching */
- HostDnsMonitorProxy hostDnsMonitorProxy;
+ HostDnsMonitorProxy hostDnsMonitorProxy;
};
////////////////////////////////////////////////////////////////////////////////
@@ -832,7 +832,7 @@ STDMETHODIMP Host::COMGETTER(NameServers)(ComSafeArrayOut(BSTR, aNameServers))
AutoReadLock alock(this COMMA_LOCKVAL_SRC_POS);
- return m->hostDnsMonitorProxy.COMGETTER(NameServers)(ComSafeArrayOutArg(aNameServers));
+ return m->hostDnsMonitorProxy.GetNameServers(ComSafeArrayOutArg(aNameServers));
}
@@ -847,7 +847,7 @@ STDMETHODIMP Host::COMGETTER(DomainName)(BSTR *aDomainName)
AutoCaller autoCaller(this);
if (FAILED(autoCaller.rc())) return autoCaller.rc();
- return m->hostDnsMonitorProxy.COMGETTER(DomainName)(aDomainName);
+ return m->hostDnsMonitorProxy.GetDomainName(aDomainName);
}
@@ -863,7 +863,7 @@ STDMETHODIMP Host::COMGETTER(SearchStrings)(ComSafeArrayOut(BSTR, aSearchStrings
AutoReadLock alock(this COMMA_LOCKVAL_SRC_POS);
- return m->hostDnsMonitorProxy.COMGETTER(SearchStrings)(ComSafeArrayOutArg(aSearchStrings));
+ return m->hostDnsMonitorProxy.GetSearchStrings(ComSafeArrayOutArg(aSearchStrings));
}
diff --git a/src/VBox/Main/src-server/HostNetworkInterfaceImpl.cpp b/src/VBox/Main/src-server/HostNetworkInterfaceImpl.cpp
index fab3e4d..58c5fd3 100644
--- a/src/VBox/Main/src-server/HostNetworkInterfaceImpl.cpp
+++ b/src/VBox/Main/src-server/HostNetworkInterfaceImpl.cpp
@@ -71,7 +71,7 @@ HRESULT HostNetworkInterface::init(Bstr aInterfaceName, Bstr aShortName, Guid aG
aInterfaceName.raw(), aGuid.toString().c_str()));
ComAssertRet(!aInterfaceName.isEmpty(), E_INVALIDARG);
- ComAssertRet(!aGuid.isValid(), E_INVALIDARG);
+ ComAssertRet(aGuid.isValid(), E_INVALIDARG);
/* Enclose the state transition NotReady->InInit->Ready */
AutoInitSpan autoInitSpan(this);
diff --git a/src/VBox/Main/src-server/MachineImpl.cpp b/src/VBox/Main/src-server/MachineImpl.cpp
index b2daca4..995c423 100644
--- a/src/VBox/Main/src-server/MachineImpl.cpp
+++ b/src/VBox/Main/src-server/MachineImpl.cpp
@@ -5690,7 +5690,7 @@ HRESULT Machine::deleteTaskWorker(DeleteTask &task)
if (FAILED(rc)) throw rc;
rc = task.pProgress->WaitForAsyncProgressCompletion(pProgress2);
if (FAILED(rc)) throw rc;
- /* Check the result of the asynchrony process. */
+ /* Check the result of the asynchronous process. */
LONG iRc;
rc = pProgress2->COMGETTER(ResultCode)(&iRc);
if (FAILED(rc)) throw rc;
@@ -5698,6 +5698,15 @@ HRESULT Machine::deleteTaskWorker(DeleteTask &task)
* retrieve the error info from there, or it'll be lost. */
if (FAILED(iRc))
throw setError(ProgressErrorInfo(pProgress2));
+
+ /* Close the medium, deliberately without checking the return
+ * code, and without leaving any trace in the error info, as
+ * a failure here is a very minor issue, which shouldn't happen
+ * as above we even managed to delete the medium. */
+ {
+ ErrorInfoKeeper eik;
+ pMedium->Close();
+ }
}
setMachineState(oldState);
alock.acquire();
@@ -8187,6 +8196,8 @@ HRESULT Machine::launchVMProcess(IInternalSessionControl *aControl,
{
/* restore the session state */
mData->mSession.mState = SessionState_Unlocked;
+ alock.release();
+ mParent->addProcessToReap(pid);
/* The failure may occur w/o any error info (from RPC), so provide one */
return setError(VBOX_E_VM_ERROR,
tr("Failed to assign the machine to the session (%Rhrc)"), rc);
@@ -8200,6 +8211,9 @@ HRESULT Machine::launchVMProcess(IInternalSessionControl *aControl,
mData->mSession.mState = SessionState_Spawning;
mData->mSession.mType = strFrontend;
+ alock.release();
+ mParent->addProcessToReap(pid);
+
LogFlowThisFuncLeave();
return S_OK;
}
@@ -8270,7 +8284,6 @@ bool Machine::isSessionSpawning()
return false;
}
-#ifndef VBOX_WITH_GENERIC_SESSION_WATCHER
/**
* Called from the client watcher thread to check for unexpected client process
* death during Session_Spawning state (e.g. before it successfully opened a
@@ -8364,7 +8377,6 @@ bool Machine::checkForSpawnFailure()
return false;
}
-#endif /* !VBOX_WITH_GENERIC_SESSION_WATCHER */
/**
* Checks whether the machine can be registered. If so, commits and saves
@@ -12960,8 +12972,8 @@ void SessionMachine::uninit(Uninit::Reason aReason)
#endif /* VBOX_WITH_USB */
// we need to lock this object in uninit() because the lock is shared
- // with mPeer (as well as data we modify below). mParent->addProcessToReap()
- // and others need mParent lock, and USB needs host lock.
+ // with mPeer (as well as data we modify below). mParent lock is needed
+ // by several calls to it, and USB needs host lock.
AutoMultiWriteLock3 multilock(mParent, mParent->host(), this COMMA_LOCKVAL_SRC_POS);
#ifdef VBOX_WITH_RESOURCE_USAGE_API
@@ -13022,16 +13034,6 @@ void SessionMachine::uninit(Uninit::Reason aReason)
releaseSavedStateFile(strStateFile, NULL /* pSnapshotToIgnore */ );
}
- if (!mData->mSession.mType.isEmpty())
- {
- /* mType is not null when this machine's process has been started by
- * Machine::LaunchVMProcess(), therefore it is our child. We
- * need to queue the PID to reap the process (and avoid zombies on
- * Linux). */
- Assert(mData->mSession.mPID != NIL_RTPROCESS);
- mParent->addProcessToReap(mData->mSession.mPID);
- }
-
mData->mSession.mPID = NIL_RTPROCESS;
if (aReason == Uninit::Unexpected)
diff --git a/src/VBox/Main/src-server/NATNetworkImpl.cpp b/src/VBox/Main/src-server/NATNetworkImpl.cpp
index 3dd43cf..ce32d6b 100644
--- a/src/VBox/Main/src-server/NATNetworkImpl.cpp
+++ b/src/VBox/Main/src-server/NATNetworkImpl.cpp
@@ -15,6 +15,7 @@
* hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
*/
+#include <string>
#include "NetworkServiceRunner.h"
#include "DHCPServerImpl.h"
#include "NATNetworkImpl.h"
@@ -49,10 +50,10 @@
struct NATNetwork::Data
{
Data()
- : fEnabled(FALSE)
+ : fEnabled(TRUE)
, fIPv6Enabled(FALSE)
, fAdvertiseDefaultIPv6Route(FALSE)
- , fNeedDhcpServer(FALSE)
+ , fNeedDhcpServer(TRUE)
, u32LoopbackIp6(0)
, offGateway(0)
, offDhcp(0)
@@ -142,7 +143,6 @@ HRESULT NATNetwork::init(VirtualBox *aVirtualBox, IN_BSTR aName)
m->offGateway = 1;
m->IPv4NetworkCidr = "10.0.2.0/24";
m->IPv6Prefix = "fe80::/64";
- m->fEnabled = FALSE;
settings::NATHostLoopbackOffset off;
off.strLoopbackHostAddress = "127.0.0.1";
@@ -302,13 +302,13 @@ STDMETHODIMP NATNetwork::COMSETTER(NetworkName)(IN_BSTR aName)
{
CheckComArgOutPointerValid(aName);
AutoCaller autoCaller(this);
-
- if (FAILED(autoCaller.rc()))
+
+ if (FAILED(autoCaller.rc()))
return autoCaller.rc();
-
+
{
AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS);
-
+
if (aName == mName)
return S_OK;
@@ -340,12 +340,12 @@ STDMETHODIMP NATNetwork::COMGETTER(Enabled)(BOOL *aEnabled)
STDMETHODIMP NATNetwork::COMSETTER(Enabled)(BOOL aEnabled)
{
AutoCaller autoCaller(this);
- if (FAILED(autoCaller.rc()))
+ if (FAILED(autoCaller.rc()))
return autoCaller.rc();
-
+
{
AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS);
-
+
if (aEnabled == m->fEnabled)
return S_OK;
@@ -391,15 +391,15 @@ STDMETHODIMP NATNetwork::COMSETTER(Network)(IN_BSTR aIPv4NetworkCidr)
AutoCaller autoCaller(this);
if (FAILED(autoCaller.rc()))
return autoCaller.rc();
-
+
{
AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS);
-
+
if (aIPv4NetworkCidr == m->IPv4NetworkCidr)
return S_OK;
-
- /* silently ignore network cidr update for now.
- * todo: keep internally guest address of port forward rule
+
+ /* silently ignore network cidr update for now.
+ * todo: keep internally guest address of port forward rule
* as offset from network id.
*/
if (!m->mapName2PortForwardRule4.empty())
@@ -433,9 +433,9 @@ STDMETHODIMP NATNetwork::COMGETTER(IPv6Enabled)(BOOL *aIPv6Enabled)
STDMETHODIMP NATNetwork::COMSETTER(IPv6Enabled)(BOOL aIPv6Enabled)
{
AutoCaller autoCaller(this);
- if (FAILED(autoCaller.rc()))
+ if (FAILED(autoCaller.rc()))
return autoCaller.rc();
-
+
{
AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS);
@@ -472,7 +472,7 @@ STDMETHODIMP NATNetwork::COMSETTER(IPv6Prefix) (IN_BSTR aIPv6Prefix)
CheckComArgOutPointerValid(aIPv6Prefix);
AutoCaller autoCaller(this);
- if (FAILED(autoCaller.rc()))
+ if (FAILED(autoCaller.rc()))
return autoCaller.rc();
{
@@ -481,7 +481,7 @@ STDMETHODIMP NATNetwork::COMSETTER(IPv6Prefix) (IN_BSTR aIPv6Prefix)
if (aIPv6Prefix == m->IPv6Prefix)
return S_OK;
- /* silently ignore network IPv6 prefix update.
+ /* silently ignore network IPv6 prefix update.
* todo: see similar todo in NATNetwork::COMSETTER(Network)(IN_BSTR)
*/
if (!m->mapName2PortForwardRule6.empty())
@@ -514,12 +514,12 @@ STDMETHODIMP NATNetwork::COMGETTER(AdvertiseDefaultIPv6RouteEnabled)(BOOL *aAdve
STDMETHODIMP NATNetwork::COMSETTER(AdvertiseDefaultIPv6RouteEnabled)(BOOL aAdvertiseDefaultIPv6Route)
{
AutoCaller autoCaller(this);
- if (FAILED(autoCaller.rc()))
+ if (FAILED(autoCaller.rc()))
return autoCaller.rc();
-
+
{
AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS);
-
+
if (aAdvertiseDefaultIPv6Route == m->fAdvertiseDefaultIPv6Route)
return S_OK;
@@ -553,10 +553,10 @@ STDMETHODIMP NATNetwork::COMSETTER(NeedDhcpServer)(BOOL aNeedDhcpServer)
AutoCaller autoCaller(this);
if (FAILED(autoCaller.rc()))
return autoCaller.rc();
-
+
{
AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS);
-
+
if (aNeedDhcpServer == m->fNeedDhcpServer)
return S_OK;
@@ -684,9 +684,9 @@ STDMETHODIMP NATNetwork::COMGETTER(LoopbackIp6)(LONG *aLoopbackIp6)
STDMETHODIMP NATNetwork::COMSETTER(LoopbackIp6)(LONG aLoopbackIp6)
{
AutoCaller autoCaller(this);
- if (FAILED(autoCaller.rc()))
+ if (FAILED(autoCaller.rc()))
return autoCaller.rc();
-
+
{
AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS);
@@ -695,7 +695,7 @@ STDMETHODIMP NATNetwork::COMSETTER(LoopbackIp6)(LONG aLoopbackIp6)
if (static_cast<uint32_t>(aLoopbackIp6) == m->u32LoopbackIp6)
return S_OK;
-
+
m->u32LoopbackIp6 = aLoopbackIp6;
}
@@ -740,7 +740,7 @@ STDMETHODIMP NATNetwork::AddPortForwardRule(BOOL aIsIpv6,
USHORT aGuestPort)
{
AutoCaller autoCaller(this);
- if (FAILED(autoCaller.rc()))
+ if (FAILED(autoCaller.rc()))
return autoCaller.rc();
{
@@ -812,7 +812,7 @@ STDMETHODIMP NATNetwork::AddPortForwardRule(BOOL aIsIpv6,
STDMETHODIMP NATNetwork::RemovePortForwardRule(BOOL aIsIpv6, IN_BSTR aPortForwardRuleName)
{
AutoCaller autoCaller(this);
- if (FAILED(autoCaller.rc()))
+ if (FAILED(autoCaller.rc()))
return autoCaller.rc();
Utf8Str strHostIP;
@@ -824,9 +824,9 @@ STDMETHODIMP NATNetwork::RemovePortForwardRule(BOOL aIsIpv6, IN_BSTR aPortForwar
{
AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS);
- NATRuleMap& mapRules = aIsIpv6 ? m->mapName2PortForwardRule6
+ NATRuleMap& mapRules = aIsIpv6 ? m->mapName2PortForwardRule6
: m->mapName2PortForwardRule4;
-
+
NATRuleMap::iterator it = mapRules.find(aPortForwardRuleName);
if (it == mapRules.end())
@@ -840,7 +840,7 @@ STDMETHODIMP NATNetwork::RemovePortForwardRule(BOOL aIsIpv6, IN_BSTR aPortForwar
mapRules.erase(it);
}
-
+
{
AutoWriteLock vboxLock(mVirtualBox COMMA_LOCKVAL_SRC_POS);
HRESULT rc = mVirtualBox->saveSettings();
@@ -869,10 +869,11 @@ STDMETHODIMP NATNetwork::Start(IN_BSTR aTrunkType)
if (!m->fEnabled) return S_OK;
- m->NATRunner.setOption(NETCFG_NETNAME, mName, true);
- m->NATRunner.setOption(NETCFG_TRUNKTYPE, Utf8Str(aTrunkType), true);
- m->NATRunner.setOption(NETCFG_IPADDRESS, m->IPv4Gateway, true);
- m->NATRunner.setOption(NETCFG_NETMASK, m->IPv4NetworkMask, true);
+ m->NATRunner.setOption(NetworkServiceRunner::kNsrKeyNeedMain, "on");
+ m->NATRunner.setOption(NetworkServiceRunner::kNsrKeyNetwork, Utf8Str(mName).c_str());
+ m->NATRunner.setOption(NetworkServiceRunner::kNsrKeyTrunkType, Utf8Str(aTrunkType).c_str());
+ m->NATRunner.setOption(NetworkServiceRunner::kNsrIpAddress, Utf8Str(m->IPv4Gateway).c_str());
+ m->NATRunner.setOption(NetworkServiceRunner::kNsrIpNetmask, Utf8Str(m->IPv4NetworkMask).c_str());
/* No portforwarding rules from command-line, all will be fetched via API */
@@ -911,8 +912,6 @@ STDMETHODIMP NATNetwork::Start(IN_BSTR aTrunkType)
Utf8Str(m->IPv4DhcpServerLowerIp.raw()).c_str(),
Utf8Str(m->IPv4DhcpServerUpperIp.raw()).c_str()));
- m->dhcpServer->AddGlobalOption(DhcpOpt_Router, m->IPv4Gateway.raw());
-
rc = m->dhcpServer->COMSETTER(Enabled)(true);
BSTR dhcpip = NULL;
@@ -936,6 +935,9 @@ STDMETHODIMP NATNetwork::Start(IN_BSTR aTrunkType)
return E_FAIL;
}
+ /* XXX: AddGlobalOption(DhcpOpt_Router,) - enables attachement of DhcpServer to Main. */
+ m->dhcpServer->AddGlobalOption(DhcpOpt_Router, m->IPv4Gateway.raw());
+
rc = m->dhcpServer->Start(mName.raw(), Bstr("").raw(), aTrunkType);
if (FAILED(rc))
{
diff --git a/src/VBox/Main/src-server/NetworkAdapterImpl.cpp b/src/VBox/Main/src-server/NetworkAdapterImpl.cpp
index 13a9e80..e3908bb 100644
--- a/src/VBox/Main/src-server/NetworkAdapterImpl.cpp
+++ b/src/VBox/Main/src-server/NetworkAdapterImpl.cpp
@@ -1566,15 +1566,13 @@ void NetworkAdapter::updateBandwidthGroup(BandwidthGroup *aBwGroup)
HRESULT NetworkAdapter::checkAndSwitchFromNatNetworking(IN_BSTR networkName)
{
- HRESULT hrc;
MachineState_T state;
- hrc = mParent->COMGETTER(State)(&state);
+ HRESULT hrc = mParent->COMGETTER(State)(&state);
if (FAILED(hrc))
return hrc;
- if ( mData->mAttachmentType == NetworkAttachmentType_NATNetwork
- && state == MachineState_Running)
+ if (state == MachineState_Running)
{
Bstr bstrName;
hrc = mParent->COMGETTER(Name)(bstrName.asOutParam());
@@ -1590,10 +1588,9 @@ HRESULT NetworkAdapter::checkAndSwitchFromNatNetworking(IN_BSTR networkName)
HRESULT NetworkAdapter::switchToNatNetworking(IN_BSTR aNatNetworkName)
{
- HRESULT hrc;
MachineState_T state;
- hrc = mParent->COMGETTER(State)(&state);
+ HRESULT hrc = mParent->COMGETTER(State)(&state);
if (FAILED(hrc))
return hrc;
diff --git a/src/VBox/Main/src-server/NetworkServiceRunner.cpp b/src/VBox/Main/src-server/NetworkServiceRunner.cpp
index e0fb4ba..6a3f6e7 100644
--- a/src/VBox/Main/src-server/NetworkServiceRunner.cpp
+++ b/src/VBox/Main/src-server/NetworkServiceRunner.cpp
@@ -14,49 +14,68 @@
* VirtualBox OSE distribution. VirtualBox OSE is distributed in the
* hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
*/
+
+#include <map>
+#include <string>
#include "NetworkServiceRunner.h"
#include <iprt/process.h>
#include <iprt/param.h>
#include <iprt/env.h>
-struct ARGDEF
+
+const std::string NetworkServiceRunner::kNsrKeyName = "--name";
+const std::string NetworkServiceRunner::kNsrKeyNetwork = "--network";
+const std::string NetworkServiceRunner::kNsrKeyTrunkType = "--trunk-type";
+const std::string NetworkServiceRunner::kNsrTrunkName = "--trunk-name";
+const std::string NetworkServiceRunner::kNsrMacAddress = "--mac-address";
+const std::string NetworkServiceRunner::kNsrIpAddress = "--ip-address";
+const std::string NetworkServiceRunner::kNsrIpNetmask = "--netmask";
+const std::string NetworkServiceRunner::kNsrKeyNeedMain = "--need-main";
+
+struct NetworkServiceRunner::Data
{
- NETCFG Type;
- const char * Name;
+ Data(const char* aProcName):mProcName(aProcName), mProcess(NIL_RTPROCESS){}
+ const char *mProcName;
+ RTPROCESS mProcess;
+ std::map<std::string, std::string> mOptions;
};
-static const ARGDEF g_aArgDefs[] =
+NetworkServiceRunner::NetworkServiceRunner(const char *aProcName)
{
- {NETCFG_NAME, "--name"},
- {NETCFG_NETNAME, "--network"},
- {NETCFG_TRUNKTYPE, "--trunk-type"},
- {NETCFG_TRUNKNAME, "--trunk-name"},
- {NETCFG_MACADDRESS, "--mac-address"},
- {NETCFG_IPADDRESS, "--ip-address"},
- {NETCFG_VERBOSE, "--verbose"},
- {NETCFG_NETMASK, "--netmask"},
-};
+ m = new NetworkServiceRunner::Data(aProcName);
+
+}
+
-static const ARGDEF * getArgDef(NETCFG type)
+NetworkServiceRunner::~NetworkServiceRunner()
{
- for (unsigned i = 0; i < RT_ELEMENTS(g_aArgDefs); i++)
- if (g_aArgDefs[i].Type == type)
- return &g_aArgDefs[i];
+ stop();
+ delete m;
+ m = NULL;
+}
- return NULL;
+
+int NetworkServiceRunner::setOption(const std::string& key, const std::string& val)
+{
+ m->mOptions.insert(std::map<std::string, std::string>::value_type(key, val));
+ return VINF_SUCCESS;
}
+
void NetworkServiceRunner::detachFromServer()
{
- mProcess = NIL_RTPROCESS;
+ m->mProcess = NIL_RTPROCESS;
}
+
int NetworkServiceRunner::start()
{
if (isRunning())
return VINF_ALREADY_INITIALIZED;
- const char * args[NETCFG_NOTOPT_MAXVAL * 2];
+ const char * args[10*2];
+
+ AssertReturn(m->mOptions.size() < 10, VERR_INTERNAL_ERROR);
/* get the path to the executable */
char exePathBuf[RTPATH_MAX];
@@ -68,58 +87,52 @@ int NetworkServiceRunner::start()
if (suffix)
{
suffix++;
- strcpy(suffix, mProcName);
+ strcpy(suffix, m->mProcName);
}
int index = 0;
args[index++] = exePath;
- for (unsigned i = 0; i < NETCFG_NOTOPT_MAXVAL; i++)
+ std::map<std::string, std::string>::const_iterator it;
+ for(it = m->mOptions.begin(); it != m->mOptions.end(); ++it)
{
- if (mOptionEnabled[i])
- {
- const ARGDEF *pArgDef = getArgDef((NETCFG)i);
- if (!pArgDef)
- continue;
- args[index++] = pArgDef->Name;
-
- if (mOptions[i].length())
- args[index++] = mOptions[i].c_str(); // value
- }
+ args[index++] = it->first.c_str();
+ args[index++] = it->second.c_str();
}
args[index++] = NULL;
- int rc = RTProcCreate(suffix ? exePath : mProcName, args, RTENV_DEFAULT, 0, &mProcess);
+ int rc = RTProcCreate(suffix ? exePath : m->mProcName, args, RTENV_DEFAULT, 0, &m->mProcess);
if (RT_FAILURE(rc))
- mProcess = NIL_RTPROCESS;
+ m->mProcess = NIL_RTPROCESS;
return rc;
}
+
int NetworkServiceRunner::stop()
{
if (!isRunning())
return VINF_OBJECT_DESTROYED;
- int rc = RTProcTerminate(mProcess);
- RTProcWait(mProcess, RTPROCWAIT_FLAGS_BLOCK, NULL);
- mProcess = NIL_RTPROCESS;
+ int rc = RTProcTerminate(m->mProcess);
+ RTProcWait(m->mProcess, RTPROCWAIT_FLAGS_BLOCK, NULL);
+ m->mProcess = NIL_RTPROCESS;
return rc;
}
bool NetworkServiceRunner::isRunning()
{
- if (mProcess == NIL_RTPROCESS)
+ if (m->mProcess == NIL_RTPROCESS)
return false;
RTPROCSTATUS status;
- int rc = RTProcWait(mProcess, RTPROCWAIT_FLAGS_NOBLOCK, &status);
+ int rc = RTProcWait(m->mProcess, RTPROCWAIT_FLAGS_NOBLOCK, &status);
if (rc == VERR_PROCESS_RUNNING)
return true;
- mProcess = NIL_RTPROCESS;
+ m->mProcess = NIL_RTPROCESS;
return false;
}
diff --git a/src/VBox/Main/src-server/SnapshotImpl.cpp b/src/VBox/Main/src-server/SnapshotImpl.cpp
index e507678..411cdd5 100644
--- a/src/VBox/Main/src-server/SnapshotImpl.cpp
+++ b/src/VBox/Main/src-server/SnapshotImpl.cpp
@@ -2168,6 +2168,11 @@ STDMETHODIMP SessionMachine::DeleteSnapshot(IConsole *aInitiator,
pSnapshot->getName().c_str(),
mUserData->s.strName.c_str(),
childrenCount);
+ if (pSnapshot == mData->mCurrentSnapshot && childrenCount >= 1)
+ return setError(VBOX_E_INVALID_OBJECT_STATE,
+ tr("Snapshot '%s' of the machine '%s' cannot be deleted, because it is the current snapshot and has one child snapshot"),
+ pSnapshot->getName().c_str(),
+ mUserData->s.strName.c_str());
/* If the snapshot being deleted is the current one, ensure current
* settings are committed and saved.
diff --git a/src/VBox/Main/src-server/freebsd/NetIf-freebsd.cpp b/src/VBox/Main/src-server/freebsd/NetIf-freebsd.cpp
index bbe99eb..049aaaf 100644
--- a/src/VBox/Main/src-server/freebsd/NetIf-freebsd.cpp
+++ b/src/VBox/Main/src-server/freebsd/NetIf-freebsd.cpp
@@ -43,6 +43,7 @@
#include <net/if_dl.h>
#include <netinet/in.h>
+#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <errno.h>
@@ -388,7 +389,7 @@ int NetIfGetConfigByName(PNETIFINFO pInfo)
pInfo->Uuid = uuid;
struct ifreq IfReq;
- RTSTrCopy(IfReq.ifr_name, sizeof(IfReq.ifr_name), pInfo->szShortName);
+ RTStrCopy(IfReq.ifr_name, sizeof(IfReq.ifr_name), pInfo->szShortName);
if (ioctl(sock, SIOCGIFFLAGS, &IfReq) < 0)
{
Log(("NetIfList: ioctl(SIOCGIFFLAGS) -> %d\n", errno));
diff --git a/src/VBox/Main/src-server/freebsd/PerformanceFreeBSD.cpp b/src/VBox/Main/src-server/freebsd/PerformanceFreeBSD.cpp
index 54a992f..6770c75 100644
--- a/src/VBox/Main/src-server/freebsd/PerformanceFreeBSD.cpp
+++ b/src/VBox/Main/src-server/freebsd/PerformanceFreeBSD.cpp
@@ -109,5 +109,10 @@ int CollectorFreeBSD::getProcessMemoryUsage(RTPROCESS process, ULONG *used)
return VERR_NOT_IMPLEMENTED;
}
+int getDiskListByFs(const char *name, DiskList& list)
+{
+ return VERR_NOT_IMPLEMENTED;
+}
+
} /* namespace pm */
diff --git a/src/VBox/Main/src-server/linux/HostDnsServiceLinux.cpp b/src/VBox/Main/src-server/linux/HostDnsServiceLinux.cpp
index 05107b2..6de507e 100644
--- a/src/VBox/Main/src-server/linux/HostDnsServiceLinux.cpp
+++ b/src/VBox/Main/src-server/linux/HostDnsServiceLinux.cpp
@@ -166,11 +166,11 @@ HRESULT HostDnsServiceLinux::init(const char *aResolvConfFileName)
HRESULT hrc = HostDnsServiceResolvConf::init(aResolvConfFileName);
AssertComRCReturnRC(hrc);
- int rc = RTThreadCreate(&g_DnsMonitoringThread, HostDnsServiceLinux::hostMonitoringRoutine,
- this, 128 * _1K, RTTHREADTYPE_IO, 0, "dns-monitor");
+ int rc = RTSemEventCreate(&g_DnsInitEvent);
AssertRCReturn(rc, E_FAIL);
- rc = RTSemEventCreate(&g_DnsInitEvent);
+ rc = RTThreadCreate(&g_DnsMonitoringThread, HostDnsServiceLinux::hostMonitoringRoutine,
+ this, 128 * _1K, RTTHREADTYPE_IO, 0, "dns-monitor");
AssertRCReturn(rc, E_FAIL);
RTSemEventWait(g_DnsInitEvent, RT_INDEFINITE_WAIT);
diff --git a/src/VBox/Main/src-server/win/HostDnsServiceWin.cpp b/src/VBox/Main/src-server/win/HostDnsServiceWin.cpp
index 5ee5081..ae07ad6 100644
--- a/src/VBox/Main/src-server/win/HostDnsServiceWin.cpp
+++ b/src/VBox/Main/src-server/win/HostDnsServiceWin.cpp
@@ -49,13 +49,17 @@ HRESULT HostDnsServiceWin::updateInfo()
BYTE abNameServers[256];
BYTE abSearchList[256];
+ RT_ZERO(abDomain);
+ RT_ZERO(abNameServers);
+ RT_ZERO(abSearchList);
+
regIndex = 0;
do {
CHAR keyName[256];
- DWORD cbKeyName = 256;
+ DWORD cbKeyName = sizeof(keyName);
DWORD keyType = 0;
BYTE keyData[1024];
- DWORD cbKeyData = 1024;
+ DWORD cbKeyData = sizeof(keyData);
hrc = RegEnumValueA(g_hKeyTcpipParameters, regIndex, keyName, &cbKeyName, 0,
&keyType, keyData, &cbKeyData);
@@ -64,29 +68,29 @@ HRESULT HostDnsServiceWin::updateInfo()
{
if ( RTStrICmp("Domain", keyName) == 0
&& cbKeyData > 1
- && cbKeyData < 256)
+ && cbKeyData < sizeof(abDomain))
memcpy(abDomain, keyData, cbKeyData);
else if ( RTStrICmp("DhcpDomain", keyName) == 0
&& cbKeyData > 1
&& abDomain[0] == 0
- && cbKeyData < 256)
+ && cbKeyData < sizeof(abDomain))
memcpy(abDomain, keyData, cbKeyData);
else if ( RTStrICmp("NameServer", keyName) == 0
&& cbKeyData > 1
- && cbKeyData < 256)
+ && cbKeyData < sizeof(abNameServers))
memcpy(abNameServers, keyData, cbKeyData);
else if ( RTStrICmp("DhcpNameServer", keyName) == 0
&& cbKeyData > 1
&& abNameServers[0] == 0
- && cbKeyData < 256)
+ && cbKeyData < sizeof(abNameServers))
memcpy(abNameServers, keyData, cbKeyData);
else if ( RTStrICmp("SearchList", keyName) == 0
&& cbKeyData > 1
- && cbKeyData < 256)
+ && cbKeyData < sizeof(abSearchList))
memcpy(abSearchList, keyData, cbKeyData);
}
regIndex++;
@@ -125,7 +129,7 @@ void HostDnsServiceWin::strList2List(std::vector<std::string>& lst, char *strLst
next = RTStrStr(current, " ");
if (next)
- strncpy(address, current, next - current);
+ strncpy(address, current, RT_MIN(sizeof(address)-1, next - current));
else
strcpy(address, current);
diff --git a/src/VBox/Main/xml/Settings.cpp b/src/VBox/Main/xml/Settings.cpp
index af4ee71..88cd197 100644
--- a/src/VBox/Main/xml/Settings.cpp
+++ b/src/VBox/Main/xml/Settings.cpp
@@ -3680,11 +3680,14 @@ void MachineConfigFile::readGroups(const xml::ElementNode *pElmGroups, StringsLi
* contain a list of child snapshots; such lists are maintained in the
* Snapshot structure.
*
+ * @param curSnapshotUuid
* @param depth
* @param elmSnapshot
* @param snap
+ * @returns true if curSnapshotUuid is in this snapshot subtree, otherwise false
*/
-void MachineConfigFile::readSnapshot(uint32_t depth,
+bool MachineConfigFile::readSnapshot(const Guid &curSnapshotUuid,
+ uint32_t depth,
const xml::ElementNode &elmSnapshot,
Snapshot &snap)
{
@@ -3696,6 +3699,7 @@ void MachineConfigFile::readSnapshot(uint32_t depth,
if (!elmSnapshot.getAttributeValue("uuid", strTemp))
throw ConfigFileError(this, &elmSnapshot, N_("Required Snapshot/@uuid attribute is missing"));
parseUUID(snap.uuid, strTemp);
+ bool foundCurrentSnapshot = (snap.uuid == curSnapshotUuid);
if (!elmSnapshot.getAttributeValue("name", snap.strName))
throw ConfigFileError(this, &elmSnapshot, N_("Required Snapshot/@name attribute is missing"));
@@ -3740,7 +3744,8 @@ void MachineConfigFile::readSnapshot(uint32_t depth,
// deeply nested snapshots. The stack can be quite
// small, especially with XPCOM.
Snapshot *child = new Snapshot();
- readSnapshot(depth + 1, *pelmChildSnapshot, *child);
+ bool found = readSnapshot(curSnapshotUuid, depth + 1, *pelmChildSnapshot, *child);
+ foundCurrentSnapshot = foundCurrentSnapshot || found;
snap.llChildSnapshots.push_back(*child);
delete child;
}
@@ -3756,6 +3761,8 @@ void MachineConfigFile::readSnapshot(uint32_t depth,
readDebugging(elmSnapshot.findChildElement("Debugging"), &snap.debugging);
readAutostart(elmSnapshot.findChildElement("Autostart"), &snap.autostart);
// note: Groups exist only for Machine, not for Snapshot
+
+ return foundCurrentSnapshot;
}
const struct {
@@ -3876,9 +3883,14 @@ void MachineConfigFile::readMachine(const xml::ElementNode &elmMachine)
readStorageControllers(*pelmMachineChild, storageMachine);
else if (pelmMachineChild->nameEquals("Snapshot"))
{
+ if (uuidCurrentSnapshot.isZero())
+ throw ConfigFileError(this, &elmMachine, N_("Snapshots present but required Machine/@currentSnapshot attribute is missing"));
+ bool foundCurrentSnapshot = false;
Snapshot snap;
// this will recurse into child snapshots, if necessary
- readSnapshot(1, *pelmMachineChild, snap);
+ foundCurrentSnapshot = readSnapshot(uuidCurrentSnapshot, 1, *pelmMachineChild, snap);
+ if (!foundCurrentSnapshot)
+ throw ConfigFileError(this, &elmMachine, N_("Snapshots present but none matches the UUID in the Machine/@currentSnapshot attribute"));
llFirstSnapshot.push_back(snap);
}
else if (pelmMachineChild->nameEquals("Description"))
diff --git a/src/VBox/NetworkServices/DHCP/Config.cpp b/src/VBox/NetworkServices/DHCP/Config.cpp
index 7abe341..8ebb528 100644
--- a/src/VBox/NetworkServices/DHCP/Config.cpp
+++ b/src/VBox/NetworkServices/DHCP/Config.cpp
@@ -691,6 +691,50 @@ ConfigurationManager::~ConfigurationManager() { if (m) delete m; }
/**
* Network manager
*/
+struct NetworkManager::Data
+{
+ Data()
+ {
+ RT_ZERO(BootPReplyMsg);
+ cbBooPReplyMsg = 0;
+
+ m_pSession = NIL_RTR0PTR;
+ m_pIfBuf = NULL;
+ m_OurAddress.u = 0;
+ m_OurNetmask.u = 0;
+ RT_ZERO(m_OurMac);
+ }
+
+ union {
+ RTNETBOOTP BootPHeader;
+ uint8_t au8Storage[1024];
+ } BootPReplyMsg;
+ int cbBooPReplyMsg;
+
+ /* XXX: artifacts should be hidden or removed from here. */
+ PSUPDRVSESSION m_pSession;
+ INTNETIFHANDLE m_hIf;
+ PINTNETBUF m_pIfBuf;
+
+ RTNETADDRIPV4 m_OurAddress;
+ RTNETADDRIPV4 m_OurNetmask;
+ RTMAC m_OurMac;
+};
+
+
+NetworkManager::NetworkManager():m(NULL)
+{
+ m = new NetworkManager::Data();
+}
+
+
+NetworkManager::~NetworkManager()
+{
+ delete m;
+ m = NULL;
+}
+
+
NetworkManager *NetworkManager::getNetworkManager()
{
if (!g_NetworkManager)
@@ -710,10 +754,10 @@ int NetworkManager::offer4Client(const Client& client, uint32_t u32Xid,
prepareReplyPacket4Client(client, u32Xid);
RTNETADDRIPV4 address = l.getAddress();
- BootPReplyMsg.BootPHeader.bp_yiaddr = address;
+ m->BootPReplyMsg.BootPHeader.bp_yiaddr = address;
/* Ubuntu ???*/
- BootPReplyMsg.BootPHeader.bp_ciaddr = address;
+ m->BootPReplyMsg.BootPHeader.bp_ciaddr = address;
/* options:
* - IP lease time
@@ -757,17 +801,17 @@ int NetworkManager::ack(const Client& client, uint32_t u32Xid,
Lease l = client.lease();
address = l.getAddress();
- BootPReplyMsg.BootPHeader.bp_ciaddr = address;
+ m->BootPReplyMsg.BootPHeader.bp_ciaddr = address;
/* rfc2131 4.3.1 is about DHCPDISCOVER and this value is equal to ciaddr from
* DHCPREQUEST or 0 ...
* XXX: Using addressHint is not correct way to initialize [cy]iaddress...
*/
- BootPReplyMsg.BootPHeader.bp_ciaddr = address;
- BootPReplyMsg.BootPHeader.bp_yiaddr = address;
+ m->BootPReplyMsg.BootPHeader.bp_ciaddr = address;
+ m->BootPReplyMsg.BootPHeader.bp_yiaddr = address;
- Assert(BootPReplyMsg.BootPHeader.bp_yiaddr.u);
+ Assert(m->BootPReplyMsg.BootPHeader.bp_yiaddr.u);
/* options:
* - IP address lease time (if DHCPREQUEST)
@@ -813,7 +857,7 @@ int NetworkManager::nak(const Client& client, uint32_t u32Xid)
/* this field filed in prepareReplyPacket4Session, and
* RFC 2131 require to have it zero fo NAK.
*/
- BootPReplyMsg.BootPHeader.bp_yiaddr.u = 0;
+ m->BootPReplyMsg.BootPHeader.bp_yiaddr.u = 0;
/* options:
* - message type (if DHCPREQUEST)
@@ -831,34 +875,87 @@ int NetworkManager::nak(const Client& client, uint32_t u32Xid)
}
+const RTNETADDRIPV4& NetworkManager::getOurAddress() const
+{
+ return m->m_OurAddress;
+}
+
+
+const RTNETADDRIPV4& NetworkManager::getOurNetmask() const
+{
+ return m->m_OurNetmask;
+}
+
+
+const RTMAC& NetworkManager::getOurMac() const
+{
+ return m->m_OurMac;
+}
+
+
+void NetworkManager::setOurAddress(const RTNETADDRIPV4& aAddress)
+{
+ m->m_OurAddress = aAddress;
+}
+
+
+void NetworkManager::setOurNetmask(const RTNETADDRIPV4& aNetmask)
+{
+ m->m_OurNetmask = aNetmask;
+}
+
+
+void NetworkManager::setOurMac(const RTMAC& aMac)
+{
+ m->m_OurMac = aMac;
+}
+
+
+void NetworkManager::setSession(PSUPDRVSESSION aSession)
+{
+ m->m_pSession = aSession;
+}
+
+
+void NetworkManager::setInterface(INTNETIFHANDLE aIf)
+{
+ m->m_hIf = aIf;
+}
+
+
+void NetworkManager::setRingBuffer(PINTNETBUF aBuf)
+{
+ m->m_pIfBuf = aBuf;
+}
+
/**
*
*/
int NetworkManager::prepareReplyPacket4Client(const Client& client, uint32_t u32Xid)
{
- memset(&BootPReplyMsg, 0, sizeof(BootPReplyMsg));
-
- BootPReplyMsg.BootPHeader.bp_op = RTNETBOOTP_OP_REPLY;
- BootPReplyMsg.BootPHeader.bp_htype = RTNET_ARP_ETHER;
- BootPReplyMsg.BootPHeader.bp_hlen = sizeof(RTMAC);
- BootPReplyMsg.BootPHeader.bp_hops = 0;
- BootPReplyMsg.BootPHeader.bp_xid = u32Xid;
- BootPReplyMsg.BootPHeader.bp_secs = 0;
+ RT_ZERO(m->BootPReplyMsg);
+
+ m->BootPReplyMsg.BootPHeader.bp_op = RTNETBOOTP_OP_REPLY;
+ m->BootPReplyMsg.BootPHeader.bp_htype = RTNET_ARP_ETHER;
+ m->BootPReplyMsg.BootPHeader.bp_hlen = sizeof(RTMAC);
+ m->BootPReplyMsg.BootPHeader.bp_hops = 0;
+ m->BootPReplyMsg.BootPHeader.bp_xid = u32Xid;
+ m->BootPReplyMsg.BootPHeader.bp_secs = 0;
/* XXX: bp_flags should be processed specially */
- BootPReplyMsg.BootPHeader.bp_flags = 0;
- BootPReplyMsg.BootPHeader.bp_ciaddr.u = 0;
- BootPReplyMsg.BootPHeader.bp_giaddr.u = 0;
+ m->BootPReplyMsg.BootPHeader.bp_flags = 0;
+ m->BootPReplyMsg.BootPHeader.bp_ciaddr.u = 0;
+ m->BootPReplyMsg.BootPHeader.bp_giaddr.u = 0;
- BootPReplyMsg.BootPHeader.bp_chaddr.Mac = client.getMacAddress();
+ m->BootPReplyMsg.BootPHeader.bp_chaddr.Mac = client.getMacAddress();
const Lease l = client.lease();
- BootPReplyMsg.BootPHeader.bp_yiaddr = l.getAddress();
- BootPReplyMsg.BootPHeader.bp_siaddr.u = 0;
+ m->BootPReplyMsg.BootPHeader.bp_yiaddr = l.getAddress();
+ m->BootPReplyMsg.BootPHeader.bp_siaddr.u = 0;
- BootPReplyMsg.BootPHeader.bp_vend.Dhcp.dhcp_cookie = RT_H2N_U32_C(RTNET_DHCP_COOKIE);
+ m->BootPReplyMsg.BootPHeader.bp_vend.Dhcp.dhcp_cookie = RT_H2N_U32_C(RTNET_DHCP_COOKIE);
- memset(&BootPReplyMsg.BootPHeader.bp_vend.Dhcp.dhcp_opts[0],
+ memset(&m->BootPReplyMsg.BootPHeader.bp_vend.Dhcp.dhcp_opts[0],
'\0',
RTNET_DHCP_OPT_SIZE);
@@ -873,11 +970,11 @@ int NetworkManager::doReply(const Client& client, const std::vector<RawOption>&
/*
Options....
*/
- VBoxNetDhcpWriteCursor Cursor(&BootPReplyMsg.BootPHeader, RTNET_DHCP_NORMAL_SIZE);
+ VBoxNetDhcpWriteCursor Cursor(&m->BootPReplyMsg.BootPHeader, RTNET_DHCP_NORMAL_SIZE);
/* The basics */
- Cursor.optIPv4Addr(RTNET_DHCP_OPT_SERVER_ID, m_OurAddress);
+ Cursor.optIPv4Addr(RTNET_DHCP_OPT_SERVER_ID, m->m_OurAddress);
const Lease l = client.lease();
const std::map<uint8_t, RawOption>& options = l.options();
@@ -921,14 +1018,14 @@ int NetworkManager::doReply(const Client& client, const std::vector<RawOption>&
}
else
#endif
- rc = VBoxNetUDPBroadcast(m_pSession,
- m_hIf,
- m_pIfBuf,
- m_OurAddress,
- &m_OurMac,
+ rc = VBoxNetUDPBroadcast(m->m_pSession,
+ m->m_hIf,
+ m->m_pIfBuf,
+ m->m_OurAddress,
+ &m->m_OurMac,
RTNETIPV4_PORT_BOOTPS, /* sender */
RTNETIPV4_PORT_BOOTPC,
- &BootPReplyMsg, RTNET_DHCP_NORMAL_SIZE);
+ &m->BootPReplyMsg, RTNET_DHCP_NORMAL_SIZE);
AssertRCReturn(rc,rc);
diff --git a/src/VBox/NetworkServices/DHCP/Config.h b/src/VBox/NetworkServices/DHCP/Config.h
index 302bd9f..51072b5 100644
--- a/src/VBox/NetworkServices/DHCP/Config.h
+++ b/src/VBox/NetworkServices/DHCP/Config.h
@@ -494,36 +494,30 @@ public:
int ack(const Client& lease, uint32_t u32Xid, uint8_t *pu8ReqList, int cReqList);
int nak(const Client& lease, uint32_t u32Xid);
- const RTNETADDRIPV4& getOurAddress(){ return m_OurAddress;}
- const RTNETADDRIPV4& getOurNetmask(){ return m_OurNetmask;}
- const RTMAC& getOurMac() {return m_OurMac;}
+ const RTNETADDRIPV4& getOurAddress() const;
+ const RTNETADDRIPV4& getOurNetmask() const;
+ const RTMAC& getOurMac() const;
- void setOurAddress(const RTNETADDRIPV4& aAddress){ m_OurAddress = aAddress;}
- void setOurNetmask(const RTNETADDRIPV4& aNetmask){ m_OurNetmask = aNetmask;}
- void setOurMac(const RTMAC& aMac) {m_OurMac = aMac;}
+ void setOurAddress(const RTNETADDRIPV4& aAddress);
+ void setOurNetmask(const RTNETADDRIPV4& aNetmask);
+ void setOurMac(const RTMAC& aMac);
- /* XXX: artifacts should be hidden or removed from here. */
- PSUPDRVSESSION m_pSession;
- INTNETIFHANDLE m_hIf;
- PINTNETBUF m_pIfBuf;
+ void setSession(PSUPDRVSESSION);
+ void setInterface(INTNETIFHANDLE);
+ void setRingBuffer(PINTNETBUF);
private:
- NetworkManager(){}
- virtual ~NetworkManager(){}
+ NetworkManager();
+ ~NetworkManager();
int prepareReplyPacket4Client(const Client& client, uint32_t u32Xid);
int doReply(const Client& client, const std::vector<RawOption>& extra);
int processParameterReqList(const Client& client, uint8_t *pu8ReqList, int cReqList);
- union {
- RTNETBOOTP BootPHeader;
- uint8_t au8Storage[1024];
- } BootPReplyMsg;
- int cbBooPReplyMsg;
+private:
+ struct Data;
+ Data *m;
- RTNETADDRIPV4 m_OurAddress;
- RTNETADDRIPV4 m_OurNetmask;
- RTMAC m_OurMac;
};
diff --git a/src/VBox/NetworkServices/DHCP/VBoxNetDHCP.cpp b/src/VBox/NetworkServices/DHCP/VBoxNetDHCP.cpp
index c0558e6..9802245 100644
--- a/src/VBox/NetworkServices/DHCP/VBoxNetDHCP.cpp
+++ b/src/VBox/NetworkServices/DHCP/VBoxNetDHCP.cpp
@@ -105,6 +105,10 @@ protected:
void debugPrintV(int32_t iMinLevel, bool fMsg, const char *pszFmt, va_list va) const;
static const char *debugDhcpName(uint8_t uMsgType);
+private:
+ int initNoMain();
+ int initWithMain();
+
protected:
/** @name The DHCP server specific configuration data members.
* @{ */
@@ -148,13 +152,6 @@ protected:
VBOXNETUDPHDRS m_CurHdrs;
/** @} */
};
-#if 0
-/* XXX: clean up it. */
-typedef std::vector<VBoxNetDhcpLease> DhcpLeaseContainer;
-typedef DhcpLeaseContainer::iterator DhcpLeaseIterator;
-typedef DhcpLeaseContainer::reverse_iterator DhcpLeaseRIterator;
-typedef DhcpLeaseContainer::const_iterator DhcpLeaseCIterator;
-#endif
/*******************************************************************************
* Global Variables *
@@ -163,7 +160,7 @@ typedef DhcpLeaseContainer::const_iterator DhcpLeaseCIterator;
static VBoxNetDhcp *g_pDhcp;
/* DHCP server specific options */
-static const RTGETOPTDEF g_aOptionDefs[] =
+static RTGETOPTDEF g_aOptionDefs[] =
{
{ "--lease-db", 'D', RTGETOPT_REQ_STRING },
{ "--begin-config", 'b', RTGETOPT_REQ_NOTHING },
@@ -172,75 +169,6 @@ static const RTGETOPTDEF g_aOptionDefs[] =
{ "--upper-ip", 'u', RTGETOPT_REQ_IPV4ADDR },
};
-#if 0
-/* XXX this will gone */
-/**
- * Offer this lease to a client.
- *
- * @param xid The transaction ID.
- */
-void VBoxNetDhcpLease::offer(uint32_t xid)
-{
- m_enmState = kState_Offer;
- m_xid = xid;
- RTTimeNow(&m_ExpireTime);
- RTTimeSpecAddSeconds(&m_ExpireTime, 60);
-}
-
-
-/**
- * Activate this lease (i.e. a client is now using it).
- */
-void VBoxNetDhcpLease::activate(void)
-{
- m_enmState = kState_Active;
- RTTimeNow(&m_ExpireTime);
- RTTimeSpecAddSeconds(&m_ExpireTime, m_pCfg ? m_pCfg->m_cSecLease : 60); /* m_pCfg can be NULL right now... */
-}
-
-
-/**
- * Activate this lease with a new transaction ID.
- *
- * @param xid The transaction ID.
- * @todo check if this is really necessary.
- */
-void VBoxNetDhcpLease::activate(uint32_t xid)
-{
- activate();
- m_xid = xid;
-}
-
-
-/**
- * Release a lease either upon client request or because it didn't quite match a
- * DHCP_REQUEST.
- */
-void VBoxNetDhcpLease::release(void)
-{
- m_enmState = kState_Free;
- RTTimeNow(&m_ExpireTime);
- RTTimeSpecAddSeconds(&m_ExpireTime, 5);
-}
-
-
-/**
- * Checks if the lease has expired or not.
- *
- * This just checks the expiration time not the state. This is so that this
- * method will work for reusing RELEASEd leases when the client comes back after
- * a reboot or ipconfig /renew. Callers not interested in info on released
- * leases should check the state first.
- *
- * @returns true if expired, false if not.
- */
-bool VBoxNetDhcpLease::hasExpired() const
-{
- RTTIMESPEC Now;
- return RTTimeSpecGetSeconds(&m_ExpireTime) > RTTimeSpecGetSeconds(RTTimeNow(&Now));
-}
-#endif
-
/**
* Construct a DHCP server with a default configuration.
*/
@@ -272,6 +200,9 @@ VBoxNetDhcp::VBoxNetDhcp()
m_fIgnoreCmdLineParameters = true;
+ for(unsigned int i = 0; i < RT_ELEMENTS(g_aOptionDefs); ++i)
+ m_vecOptionDefs.push_back(&g_aOptionDefs[i]);
+
#if 0 /* enable to hack the code without a mile long argument list. */
VBoxNetDhcpCfg *pDefCfg = new VBoxNetDhcpCfg();
pDefCfg->m_LowerAddr.u = RT_H2N_U32_C(RT_BSWAP_U32_C(RT_MAKE_U32_FROM_U8( 10, 0, 2,100)));
@@ -323,20 +254,19 @@ int VBoxNetDhcp::parseOpt(int rc, const RTGETOPTUNION& Val)
switch (rc)
{
- /* Begin config. */
- case 'b':
- CmdParameterll.push_back(prm);
- break;
-
case 'l':
case 'u':
- case 'm':
- case 'g':
- prm.strValue = std::string(Val.psz);
+ case 'g':
+ {
+ char buf[17];
+ RTStrPrintf(buf, 17, "%RTnaipv4", Val.IPv4Addr.u);
+ prm.strValue = buf;
CmdParameterll.push_back(prm);
- break;
+ }
+ break;
- case 'D':
+ case 'b': // ignore
+ case 'D': // ignore
break;
default:
@@ -345,235 +275,27 @@ int VBoxNetDhcp::parseOpt(int rc, const RTGETOPTUNION& Val)
return rc;
}
- return rc;
+ return VINF_SUCCESS;
}
int VBoxNetDhcp::init()
{
- HRESULT hrc = S_OK;
- /* ok, here we should initiate instance of dhcp server
- * and listener for Dhcp configuration events
- */
- AssertRCReturn(virtualbox.isNull(), VERR_INTERNAL_ERROR);
-
- hrc = virtualbox->FindDHCPServerByNetworkName(com::Bstr(m_Network.c_str()).raw(),
- m_DhcpServer.asOutParam());
- AssertComRCReturn(hrc, VERR_INTERNAL_ERROR);
-
- hrc = virtualbox->FindNATNetworkByName(com::Bstr(m_Network.c_str()).raw(),
- m_NATNetwork.asOutParam());
-
- /* This isn't fatal in general case.
- * AssertComRCReturn(hrc, VERR_INTERNAL_ERROR);
- */
-
- ConfigurationManager *confManager = ConfigurationManager::getConfigurationManager();
- AssertPtrReturn(confManager, VERR_INTERNAL_ERROR);
-
- /*
- * if we have nat netework of the same name
- * this is good chance that we are assigned to this network.
- */
- BOOL fNeedDhcpServer = false;
- if ( !m_NATNetwork.isNull()
- && SUCCEEDED(m_NATNetwork->COMGETTER(NeedDhcpServer)(&fNeedDhcpServer))
- && fNeedDhcpServer)
- {
- /* 90% we are servicing NAT network */
- RTNETADDRIPV4 gateway;
- com::Bstr strGateway;
- hrc = m_NATNetwork->COMGETTER(Gateway)(strGateway.asOutParam());
- AssertComRCReturn(hrc, VERR_INTERNAL_ERROR);
- RTNetStrToIPv4Addr(com::Utf8Str(strGateway).c_str(), &gateway);
-
- confManager->addToAddressList(RTNET_DHCP_OPT_ROUTERS, gateway);
-
- unsigned int i;
- unsigned int count_strs;
- com::SafeArray<BSTR> strs;
- std::map<RTNETADDRIPV4, uint32_t> MapIp4Addr2Off;
-
- hrc = m_NATNetwork->COMGETTER(LocalMappings)(ComSafeArrayAsOutParam(strs));
- if ( SUCCEEDED(hrc)
- && (count_strs = strs.size()))
- {
- for (i = 0; i < count_strs; ++i)
- {
- char szAddr[17];
- RTNETADDRIPV4 ip4addr;
- char *pszTerm;
- uint32_t u32Off;
- com::Utf8Str strLo2Off(strs[i]);
- const char *pszLo2Off = strLo2Off.c_str();
-
- RT_ZERO(szAddr);
-
- pszTerm = RTStrStr(pszLo2Off, "=");
-
- if ( pszTerm
- && (pszTerm - pszLo2Off) <= INET_ADDRSTRLEN)
- {
- memcpy(szAddr, pszLo2Off, (pszTerm - pszLo2Off));
- int rc = RTNetStrToIPv4Addr(szAddr, &ip4addr);
- if (RT_SUCCESS(rc))
- {
- u32Off = RTStrToUInt32(pszTerm + 1);
- if (u32Off != 0)
- MapIp4Addr2Off.insert(
- std::map<RTNETADDRIPV4,uint32_t>::value_type(ip4addr, u32Off));
- }
- }
- }
- }
-
- strs.setNull();
- ComPtr<IHost> host;
- if (SUCCEEDED(virtualbox->COMGETTER(Host)(host.asOutParam())))
- {
- if (SUCCEEDED(host->COMGETTER(NameServers)(ComSafeArrayAsOutParam(strs))))
- {
- RTNETADDRIPV4 addr;
- confManager->flushAddressList(RTNET_DHCP_OPT_DNS);
- int rc;
- for (i = 0; i < strs.size(); ++i)
- {
- rc = RTNetStrToIPv4Addr(com::Utf8Str(strs[i]).c_str(), &addr);
- if (RT_SUCCESS(rc))
- {
- if (addr.au8[0] == 127)
- {
- if (MapIp4Addr2Off[addr] != 0)
- {
- addr.u = RT_H2N_U32(RT_N2H_U32(m_Ipv4Address.u & m_Ipv4Netmask.u)
- + MapIp4Addr2Off[addr]);
- }
- else
- continue;
- }
-
- confManager->addToAddressList(RTNET_DHCP_OPT_DNS, addr);
- }
- }
- }
-
- strs.setNull();
-#if 0
- if (SUCCEEDED(host->COMGETTER(SearchStrings)(ComSafeArrayAsOutParam(strs))))
- {
- /* XXX: todo. */;
- }
- strs.setNull();
-#endif
- com::Bstr domain;
- if (SUCCEEDED(host->COMGETTER(DomainName)(domain.asOutParam())))
- confManager->setString(RTNET_DHCP_OPT_DOMAIN_NAME, std::string(com::Utf8Str(domain).c_str()));
-
-
- }
-
- }
+ int rc = this->VBoxNetBaseService::init();
+ AssertRCReturn(rc, rc);
NetworkManager *netManager = NetworkManager::getNetworkManager();
netManager->setOurAddress(m_Ipv4Address);
netManager->setOurNetmask(m_Ipv4Netmask);
netManager->setOurMac(m_MacAddress);
-
- /* Configuration fetching */
- if (m_fIgnoreCmdLineParameters)
- {
- /* just fetch option array and add options to config */
- /* per VM-settings ???
- *
- * - we have vms with attached adapters with known mac-addresses
- * - mac-addresses might be changed as well as names, how keep our config cleaned ????
- */
- com::SafeArray<BSTR> sf;
- hrc = m_DhcpServer->COMGETTER(GlobalOptions)(ComSafeArrayAsOutParam(sf));
- AssertComRCReturn(hrc, VERR_INTERNAL_ERROR);
-
-#if 0
- for (int i = 0; i < sf.size(); ++i)
- {
- RTPrintf("%d: %s\n", i, com::Utf8Str(sf[i]).c_str());
- }
-
-#endif
- com::Bstr strUpperIp, strLowerIp;
-
- RTNETADDRIPV4 LowerAddress;
- RTNETADDRIPV4 UpperAddress;
-
- hrc = m_DhcpServer->COMGETTER(UpperIP)(strUpperIp.asOutParam());
- AssertComRCReturn(hrc, VERR_INTERNAL_ERROR);
- RTNetStrToIPv4Addr(com::Utf8Str(strUpperIp).c_str(), &UpperAddress);
-
-
- hrc = m_DhcpServer->COMGETTER(LowerIP)(strLowerIp.asOutParam());
- AssertComRCReturn(hrc, VERR_INTERNAL_ERROR);
- RTNetStrToIPv4Addr(com::Utf8Str(strLowerIp).c_str(), &LowerAddress);
-
- RTNETADDRIPV4 networkId;
- networkId.u = m_Ipv4Address.u & m_Ipv4Netmask.u;
- std::string name = std::string("default");
-
- NetworkConfigEntity *pCfg = confManager->addNetwork(unconst(g_RootConfig),
- networkId,
- m_Ipv4Netmask,
- LowerAddress,
- UpperAddress);
-
- com::Bstr bstr;
- hrc = virtualbox->COMGETTER(HomeFolder)(bstr.asOutParam());
- std::string strXmlLeaseFile(com::Utf8StrFmt("%ls%c%s.leases",
- bstr.raw(), RTPATH_DELIMITER, m_Network.c_str()).c_str());
- confManager->loadFromFile(strXmlLeaseFile);
-
- } /* if(m_fIgnoreCmdLineParameters) */
+
+ if (isMainNeeded())
+ rc = initWithMain();
else
- {
- CmdParameterIterator it;
-
- RTNETADDRIPV4 networkId;
- networkId.u = m_Ipv4Address.u & m_Ipv4Netmask.u;
- RTNETADDRIPV4 netmask = m_Ipv4Netmask;
- RTNETADDRIPV4 LowerAddress;
- RTNETADDRIPV4 UpperAddress;
+ rc = initNoMain();
- LowerAddress = networkId;
- UpperAddress.u = RT_H2N_U32(RT_N2H_U32(LowerAddress.u) | RT_N2H_U32(netmask.u));
+ AssertRCReturn(rc, rc);
- int idx = 0;
- char name[64];
-
-
- for (it = CmdParameterll.begin(); it != CmdParameterll.end(); ++it)
- {
- idx++;
- RTStrPrintf(name, RT_ELEMENTS(name), "network-%d", idx);
- std::string strname(name);
-
- switch(it->Key)
- {
- case 'b':
- /* config */
- NetworkConfigEntity(strname,
- g_RootConfig,
- g_AnyClient,
- 5,
- networkId,
- netmask,
- LowerAddress,
- UpperAddress);
- case 'l':
- case 'u':
- case 'm':
- case 'g':
- /* XXX: TBD */
- break;
- }
- }
- }
return VINF_SUCCESS;
}
@@ -588,9 +310,9 @@ int VBoxNetDhcp::run(void)
/* XXX: shortcut should be hidden from network manager */
NetworkManager *netManager = NetworkManager::getNetworkManager();
- netManager->m_pSession = m_pSession;
- netManager->m_hIf = m_hIf;
- netManager->m_pIfBuf = m_pIfBuf;
+ netManager->setSession(m_pSession);
+ netManager->setInterface(m_hIf);
+ netManager->setRingBuffer(m_pIfBuf);
/*
* The loop.
@@ -708,46 +430,25 @@ bool VBoxNetDhcp::handleDhcpMsg(uint8_t uMsgType, PCRTNETBOOTP pDhcpMsg, size_t
*/
bool VBoxNetDhcp::handleDhcpReqDiscover(PCRTNETBOOTP pDhcpMsg, size_t cb)
{
+ RawOption opt;
+ memset(&opt, 0, sizeof(RawOption));
+ /* 1. Find client */
+ ConfigurationManager *confManager = ConfigurationManager::getConfigurationManager();
+ Client client = confManager->getClientByDhcpPacket(pDhcpMsg, cb);
- /* let's main first */
- if (!m_DhcpServer.isNull())
- {
-#if 0
- HRESULT hrc;
- com::SafeArray<BSTR> sf;
- hrc = m_DhcpServer->GetMacOptions(com::BstrFmt("%02X%02X%02X%02X%02X%02X",
- pDhcpMsg->bp_chaddr.Mac.au8[0],
- pDhcpMsg->bp_chaddr.Mac.au8[1],
- pDhcpMsg->bp_chaddr.Mac.au8[2],
- pDhcpMsg->bp_chaddr.Mac.au8[3],
- pDhcpMsg->bp_chaddr.Mac.au8[4],
- pDhcpMsg->bp_chaddr.Mac.au8[5]).raw(),
- ComSafeArrayAsOutParam(sf));
- if (SUCCEEDED(hrc))
- {
- /* XXX: per-host configuration */
- }
-#endif
- RawOption opt;
- memset(&opt, 0, sizeof(RawOption));
- /* 1. Find client */
- ConfigurationManager *confManager = ConfigurationManager::getConfigurationManager();
- Client client = confManager->getClientByDhcpPacket(pDhcpMsg, cb);
-
- /* 2. Find/Bind lease for client */
- Lease lease = confManager->allocateLease4Client(client, pDhcpMsg, cb);
- AssertReturn(lease != Lease::NullLease, VINF_SUCCESS);
+ /* 2. Find/Bind lease for client */
+ Lease lease = confManager->allocateLease4Client(client, pDhcpMsg, cb);
+ AssertReturn(lease != Lease::NullLease, VINF_SUCCESS);
- int rc = ConfigurationManager::extractRequestList(pDhcpMsg, cb, opt);
+ int rc = ConfigurationManager::extractRequestList(pDhcpMsg, cb, opt);
- /* 3. Send of offer */
- NetworkManager *networkManager = NetworkManager::getNetworkManager();
+ /* 3. Send of offer */
+ NetworkManager *networkManager = NetworkManager::getNetworkManager();
- lease.bindingPhase(true);
- lease.phaseStart(RTTimeMilliTS());
- lease.setExpiration(300); /* 3 min. */
- networkManager->offer4Client(client, pDhcpMsg->bp_xid, opt.au8RawOpt, opt.cbRawOpt);
- } /* end of if(!m_DhcpServer.isNull()) */
+ lease.bindingPhase(true);
+ lease.phaseStart(RTTimeMilliTS());
+ lease.setExpiration(300); /* 3 min. */
+ networkManager->offer4Client(client, pDhcpMsg->bp_xid, opt.au8RawOpt, opt.cbRawOpt);
return VINF_SUCCESS;
}
@@ -940,6 +641,193 @@ void VBoxNetDhcp::debugPrintV(int iMinLevel, bool fMsg, const char *pszFmt, va_l
}
+int VBoxNetDhcp::initNoMain()
+{
+ CmdParameterIterator it;
+
+ RTNETADDRIPV4 networkId;
+ networkId.u = m_Ipv4Address.u & m_Ipv4Netmask.u;
+ RTNETADDRIPV4 netmask = m_Ipv4Netmask;
+
+ RTNETADDRIPV4 UpperAddress;
+ RTNETADDRIPV4 LowerAddress = networkId;
+ UpperAddress.u = RT_H2N_U32(RT_N2H_U32(LowerAddress.u) | RT_N2H_U32(netmask.u));
+
+ for (it = CmdParameterll.begin(); it != CmdParameterll.end(); ++it)
+ {
+ switch(it->Key)
+ {
+ case 'l':
+ RTNetStrToIPv4Addr(it->strValue.c_str(), &LowerAddress);
+ break;
+
+ case 'u':
+ RTNetStrToIPv4Addr(it->strValue.c_str(), &UpperAddress);
+ break;
+ case 'b':
+ break;
+
+ }
+ }
+
+ ConfigurationManager *confManager = ConfigurationManager::getConfigurationManager();
+ AssertPtrReturn(confManager, VERR_INTERNAL_ERROR);
+ confManager->addNetwork(unconst(g_RootConfig),
+ networkId,
+ m_Ipv4Netmask,
+ LowerAddress,
+ UpperAddress);
+
+ return VINF_SUCCESS;
+}
+
+
+int VBoxNetDhcp::initWithMain()
+{
+ /* ok, here we should initiate instance of dhcp server
+ * and listener for Dhcp configuration events
+ */
+ AssertRCReturn(virtualbox.isNull(), VERR_INTERNAL_ERROR);
+
+ HRESULT hrc = virtualbox->FindDHCPServerByNetworkName(com::Bstr(m_Network.c_str()).raw(),
+ m_DhcpServer.asOutParam());
+ AssertComRCReturn(hrc, VERR_INTERNAL_ERROR);
+
+ hrc = virtualbox->FindNATNetworkByName(com::Bstr(m_Network.c_str()).raw(),
+ m_NATNetwork.asOutParam());
+
+ BOOL fNeedDhcpServer = false;
+ if (FAILED(m_NATNetwork->COMGETTER(NeedDhcpServer)(&fNeedDhcpServer)))
+ return VERR_INTERNAL_ERROR;
+
+ if (!fNeedDhcpServer)
+ return VERR_CANCELLED;
+
+ RTNETADDRIPV4 gateway;
+ com::Bstr strGateway;
+
+ hrc = m_NATNetwork->COMGETTER(Gateway)(strGateway.asOutParam());
+ AssertComRCReturn(hrc, VERR_INTERNAL_ERROR);
+ RTNetStrToIPv4Addr(com::Utf8Str(strGateway).c_str(), &gateway);
+
+ ConfigurationManager *confManager = ConfigurationManager::getConfigurationManager();
+ AssertPtrReturn(confManager, VERR_INTERNAL_ERROR);
+ confManager->addToAddressList(RTNET_DHCP_OPT_ROUTERS, gateway);
+
+ unsigned int i;
+ unsigned int count_strs;
+ com::SafeArray<BSTR> strs;
+ std::map<RTNETADDRIPV4, uint32_t> MapIp4Addr2Off;
+
+ hrc = m_NATNetwork->COMGETTER(LocalMappings)(ComSafeArrayAsOutParam(strs));
+ if ( SUCCEEDED(hrc)
+ && (count_strs = strs.size()))
+ {
+ for (i = 0; i < count_strs; ++i)
+ {
+ char szAddr[17];
+ RTNETADDRIPV4 ip4addr;
+ char *pszTerm;
+ uint32_t u32Off;
+ com::Utf8Str strLo2Off(strs[i]);
+ const char *pszLo2Off = strLo2Off.c_str();
+
+ RT_ZERO(szAddr);
+
+ pszTerm = RTStrStr(pszLo2Off, "=");
+
+ if ( pszTerm
+ && (pszTerm - pszLo2Off) <= INET_ADDRSTRLEN)
+ {
+ memcpy(szAddr, pszLo2Off, (pszTerm - pszLo2Off));
+ int rc = RTNetStrToIPv4Addr(szAddr, &ip4addr);
+ if (RT_SUCCESS(rc))
+ {
+ u32Off = RTStrToUInt32(pszTerm + 1);
+ if (u32Off != 0)
+ MapIp4Addr2Off.insert(
+ std::map<RTNETADDRIPV4,uint32_t>::value_type(ip4addr, u32Off));
+ }
+ }
+ }
+ }
+
+ strs.setNull();
+ ComPtr<IHost> host;
+ if (SUCCEEDED(virtualbox->COMGETTER(Host)(host.asOutParam())))
+ {
+ if (SUCCEEDED(host->COMGETTER(NameServers)(ComSafeArrayAsOutParam(strs))))
+ {
+ RTNETADDRIPV4 addr;
+
+ confManager->flushAddressList(RTNET_DHCP_OPT_DNS);
+ int rc;
+ for (i = 0; i < strs.size(); ++i)
+ {
+ rc = RTNetStrToIPv4Addr(com::Utf8Str(strs[i]).c_str(), &addr);
+ if (RT_SUCCESS(rc))
+ {
+ if (addr.au8[0] == 127)
+ {
+ if (MapIp4Addr2Off[addr] != 0)
+ {
+ addr.u = RT_H2N_U32(RT_N2H_U32(m_Ipv4Address.u & m_Ipv4Netmask.u)
+ + MapIp4Addr2Off[addr]);
+ }
+ else
+ continue;
+ }
+
+ confManager->addToAddressList(RTNET_DHCP_OPT_DNS, addr);
+ }
+ }
+ }
+
+ strs.setNull();
+#if 0
+ if (SUCCEEDED(host->COMGETTER(SearchStrings)(ComSafeArrayAsOutParam(strs))))
+ {
+ /* XXX: todo. */;
+ }
+ strs.setNull();
+#endif
+ com::Bstr domain;
+ if (SUCCEEDED(host->COMGETTER(DomainName)(domain.asOutParam())))
+ confManager->setString(RTNET_DHCP_OPT_DOMAIN_NAME, std::string(com::Utf8Str(domain).c_str()));
+ }
+
+ com::Bstr strUpperIp, strLowerIp;
+
+ RTNETADDRIPV4 LowerAddress;
+ RTNETADDRIPV4 UpperAddress;
+
+ hrc = m_DhcpServer->COMGETTER(UpperIP)(strUpperIp.asOutParam());
+ AssertComRCReturn(hrc, VERR_INTERNAL_ERROR);
+ RTNetStrToIPv4Addr(com::Utf8Str(strUpperIp).c_str(), &UpperAddress);
+
+
+ hrc = m_DhcpServer->COMGETTER(LowerIP)(strLowerIp.asOutParam());
+ AssertComRCReturn(hrc, VERR_INTERNAL_ERROR);
+ RTNetStrToIPv4Addr(com::Utf8Str(strLowerIp).c_str(), &LowerAddress);
+
+ RTNETADDRIPV4 networkId;
+ networkId.u = m_Ipv4Address.u & m_Ipv4Netmask.u;
+ std::string name = std::string("default");
+
+ confManager->addNetwork(unconst(g_RootConfig),
+ networkId,
+ m_Ipv4Netmask,
+ LowerAddress,
+ UpperAddress);
+
+ com::Bstr bstr;
+ hrc = virtualbox->COMGETTER(HomeFolder)(bstr.asOutParam());
+ std::string strXmlLeaseFile(com::Utf8StrFmt("%ls%c%s.leases",
+ bstr.raw(), RTPATH_DELIMITER, m_Network.c_str()).c_str());
+ confManager->loadFromFile(strXmlLeaseFile);
+
+ return VINF_SUCCESS;
+}
/**
* Entry point.
@@ -949,8 +837,6 @@ extern "C" DECLEXPORT(int) TrustedMain(int argc, char **argv)
/*
* Instantiate the DHCP server and hand it the options.
*/
- HRESULT hrc = com::Initialize();
- Assert(!FAILED(hrc));
VBoxNetDhcp *pDhcp = new VBoxNetDhcp();
if (!pDhcp)
diff --git a/src/VBox/NetworkServices/NAT/VBoxNetLwipNAT.cpp b/src/VBox/NetworkServices/NAT/VBoxNetLwipNAT.cpp
index c79501c..3c3d2c3 100644
--- a/src/VBox/NetworkServices/NAT/VBoxNetLwipNAT.cpp
+++ b/src/VBox/NetworkServices/NAT/VBoxNetLwipNAT.cpp
@@ -165,7 +165,8 @@ class VBoxNetLwipNAT: public VBoxNetBaseService
virtual int init(void);
/* @todo: when configuration would be really needed */
virtual int parseOpt(int rc, const RTGETOPTUNION& getOptVal);
-
+ /* VBoxNetNAT always needs Main */
+ virtual bool isMainNeeded() const { return true; }
private:
struct proxy_options m_ProxyOptions;
struct sockaddr_in m_src4;
@@ -889,13 +890,15 @@ int VBoxNetLwipNAT::natServiceProcessRegisteredPf(VECNATSERVICEPF& vecRules){
int VBoxNetLwipNAT::init()
{
- int rc = VINF_SUCCESS;
HRESULT hrc;
LogFlowFuncEnter();
/* virtualbox initialized in super class */
+ int rc = ::VBoxNetBaseService::init();
+ AssertRCReturn(rc, rc);
+
hrc = virtualbox->FindNATNetworkByName(com::Bstr(m_Network.c_str()).raw(),
m_net.asOutParam());
AssertComRCReturn(hrc, VERR_NOT_FOUND);
diff --git a/src/VBox/NetworkServices/NetLib/VBoxNetBaseService.cpp b/src/VBox/NetworkServices/NetLib/VBoxNetBaseService.cpp
index eedeeab..9634a36 100644
--- a/src/VBox/NetworkServices/NetLib/VBoxNetBaseService.cpp
+++ b/src/VBox/NetworkServices/NetLib/VBoxNetBaseService.cpp
@@ -85,6 +85,7 @@ static RTGETOPTDEF g_aGetOptDef[] =
{ "--ip-address", 'i', RTGETOPT_REQ_IPV4ADDR },
{ "--netmask", 'm', RTGETOPT_REQ_IPV4ADDR },
{ "--verbose", 'v', RTGETOPT_REQ_NOTHING },
+ { "--need-main", 'M', RTGETOPT_REQ_BOOL },
};
@@ -101,13 +102,10 @@ VBoxNetBaseService::VBoxNetBaseService()
m_cVerbosity = 0;
m_Name = "VBoxNetNAT";
m_Network = "intnet";
+ m_fNeedMain = false;
for(unsigned int i = 0; i < RT_ELEMENTS(g_aGetOptDef); ++i)
m_vecOptionDefs.push_back(&g_aGetOptDef[i]);
-
- HRESULT hrc = virtualbox.createLocalObject(CLSID_VirtualBox);
- if (FAILED(hrc))
- RTMsgError("Failed to create the VirtualBox object!");
}
@@ -139,6 +137,15 @@ VBoxNetBaseService::~VBoxNetBaseService()
int VBoxNetBaseService::init()
{
+ if (isMainNeeded())
+ {
+ HRESULT hrc = com::Initialize();
+ AssertComRCReturn(hrc, VERR_INTERNAL_ERROR);
+
+ hrc = virtualbox.createLocalObject(CLSID_VirtualBox);
+ AssertComRCReturn(hrc, VERR_INTERNAL_ERROR);
+ }
+
return VINF_SUCCESS;
}
@@ -172,16 +179,19 @@ int VBoxNetBaseService::parseArgs(int argc, char **argv)
break;
switch (rc)
{
- case 'N':
+ case 'N': // --name
m_Name = Val.psz;
break;
- case 'n':
+
+ case 'n': // --network
m_Network = Val.psz;
break;
- case 't':
+
+ case 't': //--trunk-name
m_TrunkName = Val.psz;
break;
- case 'T':
+
+ case 'T': //--trunk-type
if (!strcmp(Val.psz, "none"))
m_enmTrunkType = kIntNetTrunkType_None;
else if (!strcmp(Val.psz, "whatever"))
@@ -198,25 +208,32 @@ int VBoxNetBaseService::parseArgs(int argc, char **argv)
return 1;
}
break;
- case 'a':
+
+ case 'a': // --mac-address
m_MacAddress = Val.MacAddr;
break;
- case 'i':
+
+ case 'i': // --ip-address
m_Ipv4Address = Val.IPv4Addr;
break;
- case 'm':
- m_Ipv4Netmask = Val.IPv4Addr;
- break;
- case 'v':
+ case 'm': // --netmask
+ m_Ipv4Netmask = Val.IPv4Addr;
+ break;
+
+ case 'v': // --verbose
m_cVerbosity++;
break;
- case 'V':
+ case 'V': // --version (missed)
RTPrintf("%sr%u\n", RTBldCfgVersion(), RTBldCfgRevision());
return 1;
- case 'h':
+ case 'M': // --need-main
+ m_fNeedMain = true;
+ break;
+
+ case 'h': // --help (missed)
RTPrintf("%s Version %sr%u\n"
"(C) 2009-" VBOX_C_YEAR " " VBOX_VENDOR "\n"
"All rights reserved.\n"
diff --git a/src/VBox/NetworkServices/NetLib/VBoxNetBaseService.h b/src/VBox/NetworkServices/NetLib/VBoxNetBaseService.h
index 3849733..e9be798 100644
--- a/src/VBox/NetworkServices/NetLib/VBoxNetBaseService.h
+++ b/src/VBox/NetworkServices/NetLib/VBoxNetBaseService.h
@@ -38,7 +38,7 @@ public:
virtual int parseOpt(int rc, const RTGETOPTUNION& getOptVal) = 0;
virtual int init(void);
-
+ virtual bool isMainNeeded() const { return m_fNeedMain; }
/* VirtualBox instance */
ComPtr<IVirtualBox> virtualbox;
@@ -91,6 +91,8 @@ private:
/* cs for syncing */
RTCRITSECT m_csThis;
+ /* Controls whether service will connect SVC for runtime needs */
+ bool m_fNeedMain;
/** @} */
};
diff --git a/src/VBox/Runtime/Makefile.kmk b/src/VBox/Runtime/Makefile.kmk
index 338cce2..56c7533 100644
--- a/src/VBox/Runtime/Makefile.kmk
+++ b/src/VBox/Runtime/Makefile.kmk
@@ -543,6 +543,18 @@ ifdef IPRT_WITH_LZJB
RuntimeR3_SOURCES += common/misc/lzjb.c
endif
+# AMD64 / x86 assembly code.
+RuntimeR3_SOURCES.x86 += \
+ common/asm/ASMAtomicUoAndU64.asm \
+ common/asm/ASMAtomicUoAndU32.asm \
+ common/asm/ASMAtomicUoOrU64.asm \
+ common/asm/ASMAtomicUoOrU32.asm
+RuntimeR3_SOURCES.amd64 += \
+ common/asm/ASMAtomicUoAndU64.asm \
+ common/asm/ASMAtomicUoAndU32.asm \
+ common/asm/ASMAtomicUoOrU64.asm \
+ common/asm/ASMAtomicUoOrU32.asm
+
# Some versions of GCC might require this.
RuntimeR3_SOURCES.x86 += \
common/asm/ASMAtomicXchgU64.asm \
@@ -551,6 +563,7 @@ RuntimeR3_SOURCES.x86 += \
common/asm/ASMAtomicReadU64.asm \
common/asm/ASMAtomicUoReadU64.asm
+
ifdef IPRT_WITH_KSTUFF
RuntimeR3_SOURCES += \
common/ldr/ldrkStuff.cpp
@@ -1662,6 +1675,17 @@ RuntimeR0_SOURCES += \
common/math/gcc/xordi3.c
endif
+RuntimeR0_SOURCES.x86 += \
+ common/asm/ASMAtomicUoAndU64.asm \
+ common/asm/ASMAtomicUoAndU32.asm \
+ common/asm/ASMAtomicUoOrU64.asm \
+ common/asm/ASMAtomicUoOrU32.asm
+RuntimeR0_SOURCES.amd64 += \
+ common/asm/ASMAtomicUoAndU64.asm \
+ common/asm/ASMAtomicUoAndU32.asm \
+ common/asm/ASMAtomicUoOrU64.asm \
+ common/asm/ASMAtomicUoOrU32.asm
+
#if1of ($(KBUILD_TARGET_ARCH),amd64 x86)
# RuntimeR0_SOURCES += common/time/timesupA.asm
#else
diff --git a/src/VBox/Runtime/common/asm/ASMAtomicUoAndU32.asm b/src/VBox/Runtime/common/asm/ASMAtomicUoAndU32.asm
new file mode 100644
index 0000000..1e4bb0b
--- /dev/null
+++ b/src/VBox/Runtime/common/asm/ASMAtomicUoAndU32.asm
@@ -0,0 +1,58 @@
+; $Id: ASMAtomicUoAndU32.asm $
+;; @file
+; IPRT - ASMAtomicUoAndU32().
+;
+
+;
+; Copyright (C) 2013 Oracle Corporation
+;
+; This file is part of VirtualBox Open Source Edition (OSE), as
+; available from http://www.virtualbox.org. This file is free software;
+; you can redistribute it and/or modify it under the terms of the GNU
+; General Public License (GPL) as published by the Free Software
+; Foundation, in version 2 as it comes in the "COPYING" file of the
+; VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+; hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+;
+; The contents of this file may alternatively be used under the terms
+; of the Common Development and Distribution License Version 1.0
+; (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+; VirtualBox OSE distribution, in which case the provisions of the
+; CDDL are applicable instead of those of the GPL.
+;
+; You may elect to license modified versions of this file under the
+; terms and conditions of either the GPL or the CDDL or both.
+;
+
+;*******************************************************************************
+;* Header Files *
+;*******************************************************************************
+%include "iprt/asmdefs.mac"
+
+BEGINCODE
+
+;;
+; Atomically OR an unsigned 32-bit value, unordered.
+;
+; @param pu32 x86:esp+4 gcc:rdi msc:rcx
+; @param u32Or x86:esp+8 gcc:rsi msc:rdx
+;
+; @returns void
+;
+BEGINPROC_EXPORTED ASMAtomicUoAndU32
+%ifdef RT_ARCH_AMD64
+ %ifdef ASM_CALL64_MSC
+ and [rcx], rdx
+ %else
+ and [rdi], rsi
+ %endif
+%elifdef RT_ARCH_X86
+ mov ecx, [esp + 04h]
+ mov edx, [esp + 08h]
+ and [ecx], edx
+%endif
+ ret
+ENDPROC ASMAtomicUoAndU32
+
+
+
diff --git a/src/VBox/Runtime/common/asm/ASMAtomicUoAndU64.asm b/src/VBox/Runtime/common/asm/ASMAtomicUoAndU64.asm
new file mode 100644
index 0000000..7f145c2
--- /dev/null
+++ b/src/VBox/Runtime/common/asm/ASMAtomicUoAndU64.asm
@@ -0,0 +1,77 @@
+; $Id: ASMAtomicUoAndU64.asm $
+;; @file
+; IPRT - ASMAtomicUoAndU64().
+;
+
+;
+; Copyright (C) 2013 Oracle Corporation
+;
+; This file is part of VirtualBox Open Source Edition (OSE), as
+; available from http://www.virtualbox.org. This file is free software;
+; you can redistribute it and/or modify it under the terms of the GNU
+; General Public License (GPL) as published by the Free Software
+; Foundation, in version 2 as it comes in the "COPYING" file of the
+; VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+; hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+;
+; The contents of this file may alternatively be used under the terms
+; of the Common Development and Distribution License Version 1.0
+; (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+; VirtualBox OSE distribution, in which case the provisions of the
+; CDDL are applicable instead of those of the GPL.
+;
+; You may elect to license modified versions of this file under the
+; terms and conditions of either the GPL or the CDDL or both.
+;
+
+;*******************************************************************************
+;* Header Files *
+;*******************************************************************************
+%include "iprt/asmdefs.mac"
+
+BEGINCODE
+
+;;
+; Atomically AND an unsigned 64-bit value, unordered.
+;
+; @param pu64 x86:ebp+8 gcc:rdi msc:rcx
+; @param u64Or x86:ebp+c gcc:rsi msc:rdx
+;
+; @returns void
+;
+BEGINPROC_EXPORTED ASMAtomicUoAndU64
+%ifdef RT_ARCH_AMD64
+ %ifdef ASM_CALL64_MSC
+ and [rcx], rdx
+ %else
+ and [rdi], rsi
+ %endif
+%elifdef RT_ARCH_X86
+ push ebp
+ mov ebp, esp
+ push ebx
+ push edi
+
+ mov edi, [ebp + 08h]
+ mov ebx, [ebp + 0ch]
+ mov ecx, [ebp + 0ch + 4]
+ mov eax, ebx
+ mov edx, ecx
+.try_again:
+ cmpxchg8b [edi]
+ jz .done
+ mov ebx, eax
+ and ebx, [ebp + 0ch]
+ mov ecx, edx
+ and ecx, [ebp + 0ch + 4]
+ jmp .try_again
+
+.done:
+ pop edi
+ pop ebx
+ leave
+%endif
+ ret
+ENDPROC ASMAtomicUoAndU64
+
+
diff --git a/src/VBox/Runtime/common/asm/ASMAtomicUoOrU32.asm b/src/VBox/Runtime/common/asm/ASMAtomicUoOrU32.asm
new file mode 100644
index 0000000..efd63e5
--- /dev/null
+++ b/src/VBox/Runtime/common/asm/ASMAtomicUoOrU32.asm
@@ -0,0 +1,57 @@
+; $Id: ASMAtomicUoOrU32.asm $
+;; @file
+; IPRT - ASMAtomicUoOrU32().
+;
+
+;
+; Copyright (C) 2013 Oracle Corporation
+;
+; This file is part of VirtualBox Open Source Edition (OSE), as
+; available from http://www.virtualbox.org. This file is free software;
+; you can redistribute it and/or modify it under the terms of the GNU
+; General Public License (GPL) as published by the Free Software
+; Foundation, in version 2 as it comes in the "COPYING" file of the
+; VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+; hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+;
+; The contents of this file may alternatively be used under the terms
+; of the Common Development and Distribution License Version 1.0
+; (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+; VirtualBox OSE distribution, in which case the provisions of the
+; CDDL are applicable instead of those of the GPL.
+;
+; You may elect to license modified versions of this file under the
+; terms and conditions of either the GPL or the CDDL or both.
+;
+
+;*******************************************************************************
+;* Header Files *
+;*******************************************************************************
+%include "iprt/asmdefs.mac"
+
+BEGINCODE
+
+;;
+; Atomically OR an unsigned 32-bit value, unordered.
+;
+; @param pu32 x86:esp+4 gcc:rdi msc:rcx
+; @param u32Or x86:esp+8 gcc:rsi msc:rdx
+;
+; @returns void
+;
+BEGINPROC_EXPORTED ASMAtomicUoOrU32
+%ifdef RT_ARCH_AMD64
+ %ifdef ASM_CALL64_MSC
+ or [rcx], rdx
+ %else
+ or [rdi], rsi
+ %endif
+%elifdef RT_ARCH_X86
+ mov ecx, [esp + 04h]
+ mov edx, [esp + 08h]
+ or [ecx], edx
+%endif
+ ret
+ENDPROC ASMAtomicUoOrU32
+
+
diff --git a/src/VBox/Runtime/common/asm/ASMAtomicUoOrU64.asm b/src/VBox/Runtime/common/asm/ASMAtomicUoOrU64.asm
new file mode 100644
index 0000000..729aba5
--- /dev/null
+++ b/src/VBox/Runtime/common/asm/ASMAtomicUoOrU64.asm
@@ -0,0 +1,76 @@
+; $Id: ASMAtomicUoOrU64.asm $
+;; @file
+; IPRT - ASMAtomicUoOrU64().
+;
+
+;
+; Copyright (C) 2013 Oracle Corporation
+;
+; This file is part of VirtualBox Open Source Edition (OSE), as
+; available from http://www.virtualbox.org. This file is free software;
+; you can redistribute it and/or modify it under the terms of the GNU
+; General Public License (GPL) as published by the Free Software
+; Foundation, in version 2 as it comes in the "COPYING" file of the
+; VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+; hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+;
+; The contents of this file may alternatively be used under the terms
+; of the Common Development and Distribution License Version 1.0
+; (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+; VirtualBox OSE distribution, in which case the provisions of the
+; CDDL are applicable instead of those of the GPL.
+;
+; You may elect to license modified versions of this file under the
+; terms and conditions of either the GPL or the CDDL or both.
+;
+
+;*******************************************************************************
+;* Header Files *
+;*******************************************************************************
+%include "iprt/asmdefs.mac"
+
+BEGINCODE
+
+;;
+; Atomically OR an unsigned 64-bit value, unordered.
+;
+; @param pu64 x86:ebp+8 gcc:rdi msc:rcx
+; @param u64Or x86:ebp+c gcc:rsi msc:rdx
+;
+; @returns void
+;
+BEGINPROC_EXPORTED ASMAtomicUoOrU64
+%ifdef RT_ARCH_AMD64
+ %ifdef ASM_CALL64_MSC
+ or [rcx], rdx
+ %else
+ or [rdi], rsi
+ %endif
+%elifdef RT_ARCH_X86
+ push ebp
+ mov ebp, esp
+ push ebx
+ push edi
+
+ mov edi, [ebp + 08h]
+ mov ebx, [ebp + 0ch]
+ mov ecx, [ebp + 0ch + 4]
+ mov eax, ebx
+ mov edx, ecx
+.try_again:
+ cmpxchg8b [edi]
+ jz .done
+ mov ebx, eax
+ or ebx, [ebp + 0ch]
+ mov ecx, edx
+ or ecx, [ebp + 0ch + 4]
+ jmp .try_again
+
+.done:
+ pop edi
+ pop ebx
+ leave
+%endif
+ ret
+ENDPROC ASMAtomicUoOrU64
+
diff --git a/src/VBox/Runtime/common/table/avl_Destroy.cpp.h b/src/VBox/Runtime/common/table/avl_Destroy.cpp.h
index d0c53bd..5ae2521 100644
--- a/src/VBox/Runtime/common/table/avl_Destroy.cpp.h
+++ b/src/VBox/Runtime/common/table/avl_Destroy.cpp.h
@@ -47,7 +47,7 @@ KAVL_DECL(int) KAVL_FN(Destroy)(PPKAVLNODECORE ppTree, PKAVLCALLBACK pfnCallBack
int rc;
if (*ppTree == KAVL_NULL)
- return 0;
+ return VINF_SUCCESS;
cEntries = 1;
apEntries[0] = KAVL_GET_POINTER(ppTree);
@@ -74,7 +74,7 @@ KAVL_DECL(int) KAVL_FN(Destroy)(PPKAVLNODECORE ppTree, PKAVLCALLBACK pfnCallBack
pEqual->pList = KAVL_NULL;
rc = pfnCallBack(pEqual, pvUser);
- if (rc)
+ if (rc != VINF_SUCCESS)
return rc;
}
#endif
@@ -96,14 +96,14 @@ KAVL_DECL(int) KAVL_FN(Destroy)(PPKAVLNODECORE ppTree, PKAVLCALLBACK pfnCallBack
kASSERT(pNode->pLeft == KAVL_NULL);
kASSERT(pNode->pRight == KAVL_NULL);
rc = pfnCallBack(pNode, pvUser);
- if (rc)
+ if (rc != VINF_SUCCESS)
return rc;
}
} /* while */
kASSERT(*ppTree == KAVL_NULL);
- return 0;
+ return VINF_SUCCESS;
}
#endif
diff --git a/src/VBox/Runtime/common/table/avl_DoWithAll.cpp.h b/src/VBox/Runtime/common/table/avl_DoWithAll.cpp.h
index 82554fc..fad8e72 100644
--- a/src/VBox/Runtime/common/table/avl_DoWithAll.cpp.h
+++ b/src/VBox/Runtime/common/table/avl_DoWithAll.cpp.h
@@ -47,7 +47,7 @@ KAVL_DECL(int) KAVL_FN(DoWithAll)(PPKAVLNODECORE ppTree, int fFromLeft, PKAVLCAL
int rc;
if (*ppTree == KAVL_NULL)
- return 0;
+ return VINF_SUCCESS;
AVLStack.cEntries = 1;
AVLStack.achFlags[0] = 0;
@@ -72,14 +72,14 @@ KAVL_DECL(int) KAVL_FN(DoWithAll)(PPKAVLNODECORE ppTree, int fFromLeft, PKAVLCAL
/* center */
rc = pfnCallBack(pNode, pvParam);
- if (rc)
+ if (rc != VINF_SUCCESS)
return rc;
#ifdef KAVL_EQUAL_ALLOWED
if (pNode->pList != KAVL_NULL)
for (pEqual = KAVL_GET_POINTER(&pNode->pList); pEqual; pEqual = KAVL_GET_POINTER_NULL(&pEqual->pList))
{
rc = pfnCallBack(pEqual, pvParam);
- if (rc)
+ if (rc != VINF_SUCCESS)
return rc;
}
#endif
@@ -112,14 +112,14 @@ KAVL_DECL(int) KAVL_FN(DoWithAll)(PPKAVLNODECORE ppTree, int fFromLeft, PKAVLCAL
/* center */
rc = pfnCallBack(pNode, pvParam);
- if (rc)
+ if (rc != VINF_SUCCESS)
return rc;
#ifdef KAVL_EQUAL_ALLOWED
if (pNode->pList != KAVL_NULL)
for (pEqual = KAVL_GET_POINTER(&pNode->pList); pEqual; pEqual = KAVL_GET_POINTER_NULL(&pEqual->pList))
{
rc = pfnCallBack(pEqual, pvParam);
- if (rc)
+ if (rc != VINF_SUCCESS)
return rc;
}
#endif
@@ -134,7 +134,7 @@ KAVL_DECL(int) KAVL_FN(DoWithAll)(PPKAVLNODECORE ppTree, int fFromLeft, PKAVLCAL
} /* while */
}
- return 0;
+ return VINF_SUCCESS;
}
diff --git a/src/VBox/Runtime/common/table/avlgcphys.cpp b/src/VBox/Runtime/common/table/avlgcphys.cpp
index 6f3eb2b..3ab3f97 100644
--- a/src/VBox/Runtime/common/table/avlgcphys.cpp
+++ b/src/VBox/Runtime/common/table/avlgcphys.cpp
@@ -60,6 +60,7 @@ static const char szFileId[] = "Id: kAVLULInt.c,v 1.4 2003/02/13 02:02:38 bird E
*******************************************************************************/
#include <iprt/avl.h>
#include <iprt/assert.h>
+#include <iprt/err.h>
/*
* Include the code.
diff --git a/src/VBox/Runtime/common/table/avlgcptr.cpp b/src/VBox/Runtime/common/table/avlgcptr.cpp
index 2867829..8eb2b94 100644
--- a/src/VBox/Runtime/common/table/avlgcptr.cpp
+++ b/src/VBox/Runtime/common/table/avlgcptr.cpp
@@ -60,7 +60,7 @@ static const char szFileId[] = "Id: kAVLPVInt.c,v 1.5 2003/02/13 02:02:35 bird E
*******************************************************************************/
#include <iprt/avl.h>
#include <iprt/assert.h>
-
+#include <iprt/err.h>
/*
* Include the code.
diff --git a/src/VBox/Runtime/common/table/avlhcphys.cpp b/src/VBox/Runtime/common/table/avlhcphys.cpp
index a136a72..229dc63 100644
--- a/src/VBox/Runtime/common/table/avlhcphys.cpp
+++ b/src/VBox/Runtime/common/table/avlhcphys.cpp
@@ -60,6 +60,7 @@ static const char szFileId[] = "Id: kAVLULInt.c,v 1.4 2003/02/13 02:02:38 bird E
*******************************************************************************/
#include <iprt/avl.h>
#include <iprt/assert.h>
+#include <iprt/err.h>
/*
* Include the code.
diff --git a/src/VBox/Runtime/common/table/avllu32.cpp b/src/VBox/Runtime/common/table/avllu32.cpp
index 23fde28..f6ec3bc 100644
--- a/src/VBox/Runtime/common/table/avllu32.cpp
+++ b/src/VBox/Runtime/common/table/avllu32.cpp
@@ -60,6 +60,7 @@ static const char szFileId[] = "Id: kAVLULInt.c,v 1.4 2003/02/13 02:02:38 bird E
*******************************************************************************/
#include <iprt/avl.h>
#include <iprt/assert.h>
+#include <iprt/err.h>
/*
* Include the code.
diff --git a/src/VBox/Runtime/common/table/avlogcphys.cpp b/src/VBox/Runtime/common/table/avlogcphys.cpp
index 108b6c6..0d4ddef 100644
--- a/src/VBox/Runtime/common/table/avlogcphys.cpp
+++ b/src/VBox/Runtime/common/table/avlogcphys.cpp
@@ -61,6 +61,7 @@ static const char szFileId[] = "Id: kAVLULInt.c,v 1.4 2003/02/13 02:02:38 bird E
*******************************************************************************/
#include <iprt/avl.h>
#include <iprt/assert.h>
+#include <iprt/err.h>
/*
* Include the code.
diff --git a/src/VBox/Runtime/common/table/avlogcptr.cpp b/src/VBox/Runtime/common/table/avlogcptr.cpp
index 5a70b50..f25536b 100644
--- a/src/VBox/Runtime/common/table/avlogcptr.cpp
+++ b/src/VBox/Runtime/common/table/avlogcptr.cpp
@@ -62,6 +62,7 @@ static const char szFileId[] = "Id: kAVLULInt.c,v 1.4 2003/02/13 02:02:38 bird E
*******************************************************************************/
#include <iprt/avl.h>
#include <iprt/assert.h>
+#include <iprt/err.h>
/*
* Include the code.
diff --git a/src/VBox/Runtime/common/table/avlohcphys.cpp b/src/VBox/Runtime/common/table/avlohcphys.cpp
index 17d43a1..39f64c1 100644
--- a/src/VBox/Runtime/common/table/avlohcphys.cpp
+++ b/src/VBox/Runtime/common/table/avlohcphys.cpp
@@ -61,6 +61,7 @@ static const char szFileId[] = "Id: kAVLULInt.c,v 1.4 2003/02/13 02:02:38 bird E
*******************************************************************************/
#include <iprt/avl.h>
#include <iprt/assert.h>
+#include <iprt/err.h>
/*
* Include the code.
diff --git a/src/VBox/Runtime/common/table/avloioport.cpp b/src/VBox/Runtime/common/table/avloioport.cpp
index 01624a9..e1f5f91 100644
--- a/src/VBox/Runtime/common/table/avloioport.cpp
+++ b/src/VBox/Runtime/common/table/avloioport.cpp
@@ -61,6 +61,7 @@ static const char szFileId[] = "Id: kAVLULInt.c,v 1.4 2003/02/13 02:02:38 bird E
*******************************************************************************/
#include <iprt/avl.h>
#include <iprt/assert.h>
+#include <iprt/err.h>
/*
* Include the code.
diff --git a/src/VBox/Runtime/common/table/avlou32.cpp b/src/VBox/Runtime/common/table/avlou32.cpp
index 5ddcf73..0ae06da 100644
--- a/src/VBox/Runtime/common/table/avlou32.cpp
+++ b/src/VBox/Runtime/common/table/avlou32.cpp
@@ -62,6 +62,7 @@ static const char szFileId[] = "Id: kAVLULInt.c,v 1.4 2003/02/13 02:02:38 bird E
*******************************************************************************/
#include <iprt/avl.h>
#include <iprt/assert.h>
+#include <iprt/err.h>
/*
* Include the code.
diff --git a/src/VBox/Runtime/common/table/avlpv.cpp b/src/VBox/Runtime/common/table/avlpv.cpp
index a88700f..ee090ad 100644
--- a/src/VBox/Runtime/common/table/avlpv.cpp
+++ b/src/VBox/Runtime/common/table/avlpv.cpp
@@ -60,7 +60,7 @@ static const char szFileId[] = "Id: kAVLPVInt.c,v 1.5 2003/02/13 02:02:35 bird E
*******************************************************************************/
#include <iprt/avl.h>
#include <iprt/assert.h>
-
+#include <iprt/err.h>
/*
* Include the code.
diff --git a/src/VBox/Runtime/common/table/avlrfoff.cpp b/src/VBox/Runtime/common/table/avlrfoff.cpp
index 0b01cb7..268482b 100644
--- a/src/VBox/Runtime/common/table/avlrfoff.cpp
+++ b/src/VBox/Runtime/common/table/avlrfoff.cpp
@@ -65,6 +65,7 @@ static const char szFileId[] = "Id: kAVLULInt.c,v 1.4 2003/02/13 02:02:38 bird E
*******************************************************************************/
#include <iprt/avl.h>
#include <iprt/assert.h>
+#include <iprt/err.h>
/*
* Include the code.
diff --git a/src/VBox/Runtime/common/table/avlrgcptr.cpp b/src/VBox/Runtime/common/table/avlrgcptr.cpp
index b1b2288..c83ae93 100644
--- a/src/VBox/Runtime/common/table/avlrgcptr.cpp
+++ b/src/VBox/Runtime/common/table/avlrgcptr.cpp
@@ -65,6 +65,7 @@ static const char szFileId[] = "Id: kAVLULInt.c,v 1.4 2003/02/13 02:02:38 bird E
*******************************************************************************/
#include <iprt/avl.h>
#include <iprt/assert.h>
+#include <iprt/err.h>
/*
* Include the code.
diff --git a/src/VBox/Runtime/common/table/avlrogcphys.cpp b/src/VBox/Runtime/common/table/avlrogcphys.cpp
index 2a5aefd..c7496e9 100644
--- a/src/VBox/Runtime/common/table/avlrogcphys.cpp
+++ b/src/VBox/Runtime/common/table/avlrogcphys.cpp
@@ -66,6 +66,7 @@ static const char szFileId[] = "Id: kAVLULInt.c,v 1.4 2003/02/13 02:02:38 bird E
*******************************************************************************/
#include <iprt/avl.h>
#include <iprt/assert.h>
+#include <iprt/err.h>
/*
* Include the code.
diff --git a/src/VBox/Runtime/common/table/avlrogcptr.cpp b/src/VBox/Runtime/common/table/avlrogcptr.cpp
index ef52f78..ab167f2 100644
--- a/src/VBox/Runtime/common/table/avlrogcptr.cpp
+++ b/src/VBox/Runtime/common/table/avlrogcptr.cpp
@@ -66,6 +66,7 @@ static const char szFileId[] = "Id: kAVLULInt.c,v 1.4 2003/02/13 02:02:38 bird E
*******************************************************************************/
#include <iprt/avl.h>
#include <iprt/assert.h>
+#include <iprt/err.h>
/*
* Include the code.
diff --git a/src/VBox/Runtime/common/table/avlroioport.cpp b/src/VBox/Runtime/common/table/avlroioport.cpp
index dab3e72..9534c29 100644
--- a/src/VBox/Runtime/common/table/avlroioport.cpp
+++ b/src/VBox/Runtime/common/table/avlroioport.cpp
@@ -66,6 +66,7 @@ static const char szFileId[] = "Id: kAVLULInt.c,v 1.4 2003/02/13 02:02:38 bird E
*******************************************************************************/
#include <iprt/avl.h>
#include <iprt/assert.h>
+#include <iprt/err.h>
/*
* Include the code.
diff --git a/src/VBox/Runtime/common/table/avlroogcptr.cpp b/src/VBox/Runtime/common/table/avlroogcptr.cpp
index ec0dac9..5d45aaf 100644
--- a/src/VBox/Runtime/common/table/avlroogcptr.cpp
+++ b/src/VBox/Runtime/common/table/avlroogcptr.cpp
@@ -62,6 +62,7 @@ static const char szFileId[] = "Id: kAVLULInt.c,v 1.4 2003/02/13 02:02:38 bird E
*******************************************************************************/
#include <iprt/avl.h>
#include <iprt/assert.h>
+#include <iprt/err.h>
/*
* Include the code.
diff --git a/src/VBox/Runtime/common/table/avlrpv.cpp b/src/VBox/Runtime/common/table/avlrpv.cpp
index 287e09e..40d865f 100644
--- a/src/VBox/Runtime/common/table/avlrpv.cpp
+++ b/src/VBox/Runtime/common/table/avlrpv.cpp
@@ -64,7 +64,7 @@ static const char szFileId[] = "Id: kAVLPVInt.c,v 1.5 2003/02/13 02:02:35 bird E
*******************************************************************************/
#include <iprt/avl.h>
#include <iprt/assert.h>
-
+#include <iprt/err.h>
/*
* Include the code.
diff --git a/src/VBox/Runtime/common/table/avlru64.cpp b/src/VBox/Runtime/common/table/avlru64.cpp
index 722b0d1..6b575b7 100644
--- a/src/VBox/Runtime/common/table/avlru64.cpp
+++ b/src/VBox/Runtime/common/table/avlru64.cpp
@@ -64,7 +64,7 @@ static const char szFileId[] = "Id: kAVLULInt.c,v 1.5 2003/02/13 02:02:35 bird E
*******************************************************************************/
#include <iprt/avl.h>
#include <iprt/assert.h>
-
+#include <iprt/err.h>
/*
* Include the code.
diff --git a/src/VBox/Runtime/common/table/avlruintptr.cpp b/src/VBox/Runtime/common/table/avlruintptr.cpp
index 4459fd8..5fc868b 100644
--- a/src/VBox/Runtime/common/table/avlruintptr.cpp
+++ b/src/VBox/Runtime/common/table/avlruintptr.cpp
@@ -65,6 +65,7 @@ static const char szFileId[] = "Id: kAVLULInt.c,v 1.4 2003/02/13 02:02:38 bird E
*******************************************************************************/
#include <iprt/avl.h>
#include <iprt/assert.h>
+#include <iprt/err.h>
/*
* Include the code.
diff --git a/src/VBox/Runtime/common/table/avlu32.cpp b/src/VBox/Runtime/common/table/avlu32.cpp
index 0ff2d69..41de76f 100644
--- a/src/VBox/Runtime/common/table/avlu32.cpp
+++ b/src/VBox/Runtime/common/table/avlu32.cpp
@@ -60,6 +60,7 @@ static const char szFileId[] = "Id: kAVLULInt.c,v 1.4 2003/02/13 02:02:38 bird E
*******************************************************************************/
#include <iprt/avl.h>
#include <iprt/assert.h>
+#include <iprt/err.h>
/*
* Include the code.
diff --git a/src/VBox/Runtime/common/table/avluintptr.cpp b/src/VBox/Runtime/common/table/avluintptr.cpp
index 68cc12f..94834f8 100644
--- a/src/VBox/Runtime/common/table/avluintptr.cpp
+++ b/src/VBox/Runtime/common/table/avluintptr.cpp
@@ -60,6 +60,7 @@ static const char szFileId[] = "Id: kAVLULInt.c,v 1.4 2003/02/13 02:02:38 bird E
*******************************************************************************/
#include <iprt/avl.h>
#include <iprt/assert.h>
+#include <iprt/err.h>
/*
* Include the code.
diff --git a/src/VBox/Runtime/common/table/avlul.cpp b/src/VBox/Runtime/common/table/avlul.cpp
index 9cf522d..62858dc 100644
--- a/src/VBox/Runtime/common/table/avlul.cpp
+++ b/src/VBox/Runtime/common/table/avlul.cpp
@@ -60,6 +60,7 @@ static const char szFileId[] = "Id: kAVLULInt.c,v 1.4 2003/02/13 02:02:38 bird E
*******************************************************************************/
#include <iprt/avl.h>
#include <iprt/assert.h>
+#include <iprt/err.h>
/*
* Include the code.
diff --git a/src/VBox/Runtime/r0drv/freebsd/alloc-r0drv-freebsd.c b/src/VBox/Runtime/r0drv/freebsd/alloc-r0drv-freebsd.c
index 349ad7b..b6c3d23 100644
--- a/src/VBox/Runtime/r0drv/freebsd/alloc-r0drv-freebsd.c
+++ b/src/VBox/Runtime/r0drv/freebsd/alloc-r0drv-freebsd.c
@@ -79,8 +79,13 @@ DECLHIDDEN(int) rtR0MemAllocEx(size_t cb, uint32_t fFlags, PRTMEMHDR *ppHdr)
return VERR_NO_EXEC_MEMORY;
/* Addr contains a start address vm_map_find will start searching for suitable space at. */
+#if __FreeBSD_version >= 1000055
+ int rc = vm_map_find(kernel_map, pVmObject, 0, &Addr,
+ cbAllocated, 0, VMFS_ANY_SPACE, VM_PROT_ALL, VM_PROT_ALL, 0);
+#else
int rc = vm_map_find(kernel_map, pVmObject, 0, &Addr,
cbAllocated, TRUE, VM_PROT_ALL, VM_PROT_ALL, 0);
+#endif
if (rc == KERN_SUCCESS)
{
rc = vm_map_wire(kernel_map, Addr, Addr + cbAllocated,
diff --git a/src/VBox/Runtime/r0drv/freebsd/memobj-r0drv-freebsd.c b/src/VBox/Runtime/r0drv/freebsd/memobj-r0drv-freebsd.c
index 5c90cf3..2486fd1 100644
--- a/src/VBox/Runtime/r0drv/freebsd/memobj-r0drv-freebsd.c
+++ b/src/VBox/Runtime/r0drv/freebsd/memobj-r0drv-freebsd.c
@@ -162,7 +162,11 @@ DECLHIDDEN(int) rtR0MemObjNativeFree(RTR0MEMOBJ pMem)
case RTR0MEMOBJTYPE_PHYS:
case RTR0MEMOBJTYPE_PHYS_NC:
{
+#if __FreeBSD_version >= 1000030
+ VM_OBJECT_WLOCK(pMemFreeBSD->pObject);
+#else
VM_OBJECT_LOCK(pMemFreeBSD->pObject);
+#endif
vm_page_t pPage = vm_page_find_least(pMemFreeBSD->pObject, 0);
vm_page_lock_queues();
for (vm_page_t pPage = vm_page_find_least(pMemFreeBSD->pObject, 0);
@@ -172,7 +176,11 @@ DECLHIDDEN(int) rtR0MemObjNativeFree(RTR0MEMOBJ pMem)
vm_page_unwire(pPage, 0);
}
vm_page_unlock_queues();
+#if __FreeBSD_version >= 1000030
+ VM_OBJECT_WUNLOCK(pMemFreeBSD->pObject);
+#else
VM_OBJECT_UNLOCK(pMemFreeBSD->pObject);
+#endif
vm_object_deallocate(pMemFreeBSD->pObject);
break;
}
@@ -200,10 +208,18 @@ static vm_page_t rtR0MemObjFreeBSDContigPhysAllocHelper(vm_object_t pObject, vm_
while (cTries <= 1)
{
+#if __FreeBSD_version >= 1000030
+ VM_OBJECT_WLOCK(pObject);
+#else
VM_OBJECT_LOCK(pObject);
+#endif
pPages = vm_page_alloc_contig(pObject, iPIndex, fFlags, cPages, 0,
VmPhysAddrHigh, uAlignment, 0, VM_MEMATTR_DEFAULT);
+#if __FreeBSD_version >= 1000030
+ VM_OBJECT_WUNLOCK(pObject);
+#else
VM_OBJECT_UNLOCK(pObject);
+#endif
if (pPages)
break;
vm_pageout_grow_cache(cTries, 0, VmPhysAddrHigh);
@@ -223,7 +239,11 @@ static vm_page_t rtR0MemObjFreeBSDContigPhysAllocHelper(vm_object_t pObject, vm_
if (!pPages)
return pPages;
+#if __FreeBSD_version >= 1000030
+ VM_OBJECT_WLOCK(pObject);
+#else
VM_OBJECT_LOCK(pObject);
+#endif
for (vm_pindex_t iPage = 0; iPage < cPages; iPage++)
{
vm_page_t pPage = pPages + iPage;
@@ -235,7 +255,11 @@ static vm_page_t rtR0MemObjFreeBSDContigPhysAllocHelper(vm_object_t pObject, vm_
atomic_add_int(&cnt.v_wire_count, 1);
}
}
+#if __FreeBSD_version >= 1000030
+ VM_OBJECT_WUNLOCK(pObject);
+#else
VM_OBJECT_UNLOCK(pObject);
+#endif
return pPages;
#endif
}
@@ -259,7 +283,11 @@ static int rtR0MemObjFreeBSDPhysAllocHelper(vm_object_t pObject, u_long cPages,
if (!pPage)
{
/* Free all allocated pages */
+#if __FreeBSD_version >= 1000030
+ VM_OBJECT_WLOCK(pObject);
+#else
VM_OBJECT_LOCK(pObject);
+#endif
while (iPage-- > 0)
{
pPage = vm_page_lookup(pObject, iPage);
@@ -269,7 +297,11 @@ static int rtR0MemObjFreeBSDPhysAllocHelper(vm_object_t pObject, u_long cPages,
vm_page_free(pPage);
vm_page_unlock_queues();
}
+#if __FreeBSD_version >= 1000030
+ VM_OBJECT_WUNLOCK(pObject);
+#else
VM_OBJECT_UNLOCK(pObject);
+#endif
return rcNoMem;
}
}
@@ -286,9 +318,15 @@ static int rtR0MemObjFreeBSDAllocHelper(PRTR0MEMOBJFREEBSD pMemFreeBSD, bool fEx
pMemFreeBSD->pObject = vm_object_allocate(OBJT_PHYS, cPages);
/* No additional object reference for auto-deallocation upon unmapping. */
+#if __FreeBSD_version >= 1000055
+ rc = vm_map_find(kernel_map, pMemFreeBSD->pObject, 0,
+ &MapAddress, pMemFreeBSD->Core.cb, 0, VMFS_ANY_SPACE,
+ fExecutable ? VM_PROT_ALL : VM_PROT_RW, VM_PROT_ALL, 0);
+#else
rc = vm_map_find(kernel_map, pMemFreeBSD->pObject, 0,
&MapAddress, pMemFreeBSD->Core.cb, VMFS_ANY_SPACE,
fExecutable ? VM_PROT_ALL : VM_PROT_RW, VM_PROT_ALL, 0);
+#endif
if (rc == KERN_SUCCESS)
{
@@ -402,9 +440,17 @@ static int rtR0MemObjFreeBSDAllocPhysPages(PPRTR0MEMOBJINTERNAL ppMem, RTR0MEMOB
if (fContiguous)
{
Assert(enmType == RTR0MEMOBJTYPE_PHYS);
+#if __FreeBSD_version >= 1000030
+ VM_OBJECT_WLOCK(pMemFreeBSD->pObject);
+#else
VM_OBJECT_LOCK(pMemFreeBSD->pObject);
+#endif
pMemFreeBSD->Core.u.Phys.PhysBase = VM_PAGE_TO_PHYS(vm_page_find_least(pMemFreeBSD->pObject, 0));
+#if __FreeBSD_version >= 1000030
+ VM_OBJECT_WUNLOCK(pMemFreeBSD->pObject);
+#else
VM_OBJECT_UNLOCK(pMemFreeBSD->pObject);
+#endif
pMemFreeBSD->Core.u.Phys.fAllocated = true;
}
@@ -551,6 +597,9 @@ static int rtR0MemObjNativeReserveInMap(PPRTR0MEMOBJINTERNAL ppMem, void *pvFixe
0, /* offset */
&MapAddress, /* addr (IN/OUT) */
cb, /* length */
+#if __FreeBSD_version >= 1000055
+ 0, /* max addr */
+#endif
pvFixed == (void *)-1 ? VMFS_ANY_SPACE : VMFS_NO_SPACE,
/* find_space */
VM_PROT_NONE, /* protection */
@@ -628,6 +677,9 @@ DECLHIDDEN(int) rtR0MemObjNativeMapKernel(PPRTR0MEMOBJINTERNAL ppMem, RTR0MEMOBJ
offSub, /* Start offset in the object */
&Addr, /* Start address IN/OUT */
cbSub, /* Size of the mapping */
+#if __FreeBSD_version >= 1000055
+ 0, /* Upper bound of mapping */
+#endif
VMFS_ANY_SPACE, /* Whether a suitable address should be searched for first */
ProtectionFlags, /* protection flags */
VM_PROT_ALL, /* Maximum protection flags */
@@ -704,6 +756,9 @@ DECLHIDDEN(int) rtR0MemObjNativeMapUser(PPRTR0MEMOBJINTERNAL ppMem, RTR0MEMOBJ p
0, /* Start offset in the object */
&AddrR3, /* Start address IN/OUT */
pMemToMap->cb, /* Size of the mapping */
+#if __FreeBSD_version >= 1000055
+ 0, /* Upper bound of the mapping */
+#endif
R3PtrFixed == (RTR3PTR)-1 ? VMFS_ANY_SPACE : VMFS_NO_SPACE,
/* Whether a suitable address should be searched for first */
ProtectionFlags, /* protection flags */
@@ -814,9 +869,17 @@ DECLHIDDEN(RTHCPHYS) rtR0MemObjNativeGetPagePhysAddr(PRTR0MEMOBJINTERNAL pMem, s
case RTR0MEMOBJTYPE_PHYS_NC:
{
RTHCPHYS addr;
+#if __FreeBSD_version >= 1000030
+ VM_OBJECT_WLOCK(pMemFreeBSD->pObject);
+#else
VM_OBJECT_LOCK(pMemFreeBSD->pObject);
+#endif
addr = VM_PAGE_TO_PHYS(vm_page_lookup(pMemFreeBSD->pObject, iPage));
+#if __FreeBSD_version >= 1000030
+ VM_OBJECT_WUNLOCK(pMemFreeBSD->pObject);
+#else
VM_OBJECT_UNLOCK(pMemFreeBSD->pObject);
+#endif
return addr;
}
diff --git a/src/VBox/Runtime/r0drv/freebsd/mp-r0drv-freebsd.c b/src/VBox/Runtime/r0drv/freebsd/mp-r0drv-freebsd.c
index e696143..a38e78a 100644
--- a/src/VBox/Runtime/r0drv/freebsd/mp-r0drv-freebsd.c
+++ b/src/VBox/Runtime/r0drv/freebsd/mp-r0drv-freebsd.c
@@ -88,6 +88,11 @@ RTDECL(RTCPUID) RTMpGetCount(void)
}
+RTDECL(RTCPUID) RTMpGetCoreCount(void)
+{
+ return mp_maxid + 1;
+}
+
RTDECL(bool) RTMpIsCpuOnline(RTCPUID idCpu)
{
return idCpu <= mp_maxid
diff --git a/src/VBox/Runtime/r0drv/freebsd/the-freebsd-kernel.h b/src/VBox/Runtime/r0drv/freebsd/the-freebsd-kernel.h
index f6a8cdb..306bb3a 100644
--- a/src/VBox/Runtime/r0drv/freebsd/the-freebsd-kernel.h
+++ b/src/VBox/Runtime/r0drv/freebsd/the-freebsd-kernel.h
@@ -50,6 +50,9 @@
#include <sys/unistd.h>
#include <sys/kthread.h>
#include <sys/lock.h>
+#if __FreeBSD_version >= 1000030
+#include <sys/rwlock.h>
+#endif
#include <sys/mutex.h>
#include <sys/sched.h>
#include <sys/callout.h>
diff --git a/src/VBox/Runtime/r0drv/linux/memobj-r0drv-linux.c b/src/VBox/Runtime/r0drv/linux/memobj-r0drv-linux.c
index aa1f4b3..6bf3c20 100644
--- a/src/VBox/Runtime/r0drv/linux/memobj-r0drv-linux.c
+++ b/src/VBox/Runtime/r0drv/linux/memobj-r0drv-linux.c
@@ -1,4 +1,4 @@
-/* $Revision: 89632 $ */
+/* $Revision: 90895 $ */
/** @file
* IPRT - Ring-0 Memory Objects, Linux.
*/
@@ -1533,10 +1533,14 @@ DECLHIDDEN(int) rtR0MemObjNativeMapUser(PPRTR0MEMOBJINTERNAL ppMem, RTR0MEMOBJ p
/** @todo Ugly hack! But right now we have no other means to disable
* automatic NUMA page balancing. */
# ifdef RT_OS_X86
+# if LINUX_VERSION_CODE < KERNEL_VERSION(3, 13, 0)
pTask->mm->numa_next_reset = jiffies + 0x7fffffffUL;
+# endif
pTask->mm->numa_next_scan = jiffies + 0x7fffffffUL;
# else
+# if LINUX_VERSION_CODE < KERNEL_VERSION(3, 13, 0)
pTask->mm->numa_next_reset = jiffies + 0x7fffffffffffffffUL;
+# endif
pTask->mm->numa_next_scan = jiffies + 0x7fffffffffffffffUL;
# endif
}
diff --git a/src/VBox/Runtime/r3/posix/process-creation-posix.cpp b/src/VBox/Runtime/r3/posix/process-creation-posix.cpp
index acffd11..4fd2d0e 100644
--- a/src/VBox/Runtime/r3/posix/process-creation-posix.cpp
+++ b/src/VBox/Runtime/r3/posix/process-creation-posix.cpp
@@ -39,6 +39,7 @@
#include <sys/wait.h>
#include <fcntl.h>
#include <signal.h>
+#include <grp.h>
#if defined(RT_OS_LINUX) || defined(RT_OS_SOLARIS)
# include <crypt.h>
# include <pwd.h>
@@ -585,6 +586,17 @@ RTR3DECL(int) RTProcCreateEx(const char *pszExec, const char * const *papszArg
* Change group and user if requested.
*/
#if 1 /** @todo This needs more work, see suplib/hardening. */
+ if (pszAsUser)
+ {
+ int ret = initgroups(pszAsUser, gid);
+ if (ret)
+ {
+ if (fFlags & RTPROC_FLAGS_DETACHED)
+ _Exit(126);
+ else
+ exit(126);
+ }
+ }
if (gid != ~(gid_t)0)
{
if (setgid(gid))
diff --git a/src/VBox/Runtime/testcase/Makefile.kmk b/src/VBox/Runtime/testcase/Makefile.kmk
index 6be365d..3ceb9f0 100644
--- a/src/VBox/Runtime/testcase/Makefile.kmk
+++ b/src/VBox/Runtime/testcase/Makefile.kmk
@@ -66,7 +66,6 @@ PROGRAMS += \
tstRTFileModeStringToFlags \
tstFileLock \
tstFork \
- tstRTHttp \
tstRTFsQueries \
tstRTFilesystem \
tstRTGetOpt \
@@ -156,6 +155,7 @@ PROGRAMS.darwin += \
tstRTDarwinMachKernel
ifdef VBOX_WITH_LIBCURL
PROGRAMS += \
+ tstRTHttp \
tstRTS3
endif
if1of ($(KBUILD_TARGET_ARCH), amd64 x86)
diff --git a/src/VBox/Storage/ISCSI.cpp b/src/VBox/Storage/ISCSI.cpp
index 986ece6..2ed7f4f 100644
--- a/src/VBox/Storage/ISCSI.cpp
+++ b/src/VBox/Storage/ISCSI.cpp
@@ -4069,7 +4069,6 @@ static int iscsiOpenImage(PISCSIIMAGE pImage, unsigned uOpenFlags)
SCSIREQ sr;
RTSGSEG DataSeg;
- uint8_t sense[96];
uint8_t data8[8];
uint8_t data12[12];
@@ -4458,7 +4457,7 @@ return the status of target and will clear any unit attention condition that it
/* Log failures but continue. */
LogRel(("iSCSI: Could not enable read and write cache of target %s, rc=%Rrc status=%#x\n",
pImage->pszTargetName, rc, sr.status));
- LogRel(("iSCSI: Sense:\n%.*Rhxd\n", sr.cbSense, sense));
+ LogRel(("iSCSI: Sense:\n%.*Rhxd\n", sr.cbSense, sr.abSense));
rc = VINF_SUCCESS;
}
}
@@ -4466,8 +4465,8 @@ return the status of target and will clear any unit attention condition that it
else
{
/* Log errors but continue. */
- LogRel(("iSCSI: Could not check write cache of target %s, rc=%Rrc, got mode page %#x\n", pImage->pszTargetName, rc,aCachingModePage[0] & 0x3f));
- LogRel(("iSCSI: Sense:\n%.*Rhxd\n", sr.cbSense, sense));
+ LogRel(("iSCSI: Could not check write cache of target %s, rc=%Rrc, got mode page %#x\n", pImage->pszTargetName, rc, aCachingModePage[0] & 0x3f));
+ LogRel(("iSCSI: Sense:\n%.*Rhxd\n", sr.cbSense, sr.abSense));
rc = VINF_SUCCESS;
}
diff --git a/src/VBox/Storage/VD.cpp b/src/VBox/Storage/VD.cpp
index 88cc0a1..1253599 100644
--- a/src/VBox/Storage/VD.cpp
+++ b/src/VBox/Storage/VD.cpp
@@ -2408,7 +2408,8 @@ static int vdWriteHelperOptimizedPreReadAsync(PVDIOCTX pIoCtx)
pIoCtx->fFlags |= VDIOCTX_FLAGS_ZERO_FREE_BLOCKS;
- if (pIoCtx->Req.Io.cbTransferLeft)
+ if ( pIoCtx->Req.Io.cbTransferLeft
+ && !pIoCtx->cDataTransfersPending)
rc = vdReadHelperAsync(pIoCtx);
if ( RT_SUCCESS(rc)
diff --git a/src/VBox/VMM/VMMAll/CPUMAllRegs.cpp b/src/VBox/VMM/VMMAll/CPUMAllRegs.cpp
index e70f404..9f43099 100644
--- a/src/VBox/VMM/VMMAll/CPUMAllRegs.cpp
+++ b/src/VBox/VMM/VMMAll/CPUMAllRegs.cpp
@@ -901,21 +901,14 @@ static int cpumQueryGuestMsrInt(PVMCPU pVCpu, uint32_t idMsr, uint64_t *puValue)
case MSR_IA32_APICBASE:
{
+ /* See @bugref{7097} comment 6. */
PVM pVM = pVCpu->CTX_SUFF(pVM);
- if ( ( pVM->cpum.s.aGuestCpuIdStd[0].eax >= 1 /* APIC Std feature */
- && (pVM->cpum.s.aGuestCpuIdStd[1].edx & X86_CPUID_FEATURE_EDX_APIC))
- || ( pVM->cpum.s.aGuestCpuIdExt[0].eax >= 0x80000001 /* APIC Ext feature (AMD) */
- && pVM->cpum.s.enmGuestCpuVendor == CPUMCPUVENDOR_AMD
- && (pVM->cpum.s.aGuestCpuIdExt[1].edx & X86_CPUID_AMD_FEATURE_EDX_APIC))
- || ( pVM->cpum.s.aGuestCpuIdStd[0].eax >= 1 /* x2APIC */
- && (pVM->cpum.s.aGuestCpuIdStd[1].ecx & X86_CPUID_FEATURE_ECX_X2APIC)))
- {
+ if (PDMHasApic(pVM))
*puValue = pVCpu->cpum.s.Guest.msrApicBase;
- }
else
{
- *puValue = 0;
rc = VERR_CPUM_RAISE_GP_0;
+ *puValue = 0;
}
break;
}
@@ -1124,6 +1117,8 @@ static int cpumQueryGuestMsrInt(PVMCPU pVCpu, uint32_t idMsr, uint64_t *puValue)
case MSR_P4_LASTBRANCH_1:
case MSR_P4_LASTBRANCH_2:
case MSR_P4_LASTBRANCH_3:
+ case 0x2c: /* accessed by some Intel driver but also read on
+ AMD systems */
*puValue = 0;
break;
@@ -1147,6 +1142,7 @@ static int cpumQueryGuestMsrInt(PVMCPU pVCpu, uint32_t idMsr, uint64_t *puValue)
case MSR_PKG_CST_CONFIG_CONTROL: /* Nahalem, Sandy Bridge */
case MSR_CORE_THREAD_COUNT: /* Apple queries this. */
case MSR_FLEX_RATIO: /* Apple queries this. */
+ case 0x1ad: /* MSR_TURBO_POWER_CURRENT_LIMIT */
*puValue = 0;
if (CPUMGetGuestCpuVendor(pVCpu->CTX_SUFF(pVM)) != CPUMCPUVENDOR_INTEL)
{
@@ -1213,6 +1209,7 @@ static int cpumQueryGuestMsrInt(PVMCPU pVCpu, uint32_t idMsr, uint64_t *puValue)
case 0xc001102a: /* quick fix for w2k8 + opposition. */
case 0xc0011004: /* quick fix for the opposition. */
case 0xc0011005: /* quick fix for the opposition. */
+ case 0xc0011023: /* quick fix for the opposition. */
case MSR_K7_EVNTSEL0: /* quick fix for the opposition. */
case MSR_K7_EVNTSEL1: /* quick fix for the opposition. */
case MSR_K7_EVNTSEL2: /* quick fix for the opposition. */
@@ -2803,9 +2800,11 @@ VMMDECL(bool) CPUMIsGuestInLongMode(PVMCPU pVCpu)
*/
VMMDECL(bool) CPUMIsGuestInPAEMode(PVMCPU pVCpu)
{
+ /* Intel mentions EFER.LMA and EFER.LME in different parts of their spec. We shall use EFER.LMA rather
+ than EFER.LME as it reflects if the CPU has entered paging with EFER.LME set. */
return (pVCpu->cpum.s.Guest.cr4 & X86_CR4_PAE)
&& (pVCpu->cpum.s.Guest.cr0 & X86_CR0_PG)
- && !(pVCpu->cpum.s.Guest.msrEFER & MSR_K6_EFER_LME);
+ && !(pVCpu->cpum.s.Guest.msrEFER & MSR_K6_EFER_LMA);
}
diff --git a/src/VBox/VMM/VMMAll/IEMAll.cpp b/src/VBox/VMM/VMMAll/IEMAll.cpp
index 26eb645..bb2df58 100644
--- a/src/VBox/VMM/VMMAll/IEMAll.cpp
+++ b/src/VBox/VMM/VMMAll/IEMAll.cpp
@@ -5411,7 +5411,7 @@ static int iemMemPageMap(PIEMCPU pIemCpu, RTGCPHYS GCPhysMem, uint32_t fAccess,
* regarding locking and unlocking needs to be struct. A couple of TLBs
* living in PGM, but with publicly accessible inlined access methods
* could perhaps be an even better solution. */
- int rc = PGMPhysIemGCPhys2Ptr(IEMCPU_TO_VM(pIemCpu),
+ int rc = PGMPhysIemGCPhys2Ptr(IEMCPU_TO_VM(pIemCpu), IEMCPU_TO_VMCPU(pIemCpu),
GCPhysMem,
RT_BOOL(fAccess & IEM_ACCESS_TYPE_WRITE),
pIemCpu->fBypassHandlers,
diff --git a/src/VBox/VMM/VMMAll/IEMAllCImpl.cpp.h b/src/VBox/VMM/VMMAll/IEMAllCImpl.cpp.h
index fad9934..1e6ac7b 100644
--- a/src/VBox/VMM/VMMAll/IEMAllCImpl.cpp.h
+++ b/src/VBox/VMM/VMMAll/IEMAllCImpl.cpp.h
@@ -5137,7 +5137,7 @@ IEM_CIMPL_DEF_0(iemCImpl_cpuid)
/**
* Implements 'AAD'.
*
- * @param enmEffOpSize The effective operand size.
+ * @param bImm The immediate operand.
*/
IEM_CIMPL_DEF_1(iemCImpl_aad, uint8_t, bImm)
{
@@ -5178,6 +5178,75 @@ IEM_CIMPL_DEF_1(iemCImpl_aam, uint8_t, bImm)
}
+/**
+ * Implements 'DAA'.
+ */
+IEM_CIMPL_DEF_0(iemCImpl_daa)
+{
+ PCPUMCTX pCtx = pIemCpu->CTX_SUFF(pCtx);
+
+ uint8_t const al = pCtx->al;
+ bool const fCarry = pCtx->eflags.Bits.u1CF;
+
+ if ( pCtx->eflags.Bits.u1AF
+ || (al & 0xf) >= 10)
+ {
+ pCtx->al = al + 6;
+ pCtx->eflags.Bits.u1AF = 1;
+ }
+ else
+ pCtx->eflags.Bits.u1AF = 0;
+
+ if (al >= 0x9a || fCarry)
+ {
+ pCtx->al += 0x60;
+ pCtx->eflags.Bits.u1CF = 1;
+ }
+ else
+ pCtx->eflags.Bits.u1CF = 0;
+
+ iemHlpUpdateArithEFlagsU8(pIemCpu, pCtx->al, X86_EFL_SF | X86_EFL_ZF | X86_EFL_PF, X86_EFL_OF);
+ iemRegAddToRipAndClearRF(pIemCpu, cbInstr);
+ return VINF_SUCCESS;
+}
+
+
+/**
+ * Implements 'DAS'.
+ */
+IEM_CIMPL_DEF_0(iemCImpl_das)
+{
+ PCPUMCTX pCtx = pIemCpu->CTX_SUFF(pCtx);
+
+ uint8_t const uInputAL = pCtx->al;
+ bool const fCarry = pCtx->eflags.Bits.u1CF;
+
+ if ( pCtx->eflags.Bits.u1AF
+ || (uInputAL & 0xf) >= 10)
+ {
+ pCtx->eflags.Bits.u1AF = 1;
+ if (uInputAL < 6)
+ pCtx->eflags.Bits.u1CF = 1;
+ pCtx->al = uInputAL - 6;
+ }
+ else
+ {
+ pCtx->eflags.Bits.u1AF = 0;
+ pCtx->eflags.Bits.u1CF = 0;
+ }
+
+ if (uInputAL >= 0x9a || fCarry)
+ {
+ pCtx->al -= 0x60;
+ pCtx->eflags.Bits.u1CF = 1;
+ }
+
+ iemHlpUpdateArithEFlagsU8(pIemCpu, pCtx->al, X86_EFL_SF | X86_EFL_ZF | X86_EFL_PF, X86_EFL_OF);
+ iemRegAddToRipAndClearRF(pIemCpu, cbInstr);
+ return VINF_SUCCESS;
+}
+
+
/*
diff --git a/src/VBox/VMM/VMMAll/IEMAllInstructions.cpp.h b/src/VBox/VMM/VMMAll/IEMAllInstructions.cpp.h
index 1e8493e..3e6fcfb 100644
--- a/src/VBox/VMM/VMMAll/IEMAllInstructions.cpp.h
+++ b/src/VBox/VMM/VMMAll/IEMAllInstructions.cpp.h
@@ -785,11 +785,12 @@ FNIEMOP_DEF_1(iemOp_Grp7_sgdt, uint8_t, bRm)
IEMOP_MNEMONIC("sgdt Ms");
IEMOP_HLP_64BIT_OP_SIZE();
IEM_MC_BEGIN(3, 1);
- IEM_MC_ARG_CONST(uint8_t, iEffSeg, /*=*/pIemCpu->iEffSeg, 0);
+ IEM_MC_ARG(uint8_t, iEffSeg, 0);
IEM_MC_ARG(RTGCPTR, GCPtrEffSrc, 1);
IEM_MC_ARG_CONST(IEMMODE, enmEffOpSizeArg,/*=*/pIemCpu->enmEffOpSize, 2);
IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
+ IEM_MC_ASSIGN(iEffSeg, pIemCpu->iEffSeg);
IEM_MC_CALL_CIMPL_3(iemCImpl_sgdt, iEffSeg, GCPtrEffSrc, enmEffOpSizeArg);
IEM_MC_END();
return VINF_SUCCESS;
@@ -834,11 +835,12 @@ FNIEMOP_DEF_1(iemOp_Grp7_sidt, uint8_t, bRm)
IEMOP_MNEMONIC("sidt Ms");
IEMOP_HLP_64BIT_OP_SIZE();
IEM_MC_BEGIN(3, 1);
- IEM_MC_ARG_CONST(uint8_t, iEffSeg, /*=*/pIemCpu->iEffSeg, 0);
+ IEM_MC_ARG(uint8_t, iEffSeg, 0);
IEM_MC_ARG(RTGCPTR, GCPtrEffSrc, 1);
IEM_MC_ARG_CONST(IEMMODE, enmEffOpSizeArg,/*=*/pIemCpu->enmEffOpSize, 2);
IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
+ IEM_MC_ASSIGN(iEffSeg, pIemCpu->iEffSeg);
IEM_MC_CALL_CIMPL_3(iemCImpl_sidt, iEffSeg, GCPtrEffSrc, enmEffOpSizeArg);
IEM_MC_END();
return VINF_SUCCESS;
@@ -867,14 +869,14 @@ FNIEMOP_DEF(iemOp_Grp7_mwait)
FNIEMOP_DEF_1(iemOp_Grp7_lgdt, uint8_t, bRm)
{
IEMOP_MNEMONIC("lgdt");
- IEMOP_HLP_NO_LOCK_PREFIX();
-
IEMOP_HLP_64BIT_OP_SIZE();
IEM_MC_BEGIN(3, 1);
- IEM_MC_ARG_CONST(uint8_t, iEffSeg, /*=*/pIemCpu->iEffSeg, 0);
+ IEM_MC_ARG(uint8_t, iEffSeg, 0);
IEM_MC_ARG(RTGCPTR, GCPtrEffSrc, 1);
IEM_MC_ARG_CONST(IEMMODE, enmEffOpSizeArg,/*=*/pIemCpu->enmEffOpSize, 2);
IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
+ IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
+ IEM_MC_ASSIGN(iEffSeg, pIemCpu->iEffSeg);
IEM_MC_CALL_CIMPL_3(iemCImpl_lgdt, iEffSeg, GCPtrEffSrc, enmEffOpSizeArg);
IEM_MC_END();
return VINF_SUCCESS;
@@ -900,16 +902,16 @@ FNIEMOP_DEF(iemOp_Grp7_xsetbv)
/** Opcode 0x0f 0x01 /3. */
FNIEMOP_DEF_1(iemOp_Grp7_lidt, uint8_t, bRm)
{
- IEMOP_HLP_NO_LOCK_PREFIX();
-
IEMMODE enmEffOpSize = pIemCpu->enmCpuMode == IEMMODE_64BIT
? IEMMODE_64BIT
: pIemCpu->enmEffOpSize;
IEM_MC_BEGIN(3, 1);
- IEM_MC_ARG_CONST(uint8_t, iEffSeg, /*=*/pIemCpu->iEffSeg, 0);
+ IEM_MC_ARG(uint8_t, iEffSeg, 0);
IEM_MC_ARG(RTGCPTR, GCPtrEffSrc, 1);
IEM_MC_ARG_CONST(IEMMODE, enmEffOpSizeArg,/*=*/enmEffOpSize, 2);
IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
+ IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
+ IEM_MC_ASSIGN(iEffSeg, pIemCpu->iEffSeg);
IEM_MC_CALL_CIMPL_3(iemCImpl_lidt, iEffSeg, GCPtrEffSrc, enmEffOpSizeArg);
IEM_MC_END();
return VINF_SUCCESS;
@@ -4918,15 +4920,16 @@ FNIEMOP_DEF(iemOp_shrd_Ev_Gv_CL)
FNIEMOP_DEF_1(iemOp_Grp15_fxsave, uint8_t, bRm)
{
IEMOP_MNEMONIC("fxsave m512");
- IEMOP_HLP_NO_LOCK_PREFIX();
if (!IEM_IS_INTEL_CPUID_FEATURE_PRESENT_EDX(X86_CPUID_FEATURE_EDX_FXSR))
return IEMOP_RAISE_INVALID_OPCODE();
IEM_MC_BEGIN(3, 1);
- IEM_MC_ARG_CONST(uint8_t, iEffSeg,/*=*/pIemCpu->iEffSeg, 0);
+ IEM_MC_ARG(uint8_t, iEffSeg, 0);
IEM_MC_ARG(RTGCPTR, GCPtrEff, 1);
IEM_MC_ARG_CONST(IEMMODE, enmEffOpSize,/*=*/pIemCpu->enmEffOpSize, 2);
IEM_MC_CALC_RM_EFF_ADDR(GCPtrEff, bRm, 0);
+ IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
+ IEM_MC_ASSIGN(iEffSeg, pIemCpu->iEffSeg);
IEM_MC_CALL_CIMPL_3(iemCImpl_fxsave, iEffSeg, GCPtrEff, enmEffOpSize);
IEM_MC_END();
return VINF_SUCCESS;
@@ -4937,15 +4940,16 @@ FNIEMOP_DEF_1(iemOp_Grp15_fxsave, uint8_t, bRm)
FNIEMOP_DEF_1(iemOp_Grp15_fxrstor, uint8_t, bRm)
{
IEMOP_MNEMONIC("fxrstor m512");
- IEMOP_HLP_NO_LOCK_PREFIX();
if (!IEM_IS_INTEL_CPUID_FEATURE_PRESENT_EDX(X86_CPUID_FEATURE_EDX_FXSR))
return IEMOP_RAISE_INVALID_OPCODE();
IEM_MC_BEGIN(3, 1);
- IEM_MC_ARG_CONST(uint8_t, iEffSeg,/*=*/pIemCpu->iEffSeg, 0);
+ IEM_MC_ARG(uint8_t, iEffSeg, 0);
IEM_MC_ARG(RTGCPTR, GCPtrEff, 1);
IEM_MC_ARG_CONST(IEMMODE, enmEffOpSize,/*=*/pIemCpu->enmEffOpSize, 2);
IEM_MC_CALC_RM_EFF_ADDR(GCPtrEff, bRm, 0);
+ IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
+ IEM_MC_ASSIGN(iEffSeg, pIemCpu->iEffSeg);
IEM_MC_CALL_CIMPL_3(iemCImpl_fxrstor, iEffSeg, GCPtrEff, enmEffOpSize);
IEM_MC_END();
return VINF_SUCCESS;
@@ -7184,7 +7188,14 @@ FNIEMOP_DEF(iemOp_seg_ES)
/** Opcode 0x27. */
-FNIEMOP_STUB(iemOp_daa);
+FNIEMOP_DEF(iemOp_daa)
+{
+ IEMOP_MNEMONIC("daa AL");
+ IEMOP_HLP_NO_64BIT();
+ IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
+ IEMOP_VERIFICATION_UNDEFINED_EFLAGS(X86_EFL_OF);
+ return IEM_MC_DEFER_TO_CIMPL_0(iemCImpl_daa);
+}
/** Opcode 0x28. */
@@ -7248,7 +7259,14 @@ FNIEMOP_DEF(iemOp_seg_CS)
/** Opcode 0x2f. */
-FNIEMOP_STUB(iemOp_das);
+FNIEMOP_DEF(iemOp_das)
+{
+ IEMOP_MNEMONIC("das AL");
+ IEMOP_HLP_NO_64BIT();
+ IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
+ IEMOP_VERIFICATION_UNDEFINED_EFLAGS(X86_EFL_OF);
+ return IEM_MC_DEFER_TO_CIMPL_0(iemCImpl_das);
+}
/** Opcode 0x30. */
@@ -13106,11 +13124,12 @@ FNIEMOP_DEF_1(iemOp_fldenv, uint8_t, bRm)
IEMOP_MNEMONIC("fldenv m14/28byte");
IEM_MC_BEGIN(3, 0);
IEM_MC_ARG_CONST(IEMMODE, enmEffOpSize, /*=*/ pIemCpu->enmEffOpSize, 0);
- IEM_MC_ARG_CONST(uint8_t, iEffSeg, /*=*/ pIemCpu->iEffSeg, 1);
+ IEM_MC_ARG(uint8_t, iEffSeg, 1);
IEM_MC_ARG(RTGCPTR, GCPtrEffSrc, 2);
IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
IEM_MC_MAYBE_RAISE_DEVICE_NOT_AVAILABLE();
+ IEM_MC_ASSIGN(iEffSeg, pIemCpu->iEffSeg);
IEM_MC_CALL_CIMPL_3(iemCImpl_fldenv, enmEffOpSize, iEffSeg, GCPtrEffSrc);
IEM_MC_END();
return VINF_SUCCESS;
@@ -13140,11 +13159,12 @@ FNIEMOP_DEF_1(iemOp_fnstenv, uint8_t, bRm)
IEMOP_MNEMONIC("fstenv m14/m28byte");
IEM_MC_BEGIN(3, 0);
IEM_MC_ARG_CONST(IEMMODE, enmEffOpSize, /*=*/ pIemCpu->enmEffOpSize, 0);
- IEM_MC_ARG_CONST(uint8_t, iEffSeg, /*=*/ pIemCpu->iEffSeg, 1);
+ IEM_MC_ARG(uint8_t, iEffSeg, 1);
IEM_MC_ARG(RTGCPTR, GCPtrEffDst, 2);
IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0);
IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
IEM_MC_MAYBE_RAISE_DEVICE_NOT_AVAILABLE();
+ IEM_MC_ASSIGN(iEffSeg, pIemCpu->iEffSeg);
IEM_MC_CALL_CIMPL_3(iemCImpl_fnstenv, enmEffOpSize, iEffSeg, GCPtrEffDst);
IEM_MC_END();
return VINF_SUCCESS;
@@ -15002,14 +15022,15 @@ FNIEMOP_DEF_1(iemOp_fstp_m64r, uint8_t, bRm)
/** Opcode 0xdd !11/0. */
FNIEMOP_DEF_1(iemOp_frstor, uint8_t, bRm)
{
- IEMOP_MNEMONIC("fxrstor m94/108byte");
+ IEMOP_MNEMONIC("frstor m94/108byte");
IEM_MC_BEGIN(3, 0);
IEM_MC_ARG_CONST(IEMMODE, enmEffOpSize, /*=*/ pIemCpu->enmEffOpSize, 0);
- IEM_MC_ARG_CONST(uint8_t, iEffSeg, /*=*/ pIemCpu->iEffSeg, 1);
+ IEM_MC_ARG(uint8_t, iEffSeg, 1);
IEM_MC_ARG(RTGCPTR, GCPtrEffSrc, 2);
IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
IEM_MC_MAYBE_RAISE_DEVICE_NOT_AVAILABLE();
+ IEM_MC_ASSIGN(iEffSeg, pIemCpu->iEffSeg);
IEM_MC_CALL_CIMPL_3(iemCImpl_frstor, enmEffOpSize, iEffSeg, GCPtrEffSrc);
IEM_MC_END();
return VINF_SUCCESS;
@@ -15022,11 +15043,12 @@ FNIEMOP_DEF_1(iemOp_fnsave, uint8_t, bRm)
IEMOP_MNEMONIC("fnsave m94/108byte");
IEM_MC_BEGIN(3, 0);
IEM_MC_ARG_CONST(IEMMODE, enmEffOpSize, /*=*/ pIemCpu->enmEffOpSize, 0);
- IEM_MC_ARG_CONST(uint8_t, iEffSeg, /*=*/ pIemCpu->iEffSeg, 1);
+ IEM_MC_ARG(uint8_t, iEffSeg, 1);
IEM_MC_ARG(RTGCPTR, GCPtrEffDst, 2);
IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0);
IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
IEM_MC_MAYBE_RAISE_DEVICE_NOT_AVAILABLE();
+ IEM_MC_ASSIGN(iEffSeg, pIemCpu->iEffSeg);
IEM_MC_CALL_CIMPL_3(iemCImpl_fnsave, enmEffOpSize, iEffSeg, GCPtrEffDst);
IEM_MC_END();
return VINF_SUCCESS;
diff --git a/src/VBox/VMM/VMMAll/PDMAll.cpp b/src/VBox/VMM/VMMAll/PDMAll.cpp
index dc22a79..29eefb9 100644
--- a/src/VBox/VMM/VMMAll/PDMAll.cpp
+++ b/src/VBox/VMM/VMMAll/PDMAll.cpp
@@ -199,9 +199,9 @@ VMM_INT_DECL(int) PDMIoApicSendMsi(PVM pVM, RTGCPHYS GCAddr, uint32_t uValue, ui
/**
- * Returns presence of an IO-APIC
+ * Returns the presence of an IO-APIC.
*
- * @returns VBox true if IO-APIC is present
+ * @returns VBox true if an IO-APIC is present.
* @param pVM Pointer to the VM.
*/
VMM_INT_DECL(bool) PDMHasIoApic(PVM pVM)
@@ -211,6 +211,18 @@ VMM_INT_DECL(bool) PDMHasIoApic(PVM pVM)
/**
+ * Returns the presence of a Local APIC.
+ *
+ * @returns VBox true if a Local APIC is present.
+ * @param pVM Pointer to the VM.
+ */
+VMM_INT_DECL(bool) PDMHasApic(PVM pVM)
+{
+ return pVM->pdm.s.Apic.CTX_SUFF(pDevIns) != NULL;
+}
+
+
+/**
* Set the APIC base.
*
* @returns VBox status code.
diff --git a/src/VBox/VMM/VMMAll/PGMAllPhys.cpp b/src/VBox/VMM/VMMAll/PGMAllPhys.cpp
index e56ff67..9d6c7f9 100644
--- a/src/VBox/VMM/VMMAll/PGMAllPhys.cpp
+++ b/src/VBox/VMM/VMMAll/PGMAllPhys.cpp
@@ -4024,22 +4024,25 @@ VMMDECL(PGMPAGETYPE) PGMPhysGetPageType(PVM pVM, RTGCPHYS GCPhys)
* accesses or is odd in any way.
* @retval VERR_PGM_PHYS_TLB_UNASSIGNED if the page doesn't exist.
*
- * @param pVM Pointer to the VM.
- * @param GCPhys The GC physical address to convert. Since this is only
- * used for filling the REM TLB, the A20 mask must be
- * applied before calling this API.
+ * @param pVM Pointer to the cross context VM structure.
+ * @param pVCpu Pointer to the cross context virtual CPU structure of
+ * the calling EMT.
+ * @param GCPhys The GC physical address to convert. This API mask the
+ * A20 line when necessary.
* @param fWritable Whether write access is required.
* @param ppv Where to store the pointer corresponding to GCPhys on
* success.
* @param pLock
*
* @remarks This is more or a less a copy of PGMR3PhysTlbGCPhys2Ptr.
+ * @thread EMT(pVCpu).
*/
-VMM_INT_DECL(int) PGMPhysIemGCPhys2Ptr(PVM pVM, RTGCPHYS GCPhys, bool fWritable, bool fByPassHandlers,
+VMM_INT_DECL(int) PGMPhysIemGCPhys2Ptr(PVM pVM, PVMCPU pVCpu, RTGCPHYS GCPhys, bool fWritable, bool fByPassHandlers,
void **ppv, PPGMPAGEMAPLOCK pLock)
{
+ PGM_A20_APPLY_TO_VAR(pVCpu, GCPhys);
+
pgmLock(pVM);
- PGM_A20_ASSERT_MASKED(VMMGetCpu(pVM), GCPhys);
PPGMRAMRANGE pRam;
PPGMPAGE pPage;
@@ -4087,7 +4090,6 @@ VMM_INT_DECL(int) PGMPhysIemGCPhys2Ptr(PVM pVM, RTGCPHYS GCPhys, bool fWritable,
}
#if defined(IN_RC) || defined(VBOX_WITH_2X_4GB_ADDR_SPACE_IN_R0)
- PVMCPU pVCpu = VMMGetCpu(pVM);
void *pv;
rc = pgmRZDynMapHCPageInlined(pVCpu,
PGM_PAGE_GET_HCPHYS(pPage),
diff --git a/src/VBox/VMM/VMMR0/GMMR0.cpp b/src/VBox/VMM/VMMR0/GMMR0.cpp
index 6c8ff4f..aa0cd61 100644
--- a/src/VBox/VMM/VMMR0/GMMR0.cpp
+++ b/src/VBox/VMM/VMMR0/GMMR0.cpp
@@ -5152,7 +5152,7 @@ GMMR0DECL(int) GMMR0CheckSharedModules(PVM pVM, PVMCPU pVCpu)
Args.idCpu = pVCpu->idCpu;
rc = RTAvlGCPtrDoWithAll(&pGVM->gmm.s.pSharedModuleTree, true /* fFromLeft */, gmmR0CheckSharedModule, &Args);
- Log(("GMMR0CheckSharedModules done!\n"));
+ Log(("GMMR0CheckSharedModules done (rc=%Rrc)!\n", rc));
GMM_CHECK_SANITY_UPON_LEAVING(pGMM);
}
else
diff --git a/src/VBox/VMM/VMMR0/HMR0.cpp b/src/VBox/VMM/VMMR0/HMR0.cpp
index 567ad0c..169e32b 100644
--- a/src/VBox/VMM/VMMR0/HMR0.cpp
+++ b/src/VBox/VMM/VMMR0/HMR0.cpp
@@ -919,8 +919,7 @@ static int hmR0EnableCpu(PVM pVM, RTCPUID idCpu)
Assert(idCpu < RT_ELEMENTS(g_HvmR0.aCpuInfo));
Assert(!pCpu->fConfigured);
- pCpu->idCpu = idCpu;
- pCpu->uCurrentAsid = 0; /* we'll aways increment this the first time (host uses ASID 0) */
+ pCpu->idCpu = idCpu;
/* Do NOT reset cTlbFlushes here, see @bugref{6255}. */
int rc;
@@ -957,6 +956,7 @@ static DECLCALLBACK(void) hmR0EnableCpuCallback(RTCPUID idCpu, void *pvUser1, vo
PVM pVM = (PVM)pvUser1; /* can be NULL! */
PHMR0FIRSTRC pFirstRc = (PHMR0FIRSTRC)pvUser2;
AssertReturnVoid(g_HvmR0.fGlobalInit);
+ Assert(!RTThreadPreemptIsEnabled(NIL_RTTHREAD));
hmR0FirstRcSetStatus(pFirstRc, hmR0EnableCpu(pVM, idCpu));
}
@@ -986,13 +986,15 @@ static DECLCALLBACK(int32_t) hmR0EnableAllCpuOnce(void *pvUser)
*/
g_HvmR0.fGlobalInit = pVM->hm.s.fGlobalInit;
+#ifdef VBOX_STRICT
for (unsigned i = 0; i < RT_ELEMENTS(g_HvmR0.aCpuInfo); i++)
{
Assert(g_HvmR0.aCpuInfo[i].hMemObj == NIL_RTR0MEMOBJ);
- g_HvmR0.aCpuInfo[i].fConfigured = false;
- g_HvmR0.aCpuInfo[i].cTlbFlushes = 0;
- g_HvmR0.aCpuInfo[i].uCurrentAsid = 0;
+ Assert(!g_HvmR0.aCpuInfo[i].fConfigured);
+ Assert(!g_HvmR0.aCpuInfo[i].cTlbFlushes);
+ Assert(!g_HvmR0.aCpuInfo[i].uCurrentAsid);
}
+#endif
int rc;
if ( g_HvmR0.vmx.fSupported
@@ -1099,7 +1101,6 @@ static int hmR0DisableCpu(RTCPUID idCpu)
else
rc = VINF_SUCCESS; /* nothing to do */
- pCpu->uCurrentAsid = 0;
return rc;
}
@@ -1332,7 +1333,7 @@ VMMR0_INT_DECL(int) HMR0SetupVM(PVM pVM)
/* On first entry we'll sync everything. */
for (VMCPUID i = 0; i < pVM->cCpus; i++)
- VMCPU_HMCF_RESET_TO(&pVM->aCpus[i], HM_CHANGED_HOST_CONTEXT | HM_CHANGED_ALL_GUEST);
+ HMCPU_CF_RESET_TO(&pVM->aCpus[i], HM_CHANGED_HOST_CONTEXT | HM_CHANGED_ALL_GUEST);
/*
* Call the hardware specific setup VM method. This requires the CPU to be
@@ -1389,7 +1390,7 @@ VMMR0_INT_DECL(int) HMR0EnterCpu(PVMCPU pVCpu)
rc = hmR0EnableCpu(pVCpu->CTX_SUFF(pVM), idCpu);
/* Reload host-context (back from ring-3/migrated CPUs), reload host context & shared bits. */
- VMCPU_HMCF_SET(pVCpu, HM_CHANGED_HOST_CONTEXT | HM_CHANGED_HOST_GUEST_SHARED_STATE);
+ HMCPU_CF_SET(pVCpu, HM_CHANGED_HOST_CONTEXT | HM_CHANGED_HOST_GUEST_SHARED_STATE);
pVCpu->hm.s.idEnteredCpu = idCpu;
return rc;
}
@@ -1424,7 +1425,7 @@ VMMR0_INT_DECL(int) HMR0Enter(PVM pVM, PVMCPU pVCpu)
PCPUMCTX pCtx = CPUMQueryGuestCtxPtr(pVCpu);
Assert(pCpu);
Assert(pCtx);
- Assert(VMCPU_HMCF_IS_SET(pVCpu, HM_CHANGED_HOST_CONTEXT | HM_CHANGED_HOST_GUEST_SHARED_STATE));
+ Assert(HMCPU_CF_IS_SET(pVCpu, HM_CHANGED_HOST_CONTEXT | HM_CHANGED_HOST_GUEST_SHARED_STATE));
rc = g_HvmR0.pfnEnterSession(pVM, pVCpu, pCpu);
AssertMsgRCReturn(rc, ("pfnEnterSession failed. rc=%Rrc pVCpu=%p HostCpuId=%u\n", rc, pVCpu, idCpu), rc);
diff --git a/src/VBox/VMM/VMMR0/HMSVMR0.cpp b/src/VBox/VMM/VMMR0/HMSVMR0.cpp
index d26fd48..c508ea7 100644
--- a/src/VBox/VMM/VMMR0/HMSVMR0.cpp
+++ b/src/VBox/VMM/VMMR0/HMSVMR0.cpp
@@ -137,7 +137,7 @@
/** @name VMCB Clean Bits.
*
- * These flags are used for VMCB-state caching. A set VMCB Clean Bit indicates
+ * These flags are used for VMCB-state caching. A set VMCB Clean bit indicates
* AMD-V doesn't need to reload the corresponding value(s) from the VMCB in
* memory.
*
@@ -750,6 +750,9 @@ VMMR0DECL(int) SVMR0SetupVM(PVM pVM)
*/
pVmcb->guest.u64GPAT = UINT64_C(0x0006060606060606);
+ /* Setup Nested Paging. This doesn't change throughout the execution time of the VM. */
+ pVmcb->ctrl.NestedPaging.n.u1NestedPaging = pVM->hm.s.fNestedPaging;
+
/* Without Nested Paging, we need additionally intercepts. */
if (!pVM->hm.s.fNestedPaging)
{
@@ -846,6 +849,7 @@ static void hmR0SvmFlushTaggedTlb(PVMCPU pVCpu)
* so we cannot reuse the ASIDs without flushing.
*/
bool fNewAsid = false;
+ Assert(pCpu->idCpu != NIL_RTCPUID);
if ( pVCpu->hm.s.idLastCpu != pCpu->idCpu
|| pVCpu->hm.s.cTlbFlushes != pCpu->cTlbFlushes)
{
@@ -864,7 +868,6 @@ static void hmR0SvmFlushTaggedTlb(PVMCPU pVCpu)
STAM_COUNTER_INC(&pVCpu->hm.s.StatFlushTlb);
}
- pVCpu->hm.s.idLastCpu = pCpu->idCpu;
pVmcb->ctrl.TLBCtrl.n.u8TLBFlush = SVM_TLB_FLUSH_NOTHING;
if (pVM->hm.s.svm.fAlwaysFlushTLB)
@@ -876,9 +879,15 @@ static void hmR0SvmFlushTaggedTlb(PVMCPU pVCpu)
pVCpu->hm.s.uCurrentAsid = 1;
pVCpu->hm.s.cTlbFlushes = pCpu->cTlbFlushes;
pVmcb->ctrl.TLBCtrl.n.u8TLBFlush = SVM_TLB_FLUSH_ENTIRE;
+
+ /* Clear the VMCB Clean Bit for NP while flushing the TLB. See @bugref{7152}. */
+ pVmcb->ctrl.u64VmcbCleanBits &= ~HMSVM_VMCB_CLEAN_NP;
}
else if (pVCpu->hm.s.fForceTLBFlush)
{
+ /* Clear the VMCB Clean Bit for NP while flushing the TLB. See @bugref{7152}. */
+ pVmcb->ctrl.u64VmcbCleanBits &= ~HMSVM_VMCB_CLEAN_NP;
+
if (fNewAsid)
{
++pCpu->uCurrentAsid;
@@ -914,6 +923,7 @@ static void hmR0SvmFlushTaggedTlb(PVMCPU pVCpu)
}
pVCpu->hm.s.uCurrentAsid = pCpu->uCurrentAsid;
+ pVCpu->hm.s.idLastCpu = pCpu->idCpu;
pVCpu->hm.s.cTlbFlushes = pCpu->cTlbFlushes;
}
else
@@ -953,6 +963,8 @@ static void hmR0SvmFlushTaggedTlb(PVMCPU pVCpu)
pVmcb->ctrl.u64VmcbCleanBits &= ~HMSVM_VMCB_CLEAN_ASID;
}
+ AssertMsg(pVCpu->hm.s.idLastCpu == pCpu->idCpu,
+ ("vcpu idLastCpu=%x pcpu idCpu=%x\n", pVCpu->hm.s.idLastCpu, pCpu->idCpu));
AssertMsg(pVCpu->hm.s.cTlbFlushes == pCpu->cTlbFlushes,
("Flush count mismatch for cpu %d (%x vs %x)\n", pCpu->idCpu, pVCpu->hm.s.cTlbFlushes, pCpu->cTlbFlushes));
AssertMsg(pCpu->uCurrentAsid >= 1 && pCpu->uCurrentAsid < pVM->hm.s.uMaxAsid,
@@ -1053,7 +1065,7 @@ VMMR0DECL(int) SVMR0Execute64BitsHandler(PVM pVM, PVMCPU pVCpu, PCPUMCTX pCtx, H
/**
* Adds an exception to the intercept exception bitmap in the VMCB and updates
- * the corresponding VMCB Clean Bit.
+ * the corresponding VMCB Clean bit.
*
* @param pVmcb Pointer to the VMCB.
* @param u32Xcpt The value of the exception (X86_XCPT_*).
@@ -1070,7 +1082,7 @@ DECLINLINE(void) hmR0SvmAddXcptIntercept(PSVMVMCB pVmcb, uint32_t u32Xcpt)
/**
* Removes an exception from the intercept-exception bitmap in the VMCB and
- * updates the corresponding VMCB Clean Bit.
+ * updates the corresponding VMCB Clean bit.
*
* @param pVmcb Pointer to the VMCB.
* @param u32Xcpt The value of the exception (X86_XCPT_*).
@@ -1105,7 +1117,7 @@ static void hmR0SvmLoadSharedCR0(PVMCPU pVCpu, PSVMVMCB pVmcb, PCPUMCTX pCtx)
* Guest CR0.
*/
PVM pVM = pVCpu->CTX_SUFF(pVM);
- if (VMCPU_HMCF_IS_PENDING(pVCpu, HM_CHANGED_GUEST_CR0))
+ if (HMCPU_CF_IS_PENDING(pVCpu, HM_CHANGED_GUEST_CR0))
{
uint64_t u64GuestCR0 = pCtx->cr0;
@@ -1158,7 +1170,7 @@ static void hmR0SvmLoadSharedCR0(PVMCPU pVCpu, PSVMVMCB pVmcb, PCPUMCTX pCtx)
pVmcb->guest.u64CR0 = u64GuestCR0;
pVmcb->ctrl.u64VmcbCleanBits &= ~HMSVM_VMCB_CLEAN_CRX_EFER;
- VMCPU_HMCF_CLEAR(pVCpu, HM_CHANGED_GUEST_CR0);
+ HMCPU_CF_CLEAR(pVCpu, HM_CHANGED_GUEST_CR0);
}
}
@@ -1180,17 +1192,17 @@ static int hmR0SvmLoadGuestControlRegs(PVMCPU pVCpu, PSVMVMCB pVmcb, PCPUMCTX pC
/*
* Guest CR2.
*/
- if (VMCPU_HMCF_IS_PENDING(pVCpu, HM_CHANGED_GUEST_CR2))
+ if (HMCPU_CF_IS_PENDING(pVCpu, HM_CHANGED_GUEST_CR2))
{
pVmcb->guest.u64CR2 = pCtx->cr2;
pVmcb->ctrl.u64VmcbCleanBits &= ~HMSVM_VMCB_CLEAN_CR2;
- VMCPU_HMCF_CLEAR(pVCpu, HM_CHANGED_GUEST_CR2);
+ HMCPU_CF_CLEAR(pVCpu, HM_CHANGED_GUEST_CR2);
}
/*
* Guest CR3.
*/
- if (VMCPU_HMCF_IS_PENDING(pVCpu, HM_CHANGED_GUEST_CR3))
+ if (HMCPU_CF_IS_PENDING(pVCpu, HM_CHANGED_GUEST_CR3))
{
if (pVM->hm.s.fNestedPaging)
{
@@ -1202,7 +1214,7 @@ static int hmR0SvmLoadGuestControlRegs(PVMCPU pVCpu, PSVMVMCB pVmcb, PCPUMCTX pC
#endif
enmShwPagingMode = PGMGetHostMode(pVM);
- pVmcb->ctrl.u64NestedPagingCR3 = PGMGetNestedCR3(pVCpu, enmShwPagingMode);
+ pVmcb->ctrl.u64NestedPagingCR3 = PGMGetNestedCR3(pVCpu, enmShwPagingMode);
pVmcb->ctrl.u64VmcbCleanBits &= ~HMSVM_VMCB_CLEAN_NP;
Assert(pVmcb->ctrl.u64NestedPagingCR3);
pVmcb->guest.u64CR3 = pCtx->cr3;
@@ -1211,13 +1223,13 @@ static int hmR0SvmLoadGuestControlRegs(PVMCPU pVCpu, PSVMVMCB pVmcb, PCPUMCTX pC
pVmcb->guest.u64CR3 = PGMGetHyperCR3(pVCpu);
pVmcb->ctrl.u64VmcbCleanBits &= ~HMSVM_VMCB_CLEAN_CRX_EFER;
- VMCPU_HMCF_CLEAR(pVCpu, HM_CHANGED_GUEST_CR3);
+ HMCPU_CF_CLEAR(pVCpu, HM_CHANGED_GUEST_CR3);
}
/*
* Guest CR4.
*/
- if (VMCPU_HMCF_IS_PENDING(pVCpu, HM_CHANGED_GUEST_CR4))
+ if (HMCPU_CF_IS_PENDING(pVCpu, HM_CHANGED_GUEST_CR4))
{
uint64_t u64GuestCR4 = pCtx->cr4;
if (!pVM->hm.s.fNestedPaging)
@@ -1256,7 +1268,7 @@ static int hmR0SvmLoadGuestControlRegs(PVMCPU pVCpu, PSVMVMCB pVmcb, PCPUMCTX pC
pVmcb->guest.u64CR4 = u64GuestCR4;
pVmcb->ctrl.u64VmcbCleanBits &= ~HMSVM_VMCB_CLEAN_CRX_EFER;
- VMCPU_HMCF_CLEAR(pVCpu, HM_CHANGED_GUEST_CR4);
+ HMCPU_CF_CLEAR(pVCpu, HM_CHANGED_GUEST_CR4);
}
return VINF_SUCCESS;
@@ -1276,7 +1288,7 @@ static int hmR0SvmLoadGuestControlRegs(PVMCPU pVCpu, PSVMVMCB pVmcb, PCPUMCTX pC
static void hmR0SvmLoadGuestSegmentRegs(PVMCPU pVCpu, PSVMVMCB pVmcb, PCPUMCTX pCtx)
{
/* Guest Segment registers: CS, SS, DS, ES, FS, GS. */
- if (VMCPU_HMCF_IS_PENDING(pVCpu, HM_CHANGED_GUEST_SEGMENT_REGS))
+ if (HMCPU_CF_IS_PENDING(pVCpu, HM_CHANGED_GUEST_SEGMENT_REGS))
{
HMSVM_LOAD_SEG_REG(CS, cs);
HMSVM_LOAD_SEG_REG(SS, ss);
@@ -1285,40 +1297,41 @@ static void hmR0SvmLoadGuestSegmentRegs(PVMCPU pVCpu, PSVMVMCB pVmcb, PCPUMCTX p
HMSVM_LOAD_SEG_REG(FS, fs);
HMSVM_LOAD_SEG_REG(GS, gs);
+ pVmcb->guest.u8CPL = pCtx->ss.Attr.n.u2Dpl;
pVmcb->ctrl.u64VmcbCleanBits &= ~HMSVM_VMCB_CLEAN_SEG;
- VMCPU_HMCF_CLEAR(pVCpu, HM_CHANGED_GUEST_SEGMENT_REGS);
+ HMCPU_CF_CLEAR(pVCpu, HM_CHANGED_GUEST_SEGMENT_REGS);
}
/* Guest TR. */
- if (VMCPU_HMCF_IS_PENDING(pVCpu, HM_CHANGED_GUEST_TR))
+ if (HMCPU_CF_IS_PENDING(pVCpu, HM_CHANGED_GUEST_TR))
{
HMSVM_LOAD_SEG_REG(TR, tr);
- VMCPU_HMCF_CLEAR(pVCpu, HM_CHANGED_GUEST_TR);
+ HMCPU_CF_CLEAR(pVCpu, HM_CHANGED_GUEST_TR);
}
/* Guest LDTR. */
- if (VMCPU_HMCF_IS_PENDING(pVCpu, HM_CHANGED_GUEST_LDTR))
+ if (HMCPU_CF_IS_PENDING(pVCpu, HM_CHANGED_GUEST_LDTR))
{
HMSVM_LOAD_SEG_REG(LDTR, ldtr);
- VMCPU_HMCF_CLEAR(pVCpu, HM_CHANGED_GUEST_LDTR);
+ HMCPU_CF_CLEAR(pVCpu, HM_CHANGED_GUEST_LDTR);
}
/* Guest GDTR. */
- if (VMCPU_HMCF_IS_PENDING(pVCpu, HM_CHANGED_GUEST_GDTR))
+ if (HMCPU_CF_IS_PENDING(pVCpu, HM_CHANGED_GUEST_GDTR))
{
pVmcb->guest.GDTR.u32Limit = pCtx->gdtr.cbGdt;
pVmcb->guest.GDTR.u64Base = pCtx->gdtr.pGdt;
pVmcb->ctrl.u64VmcbCleanBits &= ~HMSVM_VMCB_CLEAN_DT;
- VMCPU_HMCF_CLEAR(pVCpu, HM_CHANGED_GUEST_GDTR);
+ HMCPU_CF_CLEAR(pVCpu, HM_CHANGED_GUEST_GDTR);
}
/* Guest IDTR. */
- if (VMCPU_HMCF_IS_PENDING(pVCpu, HM_CHANGED_GUEST_IDTR))
+ if (HMCPU_CF_IS_PENDING(pVCpu, HM_CHANGED_GUEST_IDTR))
{
pVmcb->guest.IDTR.u32Limit = pCtx->idtr.cbIdt;
pVmcb->guest.IDTR.u64Base = pCtx->idtr.pIdt;
pVmcb->ctrl.u64VmcbCleanBits &= ~HMSVM_VMCB_CLEAN_DT;
- VMCPU_HMCF_CLEAR(pVCpu, HM_CHANGED_GUEST_IDTR);
+ HMCPU_CF_CLEAR(pVCpu, HM_CHANGED_GUEST_IDTR);
}
}
@@ -1344,11 +1357,11 @@ static void hmR0SvmLoadGuestMsrs(PVMCPU pVCpu, PSVMVMCB pVmcb, PCPUMCTX pCtx)
* AMD-V requires guest EFER.SVME to be set. Weird. .
* See AMD spec. 15.5.1 "Basic Operation" | "Canonicalization and Consistency Checks".
*/
- if (VMCPU_HMCF_IS_PENDING(pVCpu, HM_CHANGED_SVM_GUEST_EFER_MSR))
+ if (HMCPU_CF_IS_PENDING(pVCpu, HM_CHANGED_SVM_GUEST_EFER_MSR))
{
pVmcb->guest.u64EFER = pCtx->msrEFER | MSR_K6_EFER_SVME;
pVmcb->ctrl.u64VmcbCleanBits &= ~HMSVM_VMCB_CLEAN_CRX_EFER;
- VMCPU_HMCF_CLEAR(pVCpu, HM_CHANGED_SVM_GUEST_EFER_MSR);
+ HMCPU_CF_CLEAR(pVCpu, HM_CHANGED_SVM_GUEST_EFER_MSR);
}
/* 64-bit MSRs. */
@@ -1391,7 +1404,7 @@ static void hmR0SvmLoadGuestMsrs(PVMCPU pVCpu, PSVMVMCB pVmcb, PCPUMCTX pCtx)
*/
static void hmR0SvmLoadSharedDebugState(PVMCPU pVCpu, PSVMVMCB pVmcb, PCPUMCTX pCtx)
{
- if (!VMCPU_HMCF_IS_PENDING(pVCpu, HM_CHANGED_GUEST_DEBUG))
+ if (!HMCPU_CF_IS_PENDING(pVCpu, HM_CHANGED_GUEST_DEBUG))
return;
Assert((pCtx->dr[6] & X86_DR6_RA1_MASK) == X86_DR6_RA1_MASK); Assert((pCtx->dr[6] & X86_DR6_RAZ_MASK) == 0);
Assert((pCtx->dr[7] & X86_DR7_RA1_MASK) == X86_DR7_RA1_MASK); Assert((pCtx->dr[7] & X86_DR7_RAZ_MASK) == 0);
@@ -1501,9 +1514,8 @@ static void hmR0SvmLoadSharedDebugState(PVMCPU pVCpu, PSVMVMCB pVmcb, PCPUMCTX p
* intercept #DB as DR6 is updated in the VMCB.
*/
#if HC_ARCH_BITS == 32 && defined(VBOX_WITH_64_BITS_GUESTS) && !defined(VBOX_WITH_HYBRID_32BIT_KERNEL)
- else if ( ( CPUMIsGuestInLongModeEx(pCtx)
- && !CPUMIsGuestDebugStateActivePending(pVCpu))
- || !CPUMIsGuestDebugStateActive(pVCpu))
+ else if ( !CPUMIsGuestDebugStateActivePending(pVCpu)
+ && !CPUMIsGuestDebugStateActive(pVCpu))
#else
else if (!CPUMIsGuestDebugStateActive(pVCpu))
#endif
@@ -1541,7 +1553,7 @@ static void hmR0SvmLoadSharedDebugState(PVMCPU pVCpu, PSVMVMCB pVmcb, PCPUMCTX p
}
}
- VMCPU_HMCF_CLEAR(pVCpu, HM_CHANGED_GUEST_DEBUG);
+ HMCPU_CF_CLEAR(pVCpu, HM_CHANGED_GUEST_DEBUG);
}
@@ -1555,7 +1567,7 @@ static void hmR0SvmLoadSharedDebugState(PVMCPU pVCpu, PSVMVMCB pVmcb, PCPUMCTX p
*/
static int hmR0SvmLoadGuestApicState(PVMCPU pVCpu, PSVMVMCB pVmcb, PCPUMCTX pCtx)
{
- if (!VMCPU_HMCF_IS_PENDING(pVCpu, HM_CHANGED_SVM_GUEST_APIC_STATE))
+ if (!HMCPU_CF_IS_PENDING(pVCpu, HM_CHANGED_SVM_GUEST_APIC_STATE))
return VINF_SUCCESS;
bool fPendingIntr;
@@ -1599,7 +1611,7 @@ static int hmR0SvmLoadGuestApicState(PVMCPU pVCpu, PSVMVMCB pVmcb, PCPUMCTX pCtx
pVmcb->ctrl.u64VmcbCleanBits &= ~(HMSVM_VMCB_CLEAN_INTERCEPTS | HMSVM_VMCB_CLEAN_TPR);
}
- VMCPU_HMCF_CLEAR(pVCpu, HM_CHANGED_SVM_GUEST_APIC_STATE);
+ HMCPU_CF_CLEAR(pVCpu, HM_CHANGED_SVM_GUEST_APIC_STATE);
return rc;
}
@@ -1655,7 +1667,7 @@ VMMR0DECL(int) SVMR0Enter(PVM pVM, PVMCPU pVCpu, PHMGLOBALCPUINFO pCpu)
NOREF(pCpu);
LogFlowFunc(("pVM=%p pVCpu=%p\n", pVM, pVCpu));
- Assert(VMCPU_HMCF_IS_SET(pVCpu, HM_CHANGED_HOST_CONTEXT | HM_CHANGED_HOST_GUEST_SHARED_STATE));
+ Assert(HMCPU_CF_IS_SET(pVCpu, HM_CHANGED_HOST_CONTEXT | HM_CHANGED_HOST_GUEST_SHARED_STATE));
pVCpu->hm.s.fLeaveDone = false;
return VINF_SUCCESS;
@@ -1717,7 +1729,7 @@ VMMR0DECL(void) SVMR0ThreadCtxCallback(RTTHREADCTXEVENT enmEvent, PVMCPU pVCpu,
*/
int rc = HMR0EnterCpu(pVCpu);
AssertRC(rc); NOREF(rc);
- Assert(VMCPU_HMCF_IS_SET(pVCpu, HM_CHANGED_HOST_CONTEXT | HM_CHANGED_HOST_GUEST_SHARED_STATE));
+ Assert(HMCPU_CF_IS_SET(pVCpu, HM_CHANGED_HOST_CONTEXT | HM_CHANGED_HOST_GUEST_SHARED_STATE));
pVCpu->hm.s.fLeaveDone = false;
@@ -1746,7 +1758,7 @@ VMMR0DECL(int) SVMR0SaveHostState(PVM pVM, PVMCPU pVCpu)
NOREF(pVM);
NOREF(pVCpu);
/* Nothing to do here. AMD-V does this for us automatically during the world-switch. */
- VMCPU_HMCF_CLEAR(pVCpu, HM_CHANGED_HOST_CONTEXT);
+ HMCPU_CF_CLEAR(pVCpu, HM_CHANGED_HOST_CONTEXT);
return VINF_SUCCESS;
}
@@ -1781,7 +1793,6 @@ static int hmR0SvmLoadGuestState(PVM pVM, PVMCPU pVCpu, PCPUMCTX pCtx)
pVmcb->guest.u64RIP = pCtx->rip;
pVmcb->guest.u64RSP = pCtx->rsp;
pVmcb->guest.u64RFlags = pCtx->eflags.u32;
- pVmcb->guest.u8CPL = pCtx->ss.Attr.n.u2Dpl;
pVmcb->guest.u64RAX = pCtx->rax;
rc = hmR0SvmLoadGuestApicState(pVCpu, pVmcb, pCtx);
@@ -1791,20 +1802,20 @@ static int hmR0SvmLoadGuestState(PVM pVM, PVMCPU pVCpu, PCPUMCTX pCtx)
AssertLogRelMsgRCReturn(rc, ("hmR0SvmSetupVMRunHandler! rc=%Rrc (pVM=%p pVCpu=%p)\n", rc, pVM, pVCpu), rc);
/* Clear any unused and reserved bits. */
- VMCPU_HMCF_CLEAR(pVCpu, HM_CHANGED_GUEST_RIP /* Unused (loaded unconditionally). */
- | HM_CHANGED_GUEST_RSP
- | HM_CHANGED_GUEST_RFLAGS
- | HM_CHANGED_GUEST_SYSENTER_CS_MSR
- | HM_CHANGED_GUEST_SYSENTER_EIP_MSR
- | HM_CHANGED_GUEST_SYSENTER_ESP_MSR
- | HM_CHANGED_SVM_RESERVED1 /* Reserved. */
- | HM_CHANGED_SVM_RESERVED2
- | HM_CHANGED_SVM_RESERVED3);
+ HMCPU_CF_CLEAR(pVCpu, HM_CHANGED_GUEST_RIP /* Unused (loaded unconditionally). */
+ | HM_CHANGED_GUEST_RSP
+ | HM_CHANGED_GUEST_RFLAGS
+ | HM_CHANGED_GUEST_SYSENTER_CS_MSR
+ | HM_CHANGED_GUEST_SYSENTER_EIP_MSR
+ | HM_CHANGED_GUEST_SYSENTER_ESP_MSR
+ | HM_CHANGED_SVM_RESERVED1 /* Reserved. */
+ | HM_CHANGED_SVM_RESERVED2
+ | HM_CHANGED_SVM_RESERVED3);
/* All the guest state bits should be loaded except maybe the host context and/or shared host/guest bits. */
- AssertMsg( !VMCPU_HMCF_IS_PENDING(pVCpu, HM_CHANGED_ALL_GUEST)
- || VMCPU_HMCF_IS_PENDING_ONLY(pVCpu, HM_CHANGED_HOST_CONTEXT | HM_CHANGED_HOST_GUEST_SHARED_STATE),
- ("fContextUseFlags=%#RX32\n", VMCPU_HMCF_VALUE(pVCpu)));
+ AssertMsg( !HMCPU_CF_IS_PENDING(pVCpu, HM_CHANGED_ALL_GUEST)
+ || HMCPU_CF_IS_PENDING_ONLY(pVCpu, HM_CHANGED_HOST_CONTEXT | HM_CHANGED_HOST_GUEST_SHARED_STATE),
+ ("fContextUseFlags=%#RX32\n", HMCPU_CF_VALUE(pVCpu)));
Log4(("Load: CS:RIP=%04x:%RX64 EFL=%#x SS:RSP=%04x:%RX64\n", pCtx->cs.Sel, pCtx->rip, pCtx->eflags.u, pCtx->ss, pCtx->rsp));
STAM_PROFILE_ADV_STOP(&pVCpu->hm.s.StatLoadGuestState, x);
@@ -1827,14 +1838,14 @@ static void hmR0SvmLoadSharedState(PVMCPU pVCpu, PSVMVMCB pVmcb, PCPUMCTX pCtx)
Assert(!RTThreadPreemptIsEnabled(NIL_RTTHREAD));
Assert(!VMMRZCallRing3IsEnabled(pVCpu));
- if (VMCPU_HMCF_IS_PENDING(pVCpu, HM_CHANGED_GUEST_CR0))
+ if (HMCPU_CF_IS_PENDING(pVCpu, HM_CHANGED_GUEST_CR0))
hmR0SvmLoadSharedCR0(pVCpu, pVmcb, pCtx);
- if (VMCPU_HMCF_IS_PENDING(pVCpu, HM_CHANGED_GUEST_DEBUG))
+ if (HMCPU_CF_IS_PENDING(pVCpu, HM_CHANGED_GUEST_DEBUG))
hmR0SvmLoadSharedDebugState(pVCpu, pVmcb, pCtx);
- AssertMsg(!VMCPU_HMCF_IS_PENDING(pVCpu, HM_CHANGED_HOST_GUEST_SHARED_STATE),
- ("fContextUseFlags=%#RX32\n", VMCPU_HMCF_VALUE(pVCpu)));
+ AssertMsg(!HMCPU_CF_IS_PENDING(pVCpu, HM_CHANGED_HOST_GUEST_SHARED_STATE),
+ ("fContextUseFlags=%#RX32\n", HMCPU_CF_VALUE(pVCpu)));
}
@@ -1991,12 +2002,17 @@ static void hmR0SvmLeave(PVM pVM, PVMCPU pVCpu, PCPUMCTX pCtx)
Assert(!VMMRZCallRing3IsEnabled(pVCpu));
Assert(VMMR0IsLogFlushDisabled(pVCpu));
+ /*
+ * !!! IMPORTANT !!!
+ * If you modify code here, make sure to check whether hmR0SvmCallRing3Callback() needs to be updated too.
+ */
+
/* Restore host FPU state if necessary and resync on next R0 reentry .*/
if (CPUMIsGuestFPUStateActive(pVCpu))
{
CPUMR0SaveGuestFPU(pVM, pVCpu, pCtx);
Assert(!CPUMIsGuestFPUStateActive(pVCpu));
- VMCPU_HMCF_SET(pVCpu, HM_CHANGED_GUEST_CR0);
+ HMCPU_CF_SET(pVCpu, HM_CHANGED_GUEST_CR0);
}
/*
@@ -2011,7 +2027,7 @@ static void hmR0SvmLeave(PVM pVM, PVMCPU pVCpu, PCPUMCTX pCtx)
}
#endif
if (CPUMR0DebugStateMaybeSaveGuestAndRestoreHost(pVCpu, false /* save DR6 */))
- VMCPU_HMCF_SET(pVCpu, HM_CHANGED_GUEST_DEBUG);
+ HMCPU_CF_SET(pVCpu, HM_CHANGED_GUEST_DEBUG);
Assert(!CPUMIsHyperDebugStateActive(pVCpu));
Assert(!CPUMIsGuestDebugStateActive(pVCpu));
@@ -2048,6 +2064,10 @@ static int hmR0SvmLeaveSession(PVM pVM, PVMCPU pVCpu, PCPUMCTX pCtx)
pVCpu->hm.s.fLeaveDone = true;
}
+ /*
+ * !!! IMPORTANT !!!
+ * If you modify code here, make sure to check whether hmR0SvmCallRing3Callback() needs to be updated too.
+ */
/* Deregister hook now that we've left HM context before re-enabling preemption. */
if (VMMR0ThreadCtxHooksAreRegistered(pVCpu))
VMMR0ThreadCtxHooksDeregister(pVCpu);
@@ -2085,15 +2105,38 @@ static int hmR0SvmLongJmpToRing3(PVM pVM, PVMCPU pVCpu, PCPUMCTX pCtx)
* @param enmOperation The operation causing the ring-3 longjump.
* @param pvUser The user argument (pointer to the possibly
* out-of-date guest-CPU context).
- *
- * @remarks Must never be called with @a enmOperation ==
- * VMMCALLRING3_VM_R0_ASSERTION. We can't assert it here because if it
- * it -does- get called with VMMCALLRING3_VM_R0_ASSERTION, we'll end up
- * with an infinite recursion.
*/
DECLCALLBACK(int) hmR0SvmCallRing3Callback(PVMCPU pVCpu, VMMCALLRING3 enmOperation, void *pvUser)
{
- /* VMMRZCallRing3() already makes sure we never get called as a result of an longjmp due to an assertion, */
+ if (enmOperation == VMMCALLRING3_VM_R0_ASSERTION)
+ {
+ /*
+ * !!! IMPORTANT !!!
+ * If you modify code here, make sure to check whether hmR0SvmLeave() and hmR0SvmLeaveSession() needs
+ * to be updated too. This is a stripped down version which gets out ASAP trying to not trigger any assertion.
+ */
+ VMMRZCallRing3RemoveNotification(pVCpu);
+ VMMRZCallRing3Disable(pVCpu);
+ HM_DISABLE_PREEMPT_IF_NEEDED();
+
+ /* Restore host FPU state if necessary and resync on next R0 reentry .*/
+ if (CPUMIsGuestFPUStateActive(pVCpu))
+ CPUMR0SaveGuestFPU(pVCpu->CTX_SUFF(pVM), pVCpu, (PCPUMCTX)pvUser);
+
+ /* Restore host debug registers if necessary and resync on next R0 reentry. */
+ CPUMR0DebugStateMaybeSaveGuestAndRestoreHost(pVCpu, false /* save DR6 */);
+
+ /* Deregister hook now that we've left HM context before re-enabling preemption. */
+ if (VMMR0ThreadCtxHooksAreRegistered(pVCpu))
+ VMMR0ThreadCtxHooksDeregister(pVCpu);
+
+ /* Leave HM context. This takes care of local init (term). */
+ HMR0LeaveCpu(pVCpu);
+
+ HM_RESTORE_PREEMPT_IF_NEEDED();
+ return VINF_SUCCESS;
+ }
+
Assert(pVCpu);
Assert(pvUser);
Assert(VMMRZCallRing3IsEnabled(pVCpu));
@@ -2168,7 +2211,7 @@ static void hmR0SvmExitToRing3(PVM pVM, PVMCPU pVCpu, PCPUMCTX pCtx, int rcExit)
/* On our way back from ring-3 reload the guest state if there is a possibility of it being changed. */
if (rcExit != VINF_EM_RAW_INTERRUPT)
- VMCPU_HMCF_SET(pVCpu, HM_CHANGED_ALL_GUEST);
+ HMCPU_CF_SET(pVCpu, HM_CHANGED_ALL_GUEST);
STAM_COUNTER_INC(&pVCpu->hm.s.StatSwitchExitToR3);
@@ -2826,18 +2869,8 @@ static int hmR0SvmPreRunGuest(PVM pVM, PVMCPU pVCpu, PCPUMCTX pCtx, PSVMTRANSIEN
else if (!pVCpu->hm.s.Event.fPending)
hmR0SvmEvaluatePendingEvent(pVCpu, pCtx);
- /*
- * Re-enable nested paging (automatically disabled on every VM-exit). See AMD spec. 15.25.3 "Enabling Nested Paging".
- * We avoid changing the corresponding VMCB Clean Bit as we're not changing it to a different value since the previous run.
- */
- /** @todo The above assumption could be wrong. It's not documented what
- * should be done wrt to the VMCB Clean Bit, but we'll find out the
- * hard way. */
- PSVMVMCB pVmcb = (PSVMVMCB)pVCpu->hm.s.svm.pvVmcb;
- pVmcb->ctrl.NestedPaging.n.u1NestedPaging = pVM->hm.s.fNestedPaging;
-
#ifdef HMSVM_SYNC_FULL_GUEST_STATE
- VMCPU_HMCF_SET(pVCpu, HM_CHANGED_ALL_GUEST);
+ HMCPU_CF_SET(pVCpu, HM_CHANGED_ALL_GUEST);
#endif
/* Load the guest bits that are not shared with the host in any way since we can longjmp or get preempted. */
@@ -2854,7 +2887,10 @@ static int hmR0SvmPreRunGuest(PVM pVM, PVMCPU pVCpu, PCPUMCTX pCtx, PSVMTRANSIEN
if (pVM->hm.s.fTPRPatchingActive)
pSvmTransient->u8GuestTpr = pCtx->msrLSTAR;
else
+ {
+ PSVMVMCB pVmcb = (PSVMVMCB)pVCpu->hm.s.svm.pvVmcb;
pSvmTransient->u8GuestTpr = pVmcb->ctrl.IntCtrl.n.u8VTPR;
+ }
}
/*
@@ -2921,14 +2957,10 @@ static void hmR0SvmPreRunGuestCommitted(PVM pVM, PVMCPU pVCpu, PCPUMCTX pCtx, PS
/* Load the state shared between host and guest (FPU, debug). */
PSVMVMCB pVmcb = (PSVMVMCB)pVCpu->hm.s.svm.pvVmcb;
- if (VMCPU_HMCF_IS_PENDING(pVCpu, HM_CHANGED_HOST_GUEST_SHARED_STATE))
+ if (HMCPU_CF_IS_PENDING(pVCpu, HM_CHANGED_HOST_GUEST_SHARED_STATE))
hmR0SvmLoadSharedState(pVCpu, pVmcb, pCtx);
- VMCPU_HMCF_CLEAR(pVCpu, HM_CHANGED_HOST_CONTEXT); /* Preemption might set this, nothing to do on AMD-V. */
- AssertMsg(!VMCPU_HMCF_VALUE(pVCpu), ("fContextUseFlags=%#RX32\n", VMCPU_HMCF_VALUE(pVCpu)));
-
- /* If VMCB Clean Bits isn't supported by the CPU, simply mark all state-bits as dirty, indicating (re)load-from-VMCB. */
- if (!(pVM->hm.s.svm.u32Features & AMD_CPUID_SVM_FEATURE_EDX_VMCB_CLEAN))
- pVmcb->ctrl.u64VmcbCleanBits = 0;
+ HMCPU_CF_CLEAR(pVCpu, HM_CHANGED_HOST_CONTEXT); /* Preemption might set this, nothing to do on AMD-V. */
+ AssertMsg(!HMCPU_CF_VALUE(pVCpu), ("fContextUseFlags=%#RX32\n", HMCPU_CF_VALUE(pVCpu)));
/* Setup TSC offsetting. */
if ( pSvmTransient->fUpdateTscOffsetting
@@ -2938,6 +2970,10 @@ static void hmR0SvmPreRunGuestCommitted(PVM pVM, PVMCPU pVCpu, PCPUMCTX pCtx, PS
pSvmTransient->fUpdateTscOffsetting = false;
}
+ /* If we've migrating CPUs, mark the VMCB Clean bits as dirty. */
+ if (HMR0GetCurrentCpu()->idCpu != pVCpu->hm.s.idLastCpu)
+ pVmcb->ctrl.u64VmcbCleanBits = 0;
+
/* Store status of the shared guest-host state at the time of VMRUN. */
#if HC_ARCH_BITS == 32 && defined(VBOX_WITH_64_BITS_GUESTS) && !defined(VBOX_WITH_HYBRID_32BIT_KERNEL)
if (CPUMIsGuestInLongModeEx(pCtx))
@@ -2969,20 +3005,27 @@ static void hmR0SvmPreRunGuestCommitted(PVM pVM, PVMCPU pVCpu, PCPUMCTX pCtx, PS
*
* This should be done -after- any RDTSCPs for obtaining the host timestamp (TM, STAM etc).
*/
- pSvmTransient->fRestoreTscAuxMsr = false;
if ( (pVM->hm.s.cpuid.u32AMDFeatureEDX & X86_CPUID_EXT_FEATURE_EDX_RDTSCP)
&& !(pVmcb->ctrl.u32InterceptCtrl2 & SVM_CTRL2_INTERCEPT_RDTSCP))
{
+ hmR0SvmSetMsrPermission(pVCpu, MSR_K8_TSC_AUX, SVMMSREXIT_PASSTHRU_READ, SVMMSREXIT_PASSTHRU_WRITE);
pVCpu->hm.s.u64HostTscAux = ASMRdMsr(MSR_K8_TSC_AUX);
uint64_t u64GuestTscAux = 0;
int rc2 = CPUMQueryGuestMsr(pVCpu, MSR_K8_TSC_AUX, &u64GuestTscAux);
AssertRC(rc2);
if (u64GuestTscAux != pVCpu->hm.s.u64HostTscAux)
- {
ASMWrMsr(MSR_K8_TSC_AUX, u64GuestTscAux);
- pSvmTransient->fRestoreTscAuxMsr = true;
- }
+ pSvmTransient->fRestoreTscAuxMsr = true;
}
+ else
+ {
+ hmR0SvmSetMsrPermission(pVCpu, MSR_K8_TSC_AUX, SVMMSREXIT_INTERCEPT_READ, SVMMSREXIT_INTERCEPT_WRITE);
+ pSvmTransient->fRestoreTscAuxMsr = false;
+ }
+
+ /* If VMCB Clean bits isn't supported by the CPU, simply mark all state-bits as dirty, indicating (re)load-from-VMCB. */
+ if (!(pVM->hm.s.svm.u32Features & AMD_CPUID_SVM_FEATURE_EDX_VMCB_CLEAN))
+ pVmcb->ctrl.u64VmcbCleanBits = 0;
}
@@ -3039,7 +3082,12 @@ static void hmR0SvmPostRunGuest(PVM pVM, PVMCPU pVCpu, PCPUMCTX pMixedCtx, PSVMT
pVmcb->ctrl.u64VmcbCleanBits = HMSVM_VMCB_CLEAN_ALL; /* Mark the VMCB-state cache as unmodified by VMM. */
if (pSvmTransient->fRestoreTscAuxMsr)
- ASMWrMsr(MSR_K8_TSC_AUX, pVCpu->hm.s.u64HostTscAux);
+ {
+ uint64_t u64GuestTscAux = ASMRdMsr(MSR_K8_TSC_AUX);
+ CPUMSetGuestMsr(pVCpu, MSR_K8_TSC_AUX, u64GuestTscAux);
+ if (u64GuestTscAux != pVCpu->hm.s.u64HostTscAux)
+ ASMWrMsr(MSR_K8_TSC_AUX, pVCpu->hm.s.u64HostTscAux);
+ }
if (!(pVmcb->ctrl.u32InterceptCtrl1 & SVM_CTRL1_INTERCEPT_RDTSC))
{
@@ -3076,13 +3124,13 @@ static void hmR0SvmPostRunGuest(PVM pVM, PVMCPU pVCpu, PCPUMCTX pMixedCtx, PSVMT
{
int rc = PDMApicSetTPR(pVCpu, pMixedCtx->msrLSTAR & 0xff);
AssertRC(rc);
- VMCPU_HMCF_SET(pVCpu, HM_CHANGED_SVM_GUEST_APIC_STATE);
+ HMCPU_CF_SET(pVCpu, HM_CHANGED_SVM_GUEST_APIC_STATE);
}
else if (pSvmTransient->u8GuestTpr != pVmcb->ctrl.IntCtrl.n.u8VTPR)
{
int rc = PDMApicSetTPR(pVCpu, pVmcb->ctrl.IntCtrl.n.u8VTPR << 4);
AssertRC(rc);
- VMCPU_HMCF_SET(pVCpu, HM_CHANGED_SVM_GUEST_APIC_STATE);
+ HMCPU_CF_SET(pVCpu, HM_CHANGED_SVM_GUEST_APIC_STATE);
}
}
}
@@ -3554,7 +3602,7 @@ DECLINLINE(void) hmR0SvmSetPendingXcptPF(PVMCPU pVCpu, PCPUMCTX pCtx, uint32_t u
if (pCtx->cr2 != uFaultAddress)
{
pCtx->cr2 = uFaultAddress;
- VMCPU_HMCF_SET(pVCpu, HM_CHANGED_GUEST_CR2);
+ HMCPU_CF_SET(pVCpu, HM_CHANGED_GUEST_CR2);
}
hmR0SvmSetPendingEvent(pVCpu, &Event, uFaultAddress);
@@ -3665,7 +3713,7 @@ static int hmR0SvmEmulateMovTpr(PVM pVM, PVMCPU pVCpu, PCPUMCTX pCtx)
int rc2 = PDMApicSetTPR(pVCpu, u8Tpr);
AssertRC(rc2);
- VMCPU_HMCF_SET(pVCpu, HM_CHANGED_SVM_GUEST_APIC_STATE);
+ HMCPU_CF_SET(pVCpu, HM_CHANGED_SVM_GUEST_APIC_STATE);
pCtx->rip += pPatch->cbOp;
break;
@@ -4145,20 +4193,20 @@ HMSVM_EXIT_DECL hmR0SvmExitWriteCRx(PVMCPU pVCpu, PCPUMCTX pCtx, PSVMTRANSIENT p
switch (pSvmTransient->u64ExitCode - SVM_EXIT_WRITE_CR0)
{
case 0: /* CR0. */
- VMCPU_HMCF_SET(pVCpu, HM_CHANGED_GUEST_CR0);
+ HMCPU_CF_SET(pVCpu, HM_CHANGED_GUEST_CR0);
break;
case 3: /* CR3. */
Assert(!pVCpu->CTX_SUFF(pVM)->hm.s.fNestedPaging);
- VMCPU_HMCF_SET(pVCpu, HM_CHANGED_GUEST_CR3);
+ HMCPU_CF_SET(pVCpu, HM_CHANGED_GUEST_CR3);
break;
case 4: /* CR4. */
- VMCPU_HMCF_SET(pVCpu, HM_CHANGED_GUEST_CR4);
+ HMCPU_CF_SET(pVCpu, HM_CHANGED_GUEST_CR4);
break;
case 8: /* CR8 (TPR). */
- VMCPU_HMCF_SET(pVCpu, HM_CHANGED_SVM_GUEST_APIC_STATE);
+ HMCPU_CF_SET(pVCpu, HM_CHANGED_SVM_GUEST_APIC_STATE);
break;
default:
@@ -4209,7 +4257,7 @@ HMSVM_EXIT_DECL hmR0SvmExitMsr(PVMCPU pVCpu, PCPUMCTX pCtx, PSVMTRANSIENT pSvmTr
/* Our patch code uses LSTAR for TPR caching for 32-bit guests. */
int rc2 = PDMApicSetTPR(pVCpu, pCtx->eax & 0xff);
AssertRC(rc2);
- VMCPU_HMCF_SET(pVCpu, HM_CHANGED_SVM_GUEST_APIC_STATE);
+ HMCPU_CF_SET(pVCpu, HM_CHANGED_SVM_GUEST_APIC_STATE);
}
hmR0SvmUpdateRip(pVCpu, pCtx, 2);
rc = VINF_SUCCESS;
@@ -4241,13 +4289,15 @@ HMSVM_EXIT_DECL hmR0SvmExitMsr(PVMCPU pVCpu, PCPUMCTX pCtx, PSVMTRANSIENT pSvmTr
if ( pCtx->ecx >= MSR_IA32_X2APIC_START
&& pCtx->ecx <= MSR_IA32_X2APIC_END)
{
- /* We've already saved the APIC related guest-state (TPR) in hmR0SvmPostRunGuest(). When full APIC register
+ /*
+ * We've already saved the APIC related guest-state (TPR) in hmR0SvmPostRunGuest(). When full APIC register
* virtualization is implemented we'll have to make sure APIC state is saved from the VMCB before
- EMInterpretWrmsr() changes it. */
- VMCPU_HMCF_SET(pVCpu, HM_CHANGED_SVM_GUEST_APIC_STATE);
+ * EMInterpretWrmsr() changes it.
+ */
+ HMCPU_CF_SET(pVCpu, HM_CHANGED_SVM_GUEST_APIC_STATE);
}
else if (pCtx->ecx == MSR_K6_EFER)
- VMCPU_HMCF_SET(pVCpu, HM_CHANGED_SVM_GUEST_EFER_MSR);
+ HMCPU_CF_SET(pVCpu, HM_CHANGED_SVM_GUEST_EFER_MSR);
else if (pCtx->ecx == MSR_IA32_TSC)
pSvmTransient->fUpdateTscOffsetting = true;
}
@@ -4291,15 +4341,16 @@ HMSVM_EXIT_DECL hmR0SvmExitReadDRx(PVMCPU pVCpu, PCPUMCTX pCtx, PSVMTRANSIENT pS
HMSVM_VALIDATE_EXIT_HANDLER_PARAMS();
STAM_COUNTER_INC(&pVCpu->hm.s.StatExitDRxRead);
- /* We should -not- get this VM-exit if we're not stepping or the guest is debugging. */
- AssertMsgReturn( pVCpu->hm.s.fSingleInstruction
- || DBGFIsStepping(pVCpu)
- || !pSvmTransient->fWasGuestDebugStateActive,
- ("hmR0SvmExitReadDRx: Unexpected exit. pVCpu=%p pCtx=%p\n", pVCpu, pCtx),
- VERR_SVM_UNEXPECTED_EXIT);
+ /* We should -not- get this VM-exit if the guest's debug registers were active. */
+ if (pSvmTransient->fWasGuestDebugStateActive)
+ {
+ AssertMsgFailed(("hmR0SvmHandleExit: Unexpected exit %#RX32\n", (uint32_t)pSvmTransient->u64ExitCode));
+ pVCpu->hm.s.u32HMError = (uint32_t)pSvmTransient->u64ExitCode;
+ return VERR_SVM_UNEXPECTED_EXIT;
+ }
/*
- * Lazy DR0-3 loading?
+ * Lazy DR0-3 loading.
*/
if (!pSvmTransient->fWasHyperDebugStateActive)
{
@@ -4337,7 +4388,7 @@ HMSVM_EXIT_DECL hmR0SvmExitReadDRx(PVMCPU pVCpu, PCPUMCTX pCtx, PSVMTRANSIENT pS
{
/* Not necessary for read accesses but whatever doesn't hurt for now, will be fixed with decode assist. */
/** @todo CPUM should set this flag! */
- VMCPU_HMCF_SET(pVCpu, HM_CHANGED_GUEST_DEBUG);
+ HMCPU_CF_SET(pVCpu, HM_CHANGED_GUEST_DEBUG);
HMSVM_CHECK_SINGLE_STEP(pVCpu, rc);
}
else
@@ -4540,8 +4591,8 @@ HMSVM_EXIT_DECL hmR0SvmExitNestedPF(PVMCPU pVCpu, PCPUMCTX pCtx, PSVMTRANSIENT p
&& (GCPhysFaultAddr & PAGE_OFFSET_MASK) == 0x80 /* TPR offset. */
&& ( !(u32ErrCode & X86_TRAP_PF_P) /* Not present */
|| (u32ErrCode & (X86_TRAP_PF_P | X86_TRAP_PF_RSVD)) == (X86_TRAP_PF_P | X86_TRAP_PF_RSVD)) /* MMIO page. */
- && !CPUMGetGuestCPL(pVCpu)
&& !CPUMIsGuestInLongModeEx(pCtx)
+ && !CPUMGetGuestCPL(pVCpu)
&& pVM->hm.s.cPatches < RT_ELEMENTS(pVM->hm.s.aPatches))
{
RTGCPHYS GCPhysApicBase = pCtx->msrApicBase;
@@ -4591,7 +4642,7 @@ HMSVM_EXIT_DECL hmR0SvmExitNestedPF(PVMCPU pVCpu, PCPUMCTX pCtx, PSVMTRANSIENT p
|| rc == VERR_PAGE_NOT_PRESENT)
{
/* Successfully handled MMIO operation. */
- VMCPU_HMCF_SET(pVCpu, HM_CHANGED_SVM_GUEST_APIC_STATE);
+ HMCPU_CF_SET(pVCpu, HM_CHANGED_SVM_GUEST_APIC_STATE);
rc = VINF_SUCCESS;
}
return rc;
@@ -4740,8 +4791,8 @@ HMSVM_EXIT_DECL hmR0SvmExitXcptPF(PVMCPU pVCpu, PCPUMCTX pCtx, PSVMTRANSIENT pSv
if ( pVM->hm.s.fTRPPatchingAllowed
&& (uFaultAddress & 0xfff) == 0x80 /* TPR offset. */
&& !(u32ErrCode & X86_TRAP_PF_P) /* Not present. */
- && !CPUMGetGuestCPL(pVCpu)
&& !CPUMIsGuestInLongModeEx(pCtx)
+ && !CPUMGetGuestCPL(pVCpu)
&& pVM->hm.s.cPatches < RT_ELEMENTS(pVM->hm.s.aPatches))
{
RTGCPHYS GCPhysApicBase;
@@ -4775,7 +4826,7 @@ HMSVM_EXIT_DECL hmR0SvmExitXcptPF(PVMCPU pVCpu, PCPUMCTX pCtx, PSVMTRANSIENT pSv
/* Successfully synced shadow pages tables or emulated an MMIO instruction. */
TRPMResetTrap(pVCpu);
STAM_COUNTER_INC(&pVCpu->hm.s.StatExitShadowPF);
- VMCPU_HMCF_SET(pVCpu, HM_CHANGED_SVM_GUEST_APIC_STATE);
+ HMCPU_CF_SET(pVCpu, HM_CHANGED_SVM_GUEST_APIC_STATE);
return rc;
}
else if (rc == VINF_EM_RAW_GUEST_TRAP)
@@ -4826,7 +4877,7 @@ HMSVM_EXIT_DECL hmR0SvmExitXcptNM(PVMCPU pVCpu, PCPUMCTX pCtx, PSVMTRANSIENT pSv
if (pSvmTransient->fWasGuestFPUStateActive)
{
rc = VINF_EM_RAW_GUEST_TRAP;
- Assert(CPUMIsGuestFPUStateActive(pVCpu) || VMCPU_HMCF_IS_PENDING(pVCpu, HM_CHANGED_GUEST_CR0));
+ Assert(CPUMIsGuestFPUStateActive(pVCpu) || HMCPU_CF_IS_PENDING(pVCpu, HM_CHANGED_GUEST_CR0));
}
else
{
@@ -4843,7 +4894,7 @@ HMSVM_EXIT_DECL hmR0SvmExitXcptNM(PVMCPU pVCpu, PCPUMCTX pCtx, PSVMTRANSIENT pSv
if (rc == VINF_SUCCESS)
{
/* Guest FPU state was activated, we'll want to change CR0 FPU intercepts before the next VM-reentry. */
- VMCPU_HMCF_SET(pVCpu, HM_CHANGED_GUEST_CR0);
+ HMCPU_CF_SET(pVCpu, HM_CHANGED_GUEST_CR0);
STAM_COUNTER_INC(&pVCpu->hm.s.StatExitShadowNM);
}
else
diff --git a/src/VBox/VMM/VMMR0/HMVMXR0.cpp b/src/VBox/VMM/VMMR0/HMVMXR0.cpp
index f4163c1..3d03412 100644
--- a/src/VBox/VMM/VMMR0/HMVMXR0.cpp
+++ b/src/VBox/VMM/VMMR0/HMVMXR0.cpp
@@ -2678,7 +2678,7 @@ DECLINLINE(int) hmR0VmxSaveHostMsrs(PVM pVM, PVMCPU pVCpu)
DECLINLINE(int) hmR0VmxLoadGuestEntryCtls(PVMCPU pVCpu, PCPUMCTX pMixedCtx)
{
int rc = VINF_SUCCESS;
- if (VMCPU_HMCF_IS_PENDING(pVCpu, HM_CHANGED_VMX_ENTRY_CTLS))
+ if (HMCPU_CF_IS_PENDING(pVCpu, HM_CHANGED_VMX_ENTRY_CTLS))
{
PVM pVM = pVCpu->CTX_SUFF(pVM);
uint32_t val = pVM->hm.s.vmx.Msrs.VmxEntry.n.disallowed0; /* Bits set here must be set in the VMCS. */
@@ -2716,7 +2716,7 @@ DECLINLINE(int) hmR0VmxLoadGuestEntryCtls(PVMCPU pVCpu, PCPUMCTX pMixedCtx)
/* Update VCPU with the currently set VM-exit controls. */
pVCpu->hm.s.vmx.u32EntryCtls = val;
- VMCPU_HMCF_CLEAR(pVCpu, HM_CHANGED_VMX_ENTRY_CTLS);
+ HMCPU_CF_CLEAR(pVCpu, HM_CHANGED_VMX_ENTRY_CTLS);
}
return rc;
}
@@ -2737,7 +2737,7 @@ DECLINLINE(int) hmR0VmxLoadGuestEntryCtls(PVMCPU pVCpu, PCPUMCTX pMixedCtx)
DECLINLINE(int) hmR0VmxLoadGuestExitCtls(PVMCPU pVCpu, PCPUMCTX pMixedCtx)
{
int rc = VINF_SUCCESS;
- if (VMCPU_HMCF_IS_PENDING(pVCpu, HM_CHANGED_VMX_EXIT_CTLS))
+ if (HMCPU_CF_IS_PENDING(pVCpu, HM_CHANGED_VMX_EXIT_CTLS))
{
PVM pVM = pVCpu->CTX_SUFF(pVM);
uint32_t val = pVM->hm.s.vmx.Msrs.VmxExit.n.disallowed0; /* Bits set here must be set in the VMCS. */
@@ -2787,7 +2787,7 @@ DECLINLINE(int) hmR0VmxLoadGuestExitCtls(PVMCPU pVCpu, PCPUMCTX pMixedCtx)
/* Update VCPU with the currently set VM-exit controls. */
pVCpu->hm.s.vmx.u32ExitCtls = val;
- VMCPU_HMCF_CLEAR(pVCpu, HM_CHANGED_VMX_EXIT_CTLS);
+ HMCPU_CF_CLEAR(pVCpu, HM_CHANGED_VMX_EXIT_CTLS);
}
return rc;
}
@@ -2806,7 +2806,7 @@ DECLINLINE(int) hmR0VmxLoadGuestExitCtls(PVMCPU pVCpu, PCPUMCTX pMixedCtx)
DECLINLINE(int) hmR0VmxLoadGuestApicState(PVMCPU pVCpu, PCPUMCTX pMixedCtx)
{
int rc = VINF_SUCCESS;
- if (VMCPU_HMCF_IS_PENDING(pVCpu, HM_CHANGED_VMX_GUEST_APIC_STATE))
+ if (HMCPU_CF_IS_PENDING(pVCpu, HM_CHANGED_VMX_GUEST_APIC_STATE))
{
/* Setup TPR shadowing. Also setup TPR patching for 32-bit guests. */
if (pVCpu->hm.s.vmx.u32ProcCtls & VMX_VMCS_CTRL_PROC_EXEC_USE_TPR_SHADOW)
@@ -2843,7 +2843,7 @@ DECLINLINE(int) hmR0VmxLoadGuestApicState(PVMCPU pVCpu, PCPUMCTX pMixedCtx)
AssertRCReturn(rc, rc);
}
- VMCPU_HMCF_CLEAR(pVCpu, HM_CHANGED_VMX_GUEST_APIC_STATE);
+ HMCPU_CF_CLEAR(pVCpu, HM_CHANGED_VMX_GUEST_APIC_STATE);
}
return rc;
}
@@ -2922,13 +2922,13 @@ static int hmR0VmxLoadGuestIntrState(PVMCPU pVCpu, uint32_t uIntrState)
static int hmR0VmxLoadGuestRip(PVMCPU pVCpu, PCPUMCTX pMixedCtx)
{
int rc = VINF_SUCCESS;
- if (VMCPU_HMCF_IS_PENDING(pVCpu, HM_CHANGED_GUEST_RIP))
+ if (HMCPU_CF_IS_PENDING(pVCpu, HM_CHANGED_GUEST_RIP))
{
rc = VMXWriteVmcsGstN(VMX_VMCS_GUEST_RIP, pMixedCtx->rip);
AssertRCReturn(rc, rc);
- VMCPU_HMCF_CLEAR(pVCpu, HM_CHANGED_GUEST_RIP);
- Log4(("Load: VMX_VMCS_GUEST_RIP=%#RX64 fContextUseFlags=%#RX32\n", pMixedCtx->rip, VMCPU_HMCF_VALUE(pVCpu)));
+ HMCPU_CF_CLEAR(pVCpu, HM_CHANGED_GUEST_RIP);
+ Log4(("Load: VMX_VMCS_GUEST_RIP=%#RX64 fContextUseFlags=%#RX32\n", pMixedCtx->rip, HMCPU_CF_VALUE(pVCpu)));
}
return rc;
}
@@ -2948,12 +2948,12 @@ static int hmR0VmxLoadGuestRip(PVMCPU pVCpu, PCPUMCTX pMixedCtx)
static int hmR0VmxLoadGuestRsp(PVMCPU pVCpu, PCPUMCTX pMixedCtx)
{
int rc = VINF_SUCCESS;
- if (VMCPU_HMCF_IS_PENDING(pVCpu, HM_CHANGED_GUEST_RSP))
+ if (HMCPU_CF_IS_PENDING(pVCpu, HM_CHANGED_GUEST_RSP))
{
rc = VMXWriteVmcsGstN(VMX_VMCS_GUEST_RSP, pMixedCtx->rsp);
AssertRCReturn(rc, rc);
- VMCPU_HMCF_CLEAR(pVCpu, HM_CHANGED_GUEST_RSP);
+ HMCPU_CF_CLEAR(pVCpu, HM_CHANGED_GUEST_RSP);
Log4(("Load: VMX_VMCS_GUEST_RSP=%#RX64\n", pMixedCtx->rsp));
}
return rc;
@@ -2974,7 +2974,7 @@ static int hmR0VmxLoadGuestRsp(PVMCPU pVCpu, PCPUMCTX pMixedCtx)
static int hmR0VmxLoadGuestRflags(PVMCPU pVCpu, PCPUMCTX pMixedCtx)
{
int rc = VINF_SUCCESS;
- if (VMCPU_HMCF_IS_PENDING(pVCpu, HM_CHANGED_GUEST_RFLAGS))
+ if (HMCPU_CF_IS_PENDING(pVCpu, HM_CHANGED_GUEST_RFLAGS))
{
/* Intel spec. 2.3.1 "System Flags and Fields in IA-32e Mode" claims the upper 32-bits of RFLAGS are reserved (MBZ).
Let us assert it as such and use 32-bit VMWRITE. */
@@ -2999,7 +2999,7 @@ static int hmR0VmxLoadGuestRflags(PVMCPU pVCpu, PCPUMCTX pMixedCtx)
rc = VMXWriteVmcs32(VMX_VMCS_GUEST_RFLAGS, Eflags.u32);
AssertRCReturn(rc, rc);
- VMCPU_HMCF_CLEAR(pVCpu, HM_CHANGED_GUEST_RFLAGS);
+ HMCPU_CF_CLEAR(pVCpu, HM_CHANGED_GUEST_RFLAGS);
Log4(("Load: VMX_VMCS_GUEST_RFLAGS=%#RX32\n", Eflags.u32));
}
return rc;
@@ -3049,7 +3049,7 @@ static int hmR0VmxLoadSharedCR0(PVMCPU pVCpu, PCPUMCTX pMixedCtx)
* Guest FPU.
*/
int rc = VINF_SUCCESS;
- if (VMCPU_HMCF_IS_PENDING(pVCpu, HM_CHANGED_GUEST_CR0))
+ if (HMCPU_CF_IS_PENDING(pVCpu, HM_CHANGED_GUEST_CR0))
{
Assert(!(pMixedCtx->cr0 >> 32));
uint32_t u32GuestCR0 = pMixedCtx->cr0;
@@ -3210,7 +3210,7 @@ static int hmR0VmxLoadSharedCR0(PVMCPU pVCpu, PCPUMCTX pMixedCtx)
AssertRCReturn(rc, rc);
Log4(("Load: VMX_VMCS_CTRL_CR0_MASK=%#RX32\n", u32CR0Mask));
- VMCPU_HMCF_CLEAR(pVCpu, HM_CHANGED_GUEST_CR0);
+ HMCPU_CF_CLEAR(pVCpu, HM_CHANGED_GUEST_CR0);
}
return rc;
}
@@ -3242,7 +3242,7 @@ static int hmR0VmxLoadGuestCR3AndCR4(PVMCPU pVCpu, PCPUMCTX pMixedCtx)
/*
* Guest CR3.
*/
- if (VMCPU_HMCF_IS_PENDING(pVCpu, HM_CHANGED_GUEST_CR3))
+ if (HMCPU_CF_IS_PENDING(pVCpu, HM_CHANGED_GUEST_CR3))
{
RTGCPHYS GCPhysGuestCR3 = NIL_RTGCPHYS;
if (pVM->hm.s.fNestedPaging)
@@ -3315,13 +3315,13 @@ static int hmR0VmxLoadGuestCR3AndCR4(PVMCPU pVCpu, PCPUMCTX pMixedCtx)
}
AssertRCReturn(rc, rc);
- VMCPU_HMCF_CLEAR(pVCpu, HM_CHANGED_GUEST_CR3);
+ HMCPU_CF_CLEAR(pVCpu, HM_CHANGED_GUEST_CR3);
}
/*
* Guest CR4.
*/
- if (VMCPU_HMCF_IS_PENDING(pVCpu, HM_CHANGED_GUEST_CR4))
+ if (HMCPU_CF_IS_PENDING(pVCpu, HM_CHANGED_GUEST_CR4))
{
Assert(!(pMixedCtx->cr4 >> 32));
uint32_t u32GuestCR4 = pMixedCtx->cr4;
@@ -3412,7 +3412,7 @@ static int hmR0VmxLoadGuestCR3AndCR4(PVMCPU pVCpu, PCPUMCTX pMixedCtx)
rc = VMXWriteVmcs32(VMX_VMCS_CTRL_CR4_MASK, u32CR4Mask);
AssertRCReturn(rc, rc);
- VMCPU_HMCF_CLEAR(pVCpu, HM_CHANGED_GUEST_CR4);
+ HMCPU_CF_CLEAR(pVCpu, HM_CHANGED_GUEST_CR4);
}
return rc;
}
@@ -3434,7 +3434,7 @@ static int hmR0VmxLoadGuestCR3AndCR4(PVMCPU pVCpu, PCPUMCTX pMixedCtx)
*/
static int hmR0VmxLoadSharedDebugState(PVMCPU pVCpu, PCPUMCTX pMixedCtx)
{
- if (!VMCPU_HMCF_IS_PENDING(pVCpu, HM_CHANGED_GUEST_DEBUG))
+ if (!HMCPU_CF_IS_PENDING(pVCpu, HM_CHANGED_GUEST_DEBUG))
return VINF_SUCCESS;
#ifdef VBOX_STRICT
@@ -3466,7 +3466,7 @@ static int hmR0VmxLoadSharedDebugState(PVMCPU pVCpu, PCPUMCTX pMixedCtx)
{
pMixedCtx->eflags.u32 |= X86_EFL_TF;
pVCpu->hm.s.fClearTrapFlag = true;
- VMCPU_HMCF_SET(pVCpu, HM_CHANGED_GUEST_RFLAGS);
+ HMCPU_CF_SET(pVCpu, HM_CHANGED_GUEST_RFLAGS);
fInterceptDB = true;
}
}
@@ -3581,7 +3581,7 @@ static int hmR0VmxLoadSharedDebugState(PVMCPU pVCpu, PCPUMCTX pMixedCtx)
rc = VMXWriteVmcs32(VMX_VMCS32_CTRL_PROC_EXEC, pVCpu->hm.s.vmx.u32ProcCtls);
AssertRCReturn(rc, rc);
- VMCPU_HMCF_CLEAR(pVCpu, HM_CHANGED_GUEST_DEBUG);
+ HMCPU_CF_CLEAR(pVCpu, HM_CHANGED_GUEST_DEBUG);
return VINF_SUCCESS;
}
@@ -3697,10 +3697,13 @@ static void hmR0VmxValidateSegmentRegs(PVM pVM, PVMCPU pVCpu, PCPUMCTX pCtx)
}
/* 64-bit capable CPUs. */
# if HC_ARCH_BITS == 64 || defined(VBOX_WITH_HYBRID_32BIT_KERNEL)
- Assert(!(pCtx->cs.u64Base >> 32));
- Assert(!pCtx->ss.Attr.u || !(pCtx->ss.u64Base >> 32));
- Assert(!pCtx->ds.Attr.u || !(pCtx->ds.u64Base >> 32));
- Assert(!pCtx->es.Attr.u || !(pCtx->es.u64Base >> 32));
+ if (HMVMX_IS_64BIT_HOST_MODE())
+ {
+ Assert(!(pCtx->cs.u64Base >> 32));
+ Assert(!pCtx->ss.Attr.u || !(pCtx->ss.u64Base >> 32));
+ Assert(!pCtx->ds.Attr.u || !(pCtx->ds.u64Base >> 32));
+ Assert(!pCtx->es.Attr.u || !(pCtx->es.u64Base >> 32));
+ }
# endif
}
else if ( CPUMIsGuestInV86ModeEx(pCtx)
@@ -3746,10 +3749,13 @@ static void hmR0VmxValidateSegmentRegs(PVM pVM, PVMCPU pVCpu, PCPUMCTX pCtx)
Assert(u32GSAttr == 0xf3);
/* 64-bit capable CPUs. */
# if HC_ARCH_BITS == 64 || defined(VBOX_WITH_HYBRID_32BIT_KERNEL)
- Assert(!(pCtx->cs.u64Base >> 32));
- Assert(!u32SSAttr || !(pCtx->ss.u64Base >> 32));
- Assert(!u32DSAttr || !(pCtx->ds.u64Base >> 32));
- Assert(!u32ESAttr || !(pCtx->es.u64Base >> 32));
+ if (HMVMX_IS_64BIT_HOST_MODE())
+ {
+ Assert(!(pCtx->cs.u64Base >> 32));
+ Assert(!u32SSAttr || !(pCtx->ss.u64Base >> 32));
+ Assert(!u32DSAttr || !(pCtx->ds.u64Base >> 32));
+ Assert(!u32ESAttr || !(pCtx->es.u64Base >> 32));
+ }
# endif
}
}
@@ -3832,7 +3838,7 @@ static int hmR0VmxLoadGuestSegmentRegs(PVMCPU pVCpu, PCPUMCTX pMixedCtx)
/*
* Guest Segment registers: CS, SS, DS, ES, FS, GS.
*/
- if (VMCPU_HMCF_IS_PENDING(pVCpu, HM_CHANGED_GUEST_SEGMENT_REGS))
+ if (HMCPU_CF_IS_PENDING(pVCpu, HM_CHANGED_GUEST_SEGMENT_REGS))
{
/* Save the segment attributes for real-on-v86 mode hack, so we can restore them on VM-exit. */
if (pVCpu->hm.s.vmx.RealMode.fRealOnV86Active)
@@ -3885,7 +3891,7 @@ static int hmR0VmxLoadGuestSegmentRegs(PVMCPU pVCpu, PCPUMCTX pMixedCtx)
hmR0VmxValidateSegmentRegs(pVM, pVCpu, pMixedCtx);
#endif
- VMCPU_HMCF_CLEAR(pVCpu, HM_CHANGED_GUEST_SEGMENT_REGS);
+ HMCPU_CF_CLEAR(pVCpu, HM_CHANGED_GUEST_SEGMENT_REGS);
Log4(("Load: CS=%#RX16 Base=%#RX64 Limit=%#RX32 Attr=%#RX32\n", pMixedCtx->cs.Sel, pMixedCtx->cs.u64Base,
pMixedCtx->cs.u32Limit, pMixedCtx->cs.Attr.u));
}
@@ -3893,7 +3899,7 @@ static int hmR0VmxLoadGuestSegmentRegs(PVMCPU pVCpu, PCPUMCTX pMixedCtx)
/*
* Guest TR.
*/
- if (VMCPU_HMCF_IS_PENDING(pVCpu, HM_CHANGED_GUEST_TR))
+ if (HMCPU_CF_IS_PENDING(pVCpu, HM_CHANGED_GUEST_TR))
{
/*
* Real-mode emulation using virtual-8086 mode with CR4.VME. Interrupt redirection is achieved
@@ -3952,14 +3958,14 @@ static int hmR0VmxLoadGuestSegmentRegs(PVMCPU pVCpu, PCPUMCTX pMixedCtx)
rc = VMXWriteVmcsGstN(VMX_VMCS_GUEST_TR_BASE, u64Base); AssertRCReturn(rc, rc);
rc = VMXWriteVmcs32(VMX_VMCS32_GUEST_TR_ACCESS_RIGHTS, u32AccessRights); AssertRCReturn(rc, rc);
- VMCPU_HMCF_CLEAR(pVCpu, HM_CHANGED_GUEST_TR);
+ HMCPU_CF_CLEAR(pVCpu, HM_CHANGED_GUEST_TR);
Log4(("Load: VMX_VMCS_GUEST_TR_BASE=%#RX64\n", u64Base));
}
/*
* Guest GDTR.
*/
- if (VMCPU_HMCF_IS_PENDING(pVCpu, HM_CHANGED_GUEST_GDTR))
+ if (HMCPU_CF_IS_PENDING(pVCpu, HM_CHANGED_GUEST_GDTR))
{
rc = VMXWriteVmcs32(VMX_VMCS32_GUEST_GDTR_LIMIT, pMixedCtx->gdtr.cbGdt); AssertRCReturn(rc, rc);
rc = VMXWriteVmcsGstN(VMX_VMCS_GUEST_GDTR_BASE, pMixedCtx->gdtr.pGdt); AssertRCReturn(rc, rc);
@@ -3967,14 +3973,14 @@ static int hmR0VmxLoadGuestSegmentRegs(PVMCPU pVCpu, PCPUMCTX pMixedCtx)
/* Validate. */
Assert(!(pMixedCtx->gdtr.cbGdt & 0xffff0000)); /* Bits 31:16 MBZ. */
- VMCPU_HMCF_CLEAR(pVCpu, HM_CHANGED_GUEST_GDTR);
+ HMCPU_CF_CLEAR(pVCpu, HM_CHANGED_GUEST_GDTR);
Log4(("Load: VMX_VMCS_GUEST_GDTR_BASE=%#RX64\n", pMixedCtx->gdtr.pGdt));
}
/*
* Guest LDTR.
*/
- if (VMCPU_HMCF_IS_PENDING(pVCpu, HM_CHANGED_GUEST_LDTR))
+ if (HMCPU_CF_IS_PENDING(pVCpu, HM_CHANGED_GUEST_LDTR))
{
/* The unusable bit is specific to VT-x, if it's a null selector mark it as an unusable segment. */
uint32_t u32Access = 0;
@@ -4003,14 +4009,14 @@ static int hmR0VmxLoadGuestSegmentRegs(PVMCPU pVCpu, PCPUMCTX pMixedCtx)
|| pMixedCtx->ldtr.Attr.n.u1Granularity); /* Granularity MB1. */
}
- VMCPU_HMCF_CLEAR(pVCpu, HM_CHANGED_GUEST_LDTR);
+ HMCPU_CF_CLEAR(pVCpu, HM_CHANGED_GUEST_LDTR);
Log4(("Load: VMX_VMCS_GUEST_LDTR_BASE=%#RX64\n", pMixedCtx->ldtr.u64Base));
}
/*
* Guest IDTR.
*/
- if (VMCPU_HMCF_IS_PENDING(pVCpu, HM_CHANGED_GUEST_IDTR))
+ if (HMCPU_CF_IS_PENDING(pVCpu, HM_CHANGED_GUEST_IDTR))
{
rc = VMXWriteVmcs32(VMX_VMCS32_GUEST_IDTR_LIMIT, pMixedCtx->idtr.cbIdt); AssertRCReturn(rc, rc);
rc = VMXWriteVmcsGstN(VMX_VMCS_GUEST_IDTR_BASE, pMixedCtx->idtr.pIdt); AssertRCReturn(rc, rc);
@@ -4018,7 +4024,7 @@ static int hmR0VmxLoadGuestSegmentRegs(PVMCPU pVCpu, PCPUMCTX pMixedCtx)
/* Validate. */
Assert(!(pMixedCtx->idtr.cbIdt & 0xffff0000)); /* Bits 31:16 MBZ. */
- VMCPU_HMCF_CLEAR(pVCpu, HM_CHANGED_GUEST_IDTR);
+ HMCPU_CF_CLEAR(pVCpu, HM_CHANGED_GUEST_IDTR);
Log4(("Load: VMX_VMCS_GUEST_IDTR_BASE=%#RX64\n", pMixedCtx->idtr.pIdt));
}
@@ -4049,7 +4055,7 @@ static int hmR0VmxLoadGuestMsrs(PVMCPU pVCpu, PCPUMCTX pMixedCtx)
* MSRs covered by Auto-load/store: EFER, LSTAR, STAR, SF_MASK, TSC_AUX (RDTSCP).
*/
int rc = VINF_SUCCESS;
- if (VMCPU_HMCF_IS_PENDING(pVCpu, HM_CHANGED_VMX_GUEST_AUTO_MSRS))
+ if (HMCPU_CF_IS_PENDING(pVCpu, HM_CHANGED_VMX_GUEST_AUTO_MSRS))
{
#ifdef VBOX_WITH_AUTO_MSR_LOAD_RESTORE
PVM pVM = pVCpu->CTX_SUFF(pVM);
@@ -4107,7 +4113,7 @@ static int hmR0VmxLoadGuestMsrs(PVMCPU pVCpu, PCPUMCTX pMixedCtx)
rc = VMXWriteVmcs32(VMX_VMCS32_CTRL_EXIT_MSR_STORE_COUNT, cGuestMsrs); AssertRCReturn(rc, rc);
#endif /* VBOX_WITH_AUTO_MSR_LOAD_RESTORE */
- VMCPU_HMCF_CLEAR(pVCpu, HM_CHANGED_VMX_GUEST_AUTO_MSRS);
+ HMCPU_CF_CLEAR(pVCpu, HM_CHANGED_VMX_GUEST_AUTO_MSRS);
}
/*
@@ -4115,22 +4121,22 @@ static int hmR0VmxLoadGuestMsrs(PVMCPU pVCpu, PCPUMCTX pMixedCtx)
* These flags are only set when MSR-bitmaps are not supported by the CPU and we cause
* VM-exits on WRMSRs for these MSRs.
*/
- if (VMCPU_HMCF_IS_PENDING(pVCpu, HM_CHANGED_GUEST_SYSENTER_CS_MSR))
+ if (HMCPU_CF_IS_PENDING(pVCpu, HM_CHANGED_GUEST_SYSENTER_CS_MSR))
{
rc = VMXWriteVmcs32(VMX_VMCS32_GUEST_SYSENTER_CS, pMixedCtx->SysEnter.cs); AssertRCReturn(rc, rc);
- VMCPU_HMCF_CLEAR(pVCpu, HM_CHANGED_GUEST_SYSENTER_CS_MSR);
+ HMCPU_CF_CLEAR(pVCpu, HM_CHANGED_GUEST_SYSENTER_CS_MSR);
}
- if (VMCPU_HMCF_IS_PENDING(pVCpu, HM_CHANGED_GUEST_SYSENTER_EIP_MSR))
+ if (HMCPU_CF_IS_PENDING(pVCpu, HM_CHANGED_GUEST_SYSENTER_EIP_MSR))
{
rc = VMXWriteVmcsGstN(VMX_VMCS_GUEST_SYSENTER_EIP, pMixedCtx->SysEnter.eip); AssertRCReturn(rc, rc);
- VMCPU_HMCF_CLEAR(pVCpu, HM_CHANGED_GUEST_SYSENTER_EIP_MSR);
+ HMCPU_CF_CLEAR(pVCpu, HM_CHANGED_GUEST_SYSENTER_EIP_MSR);
}
- if (VMCPU_HMCF_IS_PENDING(pVCpu, HM_CHANGED_GUEST_SYSENTER_ESP_MSR))
+ if (HMCPU_CF_IS_PENDING(pVCpu, HM_CHANGED_GUEST_SYSENTER_ESP_MSR))
{
rc = VMXWriteVmcsGstN(VMX_VMCS_GUEST_SYSENTER_ESP, pMixedCtx->SysEnter.esp); AssertRCReturn(rc, rc);
- VMCPU_HMCF_CLEAR(pVCpu, HM_CHANGED_GUEST_SYSENTER_ESP_MSR);
+ HMCPU_CF_CLEAR(pVCpu, HM_CHANGED_GUEST_SYSENTER_ESP_MSR);
}
return rc;
@@ -4152,12 +4158,12 @@ static int hmR0VmxLoadGuestActivityState(PVMCPU pVCpu, PCPUMCTX pCtx)
{
/** @todo See if we can make use of other states, e.g.
* VMX_VMCS_GUEST_ACTIVITY_SHUTDOWN or HLT. */
- if (VMCPU_HMCF_IS_PENDING(pVCpu, HM_CHANGED_VMX_GUEST_ACTIVITY_STATE))
+ if (HMCPU_CF_IS_PENDING(pVCpu, HM_CHANGED_VMX_GUEST_ACTIVITY_STATE))
{
int rc = VMXWriteVmcs32(VMX_VMCS32_GUEST_ACTIVITY_STATE, VMX_VMCS_GUEST_ACTIVITY_ACTIVE);
AssertRCReturn(rc, rc);
- VMCPU_HMCF_CLEAR(pVCpu, HM_CHANGED_VMX_GUEST_ACTIVITY_STATE);
+ HMCPU_CF_CLEAR(pVCpu, HM_CHANGED_VMX_GUEST_ACTIVITY_STATE);
}
return VINF_SUCCESS;
}
@@ -4187,7 +4193,7 @@ static int hmR0VmxSetupVMRunHandler(PVMCPU pVCpu, PCPUMCTX pMixedCtx)
if (pVCpu->hm.s.vmx.pfnStartVM != VMXR0SwitcherStartVM64)
{
pVCpu->hm.s.vmx.pfnStartVM = VMXR0SwitcherStartVM64;
- VMCPU_HMCF_SET(pVCpu, HM_CHANGED_HOST_CONTEXT | HM_CHANGED_VMX_EXIT_CTLS | HM_CHANGED_VMX_ENTRY_CTLS);
+ HMCPU_CF_SET(pVCpu, HM_CHANGED_HOST_CONTEXT | HM_CHANGED_VMX_EXIT_CTLS | HM_CHANGED_VMX_ENTRY_CTLS);
}
#else
/* 64-bit host or hybrid host. */
@@ -4201,7 +4207,7 @@ static int hmR0VmxSetupVMRunHandler(PVMCPU pVCpu, PCPUMCTX pMixedCtx)
if (pVCpu->hm.s.vmx.pfnStartVM != VMXR0StartVM32)
{
pVCpu->hm.s.vmx.pfnStartVM = VMXR0StartVM32;
- VMCPU_HMCF_SET(pVCpu, HM_CHANGED_HOST_CONTEXT | HM_CHANGED_VMX_EXIT_CTLS | HM_CHANGED_VMX_ENTRY_CTLS);
+ HMCPU_CF_SET(pVCpu, HM_CHANGED_HOST_CONTEXT | HM_CHANGED_VMX_EXIT_CTLS | HM_CHANGED_VMX_ENTRY_CTLS);
}
#else
pVCpu->hm.s.vmx.pfnStartVM = VMXR0StartVM32;
@@ -6254,7 +6260,7 @@ static int hmR0VmxLeave(PVM pVM, PVMCPU pVCpu, PCPUMCTX pMixedCtx, bool fSaveGue
}
CPUMR0SaveGuestFPU(pVM, pVCpu, pMixedCtx);
Assert(!CPUMIsGuestFPUStateActive(pVCpu));
- VMCPU_HMCF_SET(pVCpu, HM_CHANGED_GUEST_CR0);
+ HMCPU_CF_SET(pVCpu, HM_CHANGED_GUEST_CR0);
}
/* Restore host debug registers if necessary and resync on next R0 reentry. */
@@ -6263,7 +6269,7 @@ static int hmR0VmxLeave(PVM pVM, PVMCPU pVCpu, PCPUMCTX pMixedCtx, bool fSaveGue
Assert(pVCpu->hm.s.vmx.u32ProcCtls & VMX_VMCS_CTRL_PROC_EXEC_MOV_DR_EXIT);
#endif
if (CPUMR0DebugStateMaybeSaveGuestAndRestoreHost(pVCpu, true /* save DR6 */))
- VMCPU_HMCF_SET(pVCpu, HM_CHANGED_GUEST_DEBUG);
+ HMCPU_CF_SET(pVCpu, HM_CHANGED_GUEST_DEBUG);
Assert(!CPUMIsGuestDebugStateActive(pVCpu) && !CPUMIsGuestDebugStateActivePending(pVCpu));
Assert(!CPUMIsHyperDebugStateActive(pVCpu) && !CPUMIsHyperDebugStateActivePending(pVCpu));
@@ -6448,7 +6454,7 @@ static int hmR0VmxExitToRing3(PVM pVM, PVMCPU pVCpu, PCPUMCTX pMixedCtx, int rcE
/* On our way back from ring-3 reload the guest state if there is a possibility of it being changed. */
if (rcExit != VINF_EM_RAW_INTERRUPT)
- VMCPU_HMCF_SET(pVCpu, HM_CHANGED_ALL_GUEST);
+ HMCPU_CF_SET(pVCpu, HM_CHANGED_ALL_GUEST);
STAM_COUNTER_INC(&pVCpu->hm.s.StatSwitchExitToR3);
@@ -6694,38 +6700,34 @@ static int hmR0VmxInjectPendingEvent(PVMCPU pVCpu, PCPUMCTX pMixedCtx)
}
/* Delivery pending debug exception if the guest is single-stepping. Evaluate and set the BS bit. */
- int rc2 = VINF_SUCCESS;
- if ( fBlockSti
- || fBlockMovSS)
+ if ( !pVCpu->hm.s.fSingleInstruction
+ && !DBGFIsStepping(pVCpu))
{
- if ( !pVCpu->hm.s.fSingleInstruction
- && !DBGFIsStepping(pVCpu))
- {
- Assert(pVCpu->hm.s.vmx.fUpdatedGuestState & HMVMX_UPDATED_GUEST_RFLAGS);
- if (pMixedCtx->eflags.Bits.u1TF) /* We don't have any IA32_DEBUGCTL MSR for guests. Treat as all bits 0. */
- {
- /*
- * The pending-debug exceptions field is cleared on all VM-exits except VMX_EXIT_TPR_BELOW_THRESHOLD,
- * VMX_EXIT_MTF, VMX_EXIT_APIC_WRITE and VMX_EXIT_VIRTUALIZED_EOI.
- * See Intel spec. 27.3.4 "Saving Non-Register State".
- */
- rc2 = VMXWriteVmcs32(VMX_VMCS_GUEST_PENDING_DEBUG_EXCEPTIONS, VMX_VMCS_GUEST_DEBUG_EXCEPTIONS_BS);
- AssertRCReturn(rc, rc);
- }
- }
- else
+ int rc2 = hmR0VmxSaveGuestRflags(pVCpu, pMixedCtx);
+ AssertRCReturn(rc2, rc2);
+ if (pMixedCtx->eflags.Bits.u1TF) /* We don't have any IA32_DEBUGCTL MSR for guests. Treat as all bits 0. */
{
- /* We are single-stepping in the hypervisor debugger, clear interrupt inhibition as setting the BS bit would mean
- delivering a #DB to the guest upon VM-entry when it shouldn't be. */
- uIntrState = 0;
+ /*
+ * The pending-debug exceptions field is cleared on all VM-exits except VMX_EXIT_TPR_BELOW_THRESHOLD,
+ * VMX_EXIT_MTF, VMX_EXIT_APIC_WRITE and VMX_EXIT_VIRTUALIZED_EOI.
+ * See Intel spec. 27.3.4 "Saving Non-Register State".
+ */
+ rc2 = VMXWriteVmcs32(VMX_VMCS_GUEST_PENDING_DEBUG_EXCEPTIONS, VMX_VMCS_GUEST_DEBUG_EXCEPTIONS_BS);
+ AssertRCReturn(rc2, rc2);
}
}
+ else
+ {
+ /* We are single-stepping in the hypervisor debugger, clear interrupt inhibition as setting the BS bit would mean
+ delivering a #DB to the guest upon VM-entry when it shouldn't be. */
+ uIntrState = 0;
+ }
/*
* There's no need to clear the VM entry-interruption information field here if we're not injecting anything.
* VT-x clears the valid bit on every VM-exit. See Intel spec. 24.8.3 "VM-Entry Controls for Event Injection".
*/
- rc2 = hmR0VmxLoadGuestIntrState(pVCpu, uIntrState);
+ int rc2 = hmR0VmxLoadGuestIntrState(pVCpu, uIntrState);
AssertRC(rc2);
Assert(rc == VINF_SUCCESS || rc == VINF_EM_RESET);
@@ -7019,7 +7021,7 @@ static int hmR0VmxInjectEventVmcs(PVMCPU pVCpu, PCPUMCTX pMixedCtx, uint64_t u64
/* If any other guest-state bits are changed here, make sure to update
hmR0VmxPreRunGuestCommitted() when thread-context hooks are used. */
- VMCPU_HMCF_SET(pVCpu, HM_CHANGED_GUEST_SEGMENT_REGS
+ HMCPU_CF_SET(pVCpu, HM_CHANGED_GUEST_SEGMENT_REGS
| HM_CHANGED_GUEST_RIP
| HM_CHANGED_GUEST_RFLAGS
| HM_CHANGED_GUEST_RSP);
@@ -7137,7 +7139,7 @@ VMMR0DECL(int) VMXR0Enter(PVM pVM, PVMCPU pVCpu, PHMGLOBALCPUINFO pCpu)
NOREF(pCpu);
LogFlowFunc(("pVM=%p pVCpu=%p\n", pVM, pVCpu));
- Assert(VMCPU_HMCF_IS_SET(pVCpu, HM_CHANGED_HOST_CONTEXT | HM_CHANGED_HOST_GUEST_SHARED_STATE));
+ Assert(HMCPU_CF_IS_SET(pVCpu, HM_CHANGED_HOST_CONTEXT | HM_CHANGED_HOST_GUEST_SHARED_STATE));
#ifdef VBOX_STRICT
/* Make sure we're in VMX root mode. */
@@ -7225,7 +7227,7 @@ VMMR0DECL(void) VMXR0ThreadCtxCallback(RTTHREADCTXEVENT enmEvent, PVMCPU pVCpu,
initializing VT-x if necessary (onlined CPUs, local init etc.) */
int rc = HMR0EnterCpu(pVCpu);
AssertRC(rc);
- Assert(VMCPU_HMCF_IS_SET(pVCpu, HM_CHANGED_HOST_CONTEXT | HM_CHANGED_HOST_GUEST_SHARED_STATE));
+ Assert(HMCPU_CF_IS_SET(pVCpu, HM_CHANGED_HOST_CONTEXT | HM_CHANGED_HOST_GUEST_SHARED_STATE));
/* Load the active VMCS as the current one. */
if (pVCpu->hm.s.vmx.uVmcsState & HMVMX_VMCS_STATE_CLEAR)
@@ -7264,7 +7266,7 @@ static int hmR0VmxSaveHostState(PVM pVM, PVMCPU pVCpu)
{
Assert(!RTThreadPreemptIsEnabled(NIL_RTTHREAD));
- if (!VMCPU_HMCF_IS_PENDING(pVCpu, HM_CHANGED_HOST_CONTEXT))
+ if (!HMCPU_CF_IS_PENDING(pVCpu, HM_CHANGED_HOST_CONTEXT))
return VINF_SUCCESS;
int rc = hmR0VmxSaveHostControlRegs(pVM, pVCpu);
@@ -7276,7 +7278,7 @@ static int hmR0VmxSaveHostState(PVM pVM, PVMCPU pVCpu)
rc = hmR0VmxSaveHostMsrs(pVM, pVCpu);
AssertLogRelMsgRCReturn(rc, ("hmR0VmxSaveHostMsrs failed! rc=%Rrc (pVM=%p pVCpu=%p)\n", rc, pVM, pVCpu), rc);
- VMCPU_HMCF_CLEAR(pVCpu, HM_CHANGED_HOST_CONTEXT);
+ HMCPU_CF_CLEAR(pVCpu, HM_CHANGED_HOST_CONTEXT);
return rc;
}
@@ -7392,7 +7394,7 @@ static int hmR0VmxLoadGuestState(PVM pVM, PVMCPU pVCpu, PCPUMCTX pMixedCtx)
AssertLogRelMsgRCReturn(rc, ("hmR0VmxLoadGuestRipRspRflags! rc=%Rrc (pVM=%p pVCpu=%p)\n", rc, pVM, pVCpu), rc);
/* Clear any unused and reserved bits. */
- VMCPU_HMCF_CLEAR(pVCpu, HM_CHANGED_GUEST_CR2);
+ HMCPU_CF_CLEAR(pVCpu, HM_CHANGED_GUEST_CR2);
#ifdef LOG_ENABLED
/* Only reenable log-flushing if the caller has it enabled. */
@@ -7419,27 +7421,27 @@ static void hmR0VmxLoadSharedState(PVM pVM, PVMCPU pVCpu, PCPUMCTX pCtx)
Assert(!RTThreadPreemptIsEnabled(NIL_RTTHREAD));
Assert(!VMMRZCallRing3IsEnabled(pVCpu));
- if (VMCPU_HMCF_IS_PENDING(pVCpu, HM_CHANGED_GUEST_CR0))
+ if (HMCPU_CF_IS_PENDING(pVCpu, HM_CHANGED_GUEST_CR0))
{
int rc = hmR0VmxLoadSharedCR0(pVCpu, pCtx);
AssertRC(rc);
}
- if (VMCPU_HMCF_IS_PENDING(pVCpu, HM_CHANGED_GUEST_DEBUG))
+ if (HMCPU_CF_IS_PENDING(pVCpu, HM_CHANGED_GUEST_DEBUG))
{
int rc = hmR0VmxLoadSharedDebugState(pVCpu, pCtx);
AssertRC(rc);
/* Loading shared debug bits might have changed eflags.TF bit for debugging purposes. */
- if (VMCPU_HMCF_IS_PENDING(pVCpu, HM_CHANGED_GUEST_RFLAGS))
+ if (HMCPU_CF_IS_PENDING(pVCpu, HM_CHANGED_GUEST_RFLAGS))
{
rc = hmR0VmxLoadGuestRflags(pVCpu, pCtx);
AssertRC(rc);
}
}
- AssertMsg(!VMCPU_HMCF_IS_PENDING(pVCpu, HM_CHANGED_HOST_GUEST_SHARED_STATE),
- ("fContextUseFlags=%#RX32\n", VMCPU_HMCF_VALUE(pVCpu)));
+ AssertMsg(!HMCPU_CF_IS_PENDING(pVCpu, HM_CHANGED_HOST_GUEST_SHARED_STATE),
+ ("fContextUseFlags=%#RX32\n", HMCPU_CF_VALUE(pVCpu)));
}
@@ -7456,18 +7458,18 @@ DECLINLINE(void) hmR0VmxLoadGuestStateOptimal(PVM pVM, PVMCPU pVCpu, PCPUMCTX pM
{
HMVMX_ASSERT_PREEMPT_SAFE();
- Log5(("LoadFlags=%#RX32\n", VMCPU_HMCF_VALUE(pVCpu)));
+ Log5(("LoadFlags=%#RX32\n", HMCPU_CF_VALUE(pVCpu)));
#ifdef HMVMX_SYNC_FULL_GUEST_STATE
- VMCPU_HMCF_SET(pVCpu, HM_CHANGED_ALL_GUEST);
+ HMCPU_CF_SET(pVCpu, HM_CHANGED_ALL_GUEST);
#endif
- if (VMCPU_HMCF_IS_SET_ONLY(pVCpu, HM_CHANGED_GUEST_RIP))
+ if (HMCPU_CF_IS_SET_ONLY(pVCpu, HM_CHANGED_GUEST_RIP))
{
int rc = hmR0VmxLoadGuestRip(pVCpu, pMixedCtx);
AssertRC(rc);
STAM_COUNTER_INC(&pVCpu->hm.s.StatLoadMinimal);
}
- else if (VMCPU_HMCF_VALUE(pVCpu))
+ else if (HMCPU_CF_VALUE(pVCpu))
{
int rc = hmR0VmxLoadGuestState(pVM, pVCpu, pMixedCtx);
AssertRC(rc);
@@ -7475,9 +7477,9 @@ DECLINLINE(void) hmR0VmxLoadGuestStateOptimal(PVM pVM, PVMCPU pVCpu, PCPUMCTX pM
}
/* All the guest state bits should be loaded except maybe the host context and/or the shared host/guest bits. */
- AssertMsg( !VMCPU_HMCF_IS_PENDING(pVCpu, HM_CHANGED_ALL_GUEST)
- || VMCPU_HMCF_IS_PENDING_ONLY(pVCpu, HM_CHANGED_HOST_CONTEXT | HM_CHANGED_HOST_GUEST_SHARED_STATE),
- ("fContextUseFlags=%#RX32\n", VMCPU_HMCF_VALUE(pVCpu)));
+ AssertMsg( !HMCPU_CF_IS_PENDING(pVCpu, HM_CHANGED_ALL_GUEST)
+ || HMCPU_CF_IS_PENDING_ONLY(pVCpu, HM_CHANGED_HOST_CONTEXT | HM_CHANGED_HOST_GUEST_SHARED_STATE),
+ ("fContextUseFlags=%#RX32\n", HMCPU_CF_VALUE(pVCpu)));
#ifdef HMVMX_ALWAYS_CHECK_GUEST_STATE
uint32_t uInvalidReason = hmR0VmxCheckGuestState(pVM, pVCpu, pMixedCtx);
@@ -7657,28 +7659,28 @@ static void hmR0VmxPreRunGuestCommitted(PVM pVM, PVMCPU pVCpu, PCPUMCTX pMixedCt
#ifdef HMVMX_ALWAYS_SWAP_FPU_STATE
if (!CPUMIsGuestFPUStateActive(pVCpu))
CPUMR0LoadGuestFPU(pVM, pVCpu, pMixedCtx);
- VMCPU_HMCF_SET(pVCpu, HM_CHANGED_GUEST_CR0);
+ HMCPU_CF_SET(pVCpu, HM_CHANGED_GUEST_CR0);
#endif
/*
* Load the host state bits as we may've been preempted (only happens when
* thread-context hooks are used or when hmR0VmxSetupVMRunHandler() changes pfnStartVM).
*/
- if (VMCPU_HMCF_IS_PENDING(pVCpu, HM_CHANGED_HOST_CONTEXT))
+ if (HMCPU_CF_IS_PENDING(pVCpu, HM_CHANGED_HOST_CONTEXT))
{
/* This ASSUMES that pfnStartVM has been set up already. */
int rc = hmR0VmxSaveHostState(pVM, pVCpu);
AssertRC(rc);
STAM_COUNTER_INC(&pVCpu->hm.s.StatPreemptSaveHostState);
}
- Assert(!VMCPU_HMCF_IS_PENDING(pVCpu, HM_CHANGED_HOST_CONTEXT));
+ Assert(!HMCPU_CF_IS_PENDING(pVCpu, HM_CHANGED_HOST_CONTEXT));
/*
* Load the state shared between host and guest (FPU, debug).
*/
- if (VMCPU_HMCF_IS_PENDING(pVCpu, HM_CHANGED_HOST_GUEST_SHARED_STATE))
+ if (HMCPU_CF_IS_PENDING(pVCpu, HM_CHANGED_HOST_GUEST_SHARED_STATE))
hmR0VmxLoadSharedState(pVM, pVCpu, pMixedCtx);
- AssertMsg(!VMCPU_HMCF_VALUE(pVCpu), ("fContextUseFlags=%#RX32\n", VMCPU_HMCF_VALUE(pVCpu)));
+ AssertMsg(!HMCPU_CF_VALUE(pVCpu), ("fContextUseFlags=%#RX32\n", HMCPU_CF_VALUE(pVCpu)));
/* Store status of the shared guest-host state at the time of VM-entry. */
#if HC_ARCH_BITS == 32 && defined(VBOX_WITH_64_BITS_GUESTS) && !defined(VBOX_WITH_HYBRID_32BIT_KERNEL)
@@ -7786,7 +7788,7 @@ static void hmR0VmxPostRunGuest(PVM pVM, PVMCPU pVCpu, PCPUMCTX pMixedCtx, PVMXT
{
hmR0VmxSaveGuestCR0(pVCpu, pMixedCtx);
CPUMR0SaveGuestFPU(pVM, pVCpu, pMixedCtx);
- VMCPU_HMCF_SET(pVCpu, HM_CHANGED_GUEST_CR0);
+ HMCPU_CF_SET(pVCpu, HM_CHANGED_GUEST_CR0);
}
#endif
@@ -7830,7 +7832,7 @@ static void hmR0VmxPostRunGuest(PVM pVM, PVMCPU pVCpu, PCPUMCTX pMixedCtx, PVMXT
{
rc = PDMApicSetTPR(pVCpu, pVCpu->hm.s.vmx.pbVirtApic[0x80]);
AssertRC(rc);
- VMCPU_HMCF_SET(pVCpu, HM_CHANGED_VMX_GUEST_APIC_STATE);
+ HMCPU_CF_SET(pVCpu, HM_CHANGED_VMX_GUEST_APIC_STATE);
}
}
}
@@ -7992,7 +7994,7 @@ static int hmR0VmxRunGuestCodeStep(PVM pVM, PVMCPU pVCpu, PCPUMCTX pCtx)
rc = VINF_EM_DBG_STEPPED;
break;
}
- VMCPU_HMCF_SET(pVCpu, HM_CHANGED_GUEST_DEBUG);
+ HMCPU_CF_SET(pVCpu, HM_CHANGED_GUEST_DEBUG);
}
STAM_PROFILE_ADV_STOP(&pVCpu->hm.s.StatEntry, x);
@@ -8170,7 +8172,7 @@ DECLINLINE(int) hmR0VmxAdvanceGuestRip(PVMCPU pVCpu, PCPUMCTX pMixedCtx, PVMXTRA
AssertRCReturn(rc, rc);
pMixedCtx->rip += pVmxTransient->cbInstr;
- VMCPU_HMCF_SET(pVCpu, HM_CHANGED_GUEST_RIP);
+ HMCPU_CF_SET(pVCpu, HM_CHANGED_GUEST_RIP);
return rc;
}
@@ -8254,7 +8256,7 @@ static uint32_t hmR0VmxCheckGuestState(PVM pVM, PVMCPU pVCpu, PCPUMCTX pCtx)
#ifdef VBOX_STRICT
rc = VMXReadVmcs32(VMX_VMCS32_CTRL_ENTRY, &u32Val);
AssertRCBreak(rc);
- Assert(u32Val == pVCpu->hm.s.vmx.u32ProcCtls);
+ Assert(u32Val == pVCpu->hm.s.vmx.u32EntryCtls);
#endif
bool const fLongModeGuest = RT_BOOL(pVCpu->hm.s.vmx.u32EntryCtls & VMX_VMCS_CTRL_ENTRY_IA32E_MODE_GUEST);
@@ -8759,7 +8761,28 @@ static uint32_t hmR0VmxCheckGuestState(PVM pVM, PVMCPU pVCpu, PCPUMCTX pCtx)
/** @todo SMM checks. */
}
- /** @todo Checks on Guest Page-Directory-Pointer-Table Entries. */
+ /** @todo Checks on Guest Page-Directory-Pointer-Table Entries when guest is
+ * not using Nested Paging? */
+ if ( pVM->hm.s.fNestedPaging
+ && !fLongModeGuest
+ && CPUMIsGuestInPAEModeEx(pCtx))
+ {
+ rc = VMXReadVmcs64(VMX_VMCS64_GUEST_PDPTE0_FULL, &u64Val);
+ AssertRCBreak(rc);
+ HMVMX_CHECK_BREAK(!(u64Val & X86_PDPE_PAE_MBZ_MASK), VMX_IGS_PAE_PDPTE_RESERVED);
+
+ rc = VMXReadVmcs64(VMX_VMCS64_GUEST_PDPTE1_FULL, &u64Val);
+ AssertRCBreak(rc);
+ HMVMX_CHECK_BREAK(!(u64Val & X86_PDPE_PAE_MBZ_MASK), VMX_IGS_PAE_PDPTE_RESERVED);
+
+ rc = VMXReadVmcs64(VMX_VMCS64_GUEST_PDPTE2_FULL, &u64Val);
+ AssertRCBreak(rc);
+ HMVMX_CHECK_BREAK(!(u64Val & X86_PDPE_PAE_MBZ_MASK), VMX_IGS_PAE_PDPTE_RESERVED);
+
+ rc = VMXReadVmcs64(VMX_VMCS64_GUEST_PDPTE3_FULL, &u64Val);
+ AssertRCBreak(rc);
+ HMVMX_CHECK_BREAK(!(u64Val & X86_PDPE_PAE_MBZ_MASK), VMX_IGS_PAE_PDPTE_RESERVED);
+ }
/* Shouldn't happen but distinguish it from AssertRCBreak() errors. */
if (uError == VMX_IGS_ERROR)
@@ -8789,12 +8812,9 @@ HMVMX_EXIT_DECL hmR0VmxExitExtInt(PVMCPU pVCpu, PCPUMCTX pMixedCtx, PVMXTRANSIEN
{
HMVMX_VALIDATE_EXIT_HANDLER_PARAMS();
STAM_COUNTER_INC(&pVCpu->hm.s.StatExitExtInt);
- /* 32-bit Windows hosts (4 cores) has trouble with this; causes higher interrupt latency. */
-#if HC_ARCH_BITS == 64
- Assert(ASMIntAreEnabled());
- if (pVCpu->CTX_SUFF(pVM)->hm.s.vmx.fUsePreemptTimer)
+ /* Windows hosts (32-bit and 64-bit) have DPC latency issues. See @bugref{6853}. */
+ if (VMMR0ThreadCtxHooksAreRegistered(pVCpu))
return VINF_SUCCESS;
-#endif
return VINF_EM_RAW_INTERRUPT;
}
@@ -8847,8 +8867,11 @@ HMVMX_EXIT_DECL hmR0VmxExitXcptOrNmi(PVMCPU pVCpu, PCPUMCTX pMixedCtx, PVMXTRANS
uint32_t uVector = VMX_EXIT_INTERRUPTION_INFO_VECTOR(uExitIntInfo);
switch (uIntType)
{
- case VMX_EXIT_INTERRUPTION_INFO_TYPE_SW_XCPT: /* Software exception. (#BP or #OF) */
- Assert(uVector == X86_XCPT_DB || uVector == X86_XCPT_BP || uVector == X86_XCPT_OF);
+ case VMX_EXIT_INTERRUPTION_INFO_TYPE_PRIV_SW_XCPT: /* Privileged software exception. (#DB from ICEBP) */
+ Assert(uVector == X86_XCPT_DB);
+ /* no break */
+ case VMX_EXIT_INTERRUPTION_INFO_TYPE_SW_XCPT: /* Software exception. (#BP or #OF) */
+ Assert(uVector == X86_XCPT_BP || uVector == X86_XCPT_OF || uIntType == VMX_EXIT_INTERRUPTION_INFO_TYPE_PRIV_SW_XCPT);
/* no break */
case VMX_EXIT_INTERRUPTION_INFO_TYPE_HW_XCPT:
{
@@ -9284,7 +9307,7 @@ HMVMX_EXIT_DECL hmR0VmxExitHlt(PVMCPU pVCpu, PCPUMCTX pMixedCtx, PVMXTRANSIENT p
AssertRCReturn(rc, rc);
pMixedCtx->rip++;
- VMCPU_HMCF_SET(pVCpu, HM_CHANGED_GUEST_RIP);
+ HMCPU_CF_SET(pVCpu, HM_CHANGED_GUEST_RIP);
if (EMShouldContinueAfterHalt(pVCpu, pMixedCtx)) /* Requires eflags. */
rc = VINF_SUCCESS;
else
@@ -9530,10 +9553,10 @@ HMVMX_EXIT_DECL hmR0VmxExitWrmsr(PVMCPU pVCpu, PCPUMCTX pMixedCtx, PVMXTRANSIENT
/* We've already saved the APIC related guest-state (TPR) in hmR0VmxPostRunGuest(). When full APIC register
* virtualization is implemented we'll have to make sure APIC state is saved from the VMCS before
EMInterpretWrmsr() changes it. */
- VMCPU_HMCF_SET(pVCpu, HM_CHANGED_VMX_GUEST_APIC_STATE);
+ HMCPU_CF_SET(pVCpu, HM_CHANGED_VMX_GUEST_APIC_STATE);
}
else if (pMixedCtx->ecx == MSR_K6_EFER) /* EFER is the only MSR we auto-load but don't allow write-passthrough. */
- VMCPU_HMCF_SET(pVCpu, HM_CHANGED_VMX_GUEST_AUTO_MSRS);
+ HMCPU_CF_SET(pVCpu, HM_CHANGED_VMX_GUEST_AUTO_MSRS);
else if (pMixedCtx->ecx == MSR_IA32_TSC) /* Windows 7 does this during bootup. See @bugref{6398}. */
pVmxTransient->fUpdateTscOffsettingAndPreemptTimer = true;
@@ -9542,12 +9565,12 @@ HMVMX_EXIT_DECL hmR0VmxExitWrmsr(PVMCPU pVCpu, PCPUMCTX pMixedCtx, PVMXTRANSIENT
{
switch (pMixedCtx->ecx)
{
- case MSR_IA32_SYSENTER_CS: VMCPU_HMCF_SET(pVCpu, HM_CHANGED_GUEST_SYSENTER_CS_MSR); break;
- case MSR_IA32_SYSENTER_EIP: VMCPU_HMCF_SET(pVCpu, HM_CHANGED_GUEST_SYSENTER_EIP_MSR); break;
- case MSR_IA32_SYSENTER_ESP: VMCPU_HMCF_SET(pVCpu, HM_CHANGED_GUEST_SYSENTER_ESP_MSR); break;
+ case MSR_IA32_SYSENTER_CS: HMCPU_CF_SET(pVCpu, HM_CHANGED_GUEST_SYSENTER_CS_MSR); break;
+ case MSR_IA32_SYSENTER_EIP: HMCPU_CF_SET(pVCpu, HM_CHANGED_GUEST_SYSENTER_EIP_MSR); break;
+ case MSR_IA32_SYSENTER_ESP: HMCPU_CF_SET(pVCpu, HM_CHANGED_GUEST_SYSENTER_ESP_MSR); break;
case MSR_K8_FS_BASE: /* no break */
- case MSR_K8_GS_BASE: VMCPU_HMCF_SET(pVCpu, HM_CHANGED_GUEST_SEGMENT_REGS); break;
- case MSR_K8_KERNEL_GS_BASE: VMCPU_HMCF_SET(pVCpu, HM_CHANGED_VMX_GUEST_AUTO_MSRS); break;
+ case MSR_K8_GS_BASE: HMCPU_CF_SET(pVCpu, HM_CHANGED_GUEST_SEGMENT_REGS); break;
+ case MSR_K8_KERNEL_GS_BASE: HMCPU_CF_SET(pVCpu, HM_CHANGED_VMX_GUEST_AUTO_MSRS); break;
}
}
#ifdef VBOX_STRICT
@@ -9614,7 +9637,7 @@ HMVMX_EXIT_DECL hmR0VmxExitTprBelowThreshold(PVMCPU pVCpu, PCPUMCTX pMixedCtx, P
* the threshold in the VMCS, deliver the pending interrupt via hmR0VmxPreRunGuest()->hmR0VmxInjectEvent() and
* resume guest execution.
*/
- VMCPU_HMCF_SET(pVCpu, HM_CHANGED_VMX_GUEST_APIC_STATE);
+ HMCPU_CF_SET(pVCpu, HM_CHANGED_VMX_GUEST_APIC_STATE);
STAM_COUNTER_INC(&pVCpu->hm.s.StatExitTprBelowThreshold);
return VINF_SUCCESS;
}
@@ -9662,7 +9685,7 @@ HMVMX_EXIT_DECL hmR0VmxExitMovCRx(PVMCPU pVCpu, PCPUMCTX pMixedCtx, PVMXTRANSIEN
switch (VMX_EXIT_QUALIFICATION_CRX_REGISTER(uExitQualification))
{
case 0: /* CR0 */
- VMCPU_HMCF_SET(pVCpu, HM_CHANGED_GUEST_CR0);
+ HMCPU_CF_SET(pVCpu, HM_CHANGED_GUEST_CR0);
Log4(("CRX CR0 write rc=%d CR0=%#RX64\n", rc, pMixedCtx->cr0));
break;
case 2: /* CR2 */
@@ -9670,17 +9693,17 @@ HMVMX_EXIT_DECL hmR0VmxExitMovCRx(PVMCPU pVCpu, PCPUMCTX pMixedCtx, PVMXTRANSIEN
break;
case 3: /* CR3 */
Assert(!pVM->hm.s.fNestedPaging || !CPUMIsGuestPagingEnabledEx(pMixedCtx));
- VMCPU_HMCF_SET(pVCpu, HM_CHANGED_GUEST_CR3);
+ HMCPU_CF_SET(pVCpu, HM_CHANGED_GUEST_CR3);
Log4(("CRX CR3 write rc=%d CR3=%#RX64\n", rc, pMixedCtx->cr3));
break;
case 4: /* CR4 */
- VMCPU_HMCF_SET(pVCpu, HM_CHANGED_GUEST_CR4);
+ HMCPU_CF_SET(pVCpu, HM_CHANGED_GUEST_CR4);
Log4(("CRX CR4 write rc=%d CR4=%#RX64\n", rc, pMixedCtx->cr4));
break;
case 8: /* CR8 */
Assert(!(pVCpu->hm.s.vmx.u32ProcCtls & VMX_VMCS_CTRL_PROC_EXEC_USE_TPR_SHADOW));
/* CR8 contains the APIC TPR. Was updated by EMInterpretCRxWrite(). */
- VMCPU_HMCF_SET(pVCpu, HM_CHANGED_VMX_GUEST_APIC_STATE);
+ HMCPU_CF_SET(pVCpu, HM_CHANGED_VMX_GUEST_APIC_STATE);
break;
default:
AssertMsgFailed(("Invalid CRx register %#x\n", VMX_EXIT_QUALIFICATION_CRX_REGISTER(uExitQualification)));
@@ -9695,6 +9718,7 @@ HMVMX_EXIT_DECL hmR0VmxExitMovCRx(PVMCPU pVCpu, PCPUMCTX pMixedCtx, PVMXTRANSIEN
{
/* EMInterpretCRxRead() requires EFER MSR, CS. */
rc = hmR0VmxSaveGuestSegmentRegs(pVCpu, pMixedCtx);
+ rc |= hmR0VmxSaveGuestControlRegs(pVCpu, pMixedCtx);
AssertRCReturn(rc, rc);
Assert( !pVM->hm.s.fNestedPaging
|| !CPUMIsGuestPagingEnabledEx(pMixedCtx)
@@ -9719,7 +9743,7 @@ HMVMX_EXIT_DECL hmR0VmxExitMovCRx(PVMCPU pVCpu, PCPUMCTX pMixedCtx, PVMXTRANSIEN
AssertRCReturn(rc, rc);
rc = EMInterpretCLTS(pVM, pVCpu);
AssertRCReturn(rc, rc);
- VMCPU_HMCF_SET(pVCpu, HM_CHANGED_GUEST_CR0);
+ HMCPU_CF_SET(pVCpu, HM_CHANGED_GUEST_CR0);
STAM_COUNTER_INC(&pVCpu->hm.s.StatExitClts);
Log4(("CRX CLTS write rc=%d\n", rc));
break;
@@ -9731,7 +9755,7 @@ HMVMX_EXIT_DECL hmR0VmxExitMovCRx(PVMCPU pVCpu, PCPUMCTX pMixedCtx, PVMXTRANSIEN
AssertRCReturn(rc, rc);
rc = EMInterpretLMSW(pVM, pVCpu, CPUMCTX2CORE(pMixedCtx), VMX_EXIT_QUALIFICATION_CRX_LMSW_DATA(uExitQualification));
if (RT_LIKELY(rc == VINF_SUCCESS))
- VMCPU_HMCF_SET(pVCpu, HM_CHANGED_GUEST_CR0);
+ HMCPU_CF_SET(pVCpu, HM_CHANGED_GUEST_CR0);
STAM_COUNTER_INC(&pVCpu->hm.s.StatExitLmsw);
Log4(("CRX LMSW write rc=%d\n", rc));
break;
@@ -9838,7 +9862,7 @@ HMVMX_EXIT_DECL hmR0VmxExitIoInstr(PVMCPU pVCpu, PCPUMCTX pMixedCtx, PVMXTRANSIE
rcStrict = IEMExecOne(pVCpu);
}
/** @todo IEM needs to be setting these flags somehow. */
- VMCPU_HMCF_SET(pVCpu, HM_CHANGED_GUEST_RIP);
+ HMCPU_CF_SET(pVCpu, HM_CHANGED_GUEST_RIP);
fUpdateRipAlready = true;
#else
PDISCPUSTATE pDis = &pVCpu->hm.s.DisState;
@@ -9900,9 +9924,13 @@ HMVMX_EXIT_DECL hmR0VmxExitIoInstr(PVMCPU pVCpu, PCPUMCTX pMixedCtx, PVMXTRANSIE
if (!fUpdateRipAlready)
{
pMixedCtx->rip += cbInstr;
- VMCPU_HMCF_SET(pVCpu, HM_CHANGED_GUEST_RIP);
+ HMCPU_CF_SET(pVCpu, HM_CHANGED_GUEST_RIP);
}
+ /* INS & OUTS with REP prefix modify RFLAGS. */
+ if (fIOString)
+ HMCPU_CF_SET(pVCpu, HM_CHANGED_GUEST_RFLAGS);
+
/*
* If any I/O breakpoints are armed, we need to check if one triggered
* and take appropriate action.
@@ -9934,7 +9962,7 @@ HMVMX_EXIT_DECL hmR0VmxExitIoInstr(PVMCPU pVCpu, PCPUMCTX pMixedCtx, PVMXTRANSIE
if (fIsGuestDbgActive)
ASMSetDR6(pMixedCtx->dr[6]);
if (pMixedCtx->dr[7] != uDr7)
- VMCPU_HMCF_SET(pVCpu, HM_CHANGED_GUEST_DEBUG);
+ HMCPU_CF_SET(pVCpu, HM_CHANGED_GUEST_DEBUG);
hmR0VmxSetPendingXcptDB(pVCpu, pMixedCtx);
}
@@ -10098,7 +10126,7 @@ HMVMX_EXIT_DECL hmR0VmxExitApicAccess(PVMCPU pVCpu, PCPUMCTX pMixedCtx, PVMXTRAN
|| rc == VERR_PAGE_TABLE_NOT_PRESENT
|| rc == VERR_PAGE_NOT_PRESENT)
{
- VMCPU_HMCF_SET(pVCpu, HM_CHANGED_GUEST_RIP
+ HMCPU_CF_SET(pVCpu, HM_CHANGED_GUEST_RIP
| HM_CHANGED_GUEST_RSP
| HM_CHANGED_GUEST_RFLAGS
| HM_CHANGED_VMX_GUEST_APIC_STATE);
@@ -10182,6 +10210,7 @@ HMVMX_EXIT_DECL hmR0VmxExitMovDRx(PVMCPU pVCpu, PCPUMCTX pMixedCtx, PVMXTRANSIEN
*/
rc = hmR0VmxReadExitQualificationVmcs(pVCpu, pVmxTransient);
rc |= hmR0VmxSaveGuestSegmentRegs(pVCpu, pMixedCtx);
+ rc |= hmR0VmxSaveGuestDR7(pVCpu, pMixedCtx);
AssertRCReturn(rc, rc);
Log4(("CS:RIP=%04x:%#RX64\n", pMixedCtx->cs.Sel, pMixedCtx->rip));
@@ -10192,7 +10221,7 @@ HMVMX_EXIT_DECL hmR0VmxExitMovDRx(PVMCPU pVCpu, PCPUMCTX pMixedCtx, PVMXTRANSIEN
VMX_EXIT_QUALIFICATION_DRX_REGISTER(pVmxTransient->uExitQualification),
VMX_EXIT_QUALIFICATION_DRX_GENREG(pVmxTransient->uExitQualification));
if (RT_SUCCESS(rc))
- VMCPU_HMCF_SET(pVCpu, HM_CHANGED_GUEST_DEBUG);
+ HMCPU_CF_SET(pVCpu, HM_CHANGED_GUEST_DEBUG);
STAM_COUNTER_INC(&pVCpu->hm.s.StatExitDRxWrite);
}
else
@@ -10258,7 +10287,7 @@ HMVMX_EXIT_DECL hmR0VmxExitEptMisconfig(PVMCPU pVCpu, PCPUMCTX pMixedCtx, PVMXTR
|| rc == VERR_PAGE_NOT_PRESENT)
{
/* Successfully handled MMIO operation. */
- VMCPU_HMCF_SET(pVCpu, HM_CHANGED_GUEST_RIP
+ HMCPU_CF_SET(pVCpu, HM_CHANGED_GUEST_RIP
| HM_CHANGED_GUEST_RSP
| HM_CHANGED_GUEST_RFLAGS
| HM_CHANGED_VMX_GUEST_APIC_STATE);
@@ -10325,9 +10354,9 @@ HMVMX_EXIT_DECL hmR0VmxExitEptViolation(PVMCPU pVCpu, PCPUMCTX pMixedCtx, PVMXTR
{
/* Successfully synced our nested page tables. */
STAM_COUNTER_INC(&pVCpu->hm.s.StatExitReasonNpf);
- VMCPU_HMCF_SET(pVCpu, HM_CHANGED_GUEST_RIP
- | HM_CHANGED_GUEST_RSP
- | HM_CHANGED_GUEST_RFLAGS);
+ HMCPU_CF_SET(pVCpu, HM_CHANGED_GUEST_RIP
+ | HM_CHANGED_GUEST_RSP
+ | HM_CHANGED_GUEST_RFLAGS);
return VINF_SUCCESS;
}
@@ -10455,6 +10484,12 @@ static int hmR0VmxExitXcptDB(PVMCPU pVCpu, PCPUMCTX pMixedCtx, PVMXTRANSIENT pVm
/*
* Raise #DB in the guest.
+ *
+ * It is important to reflect what the VM-exit gave us (preserving the interruption-type) rather than use
+ * hmR0VmxSetPendingXcptDB() as the #DB could've been raised while executing ICEBP and not the 'normal' #DB.
+ * Thus it -may- trigger different handling in the CPU (like skipped DPL checks). See @bugref{6398}.
+ *
+ * Since ICEBP isn't documented on Intel, see AMD spec. 15.20 "Event Injection".
*/
rc = hmR0VmxReadExitIntInfoVmcs(pVCpu, pVmxTransient);
rc |= hmR0VmxReadExitInstrLenVmcs(pVCpu, pVmxTransient);
@@ -10497,7 +10532,7 @@ static int hmR0VmxExitXcptNM(PVMCPU pVCpu, PCPUMCTX pMixedCtx, PVMXTRANSIENT pVm
if (pVmxTransient->fWasGuestFPUStateActive)
{
rc = VINF_EM_RAW_GUEST_TRAP;
- Assert(CPUMIsGuestFPUStateActive(pVCpu) || VMCPU_HMCF_IS_PENDING(pVCpu, HM_CHANGED_GUEST_CR0));
+ Assert(CPUMIsGuestFPUStateActive(pVCpu) || HMCPU_CF_IS_PENDING(pVCpu, HM_CHANGED_GUEST_CR0));
}
else
{
@@ -10514,7 +10549,7 @@ static int hmR0VmxExitXcptNM(PVMCPU pVCpu, PCPUMCTX pMixedCtx, PVMXTRANSIENT pVm
if (rc == VINF_SUCCESS)
{
/* Guest FPU state was activated, we'll want to change CR0 FPU intercepts before the next VM-reentry. */
- VMCPU_HMCF_SET(pVCpu, HM_CHANGED_GUEST_CR0);
+ HMCPU_CF_SET(pVCpu, HM_CHANGED_GUEST_CR0);
STAM_COUNTER_INC(&pVCpu->hm.s.StatExitShadowNM);
}
else
@@ -10586,7 +10621,7 @@ static int hmR0VmxExitXcptGP(PVMCPU pVCpu, PCPUMCTX pMixedCtx, PVMXTRANSIENT pVm
{
pMixedCtx->eflags.Bits.u1IF = 0;
pMixedCtx->rip += pDis->cbInstr;
- VMCPU_HMCF_SET(pVCpu, HM_CHANGED_GUEST_RIP | HM_CHANGED_GUEST_RFLAGS);
+ HMCPU_CF_SET(pVCpu, HM_CHANGED_GUEST_RIP | HM_CHANGED_GUEST_RFLAGS);
STAM_COUNTER_INC(&pVCpu->hm.s.StatExitCli);
break;
}
@@ -10597,7 +10632,7 @@ static int hmR0VmxExitXcptGP(PVMCPU pVCpu, PCPUMCTX pMixedCtx, PVMXTRANSIENT pVm
pMixedCtx->rip += pDis->cbInstr;
EMSetInhibitInterruptsPC(pVCpu, pMixedCtx->rip);
Assert(VMCPU_FF_IS_PENDING(pVCpu, VMCPU_FF_INHIBIT_INTERRUPTS));
- VMCPU_HMCF_SET(pVCpu, HM_CHANGED_GUEST_RIP | HM_CHANGED_GUEST_RFLAGS);
+ HMCPU_CF_SET(pVCpu, HM_CHANGED_GUEST_RIP | HM_CHANGED_GUEST_RFLAGS);
STAM_COUNTER_INC(&pVCpu->hm.s.StatExitSti);
break;
}
@@ -10606,7 +10641,7 @@ static int hmR0VmxExitXcptGP(PVMCPU pVCpu, PCPUMCTX pMixedCtx, PVMXTRANSIENT pVm
{
rc = VINF_EM_HALT;
pMixedCtx->rip += pDis->cbInstr;
- VMCPU_HMCF_SET(pVCpu, HM_CHANGED_GUEST_RIP);
+ HMCPU_CF_SET(pVCpu, HM_CHANGED_GUEST_RIP);
STAM_COUNTER_INC(&pVCpu->hm.s.StatExitHlt);
break;
}
@@ -10651,9 +10686,9 @@ static int hmR0VmxExitXcptGP(PVMCPU pVCpu, PCPUMCTX pMixedCtx, PVMXTRANSIENT pVm
pMixedCtx->esp &= uMask;
pMixedCtx->rip += pDis->cbInstr;
- VMCPU_HMCF_SET(pVCpu, HM_CHANGED_GUEST_RIP
- | HM_CHANGED_GUEST_RSP
- | HM_CHANGED_GUEST_RFLAGS);
+ HMCPU_CF_SET(pVCpu, HM_CHANGED_GUEST_RIP
+ | HM_CHANGED_GUEST_RSP
+ | HM_CHANGED_GUEST_RFLAGS);
STAM_COUNTER_INC(&pVCpu->hm.s.StatExitPopf);
break;
}
@@ -10697,7 +10732,7 @@ static int hmR0VmxExitXcptGP(PVMCPU pVCpu, PCPUMCTX pMixedCtx, PVMXTRANSIENT pVm
pMixedCtx->esp -= cbParm;
pMixedCtx->esp &= uMask;
pMixedCtx->rip += pDis->cbInstr;
- VMCPU_HMCF_SET(pVCpu, HM_CHANGED_GUEST_RIP | HM_CHANGED_GUEST_RSP);
+ HMCPU_CF_SET(pVCpu, HM_CHANGED_GUEST_RIP | HM_CHANGED_GUEST_RSP);
STAM_COUNTER_INC(&pVCpu->hm.s.StatExitPushf);
break;
}
@@ -10731,10 +10766,10 @@ static int hmR0VmxExitXcptGP(PVMCPU pVCpu, PCPUMCTX pMixedCtx, PVMXTRANSIENT pVm
pMixedCtx->eflags.u32 = (pMixedCtx->eflags.u32 & ~(X86_EFL_POPF_BITS & uMask))
| (aIretFrame[2] & X86_EFL_POPF_BITS & uMask);
pMixedCtx->sp += sizeof(aIretFrame);
- VMCPU_HMCF_SET(pVCpu, HM_CHANGED_GUEST_RIP
- | HM_CHANGED_GUEST_SEGMENT_REGS
- | HM_CHANGED_GUEST_RSP
- | HM_CHANGED_GUEST_RFLAGS);
+ HMCPU_CF_SET(pVCpu, HM_CHANGED_GUEST_RIP
+ | HM_CHANGED_GUEST_SEGMENT_REGS
+ | HM_CHANGED_GUEST_RSP
+ | HM_CHANGED_GUEST_RFLAGS);
Log4(("IRET %#RX32 to %04x:%x\n", GCPtrStack, pMixedCtx->cs.Sel, pMixedCtx->ip));
STAM_COUNTER_INC(&pVCpu->hm.s.StatExitIret);
break;
@@ -10763,7 +10798,7 @@ static int hmR0VmxExitXcptGP(PVMCPU pVCpu, PCPUMCTX pMixedCtx, PVMXTRANSIENT pVm
VBOXSTRICTRC rc2 = EMInterpretInstructionDisasState(pVCpu, pDis, CPUMCTX2CORE(pMixedCtx), 0 /* pvFault */,
EMCODETYPE_SUPERVISOR);
rc = VBOXSTRICTRC_VAL(rc2);
- VMCPU_HMCF_SET(pVCpu, HM_CHANGED_ALL_GUEST);
+ HMCPU_CF_SET(pVCpu, HM_CHANGED_ALL_GUEST);
Log4(("#GP rc=%Rrc\n", rc));
break;
}
@@ -10853,10 +10888,10 @@ static int hmR0VmxExitXcptPF(PVMCPU pVCpu, PCPUMCTX pMixedCtx, PVMXTRANSIENT pVm
/* Successfully synced shadow pages tables or emulated an MMIO instruction. */
/** @todo this isn't quite right, what if guest does lgdt with some MMIO
* memory? We don't update the whole state here... */
- VMCPU_HMCF_SET(pVCpu, HM_CHANGED_GUEST_RIP
- | HM_CHANGED_GUEST_RSP
- | HM_CHANGED_GUEST_RFLAGS
- | HM_CHANGED_VMX_GUEST_APIC_STATE);
+ HMCPU_CF_SET(pVCpu, HM_CHANGED_GUEST_RIP
+ | HM_CHANGED_GUEST_RSP
+ | HM_CHANGED_GUEST_RFLAGS
+ | HM_CHANGED_VMX_GUEST_APIC_STATE);
TRPMResetTrap(pVCpu);
STAM_COUNTER_INC(&pVCpu->hm.s.StatExitShadowPF);
return rc;
diff --git a/src/VBox/VMM/VMMR3/CPUM.cpp b/src/VBox/VMM/VMMR3/CPUM.cpp
index ab71a96..cd75102 100644
--- a/src/VBox/VMM/VMMR3/CPUM.cpp
+++ b/src/VBox/VMM/VMMR3/CPUM.cpp
@@ -3941,7 +3941,7 @@ static DECLCALLBACK(void) cpumR3CpuIdInfo(PVM pVM, PCDBGFINFOHLP pHlp, const cha
if (iVerbosity && cCentaurMax >= 1)
{
ASMCpuId(0xc0000001, &Host.eax, &Host.ebx, &Host.ecx, &Host.edx);
- uint32_t uEdxGst = pVM->cpum.s.aGuestCpuIdExt[1].edx;
+ uint32_t uEdxGst = pVM->cpum.s.aGuestCpuIdCentaur[1].edx;
uint32_t uEdxHst = Host.edx;
if (iVerbosity == 1)
diff --git a/src/VBox/VMM/VMMR3/DBGFDisas.cpp b/src/VBox/VMM/VMMR3/DBGFDisas.cpp
index 2a6b4df..319963d 100644
--- a/src/VBox/VMM/VMMR3/DBGFDisas.cpp
+++ b/src/VBox/VMM/VMMR3/DBGFDisas.cpp
@@ -354,7 +354,10 @@ static DECLCALLBACK(int) dbgfR3DisasGetSymbol(PCDISCPUSTATE pCpu, uint32_t u32Se
&& DIS_FMT_SEL_GET_REG(u32Sel) == DISSELREG_SS
&& pSelInfo->GCPtrBase == 0
&& pSelInfo->cbLimit >= UINT32_MAX
- && PATMIsPatchGCAddr(pState->pVM, pState->Cpu.uInstrAddr))
+#ifdef VBOX_WITH_RAW_MODE
+ && PATMIsPatchGCAddr(pState->pVM, pState->Cpu.uInstrAddr)
+#endif
+ )
{
DBGFR3AddrFromFlat(pState->pVM->pUVM, &Addr, uAddress);
rc = VINF_SUCCESS;
diff --git a/src/VBox/VMM/VMMR3/HM.cpp b/src/VBox/VMM/VMMR3/HM.cpp
index d33e037..a950fe4 100644
--- a/src/VBox/VMM/VMMR3/HM.cpp
+++ b/src/VBox/VMM/VMMR3/HM.cpp
@@ -1627,13 +1627,14 @@ VMMR3_INT_DECL(void) HMR3ResetCpu(PVMCPU pVCpu)
{
/* Sync. entire state on VM reset R0-reentry. It's safe to reset
the HM flags here, all other EMTs are in ring-3. See VMR3Reset(). */
- VMCPU_HMCF_RESET_TO(pVCpu, HM_CHANGED_HOST_CONTEXT | HM_CHANGED_ALL_GUEST);
+ HMCPU_CF_RESET_TO(pVCpu, HM_CHANGED_HOST_CONTEXT | HM_CHANGED_ALL_GUEST);
pVCpu->hm.s.vmx.u32CR0Mask = 0;
pVCpu->hm.s.vmx.u32CR4Mask = 0;
pVCpu->hm.s.fActive = false;
pVCpu->hm.s.Event.fPending = false;
pVCpu->hm.s.vmx.fWasInRealMode = true;
+ pVCpu->hm.s.vmx.u64MsrApicBase = 0;
/* Reset the contents of the read cache. */
PVMCSCACHE pCache = &pVCpu->hm.s.vmx.VMCSCache;
@@ -2645,7 +2646,7 @@ VMMR3_INT_DECL(bool) HMR3IsRescheduleRequired(PVM pVM, PCPUMCTX pCtx)
*/
VMMR3_INT_DECL(void) HMR3NotifyScheduled(PVMCPU pVCpu)
{
- VMCPU_HMCF_SET(pVCpu, HM_CHANGED_ALL_GUEST);
+ HMCPU_CF_SET(pVCpu, HM_CHANGED_ALL_GUEST);
}
@@ -2656,7 +2657,7 @@ VMMR3_INT_DECL(void) HMR3NotifyScheduled(PVMCPU pVCpu)
*/
VMMR3_INT_DECL(void) HMR3NotifyEmulated(PVMCPU pVCpu)
{
- VMCPU_HMCF_SET(pVCpu, HM_CHANGED_ALL_GUEST);
+ HMCPU_CF_SET(pVCpu, HM_CHANGED_ALL_GUEST);
}
@@ -2943,6 +2944,7 @@ VMMR3_INT_DECL(void) HMR3CheckError(PVM pVM, int iStatusCode)
case VERR_SVM_UNEXPECTED_EXIT:
case VERR_SVM_UNEXPECTED_PATCH_TYPE:
case VERR_SVM_UNEXPECTED_XCPT_EXIT:
+ case VERR_VMX_UNEXPECTED_INTERRUPTION_EXIT_TYPE:
{
LogRel(("HM: CPU[%u] HM error %#x (%u)\n", i, pVCpu->hm.s.u32HMError, pVCpu->hm.s.u32HMError));
break;
diff --git a/src/VBox/VMM/VMMR3/PATMSSM.cpp b/src/VBox/VMM/VMMR3/PATMSSM.cpp
index 6e57113..01f3d6a 100644
--- a/src/VBox/VMM/VMMR3/PATMSSM.cpp
+++ b/src/VBox/VMM/VMMR3/PATMSSM.cpp
@@ -42,6 +42,7 @@
#include <iprt/string.h>
#include <VBox/dis.h>
#include <VBox/disopcode.h>
+#include <VBox/version.h>
/**
* Patch information - SSM version.
@@ -136,11 +137,6 @@ typedef struct PATMPATCHRECSSM
PATCHINFOSSM patch;
} PATMPATCHRECSSM, *PPATMPATCHRECSSM;
-/*******************************************************************************
-* Defined Constants And Macros *
-*******************************************************************************/
-#define PATM_SUBTRACT_PTR(a, b) *(uintptr_t *)&(a) = (uintptr_t)(a) - (uintptr_t)(b)
-#define PATM_ADD_PTR(a, b) *(uintptr_t *)&(a) = (uintptr_t)(a) + (uintptr_t)(b)
/*******************************************************************************
* Internal Functions *
@@ -248,6 +244,105 @@ static SSMFIELD const g_aPatmFields[] =
};
/**
+ * SSM descriptor table for the PATM structure starting with r86139.
+ */
+static SSMFIELD const g_aPatmFields86139[] =
+{
+ /** @todo there are a bunch more fields here which can be marked as ignored. */
+ SSMFIELD_ENTRY_IGNORE( PATM, offVM),
+ SSMFIELD_ENTRY_RCPTR( PATM, pPatchMemGC),
+ SSMFIELD_ENTRY_IGN_HCPTR( PATM, pPatchMemHC),
+ SSMFIELD_ENTRY( PATM, cbPatchMem),
+ SSMFIELD_ENTRY( PATM, offPatchMem),
+ SSMFIELD_ENTRY( PATM, fOutOfMemory),
+ SSMFIELD_ENTRY_PAD_HC_AUTO( 3, 3),
+ SSMFIELD_ENTRY( PATM, deltaReloc),
+ SSMFIELD_ENTRY_IGN_HCPTR( PATM, pGCStateHC),
+ SSMFIELD_ENTRY_RCPTR( PATM, pGCStateGC),
+ SSMFIELD_ENTRY_RCPTR( PATM, pGCStackGC),
+ SSMFIELD_ENTRY_IGN_HCPTR( PATM, pGCStackHC),
+ SSMFIELD_ENTRY_RCPTR( PATM, pCPUMCtxGC),
+ SSMFIELD_ENTRY_RCPTR( PATM, pStatsGC),
+ SSMFIELD_ENTRY_IGN_HCPTR( PATM, pStatsHC),
+ SSMFIELD_ENTRY( PATM, uCurrentPatchIdx),
+ SSMFIELD_ENTRY( PATM, ulCallDepth),
+ SSMFIELD_ENTRY( PATM, cPageRecords),
+ SSMFIELD_ENTRY_RCPTR( PATM, pPatchedInstrGCLowest),
+ SSMFIELD_ENTRY_RCPTR( PATM, pPatchedInstrGCHighest),
+ SSMFIELD_ENTRY_RCPTR( PATM, PatchLookupTreeGC),
+ SSMFIELD_ENTRY_IGN_HCPTR( PATM, PatchLookupTreeHC),
+ SSMFIELD_ENTRY_RCPTR( PATM, pfnHelperCallGC),
+ SSMFIELD_ENTRY_RCPTR( PATM, pfnHelperRetGC),
+ SSMFIELD_ENTRY_RCPTR( PATM, pfnHelperJumpGC),
+ SSMFIELD_ENTRY_RCPTR( PATM, pfnHelperIretGC),
+ SSMFIELD_ENTRY_IGN_HCPTR( PATM, pGlobalPatchRec),
+ SSMFIELD_ENTRY_RCPTR( PATM, pfnSysEnterGC),
+ SSMFIELD_ENTRY_RCPTR( PATM, pfnSysEnterPatchGC),
+ SSMFIELD_ENTRY( PATM, uSysEnterPatchIdx),
+ SSMFIELD_ENTRY_RCPTR( PATM, pvFaultMonitor),
+ SSMFIELD_ENTRY_GCPHYS( PATM, mmio.GCPhys),
+ SSMFIELD_ENTRY_RCPTR( PATM, mmio.pCachedData),
+ SSMFIELD_ENTRY_IGN_RCPTR( PATM, mmio.Alignment0),
+ SSMFIELD_ENTRY_IGN_HCPTR( PATM, savedstate.pSSM),
+ SSMFIELD_ENTRY( PATM, savedstate.cPatches),
+ SSMFIELD_ENTRY_PAD_HC64( PATM, savedstate.Alignment0, sizeof(uint32_t)),
+ SSMFIELD_ENTRY_IGN_HCPTR( PATM, hDbgModPatchMem),
+ SSMFIELD_ENTRY_PAD_HC32( PATM, Alignment0, sizeof(uint32_t)),
+ SSMFIELD_ENTRY_IGNORE( PATM, StatNrOpcodeRead),
+ SSMFIELD_ENTRY_IGNORE( PATM, StatDisabled),
+ SSMFIELD_ENTRY_IGNORE( PATM, StatUnusable),
+ SSMFIELD_ENTRY_IGNORE( PATM, StatEnabled),
+ SSMFIELD_ENTRY_IGNORE( PATM, StatInstalled),
+ SSMFIELD_ENTRY_IGNORE( PATM, StatInstalledFunctionPatches),
+ SSMFIELD_ENTRY_IGNORE( PATM, StatInstalledTrampoline),
+ SSMFIELD_ENTRY_IGNORE( PATM, StatInstalledJump),
+ SSMFIELD_ENTRY_IGNORE( PATM, StatInt3Callable),
+ SSMFIELD_ENTRY_IGNORE( PATM, StatInt3BlockRun),
+ SSMFIELD_ENTRY_IGNORE( PATM, StatOverwritten),
+ SSMFIELD_ENTRY_IGNORE( PATM, StatFixedConflicts),
+ SSMFIELD_ENTRY_IGNORE( PATM, StatFlushed),
+ SSMFIELD_ENTRY_IGNORE( PATM, StatPageBoundaryCrossed),
+ SSMFIELD_ENTRY_IGNORE( PATM, StatMonitored),
+ SSMFIELD_ENTRY_IGNORE( PATM, StatHandleTrap),
+ SSMFIELD_ENTRY_IGNORE( PATM, StatSwitchBack),
+ SSMFIELD_ENTRY_IGNORE( PATM, StatSwitchBackFail),
+ SSMFIELD_ENTRY_IGNORE( PATM, StatPATMMemoryUsed),
+ SSMFIELD_ENTRY_IGNORE( PATM, StatDuplicateREQSuccess),
+ SSMFIELD_ENTRY_IGNORE( PATM, StatDuplicateREQFailed),
+ SSMFIELD_ENTRY_IGNORE( PATM, StatDuplicateUseExisting),
+ SSMFIELD_ENTRY_IGNORE( PATM, StatFunctionFound),
+ SSMFIELD_ENTRY_IGNORE( PATM, StatFunctionNotFound),
+ SSMFIELD_ENTRY_IGNORE( PATM, StatPatchWrite),
+ SSMFIELD_ENTRY_IGNORE( PATM, StatPatchWriteDetect),
+ SSMFIELD_ENTRY_IGNORE( PATM, StatDirty),
+ SSMFIELD_ENTRY_IGNORE( PATM, StatPushTrap),
+ SSMFIELD_ENTRY_IGNORE( PATM, StatPatchWriteInterpreted),
+ SSMFIELD_ENTRY_IGNORE( PATM, StatPatchWriteInterpretedFailed),
+ SSMFIELD_ENTRY_IGNORE( PATM, StatSysEnter),
+ SSMFIELD_ENTRY_IGNORE( PATM, StatSysExit),
+ SSMFIELD_ENTRY_IGNORE( PATM, StatEmulIret),
+ SSMFIELD_ENTRY_IGNORE( PATM, StatEmulIretFailed),
+ SSMFIELD_ENTRY_IGNORE( PATM, StatInstrDirty),
+ SSMFIELD_ENTRY_IGNORE( PATM, StatInstrDirtyGood),
+ SSMFIELD_ENTRY_IGNORE( PATM, StatInstrDirtyBad),
+ SSMFIELD_ENTRY_IGNORE( PATM, StatPatchPageInserted),
+ SSMFIELD_ENTRY_IGNORE( PATM, StatPatchPageRemoved),
+ SSMFIELD_ENTRY_IGNORE( PATM, StatPatchRefreshSuccess),
+ SSMFIELD_ENTRY_IGNORE( PATM, StatPatchRefreshFailed),
+ SSMFIELD_ENTRY_IGNORE( PATM, StatGenRet),
+ SSMFIELD_ENTRY_IGNORE( PATM, StatGenRetReused),
+ SSMFIELD_ENTRY_IGNORE( PATM, StatGenJump),
+ SSMFIELD_ENTRY_IGNORE( PATM, StatGenCall),
+ SSMFIELD_ENTRY_IGNORE( PATM, StatGenPopf),
+ SSMFIELD_ENTRY_IGNORE( PATM, StatCheckPendingIRQ),
+ SSMFIELD_ENTRY_IGNORE( PATM, StatFunctionLookupReplace),
+ SSMFIELD_ENTRY_IGNORE( PATM, StatFunctionLookupInsert),
+ SSMFIELD_ENTRY_IGNORE( PATM, StatU32FunctionMaxSlotsUsed),
+ SSMFIELD_ENTRY_IGNORE( PATM, Alignment0),
+ SSMFIELD_ENTRY_TERM()
+};
+
+/**
* SSM descriptor table for the PATMGCSTATE structure.
*/
static SSMFIELD const g_aPatmGCStateFields[] =
@@ -432,7 +527,7 @@ static DECLCALLBACK(int) patmSaveP2GLookupRecords(PAVLU32NODECORE pNode, void *p
PRECPATCHTOGUEST pPatchToGuestRec = (PRECPATCHTOGUEST)pNode;
/* Save the lookup record. */
- int rc = SSMR3PutMem(pSSM, pPatchToGuestRec, sizeof(RECPATCHTOGUEST));
+ int rc = SSMR3PutStructEx(pSSM, pPatchToGuestRec, sizeof(RECPATCHTOGUEST), 0 /*fFlags*/, &g_aPatmRecPatchToGuest[0], NULL);
AssertRCReturn(rc, rc);
return VINF_SUCCESS;
@@ -454,9 +549,16 @@ static DECLCALLBACK(int) patmSaveFixupRecords(PAVLPVNODECORE pNode, void *pVM1)
RELOCREC rec = *(PRELOCREC)pNode;
RTRCPTR *pFixup = (RTRCPTR *)rec.pRelocPos;
+ /* Convert pointer to an offset into patch memory. May not be applicable
+ to all fixup types, thus the UINT32_MAX. */
Assert(rec.pRelocPos);
- /* Convert pointer to an offset into patch memory. */
- PATM_SUBTRACT_PTR(rec.pRelocPos, pVM->patm.s.pPatchMemHC);
+ uintptr_t offRelocPos = (uintptr_t)rec.pRelocPos - (uintptr_t)pVM->patm.s.pPatchMemHC;
+ if (offRelocPos > pVM->patm.s.cbPatchMem)
+ offRelocPos = UINT32_MAX;
+ rec.pRelocPos = (uint8_t *)offRelocPos;
+
+ /* Zero rec.Core.Key since it's unused and may trigger SSM check due to the hack below. */
+ rec.Core.Key = 0;
if (rec.uType == FIXUP_ABSOLUTE)
{
@@ -478,7 +580,7 @@ static DECLCALLBACK(int) patmSaveFixupRecords(PAVLPVNODECORE pNode, void *pVM1)
}
/* Save the lookup record. */
- int rc = SSMR3PutMem(pSSM, &rec, sizeof(rec));
+ int rc = SSMR3PutStructEx(pSSM, &rec, sizeof(rec), 0 /*fFlags*/, &g_aPatmRelocRec[0], NULL);
AssertRCReturn(rc, rc);
return VINF_SUCCESS;
@@ -594,6 +696,9 @@ static DECLCALLBACK(int) patmSavePatchState(PAVLOU32NODECORE pNode, void *pVM1)
Assert(!(pPatch->patch.flags & PATMFL_GLOBAL_FUNCTIONS));
patmR3PatchConvertMem2SSM(&patch, pPatch);
+ Log4(("patmSavePatchState: cbPatchJump=%u uCurPathOffset=%#x pInstrGCLowest/Higest=%#x/%#x nrFixups=%#x nrJumpRecs=%#x\n",
+ patch.patch.cbPatchJump, patch.patch.uCurPatchOffset, patch.patch.pInstrGCLowest, patch.patch.pInstrGCHighest,
+ patch.patch.nrFixups, patch.patch.nrJumpRecs));
/*
* Reset HC pointers that need to be recalculated when loading the state
@@ -605,7 +710,7 @@ static DECLCALLBACK(int) patmSavePatchState(PAVLOU32NODECORE pNode, void *pVM1)
Assert(!pPatch->patch.pTempInfo || pPatch->patch.pTempInfo->IllegalInstrTree == 0);
/* Save the patch record itself */
- rc = SSMR3PutMem(pSSM, &patch, sizeof(patch));
+ rc = SSMR3PutStructEx(pSSM, &patch, sizeof(patch), 0 /*fFlags*/, &g_aPatmPatchRecFields[0], NULL);
AssertRCReturn(rc, rc);
/*
@@ -616,7 +721,8 @@ static DECLCALLBACK(int) patmSavePatchState(PAVLOU32NODECORE pNode, void *pVM1)
RTAvlPVDoWithAll(&pPatch->patch.FixupTree, true, patmCountLeafPV, &nrFixupRecs);
AssertMsg(nrFixupRecs == pPatch->patch.nrFixups, ("Fixup inconsistency! counted %d vs %d\n", nrFixupRecs, pPatch->patch.nrFixups));
#endif
- RTAvlPVDoWithAll(&pPatch->patch.FixupTree, true, patmSaveFixupRecords, pVM);
+ rc = RTAvlPVDoWithAll(&pPatch->patch.FixupTree, true, patmSaveFixupRecords, pVM);
+ AssertRCReturn(rc, rc);
#ifdef VBOX_STRICT
uint32_t nrLookupRecords = 0;
@@ -624,7 +730,9 @@ static DECLCALLBACK(int) patmSavePatchState(PAVLOU32NODECORE pNode, void *pVM1)
Assert(nrLookupRecords == pPatch->patch.nrPatch2GuestRecs);
#endif
- RTAvlU32DoWithAll(&pPatch->patch.Patch2GuestAddrTree, true, patmSaveP2GLookupRecords, pVM);
+ rc = RTAvlU32DoWithAll(&pPatch->patch.Patch2GuestAddrTree, true, patmSaveP2GLookupRecords, pVM);
+ AssertRCReturn(rc, rc);
+
return VINF_SUCCESS;
}
@@ -660,7 +768,7 @@ DECLCALLBACK(int) patmR3Save(PVM pVM, PSSMHANDLE pSSM)
/*
* Save PATM structure
*/
- rc = SSMR3PutMem(pSSM, &patmInfo, sizeof(patmInfo));
+ rc = SSMR3PutStructEx(pSSM, &patmInfo, sizeof(patmInfo), 0 /*fFlags*/, &g_aPatmFields[0], NULL);
AssertRCReturn(rc, rc);
/*
@@ -672,12 +780,13 @@ DECLCALLBACK(int) patmR3Save(PVM pVM, PSSMHANDLE pSSM)
/*
* Save GC state memory
*/
- rc = SSMR3PutMem(pSSM, pVM->patm.s.pGCStateHC, sizeof(PATMGCSTATE));
+ rc = SSMR3PutStructEx(pSSM, pVM->patm.s.pGCStateHC, sizeof(PATMGCSTATE), 0 /*fFlags*/, &g_aPatmGCStateFields[0], NULL);
AssertRCReturn(rc, rc);
/*
* Save PATM stack page
*/
+ SSMR3PutU32(pSSM, PATM_STACK_TOTAL_SIZE);
rc = SSMR3PutMem(pSSM, pVM->patm.s.pGCStackHC, PATM_STACK_TOTAL_SIZE);
AssertRCReturn(rc, rc);
@@ -717,6 +826,7 @@ DECLCALLBACK(int) patmR3Load(PVM pVM, PSSMHANDLE pSSM, uint32_t uVersion, uint32
int rc;
if ( uVersion != PATM_SSM_VERSION
+ && uVersion != PATM_SSM_VERSION_MEM
&& uVersion != PATM_SSM_VERSION_FIXUP_HACK
&& uVersion != PATM_SSM_VERSION_VER16
)
@@ -724,6 +834,7 @@ DECLCALLBACK(int) patmR3Load(PVM pVM, PSSMHANDLE pSSM, uint32_t uVersion, uint32
AssertMsgFailed(("patmR3Load: Invalid version uVersion=%d!\n", uVersion));
return VERR_SSM_UNSUPPORTED_DATA_UNIT_VERSION;
}
+ uint32_t const fStructRestoreFlags = uVersion <= PATM_SSM_VERSION_MEM ? SSMSTRUCT_FLAGS_MEM_BAND_AID_RELAXED : 0;
Assert(uPass == SSM_PASS_FINAL); NOREF(uPass);
pVM->patm.s.savedstate.pSSM = pSSM;
@@ -732,25 +843,27 @@ DECLCALLBACK(int) patmR3Load(PVM pVM, PSSMHANDLE pSSM, uint32_t uVersion, uint32
* Restore PATM structure
*/
RT_ZERO(patmInfo);
- rc = SSMR3GetStructEx(pSSM, &patmInfo, sizeof(patmInfo), SSMSTRUCT_FLAGS_MEM_BAND_AID_RELAXED, &g_aPatmFields[0], NULL);
+ if ( uVersion == PATM_SSM_VERSION_MEM
+ && SSMR3HandleRevision(pSSM) >= 86139
+ && SSMR3HandleVersion(pSSM) >= VBOX_FULL_VERSION_MAKE(4, 2, 51))
+ rc = SSMR3GetStructEx(pSSM, &patmInfo, sizeof(patmInfo), SSMSTRUCT_FLAGS_MEM_BAND_AID_RELAXED,
+ &g_aPatmFields86139[0], NULL);
+ else
+ rc = SSMR3GetStructEx(pSSM, &patmInfo, sizeof(patmInfo), fStructRestoreFlags, &g_aPatmFields[0], NULL);
AssertRCReturn(rc, rc);
/* Relative calls are made to the helper functions. Therefor their relative location must not change! */
/* Note: we reuse the saved global helpers and assume they are identical, which is kind of dangerous. */
- if ( (pVM->patm.s.pfnHelperCallGC - pVM->patm.s.pPatchMemGC) != (patmInfo.pfnHelperCallGC - patmInfo.pPatchMemGC)
- || (pVM->patm.s.pfnHelperRetGC - pVM->patm.s.pPatchMemGC) != (patmInfo.pfnHelperRetGC - patmInfo.pPatchMemGC)
- || (pVM->patm.s.pfnHelperJumpGC - pVM->patm.s.pPatchMemGC) != (patmInfo.pfnHelperJumpGC - patmInfo.pPatchMemGC)
- || (pVM->patm.s.pfnHelperIretGC - pVM->patm.s.pPatchMemGC) != (patmInfo.pfnHelperIretGC - patmInfo.pPatchMemGC))
- {
- AssertMsgFailed(("Helper function ptrs don't match!!!\n"));
- return VERR_SSM_INVALID_STATE;
- }
+ AssertLogRelReturn((pVM->patm.s.pfnHelperCallGC - pVM->patm.s.pPatchMemGC) == (patmInfo.pfnHelperCallGC - patmInfo.pPatchMemGC),
+ VERR_SSM_DATA_UNIT_FORMAT_CHANGED);
+ AssertLogRelReturn((pVM->patm.s.pfnHelperRetGC - pVM->patm.s.pPatchMemGC) == (patmInfo.pfnHelperRetGC - patmInfo.pPatchMemGC),
+ VERR_SSM_DATA_UNIT_FORMAT_CHANGED);
+ AssertLogRelReturn((pVM->patm.s.pfnHelperJumpGC - pVM->patm.s.pPatchMemGC) == (patmInfo.pfnHelperJumpGC - patmInfo.pPatchMemGC),
+ VERR_SSM_DATA_UNIT_FORMAT_CHANGED);
+ AssertLogRelReturn((pVM->patm.s.pfnHelperIretGC - pVM->patm.s.pPatchMemGC) == (patmInfo.pfnHelperIretGC - patmInfo.pPatchMemGC),
+ VERR_SSM_DATA_UNIT_FORMAT_CHANGED);
+ AssertLogRelReturn(pVM->patm.s.cbPatchMem == patmInfo.cbPatchMem, VERR_SSM_DATA_UNIT_FORMAT_CHANGED);
- if (pVM->patm.s.cbPatchMem != patmInfo.cbPatchMem)
- {
- AssertMsgFailed(("Patch memory ptrs and/or sizes don't match!!!\n"));
- return VERR_SSM_INVALID_STATE;
- }
pVM->patm.s.offPatchMem = patmInfo.offPatchMem;
pVM->patm.s.deltaReloc = patmInfo.deltaReloc;
pVM->patm.s.uCurrentPatchIdx = patmInfo.uCurrentPatchIdx;
@@ -786,14 +899,26 @@ DECLCALLBACK(int) patmR3Load(PVM pVM, PSSMHANDLE pSSM, uint32_t uVersion, uint32
* Restore GC state memory
*/
RT_BZERO(pVM->patm.s.pGCStateHC, sizeof(PATMGCSTATE));
- rc = SSMR3GetStructEx(pSSM, pVM->patm.s.pGCStateHC, sizeof(PATMGCSTATE), SSMSTRUCT_FLAGS_MEM_BAND_AID_RELAXED, &g_aPatmGCStateFields[0], NULL);
+ rc = SSMR3GetStructEx(pSSM, pVM->patm.s.pGCStateHC, sizeof(PATMGCSTATE), fStructRestoreFlags, &g_aPatmGCStateFields[0], NULL);
AssertRCReturn(rc, rc);
/*
* Restore PATM stack page
*/
- rc = SSMR3GetMem(pSSM, pVM->patm.s.pGCStackHC, PATM_STACK_TOTAL_SIZE);
+ uint32_t cbStack = PATM_STACK_TOTAL_SIZE;
+ if (uVersion > PATM_SSM_VERSION_MEM)
+ {
+ rc = SSMR3GetU32(pSSM, &cbStack);
+ AssertRCReturn(rc, rc);
+ }
+ AssertCompile(!(PATM_STACK_TOTAL_SIZE & 31));
+ AssertLogRelMsgReturn(cbStack > 0 && cbStack <= PATM_STACK_TOTAL_SIZE && !(cbStack & 31),
+ ("cbStack=%#x vs %#x", cbStack, PATM_STACK_TOTAL_SIZE),
+ VERR_SSM_DATA_UNIT_FORMAT_CHANGED);
+ rc = SSMR3GetMem(pSSM, pVM->patm.s.pGCStackHC, cbStack);
AssertRCReturn(rc, rc);
+ if (cbStack < PATM_STACK_TOTAL_SIZE)
+ memset((uint8_t *)pVM->patm.s.pGCStackHC + cbStack, 0, PATM_STACK_TOTAL_SIZE - cbStack);
/*
* Load all patches
@@ -804,8 +929,11 @@ DECLCALLBACK(int) patmR3Load(PVM pVM, PSSMHANDLE pSSM, uint32_t uVersion, uint32
PATMPATCHREC *pPatchRec;
RT_ZERO(patch);
- rc = SSMR3GetStructEx(pSSM, &patch, sizeof(patch), SSMSTRUCT_FLAGS_MEM_BAND_AID_RELAXED, &g_aPatmPatchRecFields[0], NULL);
+ rc = SSMR3GetStructEx(pSSM, &patch, sizeof(patch), fStructRestoreFlags, &g_aPatmPatchRecFields[0], NULL);
AssertRCReturn(rc, rc);
+ Log4(("patmR3Load: cbPatchJump=%u uCurPathOffset=%#x pInstrGCLowest/Higest=%#x/%#x nrFixups=%#x nrJumpRecs=%#x\n",
+ patch.patch.cbPatchJump, patch.patch.uCurPatchOffset, patch.patch.pInstrGCLowest, patch.patch.pInstrGCHighest,
+ patch.patch.nrFixups, patch.patch.nrJumpRecs));
Assert(!(patch.patch.flags & PATMFL_GLOBAL_FUNCTIONS));
@@ -853,7 +981,7 @@ DECLCALLBACK(int) patmR3Load(PVM pVM, PSSMHANDLE pSSM, uint32_t uVersion, uint32
RTRCPTR *pFixup;
RT_ZERO(rec);
- rc = SSMR3GetStructEx(pSSM, &rec, sizeof(rec), SSMSTRUCT_FLAGS_MEM_BAND_AID_RELAXED, &g_aPatmRelocRec[0], NULL);
+ rc = SSMR3GetStructEx(pSSM, &rec, sizeof(rec), fStructRestoreFlags, &g_aPatmRelocRec[0], NULL);
AssertRCReturn(rc, rc);
if (pPrivInstrHC)
@@ -861,7 +989,10 @@ DECLCALLBACK(int) patmR3Load(PVM pVM, PSSMHANDLE pSSM, uint32_t uVersion, uint32
/* rec.pRelocPos now contains the relative position inside the hypervisor area. */
offset = (int32_t)(intptr_t)rec.pRelocPos;
/* Convert to HC pointer again. */
- PATM_ADD_PTR(rec.pRelocPos, pVM->patm.s.pPatchMemHC);
+ if ((uintptr_t)rec.pRelocPos < pVM->patm.s.cbPatchMem)
+ rec.pRelocPos = pVM->patm.s.pPatchMemHC + (uintptr_t)rec.pRelocPos;
+ else
+ rec.pRelocPos = NULL;
pFixup = (RTRCPTR *)rec.pRelocPos;
if (pPatchRec->patch.uState != PATCH_REFUSED)
@@ -901,7 +1032,7 @@ DECLCALLBACK(int) patmR3Load(PVM pVM, PSSMHANDLE pSSM, uint32_t uVersion, uint32
for (uint32_t j=0;j<nrPatch2GuestRecs;j++)
{
RT_ZERO(rec);
- rc = SSMR3GetStructEx(pSSM, &rec, sizeof(rec), SSMSTRUCT_FLAGS_MEM_BAND_AID_RELAXED, &g_aPatmRecPatchToGuest[0], NULL);
+ rc = SSMR3GetStructEx(pSSM, &rec, sizeof(rec), fStructRestoreFlags, &g_aPatmRecPatchToGuest[0], NULL);
AssertRCReturn(rc, rc);
patmR3AddP2GLookupRecord(pVM, &pPatchRec->patch, (uintptr_t)rec.Core.Key + pVM->patm.s.pPatchMemHC, rec.pOrgInstrGC, rec.enmType, rec.fDirty);
@@ -1179,7 +1310,7 @@ static void patmCorrectFixup(PVM pVM, unsigned ulSSMVersion, PATM &patmInfo, PPA
cCpuidFixup++;
}
else
- if (ulSSMVersion >= PATM_SSM_VERSION)
+ if (ulSSMVersion >= PATM_SSM_VERSION_MEM)
{
#ifdef LOG_ENABLED
RTRCPTR oldFixup = *pFixup;
diff --git a/src/VBox/VMM/VMMR3/PDMDevHlp.cpp b/src/VBox/VMM/VMMR3/PDMDevHlp.cpp
index c24a819..fd56de9 100644
--- a/src/VBox/VMM/VMMR3/PDMDevHlp.cpp
+++ b/src/VBox/VMM/VMMR3/PDMDevHlp.cpp
@@ -451,7 +451,7 @@ static DECLCALLBACK(int) pdmR3DevHlp_MMIO2Deregister(PPDMDEVINS pDevIns, uint32_
LogFlow(("pdmR3DevHlp_MMIO2Deregister: caller='%s'/%d: iRegion=%#x\n",
pDevIns->pReg->szName, pDevIns->iInstance, iRegion));
- AssertReturn(iRegion == UINT32_MAX, VERR_INVALID_PARAMETER);
+ AssertReturn(iRegion <= UINT8_MAX || iRegion == UINT32_MAX, VERR_INVALID_PARAMETER);
int rc = PGMR3PhysMMIO2Deregister(pDevIns->Internal.s.pVMR3, pDevIns, iRegion);
diff --git a/src/VBox/VMM/VMMR3/SSM.cpp b/src/VBox/VMM/VMMR3/SSM.cpp
index 1747119..b351cb0 100644
--- a/src/VBox/VMM/VMMR3/SSM.cpp
+++ b/src/VBox/VMM/VMMR3/SSM.cpp
@@ -3436,24 +3436,25 @@ VMMR3DECL(int) SSMR3PutStruct(PSSMHANDLE pSSM, const void *pvStruct, PCSSMFIELD
break;
case SSMFIELDTRANS_GCPTR:
- AssertMsgReturn(pCur->cb == sizeof(RTGCPTR), ("%#x (%s)\n", pCur->cb, pCur->pszName), VERR_SSM_FIELD_INVALID_SIZE);
+ AssertMsgBreakStmt(pCur->cb == sizeof(RTGCPTR), ("%#x (%s)\n", pCur->cb, pCur->pszName), rc = VERR_SSM_FIELD_INVALID_SIZE);
rc = SSMR3PutGCPtr(pSSM, *(PRTGCPTR)pbField);
break;
case SSMFIELDTRANS_GCPHYS:
- AssertMsgReturn(pCur->cb == sizeof(RTGCPHYS), ("%#x (%s)\n", pCur->cb, pCur->pszName), VERR_SSM_FIELD_INVALID_SIZE);
+ AssertMsgBreakStmt(pCur->cb == sizeof(RTGCPHYS), ("%#x (%s)\n", pCur->cb, pCur->pszName), rc = VERR_SSM_FIELD_INVALID_SIZE);
rc = SSMR3PutGCPhys(pSSM, *(PRTGCPHYS)pbField);
break;
case SSMFIELDTRANS_RCPTR:
- AssertMsgReturn(pCur->cb == sizeof(RTRCPTR), ("%#x (%s)\n", pCur->cb, pCur->pszName), VERR_SSM_FIELD_INVALID_SIZE);
+ AssertMsgBreakStmt(pCur->cb == sizeof(RTRCPTR), ("%#x (%s)\n", pCur->cb, pCur->pszName), rc = VERR_SSM_FIELD_INVALID_SIZE);
rc = SSMR3PutRCPtr(pSSM, *(PRTRCPTR)pbField);
break;
case SSMFIELDTRANS_RCPTR_ARRAY:
{
uint32_t const cEntries = pCur->cb / sizeof(RTRCPTR);
- AssertMsgReturn(pCur->cb == cEntries * sizeof(RTRCPTR) && cEntries, ("%#x (%s)\n", pCur->cb, pCur->pszName), VERR_SSM_FIELD_INVALID_SIZE);
+ AssertMsgBreakStmt(pCur->cb == cEntries * sizeof(RTRCPTR) && cEntries, ("%#x (%s)\n", pCur->cb, pCur->pszName),
+ rc = VERR_SSM_FIELD_INVALID_SIZE);
rc = VINF_SUCCESS;
for (uint32_t i = 0; i < cEntries && RT_SUCCESS(rc); i++)
rc = SSMR3PutRCPtr(pSSM, ((PRTRCPTR)pbField)[i]);
@@ -3461,10 +3462,14 @@ VMMR3DECL(int) SSMR3PutStruct(PSSMHANDLE pSSM, const void *pvStruct, PCSSMFIELD
}
default:
- AssertMsgFailedReturn(("%#x\n", pCur->pfnGetPutOrTransformer), VERR_SSM_FIELD_COMPLEX);
+ AssertMsgFailedBreakStmt(("%#x\n", pCur->pfnGetPutOrTransformer), rc = VERR_SSM_FIELD_COMPLEX);
}
if (RT_FAILURE(rc))
+ {
+ if (RT_SUCCESS(pSSM->rc))
+ pSSM->rc = rc;
return rc;
+ }
}
/* end marker */
@@ -3536,7 +3541,7 @@ VMMR3DECL(int) SSMR3PutStructEx(PSSMHANDLE pSSM, const void *pvStruct, size_t cb
*/
SSM_ASSERT_WRITEABLE_RET(pSSM);
SSM_CHECK_CANCELLED_RET(pSSM);
- AssertMsgReturn(!(fFlags & ~SSMSTRUCT_FLAGS_VALID_MASK), ("%#x\n", fFlags), VERR_INVALID_PARAMETER);
+ AssertMsgReturn(!(fFlags & ~SSMSTRUCT_FLAGS_VALID_MASK), ("%#x\n", fFlags), pSSM->rc = VERR_INVALID_PARAMETER);
AssertPtr(pvStruct);
AssertPtr(paFields);
@@ -3554,6 +3559,7 @@ VMMR3DECL(int) SSMR3PutStructEx(PSSMHANDLE pSSM, const void *pvStruct, size_t cb
/*
* Put the fields
*/
+ rc = VINF_SUCCESS;
uint32_t off = 0;
for (PCSSMFIELD pCur = paFields;
pCur->cb != UINT32_MAX && pCur->off != UINT32_MAX;
@@ -3568,15 +3574,15 @@ VMMR3DECL(int) SSMR3PutStructEx(PSSMHANDLE pSSM, const void *pvStruct, size_t cb
: SSMFIELDTRANS_IS_PADDING(pCur->pfnGetPutOrTransformer)
? RT_HIWORD(pCur->cb)
: pCur->cb;
- AssertMsgReturn( cbField <= cbStruct
- && offField + cbField <= cbStruct
- && offField + cbField >= offField,
- ("off=%#x cb=%#x cbStruct=%#x (%s)\n", cbField, offField, cbStruct, pCur->pszName),
- VERR_SSM_FIELD_OUT_OF_BOUNDS);
- AssertMsgReturn( !(fFlags & SSMSTRUCT_FLAGS_FULL_STRUCT)
- || off == offField,
- ("off=%#x offField=%#x (%s)\n", off, offField, pCur->pszName),
- VERR_SSM_FIELD_NOT_CONSECUTIVE);
+ AssertMsgBreakStmt( cbField <= cbStruct
+ && offField + cbField <= cbStruct
+ && offField + cbField >= offField,
+ ("off=%#x cb=%#x cbStruct=%#x (%s)\n", cbField, offField, cbStruct, pCur->pszName),
+ rc = VERR_SSM_FIELD_OUT_OF_BOUNDS);
+ AssertMsgBreakStmt( !(fFlags & SSMSTRUCT_FLAGS_FULL_STRUCT)
+ || off == offField,
+ ("off=%#x offField=%#x (%s)\n", off, offField, pCur->pszName),
+ rc = VERR_SSM_FIELD_NOT_CONSECUTIVE);
rc = VINF_SUCCESS;
uint8_t const *pbField = (uint8_t const *)pvStruct + offField;
@@ -3587,53 +3593,60 @@ VMMR3DECL(int) SSMR3PutStructEx(PSSMHANDLE pSSM, const void *pvStruct, size_t cb
break;
case SSMFIELDTRANS_GCPHYS:
- AssertMsgReturn(cbField == sizeof(RTGCPHYS), ("%#x (%s)\n", cbField, pCur->pszName), VERR_SSM_FIELD_INVALID_SIZE);
+ AssertMsgBreakStmt(cbField == sizeof(RTGCPHYS), ("%#x (%s)\n", cbField, pCur->pszName),
+ rc = VERR_SSM_FIELD_INVALID_SIZE);
rc = SSMR3PutGCPhys(pSSM, *(PRTGCPHYS)pbField);
break;
case SSMFIELDTRANS_GCPTR:
- AssertMsgReturn(cbField == sizeof(RTGCPTR), ("%#x (%s)\n", cbField, pCur->pszName), VERR_SSM_FIELD_INVALID_SIZE);
+ AssertMsgBreakStmt(cbField == sizeof(RTGCPTR), ("%#x (%s)\n", cbField, pCur->pszName),
+ rc = VERR_SSM_FIELD_INVALID_SIZE);
rc = SSMR3PutGCPtr(pSSM, *(PRTGCPTR)pbField);
break;
case SSMFIELDTRANS_RCPTR:
- AssertMsgReturn(cbField == sizeof(RTRCPTR), ("%#x (%s)\n", cbField, pCur->pszName), VERR_SSM_FIELD_INVALID_SIZE);
+ AssertMsgBreakStmt(cbField == sizeof(RTRCPTR), ("%#x (%s)\n", cbField, pCur->pszName),
+ rc = VERR_SSM_FIELD_INVALID_SIZE);
rc = SSMR3PutRCPtr(pSSM, *(PRTRCPTR)pbField);
break;
case SSMFIELDTRANS_RCPTR_ARRAY:
{
uint32_t const cEntries = cbField / sizeof(RTRCPTR);
- AssertMsgReturn(cbField == cEntries * sizeof(RTRCPTR) && cEntries, ("%#x (%s)\n", cbField, pCur->pszName), VERR_SSM_FIELD_INVALID_SIZE);
+ AssertMsgBreakStmt(cbField == cEntries * sizeof(RTRCPTR) && cEntries, ("%#x (%s)\n", cbField, pCur->pszName),
+ rc = VERR_SSM_FIELD_INVALID_SIZE);
for (uint32_t i = 0; i < cEntries && RT_SUCCESS(rc); i++)
rc = SSMR3PutRCPtr(pSSM, ((PRTRCPTR)pbField)[i]);
break;
}
case SSMFIELDTRANS_HCPTR_NI:
- AssertMsgReturn(cbField == sizeof(void *), ("%#x (%s)\n", cbField, pCur->pszName), VERR_SSM_FIELD_INVALID_SIZE);
+ AssertMsgBreakStmt(cbField == sizeof(void *), ("%#x (%s)\n", cbField, pCur->pszName),
+ rc = VERR_SSM_FIELD_INVALID_SIZE);
rc = ssmR3PutHCPtrNI(pSSM, *(void * const *)pbField, fFlags);
break;
case SSMFIELDTRANS_HCPTR_NI_ARRAY:
{
uint32_t const cEntries = cbField / sizeof(void *);
- AssertMsgReturn(cbField == cEntries * sizeof(void *) && cEntries, ("%#x (%s)\n", cbField, pCur->pszName), VERR_SSM_FIELD_INVALID_SIZE);
+ AssertMsgBreakStmt(cbField == cEntries * sizeof(void *) && cEntries, ("%#x (%s)\n", cbField, pCur->pszName),
+ rc = VERR_SSM_FIELD_INVALID_SIZE);
for (uint32_t i = 0; i < cEntries && RT_SUCCESS(rc); i++)
rc = ssmR3PutHCPtrNI(pSSM, ((void * const *)pbField)[i], fFlags);
break;
}
case SSMFIELDTRANS_HCPTR_HACK_U32:
- AssertMsgReturn(cbField == sizeof(void *), ("%#x (%s)\n", cbField, pCur->pszName), VERR_SSM_FIELD_INVALID_SIZE);
- AssertMsgReturn(*(uintptr_t *)pbField <= UINT32_MAX, ("%p (%s)\n", *(uintptr_t *)pbField, pCur->pszName), VERR_SSM_FIELD_INVALID_VALUE);
+ AssertMsgBreakStmt(cbField == sizeof(void *), ("%#x (%s)\n", cbField, pCur->pszName), rc = VERR_SSM_FIELD_INVALID_SIZE);
+ AssertMsgBreakStmt(*(uintptr_t *)pbField <= UINT32_MAX, ("%p (%s)\n", *(uintptr_t *)pbField, pCur->pszName),
+ rc = VERR_SSM_FIELD_INVALID_VALUE);
rc = ssmR3DataWrite(pSSM, pbField, sizeof(uint32_t));
- if ((fFlags & SSMSTRUCT_FLAGS_DONT_IGNORE) && sizeof(void *) != sizeof(uint32_t))
+ if ((fFlags & SSMSTRUCT_FLAGS_DONT_IGNORE) && sizeof(void *) != sizeof(uint32_t) && RT_SUCCESS(rc))
rc = ssmR3DataWrite(pSSM, g_abZero, sizeof(uint32_t));
break;
case SSMFIELDTRANS_U32_ZX_U64:
- AssertFailedReturn(VERR_SSM_FIELD_LOAD_ONLY_TRANSFORMATION);
+ AssertFailedBreakStmt(rc = VERR_SSM_FIELD_LOAD_ONLY_TRANSFORMATION);
break;
case SSMFIELDTRANS_IGNORE:
@@ -3642,62 +3655,68 @@ VMMR3DECL(int) SSMR3PutStructEx(PSSMHANDLE pSSM, const void *pvStruct, size_t cb
break;
case SSMFIELDTRANS_IGN_GCPHYS:
- AssertMsgReturn(cbField == sizeof(RTGCPHYS), ("%#x (%s)\n", cbField, pCur->pszName), VERR_SSM_FIELD_INVALID_SIZE);
+ AssertMsgBreakStmt(cbField == sizeof(RTGCPHYS), ("%#x (%s)\n", cbField, pCur->pszName), rc = VERR_SSM_FIELD_INVALID_SIZE);
if (fFlags & SSMSTRUCT_FLAGS_DONT_IGNORE)
rc = ssmR3DataWrite(pSSM, g_abZero, sizeof(RTGCPHYS));
break;
case SSMFIELDTRANS_IGN_GCPTR:
- AssertMsgReturn(cbField == sizeof(RTGCPTR), ("%#x (%s)\n", cbField, pCur->pszName), VERR_SSM_FIELD_INVALID_SIZE);
+ AssertMsgBreakStmt(cbField == sizeof(RTGCPTR), ("%#x (%s)\n", cbField, pCur->pszName), rc = VERR_SSM_FIELD_INVALID_SIZE);
if (fFlags & SSMSTRUCT_FLAGS_DONT_IGNORE)
rc = ssmR3DataWrite(pSSM, g_abZero, sizeof(RTGCPTR));
break;
case SSMFIELDTRANS_IGN_RCPTR:
- AssertMsgReturn(cbField == sizeof(RTRCPTR), ("%#x (%s)\n", cbField, pCur->pszName), VERR_SSM_FIELD_INVALID_SIZE);
+ AssertMsgBreakStmt(cbField == sizeof(RTRCPTR), ("%#x (%s)\n", cbField, pCur->pszName), rc = VERR_SSM_FIELD_INVALID_SIZE);
if (fFlags & SSMSTRUCT_FLAGS_DONT_IGNORE)
rc = ssmR3DataWrite(pSSM, g_abZero, sizeof(RTRCPTR));
break;
case SSMFIELDTRANS_IGN_HCPTR:
- AssertMsgReturn(cbField == sizeof(void *), ("%#x (%s)\n", cbField, pCur->pszName), VERR_SSM_FIELD_INVALID_SIZE);
+ AssertMsgBreakStmt(cbField == sizeof(void *), ("%#x (%s)\n", cbField, pCur->pszName), rc = VERR_SSM_FIELD_INVALID_SIZE);
if (fFlags & SSMSTRUCT_FLAGS_DONT_IGNORE)
rc = ssmR3DataWrite(pSSM, g_abZero, sizeof(void *));
break;
case SSMFIELDTRANS_OLD:
- AssertMsgReturn(pCur->off == UINT32_MAX / 2, ("%#x %#x (%s)\n", pCur->cb, pCur->off, pCur->pszName), VERR_SSM_FIELD_INVALID_SIZE);
+ AssertMsgBreakStmt(pCur->off == UINT32_MAX / 2, ("%#x %#x (%s)\n", pCur->cb, pCur->off, pCur->pszName), rc = VERR_SSM_FIELD_INVALID_SIZE);
rc = ssmR3PutZeros(pSSM, pCur->cb);
break;
case SSMFIELDTRANS_OLD_GCPHYS:
- AssertMsgReturn(pCur->cb == sizeof(RTGCPHYS) && pCur->off == UINT32_MAX / 2, ("%#x %#x (%s)\n", pCur->cb, pCur->off, pCur->pszName), VERR_SSM_FIELD_INVALID_SIZE);
+ AssertMsgBreakStmt(pCur->cb == sizeof(RTGCPHYS) && pCur->off == UINT32_MAX / 2, ("%#x %#x (%s)\n", pCur->cb, pCur->off, pCur->pszName),
+ rc = VERR_SSM_FIELD_INVALID_SIZE);
rc = ssmR3DataWrite(pSSM, g_abZero, sizeof(RTGCPHYS));
break;
case SSMFIELDTRANS_OLD_GCPTR:
- AssertMsgReturn(pCur->cb == sizeof(RTGCPTR) && pCur->off == UINT32_MAX / 2, ("%#x %#x (%s)\n", pCur->cb, pCur->off, pCur->pszName), VERR_SSM_FIELD_INVALID_SIZE);
+ AssertMsgBreakStmt(pCur->cb == sizeof(RTGCPTR) && pCur->off == UINT32_MAX / 2, ("%#x %#x (%s)\n", pCur->cb, pCur->off, pCur->pszName),
+ rc = VERR_SSM_FIELD_INVALID_SIZE);
rc = ssmR3DataWrite(pSSM, g_abZero, sizeof(RTGCPTR));
break;
case SSMFIELDTRANS_OLD_RCPTR:
- AssertMsgReturn(pCur->cb == sizeof(RTRCPTR) && pCur->off == UINT32_MAX / 2, ("%#x %#x (%s)\n", pCur->cb, pCur->off, pCur->pszName), VERR_SSM_FIELD_INVALID_SIZE);
+ AssertMsgBreakStmt(pCur->cb == sizeof(RTRCPTR) && pCur->off == UINT32_MAX / 2, ("%#x %#x (%s)\n", pCur->cb, pCur->off, pCur->pszName),
+ rc = VERR_SSM_FIELD_INVALID_SIZE);
rc = ssmR3DataWrite(pSSM, g_abZero, sizeof(RTRCPTR));
break;
case SSMFIELDTRANS_OLD_HCPTR:
- AssertMsgReturn(pCur->cb == sizeof(void *) && pCur->off == UINT32_MAX / 2, ("%#x %#x (%s)\n", pCur->cb, pCur->off, pCur->pszName), VERR_SSM_FIELD_INVALID_SIZE);
+ AssertMsgBreakStmt(pCur->cb == sizeof(void *) && pCur->off == UINT32_MAX / 2, ("%#x %#x (%s)\n", pCur->cb, pCur->off, pCur->pszName),
+ rc = VERR_SSM_FIELD_INVALID_SIZE);
rc = ssmR3DataWrite(pSSM, g_abZero, sizeof(void *));
break;
case SSMFIELDTRANS_OLD_PAD_HC:
- AssertMsgReturn(pCur->off == UINT32_MAX / 2, ("%#x %#x (%s)\n", pCur->cb, pCur->off, pCur->pszName), VERR_SSM_FIELD_INVALID_SIZE);
+ AssertMsgBreakStmt(pCur->off == UINT32_MAX / 2, ("%#x %#x (%s)\n", pCur->cb, pCur->off, pCur->pszName),
+ rc = VERR_SSM_FIELD_INVALID_SIZE);
rc = ssmR3PutZeros(pSSM, HC_ARCH_BITS == 64 ? RT_HIWORD(pCur->cb) : RT_LOWORD(pCur->cb));
break;
case SSMFIELDTRANS_OLD_PAD_MSC32:
- AssertMsgReturn(pCur->off == UINT32_MAX / 2, ("%#x %#x (%s)\n", pCur->cb, pCur->off, pCur->pszName), VERR_SSM_FIELD_INVALID_SIZE);
+ AssertMsgBreakStmt(pCur->off == UINT32_MAX / 2, ("%#x %#x (%s)\n", pCur->cb, pCur->off, pCur->pszName),
+ rc = VERR_SSM_FIELD_INVALID_SIZE);
if (SSM_HOST_IS_MSC_32)
rc = ssmR3PutZeros(pSSM, pCur->cb);
break;
@@ -3719,37 +3738,46 @@ VMMR3DECL(int) SSMR3PutStructEx(PSSMHANDLE pSSM, const void *pvStruct, size_t cb
|| ( (uintptr_t)pCur->pfnGetPutOrTransformer == SSMFIELDTRANS_PAD_MSC32_AUTO
&& !ssmR3IsHostMsc32(pSSM))
? cb64 : cb32;
- AssertMsgReturn( cbField == cbCtx
- && ( ( pCur->off == UINT32_MAX / 2
- && ( cbField == 0
- || (uintptr_t)pCur->pfnGetPutOrTransformer == SSMFIELDTRANS_PAD_HC_AUTO
- || (uintptr_t)pCur->pfnGetPutOrTransformer == SSMFIELDTRANS_PAD_MSC32_AUTO
- )
+ AssertMsgBreakStmt( cbField == cbCtx
+ && ( ( pCur->off == UINT32_MAX / 2
+ && ( cbField == 0
+ || (uintptr_t)pCur->pfnGetPutOrTransformer == SSMFIELDTRANS_PAD_HC_AUTO
+ || (uintptr_t)pCur->pfnGetPutOrTransformer == SSMFIELDTRANS_PAD_MSC32_AUTO
+ )
+ )
+ || (pCur->off != UINT32_MAX / 2 && cbField != 0)
)
- || (pCur->off != UINT32_MAX / 2 && cbField != 0)
- )
- , ("cbField=%#x cb32=%#x cb64=%#x HC_ARCH_BITS=%u cbCtx=%#x cbSaved=%#x off=%#x\n",
- cbField, cb32, cb64, HC_ARCH_BITS, cbCtx, cbSaved, pCur->off),
- VERR_SSM_FIELD_INVALID_PADDING_SIZE);
+ , ("cbField=%#x cb32=%#x cb64=%#x HC_ARCH_BITS=%u cbCtx=%#x cbSaved=%#x off=%#x\n",
+ cbField, cb32, cb64, HC_ARCH_BITS, cbCtx, cbSaved, pCur->off),
+ rc = VERR_SSM_FIELD_INVALID_PADDING_SIZE);
if (fFlags & SSMSTRUCT_FLAGS_DONT_IGNORE)
rc = ssmR3PutZeros(pSSM, cbSaved);
break;
}
default:
- AssertPtrReturn(pCur->pfnGetPutOrTransformer, VERR_SSM_FIELD_INVALID_CALLBACK);
+ AssertPtrBreakStmt(pCur->pfnGetPutOrTransformer, rc = VERR_SSM_FIELD_INVALID_CALLBACK);
rc = pCur->pfnGetPutOrTransformer(pSSM, pCur, (void *)pvStruct, fFlags, false /*fGetOrPut*/, pvUser);
break;
}
if (RT_FAILURE(rc))
- return rc;
+ break; /* Deal with failures in one place (see below). */
off = offField + cbField;
}
- AssertMsgReturn( !(fFlags & SSMSTRUCT_FLAGS_FULL_STRUCT)
- || off == cbStruct,
- ("off=%#x cbStruct=%#x\n", off, cbStruct),
- VERR_SSM_FIELD_NOT_CONSECUTIVE);
+
+ if (RT_SUCCESS(rc))
+ AssertMsgStmt( !(fFlags & SSMSTRUCT_FLAGS_FULL_STRUCT)
+ || off == cbStruct,
+ ("off=%#x cbStruct=%#x\n", off, cbStruct),
+ rc = VERR_SSM_FIELD_NOT_CONSECUTIVE);
+
+ if (RT_FAILURE(rc))
+ {
+ if (RT_SUCCESS(pSSM->rc))
+ pSSM->rc = rc;
+ return rc;
+ }
/*
* End marker
@@ -5780,7 +5808,7 @@ DECLINLINE(int) ssmR3DataReadV2RawLzfHdr(PSSMHANDLE pSSM, uint32_t *pcbDecompr)
AssertLogRelMsgReturn( pSSM->u.Read.cbRecLeft > 1
&& pSSM->u.Read.cbRecLeft <= RT_SIZEOFMEMB(SSMHANDLE, u.Read.abComprBuffer) + 2,
("%#x\n", pSSM->u.Read.cbRecLeft),
- VERR_SSM_INTEGRITY_DECOMPRESSION);
+ pSSM->rc = VERR_SSM_INTEGRITY_DECOMPRESSION);
uint8_t cKB;
int rc = ssmR3DataReadV2Raw(pSSM, &cKB, 1);
@@ -5792,7 +5820,7 @@ DECLINLINE(int) ssmR3DataReadV2RawLzfHdr(PSSMHANDLE pSSM, uint32_t *pcbDecompr)
AssertLogRelMsgReturn( cbDecompr >= pSSM->u.Read.cbRecLeft
&& cbDecompr <= RT_SIZEOFMEMB(SSMHANDLE, u.Read.abDataBuffer),
("%#x\n", cbDecompr),
- VERR_SSM_INTEGRITY_DECOMPRESSION);
+ pSSM->rc = VERR_SSM_INTEGRITY_DECOMPRESSION);
*pcbDecompr = cbDecompr;
return VINF_SUCCESS;
@@ -5840,7 +5868,7 @@ static int ssmR3DataReadV2RawLzf(PSSMHANDLE pSSM, void *pvDst, size_t cbDecompr)
pvDst, cbDecompr, &cbDstActual);
if (RT_SUCCESS(rc))
{
- AssertLogRelMsgReturn(cbDstActual == cbDecompr, ("%#x %#x\n", cbDstActual, cbDecompr), VERR_SSM_INTEGRITY_DECOMPRESSION);
+ AssertLogRelMsgReturn(cbDstActual == cbDecompr, ("%#x %#x\n", cbDstActual, cbDecompr), pSSM->rc = VERR_SSM_INTEGRITY_DECOMPRESSION);
return VINF_SUCCESS;
}
@@ -5859,7 +5887,7 @@ static int ssmR3DataReadV2RawLzf(PSSMHANDLE pSSM, void *pvDst, size_t cbDecompr)
DECLINLINE(int) ssmR3DataReadV2RawZeroHdr(PSSMHANDLE pSSM, uint32_t *pcbZero)
{
*pcbZero = 0; /* shuts up gcc. */
- AssertLogRelMsgReturn(pSSM->u.Read.cbRecLeft == 1, ("%#x\n", pSSM->u.Read.cbRecLeft), VERR_SSM_INTEGRITY_DECOMPRESSION);
+ AssertLogRelMsgReturn(pSSM->u.Read.cbRecLeft == 1, ("%#x\n", pSSM->u.Read.cbRecLeft), pSSM->rc = VERR_SSM_INTEGRITY_DECOMPRESSION);
uint8_t cKB;
int rc = ssmR3DataReadV2Raw(pSSM, &cKB, 1);
@@ -5869,7 +5897,7 @@ DECLINLINE(int) ssmR3DataReadV2RawZeroHdr(PSSMHANDLE pSSM, uint32_t *pcbZero)
uint32_t cbZero = (uint32_t)cKB * _1K;
AssertLogRelMsgReturn(cbZero <= RT_SIZEOFMEMB(SSMHANDLE, u.Read.abDataBuffer),
- ("%#x\n", cbZero), VERR_SSM_INTEGRITY_DECOMPRESSION);
+ ("%#x\n", cbZero), pSSM->rc = VERR_SSM_INTEGRITY_DECOMPRESSION);
*pcbZero = cbZero;
return VINF_SUCCESS;
@@ -6048,6 +6076,7 @@ static int ssmR3DataReadRecHdrV2(PSSMHANDLE pSSM)
/**
* Buffer miss, do an unbuffered read.
*
+ * @returns VBox status code. Sets pSSM->rc on error.
* @param pSSM The saved state handle.
* @param pvBuf Where to store the read data.
* @param cbBuf Number of bytes to read.
@@ -6149,7 +6178,7 @@ static int ssmR3DataReadUnbufferedV2(PSSMHANDLE pSSM, void *pvBuf, size_t cbBuf)
}
default:
- AssertMsgFailedReturn(("%x\n", pSSM->u.Read.u8TypeAndFlags), VERR_SSM_BAD_REC_TYPE);
+ AssertMsgFailedReturn(("%x\n", pSSM->u.Read.u8TypeAndFlags), pSSM->rc = VERR_SSM_BAD_REC_TYPE);
}
pSSM->offUnitUser += cbToRead;
@@ -6252,7 +6281,7 @@ static int ssmR3DataReadBufferedV2(PSSMHANDLE pSSM, void *pvBuf, size_t cbBuf)
}
default:
- AssertMsgFailedReturn(("%x\n", pSSM->u.Read.u8TypeAndFlags), VERR_SSM_BAD_REC_TYPE);
+ AssertMsgFailedReturn(("%x\n", pSSM->u.Read.u8TypeAndFlags), pSSM->rc = VERR_SSM_BAD_REC_TYPE);
}
/*pSSM->u.Read.offDataBuffer = 0;*/
@@ -6337,7 +6366,7 @@ VMMR3DECL(int) SSMR3GetStruct(PSSMHANDLE pSSM, void *pvStruct, PCSSMFIELD paFiel
int rc = SSMR3GetU32(pSSM, &u32Magic);
if (RT_FAILURE(rc))
return rc;
- AssertMsgReturn(u32Magic == SSMR3STRUCT_BEGIN, ("u32Magic=%#RX32\n", u32Magic), VERR_SSM_STRUCTURE_MAGIC);
+ AssertMsgReturn(u32Magic == SSMR3STRUCT_BEGIN, ("u32Magic=%#RX32\n", u32Magic), pSSM->rc = VERR_SSM_STRUCTURE_MAGIC);
/* get the fields */
for (PCSSMFIELD pCur = paFields;
@@ -6352,24 +6381,24 @@ VMMR3DECL(int) SSMR3GetStruct(PSSMHANDLE pSSM, void *pvStruct, PCSSMFIELD paFiel
break;
case SSMFIELDTRANS_GCPTR:
- AssertMsgReturn(pCur->cb == sizeof(RTGCPTR), ("%#x (%s)\n", pCur->cb, pCur->pszName), VERR_SSM_FIELD_INVALID_SIZE);
+ AssertMsgBreakStmt(pCur->cb == sizeof(RTGCPTR), ("%#x (%s)\n", pCur->cb, pCur->pszName), rc = VERR_SSM_FIELD_INVALID_SIZE);
rc = SSMR3GetGCPtr(pSSM, (PRTGCPTR)pbField);
break;
case SSMFIELDTRANS_GCPHYS:
- AssertMsgReturn(pCur->cb == sizeof(RTGCPHYS), ("%#x (%s)\n", pCur->cb, pCur->pszName), VERR_SSM_FIELD_INVALID_SIZE);
+ AssertMsgBreakStmt(pCur->cb == sizeof(RTGCPHYS), ("%#x (%s)\n", pCur->cb, pCur->pszName), rc = VERR_SSM_FIELD_INVALID_SIZE);
rc = SSMR3GetGCPhys(pSSM, (PRTGCPHYS)pbField);
break;
case SSMFIELDTRANS_RCPTR:
- AssertMsgReturn(pCur->cb == sizeof(RTRCPTR), ("%#x (%s)\n", pCur->cb, pCur->pszName), VERR_SSM_FIELD_INVALID_SIZE);
+ AssertMsgBreakStmt(pCur->cb == sizeof(RTRCPTR), ("%#x (%s)\n", pCur->cb, pCur->pszName), rc = VERR_SSM_FIELD_INVALID_SIZE);
rc = SSMR3GetRCPtr(pSSM, (PRTRCPTR)pbField);
break;
case SSMFIELDTRANS_RCPTR_ARRAY:
{
uint32_t const cEntries = pCur->cb / sizeof(RTRCPTR);
- AssertMsgReturn(pCur->cb == cEntries * sizeof(RTRCPTR) && cEntries, ("%#x (%s)\n", pCur->cb, pCur->pszName), VERR_SSM_FIELD_INVALID_SIZE);
+ AssertMsgBreakStmt(pCur->cb == cEntries * sizeof(RTRCPTR) && cEntries, ("%#x (%s)\n", pCur->cb, pCur->pszName), rc = VERR_SSM_FIELD_INVALID_SIZE);
rc = VINF_SUCCESS;
for (uint32_t i = 0; i < cEntries && RT_SUCCESS(rc); i++)
rc = SSMR3GetRCPtr(pSSM, &((PRTRCPTR)pbField)[i]);
@@ -6377,17 +6406,21 @@ VMMR3DECL(int) SSMR3GetStruct(PSSMHANDLE pSSM, void *pvStruct, PCSSMFIELD paFiel
}
default:
- AssertMsgFailedReturn(("%#x\n", pCur->pfnGetPutOrTransformer), VERR_SSM_FIELD_COMPLEX);
+ AssertMsgFailedBreakStmt(("%#x\n", pCur->pfnGetPutOrTransformer), rc = VERR_SSM_FIELD_COMPLEX);
}
if (RT_FAILURE(rc))
+ {
+ if (RT_SUCCESS(pSSM->rc))
+ pSSM->rc = rc;
return rc;
+ }
}
/* end marker */
rc = SSMR3GetU32(pSSM, &u32Magic);
if (RT_FAILURE(rc))
return rc;
- AssertMsgReturn(u32Magic == SSMR3STRUCT_END, ("u32Magic=%#RX32\n", u32Magic), VERR_SSM_STRUCTURE_MAGIC);
+ AssertMsgReturn(u32Magic == SSMR3STRUCT_END, ("u32Magic=%#RX32\n", u32Magic), pSSM->rc = VERR_SSM_STRUCTURE_MAGIC);
return rc;
}
@@ -6460,7 +6493,7 @@ VMMR3DECL(int) SSMR3GetStructEx(PSSMHANDLE pSSM, void *pvStruct, size_t cbStruct
*/
SSM_ASSERT_READABLE_RET(pSSM);
SSM_CHECK_CANCELLED_RET(pSSM);
- AssertMsgReturn(!(fFlags & ~SSMSTRUCT_FLAGS_VALID_MASK), ("%#x\n", fFlags), VERR_INVALID_PARAMETER);
+ AssertMsgReturn(!(fFlags & ~SSMSTRUCT_FLAGS_VALID_MASK), ("%#x\n", fFlags), pSSM->rc = VERR_INVALID_PARAMETER);
AssertPtr(pvStruct);
AssertPtr(paFields);
@@ -6472,12 +6505,13 @@ VMMR3DECL(int) SSMR3GetStructEx(PSSMHANDLE pSSM, void *pvStruct, size_t cbStruct
rc = SSMR3GetU32(pSSM, &u32Magic);
if (RT_FAILURE(rc))
return rc;
- AssertMsgReturn(u32Magic == SSMR3STRUCT_BEGIN, ("u32Magic=%#RX32\n", u32Magic), VERR_SSM_STRUCTURE_MAGIC);
+ AssertMsgReturn(u32Magic == SSMR3STRUCT_BEGIN, ("u32Magic=%#RX32\n", u32Magic), pSSM->rc = VERR_SSM_STRUCTURE_MAGIC);
}
/*
* Put the fields
*/
+ rc = VINF_SUCCESS;
uint32_t off = 0;
for (PCSSMFIELD pCur = paFields;
pCur->cb != UINT32_MAX && pCur->off != UINT32_MAX;
@@ -6496,11 +6530,11 @@ VMMR3DECL(int) SSMR3GetStructEx(PSSMHANDLE pSSM, void *pvStruct, size_t cbStruct
&& offField + cbField <= cbStruct
&& offField + cbField >= offField,
("off=%#x cb=%#x cbStruct=%#x (%s)\n", cbField, offField, cbStruct, pCur->pszName),
- VERR_SSM_FIELD_OUT_OF_BOUNDS);
+ pSSM->rc = VERR_SSM_FIELD_OUT_OF_BOUNDS);
AssertMsgReturn( !(fFlags & SSMSTRUCT_FLAGS_FULL_STRUCT)
|| off == offField,
("off=%#x offField=%#x (%s)\n", off, offField, pCur->pszName),
- VERR_SSM_FIELD_NOT_CONSECUTIVE);
+ pSSM->rc = VERR_SSM_FIELD_NOT_CONSECUTIVE);
rc = VINF_SUCCESS;
uint8_t *pbField = (uint8_t *)pvStruct + offField;
@@ -6511,24 +6545,24 @@ VMMR3DECL(int) SSMR3GetStructEx(PSSMHANDLE pSSM, void *pvStruct, size_t cbStruct
break;
case SSMFIELDTRANS_GCPHYS:
- AssertMsgReturn(cbField == sizeof(RTGCPHYS), ("%#x (%s)\n", cbField, pCur->pszName), VERR_SSM_FIELD_INVALID_SIZE);
+ AssertMsgBreakStmt(cbField == sizeof(RTGCPHYS), ("%#x (%s)\n", cbField, pCur->pszName), rc = VERR_SSM_FIELD_INVALID_SIZE);
rc = SSMR3GetGCPhys(pSSM, (PRTGCPHYS)pbField);
break;
case SSMFIELDTRANS_GCPTR:
- AssertMsgReturn(cbField == sizeof(RTGCPTR), ("%#x (%s)\n", cbField, pCur->pszName), VERR_SSM_FIELD_INVALID_SIZE);
+ AssertMsgBreakStmt(cbField == sizeof(RTGCPTR), ("%#x (%s)\n", cbField, pCur->pszName), rc = VERR_SSM_FIELD_INVALID_SIZE);
rc = SSMR3GetGCPtr(pSSM, (PRTGCPTR)pbField);
break;
case SSMFIELDTRANS_RCPTR:
- AssertMsgReturn(cbField == sizeof(RTRCPTR), ("%#x (%s)\n", cbField, pCur->pszName), VERR_SSM_FIELD_INVALID_SIZE);
+ AssertMsgBreakStmt(cbField == sizeof(RTRCPTR), ("%#x (%s)\n", cbField, pCur->pszName), rc = VERR_SSM_FIELD_INVALID_SIZE);
rc = SSMR3GetRCPtr(pSSM, (PRTRCPTR)pbField);
break;
case SSMFIELDTRANS_RCPTR_ARRAY:
{
uint32_t const cEntries = cbField / sizeof(RTRCPTR);
- AssertMsgReturn(cbField == cEntries * sizeof(RTRCPTR) && cEntries, ("%#x (%s)\n", cbField, pCur->pszName), VERR_SSM_FIELD_INVALID_SIZE);
+ AssertMsgBreakStmt(cbField == cEntries * sizeof(RTRCPTR) && cEntries, ("%#x (%s)\n", cbField, pCur->pszName), rc = VERR_SSM_FIELD_INVALID_SIZE);
rc = VINF_SUCCESS;
for (uint32_t i = 0; i < cEntries && RT_SUCCESS(rc); i++)
rc = SSMR3GetRCPtr(pSSM, &((PRTRCPTR)pbField)[i]);
@@ -6536,14 +6570,14 @@ VMMR3DECL(int) SSMR3GetStructEx(PSSMHANDLE pSSM, void *pvStruct, size_t cbStruct
}
case SSMFIELDTRANS_HCPTR_NI:
- AssertMsgReturn(cbField == sizeof(void *), ("%#x (%s)\n", cbField, pCur->pszName), VERR_SSM_FIELD_INVALID_SIZE);
+ AssertMsgBreakStmt(cbField == sizeof(void *), ("%#x (%s)\n", cbField, pCur->pszName), rc = VERR_SSM_FIELD_INVALID_SIZE);
rc = ssmR3GetHCPtrNI(pSSM, (void **)pbField, fFlags);
break;
case SSMFIELDTRANS_HCPTR_NI_ARRAY:
{
uint32_t const cEntries = cbField / sizeof(void *);
- AssertMsgReturn(cbField == cEntries * sizeof(void *) && cEntries, ("%#x (%s)\n", cbField, pCur->pszName), VERR_SSM_FIELD_INVALID_SIZE);
+ AssertMsgBreakStmt(cbField == cEntries * sizeof(void *) && cEntries, ("%#x (%s)\n", cbField, pCur->pszName), rc = VERR_SSM_FIELD_INVALID_SIZE);
rc = VINF_SUCCESS;
for (uint32_t i = 0; i < cEntries && RT_SUCCESS(rc); i++)
rc = ssmR3GetHCPtrNI(pSSM, &((void **)pbField)[i], fFlags);
@@ -6551,21 +6585,21 @@ VMMR3DECL(int) SSMR3GetStructEx(PSSMHANDLE pSSM, void *pvStruct, size_t cbStruct
}
case SSMFIELDTRANS_HCPTR_HACK_U32:
- AssertMsgReturn(cbField == sizeof(void *), ("%#x (%s)\n", cbField, pCur->pszName), VERR_SSM_FIELD_INVALID_SIZE);
+ AssertMsgBreakStmt(cbField == sizeof(void *), ("%#x (%s)\n", cbField, pCur->pszName), rc = VERR_SSM_FIELD_INVALID_SIZE);
*(uintptr_t *)pbField = 0;
rc = ssmR3DataRead(pSSM, pbField, sizeof(uint32_t));
if ((fFlags & SSMSTRUCT_FLAGS_DONT_IGNORE) && ssmR3GetHostBits(pSSM) == 64)
{
uint32_t u32;
rc = ssmR3DataRead(pSSM, &u32, sizeof(uint32_t));
- AssertMsgReturn(RT_FAILURE(rc) || u32 == 0 || (fFlags & SSMSTRUCT_FLAGS_SAVED_AS_MEM),
- ("high=%#x low=%#x (%s)\n", u32, *(uint32_t *)pbField, pCur->pszName),
- VERR_SSM_FIELD_INVALID_VALUE);
+ AssertMsgBreakStmt(RT_FAILURE(rc) || u32 == 0 || (fFlags & SSMSTRUCT_FLAGS_SAVED_AS_MEM),
+ ("high=%#x low=%#x (%s)\n", u32, *(uint32_t *)pbField, pCur->pszName),
+ rc = VERR_SSM_FIELD_INVALID_VALUE);
}
break;
case SSMFIELDTRANS_U32_ZX_U64:
- AssertMsgReturn(cbField == sizeof(uint64_t), ("%#x (%s)\n", cbField, pCur->pszName), VERR_SSM_FIELD_INVALID_SIZE);
+ AssertMsgBreakStmt(cbField == sizeof(uint64_t), ("%#x (%s)\n", cbField, pCur->pszName), rc = VERR_SSM_FIELD_INVALID_SIZE);
((uint32_t *)pbField)[1] = 0;
rc = SSMR3GetU32(pSSM, (uint32_t *)pbField);
break;
@@ -6577,62 +6611,62 @@ VMMR3DECL(int) SSMR3GetStructEx(PSSMHANDLE pSSM, void *pvStruct, size_t cbStruct
break;
case SSMFIELDTRANS_IGN_GCPHYS:
- AssertMsgReturn(cbField == sizeof(RTGCPHYS), ("%#x (%s)\n", cbField, pCur->pszName), VERR_SSM_FIELD_INVALID_SIZE);
+ AssertMsgBreakStmt(cbField == sizeof(RTGCPHYS), ("%#x (%s)\n", cbField, pCur->pszName), rc = VERR_SSM_FIELD_INVALID_SIZE);
if (fFlags & SSMSTRUCT_FLAGS_DONT_IGNORE)
rc = SSMR3Skip(pSSM, pSSM->u.Read.cbGCPhys);
break;
case SSMFIELDTRANS_IGN_GCPTR:
- AssertMsgReturn(cbField == sizeof(RTGCPTR), ("%#x (%s)\n", cbField, pCur->pszName), VERR_SSM_FIELD_INVALID_SIZE);
+ AssertMsgBreakStmt(cbField == sizeof(RTGCPTR), ("%#x (%s)\n", cbField, pCur->pszName), rc = VERR_SSM_FIELD_INVALID_SIZE);
if (fFlags & SSMSTRUCT_FLAGS_DONT_IGNORE)
rc = SSMR3Skip(pSSM, pSSM->u.Read.cbGCPtr);
break;
case SSMFIELDTRANS_IGN_RCPTR:
- AssertMsgReturn(cbField == sizeof(RTRCPTR), ("%#x (%s)\n", cbField, pCur->pszName), VERR_SSM_FIELD_INVALID_SIZE);
+ AssertMsgBreakStmt(cbField == sizeof(RTRCPTR), ("%#x (%s)\n", cbField, pCur->pszName), rc = VERR_SSM_FIELD_INVALID_SIZE);
if (fFlags & SSMSTRUCT_FLAGS_DONT_IGNORE)
rc = SSMR3Skip(pSSM, sizeof(RTRCPTR));
break;
case SSMFIELDTRANS_IGN_HCPTR:
- AssertMsgReturn(cbField == sizeof(void *), ("%#x (%s)\n", cbField, pCur->pszName), VERR_SSM_FIELD_INVALID_SIZE);
+ AssertMsgBreakStmt(cbField == sizeof(void *), ("%#x (%s)\n", cbField, pCur->pszName), rc = VERR_SSM_FIELD_INVALID_SIZE);
if (fFlags & SSMSTRUCT_FLAGS_DONT_IGNORE)
rc = SSMR3Skip(pSSM, ssmR3GetHostBits(pSSM) / 8);
break;
case SSMFIELDTRANS_OLD:
- AssertMsgReturn(pCur->off == UINT32_MAX / 2, ("%#x %#x (%s)\n", pCur->cb, pCur->off, pCur->pszName), VERR_SSM_FIELD_INVALID_SIZE);
+ AssertMsgBreakStmt(pCur->off == UINT32_MAX / 2, ("%#x %#x (%s)\n", pCur->cb, pCur->off, pCur->pszName), rc = VERR_SSM_FIELD_INVALID_SIZE);
rc = SSMR3Skip(pSSM, pCur->cb);
break;
case SSMFIELDTRANS_OLD_GCPHYS:
- AssertMsgReturn(pCur->cb == sizeof(RTGCPHYS) && pCur->off == UINT32_MAX / 2, ("%#x %#x (%s)\n", pCur->cb, pCur->off, pCur->pszName), VERR_SSM_FIELD_INVALID_SIZE);
+ AssertMsgBreakStmt(pCur->cb == sizeof(RTGCPHYS) && pCur->off == UINT32_MAX / 2, ("%#x %#x (%s)\n", pCur->cb, pCur->off, pCur->pszName), rc = VERR_SSM_FIELD_INVALID_SIZE);
rc = SSMR3Skip(pSSM, pSSM->u.Read.cbGCPhys);
break;
case SSMFIELDTRANS_OLD_GCPTR:
- AssertMsgReturn(pCur->cb == sizeof(RTGCPTR) && pCur->off == UINT32_MAX / 2, ("%#x %#x (%s)\n", pCur->cb, pCur->off, pCur->pszName), VERR_SSM_FIELD_INVALID_SIZE);
+ AssertMsgBreakStmt(pCur->cb == sizeof(RTGCPTR) && pCur->off == UINT32_MAX / 2, ("%#x %#x (%s)\n", pCur->cb, pCur->off, pCur->pszName), rc = VERR_SSM_FIELD_INVALID_SIZE);
rc = SSMR3Skip(pSSM, pSSM->u.Read.cbGCPtr);
break;
case SSMFIELDTRANS_OLD_RCPTR:
- AssertMsgReturn(pCur->cb == sizeof(RTRCPTR) && pCur->off == UINT32_MAX / 2, ("%#x %#x (%s)\n", pCur->cb, pCur->off, pCur->pszName), VERR_SSM_FIELD_INVALID_SIZE);
+ AssertMsgBreakStmt(pCur->cb == sizeof(RTRCPTR) && pCur->off == UINT32_MAX / 2, ("%#x %#x (%s)\n", pCur->cb, pCur->off, pCur->pszName), rc = VERR_SSM_FIELD_INVALID_SIZE);
rc = SSMR3Skip(pSSM, sizeof(RTRCPTR));
break;
case SSMFIELDTRANS_OLD_HCPTR:
- AssertMsgReturn(pCur->cb == sizeof(void *) && pCur->off == UINT32_MAX / 2, ("%#x %#x (%s)\n", pCur->cb, pCur->off, pCur->pszName), VERR_SSM_FIELD_INVALID_SIZE);
+ AssertMsgBreakStmt(pCur->cb == sizeof(void *) && pCur->off == UINT32_MAX / 2, ("%#x %#x (%s)\n", pCur->cb, pCur->off, pCur->pszName), rc = VERR_SSM_FIELD_INVALID_SIZE);
rc = SSMR3Skip(pSSM, ssmR3GetHostBits(pSSM) / 8);
break;
case SSMFIELDTRANS_OLD_PAD_HC:
- AssertMsgReturn(pCur->off == UINT32_MAX / 2, ("%#x %#x (%s)\n", pCur->cb, pCur->off, pCur->pszName), VERR_SSM_FIELD_INVALID_SIZE);
+ AssertMsgBreakStmt(pCur->off == UINT32_MAX / 2, ("%#x %#x (%s)\n", pCur->cb, pCur->off, pCur->pszName), rc = VERR_SSM_FIELD_INVALID_SIZE);
rc = SSMR3Skip(pSSM, ssmR3GetHostBits(pSSM) == 64 ? RT_HIWORD(pCur->cb) : RT_LOWORD(pCur->cb));
break;
case SSMFIELDTRANS_OLD_PAD_MSC32:
- AssertMsgReturn(pCur->off == UINT32_MAX / 2, ("%#x %#x (%s)\n", pCur->cb, pCur->off, pCur->pszName), VERR_SSM_FIELD_INVALID_SIZE);
+ AssertMsgBreakStmt(pCur->off == UINT32_MAX / 2, ("%#x %#x (%s)\n", pCur->cb, pCur->off, pCur->pszName), rc = VERR_SSM_FIELD_INVALID_SIZE);
if (ssmR3IsHostMsc32(pSSM))
rc = SSMR3Skip(pSSM, pCur->cb);
break;
@@ -6654,37 +6688,46 @@ VMMR3DECL(int) SSMR3GetStructEx(PSSMHANDLE pSSM, void *pvStruct, size_t cbStruct
|| ( (uintptr_t)pCur->pfnGetPutOrTransformer == SSMFIELDTRANS_PAD_MSC32_AUTO
&& !ssmR3IsHostMsc32(pSSM))
? cb64 : cb32;
- AssertMsgReturn( cbField == cbCtx
- && ( ( pCur->off == UINT32_MAX / 2
- && ( cbField == 0
- || (uintptr_t)pCur->pfnGetPutOrTransformer == SSMFIELDTRANS_PAD_HC_AUTO
- || (uintptr_t)pCur->pfnGetPutOrTransformer == SSMFIELDTRANS_PAD_MSC32_AUTO
- )
+ AssertMsgBreakStmt( cbField == cbCtx
+ && ( ( pCur->off == UINT32_MAX / 2
+ && ( cbField == 0
+ || (uintptr_t)pCur->pfnGetPutOrTransformer == SSMFIELDTRANS_PAD_HC_AUTO
+ || (uintptr_t)pCur->pfnGetPutOrTransformer == SSMFIELDTRANS_PAD_MSC32_AUTO
+ )
+ )
+ || (pCur->off != UINT32_MAX / 2 && cbField != 0)
)
- || (pCur->off != UINT32_MAX / 2 && cbField != 0)
- )
- , ("cbField=%#x cb32=%#x cb64=%#x HC_ARCH_BITS=%u cbCtx=%#x cbSaved=%#x off=%#x\n",
- cbField, cb32, cb64, HC_ARCH_BITS, cbCtx, cbSaved, pCur->off),
- VERR_SSM_FIELD_INVALID_PADDING_SIZE);
+ , ("cbField=%#x cb32=%#x cb64=%#x HC_ARCH_BITS=%u cbCtx=%#x cbSaved=%#x off=%#x\n",
+ cbField, cb32, cb64, HC_ARCH_BITS, cbCtx, cbSaved, pCur->off),
+ rc = VERR_SSM_FIELD_INVALID_PADDING_SIZE);
if (fFlags & SSMSTRUCT_FLAGS_DONT_IGNORE)
rc = SSMR3Skip(pSSM, cbSaved);
break;
}
default:
- AssertPtrReturn(pCur->pfnGetPutOrTransformer, VERR_SSM_FIELD_INVALID_CALLBACK);
+ AssertBreakStmt(pCur->pfnGetPutOrTransformer, rc = VERR_SSM_FIELD_INVALID_CALLBACK);
rc = pCur->pfnGetPutOrTransformer(pSSM, pCur, pvStruct, fFlags, true /*fGetOrPut*/, pvUser);
break;
}
if (RT_FAILURE(rc))
- return rc;
+ break;
off = offField + cbField;
}
- AssertMsgReturn( !(fFlags & SSMSTRUCT_FLAGS_FULL_STRUCT)
- || off == cbStruct,
- ("off=%#x cbStruct=%#x\n", off, cbStruct),
- VERR_SSM_FIELD_NOT_CONSECUTIVE);
+
+ if (RT_SUCCESS(rc))
+ AssertMsgStmt( !(fFlags & SSMSTRUCT_FLAGS_FULL_STRUCT)
+ || off == cbStruct,
+ ("off=%#x cbStruct=%#x\n", off, cbStruct),
+ rc = VERR_SSM_FIELD_NOT_CONSECUTIVE);
+
+ if (RT_FAILURE(rc))
+ {
+ if (RT_SUCCESS(pSSM->rc))
+ pSSM->rc = rc;
+ return rc;
+ }
/*
* End marker
@@ -6694,7 +6737,7 @@ VMMR3DECL(int) SSMR3GetStructEx(PSSMHANDLE pSSM, void *pvStruct, size_t cbStruct
rc = SSMR3GetU32(pSSM, &u32Magic);
if (RT_FAILURE(rc))
return rc;
- AssertMsgReturn(u32Magic == SSMR3STRUCT_END, ("u32Magic=%#RX32\n", u32Magic), VERR_SSM_STRUCTURE_MAGIC);
+ AssertMsgReturn(u32Magic == SSMR3STRUCT_END, ("u32Magic=%#RX32\n", u32Magic), pSSM->rc = VERR_SSM_STRUCTURE_MAGIC);
}
return VINF_SUCCESS;
diff --git a/src/VBox/VMM/VMMSwitcher/LegacyandAMD64.mac b/src/VBox/VMM/VMMSwitcher/LegacyandAMD64.mac
index 8fb8392..44765d6 100644
--- a/src/VBox/VMM/VMMSwitcher/LegacyandAMD64.mac
+++ b/src/VBox/VMM/VMMSwitcher/LegacyandAMD64.mac
@@ -628,7 +628,8 @@ GLOBALNAME ICEnterTarget
mov rcx, rax ; save old CR0
and rax, ~(X86_CR0_TS | X86_CR0_EM)
mov cr0, rax
- fxrstor [rdx + CPUMCPU.Guest.fpu]
+ ; Use explicit REX prefix. See @bugref{6398}.
+ o64 fxrstor [rdx + CPUMCPU.Guest.fpu]
mov cr0, rcx ; and restore old CR0 again
and dword [rdx + CPUMCPU.fUseFlags], ~CPUM_SYNC_FPU_STATE
@@ -1255,7 +1256,8 @@ BEGINPROC HMRCSaveGuestFPU64
and rax, ~(X86_CR0_TS | X86_CR0_EM)
mov cr0, rax
- fxsave [rsi + CPUMCTX.fpu]
+ ; Use explicit REX prefix. See @bugref{6398}.
+ o64 fxsave [rsi + CPUMCTX.fpu]
mov cr0, rcx ; and restore old CR0 again
diff --git a/src/VBox/VMM/include/HMInternal.h b/src/VBox/VMM/include/HMInternal.h
index f5415aa..b36272c 100644
--- a/src/VBox/VMM/include/HMInternal.h
+++ b/src/VBox/VMM/include/HMInternal.h
@@ -67,6 +67,70 @@ RT_C_DECLS_BEGIN
* @{
*/
+/** @def HMCPU_CF_CLEAR
+ * Clears a HM-context flag for the given VCPU.
+ *
+ * @param pVCpu Pointer to the VMCPU.
+ * @param fFlag The flag to clear.
+ */
+#define HMCPU_CF_CLEAR(pVCpu, fFlag) (ASMAtomicUoAndU32(&(pVCpu)->hm.s.fContextUseFlags, ~(fFlag)))
+
+/** @def VMCPU_FF_SET
+ * Sets a HM-context flag for the given VCPU.
+ *
+ * @param pVCpu Pointer to the VMCPU.
+ * @param fFlag The flag to set.
+ */
+#define HMCPU_CF_SET(pVCpu, fFlag) (ASMAtomicUoOrU32(&(pVCpu)->hm.s.fContextUseFlags, (fFlag)))
+
+/** @def HMCPU_CF_IS_SET
+ * Checks if all the flags in the specified HM-context set is pending.
+ *
+ * @param pVCpu Pointer to the VMCPU.
+ * @param fFlag The flag to check.
+ */
+#define HMCPU_CF_IS_SET(pVCpu, fFlag) ((ASMAtomicUoReadU32(&(pVCpu)->hm.s.fContextUseFlags) & (fFlag)) == (fFlag))
+
+/** @def HMCPU_CF_IS_PENDING
+ * Checks if one or more of the flags in the specified HM-context set is
+ * pending.
+ *
+ * @param pVCpu Pointer to the VMCPU.
+ * @param fFlags The flags to check for.
+ */
+#define HMCPU_CF_IS_PENDING(pVCpu, fFlags) RT_BOOL(ASMAtomicUoReadU32(&(pVCpu)->hm.s.fContextUseFlags) & (fFlags))
+
+/** @def HMCPU_CF_IS_PENDING_ONLY
+ * Checks if -only- one or more of the specified HM-context flags is pending.
+ *
+ * @param pVCpu Pointer to the VMCPU.
+ * @param fFlags The flags to check for.
+ */
+#define HMCPU_CF_IS_PENDING_ONLY(pVCpu, fFlags) !RT_BOOL(ASMAtomicUoReadU32(&(pVCpu)->hm.s.fContextUseFlags) & ~(fFlags))
+
+/** @def HMCPU_CF_IS_SET_ONLY
+ * Checks if -only- all the flags in the specified HM-context set is pending.
+ *
+ * @param pVCpu Pointer to the VMCPU.
+ * @param fFlags The flags to check for.
+ */
+#define HMCPU_CF_IS_SET_ONLY(pVCpu, fFlags) (ASMAtomicUoReadU32(&(pVCpu)->hm.s.fContextUseFlags) == (fFlags))
+
+/** @def HMCPU_CF_RESET_TO
+ * Resets the HM-context flags to the specified value.
+ *
+ * @param pVCpu Pointer to the VMCPU.
+ * @param fFlags The new value.
+ */
+#define HMCPU_CF_RESET_TO(pVCpu, fFlags) (ASMAtomicUoWriteU32(&(pVCpu)->hm.s.fContextUseFlags, (fFlags)))
+
+/** @def HMCPU_CF_VALUE
+ * Returns the current HM-context flags value.
+ *
+ * @param pVCpu Pointer to the VMCPU.
+ */
+#define HMCPU_CF_VALUE(pVCpu) (ASMAtomicUoReadU32(&(pVCpu)->hm.s.fContextUseFlags))
+
/** Maximum number of exit reason statistics counters. */
#define MAX_EXITREASON_STAT 0x100
@@ -519,7 +583,7 @@ typedef struct HMCPU
/** World switch exit counter. */
volatile uint32_t cWorldSwitchExits;
/** HM_CHANGED_* flags. */
- uint32_t fContextUseFlags;
+ volatile uint32_t fContextUseFlags;
/** Id of the last cpu we were executing code on (NIL_RTCPUID for the first
* time). */
RTCPUID idLastCpu;
diff --git a/src/VBox/VMM/include/PATMInternal.h b/src/VBox/VMM/include/PATMInternal.h
index 6222b6d..1e0601d 100644
--- a/src/VBox/VMM/include/PATMInternal.h
+++ b/src/VBox/VMM/include/PATMInternal.h
@@ -31,7 +31,10 @@
/** @name Saved state version numbers.
* @{ */
-#define PATM_SSM_VERSION 55
+/** Uses normal structure serialization with markers and everything. */
+#define PATM_SSM_VERSION 56
+/** Last version which saves structures as raw memory. */
+#define PATM_SSM_VERSION_MEM 55
#define PATM_SSM_VERSION_FIXUP_HACK 54
#define PATM_SSM_VERSION_FIXUP_HACK 54
#define PATM_SSM_VERSION_VER16 53
diff --git a/src/VBox/VMM/testcase/Instructions/InstructionTestGen.py b/src/VBox/VMM/testcase/Instructions/InstructionTestGen.py
index 8a15c0b..6d506d1 100755
--- a/src/VBox/VMM/testcase/Instructions/InstructionTestGen.py
+++ b/src/VBox/VMM/testcase/Instructions/InstructionTestGen.py
@@ -20,7 +20,7 @@ Foundation, in version 2 as it comes in the "COPYING" file of the
VirtualBox OSE distribution. VirtualBox OSE is distributed in the
hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
"""
-__version__ = "$Revision: 88774 $";
+__version__ = "$Revision: 90928 $";
# pylint: disable=C0103,R0913
@@ -136,6 +136,36 @@ g_asGRegs8Rex = ('al', 'cl', 'dl', 'bl', 'spl', 'bpl', 'sil', 'dil',
'ah', 'ch', 'dh', 'bh');
## @}
+## @name EFLAGS/RFLAGS/EFLAGS
+## @{
+X86_EFL_CF = RT_BIT_32(0);
+X86_EFL_CF_BIT = 0;
+X86_EFL_1 = RT_BIT_32(1);
+X86_EFL_PF = RT_BIT_32(2);
+X86_EFL_AF = RT_BIT_32(4);
+X86_EFL_AF_BIT = 4;
+X86_EFL_ZF = RT_BIT_32(6);
+X86_EFL_ZF_BIT = 6;
+X86_EFL_SF = RT_BIT_32(7);
+X86_EFL_SF_BIT = 7;
+X86_EFL_TF = RT_BIT_32(8);
+X86_EFL_IF = RT_BIT_32(9);
+X86_EFL_DF = RT_BIT_32(10);
+X86_EFL_OF = RT_BIT_32(11);
+X86_EFL_OF_BIT = 11;
+X86_EFL_IOPL = (RT_BIT_32(12) | RT_BIT_32(13));
+X86_EFL_NT = RT_BIT_32(14);
+X86_EFL_RF = RT_BIT_32(16);
+X86_EFL_VM = RT_BIT_32(17);
+X86_EFL_AC = RT_BIT_32(18);
+X86_EFL_VIF = RT_BIT_32(19);
+X86_EFL_VIP = RT_BIT_32(20);
+X86_EFL_ID = RT_BIT_32(21);
+X86_EFL_LIVE_MASK = 0x003f7fd5;
+X86_EFL_RA1_MASK = RT_BIT_32(1);
+X86_EFL_IOPL_SHIFT = 12;
+X86_EFL_STATUS_BITS = ( X86_EFL_CF | X86_EFL_PF | X86_EFL_AF | X86_EFL_ZF | X86_EFL_SF | X86_EFL_OF );
+## @}
## @name Random
## @{
@@ -1306,6 +1336,85 @@ class InstrTest_DivIDiv(InstrTestBase):
+class InstrTest_DaaDas(InstrTestBase):
+ """ Tests the DAA and DAS instructions. """
+
+ def __init__(self, fIsDas):
+ InstrTestBase.__init__(self, 'das' if fIsDas else 'daa');
+ self.fIsDas = fIsDas;
+
+ def isApplicable(self, oGen):
+ return not oGen.oTarget.is64Bit();
+
+ def generateTest(self, oGen, sTestFnName):
+ if self.fIsDas: from itgTableDas import g_aItgDasResults as aItgResults;
+ else: from itgTableDaa import g_aItgDaaResults as aItgResults;
+ cMax = len(aItgResults);
+ if oGen.isTiny():
+ cMax = 64;
+
+ oGen.write('VBINSTST_BEGINPROC %s\n' % (sTestFnName,));
+ oGen.write(' xor ebx, ebx\n');
+ oGen.write('.das_loop:\n');
+ # Save the loop variable so we can load known values.
+ oGen.write(' push ebx\n');
+ oGen.newSubTestEx('ebx');
+
+ # Push the results.
+ oGen.write(' movzx eax, byte [.abAlResults + ebx]\n');
+ oGen.write(' or eax, %#x\n' % (oGen.au32Regs[X86_GREG_xAX] & ~0xff,));
+ oGen.write(' push eax\n');
+ oGen.write(' movzx eax, byte [.aFlagsResults + ebx]\n');
+ oGen.write(' push eax\n');
+ # Calc and push the inputs.
+ oGen.write(' mov eax, ebx\n');
+ oGen.write(' shr eax, 2\n');
+ oGen.write(' and eax, 0ffh\n');
+ oGen.write(' or eax, %#x\n' % (oGen.au32Regs[X86_GREG_xAX] & ~0xff,));
+ oGen.write(' push eax\n');
+
+ oGen.write(' pushfd\n')
+ oGen.write(' and dword [xSP], ~(X86_EFL_CF | X86_EFL_AF)\n');
+ oGen.write(' mov al, bl\n');
+ oGen.write(' and al, 2\n');
+ oGen.write(' shl al, X86_EFL_AF_BIT - 1\n');
+ oGen.write(' or [xSP], al\n');
+ oGen.write(' mov al, bl\n');
+ oGen.write(' and al, X86_EFL_CF\n');
+ oGen.write(' or [xSP], al\n');
+
+ # Load register values and do the test.
+ oGen.write(' call VBINSTST_NAME(Common_LoadKnownValues)\n');
+ oGen.write(' popfd\n');
+ oGen.write(' pop eax\n');
+ if self.fIsDas:
+ oGen.write(' das\n');
+ else:
+ oGen.write(' daa\n');
+
+ # Verify the results.
+ fFlagsToCheck = X86_EFL_CF | X86_EFL_PF | X86_EFL_AF | X86_EFL_SF | X86_EFL_ZF;
+ oGen.write(' call VBINSTST_NAME(%s)\n' % (oGen.needFlagsGRegChecker(fFlagsToCheck, X86_GREG_xAX),));
+
+ # Restore the loop variable and advance.
+ oGen.write(' pop ebx\n');
+ oGen.write(' inc ebx\n');
+ oGen.write(' cmp ebx, %#x\n' % (cMax,));
+ oGen.write(' jb .das_loop\n');
+
+ oGen.write(' ret\n');
+
+ oGen.write('.abAlResults:\n');
+ for i in range(cMax):
+ oGen.write(' db %#x\n' % (aItgResults[i][0],));
+
+ oGen.write('.aFlagsResults:\n');
+ for i in range(cMax):
+ oGen.write(' db %#x\n' % (aItgResults[i][1],));
+
+ oGen.write('VBINSTST_ENDPROC %s\n' % (sTestFnName,));
+ return True;
+
##
# Instruction Tests.
@@ -1315,6 +1424,8 @@ g_aoInstructionTests = [
InstrTest_MovSxD_Gv_Ev(),
InstrTest_DivIDiv(fIsIDiv = False),
InstrTest_DivIDiv(fIsIDiv = True),
+ InstrTest_DaaDas(fIsDas = False),
+ InstrTest_DaaDas(fIsDas = True),
];
@@ -1334,6 +1445,8 @@ class InstructionTestGen(object): # pylint: disable=R0902
## @}
kasTestSizes = ( ksTestSize_Large, ksTestSize_Medium, ksTestSize_Tiny );
+ ## The prefix for the checker functions.
+ ksCheckerPrefix = 'Common_Check_'
def __init__(self, oOptions):
@@ -1420,6 +1533,13 @@ class InstructionTestGen(object): # pylint: disable=R0902
self.write(' mov dword [VBINSTST_NAME(g_uVBInsTstSubTestIndicator) xWrtRIP], __LINE__\n');
return True;
+ def newSubTestEx(self, sIndicator):
+ """
+ Indicates that a new subtest has started.
+ """
+ self.write(' mov dword [VBINSTST_NAME(g_uVBInsTstSubTestIndicator) xWrtRIP], %s\n' % (sIndicator, ));
+ return True;
+
def needGRegChecker(self, iReg1, iReg2 = None, iReg3 = None):
"""
Records the need for a given register checker function, returning its label.
@@ -1438,7 +1558,21 @@ class InstructionTestGen(object): # pylint: disable=R0902
else:
self._dCheckFns[sName] = 1;
- return 'Common_Check_' + sName;
+ return self.ksCheckerPrefix + sName;
+
+ def needFlagsGRegChecker(self, fFlagsToCheck, iReg1, iReg2 = None, iReg3 = None):
+ """
+ Records the need for a given rFLAGS + register checker function, returning its label.
+ """
+ sWorkerName = self.needGRegChecker(iReg1, iReg2, iReg3);
+
+ sName = 'eflags_%#x_%s' % (fFlagsToCheck, sWorkerName[len(self.ksCheckerPrefix):]);
+ if sName in self._dCheckFns:
+ self._dCheckFns[sName] += 1;
+ else:
+ self._dCheckFns[sName] = 1;
+
+ return self.ksCheckerPrefix + sName;
def needGRegMemSetup(self, cAddrBits, cbEffOp, iBaseReg = None, offDisp = None, iIndexReg = None, iScale = 1):
"""
@@ -1523,6 +1657,10 @@ class InstructionTestGen(object): # pylint: disable=R0902
""" Checks if we're in tiny mode."""
return self.oOptions.sTestSize == InstructionTestGen.ksTestSize_Tiny;
+ def isMedium(self):
+ """ Checks if we're in medium mode."""
+ return self.oOptions.sTestSize == InstructionTestGen.ksTestSize_Medium;
+
#
# Forwarding calls for oTarget to shorted typing and lessen the attacks
@@ -1873,43 +2011,76 @@ class InstructionTestGen(object): # pylint: disable=R0902
asRegs = sName.split('_');
sPushSize = 'dword';
- # Prologue
- self.write('\n\n'
- '; Checks 1 or more register values, expected values pushed on the stack.\n'
- '; To save space, the callee cleans up the stack.'
- '; Ref count: %u\n'
- 'VBINSTST_BEGINPROC Common_Check_%s\n'
- ' MY_PUSH_FLAGS\n'
- % ( self._dCheckFns[sName], sName, ) );
-
- # Register checks.
- for i in range(len(asRegs)):
- sReg = asRegs[i];
- iReg = self.oTarget.asGRegs.index(sReg);
- if i == asRegs.index(sReg): # Only check once, i.e. input = output reg.
- self.write(' cmp %s, [xSP + MY_PUSH_FLAGS_SIZE + xCB + sCB * %u]\n'
- ' je .equal%u\n'
- ' push %s %u ; register number\n'
- ' push %s ; actual\n'
- ' mov %s, [xSP + sCB*2 + MY_PUSH_FLAGS_SIZE + xCB + sCB * %u]\n'
- ' push %s ; expected\n'
- ' call VBINSTST_NAME(Common_BadValue)\n'
- '.equal%u:\n'
- % ( sReg, i, i, sPushSize, iReg, sReg, sReg, i, sReg, i, ) );
-
-
- # Restore known register values and check the other registers.
- for sReg in asRegs:
- if self.oTarget.is64Bit():
- self.write(' mov %s, [g_u64KnownValue_%s wrt rip]\n' % (sReg, sReg,));
- else:
- iReg = self.oTarget.asGRegs.index(sReg)
- self.write(' mov %s, 0x%x\n' % (sReg, self.au32Regs[iReg],));
- self.write(' MY_POP_FLAGS\n'
- ' call VBINSTST_NAME(Common_CheckKnownValues)\n'
- ' ret sCB*%u\n'
- 'VBINSTST_ENDPROC Common_Check_%s\n'
- % (len(asRegs), sName,));
+ # Do we check eflags first.
+ if asRegs[0] == 'eflags':
+ asRegs.pop(0);
+ sFlagsToCheck = asRegs.pop(0);
+ self.write('\n\n'
+ '; Check flags and then defers to the register-only checker\n'
+ '; To save space, the callee cleans up the stack.'
+ '; Ref count: %u\n'
+ 'VBINSTST_BEGINPROC %s%s\n'
+ ' MY_PUSH_FLAGS\n'
+ ' push sAX\n'
+ ' mov sAX, [xSP + sCB]\n'
+ ' and sAX, %s\n'
+ ' cmp sAX, [xSP + xCB + sCB*2]\n'
+ ' je .equal\n'
+ % ( self._dCheckFns[sName], self.ksCheckerPrefix, sName,
+ sFlagsToCheck,));
+ self.write(' push dword 0xef ; register number\n'
+ ' push sAX ; actual\n'
+ ' mov sAX, [xSP + xCB + sCB*4]\n'
+ ' push sAX ; expected\n'
+ ' call VBINSTST_NAME(Common_BadValue)\n');
+ self.write('.equal:\n'
+ ' mov xAX, [xSP + sCB*2]\n' # Remove the expected eflags value from the stack frame.
+ ' mov [xSP + sCB*2 + xCB + sCB - xCB], xAX\n'
+ ' pop sAX\n'
+ ' MY_POP_FLAGS\n'
+ ' lea xSP, [xSP + sCB]\n'
+ ' jmp VBINSTST_NAME(Common_Check_%s)\n'
+ 'VBINSTST_ENDPROC %s%s\n'
+ % ( '_'.join(asRegs),
+ self.ksCheckerPrefix, sName,) );
+ else:
+ # Prologue
+ self.write('\n\n'
+ '; Checks 1 or more register values, expected values pushed on the stack.\n'
+ '; To save space, the callee cleans up the stack.'
+ '; Ref count: %u\n'
+ 'VBINSTST_BEGINPROC %s%s\n'
+ ' MY_PUSH_FLAGS\n'
+ % ( self._dCheckFns[sName], self.ksCheckerPrefix, sName, ) );
+
+ # Register checks.
+ for i in range(len(asRegs)):
+ sReg = asRegs[i];
+ iReg = self.oTarget.asGRegs.index(sReg);
+ if i == asRegs.index(sReg): # Only check once, i.e. input = output reg.
+ self.write(' cmp %s, [xSP + MY_PUSH_FLAGS_SIZE + xCB + sCB * %u]\n'
+ ' je .equal%u\n'
+ ' push %s %u ; register number\n'
+ ' push %s ; actual\n'
+ ' mov %s, [xSP + sCB*2 + MY_PUSH_FLAGS_SIZE + xCB + sCB * %u]\n'
+ ' push %s ; expected\n'
+ ' call VBINSTST_NAME(Common_BadValue)\n'
+ '.equal%u:\n'
+ % ( sReg, i, i, sPushSize, iReg, sReg, sReg, i, sReg, i, ) );
+
+
+ # Restore known register values and check the other registers.
+ for sReg in asRegs:
+ if self.oTarget.is64Bit():
+ self.write(' mov %s, [g_u64KnownValue_%s wrt rip]\n' % (sReg, sReg,));
+ else:
+ iReg = self.oTarget.asGRegs.index(sReg)
+ self.write(' mov %s, 0x%x\n' % (sReg, self.au32Regs[iReg],));
+ self.write(' MY_POP_FLAGS\n'
+ ' call VBINSTST_NAME(Common_CheckKnownValues)\n'
+ ' ret sCB*%u\n'
+ 'VBINSTST_ENDPROC %s%s\n'
+ % (len(asRegs), self.ksCheckerPrefix, sName,));
# memory setup functions
self._generateMemSetupFunctions();
@@ -1949,14 +2120,15 @@ class InstructionTestGen(object): # pylint: disable=R0902
# Generate the instruction tests.
for iInstrTest in range(iInstrTestStart, iInstrTestEnd):
oInstrTest = g_aoInstructionTests[iInstrTest];
- self.write('\n'
- '\n'
- ';\n'
- '; %s\n'
- ';\n'
- % (oInstrTest.sName,));
- self._randInitIndexes();
- oInstrTest.generateTest(self, self._calcTestFunctionName(oInstrTest, iInstrTest));
+ if oInstrTest.isApplicable(self):
+ self.write('\n'
+ '\n'
+ ';\n'
+ '; %s\n'
+ ';\n'
+ % (oInstrTest.sName,));
+ self._randInitIndexes();
+ oInstrTest.generateTest(self, self._calcTestFunctionName(oInstrTest, iInstrTest));
# Generate the main function.
self.write('\n\n'
diff --git a/src/VBox/VMM/testcase/Instructions/env-common.mac b/src/VBox/VMM/testcase/Instructions/env-common.mac
index 24fdc9e..ff8aeb7 100644
--- a/src/VBox/VMM/testcase/Instructions/env-common.mac
+++ b/src/VBox/VMM/testcase/Instructions/env-common.mac
@@ -18,6 +18,7 @@
%ifndef ___env_common_mac
%define ___env_common_mac
+%include "iprt/x86.mac"
;*******************************************************************************
;* Defined Constants And Macros *
diff --git a/src/VBox/VMM/testcase/Instructions/itgTableDaa.py b/src/VBox/VMM/testcase/Instructions/itgTableDaa.py
new file mode 100644
index 0000000..04c6319
--- /dev/null
+++ b/src/VBox/VMM/testcase/Instructions/itgTableDaa.py
@@ -0,0 +1,1105 @@
+# -*- coding: utf-8 -*-
+# $Id: itgTableDaa.py $
+
+"""
+DAA (instruction) result table.
+"""
+
+
+__copyright__ = \
+"""
+Copyright (C) 2012-2013 Oracle Corporation
+
+This file is part of VirtualBox Open Source Edition (OSE), as
+available from http://www.virtualbox.org. This file is free software;
+you can redistribute it and/or modify it under the terms of the GNU
+General Public License (GPL) as published by the Free Software
+Foundation, in version 2 as it comes in the "COPYING" file of the
+VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+"""
+__version__ = "$Revision: 90928 $";
+
+
+## The 32-bit GCC (C99) program that produced the table below.
+g_sItgCProgramDaa = \
+"""
+#include <stdio.h>
+
+int main()
+{
+ for (unsigned uInputAL = 0; uInputAL < 256; uInputAL++)
+ for (unsigned fAux = 0; fAux < 2; fAux++)
+ for (unsigned fCarry = 0; fCarry < 2; fCarry++)
+ {
+ unsigned uInputEFlags = fCarry | (fAux << 4);
+ unsigned uResultAL;
+ unsigned uResultEFlags;
+ __asm__ __volatile__("pushl %1\\n"
+ "popfl\\n"
+ "daa\\n"
+ "pushf\\n"
+ "pop %1\\n"
+ : "=a" (uResultAL),
+ "=r" (uResultEFlags)
+ : "0" (uInputAL),
+ "1" (uInputEFlags)
+ : "memory"
+ );
+ printf(" ( 0x%02x, 0x%02x ), # AL=0x%02x, AF=%u CF=%u\\n",
+ uResultAL, uResultEFlags & 0xd5, uInputAL, fAux, fCarry);
+ /* 0xd5 = CF, PF, AF, ZF, SF */
+ }
+ return 0;
+}
+""";
+
+
+#
+# Compile and run the above program if requested to do so.
+#
+if __name__ == '__main__':
+ import sys;
+ if len(sys.argv) > 1 and sys.argv[1] == 'gen':
+ import subprocess;
+ oProc = subprocess.Popen(['gcc', '-x', 'c', '-std=gnu99', '-m32', '-o', './itgTableDaa', '-'], stdin = subprocess.PIPE);
+ oProc.communicate(g_sItgCProgramDaa);
+ oProc.wait();
+ oProc = subprocess.Popen(['./itgTableDaa',]).wait();
+ sys.exit(0);
+
+
+
+##
+# The DAA results.
+#
+# The index / input relation is: index = (AL << 2) | (CF << 1) | AF
+#
+g_aItgDaaResults = \
+[
+ ( 0x00, 0x44 ), # AL=0x00, AF=0 CF=0
+ ( 0x60, 0x05 ), # AL=0x00, AF=0 CF=1
+ ( 0x06, 0x14 ), # AL=0x00, AF=1 CF=0
+ ( 0x66, 0x15 ), # AL=0x00, AF=1 CF=1
+ ( 0x01, 0x00 ), # AL=0x01, AF=0 CF=0
+ ( 0x61, 0x01 ), # AL=0x01, AF=0 CF=1
+ ( 0x07, 0x10 ), # AL=0x01, AF=1 CF=0
+ ( 0x67, 0x11 ), # AL=0x01, AF=1 CF=1
+ ( 0x02, 0x00 ), # AL=0x02, AF=0 CF=0
+ ( 0x62, 0x01 ), # AL=0x02, AF=0 CF=1
+ ( 0x08, 0x10 ), # AL=0x02, AF=1 CF=0
+ ( 0x68, 0x11 ), # AL=0x02, AF=1 CF=1
+ ( 0x03, 0x04 ), # AL=0x03, AF=0 CF=0
+ ( 0x63, 0x05 ), # AL=0x03, AF=0 CF=1
+ ( 0x09, 0x14 ), # AL=0x03, AF=1 CF=0
+ ( 0x69, 0x15 ), # AL=0x03, AF=1 CF=1
+ ( 0x04, 0x00 ), # AL=0x04, AF=0 CF=0
+ ( 0x64, 0x01 ), # AL=0x04, AF=0 CF=1
+ ( 0x0a, 0x14 ), # AL=0x04, AF=1 CF=0
+ ( 0x6a, 0x15 ), # AL=0x04, AF=1 CF=1
+ ( 0x05, 0x04 ), # AL=0x05, AF=0 CF=0
+ ( 0x65, 0x05 ), # AL=0x05, AF=0 CF=1
+ ( 0x0b, 0x10 ), # AL=0x05, AF=1 CF=0
+ ( 0x6b, 0x11 ), # AL=0x05, AF=1 CF=1
+ ( 0x06, 0x04 ), # AL=0x06, AF=0 CF=0
+ ( 0x66, 0x05 ), # AL=0x06, AF=0 CF=1
+ ( 0x0c, 0x14 ), # AL=0x06, AF=1 CF=0
+ ( 0x6c, 0x15 ), # AL=0x06, AF=1 CF=1
+ ( 0x07, 0x00 ), # AL=0x07, AF=0 CF=0
+ ( 0x67, 0x01 ), # AL=0x07, AF=0 CF=1
+ ( 0x0d, 0x10 ), # AL=0x07, AF=1 CF=0
+ ( 0x6d, 0x11 ), # AL=0x07, AF=1 CF=1
+ ( 0x08, 0x00 ), # AL=0x08, AF=0 CF=0
+ ( 0x68, 0x01 ), # AL=0x08, AF=0 CF=1
+ ( 0x0e, 0x10 ), # AL=0x08, AF=1 CF=0
+ ( 0x6e, 0x11 ), # AL=0x08, AF=1 CF=1
+ ( 0x09, 0x04 ), # AL=0x09, AF=0 CF=0
+ ( 0x69, 0x05 ), # AL=0x09, AF=0 CF=1
+ ( 0x0f, 0x14 ), # AL=0x09, AF=1 CF=0
+ ( 0x6f, 0x15 ), # AL=0x09, AF=1 CF=1
+ ( 0x10, 0x10 ), # AL=0x0a, AF=0 CF=0
+ ( 0x70, 0x11 ), # AL=0x0a, AF=0 CF=1
+ ( 0x10, 0x10 ), # AL=0x0a, AF=1 CF=0
+ ( 0x70, 0x11 ), # AL=0x0a, AF=1 CF=1
+ ( 0x11, 0x14 ), # AL=0x0b, AF=0 CF=0
+ ( 0x71, 0x15 ), # AL=0x0b, AF=0 CF=1
+ ( 0x11, 0x14 ), # AL=0x0b, AF=1 CF=0
+ ( 0x71, 0x15 ), # AL=0x0b, AF=1 CF=1
+ ( 0x12, 0x14 ), # AL=0x0c, AF=0 CF=0
+ ( 0x72, 0x15 ), # AL=0x0c, AF=0 CF=1
+ ( 0x12, 0x14 ), # AL=0x0c, AF=1 CF=0
+ ( 0x72, 0x15 ), # AL=0x0c, AF=1 CF=1
+ ( 0x13, 0x10 ), # AL=0x0d, AF=0 CF=0
+ ( 0x73, 0x11 ), # AL=0x0d, AF=0 CF=1
+ ( 0x13, 0x10 ), # AL=0x0d, AF=1 CF=0
+ ( 0x73, 0x11 ), # AL=0x0d, AF=1 CF=1
+ ( 0x14, 0x14 ), # AL=0x0e, AF=0 CF=0
+ ( 0x74, 0x15 ), # AL=0x0e, AF=0 CF=1
+ ( 0x14, 0x14 ), # AL=0x0e, AF=1 CF=0
+ ( 0x74, 0x15 ), # AL=0x0e, AF=1 CF=1
+ ( 0x15, 0x10 ), # AL=0x0f, AF=0 CF=0
+ ( 0x75, 0x11 ), # AL=0x0f, AF=0 CF=1
+ ( 0x15, 0x10 ), # AL=0x0f, AF=1 CF=0
+ ( 0x75, 0x11 ), # AL=0x0f, AF=1 CF=1
+ ( 0x10, 0x00 ), # AL=0x10, AF=0 CF=0
+ ( 0x70, 0x01 ), # AL=0x10, AF=0 CF=1
+ ( 0x16, 0x10 ), # AL=0x10, AF=1 CF=0
+ ( 0x76, 0x11 ), # AL=0x10, AF=1 CF=1
+ ( 0x11, 0x04 ), # AL=0x11, AF=0 CF=0
+ ( 0x71, 0x05 ), # AL=0x11, AF=0 CF=1
+ ( 0x17, 0x14 ), # AL=0x11, AF=1 CF=0
+ ( 0x77, 0x15 ), # AL=0x11, AF=1 CF=1
+ ( 0x12, 0x04 ), # AL=0x12, AF=0 CF=0
+ ( 0x72, 0x05 ), # AL=0x12, AF=0 CF=1
+ ( 0x18, 0x14 ), # AL=0x12, AF=1 CF=0
+ ( 0x78, 0x15 ), # AL=0x12, AF=1 CF=1
+ ( 0x13, 0x00 ), # AL=0x13, AF=0 CF=0
+ ( 0x73, 0x01 ), # AL=0x13, AF=0 CF=1
+ ( 0x19, 0x10 ), # AL=0x13, AF=1 CF=0
+ ( 0x79, 0x11 ), # AL=0x13, AF=1 CF=1
+ ( 0x14, 0x04 ), # AL=0x14, AF=0 CF=0
+ ( 0x74, 0x05 ), # AL=0x14, AF=0 CF=1
+ ( 0x1a, 0x10 ), # AL=0x14, AF=1 CF=0
+ ( 0x7a, 0x11 ), # AL=0x14, AF=1 CF=1
+ ( 0x15, 0x00 ), # AL=0x15, AF=0 CF=0
+ ( 0x75, 0x01 ), # AL=0x15, AF=0 CF=1
+ ( 0x1b, 0x14 ), # AL=0x15, AF=1 CF=0
+ ( 0x7b, 0x15 ), # AL=0x15, AF=1 CF=1
+ ( 0x16, 0x00 ), # AL=0x16, AF=0 CF=0
+ ( 0x76, 0x01 ), # AL=0x16, AF=0 CF=1
+ ( 0x1c, 0x10 ), # AL=0x16, AF=1 CF=0
+ ( 0x7c, 0x11 ), # AL=0x16, AF=1 CF=1
+ ( 0x17, 0x04 ), # AL=0x17, AF=0 CF=0
+ ( 0x77, 0x05 ), # AL=0x17, AF=0 CF=1
+ ( 0x1d, 0x14 ), # AL=0x17, AF=1 CF=0
+ ( 0x7d, 0x15 ), # AL=0x17, AF=1 CF=1
+ ( 0x18, 0x04 ), # AL=0x18, AF=0 CF=0
+ ( 0x78, 0x05 ), # AL=0x18, AF=0 CF=1
+ ( 0x1e, 0x14 ), # AL=0x18, AF=1 CF=0
+ ( 0x7e, 0x15 ), # AL=0x18, AF=1 CF=1
+ ( 0x19, 0x00 ), # AL=0x19, AF=0 CF=0
+ ( 0x79, 0x01 ), # AL=0x19, AF=0 CF=1
+ ( 0x1f, 0x10 ), # AL=0x19, AF=1 CF=0
+ ( 0x7f, 0x11 ), # AL=0x19, AF=1 CF=1
+ ( 0x20, 0x10 ), # AL=0x1a, AF=0 CF=0
+ ( 0x80, 0x91 ), # AL=0x1a, AF=0 CF=1
+ ( 0x20, 0x10 ), # AL=0x1a, AF=1 CF=0
+ ( 0x80, 0x91 ), # AL=0x1a, AF=1 CF=1
+ ( 0x21, 0x14 ), # AL=0x1b, AF=0 CF=0
+ ( 0x81, 0x95 ), # AL=0x1b, AF=0 CF=1
+ ( 0x21, 0x14 ), # AL=0x1b, AF=1 CF=0
+ ( 0x81, 0x95 ), # AL=0x1b, AF=1 CF=1
+ ( 0x22, 0x14 ), # AL=0x1c, AF=0 CF=0
+ ( 0x82, 0x95 ), # AL=0x1c, AF=0 CF=1
+ ( 0x22, 0x14 ), # AL=0x1c, AF=1 CF=0
+ ( 0x82, 0x95 ), # AL=0x1c, AF=1 CF=1
+ ( 0x23, 0x10 ), # AL=0x1d, AF=0 CF=0
+ ( 0x83, 0x91 ), # AL=0x1d, AF=0 CF=1
+ ( 0x23, 0x10 ), # AL=0x1d, AF=1 CF=0
+ ( 0x83, 0x91 ), # AL=0x1d, AF=1 CF=1
+ ( 0x24, 0x14 ), # AL=0x1e, AF=0 CF=0
+ ( 0x84, 0x95 ), # AL=0x1e, AF=0 CF=1
+ ( 0x24, 0x14 ), # AL=0x1e, AF=1 CF=0
+ ( 0x84, 0x95 ), # AL=0x1e, AF=1 CF=1
+ ( 0x25, 0x10 ), # AL=0x1f, AF=0 CF=0
+ ( 0x85, 0x91 ), # AL=0x1f, AF=0 CF=1
+ ( 0x25, 0x10 ), # AL=0x1f, AF=1 CF=0
+ ( 0x85, 0x91 ), # AL=0x1f, AF=1 CF=1
+ ( 0x20, 0x00 ), # AL=0x20, AF=0 CF=0
+ ( 0x80, 0x81 ), # AL=0x20, AF=0 CF=1
+ ( 0x26, 0x10 ), # AL=0x20, AF=1 CF=0
+ ( 0x86, 0x91 ), # AL=0x20, AF=1 CF=1
+ ( 0x21, 0x04 ), # AL=0x21, AF=0 CF=0
+ ( 0x81, 0x85 ), # AL=0x21, AF=0 CF=1
+ ( 0x27, 0x14 ), # AL=0x21, AF=1 CF=0
+ ( 0x87, 0x95 ), # AL=0x21, AF=1 CF=1
+ ( 0x22, 0x04 ), # AL=0x22, AF=0 CF=0
+ ( 0x82, 0x85 ), # AL=0x22, AF=0 CF=1
+ ( 0x28, 0x14 ), # AL=0x22, AF=1 CF=0
+ ( 0x88, 0x95 ), # AL=0x22, AF=1 CF=1
+ ( 0x23, 0x00 ), # AL=0x23, AF=0 CF=0
+ ( 0x83, 0x81 ), # AL=0x23, AF=0 CF=1
+ ( 0x29, 0x10 ), # AL=0x23, AF=1 CF=0
+ ( 0x89, 0x91 ), # AL=0x23, AF=1 CF=1
+ ( 0x24, 0x04 ), # AL=0x24, AF=0 CF=0
+ ( 0x84, 0x85 ), # AL=0x24, AF=0 CF=1
+ ( 0x2a, 0x10 ), # AL=0x24, AF=1 CF=0
+ ( 0x8a, 0x91 ), # AL=0x24, AF=1 CF=1
+ ( 0x25, 0x00 ), # AL=0x25, AF=0 CF=0
+ ( 0x85, 0x81 ), # AL=0x25, AF=0 CF=1
+ ( 0x2b, 0x14 ), # AL=0x25, AF=1 CF=0
+ ( 0x8b, 0x95 ), # AL=0x25, AF=1 CF=1
+ ( 0x26, 0x00 ), # AL=0x26, AF=0 CF=0
+ ( 0x86, 0x81 ), # AL=0x26, AF=0 CF=1
+ ( 0x2c, 0x10 ), # AL=0x26, AF=1 CF=0
+ ( 0x8c, 0x91 ), # AL=0x26, AF=1 CF=1
+ ( 0x27, 0x04 ), # AL=0x27, AF=0 CF=0
+ ( 0x87, 0x85 ), # AL=0x27, AF=0 CF=1
+ ( 0x2d, 0x14 ), # AL=0x27, AF=1 CF=0
+ ( 0x8d, 0x95 ), # AL=0x27, AF=1 CF=1
+ ( 0x28, 0x04 ), # AL=0x28, AF=0 CF=0
+ ( 0x88, 0x85 ), # AL=0x28, AF=0 CF=1
+ ( 0x2e, 0x14 ), # AL=0x28, AF=1 CF=0
+ ( 0x8e, 0x95 ), # AL=0x28, AF=1 CF=1
+ ( 0x29, 0x00 ), # AL=0x29, AF=0 CF=0
+ ( 0x89, 0x81 ), # AL=0x29, AF=0 CF=1
+ ( 0x2f, 0x10 ), # AL=0x29, AF=1 CF=0
+ ( 0x8f, 0x91 ), # AL=0x29, AF=1 CF=1
+ ( 0x30, 0x14 ), # AL=0x2a, AF=0 CF=0
+ ( 0x90, 0x95 ), # AL=0x2a, AF=0 CF=1
+ ( 0x30, 0x14 ), # AL=0x2a, AF=1 CF=0
+ ( 0x90, 0x95 ), # AL=0x2a, AF=1 CF=1
+ ( 0x31, 0x10 ), # AL=0x2b, AF=0 CF=0
+ ( 0x91, 0x91 ), # AL=0x2b, AF=0 CF=1
+ ( 0x31, 0x10 ), # AL=0x2b, AF=1 CF=0
+ ( 0x91, 0x91 ), # AL=0x2b, AF=1 CF=1
+ ( 0x32, 0x10 ), # AL=0x2c, AF=0 CF=0
+ ( 0x92, 0x91 ), # AL=0x2c, AF=0 CF=1
+ ( 0x32, 0x10 ), # AL=0x2c, AF=1 CF=0
+ ( 0x92, 0x91 ), # AL=0x2c, AF=1 CF=1
+ ( 0x33, 0x14 ), # AL=0x2d, AF=0 CF=0
+ ( 0x93, 0x95 ), # AL=0x2d, AF=0 CF=1
+ ( 0x33, 0x14 ), # AL=0x2d, AF=1 CF=0
+ ( 0x93, 0x95 ), # AL=0x2d, AF=1 CF=1
+ ( 0x34, 0x10 ), # AL=0x2e, AF=0 CF=0
+ ( 0x94, 0x91 ), # AL=0x2e, AF=0 CF=1
+ ( 0x34, 0x10 ), # AL=0x2e, AF=1 CF=0
+ ( 0x94, 0x91 ), # AL=0x2e, AF=1 CF=1
+ ( 0x35, 0x14 ), # AL=0x2f, AF=0 CF=0
+ ( 0x95, 0x95 ), # AL=0x2f, AF=0 CF=1
+ ( 0x35, 0x14 ), # AL=0x2f, AF=1 CF=0
+ ( 0x95, 0x95 ), # AL=0x2f, AF=1 CF=1
+ ( 0x30, 0x04 ), # AL=0x30, AF=0 CF=0
+ ( 0x90, 0x85 ), # AL=0x30, AF=0 CF=1
+ ( 0x36, 0x14 ), # AL=0x30, AF=1 CF=0
+ ( 0x96, 0x95 ), # AL=0x30, AF=1 CF=1
+ ( 0x31, 0x00 ), # AL=0x31, AF=0 CF=0
+ ( 0x91, 0x81 ), # AL=0x31, AF=0 CF=1
+ ( 0x37, 0x10 ), # AL=0x31, AF=1 CF=0
+ ( 0x97, 0x91 ), # AL=0x31, AF=1 CF=1
+ ( 0x32, 0x00 ), # AL=0x32, AF=0 CF=0
+ ( 0x92, 0x81 ), # AL=0x32, AF=0 CF=1
+ ( 0x38, 0x10 ), # AL=0x32, AF=1 CF=0
+ ( 0x98, 0x91 ), # AL=0x32, AF=1 CF=1
+ ( 0x33, 0x04 ), # AL=0x33, AF=0 CF=0
+ ( 0x93, 0x85 ), # AL=0x33, AF=0 CF=1
+ ( 0x39, 0x14 ), # AL=0x33, AF=1 CF=0
+ ( 0x99, 0x95 ), # AL=0x33, AF=1 CF=1
+ ( 0x34, 0x00 ), # AL=0x34, AF=0 CF=0
+ ( 0x94, 0x81 ), # AL=0x34, AF=0 CF=1
+ ( 0x3a, 0x14 ), # AL=0x34, AF=1 CF=0
+ ( 0x9a, 0x95 ), # AL=0x34, AF=1 CF=1
+ ( 0x35, 0x04 ), # AL=0x35, AF=0 CF=0
+ ( 0x95, 0x85 ), # AL=0x35, AF=0 CF=1
+ ( 0x3b, 0x10 ), # AL=0x35, AF=1 CF=0
+ ( 0x9b, 0x91 ), # AL=0x35, AF=1 CF=1
+ ( 0x36, 0x04 ), # AL=0x36, AF=0 CF=0
+ ( 0x96, 0x85 ), # AL=0x36, AF=0 CF=1
+ ( 0x3c, 0x14 ), # AL=0x36, AF=1 CF=0
+ ( 0x9c, 0x95 ), # AL=0x36, AF=1 CF=1
+ ( 0x37, 0x00 ), # AL=0x37, AF=0 CF=0
+ ( 0x97, 0x81 ), # AL=0x37, AF=0 CF=1
+ ( 0x3d, 0x10 ), # AL=0x37, AF=1 CF=0
+ ( 0x9d, 0x91 ), # AL=0x37, AF=1 CF=1
+ ( 0x38, 0x00 ), # AL=0x38, AF=0 CF=0
+ ( 0x98, 0x81 ), # AL=0x38, AF=0 CF=1
+ ( 0x3e, 0x10 ), # AL=0x38, AF=1 CF=0
+ ( 0x9e, 0x91 ), # AL=0x38, AF=1 CF=1
+ ( 0x39, 0x04 ), # AL=0x39, AF=0 CF=0
+ ( 0x99, 0x85 ), # AL=0x39, AF=0 CF=1
+ ( 0x3f, 0x14 ), # AL=0x39, AF=1 CF=0
+ ( 0x9f, 0x95 ), # AL=0x39, AF=1 CF=1
+ ( 0x40, 0x10 ), # AL=0x3a, AF=0 CF=0
+ ( 0xa0, 0x95 ), # AL=0x3a, AF=0 CF=1
+ ( 0x40, 0x10 ), # AL=0x3a, AF=1 CF=0
+ ( 0xa0, 0x95 ), # AL=0x3a, AF=1 CF=1
+ ( 0x41, 0x14 ), # AL=0x3b, AF=0 CF=0
+ ( 0xa1, 0x91 ), # AL=0x3b, AF=0 CF=1
+ ( 0x41, 0x14 ), # AL=0x3b, AF=1 CF=0
+ ( 0xa1, 0x91 ), # AL=0x3b, AF=1 CF=1
+ ( 0x42, 0x14 ), # AL=0x3c, AF=0 CF=0
+ ( 0xa2, 0x91 ), # AL=0x3c, AF=0 CF=1
+ ( 0x42, 0x14 ), # AL=0x3c, AF=1 CF=0
+ ( 0xa2, 0x91 ), # AL=0x3c, AF=1 CF=1
+ ( 0x43, 0x10 ), # AL=0x3d, AF=0 CF=0
+ ( 0xa3, 0x95 ), # AL=0x3d, AF=0 CF=1
+ ( 0x43, 0x10 ), # AL=0x3d, AF=1 CF=0
+ ( 0xa3, 0x95 ), # AL=0x3d, AF=1 CF=1
+ ( 0x44, 0x14 ), # AL=0x3e, AF=0 CF=0
+ ( 0xa4, 0x91 ), # AL=0x3e, AF=0 CF=1
+ ( 0x44, 0x14 ), # AL=0x3e, AF=1 CF=0
+ ( 0xa4, 0x91 ), # AL=0x3e, AF=1 CF=1
+ ( 0x45, 0x10 ), # AL=0x3f, AF=0 CF=0
+ ( 0xa5, 0x95 ), # AL=0x3f, AF=0 CF=1
+ ( 0x45, 0x10 ), # AL=0x3f, AF=1 CF=0
+ ( 0xa5, 0x95 ), # AL=0x3f, AF=1 CF=1
+ ( 0x40, 0x00 ), # AL=0x40, AF=0 CF=0
+ ( 0xa0, 0x85 ), # AL=0x40, AF=0 CF=1
+ ( 0x46, 0x10 ), # AL=0x40, AF=1 CF=0
+ ( 0xa6, 0x95 ), # AL=0x40, AF=1 CF=1
+ ( 0x41, 0x04 ), # AL=0x41, AF=0 CF=0
+ ( 0xa1, 0x81 ), # AL=0x41, AF=0 CF=1
+ ( 0x47, 0x14 ), # AL=0x41, AF=1 CF=0
+ ( 0xa7, 0x91 ), # AL=0x41, AF=1 CF=1
+ ( 0x42, 0x04 ), # AL=0x42, AF=0 CF=0
+ ( 0xa2, 0x81 ), # AL=0x42, AF=0 CF=1
+ ( 0x48, 0x14 ), # AL=0x42, AF=1 CF=0
+ ( 0xa8, 0x91 ), # AL=0x42, AF=1 CF=1
+ ( 0x43, 0x00 ), # AL=0x43, AF=0 CF=0
+ ( 0xa3, 0x85 ), # AL=0x43, AF=0 CF=1
+ ( 0x49, 0x10 ), # AL=0x43, AF=1 CF=0
+ ( 0xa9, 0x95 ), # AL=0x43, AF=1 CF=1
+ ( 0x44, 0x04 ), # AL=0x44, AF=0 CF=0
+ ( 0xa4, 0x81 ), # AL=0x44, AF=0 CF=1
+ ( 0x4a, 0x10 ), # AL=0x44, AF=1 CF=0
+ ( 0xaa, 0x95 ), # AL=0x44, AF=1 CF=1
+ ( 0x45, 0x00 ), # AL=0x45, AF=0 CF=0
+ ( 0xa5, 0x85 ), # AL=0x45, AF=0 CF=1
+ ( 0x4b, 0x14 ), # AL=0x45, AF=1 CF=0
+ ( 0xab, 0x91 ), # AL=0x45, AF=1 CF=1
+ ( 0x46, 0x00 ), # AL=0x46, AF=0 CF=0
+ ( 0xa6, 0x85 ), # AL=0x46, AF=0 CF=1
+ ( 0x4c, 0x10 ), # AL=0x46, AF=1 CF=0
+ ( 0xac, 0x95 ), # AL=0x46, AF=1 CF=1
+ ( 0x47, 0x04 ), # AL=0x47, AF=0 CF=0
+ ( 0xa7, 0x81 ), # AL=0x47, AF=0 CF=1
+ ( 0x4d, 0x14 ), # AL=0x47, AF=1 CF=0
+ ( 0xad, 0x91 ), # AL=0x47, AF=1 CF=1
+ ( 0x48, 0x04 ), # AL=0x48, AF=0 CF=0
+ ( 0xa8, 0x81 ), # AL=0x48, AF=0 CF=1
+ ( 0x4e, 0x14 ), # AL=0x48, AF=1 CF=0
+ ( 0xae, 0x91 ), # AL=0x48, AF=1 CF=1
+ ( 0x49, 0x00 ), # AL=0x49, AF=0 CF=0
+ ( 0xa9, 0x85 ), # AL=0x49, AF=0 CF=1
+ ( 0x4f, 0x10 ), # AL=0x49, AF=1 CF=0
+ ( 0xaf, 0x95 ), # AL=0x49, AF=1 CF=1
+ ( 0x50, 0x14 ), # AL=0x4a, AF=0 CF=0
+ ( 0xb0, 0x91 ), # AL=0x4a, AF=0 CF=1
+ ( 0x50, 0x14 ), # AL=0x4a, AF=1 CF=0
+ ( 0xb0, 0x91 ), # AL=0x4a, AF=1 CF=1
+ ( 0x51, 0x10 ), # AL=0x4b, AF=0 CF=0
+ ( 0xb1, 0x95 ), # AL=0x4b, AF=0 CF=1
+ ( 0x51, 0x10 ), # AL=0x4b, AF=1 CF=0
+ ( 0xb1, 0x95 ), # AL=0x4b, AF=1 CF=1
+ ( 0x52, 0x10 ), # AL=0x4c, AF=0 CF=0
+ ( 0xb2, 0x95 ), # AL=0x4c, AF=0 CF=1
+ ( 0x52, 0x10 ), # AL=0x4c, AF=1 CF=0
+ ( 0xb2, 0x95 ), # AL=0x4c, AF=1 CF=1
+ ( 0x53, 0x14 ), # AL=0x4d, AF=0 CF=0
+ ( 0xb3, 0x91 ), # AL=0x4d, AF=0 CF=1
+ ( 0x53, 0x14 ), # AL=0x4d, AF=1 CF=0
+ ( 0xb3, 0x91 ), # AL=0x4d, AF=1 CF=1
+ ( 0x54, 0x10 ), # AL=0x4e, AF=0 CF=0
+ ( 0xb4, 0x95 ), # AL=0x4e, AF=0 CF=1
+ ( 0x54, 0x10 ), # AL=0x4e, AF=1 CF=0
+ ( 0xb4, 0x95 ), # AL=0x4e, AF=1 CF=1
+ ( 0x55, 0x14 ), # AL=0x4f, AF=0 CF=0
+ ( 0xb5, 0x91 ), # AL=0x4f, AF=0 CF=1
+ ( 0x55, 0x14 ), # AL=0x4f, AF=1 CF=0
+ ( 0xb5, 0x91 ), # AL=0x4f, AF=1 CF=1
+ ( 0x50, 0x04 ), # AL=0x50, AF=0 CF=0
+ ( 0xb0, 0x81 ), # AL=0x50, AF=0 CF=1
+ ( 0x56, 0x14 ), # AL=0x50, AF=1 CF=0
+ ( 0xb6, 0x91 ), # AL=0x50, AF=1 CF=1
+ ( 0x51, 0x00 ), # AL=0x51, AF=0 CF=0
+ ( 0xb1, 0x85 ), # AL=0x51, AF=0 CF=1
+ ( 0x57, 0x10 ), # AL=0x51, AF=1 CF=0
+ ( 0xb7, 0x95 ), # AL=0x51, AF=1 CF=1
+ ( 0x52, 0x00 ), # AL=0x52, AF=0 CF=0
+ ( 0xb2, 0x85 ), # AL=0x52, AF=0 CF=1
+ ( 0x58, 0x10 ), # AL=0x52, AF=1 CF=0
+ ( 0xb8, 0x95 ), # AL=0x52, AF=1 CF=1
+ ( 0x53, 0x04 ), # AL=0x53, AF=0 CF=0
+ ( 0xb3, 0x81 ), # AL=0x53, AF=0 CF=1
+ ( 0x59, 0x14 ), # AL=0x53, AF=1 CF=0
+ ( 0xb9, 0x91 ), # AL=0x53, AF=1 CF=1
+ ( 0x54, 0x00 ), # AL=0x54, AF=0 CF=0
+ ( 0xb4, 0x85 ), # AL=0x54, AF=0 CF=1
+ ( 0x5a, 0x14 ), # AL=0x54, AF=1 CF=0
+ ( 0xba, 0x91 ), # AL=0x54, AF=1 CF=1
+ ( 0x55, 0x04 ), # AL=0x55, AF=0 CF=0
+ ( 0xb5, 0x81 ), # AL=0x55, AF=0 CF=1
+ ( 0x5b, 0x10 ), # AL=0x55, AF=1 CF=0
+ ( 0xbb, 0x95 ), # AL=0x55, AF=1 CF=1
+ ( 0x56, 0x04 ), # AL=0x56, AF=0 CF=0
+ ( 0xb6, 0x81 ), # AL=0x56, AF=0 CF=1
+ ( 0x5c, 0x14 ), # AL=0x56, AF=1 CF=0
+ ( 0xbc, 0x91 ), # AL=0x56, AF=1 CF=1
+ ( 0x57, 0x00 ), # AL=0x57, AF=0 CF=0
+ ( 0xb7, 0x85 ), # AL=0x57, AF=0 CF=1
+ ( 0x5d, 0x10 ), # AL=0x57, AF=1 CF=0
+ ( 0xbd, 0x95 ), # AL=0x57, AF=1 CF=1
+ ( 0x58, 0x00 ), # AL=0x58, AF=0 CF=0
+ ( 0xb8, 0x85 ), # AL=0x58, AF=0 CF=1
+ ( 0x5e, 0x10 ), # AL=0x58, AF=1 CF=0
+ ( 0xbe, 0x95 ), # AL=0x58, AF=1 CF=1
+ ( 0x59, 0x04 ), # AL=0x59, AF=0 CF=0
+ ( 0xb9, 0x81 ), # AL=0x59, AF=0 CF=1
+ ( 0x5f, 0x14 ), # AL=0x59, AF=1 CF=0
+ ( 0xbf, 0x91 ), # AL=0x59, AF=1 CF=1
+ ( 0x60, 0x14 ), # AL=0x5a, AF=0 CF=0
+ ( 0xc0, 0x95 ), # AL=0x5a, AF=0 CF=1
+ ( 0x60, 0x14 ), # AL=0x5a, AF=1 CF=0
+ ( 0xc0, 0x95 ), # AL=0x5a, AF=1 CF=1
+ ( 0x61, 0x10 ), # AL=0x5b, AF=0 CF=0
+ ( 0xc1, 0x91 ), # AL=0x5b, AF=0 CF=1
+ ( 0x61, 0x10 ), # AL=0x5b, AF=1 CF=0
+ ( 0xc1, 0x91 ), # AL=0x5b, AF=1 CF=1
+ ( 0x62, 0x10 ), # AL=0x5c, AF=0 CF=0
+ ( 0xc2, 0x91 ), # AL=0x5c, AF=0 CF=1
+ ( 0x62, 0x10 ), # AL=0x5c, AF=1 CF=0
+ ( 0xc2, 0x91 ), # AL=0x5c, AF=1 CF=1
+ ( 0x63, 0x14 ), # AL=0x5d, AF=0 CF=0
+ ( 0xc3, 0x95 ), # AL=0x5d, AF=0 CF=1
+ ( 0x63, 0x14 ), # AL=0x5d, AF=1 CF=0
+ ( 0xc3, 0x95 ), # AL=0x5d, AF=1 CF=1
+ ( 0x64, 0x10 ), # AL=0x5e, AF=0 CF=0
+ ( 0xc4, 0x91 ), # AL=0x5e, AF=0 CF=1
+ ( 0x64, 0x10 ), # AL=0x5e, AF=1 CF=0
+ ( 0xc4, 0x91 ), # AL=0x5e, AF=1 CF=1
+ ( 0x65, 0x14 ), # AL=0x5f, AF=0 CF=0
+ ( 0xc5, 0x95 ), # AL=0x5f, AF=0 CF=1
+ ( 0x65, 0x14 ), # AL=0x5f, AF=1 CF=0
+ ( 0xc5, 0x95 ), # AL=0x5f, AF=1 CF=1
+ ( 0x60, 0x04 ), # AL=0x60, AF=0 CF=0
+ ( 0xc0, 0x85 ), # AL=0x60, AF=0 CF=1
+ ( 0x66, 0x14 ), # AL=0x60, AF=1 CF=0
+ ( 0xc6, 0x95 ), # AL=0x60, AF=1 CF=1
+ ( 0x61, 0x00 ), # AL=0x61, AF=0 CF=0
+ ( 0xc1, 0x81 ), # AL=0x61, AF=0 CF=1
+ ( 0x67, 0x10 ), # AL=0x61, AF=1 CF=0
+ ( 0xc7, 0x91 ), # AL=0x61, AF=1 CF=1
+ ( 0x62, 0x00 ), # AL=0x62, AF=0 CF=0
+ ( 0xc2, 0x81 ), # AL=0x62, AF=0 CF=1
+ ( 0x68, 0x10 ), # AL=0x62, AF=1 CF=0
+ ( 0xc8, 0x91 ), # AL=0x62, AF=1 CF=1
+ ( 0x63, 0x04 ), # AL=0x63, AF=0 CF=0
+ ( 0xc3, 0x85 ), # AL=0x63, AF=0 CF=1
+ ( 0x69, 0x14 ), # AL=0x63, AF=1 CF=0
+ ( 0xc9, 0x95 ), # AL=0x63, AF=1 CF=1
+ ( 0x64, 0x00 ), # AL=0x64, AF=0 CF=0
+ ( 0xc4, 0x81 ), # AL=0x64, AF=0 CF=1
+ ( 0x6a, 0x14 ), # AL=0x64, AF=1 CF=0
+ ( 0xca, 0x95 ), # AL=0x64, AF=1 CF=1
+ ( 0x65, 0x04 ), # AL=0x65, AF=0 CF=0
+ ( 0xc5, 0x85 ), # AL=0x65, AF=0 CF=1
+ ( 0x6b, 0x10 ), # AL=0x65, AF=1 CF=0
+ ( 0xcb, 0x91 ), # AL=0x65, AF=1 CF=1
+ ( 0x66, 0x04 ), # AL=0x66, AF=0 CF=0
+ ( 0xc6, 0x85 ), # AL=0x66, AF=0 CF=1
+ ( 0x6c, 0x14 ), # AL=0x66, AF=1 CF=0
+ ( 0xcc, 0x95 ), # AL=0x66, AF=1 CF=1
+ ( 0x67, 0x00 ), # AL=0x67, AF=0 CF=0
+ ( 0xc7, 0x81 ), # AL=0x67, AF=0 CF=1
+ ( 0x6d, 0x10 ), # AL=0x67, AF=1 CF=0
+ ( 0xcd, 0x91 ), # AL=0x67, AF=1 CF=1
+ ( 0x68, 0x00 ), # AL=0x68, AF=0 CF=0
+ ( 0xc8, 0x81 ), # AL=0x68, AF=0 CF=1
+ ( 0x6e, 0x10 ), # AL=0x68, AF=1 CF=0
+ ( 0xce, 0x91 ), # AL=0x68, AF=1 CF=1
+ ( 0x69, 0x04 ), # AL=0x69, AF=0 CF=0
+ ( 0xc9, 0x85 ), # AL=0x69, AF=0 CF=1
+ ( 0x6f, 0x14 ), # AL=0x69, AF=1 CF=0
+ ( 0xcf, 0x95 ), # AL=0x69, AF=1 CF=1
+ ( 0x70, 0x10 ), # AL=0x6a, AF=0 CF=0
+ ( 0xd0, 0x91 ), # AL=0x6a, AF=0 CF=1
+ ( 0x70, 0x10 ), # AL=0x6a, AF=1 CF=0
+ ( 0xd0, 0x91 ), # AL=0x6a, AF=1 CF=1
+ ( 0x71, 0x14 ), # AL=0x6b, AF=0 CF=0
+ ( 0xd1, 0x95 ), # AL=0x6b, AF=0 CF=1
+ ( 0x71, 0x14 ), # AL=0x6b, AF=1 CF=0
+ ( 0xd1, 0x95 ), # AL=0x6b, AF=1 CF=1
+ ( 0x72, 0x14 ), # AL=0x6c, AF=0 CF=0
+ ( 0xd2, 0x95 ), # AL=0x6c, AF=0 CF=1
+ ( 0x72, 0x14 ), # AL=0x6c, AF=1 CF=0
+ ( 0xd2, 0x95 ), # AL=0x6c, AF=1 CF=1
+ ( 0x73, 0x10 ), # AL=0x6d, AF=0 CF=0
+ ( 0xd3, 0x91 ), # AL=0x6d, AF=0 CF=1
+ ( 0x73, 0x10 ), # AL=0x6d, AF=1 CF=0
+ ( 0xd3, 0x91 ), # AL=0x6d, AF=1 CF=1
+ ( 0x74, 0x14 ), # AL=0x6e, AF=0 CF=0
+ ( 0xd4, 0x95 ), # AL=0x6e, AF=0 CF=1
+ ( 0x74, 0x14 ), # AL=0x6e, AF=1 CF=0
+ ( 0xd4, 0x95 ), # AL=0x6e, AF=1 CF=1
+ ( 0x75, 0x10 ), # AL=0x6f, AF=0 CF=0
+ ( 0xd5, 0x91 ), # AL=0x6f, AF=0 CF=1
+ ( 0x75, 0x10 ), # AL=0x6f, AF=1 CF=0
+ ( 0xd5, 0x91 ), # AL=0x6f, AF=1 CF=1
+ ( 0x70, 0x00 ), # AL=0x70, AF=0 CF=0
+ ( 0xd0, 0x81 ), # AL=0x70, AF=0 CF=1
+ ( 0x76, 0x10 ), # AL=0x70, AF=1 CF=0
+ ( 0xd6, 0x91 ), # AL=0x70, AF=1 CF=1
+ ( 0x71, 0x04 ), # AL=0x71, AF=0 CF=0
+ ( 0xd1, 0x85 ), # AL=0x71, AF=0 CF=1
+ ( 0x77, 0x14 ), # AL=0x71, AF=1 CF=0
+ ( 0xd7, 0x95 ), # AL=0x71, AF=1 CF=1
+ ( 0x72, 0x04 ), # AL=0x72, AF=0 CF=0
+ ( 0xd2, 0x85 ), # AL=0x72, AF=0 CF=1
+ ( 0x78, 0x14 ), # AL=0x72, AF=1 CF=0
+ ( 0xd8, 0x95 ), # AL=0x72, AF=1 CF=1
+ ( 0x73, 0x00 ), # AL=0x73, AF=0 CF=0
+ ( 0xd3, 0x81 ), # AL=0x73, AF=0 CF=1
+ ( 0x79, 0x10 ), # AL=0x73, AF=1 CF=0
+ ( 0xd9, 0x91 ), # AL=0x73, AF=1 CF=1
+ ( 0x74, 0x04 ), # AL=0x74, AF=0 CF=0
+ ( 0xd4, 0x85 ), # AL=0x74, AF=0 CF=1
+ ( 0x7a, 0x10 ), # AL=0x74, AF=1 CF=0
+ ( 0xda, 0x91 ), # AL=0x74, AF=1 CF=1
+ ( 0x75, 0x00 ), # AL=0x75, AF=0 CF=0
+ ( 0xd5, 0x81 ), # AL=0x75, AF=0 CF=1
+ ( 0x7b, 0x14 ), # AL=0x75, AF=1 CF=0
+ ( 0xdb, 0x95 ), # AL=0x75, AF=1 CF=1
+ ( 0x76, 0x00 ), # AL=0x76, AF=0 CF=0
+ ( 0xd6, 0x81 ), # AL=0x76, AF=0 CF=1
+ ( 0x7c, 0x10 ), # AL=0x76, AF=1 CF=0
+ ( 0xdc, 0x91 ), # AL=0x76, AF=1 CF=1
+ ( 0x77, 0x04 ), # AL=0x77, AF=0 CF=0
+ ( 0xd7, 0x85 ), # AL=0x77, AF=0 CF=1
+ ( 0x7d, 0x14 ), # AL=0x77, AF=1 CF=0
+ ( 0xdd, 0x95 ), # AL=0x77, AF=1 CF=1
+ ( 0x78, 0x04 ), # AL=0x78, AF=0 CF=0
+ ( 0xd8, 0x85 ), # AL=0x78, AF=0 CF=1
+ ( 0x7e, 0x14 ), # AL=0x78, AF=1 CF=0
+ ( 0xde, 0x95 ), # AL=0x78, AF=1 CF=1
+ ( 0x79, 0x00 ), # AL=0x79, AF=0 CF=0
+ ( 0xd9, 0x81 ), # AL=0x79, AF=0 CF=1
+ ( 0x7f, 0x10 ), # AL=0x79, AF=1 CF=0
+ ( 0xdf, 0x91 ), # AL=0x79, AF=1 CF=1
+ ( 0x80, 0x90 ), # AL=0x7a, AF=0 CF=0
+ ( 0xe0, 0x91 ), # AL=0x7a, AF=0 CF=1
+ ( 0x80, 0x90 ), # AL=0x7a, AF=1 CF=0
+ ( 0xe0, 0x91 ), # AL=0x7a, AF=1 CF=1
+ ( 0x81, 0x94 ), # AL=0x7b, AF=0 CF=0
+ ( 0xe1, 0x95 ), # AL=0x7b, AF=0 CF=1
+ ( 0x81, 0x94 ), # AL=0x7b, AF=1 CF=0
+ ( 0xe1, 0x95 ), # AL=0x7b, AF=1 CF=1
+ ( 0x82, 0x94 ), # AL=0x7c, AF=0 CF=0
+ ( 0xe2, 0x95 ), # AL=0x7c, AF=0 CF=1
+ ( 0x82, 0x94 ), # AL=0x7c, AF=1 CF=0
+ ( 0xe2, 0x95 ), # AL=0x7c, AF=1 CF=1
+ ( 0x83, 0x90 ), # AL=0x7d, AF=0 CF=0
+ ( 0xe3, 0x91 ), # AL=0x7d, AF=0 CF=1
+ ( 0x83, 0x90 ), # AL=0x7d, AF=1 CF=0
+ ( 0xe3, 0x91 ), # AL=0x7d, AF=1 CF=1
+ ( 0x84, 0x94 ), # AL=0x7e, AF=0 CF=0
+ ( 0xe4, 0x95 ), # AL=0x7e, AF=0 CF=1
+ ( 0x84, 0x94 ), # AL=0x7e, AF=1 CF=0
+ ( 0xe4, 0x95 ), # AL=0x7e, AF=1 CF=1
+ ( 0x85, 0x90 ), # AL=0x7f, AF=0 CF=0
+ ( 0xe5, 0x91 ), # AL=0x7f, AF=0 CF=1
+ ( 0x85, 0x90 ), # AL=0x7f, AF=1 CF=0
+ ( 0xe5, 0x91 ), # AL=0x7f, AF=1 CF=1
+ ( 0x80, 0x80 ), # AL=0x80, AF=0 CF=0
+ ( 0xe0, 0x81 ), # AL=0x80, AF=0 CF=1
+ ( 0x86, 0x90 ), # AL=0x80, AF=1 CF=0
+ ( 0xe6, 0x91 ), # AL=0x80, AF=1 CF=1
+ ( 0x81, 0x84 ), # AL=0x81, AF=0 CF=0
+ ( 0xe1, 0x85 ), # AL=0x81, AF=0 CF=1
+ ( 0x87, 0x94 ), # AL=0x81, AF=1 CF=0
+ ( 0xe7, 0x95 ), # AL=0x81, AF=1 CF=1
+ ( 0x82, 0x84 ), # AL=0x82, AF=0 CF=0
+ ( 0xe2, 0x85 ), # AL=0x82, AF=0 CF=1
+ ( 0x88, 0x94 ), # AL=0x82, AF=1 CF=0
+ ( 0xe8, 0x95 ), # AL=0x82, AF=1 CF=1
+ ( 0x83, 0x80 ), # AL=0x83, AF=0 CF=0
+ ( 0xe3, 0x81 ), # AL=0x83, AF=0 CF=1
+ ( 0x89, 0x90 ), # AL=0x83, AF=1 CF=0
+ ( 0xe9, 0x91 ), # AL=0x83, AF=1 CF=1
+ ( 0x84, 0x84 ), # AL=0x84, AF=0 CF=0
+ ( 0xe4, 0x85 ), # AL=0x84, AF=0 CF=1
+ ( 0x8a, 0x90 ), # AL=0x84, AF=1 CF=0
+ ( 0xea, 0x91 ), # AL=0x84, AF=1 CF=1
+ ( 0x85, 0x80 ), # AL=0x85, AF=0 CF=0
+ ( 0xe5, 0x81 ), # AL=0x85, AF=0 CF=1
+ ( 0x8b, 0x94 ), # AL=0x85, AF=1 CF=0
+ ( 0xeb, 0x95 ), # AL=0x85, AF=1 CF=1
+ ( 0x86, 0x80 ), # AL=0x86, AF=0 CF=0
+ ( 0xe6, 0x81 ), # AL=0x86, AF=0 CF=1
+ ( 0x8c, 0x90 ), # AL=0x86, AF=1 CF=0
+ ( 0xec, 0x91 ), # AL=0x86, AF=1 CF=1
+ ( 0x87, 0x84 ), # AL=0x87, AF=0 CF=0
+ ( 0xe7, 0x85 ), # AL=0x87, AF=0 CF=1
+ ( 0x8d, 0x94 ), # AL=0x87, AF=1 CF=0
+ ( 0xed, 0x95 ), # AL=0x87, AF=1 CF=1
+ ( 0x88, 0x84 ), # AL=0x88, AF=0 CF=0
+ ( 0xe8, 0x85 ), # AL=0x88, AF=0 CF=1
+ ( 0x8e, 0x94 ), # AL=0x88, AF=1 CF=0
+ ( 0xee, 0x95 ), # AL=0x88, AF=1 CF=1
+ ( 0x89, 0x80 ), # AL=0x89, AF=0 CF=0
+ ( 0xe9, 0x81 ), # AL=0x89, AF=0 CF=1
+ ( 0x8f, 0x90 ), # AL=0x89, AF=1 CF=0
+ ( 0xef, 0x91 ), # AL=0x89, AF=1 CF=1
+ ( 0x90, 0x94 ), # AL=0x8a, AF=0 CF=0
+ ( 0xf0, 0x95 ), # AL=0x8a, AF=0 CF=1
+ ( 0x90, 0x94 ), # AL=0x8a, AF=1 CF=0
+ ( 0xf0, 0x95 ), # AL=0x8a, AF=1 CF=1
+ ( 0x91, 0x90 ), # AL=0x8b, AF=0 CF=0
+ ( 0xf1, 0x91 ), # AL=0x8b, AF=0 CF=1
+ ( 0x91, 0x90 ), # AL=0x8b, AF=1 CF=0
+ ( 0xf1, 0x91 ), # AL=0x8b, AF=1 CF=1
+ ( 0x92, 0x90 ), # AL=0x8c, AF=0 CF=0
+ ( 0xf2, 0x91 ), # AL=0x8c, AF=0 CF=1
+ ( 0x92, 0x90 ), # AL=0x8c, AF=1 CF=0
+ ( 0xf2, 0x91 ), # AL=0x8c, AF=1 CF=1
+ ( 0x93, 0x94 ), # AL=0x8d, AF=0 CF=0
+ ( 0xf3, 0x95 ), # AL=0x8d, AF=0 CF=1
+ ( 0x93, 0x94 ), # AL=0x8d, AF=1 CF=0
+ ( 0xf3, 0x95 ), # AL=0x8d, AF=1 CF=1
+ ( 0x94, 0x90 ), # AL=0x8e, AF=0 CF=0
+ ( 0xf4, 0x91 ), # AL=0x8e, AF=0 CF=1
+ ( 0x94, 0x90 ), # AL=0x8e, AF=1 CF=0
+ ( 0xf4, 0x91 ), # AL=0x8e, AF=1 CF=1
+ ( 0x95, 0x94 ), # AL=0x8f, AF=0 CF=0
+ ( 0xf5, 0x95 ), # AL=0x8f, AF=0 CF=1
+ ( 0x95, 0x94 ), # AL=0x8f, AF=1 CF=0
+ ( 0xf5, 0x95 ), # AL=0x8f, AF=1 CF=1
+ ( 0x90, 0x84 ), # AL=0x90, AF=0 CF=0
+ ( 0xf0, 0x85 ), # AL=0x90, AF=0 CF=1
+ ( 0x96, 0x94 ), # AL=0x90, AF=1 CF=0
+ ( 0xf6, 0x95 ), # AL=0x90, AF=1 CF=1
+ ( 0x91, 0x80 ), # AL=0x91, AF=0 CF=0
+ ( 0xf1, 0x81 ), # AL=0x91, AF=0 CF=1
+ ( 0x97, 0x90 ), # AL=0x91, AF=1 CF=0
+ ( 0xf7, 0x91 ), # AL=0x91, AF=1 CF=1
+ ( 0x92, 0x80 ), # AL=0x92, AF=0 CF=0
+ ( 0xf2, 0x81 ), # AL=0x92, AF=0 CF=1
+ ( 0x98, 0x90 ), # AL=0x92, AF=1 CF=0
+ ( 0xf8, 0x91 ), # AL=0x92, AF=1 CF=1
+ ( 0x93, 0x84 ), # AL=0x93, AF=0 CF=0
+ ( 0xf3, 0x85 ), # AL=0x93, AF=0 CF=1
+ ( 0x99, 0x94 ), # AL=0x93, AF=1 CF=0
+ ( 0xf9, 0x95 ), # AL=0x93, AF=1 CF=1
+ ( 0x94, 0x80 ), # AL=0x94, AF=0 CF=0
+ ( 0xf4, 0x81 ), # AL=0x94, AF=0 CF=1
+ ( 0x9a, 0x94 ), # AL=0x94, AF=1 CF=0
+ ( 0xfa, 0x95 ), # AL=0x94, AF=1 CF=1
+ ( 0x95, 0x84 ), # AL=0x95, AF=0 CF=0
+ ( 0xf5, 0x85 ), # AL=0x95, AF=0 CF=1
+ ( 0x9b, 0x90 ), # AL=0x95, AF=1 CF=0
+ ( 0xfb, 0x91 ), # AL=0x95, AF=1 CF=1
+ ( 0x96, 0x84 ), # AL=0x96, AF=0 CF=0
+ ( 0xf6, 0x85 ), # AL=0x96, AF=0 CF=1
+ ( 0x9c, 0x94 ), # AL=0x96, AF=1 CF=0
+ ( 0xfc, 0x95 ), # AL=0x96, AF=1 CF=1
+ ( 0x97, 0x80 ), # AL=0x97, AF=0 CF=0
+ ( 0xf7, 0x81 ), # AL=0x97, AF=0 CF=1
+ ( 0x9d, 0x90 ), # AL=0x97, AF=1 CF=0
+ ( 0xfd, 0x91 ), # AL=0x97, AF=1 CF=1
+ ( 0x98, 0x80 ), # AL=0x98, AF=0 CF=0
+ ( 0xf8, 0x81 ), # AL=0x98, AF=0 CF=1
+ ( 0x9e, 0x90 ), # AL=0x98, AF=1 CF=0
+ ( 0xfe, 0x91 ), # AL=0x98, AF=1 CF=1
+ ( 0x99, 0x84 ), # AL=0x99, AF=0 CF=0
+ ( 0xf9, 0x85 ), # AL=0x99, AF=0 CF=1
+ ( 0x9f, 0x94 ), # AL=0x99, AF=1 CF=0
+ ( 0xff, 0x95 ), # AL=0x99, AF=1 CF=1
+ ( 0x00, 0x55 ), # AL=0x9a, AF=0 CF=0
+ ( 0x00, 0x55 ), # AL=0x9a, AF=0 CF=1
+ ( 0x00, 0x55 ), # AL=0x9a, AF=1 CF=0
+ ( 0x00, 0x55 ), # AL=0x9a, AF=1 CF=1
+ ( 0x01, 0x11 ), # AL=0x9b, AF=0 CF=0
+ ( 0x01, 0x11 ), # AL=0x9b, AF=0 CF=1
+ ( 0x01, 0x11 ), # AL=0x9b, AF=1 CF=0
+ ( 0x01, 0x11 ), # AL=0x9b, AF=1 CF=1
+ ( 0x02, 0x11 ), # AL=0x9c, AF=0 CF=0
+ ( 0x02, 0x11 ), # AL=0x9c, AF=0 CF=1
+ ( 0x02, 0x11 ), # AL=0x9c, AF=1 CF=0
+ ( 0x02, 0x11 ), # AL=0x9c, AF=1 CF=1
+ ( 0x03, 0x15 ), # AL=0x9d, AF=0 CF=0
+ ( 0x03, 0x15 ), # AL=0x9d, AF=0 CF=1
+ ( 0x03, 0x15 ), # AL=0x9d, AF=1 CF=0
+ ( 0x03, 0x15 ), # AL=0x9d, AF=1 CF=1
+ ( 0x04, 0x11 ), # AL=0x9e, AF=0 CF=0
+ ( 0x04, 0x11 ), # AL=0x9e, AF=0 CF=1
+ ( 0x04, 0x11 ), # AL=0x9e, AF=1 CF=0
+ ( 0x04, 0x11 ), # AL=0x9e, AF=1 CF=1
+ ( 0x05, 0x15 ), # AL=0x9f, AF=0 CF=0
+ ( 0x05, 0x15 ), # AL=0x9f, AF=0 CF=1
+ ( 0x05, 0x15 ), # AL=0x9f, AF=1 CF=0
+ ( 0x05, 0x15 ), # AL=0x9f, AF=1 CF=1
+ ( 0x00, 0x45 ), # AL=0xa0, AF=0 CF=0
+ ( 0x00, 0x45 ), # AL=0xa0, AF=0 CF=1
+ ( 0x06, 0x15 ), # AL=0xa0, AF=1 CF=0
+ ( 0x06, 0x15 ), # AL=0xa0, AF=1 CF=1
+ ( 0x01, 0x01 ), # AL=0xa1, AF=0 CF=0
+ ( 0x01, 0x01 ), # AL=0xa1, AF=0 CF=1
+ ( 0x07, 0x11 ), # AL=0xa1, AF=1 CF=0
+ ( 0x07, 0x11 ), # AL=0xa1, AF=1 CF=1
+ ( 0x02, 0x01 ), # AL=0xa2, AF=0 CF=0
+ ( 0x02, 0x01 ), # AL=0xa2, AF=0 CF=1
+ ( 0x08, 0x11 ), # AL=0xa2, AF=1 CF=0
+ ( 0x08, 0x11 ), # AL=0xa2, AF=1 CF=1
+ ( 0x03, 0x05 ), # AL=0xa3, AF=0 CF=0
+ ( 0x03, 0x05 ), # AL=0xa3, AF=0 CF=1
+ ( 0x09, 0x15 ), # AL=0xa3, AF=1 CF=0
+ ( 0x09, 0x15 ), # AL=0xa3, AF=1 CF=1
+ ( 0x04, 0x01 ), # AL=0xa4, AF=0 CF=0
+ ( 0x04, 0x01 ), # AL=0xa4, AF=0 CF=1
+ ( 0x0a, 0x15 ), # AL=0xa4, AF=1 CF=0
+ ( 0x0a, 0x15 ), # AL=0xa4, AF=1 CF=1
+ ( 0x05, 0x05 ), # AL=0xa5, AF=0 CF=0
+ ( 0x05, 0x05 ), # AL=0xa5, AF=0 CF=1
+ ( 0x0b, 0x11 ), # AL=0xa5, AF=1 CF=0
+ ( 0x0b, 0x11 ), # AL=0xa5, AF=1 CF=1
+ ( 0x06, 0x05 ), # AL=0xa6, AF=0 CF=0
+ ( 0x06, 0x05 ), # AL=0xa6, AF=0 CF=1
+ ( 0x0c, 0x15 ), # AL=0xa6, AF=1 CF=0
+ ( 0x0c, 0x15 ), # AL=0xa6, AF=1 CF=1
+ ( 0x07, 0x01 ), # AL=0xa7, AF=0 CF=0
+ ( 0x07, 0x01 ), # AL=0xa7, AF=0 CF=1
+ ( 0x0d, 0x11 ), # AL=0xa7, AF=1 CF=0
+ ( 0x0d, 0x11 ), # AL=0xa7, AF=1 CF=1
+ ( 0x08, 0x01 ), # AL=0xa8, AF=0 CF=0
+ ( 0x08, 0x01 ), # AL=0xa8, AF=0 CF=1
+ ( 0x0e, 0x11 ), # AL=0xa8, AF=1 CF=0
+ ( 0x0e, 0x11 ), # AL=0xa8, AF=1 CF=1
+ ( 0x09, 0x05 ), # AL=0xa9, AF=0 CF=0
+ ( 0x09, 0x05 ), # AL=0xa9, AF=0 CF=1
+ ( 0x0f, 0x15 ), # AL=0xa9, AF=1 CF=0
+ ( 0x0f, 0x15 ), # AL=0xa9, AF=1 CF=1
+ ( 0x10, 0x11 ), # AL=0xaa, AF=0 CF=0
+ ( 0x10, 0x11 ), # AL=0xaa, AF=0 CF=1
+ ( 0x10, 0x11 ), # AL=0xaa, AF=1 CF=0
+ ( 0x10, 0x11 ), # AL=0xaa, AF=1 CF=1
+ ( 0x11, 0x15 ), # AL=0xab, AF=0 CF=0
+ ( 0x11, 0x15 ), # AL=0xab, AF=0 CF=1
+ ( 0x11, 0x15 ), # AL=0xab, AF=1 CF=0
+ ( 0x11, 0x15 ), # AL=0xab, AF=1 CF=1
+ ( 0x12, 0x15 ), # AL=0xac, AF=0 CF=0
+ ( 0x12, 0x15 ), # AL=0xac, AF=0 CF=1
+ ( 0x12, 0x15 ), # AL=0xac, AF=1 CF=0
+ ( 0x12, 0x15 ), # AL=0xac, AF=1 CF=1
+ ( 0x13, 0x11 ), # AL=0xad, AF=0 CF=0
+ ( 0x13, 0x11 ), # AL=0xad, AF=0 CF=1
+ ( 0x13, 0x11 ), # AL=0xad, AF=1 CF=0
+ ( 0x13, 0x11 ), # AL=0xad, AF=1 CF=1
+ ( 0x14, 0x15 ), # AL=0xae, AF=0 CF=0
+ ( 0x14, 0x15 ), # AL=0xae, AF=0 CF=1
+ ( 0x14, 0x15 ), # AL=0xae, AF=1 CF=0
+ ( 0x14, 0x15 ), # AL=0xae, AF=1 CF=1
+ ( 0x15, 0x11 ), # AL=0xaf, AF=0 CF=0
+ ( 0x15, 0x11 ), # AL=0xaf, AF=0 CF=1
+ ( 0x15, 0x11 ), # AL=0xaf, AF=1 CF=0
+ ( 0x15, 0x11 ), # AL=0xaf, AF=1 CF=1
+ ( 0x10, 0x01 ), # AL=0xb0, AF=0 CF=0
+ ( 0x10, 0x01 ), # AL=0xb0, AF=0 CF=1
+ ( 0x16, 0x11 ), # AL=0xb0, AF=1 CF=0
+ ( 0x16, 0x11 ), # AL=0xb0, AF=1 CF=1
+ ( 0x11, 0x05 ), # AL=0xb1, AF=0 CF=0
+ ( 0x11, 0x05 ), # AL=0xb1, AF=0 CF=1
+ ( 0x17, 0x15 ), # AL=0xb1, AF=1 CF=0
+ ( 0x17, 0x15 ), # AL=0xb1, AF=1 CF=1
+ ( 0x12, 0x05 ), # AL=0xb2, AF=0 CF=0
+ ( 0x12, 0x05 ), # AL=0xb2, AF=0 CF=1
+ ( 0x18, 0x15 ), # AL=0xb2, AF=1 CF=0
+ ( 0x18, 0x15 ), # AL=0xb2, AF=1 CF=1
+ ( 0x13, 0x01 ), # AL=0xb3, AF=0 CF=0
+ ( 0x13, 0x01 ), # AL=0xb3, AF=0 CF=1
+ ( 0x19, 0x11 ), # AL=0xb3, AF=1 CF=0
+ ( 0x19, 0x11 ), # AL=0xb3, AF=1 CF=1
+ ( 0x14, 0x05 ), # AL=0xb4, AF=0 CF=0
+ ( 0x14, 0x05 ), # AL=0xb4, AF=0 CF=1
+ ( 0x1a, 0x11 ), # AL=0xb4, AF=1 CF=0
+ ( 0x1a, 0x11 ), # AL=0xb4, AF=1 CF=1
+ ( 0x15, 0x01 ), # AL=0xb5, AF=0 CF=0
+ ( 0x15, 0x01 ), # AL=0xb5, AF=0 CF=1
+ ( 0x1b, 0x15 ), # AL=0xb5, AF=1 CF=0
+ ( 0x1b, 0x15 ), # AL=0xb5, AF=1 CF=1
+ ( 0x16, 0x01 ), # AL=0xb6, AF=0 CF=0
+ ( 0x16, 0x01 ), # AL=0xb6, AF=0 CF=1
+ ( 0x1c, 0x11 ), # AL=0xb6, AF=1 CF=0
+ ( 0x1c, 0x11 ), # AL=0xb6, AF=1 CF=1
+ ( 0x17, 0x05 ), # AL=0xb7, AF=0 CF=0
+ ( 0x17, 0x05 ), # AL=0xb7, AF=0 CF=1
+ ( 0x1d, 0x15 ), # AL=0xb7, AF=1 CF=0
+ ( 0x1d, 0x15 ), # AL=0xb7, AF=1 CF=1
+ ( 0x18, 0x05 ), # AL=0xb8, AF=0 CF=0
+ ( 0x18, 0x05 ), # AL=0xb8, AF=0 CF=1
+ ( 0x1e, 0x15 ), # AL=0xb8, AF=1 CF=0
+ ( 0x1e, 0x15 ), # AL=0xb8, AF=1 CF=1
+ ( 0x19, 0x01 ), # AL=0xb9, AF=0 CF=0
+ ( 0x19, 0x01 ), # AL=0xb9, AF=0 CF=1
+ ( 0x1f, 0x11 ), # AL=0xb9, AF=1 CF=0
+ ( 0x1f, 0x11 ), # AL=0xb9, AF=1 CF=1
+ ( 0x20, 0x11 ), # AL=0xba, AF=0 CF=0
+ ( 0x20, 0x11 ), # AL=0xba, AF=0 CF=1
+ ( 0x20, 0x11 ), # AL=0xba, AF=1 CF=0
+ ( 0x20, 0x11 ), # AL=0xba, AF=1 CF=1
+ ( 0x21, 0x15 ), # AL=0xbb, AF=0 CF=0
+ ( 0x21, 0x15 ), # AL=0xbb, AF=0 CF=1
+ ( 0x21, 0x15 ), # AL=0xbb, AF=1 CF=0
+ ( 0x21, 0x15 ), # AL=0xbb, AF=1 CF=1
+ ( 0x22, 0x15 ), # AL=0xbc, AF=0 CF=0
+ ( 0x22, 0x15 ), # AL=0xbc, AF=0 CF=1
+ ( 0x22, 0x15 ), # AL=0xbc, AF=1 CF=0
+ ( 0x22, 0x15 ), # AL=0xbc, AF=1 CF=1
+ ( 0x23, 0x11 ), # AL=0xbd, AF=0 CF=0
+ ( 0x23, 0x11 ), # AL=0xbd, AF=0 CF=1
+ ( 0x23, 0x11 ), # AL=0xbd, AF=1 CF=0
+ ( 0x23, 0x11 ), # AL=0xbd, AF=1 CF=1
+ ( 0x24, 0x15 ), # AL=0xbe, AF=0 CF=0
+ ( 0x24, 0x15 ), # AL=0xbe, AF=0 CF=1
+ ( 0x24, 0x15 ), # AL=0xbe, AF=1 CF=0
+ ( 0x24, 0x15 ), # AL=0xbe, AF=1 CF=1
+ ( 0x25, 0x11 ), # AL=0xbf, AF=0 CF=0
+ ( 0x25, 0x11 ), # AL=0xbf, AF=0 CF=1
+ ( 0x25, 0x11 ), # AL=0xbf, AF=1 CF=0
+ ( 0x25, 0x11 ), # AL=0xbf, AF=1 CF=1
+ ( 0x20, 0x01 ), # AL=0xc0, AF=0 CF=0
+ ( 0x20, 0x01 ), # AL=0xc0, AF=0 CF=1
+ ( 0x26, 0x11 ), # AL=0xc0, AF=1 CF=0
+ ( 0x26, 0x11 ), # AL=0xc0, AF=1 CF=1
+ ( 0x21, 0x05 ), # AL=0xc1, AF=0 CF=0
+ ( 0x21, 0x05 ), # AL=0xc1, AF=0 CF=1
+ ( 0x27, 0x15 ), # AL=0xc1, AF=1 CF=0
+ ( 0x27, 0x15 ), # AL=0xc1, AF=1 CF=1
+ ( 0x22, 0x05 ), # AL=0xc2, AF=0 CF=0
+ ( 0x22, 0x05 ), # AL=0xc2, AF=0 CF=1
+ ( 0x28, 0x15 ), # AL=0xc2, AF=1 CF=0
+ ( 0x28, 0x15 ), # AL=0xc2, AF=1 CF=1
+ ( 0x23, 0x01 ), # AL=0xc3, AF=0 CF=0
+ ( 0x23, 0x01 ), # AL=0xc3, AF=0 CF=1
+ ( 0x29, 0x11 ), # AL=0xc3, AF=1 CF=0
+ ( 0x29, 0x11 ), # AL=0xc3, AF=1 CF=1
+ ( 0x24, 0x05 ), # AL=0xc4, AF=0 CF=0
+ ( 0x24, 0x05 ), # AL=0xc4, AF=0 CF=1
+ ( 0x2a, 0x11 ), # AL=0xc4, AF=1 CF=0
+ ( 0x2a, 0x11 ), # AL=0xc4, AF=1 CF=1
+ ( 0x25, 0x01 ), # AL=0xc5, AF=0 CF=0
+ ( 0x25, 0x01 ), # AL=0xc5, AF=0 CF=1
+ ( 0x2b, 0x15 ), # AL=0xc5, AF=1 CF=0
+ ( 0x2b, 0x15 ), # AL=0xc5, AF=1 CF=1
+ ( 0x26, 0x01 ), # AL=0xc6, AF=0 CF=0
+ ( 0x26, 0x01 ), # AL=0xc6, AF=0 CF=1
+ ( 0x2c, 0x11 ), # AL=0xc6, AF=1 CF=0
+ ( 0x2c, 0x11 ), # AL=0xc6, AF=1 CF=1
+ ( 0x27, 0x05 ), # AL=0xc7, AF=0 CF=0
+ ( 0x27, 0x05 ), # AL=0xc7, AF=0 CF=1
+ ( 0x2d, 0x15 ), # AL=0xc7, AF=1 CF=0
+ ( 0x2d, 0x15 ), # AL=0xc7, AF=1 CF=1
+ ( 0x28, 0x05 ), # AL=0xc8, AF=0 CF=0
+ ( 0x28, 0x05 ), # AL=0xc8, AF=0 CF=1
+ ( 0x2e, 0x15 ), # AL=0xc8, AF=1 CF=0
+ ( 0x2e, 0x15 ), # AL=0xc8, AF=1 CF=1
+ ( 0x29, 0x01 ), # AL=0xc9, AF=0 CF=0
+ ( 0x29, 0x01 ), # AL=0xc9, AF=0 CF=1
+ ( 0x2f, 0x11 ), # AL=0xc9, AF=1 CF=0
+ ( 0x2f, 0x11 ), # AL=0xc9, AF=1 CF=1
+ ( 0x30, 0x15 ), # AL=0xca, AF=0 CF=0
+ ( 0x30, 0x15 ), # AL=0xca, AF=0 CF=1
+ ( 0x30, 0x15 ), # AL=0xca, AF=1 CF=0
+ ( 0x30, 0x15 ), # AL=0xca, AF=1 CF=1
+ ( 0x31, 0x11 ), # AL=0xcb, AF=0 CF=0
+ ( 0x31, 0x11 ), # AL=0xcb, AF=0 CF=1
+ ( 0x31, 0x11 ), # AL=0xcb, AF=1 CF=0
+ ( 0x31, 0x11 ), # AL=0xcb, AF=1 CF=1
+ ( 0x32, 0x11 ), # AL=0xcc, AF=0 CF=0
+ ( 0x32, 0x11 ), # AL=0xcc, AF=0 CF=1
+ ( 0x32, 0x11 ), # AL=0xcc, AF=1 CF=0
+ ( 0x32, 0x11 ), # AL=0xcc, AF=1 CF=1
+ ( 0x33, 0x15 ), # AL=0xcd, AF=0 CF=0
+ ( 0x33, 0x15 ), # AL=0xcd, AF=0 CF=1
+ ( 0x33, 0x15 ), # AL=0xcd, AF=1 CF=0
+ ( 0x33, 0x15 ), # AL=0xcd, AF=1 CF=1
+ ( 0x34, 0x11 ), # AL=0xce, AF=0 CF=0
+ ( 0x34, 0x11 ), # AL=0xce, AF=0 CF=1
+ ( 0x34, 0x11 ), # AL=0xce, AF=1 CF=0
+ ( 0x34, 0x11 ), # AL=0xce, AF=1 CF=1
+ ( 0x35, 0x15 ), # AL=0xcf, AF=0 CF=0
+ ( 0x35, 0x15 ), # AL=0xcf, AF=0 CF=1
+ ( 0x35, 0x15 ), # AL=0xcf, AF=1 CF=0
+ ( 0x35, 0x15 ), # AL=0xcf, AF=1 CF=1
+ ( 0x30, 0x05 ), # AL=0xd0, AF=0 CF=0
+ ( 0x30, 0x05 ), # AL=0xd0, AF=0 CF=1
+ ( 0x36, 0x15 ), # AL=0xd0, AF=1 CF=0
+ ( 0x36, 0x15 ), # AL=0xd0, AF=1 CF=1
+ ( 0x31, 0x01 ), # AL=0xd1, AF=0 CF=0
+ ( 0x31, 0x01 ), # AL=0xd1, AF=0 CF=1
+ ( 0x37, 0x11 ), # AL=0xd1, AF=1 CF=0
+ ( 0x37, 0x11 ), # AL=0xd1, AF=1 CF=1
+ ( 0x32, 0x01 ), # AL=0xd2, AF=0 CF=0
+ ( 0x32, 0x01 ), # AL=0xd2, AF=0 CF=1
+ ( 0x38, 0x11 ), # AL=0xd2, AF=1 CF=0
+ ( 0x38, 0x11 ), # AL=0xd2, AF=1 CF=1
+ ( 0x33, 0x05 ), # AL=0xd3, AF=0 CF=0
+ ( 0x33, 0x05 ), # AL=0xd3, AF=0 CF=1
+ ( 0x39, 0x15 ), # AL=0xd3, AF=1 CF=0
+ ( 0x39, 0x15 ), # AL=0xd3, AF=1 CF=1
+ ( 0x34, 0x01 ), # AL=0xd4, AF=0 CF=0
+ ( 0x34, 0x01 ), # AL=0xd4, AF=0 CF=1
+ ( 0x3a, 0x15 ), # AL=0xd4, AF=1 CF=0
+ ( 0x3a, 0x15 ), # AL=0xd4, AF=1 CF=1
+ ( 0x35, 0x05 ), # AL=0xd5, AF=0 CF=0
+ ( 0x35, 0x05 ), # AL=0xd5, AF=0 CF=1
+ ( 0x3b, 0x11 ), # AL=0xd5, AF=1 CF=0
+ ( 0x3b, 0x11 ), # AL=0xd5, AF=1 CF=1
+ ( 0x36, 0x05 ), # AL=0xd6, AF=0 CF=0
+ ( 0x36, 0x05 ), # AL=0xd6, AF=0 CF=1
+ ( 0x3c, 0x15 ), # AL=0xd6, AF=1 CF=0
+ ( 0x3c, 0x15 ), # AL=0xd6, AF=1 CF=1
+ ( 0x37, 0x01 ), # AL=0xd7, AF=0 CF=0
+ ( 0x37, 0x01 ), # AL=0xd7, AF=0 CF=1
+ ( 0x3d, 0x11 ), # AL=0xd7, AF=1 CF=0
+ ( 0x3d, 0x11 ), # AL=0xd7, AF=1 CF=1
+ ( 0x38, 0x01 ), # AL=0xd8, AF=0 CF=0
+ ( 0x38, 0x01 ), # AL=0xd8, AF=0 CF=1
+ ( 0x3e, 0x11 ), # AL=0xd8, AF=1 CF=0
+ ( 0x3e, 0x11 ), # AL=0xd8, AF=1 CF=1
+ ( 0x39, 0x05 ), # AL=0xd9, AF=0 CF=0
+ ( 0x39, 0x05 ), # AL=0xd9, AF=0 CF=1
+ ( 0x3f, 0x15 ), # AL=0xd9, AF=1 CF=0
+ ( 0x3f, 0x15 ), # AL=0xd9, AF=1 CF=1
+ ( 0x40, 0x11 ), # AL=0xda, AF=0 CF=0
+ ( 0x40, 0x11 ), # AL=0xda, AF=0 CF=1
+ ( 0x40, 0x11 ), # AL=0xda, AF=1 CF=0
+ ( 0x40, 0x11 ), # AL=0xda, AF=1 CF=1
+ ( 0x41, 0x15 ), # AL=0xdb, AF=0 CF=0
+ ( 0x41, 0x15 ), # AL=0xdb, AF=0 CF=1
+ ( 0x41, 0x15 ), # AL=0xdb, AF=1 CF=0
+ ( 0x41, 0x15 ), # AL=0xdb, AF=1 CF=1
+ ( 0x42, 0x15 ), # AL=0xdc, AF=0 CF=0
+ ( 0x42, 0x15 ), # AL=0xdc, AF=0 CF=1
+ ( 0x42, 0x15 ), # AL=0xdc, AF=1 CF=0
+ ( 0x42, 0x15 ), # AL=0xdc, AF=1 CF=1
+ ( 0x43, 0x11 ), # AL=0xdd, AF=0 CF=0
+ ( 0x43, 0x11 ), # AL=0xdd, AF=0 CF=1
+ ( 0x43, 0x11 ), # AL=0xdd, AF=1 CF=0
+ ( 0x43, 0x11 ), # AL=0xdd, AF=1 CF=1
+ ( 0x44, 0x15 ), # AL=0xde, AF=0 CF=0
+ ( 0x44, 0x15 ), # AL=0xde, AF=0 CF=1
+ ( 0x44, 0x15 ), # AL=0xde, AF=1 CF=0
+ ( 0x44, 0x15 ), # AL=0xde, AF=1 CF=1
+ ( 0x45, 0x11 ), # AL=0xdf, AF=0 CF=0
+ ( 0x45, 0x11 ), # AL=0xdf, AF=0 CF=1
+ ( 0x45, 0x11 ), # AL=0xdf, AF=1 CF=0
+ ( 0x45, 0x11 ), # AL=0xdf, AF=1 CF=1
+ ( 0x40, 0x01 ), # AL=0xe0, AF=0 CF=0
+ ( 0x40, 0x01 ), # AL=0xe0, AF=0 CF=1
+ ( 0x46, 0x11 ), # AL=0xe0, AF=1 CF=0
+ ( 0x46, 0x11 ), # AL=0xe0, AF=1 CF=1
+ ( 0x41, 0x05 ), # AL=0xe1, AF=0 CF=0
+ ( 0x41, 0x05 ), # AL=0xe1, AF=0 CF=1
+ ( 0x47, 0x15 ), # AL=0xe1, AF=1 CF=0
+ ( 0x47, 0x15 ), # AL=0xe1, AF=1 CF=1
+ ( 0x42, 0x05 ), # AL=0xe2, AF=0 CF=0
+ ( 0x42, 0x05 ), # AL=0xe2, AF=0 CF=1
+ ( 0x48, 0x15 ), # AL=0xe2, AF=1 CF=0
+ ( 0x48, 0x15 ), # AL=0xe2, AF=1 CF=1
+ ( 0x43, 0x01 ), # AL=0xe3, AF=0 CF=0
+ ( 0x43, 0x01 ), # AL=0xe3, AF=0 CF=1
+ ( 0x49, 0x11 ), # AL=0xe3, AF=1 CF=0
+ ( 0x49, 0x11 ), # AL=0xe3, AF=1 CF=1
+ ( 0x44, 0x05 ), # AL=0xe4, AF=0 CF=0
+ ( 0x44, 0x05 ), # AL=0xe4, AF=0 CF=1
+ ( 0x4a, 0x11 ), # AL=0xe4, AF=1 CF=0
+ ( 0x4a, 0x11 ), # AL=0xe4, AF=1 CF=1
+ ( 0x45, 0x01 ), # AL=0xe5, AF=0 CF=0
+ ( 0x45, 0x01 ), # AL=0xe5, AF=0 CF=1
+ ( 0x4b, 0x15 ), # AL=0xe5, AF=1 CF=0
+ ( 0x4b, 0x15 ), # AL=0xe5, AF=1 CF=1
+ ( 0x46, 0x01 ), # AL=0xe6, AF=0 CF=0
+ ( 0x46, 0x01 ), # AL=0xe6, AF=0 CF=1
+ ( 0x4c, 0x11 ), # AL=0xe6, AF=1 CF=0
+ ( 0x4c, 0x11 ), # AL=0xe6, AF=1 CF=1
+ ( 0x47, 0x05 ), # AL=0xe7, AF=0 CF=0
+ ( 0x47, 0x05 ), # AL=0xe7, AF=0 CF=1
+ ( 0x4d, 0x15 ), # AL=0xe7, AF=1 CF=0
+ ( 0x4d, 0x15 ), # AL=0xe7, AF=1 CF=1
+ ( 0x48, 0x05 ), # AL=0xe8, AF=0 CF=0
+ ( 0x48, 0x05 ), # AL=0xe8, AF=0 CF=1
+ ( 0x4e, 0x15 ), # AL=0xe8, AF=1 CF=0
+ ( 0x4e, 0x15 ), # AL=0xe8, AF=1 CF=1
+ ( 0x49, 0x01 ), # AL=0xe9, AF=0 CF=0
+ ( 0x49, 0x01 ), # AL=0xe9, AF=0 CF=1
+ ( 0x4f, 0x11 ), # AL=0xe9, AF=1 CF=0
+ ( 0x4f, 0x11 ), # AL=0xe9, AF=1 CF=1
+ ( 0x50, 0x15 ), # AL=0xea, AF=0 CF=0
+ ( 0x50, 0x15 ), # AL=0xea, AF=0 CF=1
+ ( 0x50, 0x15 ), # AL=0xea, AF=1 CF=0
+ ( 0x50, 0x15 ), # AL=0xea, AF=1 CF=1
+ ( 0x51, 0x11 ), # AL=0xeb, AF=0 CF=0
+ ( 0x51, 0x11 ), # AL=0xeb, AF=0 CF=1
+ ( 0x51, 0x11 ), # AL=0xeb, AF=1 CF=0
+ ( 0x51, 0x11 ), # AL=0xeb, AF=1 CF=1
+ ( 0x52, 0x11 ), # AL=0xec, AF=0 CF=0
+ ( 0x52, 0x11 ), # AL=0xec, AF=0 CF=1
+ ( 0x52, 0x11 ), # AL=0xec, AF=1 CF=0
+ ( 0x52, 0x11 ), # AL=0xec, AF=1 CF=1
+ ( 0x53, 0x15 ), # AL=0xed, AF=0 CF=0
+ ( 0x53, 0x15 ), # AL=0xed, AF=0 CF=1
+ ( 0x53, 0x15 ), # AL=0xed, AF=1 CF=0
+ ( 0x53, 0x15 ), # AL=0xed, AF=1 CF=1
+ ( 0x54, 0x11 ), # AL=0xee, AF=0 CF=0
+ ( 0x54, 0x11 ), # AL=0xee, AF=0 CF=1
+ ( 0x54, 0x11 ), # AL=0xee, AF=1 CF=0
+ ( 0x54, 0x11 ), # AL=0xee, AF=1 CF=1
+ ( 0x55, 0x15 ), # AL=0xef, AF=0 CF=0
+ ( 0x55, 0x15 ), # AL=0xef, AF=0 CF=1
+ ( 0x55, 0x15 ), # AL=0xef, AF=1 CF=0
+ ( 0x55, 0x15 ), # AL=0xef, AF=1 CF=1
+ ( 0x50, 0x05 ), # AL=0xf0, AF=0 CF=0
+ ( 0x50, 0x05 ), # AL=0xf0, AF=0 CF=1
+ ( 0x56, 0x15 ), # AL=0xf0, AF=1 CF=0
+ ( 0x56, 0x15 ), # AL=0xf0, AF=1 CF=1
+ ( 0x51, 0x01 ), # AL=0xf1, AF=0 CF=0
+ ( 0x51, 0x01 ), # AL=0xf1, AF=0 CF=1
+ ( 0x57, 0x11 ), # AL=0xf1, AF=1 CF=0
+ ( 0x57, 0x11 ), # AL=0xf1, AF=1 CF=1
+ ( 0x52, 0x01 ), # AL=0xf2, AF=0 CF=0
+ ( 0x52, 0x01 ), # AL=0xf2, AF=0 CF=1
+ ( 0x58, 0x11 ), # AL=0xf2, AF=1 CF=0
+ ( 0x58, 0x11 ), # AL=0xf2, AF=1 CF=1
+ ( 0x53, 0x05 ), # AL=0xf3, AF=0 CF=0
+ ( 0x53, 0x05 ), # AL=0xf3, AF=0 CF=1
+ ( 0x59, 0x15 ), # AL=0xf3, AF=1 CF=0
+ ( 0x59, 0x15 ), # AL=0xf3, AF=1 CF=1
+ ( 0x54, 0x01 ), # AL=0xf4, AF=0 CF=0
+ ( 0x54, 0x01 ), # AL=0xf4, AF=0 CF=1
+ ( 0x5a, 0x15 ), # AL=0xf4, AF=1 CF=0
+ ( 0x5a, 0x15 ), # AL=0xf4, AF=1 CF=1
+ ( 0x55, 0x05 ), # AL=0xf5, AF=0 CF=0
+ ( 0x55, 0x05 ), # AL=0xf5, AF=0 CF=1
+ ( 0x5b, 0x11 ), # AL=0xf5, AF=1 CF=0
+ ( 0x5b, 0x11 ), # AL=0xf5, AF=1 CF=1
+ ( 0x56, 0x05 ), # AL=0xf6, AF=0 CF=0
+ ( 0x56, 0x05 ), # AL=0xf6, AF=0 CF=1
+ ( 0x5c, 0x15 ), # AL=0xf6, AF=1 CF=0
+ ( 0x5c, 0x15 ), # AL=0xf6, AF=1 CF=1
+ ( 0x57, 0x01 ), # AL=0xf7, AF=0 CF=0
+ ( 0x57, 0x01 ), # AL=0xf7, AF=0 CF=1
+ ( 0x5d, 0x11 ), # AL=0xf7, AF=1 CF=0
+ ( 0x5d, 0x11 ), # AL=0xf7, AF=1 CF=1
+ ( 0x58, 0x01 ), # AL=0xf8, AF=0 CF=0
+ ( 0x58, 0x01 ), # AL=0xf8, AF=0 CF=1
+ ( 0x5e, 0x11 ), # AL=0xf8, AF=1 CF=0
+ ( 0x5e, 0x11 ), # AL=0xf8, AF=1 CF=1
+ ( 0x59, 0x05 ), # AL=0xf9, AF=0 CF=0
+ ( 0x59, 0x05 ), # AL=0xf9, AF=0 CF=1
+ ( 0x5f, 0x15 ), # AL=0xf9, AF=1 CF=0
+ ( 0x5f, 0x15 ), # AL=0xf9, AF=1 CF=1
+ ( 0x60, 0x15 ), # AL=0xfa, AF=0 CF=0
+ ( 0x60, 0x15 ), # AL=0xfa, AF=0 CF=1
+ ( 0x60, 0x15 ), # AL=0xfa, AF=1 CF=0
+ ( 0x60, 0x15 ), # AL=0xfa, AF=1 CF=1
+ ( 0x61, 0x11 ), # AL=0xfb, AF=0 CF=0
+ ( 0x61, 0x11 ), # AL=0xfb, AF=0 CF=1
+ ( 0x61, 0x11 ), # AL=0xfb, AF=1 CF=0
+ ( 0x61, 0x11 ), # AL=0xfb, AF=1 CF=1
+ ( 0x62, 0x11 ), # AL=0xfc, AF=0 CF=0
+ ( 0x62, 0x11 ), # AL=0xfc, AF=0 CF=1
+ ( 0x62, 0x11 ), # AL=0xfc, AF=1 CF=0
+ ( 0x62, 0x11 ), # AL=0xfc, AF=1 CF=1
+ ( 0x63, 0x15 ), # AL=0xfd, AF=0 CF=0
+ ( 0x63, 0x15 ), # AL=0xfd, AF=0 CF=1
+ ( 0x63, 0x15 ), # AL=0xfd, AF=1 CF=0
+ ( 0x63, 0x15 ), # AL=0xfd, AF=1 CF=1
+ ( 0x64, 0x11 ), # AL=0xfe, AF=0 CF=0
+ ( 0x64, 0x11 ), # AL=0xfe, AF=0 CF=1
+ ( 0x64, 0x11 ), # AL=0xfe, AF=1 CF=0
+ ( 0x64, 0x11 ), # AL=0xfe, AF=1 CF=1
+ ( 0x65, 0x15 ), # AL=0xff, AF=0 CF=0
+ ( 0x65, 0x15 ), # AL=0xff, AF=0 CF=1
+ ( 0x65, 0x15 ), # AL=0xff, AF=1 CF=0
+ ( 0x65, 0x15 ), # AL=0xff, AF=1 CF=1
+];
+
diff --git a/src/VBox/VMM/testcase/Instructions/itgTableDas.py b/src/VBox/VMM/testcase/Instructions/itgTableDas.py
new file mode 100644
index 0000000..702b95f
--- /dev/null
+++ b/src/VBox/VMM/testcase/Instructions/itgTableDas.py
@@ -0,0 +1,1105 @@
+# -*- coding: utf-8 -*-
+# $Id: itgTableDas.py $
+
+"""
+DAS (instruction) result table.
+"""
+
+
+__copyright__ = \
+"""
+Copyright (C) 2012-2013 Oracle Corporation
+
+This file is part of VirtualBox Open Source Edition (OSE), as
+available from http://www.virtualbox.org. This file is free software;
+you can redistribute it and/or modify it under the terms of the GNU
+General Public License (GPL) as published by the Free Software
+Foundation, in version 2 as it comes in the "COPYING" file of the
+VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+"""
+__version__ = "$Revision: 90928 $";
+
+
+## The 32-bit GCC (C99) program that produced the table below.
+g_sItgCProgramDas = \
+"""
+#include <stdio.h>
+
+int main()
+{
+ for (unsigned uInputAL = 0; uInputAL < 256; uInputAL++)
+ for (unsigned fAux = 0; fAux < 2; fAux++)
+ for (unsigned fCarry = 0; fCarry < 2; fCarry++)
+ {
+ unsigned uInputEFlags = fCarry | (fAux << 4);
+ unsigned uResultAL;
+ unsigned uResultEFlags;
+ __asm__ __volatile__("pushl %1\\n"
+ "popfl\\n"
+ "das\\n"
+ "pushf\\n"
+ "pop %1\\n"
+ : "=a" (uResultAL),
+ "=r" (uResultEFlags)
+ : "0" (uInputAL),
+ "1" (uInputEFlags)
+ : "memory"
+ );
+ printf(" ( 0x%02x, 0x%02x ), # AL=0x%02x, AF=%u CF=%u\\n",
+ uResultAL, uResultEFlags & 0xd5, uInputAL, fAux, fCarry);
+ /* 0xd5 = CF, PF, AF, ZF, SF */
+ }
+ return 0;
+}
+""";
+
+
+#
+# Compile and run the above program if requested to do so.
+#
+if __name__ == '__main__':
+ import sys;
+ if len(sys.argv) > 1 and sys.argv[1] == 'gen':
+ import subprocess;
+ oProc = subprocess.Popen(['gcc', '-x', 'c', '-std=gnu99', '-m32', '-o', './itgTableDas', '-'], stdin = subprocess.PIPE);
+ oProc.communicate(g_sItgCProgramDas);
+ oProc.wait();
+ oProc = subprocess.Popen(['./itgTableDas',]).wait();
+ sys.exit(0);
+
+
+
+##
+# The DAS results.
+#
+# The index / input relation is: index = (AL << 2) | (CF << 1) | AF
+#
+g_aItgDasResults = \
+[
+ ( 0x00, 0x44 ), # AL=0x00, AF=0 CF=0
+ ( 0xa0, 0x85 ), # AL=0x00, AF=0 CF=1
+ ( 0xfa, 0x95 ), # AL=0x00, AF=1 CF=0
+ ( 0x9a, 0x95 ), # AL=0x00, AF=1 CF=1
+ ( 0x01, 0x00 ), # AL=0x01, AF=0 CF=0
+ ( 0xa1, 0x81 ), # AL=0x01, AF=0 CF=1
+ ( 0xfb, 0x91 ), # AL=0x01, AF=1 CF=0
+ ( 0x9b, 0x91 ), # AL=0x01, AF=1 CF=1
+ ( 0x02, 0x00 ), # AL=0x02, AF=0 CF=0
+ ( 0xa2, 0x81 ), # AL=0x02, AF=0 CF=1
+ ( 0xfc, 0x95 ), # AL=0x02, AF=1 CF=0
+ ( 0x9c, 0x95 ), # AL=0x02, AF=1 CF=1
+ ( 0x03, 0x04 ), # AL=0x03, AF=0 CF=0
+ ( 0xa3, 0x85 ), # AL=0x03, AF=0 CF=1
+ ( 0xfd, 0x91 ), # AL=0x03, AF=1 CF=0
+ ( 0x9d, 0x91 ), # AL=0x03, AF=1 CF=1
+ ( 0x04, 0x00 ), # AL=0x04, AF=0 CF=0
+ ( 0xa4, 0x81 ), # AL=0x04, AF=0 CF=1
+ ( 0xfe, 0x91 ), # AL=0x04, AF=1 CF=0
+ ( 0x9e, 0x91 ), # AL=0x04, AF=1 CF=1
+ ( 0x05, 0x04 ), # AL=0x05, AF=0 CF=0
+ ( 0xa5, 0x85 ), # AL=0x05, AF=0 CF=1
+ ( 0xff, 0x95 ), # AL=0x05, AF=1 CF=0
+ ( 0x9f, 0x95 ), # AL=0x05, AF=1 CF=1
+ ( 0x06, 0x04 ), # AL=0x06, AF=0 CF=0
+ ( 0xa6, 0x85 ), # AL=0x06, AF=0 CF=1
+ ( 0x00, 0x54 ), # AL=0x06, AF=1 CF=0
+ ( 0xa0, 0x95 ), # AL=0x06, AF=1 CF=1
+ ( 0x07, 0x00 ), # AL=0x07, AF=0 CF=0
+ ( 0xa7, 0x81 ), # AL=0x07, AF=0 CF=1
+ ( 0x01, 0x10 ), # AL=0x07, AF=1 CF=0
+ ( 0xa1, 0x91 ), # AL=0x07, AF=1 CF=1
+ ( 0x08, 0x00 ), # AL=0x08, AF=0 CF=0
+ ( 0xa8, 0x81 ), # AL=0x08, AF=0 CF=1
+ ( 0x02, 0x10 ), # AL=0x08, AF=1 CF=0
+ ( 0xa2, 0x91 ), # AL=0x08, AF=1 CF=1
+ ( 0x09, 0x04 ), # AL=0x09, AF=0 CF=0
+ ( 0xa9, 0x85 ), # AL=0x09, AF=0 CF=1
+ ( 0x03, 0x14 ), # AL=0x09, AF=1 CF=0
+ ( 0xa3, 0x95 ), # AL=0x09, AF=1 CF=1
+ ( 0x04, 0x10 ), # AL=0x0a, AF=0 CF=0
+ ( 0xa4, 0x91 ), # AL=0x0a, AF=0 CF=1
+ ( 0x04, 0x10 ), # AL=0x0a, AF=1 CF=0
+ ( 0xa4, 0x91 ), # AL=0x0a, AF=1 CF=1
+ ( 0x05, 0x14 ), # AL=0x0b, AF=0 CF=0
+ ( 0xa5, 0x95 ), # AL=0x0b, AF=0 CF=1
+ ( 0x05, 0x14 ), # AL=0x0b, AF=1 CF=0
+ ( 0xa5, 0x95 ), # AL=0x0b, AF=1 CF=1
+ ( 0x06, 0x14 ), # AL=0x0c, AF=0 CF=0
+ ( 0xa6, 0x95 ), # AL=0x0c, AF=0 CF=1
+ ( 0x06, 0x14 ), # AL=0x0c, AF=1 CF=0
+ ( 0xa6, 0x95 ), # AL=0x0c, AF=1 CF=1
+ ( 0x07, 0x10 ), # AL=0x0d, AF=0 CF=0
+ ( 0xa7, 0x91 ), # AL=0x0d, AF=0 CF=1
+ ( 0x07, 0x10 ), # AL=0x0d, AF=1 CF=0
+ ( 0xa7, 0x91 ), # AL=0x0d, AF=1 CF=1
+ ( 0x08, 0x10 ), # AL=0x0e, AF=0 CF=0
+ ( 0xa8, 0x91 ), # AL=0x0e, AF=0 CF=1
+ ( 0x08, 0x10 ), # AL=0x0e, AF=1 CF=0
+ ( 0xa8, 0x91 ), # AL=0x0e, AF=1 CF=1
+ ( 0x09, 0x14 ), # AL=0x0f, AF=0 CF=0
+ ( 0xa9, 0x95 ), # AL=0x0f, AF=0 CF=1
+ ( 0x09, 0x14 ), # AL=0x0f, AF=1 CF=0
+ ( 0xa9, 0x95 ), # AL=0x0f, AF=1 CF=1
+ ( 0x10, 0x00 ), # AL=0x10, AF=0 CF=0
+ ( 0xb0, 0x81 ), # AL=0x10, AF=0 CF=1
+ ( 0x0a, 0x14 ), # AL=0x10, AF=1 CF=0
+ ( 0xaa, 0x95 ), # AL=0x10, AF=1 CF=1
+ ( 0x11, 0x04 ), # AL=0x11, AF=0 CF=0
+ ( 0xb1, 0x85 ), # AL=0x11, AF=0 CF=1
+ ( 0x0b, 0x10 ), # AL=0x11, AF=1 CF=0
+ ( 0xab, 0x91 ), # AL=0x11, AF=1 CF=1
+ ( 0x12, 0x04 ), # AL=0x12, AF=0 CF=0
+ ( 0xb2, 0x85 ), # AL=0x12, AF=0 CF=1
+ ( 0x0c, 0x14 ), # AL=0x12, AF=1 CF=0
+ ( 0xac, 0x95 ), # AL=0x12, AF=1 CF=1
+ ( 0x13, 0x00 ), # AL=0x13, AF=0 CF=0
+ ( 0xb3, 0x81 ), # AL=0x13, AF=0 CF=1
+ ( 0x0d, 0x10 ), # AL=0x13, AF=1 CF=0
+ ( 0xad, 0x91 ), # AL=0x13, AF=1 CF=1
+ ( 0x14, 0x04 ), # AL=0x14, AF=0 CF=0
+ ( 0xb4, 0x85 ), # AL=0x14, AF=0 CF=1
+ ( 0x0e, 0x10 ), # AL=0x14, AF=1 CF=0
+ ( 0xae, 0x91 ), # AL=0x14, AF=1 CF=1
+ ( 0x15, 0x00 ), # AL=0x15, AF=0 CF=0
+ ( 0xb5, 0x81 ), # AL=0x15, AF=0 CF=1
+ ( 0x0f, 0x14 ), # AL=0x15, AF=1 CF=0
+ ( 0xaf, 0x95 ), # AL=0x15, AF=1 CF=1
+ ( 0x16, 0x00 ), # AL=0x16, AF=0 CF=0
+ ( 0xb6, 0x81 ), # AL=0x16, AF=0 CF=1
+ ( 0x10, 0x10 ), # AL=0x16, AF=1 CF=0
+ ( 0xb0, 0x91 ), # AL=0x16, AF=1 CF=1
+ ( 0x17, 0x04 ), # AL=0x17, AF=0 CF=0
+ ( 0xb7, 0x85 ), # AL=0x17, AF=0 CF=1
+ ( 0x11, 0x14 ), # AL=0x17, AF=1 CF=0
+ ( 0xb1, 0x95 ), # AL=0x17, AF=1 CF=1
+ ( 0x18, 0x04 ), # AL=0x18, AF=0 CF=0
+ ( 0xb8, 0x85 ), # AL=0x18, AF=0 CF=1
+ ( 0x12, 0x14 ), # AL=0x18, AF=1 CF=0
+ ( 0xb2, 0x95 ), # AL=0x18, AF=1 CF=1
+ ( 0x19, 0x00 ), # AL=0x19, AF=0 CF=0
+ ( 0xb9, 0x81 ), # AL=0x19, AF=0 CF=1
+ ( 0x13, 0x10 ), # AL=0x19, AF=1 CF=0
+ ( 0xb3, 0x91 ), # AL=0x19, AF=1 CF=1
+ ( 0x14, 0x14 ), # AL=0x1a, AF=0 CF=0
+ ( 0xb4, 0x95 ), # AL=0x1a, AF=0 CF=1
+ ( 0x14, 0x14 ), # AL=0x1a, AF=1 CF=0
+ ( 0xb4, 0x95 ), # AL=0x1a, AF=1 CF=1
+ ( 0x15, 0x10 ), # AL=0x1b, AF=0 CF=0
+ ( 0xb5, 0x91 ), # AL=0x1b, AF=0 CF=1
+ ( 0x15, 0x10 ), # AL=0x1b, AF=1 CF=0
+ ( 0xb5, 0x91 ), # AL=0x1b, AF=1 CF=1
+ ( 0x16, 0x10 ), # AL=0x1c, AF=0 CF=0
+ ( 0xb6, 0x91 ), # AL=0x1c, AF=0 CF=1
+ ( 0x16, 0x10 ), # AL=0x1c, AF=1 CF=0
+ ( 0xb6, 0x91 ), # AL=0x1c, AF=1 CF=1
+ ( 0x17, 0x14 ), # AL=0x1d, AF=0 CF=0
+ ( 0xb7, 0x95 ), # AL=0x1d, AF=0 CF=1
+ ( 0x17, 0x14 ), # AL=0x1d, AF=1 CF=0
+ ( 0xb7, 0x95 ), # AL=0x1d, AF=1 CF=1
+ ( 0x18, 0x14 ), # AL=0x1e, AF=0 CF=0
+ ( 0xb8, 0x95 ), # AL=0x1e, AF=0 CF=1
+ ( 0x18, 0x14 ), # AL=0x1e, AF=1 CF=0
+ ( 0xb8, 0x95 ), # AL=0x1e, AF=1 CF=1
+ ( 0x19, 0x10 ), # AL=0x1f, AF=0 CF=0
+ ( 0xb9, 0x91 ), # AL=0x1f, AF=0 CF=1
+ ( 0x19, 0x10 ), # AL=0x1f, AF=1 CF=0
+ ( 0xb9, 0x91 ), # AL=0x1f, AF=1 CF=1
+ ( 0x20, 0x00 ), # AL=0x20, AF=0 CF=0
+ ( 0xc0, 0x85 ), # AL=0x20, AF=0 CF=1
+ ( 0x1a, 0x10 ), # AL=0x20, AF=1 CF=0
+ ( 0xba, 0x91 ), # AL=0x20, AF=1 CF=1
+ ( 0x21, 0x04 ), # AL=0x21, AF=0 CF=0
+ ( 0xc1, 0x81 ), # AL=0x21, AF=0 CF=1
+ ( 0x1b, 0x14 ), # AL=0x21, AF=1 CF=0
+ ( 0xbb, 0x95 ), # AL=0x21, AF=1 CF=1
+ ( 0x22, 0x04 ), # AL=0x22, AF=0 CF=0
+ ( 0xc2, 0x81 ), # AL=0x22, AF=0 CF=1
+ ( 0x1c, 0x10 ), # AL=0x22, AF=1 CF=0
+ ( 0xbc, 0x91 ), # AL=0x22, AF=1 CF=1
+ ( 0x23, 0x00 ), # AL=0x23, AF=0 CF=0
+ ( 0xc3, 0x85 ), # AL=0x23, AF=0 CF=1
+ ( 0x1d, 0x14 ), # AL=0x23, AF=1 CF=0
+ ( 0xbd, 0x95 ), # AL=0x23, AF=1 CF=1
+ ( 0x24, 0x04 ), # AL=0x24, AF=0 CF=0
+ ( 0xc4, 0x81 ), # AL=0x24, AF=0 CF=1
+ ( 0x1e, 0x14 ), # AL=0x24, AF=1 CF=0
+ ( 0xbe, 0x95 ), # AL=0x24, AF=1 CF=1
+ ( 0x25, 0x00 ), # AL=0x25, AF=0 CF=0
+ ( 0xc5, 0x85 ), # AL=0x25, AF=0 CF=1
+ ( 0x1f, 0x10 ), # AL=0x25, AF=1 CF=0
+ ( 0xbf, 0x91 ), # AL=0x25, AF=1 CF=1
+ ( 0x26, 0x00 ), # AL=0x26, AF=0 CF=0
+ ( 0xc6, 0x85 ), # AL=0x26, AF=0 CF=1
+ ( 0x20, 0x10 ), # AL=0x26, AF=1 CF=0
+ ( 0xc0, 0x95 ), # AL=0x26, AF=1 CF=1
+ ( 0x27, 0x04 ), # AL=0x27, AF=0 CF=0
+ ( 0xc7, 0x81 ), # AL=0x27, AF=0 CF=1
+ ( 0x21, 0x14 ), # AL=0x27, AF=1 CF=0
+ ( 0xc1, 0x91 ), # AL=0x27, AF=1 CF=1
+ ( 0x28, 0x04 ), # AL=0x28, AF=0 CF=0
+ ( 0xc8, 0x81 ), # AL=0x28, AF=0 CF=1
+ ( 0x22, 0x14 ), # AL=0x28, AF=1 CF=0
+ ( 0xc2, 0x91 ), # AL=0x28, AF=1 CF=1
+ ( 0x29, 0x00 ), # AL=0x29, AF=0 CF=0
+ ( 0xc9, 0x85 ), # AL=0x29, AF=0 CF=1
+ ( 0x23, 0x10 ), # AL=0x29, AF=1 CF=0
+ ( 0xc3, 0x95 ), # AL=0x29, AF=1 CF=1
+ ( 0x24, 0x14 ), # AL=0x2a, AF=0 CF=0
+ ( 0xc4, 0x91 ), # AL=0x2a, AF=0 CF=1
+ ( 0x24, 0x14 ), # AL=0x2a, AF=1 CF=0
+ ( 0xc4, 0x91 ), # AL=0x2a, AF=1 CF=1
+ ( 0x25, 0x10 ), # AL=0x2b, AF=0 CF=0
+ ( 0xc5, 0x95 ), # AL=0x2b, AF=0 CF=1
+ ( 0x25, 0x10 ), # AL=0x2b, AF=1 CF=0
+ ( 0xc5, 0x95 ), # AL=0x2b, AF=1 CF=1
+ ( 0x26, 0x10 ), # AL=0x2c, AF=0 CF=0
+ ( 0xc6, 0x95 ), # AL=0x2c, AF=0 CF=1
+ ( 0x26, 0x10 ), # AL=0x2c, AF=1 CF=0
+ ( 0xc6, 0x95 ), # AL=0x2c, AF=1 CF=1
+ ( 0x27, 0x14 ), # AL=0x2d, AF=0 CF=0
+ ( 0xc7, 0x91 ), # AL=0x2d, AF=0 CF=1
+ ( 0x27, 0x14 ), # AL=0x2d, AF=1 CF=0
+ ( 0xc7, 0x91 ), # AL=0x2d, AF=1 CF=1
+ ( 0x28, 0x14 ), # AL=0x2e, AF=0 CF=0
+ ( 0xc8, 0x91 ), # AL=0x2e, AF=0 CF=1
+ ( 0x28, 0x14 ), # AL=0x2e, AF=1 CF=0
+ ( 0xc8, 0x91 ), # AL=0x2e, AF=1 CF=1
+ ( 0x29, 0x10 ), # AL=0x2f, AF=0 CF=0
+ ( 0xc9, 0x95 ), # AL=0x2f, AF=0 CF=1
+ ( 0x29, 0x10 ), # AL=0x2f, AF=1 CF=0
+ ( 0xc9, 0x95 ), # AL=0x2f, AF=1 CF=1
+ ( 0x30, 0x04 ), # AL=0x30, AF=0 CF=0
+ ( 0xd0, 0x81 ), # AL=0x30, AF=0 CF=1
+ ( 0x2a, 0x10 ), # AL=0x30, AF=1 CF=0
+ ( 0xca, 0x95 ), # AL=0x30, AF=1 CF=1
+ ( 0x31, 0x00 ), # AL=0x31, AF=0 CF=0
+ ( 0xd1, 0x85 ), # AL=0x31, AF=0 CF=1
+ ( 0x2b, 0x14 ), # AL=0x31, AF=1 CF=0
+ ( 0xcb, 0x91 ), # AL=0x31, AF=1 CF=1
+ ( 0x32, 0x00 ), # AL=0x32, AF=0 CF=0
+ ( 0xd2, 0x85 ), # AL=0x32, AF=0 CF=1
+ ( 0x2c, 0x10 ), # AL=0x32, AF=1 CF=0
+ ( 0xcc, 0x95 ), # AL=0x32, AF=1 CF=1
+ ( 0x33, 0x04 ), # AL=0x33, AF=0 CF=0
+ ( 0xd3, 0x81 ), # AL=0x33, AF=0 CF=1
+ ( 0x2d, 0x14 ), # AL=0x33, AF=1 CF=0
+ ( 0xcd, 0x91 ), # AL=0x33, AF=1 CF=1
+ ( 0x34, 0x00 ), # AL=0x34, AF=0 CF=0
+ ( 0xd4, 0x85 ), # AL=0x34, AF=0 CF=1
+ ( 0x2e, 0x14 ), # AL=0x34, AF=1 CF=0
+ ( 0xce, 0x91 ), # AL=0x34, AF=1 CF=1
+ ( 0x35, 0x04 ), # AL=0x35, AF=0 CF=0
+ ( 0xd5, 0x81 ), # AL=0x35, AF=0 CF=1
+ ( 0x2f, 0x10 ), # AL=0x35, AF=1 CF=0
+ ( 0xcf, 0x95 ), # AL=0x35, AF=1 CF=1
+ ( 0x36, 0x04 ), # AL=0x36, AF=0 CF=0
+ ( 0xd6, 0x81 ), # AL=0x36, AF=0 CF=1
+ ( 0x30, 0x14 ), # AL=0x36, AF=1 CF=0
+ ( 0xd0, 0x91 ), # AL=0x36, AF=1 CF=1
+ ( 0x37, 0x00 ), # AL=0x37, AF=0 CF=0
+ ( 0xd7, 0x85 ), # AL=0x37, AF=0 CF=1
+ ( 0x31, 0x10 ), # AL=0x37, AF=1 CF=0
+ ( 0xd1, 0x95 ), # AL=0x37, AF=1 CF=1
+ ( 0x38, 0x00 ), # AL=0x38, AF=0 CF=0
+ ( 0xd8, 0x85 ), # AL=0x38, AF=0 CF=1
+ ( 0x32, 0x10 ), # AL=0x38, AF=1 CF=0
+ ( 0xd2, 0x95 ), # AL=0x38, AF=1 CF=1
+ ( 0x39, 0x04 ), # AL=0x39, AF=0 CF=0
+ ( 0xd9, 0x81 ), # AL=0x39, AF=0 CF=1
+ ( 0x33, 0x14 ), # AL=0x39, AF=1 CF=0
+ ( 0xd3, 0x91 ), # AL=0x39, AF=1 CF=1
+ ( 0x34, 0x10 ), # AL=0x3a, AF=0 CF=0
+ ( 0xd4, 0x95 ), # AL=0x3a, AF=0 CF=1
+ ( 0x34, 0x10 ), # AL=0x3a, AF=1 CF=0
+ ( 0xd4, 0x95 ), # AL=0x3a, AF=1 CF=1
+ ( 0x35, 0x14 ), # AL=0x3b, AF=0 CF=0
+ ( 0xd5, 0x91 ), # AL=0x3b, AF=0 CF=1
+ ( 0x35, 0x14 ), # AL=0x3b, AF=1 CF=0
+ ( 0xd5, 0x91 ), # AL=0x3b, AF=1 CF=1
+ ( 0x36, 0x14 ), # AL=0x3c, AF=0 CF=0
+ ( 0xd6, 0x91 ), # AL=0x3c, AF=0 CF=1
+ ( 0x36, 0x14 ), # AL=0x3c, AF=1 CF=0
+ ( 0xd6, 0x91 ), # AL=0x3c, AF=1 CF=1
+ ( 0x37, 0x10 ), # AL=0x3d, AF=0 CF=0
+ ( 0xd7, 0x95 ), # AL=0x3d, AF=0 CF=1
+ ( 0x37, 0x10 ), # AL=0x3d, AF=1 CF=0
+ ( 0xd7, 0x95 ), # AL=0x3d, AF=1 CF=1
+ ( 0x38, 0x10 ), # AL=0x3e, AF=0 CF=0
+ ( 0xd8, 0x95 ), # AL=0x3e, AF=0 CF=1
+ ( 0x38, 0x10 ), # AL=0x3e, AF=1 CF=0
+ ( 0xd8, 0x95 ), # AL=0x3e, AF=1 CF=1
+ ( 0x39, 0x14 ), # AL=0x3f, AF=0 CF=0
+ ( 0xd9, 0x91 ), # AL=0x3f, AF=0 CF=1
+ ( 0x39, 0x14 ), # AL=0x3f, AF=1 CF=0
+ ( 0xd9, 0x91 ), # AL=0x3f, AF=1 CF=1
+ ( 0x40, 0x00 ), # AL=0x40, AF=0 CF=0
+ ( 0xe0, 0x81 ), # AL=0x40, AF=0 CF=1
+ ( 0x3a, 0x14 ), # AL=0x40, AF=1 CF=0
+ ( 0xda, 0x91 ), # AL=0x40, AF=1 CF=1
+ ( 0x41, 0x04 ), # AL=0x41, AF=0 CF=0
+ ( 0xe1, 0x85 ), # AL=0x41, AF=0 CF=1
+ ( 0x3b, 0x10 ), # AL=0x41, AF=1 CF=0
+ ( 0xdb, 0x95 ), # AL=0x41, AF=1 CF=1
+ ( 0x42, 0x04 ), # AL=0x42, AF=0 CF=0
+ ( 0xe2, 0x85 ), # AL=0x42, AF=0 CF=1
+ ( 0x3c, 0x14 ), # AL=0x42, AF=1 CF=0
+ ( 0xdc, 0x91 ), # AL=0x42, AF=1 CF=1
+ ( 0x43, 0x00 ), # AL=0x43, AF=0 CF=0
+ ( 0xe3, 0x81 ), # AL=0x43, AF=0 CF=1
+ ( 0x3d, 0x10 ), # AL=0x43, AF=1 CF=0
+ ( 0xdd, 0x95 ), # AL=0x43, AF=1 CF=1
+ ( 0x44, 0x04 ), # AL=0x44, AF=0 CF=0
+ ( 0xe4, 0x85 ), # AL=0x44, AF=0 CF=1
+ ( 0x3e, 0x10 ), # AL=0x44, AF=1 CF=0
+ ( 0xde, 0x95 ), # AL=0x44, AF=1 CF=1
+ ( 0x45, 0x00 ), # AL=0x45, AF=0 CF=0
+ ( 0xe5, 0x81 ), # AL=0x45, AF=0 CF=1
+ ( 0x3f, 0x14 ), # AL=0x45, AF=1 CF=0
+ ( 0xdf, 0x91 ), # AL=0x45, AF=1 CF=1
+ ( 0x46, 0x00 ), # AL=0x46, AF=0 CF=0
+ ( 0xe6, 0x81 ), # AL=0x46, AF=0 CF=1
+ ( 0x40, 0x10 ), # AL=0x46, AF=1 CF=0
+ ( 0xe0, 0x91 ), # AL=0x46, AF=1 CF=1
+ ( 0x47, 0x04 ), # AL=0x47, AF=0 CF=0
+ ( 0xe7, 0x85 ), # AL=0x47, AF=0 CF=1
+ ( 0x41, 0x14 ), # AL=0x47, AF=1 CF=0
+ ( 0xe1, 0x95 ), # AL=0x47, AF=1 CF=1
+ ( 0x48, 0x04 ), # AL=0x48, AF=0 CF=0
+ ( 0xe8, 0x85 ), # AL=0x48, AF=0 CF=1
+ ( 0x42, 0x14 ), # AL=0x48, AF=1 CF=0
+ ( 0xe2, 0x95 ), # AL=0x48, AF=1 CF=1
+ ( 0x49, 0x00 ), # AL=0x49, AF=0 CF=0
+ ( 0xe9, 0x81 ), # AL=0x49, AF=0 CF=1
+ ( 0x43, 0x10 ), # AL=0x49, AF=1 CF=0
+ ( 0xe3, 0x91 ), # AL=0x49, AF=1 CF=1
+ ( 0x44, 0x14 ), # AL=0x4a, AF=0 CF=0
+ ( 0xe4, 0x95 ), # AL=0x4a, AF=0 CF=1
+ ( 0x44, 0x14 ), # AL=0x4a, AF=1 CF=0
+ ( 0xe4, 0x95 ), # AL=0x4a, AF=1 CF=1
+ ( 0x45, 0x10 ), # AL=0x4b, AF=0 CF=0
+ ( 0xe5, 0x91 ), # AL=0x4b, AF=0 CF=1
+ ( 0x45, 0x10 ), # AL=0x4b, AF=1 CF=0
+ ( 0xe5, 0x91 ), # AL=0x4b, AF=1 CF=1
+ ( 0x46, 0x10 ), # AL=0x4c, AF=0 CF=0
+ ( 0xe6, 0x91 ), # AL=0x4c, AF=0 CF=1
+ ( 0x46, 0x10 ), # AL=0x4c, AF=1 CF=0
+ ( 0xe6, 0x91 ), # AL=0x4c, AF=1 CF=1
+ ( 0x47, 0x14 ), # AL=0x4d, AF=0 CF=0
+ ( 0xe7, 0x95 ), # AL=0x4d, AF=0 CF=1
+ ( 0x47, 0x14 ), # AL=0x4d, AF=1 CF=0
+ ( 0xe7, 0x95 ), # AL=0x4d, AF=1 CF=1
+ ( 0x48, 0x14 ), # AL=0x4e, AF=0 CF=0
+ ( 0xe8, 0x95 ), # AL=0x4e, AF=0 CF=1
+ ( 0x48, 0x14 ), # AL=0x4e, AF=1 CF=0
+ ( 0xe8, 0x95 ), # AL=0x4e, AF=1 CF=1
+ ( 0x49, 0x10 ), # AL=0x4f, AF=0 CF=0
+ ( 0xe9, 0x91 ), # AL=0x4f, AF=0 CF=1
+ ( 0x49, 0x10 ), # AL=0x4f, AF=1 CF=0
+ ( 0xe9, 0x91 ), # AL=0x4f, AF=1 CF=1
+ ( 0x50, 0x04 ), # AL=0x50, AF=0 CF=0
+ ( 0xf0, 0x85 ), # AL=0x50, AF=0 CF=1
+ ( 0x4a, 0x10 ), # AL=0x50, AF=1 CF=0
+ ( 0xea, 0x91 ), # AL=0x50, AF=1 CF=1
+ ( 0x51, 0x00 ), # AL=0x51, AF=0 CF=0
+ ( 0xf1, 0x81 ), # AL=0x51, AF=0 CF=1
+ ( 0x4b, 0x14 ), # AL=0x51, AF=1 CF=0
+ ( 0xeb, 0x95 ), # AL=0x51, AF=1 CF=1
+ ( 0x52, 0x00 ), # AL=0x52, AF=0 CF=0
+ ( 0xf2, 0x81 ), # AL=0x52, AF=0 CF=1
+ ( 0x4c, 0x10 ), # AL=0x52, AF=1 CF=0
+ ( 0xec, 0x91 ), # AL=0x52, AF=1 CF=1
+ ( 0x53, 0x04 ), # AL=0x53, AF=0 CF=0
+ ( 0xf3, 0x85 ), # AL=0x53, AF=0 CF=1
+ ( 0x4d, 0x14 ), # AL=0x53, AF=1 CF=0
+ ( 0xed, 0x95 ), # AL=0x53, AF=1 CF=1
+ ( 0x54, 0x00 ), # AL=0x54, AF=0 CF=0
+ ( 0xf4, 0x81 ), # AL=0x54, AF=0 CF=1
+ ( 0x4e, 0x14 ), # AL=0x54, AF=1 CF=0
+ ( 0xee, 0x95 ), # AL=0x54, AF=1 CF=1
+ ( 0x55, 0x04 ), # AL=0x55, AF=0 CF=0
+ ( 0xf5, 0x85 ), # AL=0x55, AF=0 CF=1
+ ( 0x4f, 0x10 ), # AL=0x55, AF=1 CF=0
+ ( 0xef, 0x91 ), # AL=0x55, AF=1 CF=1
+ ( 0x56, 0x04 ), # AL=0x56, AF=0 CF=0
+ ( 0xf6, 0x85 ), # AL=0x56, AF=0 CF=1
+ ( 0x50, 0x14 ), # AL=0x56, AF=1 CF=0
+ ( 0xf0, 0x95 ), # AL=0x56, AF=1 CF=1
+ ( 0x57, 0x00 ), # AL=0x57, AF=0 CF=0
+ ( 0xf7, 0x81 ), # AL=0x57, AF=0 CF=1
+ ( 0x51, 0x10 ), # AL=0x57, AF=1 CF=0
+ ( 0xf1, 0x91 ), # AL=0x57, AF=1 CF=1
+ ( 0x58, 0x00 ), # AL=0x58, AF=0 CF=0
+ ( 0xf8, 0x81 ), # AL=0x58, AF=0 CF=1
+ ( 0x52, 0x10 ), # AL=0x58, AF=1 CF=0
+ ( 0xf2, 0x91 ), # AL=0x58, AF=1 CF=1
+ ( 0x59, 0x04 ), # AL=0x59, AF=0 CF=0
+ ( 0xf9, 0x85 ), # AL=0x59, AF=0 CF=1
+ ( 0x53, 0x14 ), # AL=0x59, AF=1 CF=0
+ ( 0xf3, 0x95 ), # AL=0x59, AF=1 CF=1
+ ( 0x54, 0x10 ), # AL=0x5a, AF=0 CF=0
+ ( 0xf4, 0x91 ), # AL=0x5a, AF=0 CF=1
+ ( 0x54, 0x10 ), # AL=0x5a, AF=1 CF=0
+ ( 0xf4, 0x91 ), # AL=0x5a, AF=1 CF=1
+ ( 0x55, 0x14 ), # AL=0x5b, AF=0 CF=0
+ ( 0xf5, 0x95 ), # AL=0x5b, AF=0 CF=1
+ ( 0x55, 0x14 ), # AL=0x5b, AF=1 CF=0
+ ( 0xf5, 0x95 ), # AL=0x5b, AF=1 CF=1
+ ( 0x56, 0x14 ), # AL=0x5c, AF=0 CF=0
+ ( 0xf6, 0x95 ), # AL=0x5c, AF=0 CF=1
+ ( 0x56, 0x14 ), # AL=0x5c, AF=1 CF=0
+ ( 0xf6, 0x95 ), # AL=0x5c, AF=1 CF=1
+ ( 0x57, 0x10 ), # AL=0x5d, AF=0 CF=0
+ ( 0xf7, 0x91 ), # AL=0x5d, AF=0 CF=1
+ ( 0x57, 0x10 ), # AL=0x5d, AF=1 CF=0
+ ( 0xf7, 0x91 ), # AL=0x5d, AF=1 CF=1
+ ( 0x58, 0x10 ), # AL=0x5e, AF=0 CF=0
+ ( 0xf8, 0x91 ), # AL=0x5e, AF=0 CF=1
+ ( 0x58, 0x10 ), # AL=0x5e, AF=1 CF=0
+ ( 0xf8, 0x91 ), # AL=0x5e, AF=1 CF=1
+ ( 0x59, 0x14 ), # AL=0x5f, AF=0 CF=0
+ ( 0xf9, 0x95 ), # AL=0x5f, AF=0 CF=1
+ ( 0x59, 0x14 ), # AL=0x5f, AF=1 CF=0
+ ( 0xf9, 0x95 ), # AL=0x5f, AF=1 CF=1
+ ( 0x60, 0x04 ), # AL=0x60, AF=0 CF=0
+ ( 0x00, 0x45 ), # AL=0x60, AF=0 CF=1
+ ( 0x5a, 0x14 ), # AL=0x60, AF=1 CF=0
+ ( 0xfa, 0x95 ), # AL=0x60, AF=1 CF=1
+ ( 0x61, 0x00 ), # AL=0x61, AF=0 CF=0
+ ( 0x01, 0x01 ), # AL=0x61, AF=0 CF=1
+ ( 0x5b, 0x10 ), # AL=0x61, AF=1 CF=0
+ ( 0xfb, 0x91 ), # AL=0x61, AF=1 CF=1
+ ( 0x62, 0x00 ), # AL=0x62, AF=0 CF=0
+ ( 0x02, 0x01 ), # AL=0x62, AF=0 CF=1
+ ( 0x5c, 0x14 ), # AL=0x62, AF=1 CF=0
+ ( 0xfc, 0x95 ), # AL=0x62, AF=1 CF=1
+ ( 0x63, 0x04 ), # AL=0x63, AF=0 CF=0
+ ( 0x03, 0x05 ), # AL=0x63, AF=0 CF=1
+ ( 0x5d, 0x10 ), # AL=0x63, AF=1 CF=0
+ ( 0xfd, 0x91 ), # AL=0x63, AF=1 CF=1
+ ( 0x64, 0x00 ), # AL=0x64, AF=0 CF=0
+ ( 0x04, 0x01 ), # AL=0x64, AF=0 CF=1
+ ( 0x5e, 0x10 ), # AL=0x64, AF=1 CF=0
+ ( 0xfe, 0x91 ), # AL=0x64, AF=1 CF=1
+ ( 0x65, 0x04 ), # AL=0x65, AF=0 CF=0
+ ( 0x05, 0x05 ), # AL=0x65, AF=0 CF=1
+ ( 0x5f, 0x14 ), # AL=0x65, AF=1 CF=0
+ ( 0xff, 0x95 ), # AL=0x65, AF=1 CF=1
+ ( 0x66, 0x04 ), # AL=0x66, AF=0 CF=0
+ ( 0x06, 0x05 ), # AL=0x66, AF=0 CF=1
+ ( 0x60, 0x14 ), # AL=0x66, AF=1 CF=0
+ ( 0x00, 0x55 ), # AL=0x66, AF=1 CF=1
+ ( 0x67, 0x00 ), # AL=0x67, AF=0 CF=0
+ ( 0x07, 0x01 ), # AL=0x67, AF=0 CF=1
+ ( 0x61, 0x10 ), # AL=0x67, AF=1 CF=0
+ ( 0x01, 0x11 ), # AL=0x67, AF=1 CF=1
+ ( 0x68, 0x00 ), # AL=0x68, AF=0 CF=0
+ ( 0x08, 0x01 ), # AL=0x68, AF=0 CF=1
+ ( 0x62, 0x10 ), # AL=0x68, AF=1 CF=0
+ ( 0x02, 0x11 ), # AL=0x68, AF=1 CF=1
+ ( 0x69, 0x04 ), # AL=0x69, AF=0 CF=0
+ ( 0x09, 0x05 ), # AL=0x69, AF=0 CF=1
+ ( 0x63, 0x14 ), # AL=0x69, AF=1 CF=0
+ ( 0x03, 0x15 ), # AL=0x69, AF=1 CF=1
+ ( 0x64, 0x10 ), # AL=0x6a, AF=0 CF=0
+ ( 0x04, 0x11 ), # AL=0x6a, AF=0 CF=1
+ ( 0x64, 0x10 ), # AL=0x6a, AF=1 CF=0
+ ( 0x04, 0x11 ), # AL=0x6a, AF=1 CF=1
+ ( 0x65, 0x14 ), # AL=0x6b, AF=0 CF=0
+ ( 0x05, 0x15 ), # AL=0x6b, AF=0 CF=1
+ ( 0x65, 0x14 ), # AL=0x6b, AF=1 CF=0
+ ( 0x05, 0x15 ), # AL=0x6b, AF=1 CF=1
+ ( 0x66, 0x14 ), # AL=0x6c, AF=0 CF=0
+ ( 0x06, 0x15 ), # AL=0x6c, AF=0 CF=1
+ ( 0x66, 0x14 ), # AL=0x6c, AF=1 CF=0
+ ( 0x06, 0x15 ), # AL=0x6c, AF=1 CF=1
+ ( 0x67, 0x10 ), # AL=0x6d, AF=0 CF=0
+ ( 0x07, 0x11 ), # AL=0x6d, AF=0 CF=1
+ ( 0x67, 0x10 ), # AL=0x6d, AF=1 CF=0
+ ( 0x07, 0x11 ), # AL=0x6d, AF=1 CF=1
+ ( 0x68, 0x10 ), # AL=0x6e, AF=0 CF=0
+ ( 0x08, 0x11 ), # AL=0x6e, AF=0 CF=1
+ ( 0x68, 0x10 ), # AL=0x6e, AF=1 CF=0
+ ( 0x08, 0x11 ), # AL=0x6e, AF=1 CF=1
+ ( 0x69, 0x14 ), # AL=0x6f, AF=0 CF=0
+ ( 0x09, 0x15 ), # AL=0x6f, AF=0 CF=1
+ ( 0x69, 0x14 ), # AL=0x6f, AF=1 CF=0
+ ( 0x09, 0x15 ), # AL=0x6f, AF=1 CF=1
+ ( 0x70, 0x00 ), # AL=0x70, AF=0 CF=0
+ ( 0x10, 0x01 ), # AL=0x70, AF=0 CF=1
+ ( 0x6a, 0x14 ), # AL=0x70, AF=1 CF=0
+ ( 0x0a, 0x15 ), # AL=0x70, AF=1 CF=1
+ ( 0x71, 0x04 ), # AL=0x71, AF=0 CF=0
+ ( 0x11, 0x05 ), # AL=0x71, AF=0 CF=1
+ ( 0x6b, 0x10 ), # AL=0x71, AF=1 CF=0
+ ( 0x0b, 0x11 ), # AL=0x71, AF=1 CF=1
+ ( 0x72, 0x04 ), # AL=0x72, AF=0 CF=0
+ ( 0x12, 0x05 ), # AL=0x72, AF=0 CF=1
+ ( 0x6c, 0x14 ), # AL=0x72, AF=1 CF=0
+ ( 0x0c, 0x15 ), # AL=0x72, AF=1 CF=1
+ ( 0x73, 0x00 ), # AL=0x73, AF=0 CF=0
+ ( 0x13, 0x01 ), # AL=0x73, AF=0 CF=1
+ ( 0x6d, 0x10 ), # AL=0x73, AF=1 CF=0
+ ( 0x0d, 0x11 ), # AL=0x73, AF=1 CF=1
+ ( 0x74, 0x04 ), # AL=0x74, AF=0 CF=0
+ ( 0x14, 0x05 ), # AL=0x74, AF=0 CF=1
+ ( 0x6e, 0x10 ), # AL=0x74, AF=1 CF=0
+ ( 0x0e, 0x11 ), # AL=0x74, AF=1 CF=1
+ ( 0x75, 0x00 ), # AL=0x75, AF=0 CF=0
+ ( 0x15, 0x01 ), # AL=0x75, AF=0 CF=1
+ ( 0x6f, 0x14 ), # AL=0x75, AF=1 CF=0
+ ( 0x0f, 0x15 ), # AL=0x75, AF=1 CF=1
+ ( 0x76, 0x00 ), # AL=0x76, AF=0 CF=0
+ ( 0x16, 0x01 ), # AL=0x76, AF=0 CF=1
+ ( 0x70, 0x10 ), # AL=0x76, AF=1 CF=0
+ ( 0x10, 0x11 ), # AL=0x76, AF=1 CF=1
+ ( 0x77, 0x04 ), # AL=0x77, AF=0 CF=0
+ ( 0x17, 0x05 ), # AL=0x77, AF=0 CF=1
+ ( 0x71, 0x14 ), # AL=0x77, AF=1 CF=0
+ ( 0x11, 0x15 ), # AL=0x77, AF=1 CF=1
+ ( 0x78, 0x04 ), # AL=0x78, AF=0 CF=0
+ ( 0x18, 0x05 ), # AL=0x78, AF=0 CF=1
+ ( 0x72, 0x14 ), # AL=0x78, AF=1 CF=0
+ ( 0x12, 0x15 ), # AL=0x78, AF=1 CF=1
+ ( 0x79, 0x00 ), # AL=0x79, AF=0 CF=0
+ ( 0x19, 0x01 ), # AL=0x79, AF=0 CF=1
+ ( 0x73, 0x10 ), # AL=0x79, AF=1 CF=0
+ ( 0x13, 0x11 ), # AL=0x79, AF=1 CF=1
+ ( 0x74, 0x14 ), # AL=0x7a, AF=0 CF=0
+ ( 0x14, 0x15 ), # AL=0x7a, AF=0 CF=1
+ ( 0x74, 0x14 ), # AL=0x7a, AF=1 CF=0
+ ( 0x14, 0x15 ), # AL=0x7a, AF=1 CF=1
+ ( 0x75, 0x10 ), # AL=0x7b, AF=0 CF=0
+ ( 0x15, 0x11 ), # AL=0x7b, AF=0 CF=1
+ ( 0x75, 0x10 ), # AL=0x7b, AF=1 CF=0
+ ( 0x15, 0x11 ), # AL=0x7b, AF=1 CF=1
+ ( 0x76, 0x10 ), # AL=0x7c, AF=0 CF=0
+ ( 0x16, 0x11 ), # AL=0x7c, AF=0 CF=1
+ ( 0x76, 0x10 ), # AL=0x7c, AF=1 CF=0
+ ( 0x16, 0x11 ), # AL=0x7c, AF=1 CF=1
+ ( 0x77, 0x14 ), # AL=0x7d, AF=0 CF=0
+ ( 0x17, 0x15 ), # AL=0x7d, AF=0 CF=1
+ ( 0x77, 0x14 ), # AL=0x7d, AF=1 CF=0
+ ( 0x17, 0x15 ), # AL=0x7d, AF=1 CF=1
+ ( 0x78, 0x14 ), # AL=0x7e, AF=0 CF=0
+ ( 0x18, 0x15 ), # AL=0x7e, AF=0 CF=1
+ ( 0x78, 0x14 ), # AL=0x7e, AF=1 CF=0
+ ( 0x18, 0x15 ), # AL=0x7e, AF=1 CF=1
+ ( 0x79, 0x10 ), # AL=0x7f, AF=0 CF=0
+ ( 0x19, 0x11 ), # AL=0x7f, AF=0 CF=1
+ ( 0x79, 0x10 ), # AL=0x7f, AF=1 CF=0
+ ( 0x19, 0x11 ), # AL=0x7f, AF=1 CF=1
+ ( 0x80, 0x80 ), # AL=0x80, AF=0 CF=0
+ ( 0x20, 0x01 ), # AL=0x80, AF=0 CF=1
+ ( 0x7a, 0x10 ), # AL=0x80, AF=1 CF=0
+ ( 0x1a, 0x11 ), # AL=0x80, AF=1 CF=1
+ ( 0x81, 0x84 ), # AL=0x81, AF=0 CF=0
+ ( 0x21, 0x05 ), # AL=0x81, AF=0 CF=1
+ ( 0x7b, 0x14 ), # AL=0x81, AF=1 CF=0
+ ( 0x1b, 0x15 ), # AL=0x81, AF=1 CF=1
+ ( 0x82, 0x84 ), # AL=0x82, AF=0 CF=0
+ ( 0x22, 0x05 ), # AL=0x82, AF=0 CF=1
+ ( 0x7c, 0x10 ), # AL=0x82, AF=1 CF=0
+ ( 0x1c, 0x11 ), # AL=0x82, AF=1 CF=1
+ ( 0x83, 0x80 ), # AL=0x83, AF=0 CF=0
+ ( 0x23, 0x01 ), # AL=0x83, AF=0 CF=1
+ ( 0x7d, 0x14 ), # AL=0x83, AF=1 CF=0
+ ( 0x1d, 0x15 ), # AL=0x83, AF=1 CF=1
+ ( 0x84, 0x84 ), # AL=0x84, AF=0 CF=0
+ ( 0x24, 0x05 ), # AL=0x84, AF=0 CF=1
+ ( 0x7e, 0x14 ), # AL=0x84, AF=1 CF=0
+ ( 0x1e, 0x15 ), # AL=0x84, AF=1 CF=1
+ ( 0x85, 0x80 ), # AL=0x85, AF=0 CF=0
+ ( 0x25, 0x01 ), # AL=0x85, AF=0 CF=1
+ ( 0x7f, 0x10 ), # AL=0x85, AF=1 CF=0
+ ( 0x1f, 0x11 ), # AL=0x85, AF=1 CF=1
+ ( 0x86, 0x80 ), # AL=0x86, AF=0 CF=0
+ ( 0x26, 0x01 ), # AL=0x86, AF=0 CF=1
+ ( 0x80, 0x90 ), # AL=0x86, AF=1 CF=0
+ ( 0x20, 0x11 ), # AL=0x86, AF=1 CF=1
+ ( 0x87, 0x84 ), # AL=0x87, AF=0 CF=0
+ ( 0x27, 0x05 ), # AL=0x87, AF=0 CF=1
+ ( 0x81, 0x94 ), # AL=0x87, AF=1 CF=0
+ ( 0x21, 0x15 ), # AL=0x87, AF=1 CF=1
+ ( 0x88, 0x84 ), # AL=0x88, AF=0 CF=0
+ ( 0x28, 0x05 ), # AL=0x88, AF=0 CF=1
+ ( 0x82, 0x94 ), # AL=0x88, AF=1 CF=0
+ ( 0x22, 0x15 ), # AL=0x88, AF=1 CF=1
+ ( 0x89, 0x80 ), # AL=0x89, AF=0 CF=0
+ ( 0x29, 0x01 ), # AL=0x89, AF=0 CF=1
+ ( 0x83, 0x90 ), # AL=0x89, AF=1 CF=0
+ ( 0x23, 0x11 ), # AL=0x89, AF=1 CF=1
+ ( 0x84, 0x94 ), # AL=0x8a, AF=0 CF=0
+ ( 0x24, 0x15 ), # AL=0x8a, AF=0 CF=1
+ ( 0x84, 0x94 ), # AL=0x8a, AF=1 CF=0
+ ( 0x24, 0x15 ), # AL=0x8a, AF=1 CF=1
+ ( 0x85, 0x90 ), # AL=0x8b, AF=0 CF=0
+ ( 0x25, 0x11 ), # AL=0x8b, AF=0 CF=1
+ ( 0x85, 0x90 ), # AL=0x8b, AF=1 CF=0
+ ( 0x25, 0x11 ), # AL=0x8b, AF=1 CF=1
+ ( 0x86, 0x90 ), # AL=0x8c, AF=0 CF=0
+ ( 0x26, 0x11 ), # AL=0x8c, AF=0 CF=1
+ ( 0x86, 0x90 ), # AL=0x8c, AF=1 CF=0
+ ( 0x26, 0x11 ), # AL=0x8c, AF=1 CF=1
+ ( 0x87, 0x94 ), # AL=0x8d, AF=0 CF=0
+ ( 0x27, 0x15 ), # AL=0x8d, AF=0 CF=1
+ ( 0x87, 0x94 ), # AL=0x8d, AF=1 CF=0
+ ( 0x27, 0x15 ), # AL=0x8d, AF=1 CF=1
+ ( 0x88, 0x94 ), # AL=0x8e, AF=0 CF=0
+ ( 0x28, 0x15 ), # AL=0x8e, AF=0 CF=1
+ ( 0x88, 0x94 ), # AL=0x8e, AF=1 CF=0
+ ( 0x28, 0x15 ), # AL=0x8e, AF=1 CF=1
+ ( 0x89, 0x90 ), # AL=0x8f, AF=0 CF=0
+ ( 0x29, 0x11 ), # AL=0x8f, AF=0 CF=1
+ ( 0x89, 0x90 ), # AL=0x8f, AF=1 CF=0
+ ( 0x29, 0x11 ), # AL=0x8f, AF=1 CF=1
+ ( 0x90, 0x84 ), # AL=0x90, AF=0 CF=0
+ ( 0x30, 0x05 ), # AL=0x90, AF=0 CF=1
+ ( 0x8a, 0x90 ), # AL=0x90, AF=1 CF=0
+ ( 0x2a, 0x11 ), # AL=0x90, AF=1 CF=1
+ ( 0x91, 0x80 ), # AL=0x91, AF=0 CF=0
+ ( 0x31, 0x01 ), # AL=0x91, AF=0 CF=1
+ ( 0x8b, 0x94 ), # AL=0x91, AF=1 CF=0
+ ( 0x2b, 0x15 ), # AL=0x91, AF=1 CF=1
+ ( 0x92, 0x80 ), # AL=0x92, AF=0 CF=0
+ ( 0x32, 0x01 ), # AL=0x92, AF=0 CF=1
+ ( 0x8c, 0x90 ), # AL=0x92, AF=1 CF=0
+ ( 0x2c, 0x11 ), # AL=0x92, AF=1 CF=1
+ ( 0x93, 0x84 ), # AL=0x93, AF=0 CF=0
+ ( 0x33, 0x05 ), # AL=0x93, AF=0 CF=1
+ ( 0x8d, 0x94 ), # AL=0x93, AF=1 CF=0
+ ( 0x2d, 0x15 ), # AL=0x93, AF=1 CF=1
+ ( 0x94, 0x80 ), # AL=0x94, AF=0 CF=0
+ ( 0x34, 0x01 ), # AL=0x94, AF=0 CF=1
+ ( 0x8e, 0x94 ), # AL=0x94, AF=1 CF=0
+ ( 0x2e, 0x15 ), # AL=0x94, AF=1 CF=1
+ ( 0x95, 0x84 ), # AL=0x95, AF=0 CF=0
+ ( 0x35, 0x05 ), # AL=0x95, AF=0 CF=1
+ ( 0x8f, 0x90 ), # AL=0x95, AF=1 CF=0
+ ( 0x2f, 0x11 ), # AL=0x95, AF=1 CF=1
+ ( 0x96, 0x84 ), # AL=0x96, AF=0 CF=0
+ ( 0x36, 0x05 ), # AL=0x96, AF=0 CF=1
+ ( 0x90, 0x94 ), # AL=0x96, AF=1 CF=0
+ ( 0x30, 0x15 ), # AL=0x96, AF=1 CF=1
+ ( 0x97, 0x80 ), # AL=0x97, AF=0 CF=0
+ ( 0x37, 0x01 ), # AL=0x97, AF=0 CF=1
+ ( 0x91, 0x90 ), # AL=0x97, AF=1 CF=0
+ ( 0x31, 0x11 ), # AL=0x97, AF=1 CF=1
+ ( 0x98, 0x80 ), # AL=0x98, AF=0 CF=0
+ ( 0x38, 0x01 ), # AL=0x98, AF=0 CF=1
+ ( 0x92, 0x90 ), # AL=0x98, AF=1 CF=0
+ ( 0x32, 0x11 ), # AL=0x98, AF=1 CF=1
+ ( 0x99, 0x84 ), # AL=0x99, AF=0 CF=0
+ ( 0x39, 0x05 ), # AL=0x99, AF=0 CF=1
+ ( 0x93, 0x94 ), # AL=0x99, AF=1 CF=0
+ ( 0x33, 0x15 ), # AL=0x99, AF=1 CF=1
+ ( 0x34, 0x11 ), # AL=0x9a, AF=0 CF=0
+ ( 0x34, 0x11 ), # AL=0x9a, AF=0 CF=1
+ ( 0x34, 0x11 ), # AL=0x9a, AF=1 CF=0
+ ( 0x34, 0x11 ), # AL=0x9a, AF=1 CF=1
+ ( 0x35, 0x15 ), # AL=0x9b, AF=0 CF=0
+ ( 0x35, 0x15 ), # AL=0x9b, AF=0 CF=1
+ ( 0x35, 0x15 ), # AL=0x9b, AF=1 CF=0
+ ( 0x35, 0x15 ), # AL=0x9b, AF=1 CF=1
+ ( 0x36, 0x15 ), # AL=0x9c, AF=0 CF=0
+ ( 0x36, 0x15 ), # AL=0x9c, AF=0 CF=1
+ ( 0x36, 0x15 ), # AL=0x9c, AF=1 CF=0
+ ( 0x36, 0x15 ), # AL=0x9c, AF=1 CF=1
+ ( 0x37, 0x11 ), # AL=0x9d, AF=0 CF=0
+ ( 0x37, 0x11 ), # AL=0x9d, AF=0 CF=1
+ ( 0x37, 0x11 ), # AL=0x9d, AF=1 CF=0
+ ( 0x37, 0x11 ), # AL=0x9d, AF=1 CF=1
+ ( 0x38, 0x11 ), # AL=0x9e, AF=0 CF=0
+ ( 0x38, 0x11 ), # AL=0x9e, AF=0 CF=1
+ ( 0x38, 0x11 ), # AL=0x9e, AF=1 CF=0
+ ( 0x38, 0x11 ), # AL=0x9e, AF=1 CF=1
+ ( 0x39, 0x15 ), # AL=0x9f, AF=0 CF=0
+ ( 0x39, 0x15 ), # AL=0x9f, AF=0 CF=1
+ ( 0x39, 0x15 ), # AL=0x9f, AF=1 CF=0
+ ( 0x39, 0x15 ), # AL=0x9f, AF=1 CF=1
+ ( 0x40, 0x01 ), # AL=0xa0, AF=0 CF=0
+ ( 0x40, 0x01 ), # AL=0xa0, AF=0 CF=1
+ ( 0x3a, 0x15 ), # AL=0xa0, AF=1 CF=0
+ ( 0x3a, 0x15 ), # AL=0xa0, AF=1 CF=1
+ ( 0x41, 0x05 ), # AL=0xa1, AF=0 CF=0
+ ( 0x41, 0x05 ), # AL=0xa1, AF=0 CF=1
+ ( 0x3b, 0x11 ), # AL=0xa1, AF=1 CF=0
+ ( 0x3b, 0x11 ), # AL=0xa1, AF=1 CF=1
+ ( 0x42, 0x05 ), # AL=0xa2, AF=0 CF=0
+ ( 0x42, 0x05 ), # AL=0xa2, AF=0 CF=1
+ ( 0x3c, 0x15 ), # AL=0xa2, AF=1 CF=0
+ ( 0x3c, 0x15 ), # AL=0xa2, AF=1 CF=1
+ ( 0x43, 0x01 ), # AL=0xa3, AF=0 CF=0
+ ( 0x43, 0x01 ), # AL=0xa3, AF=0 CF=1
+ ( 0x3d, 0x11 ), # AL=0xa3, AF=1 CF=0
+ ( 0x3d, 0x11 ), # AL=0xa3, AF=1 CF=1
+ ( 0x44, 0x05 ), # AL=0xa4, AF=0 CF=0
+ ( 0x44, 0x05 ), # AL=0xa4, AF=0 CF=1
+ ( 0x3e, 0x11 ), # AL=0xa4, AF=1 CF=0
+ ( 0x3e, 0x11 ), # AL=0xa4, AF=1 CF=1
+ ( 0x45, 0x01 ), # AL=0xa5, AF=0 CF=0
+ ( 0x45, 0x01 ), # AL=0xa5, AF=0 CF=1
+ ( 0x3f, 0x15 ), # AL=0xa5, AF=1 CF=0
+ ( 0x3f, 0x15 ), # AL=0xa5, AF=1 CF=1
+ ( 0x46, 0x01 ), # AL=0xa6, AF=0 CF=0
+ ( 0x46, 0x01 ), # AL=0xa6, AF=0 CF=1
+ ( 0x40, 0x11 ), # AL=0xa6, AF=1 CF=0
+ ( 0x40, 0x11 ), # AL=0xa6, AF=1 CF=1
+ ( 0x47, 0x05 ), # AL=0xa7, AF=0 CF=0
+ ( 0x47, 0x05 ), # AL=0xa7, AF=0 CF=1
+ ( 0x41, 0x15 ), # AL=0xa7, AF=1 CF=0
+ ( 0x41, 0x15 ), # AL=0xa7, AF=1 CF=1
+ ( 0x48, 0x05 ), # AL=0xa8, AF=0 CF=0
+ ( 0x48, 0x05 ), # AL=0xa8, AF=0 CF=1
+ ( 0x42, 0x15 ), # AL=0xa8, AF=1 CF=0
+ ( 0x42, 0x15 ), # AL=0xa8, AF=1 CF=1
+ ( 0x49, 0x01 ), # AL=0xa9, AF=0 CF=0
+ ( 0x49, 0x01 ), # AL=0xa9, AF=0 CF=1
+ ( 0x43, 0x11 ), # AL=0xa9, AF=1 CF=0
+ ( 0x43, 0x11 ), # AL=0xa9, AF=1 CF=1
+ ( 0x44, 0x15 ), # AL=0xaa, AF=0 CF=0
+ ( 0x44, 0x15 ), # AL=0xaa, AF=0 CF=1
+ ( 0x44, 0x15 ), # AL=0xaa, AF=1 CF=0
+ ( 0x44, 0x15 ), # AL=0xaa, AF=1 CF=1
+ ( 0x45, 0x11 ), # AL=0xab, AF=0 CF=0
+ ( 0x45, 0x11 ), # AL=0xab, AF=0 CF=1
+ ( 0x45, 0x11 ), # AL=0xab, AF=1 CF=0
+ ( 0x45, 0x11 ), # AL=0xab, AF=1 CF=1
+ ( 0x46, 0x11 ), # AL=0xac, AF=0 CF=0
+ ( 0x46, 0x11 ), # AL=0xac, AF=0 CF=1
+ ( 0x46, 0x11 ), # AL=0xac, AF=1 CF=0
+ ( 0x46, 0x11 ), # AL=0xac, AF=1 CF=1
+ ( 0x47, 0x15 ), # AL=0xad, AF=0 CF=0
+ ( 0x47, 0x15 ), # AL=0xad, AF=0 CF=1
+ ( 0x47, 0x15 ), # AL=0xad, AF=1 CF=0
+ ( 0x47, 0x15 ), # AL=0xad, AF=1 CF=1
+ ( 0x48, 0x15 ), # AL=0xae, AF=0 CF=0
+ ( 0x48, 0x15 ), # AL=0xae, AF=0 CF=1
+ ( 0x48, 0x15 ), # AL=0xae, AF=1 CF=0
+ ( 0x48, 0x15 ), # AL=0xae, AF=1 CF=1
+ ( 0x49, 0x11 ), # AL=0xaf, AF=0 CF=0
+ ( 0x49, 0x11 ), # AL=0xaf, AF=0 CF=1
+ ( 0x49, 0x11 ), # AL=0xaf, AF=1 CF=0
+ ( 0x49, 0x11 ), # AL=0xaf, AF=1 CF=1
+ ( 0x50, 0x05 ), # AL=0xb0, AF=0 CF=0
+ ( 0x50, 0x05 ), # AL=0xb0, AF=0 CF=1
+ ( 0x4a, 0x11 ), # AL=0xb0, AF=1 CF=0
+ ( 0x4a, 0x11 ), # AL=0xb0, AF=1 CF=1
+ ( 0x51, 0x01 ), # AL=0xb1, AF=0 CF=0
+ ( 0x51, 0x01 ), # AL=0xb1, AF=0 CF=1
+ ( 0x4b, 0x15 ), # AL=0xb1, AF=1 CF=0
+ ( 0x4b, 0x15 ), # AL=0xb1, AF=1 CF=1
+ ( 0x52, 0x01 ), # AL=0xb2, AF=0 CF=0
+ ( 0x52, 0x01 ), # AL=0xb2, AF=0 CF=1
+ ( 0x4c, 0x11 ), # AL=0xb2, AF=1 CF=0
+ ( 0x4c, 0x11 ), # AL=0xb2, AF=1 CF=1
+ ( 0x53, 0x05 ), # AL=0xb3, AF=0 CF=0
+ ( 0x53, 0x05 ), # AL=0xb3, AF=0 CF=1
+ ( 0x4d, 0x15 ), # AL=0xb3, AF=1 CF=0
+ ( 0x4d, 0x15 ), # AL=0xb3, AF=1 CF=1
+ ( 0x54, 0x01 ), # AL=0xb4, AF=0 CF=0
+ ( 0x54, 0x01 ), # AL=0xb4, AF=0 CF=1
+ ( 0x4e, 0x15 ), # AL=0xb4, AF=1 CF=0
+ ( 0x4e, 0x15 ), # AL=0xb4, AF=1 CF=1
+ ( 0x55, 0x05 ), # AL=0xb5, AF=0 CF=0
+ ( 0x55, 0x05 ), # AL=0xb5, AF=0 CF=1
+ ( 0x4f, 0x11 ), # AL=0xb5, AF=1 CF=0
+ ( 0x4f, 0x11 ), # AL=0xb5, AF=1 CF=1
+ ( 0x56, 0x05 ), # AL=0xb6, AF=0 CF=0
+ ( 0x56, 0x05 ), # AL=0xb6, AF=0 CF=1
+ ( 0x50, 0x15 ), # AL=0xb6, AF=1 CF=0
+ ( 0x50, 0x15 ), # AL=0xb6, AF=1 CF=1
+ ( 0x57, 0x01 ), # AL=0xb7, AF=0 CF=0
+ ( 0x57, 0x01 ), # AL=0xb7, AF=0 CF=1
+ ( 0x51, 0x11 ), # AL=0xb7, AF=1 CF=0
+ ( 0x51, 0x11 ), # AL=0xb7, AF=1 CF=1
+ ( 0x58, 0x01 ), # AL=0xb8, AF=0 CF=0
+ ( 0x58, 0x01 ), # AL=0xb8, AF=0 CF=1
+ ( 0x52, 0x11 ), # AL=0xb8, AF=1 CF=0
+ ( 0x52, 0x11 ), # AL=0xb8, AF=1 CF=1
+ ( 0x59, 0x05 ), # AL=0xb9, AF=0 CF=0
+ ( 0x59, 0x05 ), # AL=0xb9, AF=0 CF=1
+ ( 0x53, 0x15 ), # AL=0xb9, AF=1 CF=0
+ ( 0x53, 0x15 ), # AL=0xb9, AF=1 CF=1
+ ( 0x54, 0x11 ), # AL=0xba, AF=0 CF=0
+ ( 0x54, 0x11 ), # AL=0xba, AF=0 CF=1
+ ( 0x54, 0x11 ), # AL=0xba, AF=1 CF=0
+ ( 0x54, 0x11 ), # AL=0xba, AF=1 CF=1
+ ( 0x55, 0x15 ), # AL=0xbb, AF=0 CF=0
+ ( 0x55, 0x15 ), # AL=0xbb, AF=0 CF=1
+ ( 0x55, 0x15 ), # AL=0xbb, AF=1 CF=0
+ ( 0x55, 0x15 ), # AL=0xbb, AF=1 CF=1
+ ( 0x56, 0x15 ), # AL=0xbc, AF=0 CF=0
+ ( 0x56, 0x15 ), # AL=0xbc, AF=0 CF=1
+ ( 0x56, 0x15 ), # AL=0xbc, AF=1 CF=0
+ ( 0x56, 0x15 ), # AL=0xbc, AF=1 CF=1
+ ( 0x57, 0x11 ), # AL=0xbd, AF=0 CF=0
+ ( 0x57, 0x11 ), # AL=0xbd, AF=0 CF=1
+ ( 0x57, 0x11 ), # AL=0xbd, AF=1 CF=0
+ ( 0x57, 0x11 ), # AL=0xbd, AF=1 CF=1
+ ( 0x58, 0x11 ), # AL=0xbe, AF=0 CF=0
+ ( 0x58, 0x11 ), # AL=0xbe, AF=0 CF=1
+ ( 0x58, 0x11 ), # AL=0xbe, AF=1 CF=0
+ ( 0x58, 0x11 ), # AL=0xbe, AF=1 CF=1
+ ( 0x59, 0x15 ), # AL=0xbf, AF=0 CF=0
+ ( 0x59, 0x15 ), # AL=0xbf, AF=0 CF=1
+ ( 0x59, 0x15 ), # AL=0xbf, AF=1 CF=0
+ ( 0x59, 0x15 ), # AL=0xbf, AF=1 CF=1
+ ( 0x60, 0x05 ), # AL=0xc0, AF=0 CF=0
+ ( 0x60, 0x05 ), # AL=0xc0, AF=0 CF=1
+ ( 0x5a, 0x15 ), # AL=0xc0, AF=1 CF=0
+ ( 0x5a, 0x15 ), # AL=0xc0, AF=1 CF=1
+ ( 0x61, 0x01 ), # AL=0xc1, AF=0 CF=0
+ ( 0x61, 0x01 ), # AL=0xc1, AF=0 CF=1
+ ( 0x5b, 0x11 ), # AL=0xc1, AF=1 CF=0
+ ( 0x5b, 0x11 ), # AL=0xc1, AF=1 CF=1
+ ( 0x62, 0x01 ), # AL=0xc2, AF=0 CF=0
+ ( 0x62, 0x01 ), # AL=0xc2, AF=0 CF=1
+ ( 0x5c, 0x15 ), # AL=0xc2, AF=1 CF=0
+ ( 0x5c, 0x15 ), # AL=0xc2, AF=1 CF=1
+ ( 0x63, 0x05 ), # AL=0xc3, AF=0 CF=0
+ ( 0x63, 0x05 ), # AL=0xc3, AF=0 CF=1
+ ( 0x5d, 0x11 ), # AL=0xc3, AF=1 CF=0
+ ( 0x5d, 0x11 ), # AL=0xc3, AF=1 CF=1
+ ( 0x64, 0x01 ), # AL=0xc4, AF=0 CF=0
+ ( 0x64, 0x01 ), # AL=0xc4, AF=0 CF=1
+ ( 0x5e, 0x11 ), # AL=0xc4, AF=1 CF=0
+ ( 0x5e, 0x11 ), # AL=0xc4, AF=1 CF=1
+ ( 0x65, 0x05 ), # AL=0xc5, AF=0 CF=0
+ ( 0x65, 0x05 ), # AL=0xc5, AF=0 CF=1
+ ( 0x5f, 0x15 ), # AL=0xc5, AF=1 CF=0
+ ( 0x5f, 0x15 ), # AL=0xc5, AF=1 CF=1
+ ( 0x66, 0x05 ), # AL=0xc6, AF=0 CF=0
+ ( 0x66, 0x05 ), # AL=0xc6, AF=0 CF=1
+ ( 0x60, 0x15 ), # AL=0xc6, AF=1 CF=0
+ ( 0x60, 0x15 ), # AL=0xc6, AF=1 CF=1
+ ( 0x67, 0x01 ), # AL=0xc7, AF=0 CF=0
+ ( 0x67, 0x01 ), # AL=0xc7, AF=0 CF=1
+ ( 0x61, 0x11 ), # AL=0xc7, AF=1 CF=0
+ ( 0x61, 0x11 ), # AL=0xc7, AF=1 CF=1
+ ( 0x68, 0x01 ), # AL=0xc8, AF=0 CF=0
+ ( 0x68, 0x01 ), # AL=0xc8, AF=0 CF=1
+ ( 0x62, 0x11 ), # AL=0xc8, AF=1 CF=0
+ ( 0x62, 0x11 ), # AL=0xc8, AF=1 CF=1
+ ( 0x69, 0x05 ), # AL=0xc9, AF=0 CF=0
+ ( 0x69, 0x05 ), # AL=0xc9, AF=0 CF=1
+ ( 0x63, 0x15 ), # AL=0xc9, AF=1 CF=0
+ ( 0x63, 0x15 ), # AL=0xc9, AF=1 CF=1
+ ( 0x64, 0x11 ), # AL=0xca, AF=0 CF=0
+ ( 0x64, 0x11 ), # AL=0xca, AF=0 CF=1
+ ( 0x64, 0x11 ), # AL=0xca, AF=1 CF=0
+ ( 0x64, 0x11 ), # AL=0xca, AF=1 CF=1
+ ( 0x65, 0x15 ), # AL=0xcb, AF=0 CF=0
+ ( 0x65, 0x15 ), # AL=0xcb, AF=0 CF=1
+ ( 0x65, 0x15 ), # AL=0xcb, AF=1 CF=0
+ ( 0x65, 0x15 ), # AL=0xcb, AF=1 CF=1
+ ( 0x66, 0x15 ), # AL=0xcc, AF=0 CF=0
+ ( 0x66, 0x15 ), # AL=0xcc, AF=0 CF=1
+ ( 0x66, 0x15 ), # AL=0xcc, AF=1 CF=0
+ ( 0x66, 0x15 ), # AL=0xcc, AF=1 CF=1
+ ( 0x67, 0x11 ), # AL=0xcd, AF=0 CF=0
+ ( 0x67, 0x11 ), # AL=0xcd, AF=0 CF=1
+ ( 0x67, 0x11 ), # AL=0xcd, AF=1 CF=0
+ ( 0x67, 0x11 ), # AL=0xcd, AF=1 CF=1
+ ( 0x68, 0x11 ), # AL=0xce, AF=0 CF=0
+ ( 0x68, 0x11 ), # AL=0xce, AF=0 CF=1
+ ( 0x68, 0x11 ), # AL=0xce, AF=1 CF=0
+ ( 0x68, 0x11 ), # AL=0xce, AF=1 CF=1
+ ( 0x69, 0x15 ), # AL=0xcf, AF=0 CF=0
+ ( 0x69, 0x15 ), # AL=0xcf, AF=0 CF=1
+ ( 0x69, 0x15 ), # AL=0xcf, AF=1 CF=0
+ ( 0x69, 0x15 ), # AL=0xcf, AF=1 CF=1
+ ( 0x70, 0x01 ), # AL=0xd0, AF=0 CF=0
+ ( 0x70, 0x01 ), # AL=0xd0, AF=0 CF=1
+ ( 0x6a, 0x15 ), # AL=0xd0, AF=1 CF=0
+ ( 0x6a, 0x15 ), # AL=0xd0, AF=1 CF=1
+ ( 0x71, 0x05 ), # AL=0xd1, AF=0 CF=0
+ ( 0x71, 0x05 ), # AL=0xd1, AF=0 CF=1
+ ( 0x6b, 0x11 ), # AL=0xd1, AF=1 CF=0
+ ( 0x6b, 0x11 ), # AL=0xd1, AF=1 CF=1
+ ( 0x72, 0x05 ), # AL=0xd2, AF=0 CF=0
+ ( 0x72, 0x05 ), # AL=0xd2, AF=0 CF=1
+ ( 0x6c, 0x15 ), # AL=0xd2, AF=1 CF=0
+ ( 0x6c, 0x15 ), # AL=0xd2, AF=1 CF=1
+ ( 0x73, 0x01 ), # AL=0xd3, AF=0 CF=0
+ ( 0x73, 0x01 ), # AL=0xd3, AF=0 CF=1
+ ( 0x6d, 0x11 ), # AL=0xd3, AF=1 CF=0
+ ( 0x6d, 0x11 ), # AL=0xd3, AF=1 CF=1
+ ( 0x74, 0x05 ), # AL=0xd4, AF=0 CF=0
+ ( 0x74, 0x05 ), # AL=0xd4, AF=0 CF=1
+ ( 0x6e, 0x11 ), # AL=0xd4, AF=1 CF=0
+ ( 0x6e, 0x11 ), # AL=0xd4, AF=1 CF=1
+ ( 0x75, 0x01 ), # AL=0xd5, AF=0 CF=0
+ ( 0x75, 0x01 ), # AL=0xd5, AF=0 CF=1
+ ( 0x6f, 0x15 ), # AL=0xd5, AF=1 CF=0
+ ( 0x6f, 0x15 ), # AL=0xd5, AF=1 CF=1
+ ( 0x76, 0x01 ), # AL=0xd6, AF=0 CF=0
+ ( 0x76, 0x01 ), # AL=0xd6, AF=0 CF=1
+ ( 0x70, 0x11 ), # AL=0xd6, AF=1 CF=0
+ ( 0x70, 0x11 ), # AL=0xd6, AF=1 CF=1
+ ( 0x77, 0x05 ), # AL=0xd7, AF=0 CF=0
+ ( 0x77, 0x05 ), # AL=0xd7, AF=0 CF=1
+ ( 0x71, 0x15 ), # AL=0xd7, AF=1 CF=0
+ ( 0x71, 0x15 ), # AL=0xd7, AF=1 CF=1
+ ( 0x78, 0x05 ), # AL=0xd8, AF=0 CF=0
+ ( 0x78, 0x05 ), # AL=0xd8, AF=0 CF=1
+ ( 0x72, 0x15 ), # AL=0xd8, AF=1 CF=0
+ ( 0x72, 0x15 ), # AL=0xd8, AF=1 CF=1
+ ( 0x79, 0x01 ), # AL=0xd9, AF=0 CF=0
+ ( 0x79, 0x01 ), # AL=0xd9, AF=0 CF=1
+ ( 0x73, 0x11 ), # AL=0xd9, AF=1 CF=0
+ ( 0x73, 0x11 ), # AL=0xd9, AF=1 CF=1
+ ( 0x74, 0x15 ), # AL=0xda, AF=0 CF=0
+ ( 0x74, 0x15 ), # AL=0xda, AF=0 CF=1
+ ( 0x74, 0x15 ), # AL=0xda, AF=1 CF=0
+ ( 0x74, 0x15 ), # AL=0xda, AF=1 CF=1
+ ( 0x75, 0x11 ), # AL=0xdb, AF=0 CF=0
+ ( 0x75, 0x11 ), # AL=0xdb, AF=0 CF=1
+ ( 0x75, 0x11 ), # AL=0xdb, AF=1 CF=0
+ ( 0x75, 0x11 ), # AL=0xdb, AF=1 CF=1
+ ( 0x76, 0x11 ), # AL=0xdc, AF=0 CF=0
+ ( 0x76, 0x11 ), # AL=0xdc, AF=0 CF=1
+ ( 0x76, 0x11 ), # AL=0xdc, AF=1 CF=0
+ ( 0x76, 0x11 ), # AL=0xdc, AF=1 CF=1
+ ( 0x77, 0x15 ), # AL=0xdd, AF=0 CF=0
+ ( 0x77, 0x15 ), # AL=0xdd, AF=0 CF=1
+ ( 0x77, 0x15 ), # AL=0xdd, AF=1 CF=0
+ ( 0x77, 0x15 ), # AL=0xdd, AF=1 CF=1
+ ( 0x78, 0x15 ), # AL=0xde, AF=0 CF=0
+ ( 0x78, 0x15 ), # AL=0xde, AF=0 CF=1
+ ( 0x78, 0x15 ), # AL=0xde, AF=1 CF=0
+ ( 0x78, 0x15 ), # AL=0xde, AF=1 CF=1
+ ( 0x79, 0x11 ), # AL=0xdf, AF=0 CF=0
+ ( 0x79, 0x11 ), # AL=0xdf, AF=0 CF=1
+ ( 0x79, 0x11 ), # AL=0xdf, AF=1 CF=0
+ ( 0x79, 0x11 ), # AL=0xdf, AF=1 CF=1
+ ( 0x80, 0x81 ), # AL=0xe0, AF=0 CF=0
+ ( 0x80, 0x81 ), # AL=0xe0, AF=0 CF=1
+ ( 0x7a, 0x11 ), # AL=0xe0, AF=1 CF=0
+ ( 0x7a, 0x11 ), # AL=0xe0, AF=1 CF=1
+ ( 0x81, 0x85 ), # AL=0xe1, AF=0 CF=0
+ ( 0x81, 0x85 ), # AL=0xe1, AF=0 CF=1
+ ( 0x7b, 0x15 ), # AL=0xe1, AF=1 CF=0
+ ( 0x7b, 0x15 ), # AL=0xe1, AF=1 CF=1
+ ( 0x82, 0x85 ), # AL=0xe2, AF=0 CF=0
+ ( 0x82, 0x85 ), # AL=0xe2, AF=0 CF=1
+ ( 0x7c, 0x11 ), # AL=0xe2, AF=1 CF=0
+ ( 0x7c, 0x11 ), # AL=0xe2, AF=1 CF=1
+ ( 0x83, 0x81 ), # AL=0xe3, AF=0 CF=0
+ ( 0x83, 0x81 ), # AL=0xe3, AF=0 CF=1
+ ( 0x7d, 0x15 ), # AL=0xe3, AF=1 CF=0
+ ( 0x7d, 0x15 ), # AL=0xe3, AF=1 CF=1
+ ( 0x84, 0x85 ), # AL=0xe4, AF=0 CF=0
+ ( 0x84, 0x85 ), # AL=0xe4, AF=0 CF=1
+ ( 0x7e, 0x15 ), # AL=0xe4, AF=1 CF=0
+ ( 0x7e, 0x15 ), # AL=0xe4, AF=1 CF=1
+ ( 0x85, 0x81 ), # AL=0xe5, AF=0 CF=0
+ ( 0x85, 0x81 ), # AL=0xe5, AF=0 CF=1
+ ( 0x7f, 0x11 ), # AL=0xe5, AF=1 CF=0
+ ( 0x7f, 0x11 ), # AL=0xe5, AF=1 CF=1
+ ( 0x86, 0x81 ), # AL=0xe6, AF=0 CF=0
+ ( 0x86, 0x81 ), # AL=0xe6, AF=0 CF=1
+ ( 0x80, 0x91 ), # AL=0xe6, AF=1 CF=0
+ ( 0x80, 0x91 ), # AL=0xe6, AF=1 CF=1
+ ( 0x87, 0x85 ), # AL=0xe7, AF=0 CF=0
+ ( 0x87, 0x85 ), # AL=0xe7, AF=0 CF=1
+ ( 0x81, 0x95 ), # AL=0xe7, AF=1 CF=0
+ ( 0x81, 0x95 ), # AL=0xe7, AF=1 CF=1
+ ( 0x88, 0x85 ), # AL=0xe8, AF=0 CF=0
+ ( 0x88, 0x85 ), # AL=0xe8, AF=0 CF=1
+ ( 0x82, 0x95 ), # AL=0xe8, AF=1 CF=0
+ ( 0x82, 0x95 ), # AL=0xe8, AF=1 CF=1
+ ( 0x89, 0x81 ), # AL=0xe9, AF=0 CF=0
+ ( 0x89, 0x81 ), # AL=0xe9, AF=0 CF=1
+ ( 0x83, 0x91 ), # AL=0xe9, AF=1 CF=0
+ ( 0x83, 0x91 ), # AL=0xe9, AF=1 CF=1
+ ( 0x84, 0x95 ), # AL=0xea, AF=0 CF=0
+ ( 0x84, 0x95 ), # AL=0xea, AF=0 CF=1
+ ( 0x84, 0x95 ), # AL=0xea, AF=1 CF=0
+ ( 0x84, 0x95 ), # AL=0xea, AF=1 CF=1
+ ( 0x85, 0x91 ), # AL=0xeb, AF=0 CF=0
+ ( 0x85, 0x91 ), # AL=0xeb, AF=0 CF=1
+ ( 0x85, 0x91 ), # AL=0xeb, AF=1 CF=0
+ ( 0x85, 0x91 ), # AL=0xeb, AF=1 CF=1
+ ( 0x86, 0x91 ), # AL=0xec, AF=0 CF=0
+ ( 0x86, 0x91 ), # AL=0xec, AF=0 CF=1
+ ( 0x86, 0x91 ), # AL=0xec, AF=1 CF=0
+ ( 0x86, 0x91 ), # AL=0xec, AF=1 CF=1
+ ( 0x87, 0x95 ), # AL=0xed, AF=0 CF=0
+ ( 0x87, 0x95 ), # AL=0xed, AF=0 CF=1
+ ( 0x87, 0x95 ), # AL=0xed, AF=1 CF=0
+ ( 0x87, 0x95 ), # AL=0xed, AF=1 CF=1
+ ( 0x88, 0x95 ), # AL=0xee, AF=0 CF=0
+ ( 0x88, 0x95 ), # AL=0xee, AF=0 CF=1
+ ( 0x88, 0x95 ), # AL=0xee, AF=1 CF=0
+ ( 0x88, 0x95 ), # AL=0xee, AF=1 CF=1
+ ( 0x89, 0x91 ), # AL=0xef, AF=0 CF=0
+ ( 0x89, 0x91 ), # AL=0xef, AF=0 CF=1
+ ( 0x89, 0x91 ), # AL=0xef, AF=1 CF=0
+ ( 0x89, 0x91 ), # AL=0xef, AF=1 CF=1
+ ( 0x90, 0x85 ), # AL=0xf0, AF=0 CF=0
+ ( 0x90, 0x85 ), # AL=0xf0, AF=0 CF=1
+ ( 0x8a, 0x91 ), # AL=0xf0, AF=1 CF=0
+ ( 0x8a, 0x91 ), # AL=0xf0, AF=1 CF=1
+ ( 0x91, 0x81 ), # AL=0xf1, AF=0 CF=0
+ ( 0x91, 0x81 ), # AL=0xf1, AF=0 CF=1
+ ( 0x8b, 0x95 ), # AL=0xf1, AF=1 CF=0
+ ( 0x8b, 0x95 ), # AL=0xf1, AF=1 CF=1
+ ( 0x92, 0x81 ), # AL=0xf2, AF=0 CF=0
+ ( 0x92, 0x81 ), # AL=0xf2, AF=0 CF=1
+ ( 0x8c, 0x91 ), # AL=0xf2, AF=1 CF=0
+ ( 0x8c, 0x91 ), # AL=0xf2, AF=1 CF=1
+ ( 0x93, 0x85 ), # AL=0xf3, AF=0 CF=0
+ ( 0x93, 0x85 ), # AL=0xf3, AF=0 CF=1
+ ( 0x8d, 0x95 ), # AL=0xf3, AF=1 CF=0
+ ( 0x8d, 0x95 ), # AL=0xf3, AF=1 CF=1
+ ( 0x94, 0x81 ), # AL=0xf4, AF=0 CF=0
+ ( 0x94, 0x81 ), # AL=0xf4, AF=0 CF=1
+ ( 0x8e, 0x95 ), # AL=0xf4, AF=1 CF=0
+ ( 0x8e, 0x95 ), # AL=0xf4, AF=1 CF=1
+ ( 0x95, 0x85 ), # AL=0xf5, AF=0 CF=0
+ ( 0x95, 0x85 ), # AL=0xf5, AF=0 CF=1
+ ( 0x8f, 0x91 ), # AL=0xf5, AF=1 CF=0
+ ( 0x8f, 0x91 ), # AL=0xf5, AF=1 CF=1
+ ( 0x96, 0x85 ), # AL=0xf6, AF=0 CF=0
+ ( 0x96, 0x85 ), # AL=0xf6, AF=0 CF=1
+ ( 0x90, 0x95 ), # AL=0xf6, AF=1 CF=0
+ ( 0x90, 0x95 ), # AL=0xf6, AF=1 CF=1
+ ( 0x97, 0x81 ), # AL=0xf7, AF=0 CF=0
+ ( 0x97, 0x81 ), # AL=0xf7, AF=0 CF=1
+ ( 0x91, 0x91 ), # AL=0xf7, AF=1 CF=0
+ ( 0x91, 0x91 ), # AL=0xf7, AF=1 CF=1
+ ( 0x98, 0x81 ), # AL=0xf8, AF=0 CF=0
+ ( 0x98, 0x81 ), # AL=0xf8, AF=0 CF=1
+ ( 0x92, 0x91 ), # AL=0xf8, AF=1 CF=0
+ ( 0x92, 0x91 ), # AL=0xf8, AF=1 CF=1
+ ( 0x99, 0x85 ), # AL=0xf9, AF=0 CF=0
+ ( 0x99, 0x85 ), # AL=0xf9, AF=0 CF=1
+ ( 0x93, 0x95 ), # AL=0xf9, AF=1 CF=0
+ ( 0x93, 0x95 ), # AL=0xf9, AF=1 CF=1
+ ( 0x94, 0x91 ), # AL=0xfa, AF=0 CF=0
+ ( 0x94, 0x91 ), # AL=0xfa, AF=0 CF=1
+ ( 0x94, 0x91 ), # AL=0xfa, AF=1 CF=0
+ ( 0x94, 0x91 ), # AL=0xfa, AF=1 CF=1
+ ( 0x95, 0x95 ), # AL=0xfb, AF=0 CF=0
+ ( 0x95, 0x95 ), # AL=0xfb, AF=0 CF=1
+ ( 0x95, 0x95 ), # AL=0xfb, AF=1 CF=0
+ ( 0x95, 0x95 ), # AL=0xfb, AF=1 CF=1
+ ( 0x96, 0x95 ), # AL=0xfc, AF=0 CF=0
+ ( 0x96, 0x95 ), # AL=0xfc, AF=0 CF=1
+ ( 0x96, 0x95 ), # AL=0xfc, AF=1 CF=0
+ ( 0x96, 0x95 ), # AL=0xfc, AF=1 CF=1
+ ( 0x97, 0x91 ), # AL=0xfd, AF=0 CF=0
+ ( 0x97, 0x91 ), # AL=0xfd, AF=0 CF=1
+ ( 0x97, 0x91 ), # AL=0xfd, AF=1 CF=0
+ ( 0x97, 0x91 ), # AL=0xfd, AF=1 CF=1
+ ( 0x98, 0x91 ), # AL=0xfe, AF=0 CF=0
+ ( 0x98, 0x91 ), # AL=0xfe, AF=0 CF=1
+ ( 0x98, 0x91 ), # AL=0xfe, AF=1 CF=0
+ ( 0x98, 0x91 ), # AL=0xfe, AF=1 CF=1
+ ( 0x99, 0x95 ), # AL=0xff, AF=0 CF=0
+ ( 0x99, 0x95 ), # AL=0xff, AF=0 CF=1
+ ( 0x99, 0x95 ), # AL=0xff, AF=1 CF=0
+ ( 0x99, 0x95 ), # AL=0xff, AF=1 CF=1
+];
+
--
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-virtualbox/virtualbox.git
More information about the Pkg-virtualbox-commits
mailing list