diff -Nru virtualbox-hwe-6.1.34-dfsg/Config.kmk virtualbox-hwe-6.1.38-dfsg/Config.kmk --- virtualbox-hwe-6.1.34-dfsg/Config.kmk 2022-03-22 23:34:38.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/Config.kmk 2022-09-01 13:17:42.000000000 +0000 @@ -774,6 +774,10 @@ # the overall installer size significantly because merge modules are not able # to use a common .cab file to reduce their size. #VBOX_WITH_MSM_INSTALL = 1 +# Enables the 'sign' command in bldRTSignTool. We may need this on windows. +if1of ($(KBUILD_TARGET), win) + VBOX_WITH_BLD_RTSIGNTOOL_SIGNING = 1 +endif ## @} @@ -2822,6 +2826,7 @@ $(QUIET)$(APPEND) '$@' 'VBOX_GCC_mavx2 ?= $(call VBOX_GCC_CHECK_CC,-mavx2,)' $(QUIET)$(APPEND) '$@' 'VBOX_GCC_no-pie ?= $(call VBOX_GCC_CHECK_CC,-no-pie,)' $(QUIET)$(APPEND) '$@' 'VBOX_GCC_fdiagnostics-show-option ?= $(call VBOX_GCC_CHECK_CC,-fdiagnostics-show-option,)' + $(QUIET)$(APPEND) '$@' 'VBOX_GCC_fno-printf-return-value ?= $(call VBOX_GCC_CHECK_CC,-fno-printf-return-value,)' $(QUIET)$(APPEND) '$@' 'VBOX_GCC_Wa_cma_nocompress_debug_sections ?= $(call VBOX_GCC_CHECK_CC,-Wa$(COMMA)--nocompress-debug-sections,)' # Produce code optimized for the most common IA32/AMD64/EM64T processors. Introduced with gcc version 4.2. $(QUIET)$(APPEND) '$@' 'VBOX_GCC_mtune-generic ?= $(call VBOX_GCC_CHECK_CC,-mtune=generic,)' @@ -3442,20 +3447,26 @@ endif endif - VBOX_SIGNTOOL ?= $(VBOX_RETRY) "$(VBOX_PATH_SIGN_TOOLS)/signtool.exe" - VBOX_INF2CAT ?= $(VBOX_PATH_SELFSIGN)/inf2cat.exe + VBOX_SIGNTOOL ?= $(VBOX_RETRY) "$(VBOX_PATH_SIGN_TOOLS)/signtool.exe" + VBOX_SIGNTOOL_SHA1 ?= $(VBOX_SIGNTOOL) + VBOX_SIGNTOOL_SHA1_ORDERDEPS ?= + VBOX_SIGNTOOL_SHA2 ?= $(VBOX_SIGNTOOL) + VBOX_SIGNTOOL_SHA2_ORDERDEPS ?= + VBOX_SIGNTOOL_ORDERDEPS ?= $(VBOX_SIGNTOOL_SHA1_ORDERDEPS) $(VBOX_SIGNTOOL_SHA2_ORDERDEPS) + VBOX_INF2CAT ?= $(VBOX_PATH_SELFSIGN)/inf2cat.exe ifeq ($(VBOX_SIGNING_MODE),test) VBOX_CERTIFICATE_SUBJECT_NAME ?= MyTestCertificate VBOX_CERTIFICATE_SUBJECT_NAME_ARGS ?= /n "$(VBOX_CERTIFICATE_SUBJECT_NAME)" else # release - VBOX_CERTIFICATE_SUBJECT_NAME ?= Oracle Corporation + VBOX_CERTIFICATE_SUBJECT_NAME ?= VirtualBox 2022 VBOX_CERTIFICATE_SUBJECT_NAME_ARGS ?= /n "$(VBOX_CERTIFICATE_SUBJECT_NAME)" /a #VBOX_CERTIFICATE_FINGERPRINT ?= 7e 92 b6 6b e5 1b 79 d8 ce 3f f2 5c 15 c2 df 6a b8 c7 f2 f2 #VBOX_CERTIFICATE_FINGERPRINT ?= 5b de fe 58 0a 81 66 61 cd b5 7a 57 10 7b f4 18 74 86 ef cc - VBOX_CERTIFICATE_FINGERPRINT ?= 6f 47 42 06 bc bb 39 1b b8 2b a9 e5 dc 03 02 de f3 7a eb be + #VBOX_CERTIFICATE_FINGERPRINT ?= 6f 47 42 06 bc bb 39 1b b8 2b a9 e5 dc 03 02 de f3 7a eb be + VBOX_CERTIFICATE_FINGERPRINT ?= 5f 0b fe c5 53 17 c1 25 5a a4 7f cd bc 49 a2 fb 61 09 03 cc #VBOX_CROSS_CERTIFICATE_FILE ?= $(VBOX_PATH_SELFSIGN)/VeriSign Class 3 Public Primary Certification Authority - G5.cer - VBOX_CROSS_CERTIFICATE_FILE ?= $(VBOX_PATH_SELFSIGN)/DigiCert Assured ID Root CA.crt + #VBOX_CROSS_CERTIFICATE_FILE ?= $(VBOX_PATH_SELFSIGN)/DigiCert Assured ID Root CA.crt #VBOX_TSA_URL ?= http://timestamp.verisign.com/scripts/timstamp.dll - Appears to be broken between 2020-12-25 and 2020-12-30 (bugref:9849). VBOX_TSA_URL ?= http://timestamp.digicert.com endif @@ -3507,28 +3518,28 @@ # @param 2 File description. Optional. # @param 3 Additional parameters. Optional. # @param 4 Set to 2 if the expression will be expanded twice before chopped into commands (for _CMDS). - # @param 5 Disables dual signing if non-empty. + # @param 5 Disables dual signing if non-empty, picking the SHA2 signature (since 2022-07-18). # @param 6 non-zero for alternative command separator. This is used for generating repacking scripts. ifndef VBOX_SIGN_FILE_FN if $(intersects win all 1,$(VBOX_WITH_CORP_CODE_SIGNING)) - VBOX_SIGN_FILE_FN = $(call VBOX_CCS_SIGN_CMD,driver$(if-expr "$3" == "/ph",_pagehash,),$1,,-digest_algo SHA1) \ + VBOX_SIGN_FILE_FN = $(call VBOX_CCS_SIGN_CMD,driver$(if-expr "$3" == "/ph",_pagehash,),$1,,-digest_algo $(if-expr "$5" == "",SHA1,SHA2)) \ $(if-expr "$5" == "",\ $(if-expr "$6" == "",$(if-expr "$4" == "2",$$(NLTAB),$(NLTAB)),$6) \ $(call VBOX_CCS_SIGN_CMD,driver$(if-expr "$3" == "/ph",_pagehash,),$1,,-dual_sign -digest_algo SHA2)) else ifdef VBOX_CERTIFICATE_SHA2_SUBJECT_NAME - VBOX_SIGN_FILE_FN = $(VBOX_SIGNTOOL) \ - sign /fd sha1\ + ifdef VBOX_CERTIFICATE_SUBJECT_NAME + VBOX_SIGN_FILE_FN = $(if-expr "$5" == "",$(VBOX_SIGNTOOL_SHA1) \ + sign /fd sha1 \ $(VBOX_CROSS_CERTIFICATE_FILE_ARGS) \ $(VBOX_CERTIFICATE_STORE_ARGS) \ $(VBOX_CERTIFICATE_SUBJECT_NAME_ARGS) \ - $(VBOX_CERTIFICATE_FINGERPRINT_ARGS) \ + $(VBOX_CERTIFICATE_FINGERPRINT_ARGS) \ $(VBOX_TSA_URL_ARGS) \ $(if $(strip $(2)),/d "$(strip $(2))",) \ $(3) \ - $(1) \ - $(if-expr "$5" == "",\ - $(if-expr "$6" == "",$(if-expr "$4" == "2",$$(NLTAB),$(NLTAB)),$6)$(VBOX_SIGNTOOL) \ - sign /as /fd sha256 \ + "$(1)" \ + $(if-expr "$6" == "",$(if-expr "$4" == "2",$$(NLTAB),$(NLTAB)),$6))$(VBOX_SIGNTOOL_SHA2) \ + sign $(if-expr "$5" == "",/as,) /fd sha256 \ $(VBOX_CROSS_CERTIFICATE_SHA2_FILE_ARGS) \ $(VBOX_CERTIFICATE_SHA2_STORE_ARGS) \ $(VBOX_CERTIFICATE_SHA2_SUBJECT_NAME_ARGS) \ @@ -3536,9 +3547,22 @@ $(VBOX_TSA_SHA2_URL_ARGS) \ $(if $(strip $(2)),/d "$(strip $(2))",) \ $(3) \ - $(1),) + "$(1)" + else + VBOX_SIGN_FILE_FN = $(VBOX_SIGNTOOL_SHA2) \ + sign /fd sha256 \ + $(VBOX_CROSS_CERTIFICATE_SHA2_FILE_ARGS) \ + $(VBOX_CERTIFICATE_SHA2_STORE_ARGS) \ + $(VBOX_CERTIFICATE_SHA2_SUBJECT_NAME_ARGS) \ + $(VBOX_CERTIFICATE_SHA2_FINGERPRINT_ARGS) \ + $(VBOX_TSA_SHA2_URL_ARGS) \ + $(if $(strip $(2)),/d "$(strip $(2))",) \ + $(3) \ + "$(1)" + endif else - VBOX_SIGN_FILE_FN = $(VBOX_SIGNTOOL) sign \ + VBOX_SIGN_FILE_FN = $(VBOX_SIGNTOOL) \ + sign /fd $(firstword $(VBOX_TEST_SIGN_ALGORITHM) sha256) \ $(VBOX_CROSS_CERTIFICATE_FILE_ARGS) \ $(VBOX_CERTIFICATE_STORE_ARGS) \ $(VBOX_CERTIFICATE_SUBJECT_NAME_ARGS) \ @@ -3546,7 +3570,7 @@ $(VBOX_TSA_URL_ARGS) \ $(if $(strip $(2)),/d "$(strip $(2))",) \ $(3) \ - $(1) + "$(1)" endif endif @@ -3557,16 +3581,47 @@ if $(intersects win_ev all 1,$(VBOX_WITH_CORP_CODE_SIGNING)) VBOX_SIGN_EV_FILE_FN = $(call VBOX_CCS_SIGN_CMD,microsoftev,$1,$(if $2,$2,)) else ifdef VBOX_CERTIFICATE_EV_SUBJECT_NAME - VBOX_SIGN_EV_FILE_FN = $(VBOX_SIGNTOOL) \ - sign /as /fd sha256 \ + VBOX_SIGN_EV_FILE_FN = $(VBOX_SIGNTOOL_SHA2) \ + sign /fd sha256 \ $(VBOX_CERTIFICATE_EV_STORE_ARGS) \ $(VBOX_CERTIFICATE_EV_SUBJECT_NAME_ARGS) \ $(VBOX_CERTIFICATE_EV_FINGERPRINT_ARGS) \ $(VBOX_TSA_SHA2_URL_ARGS) \ - $(1) + "$(1)" endif endif + ## Local SHA-1 and SHA-256 signatures with EV SHA-256 signature from corp code signing. + # + # This builds on Plan B, since the corp code signing always replaces existing + # signatures. Since we're signing more, though, we do things slightly differently + # so we can apply this to VBOX_RTSIGNTOOL as well - only that didn't work because + # kmk tries to help windows caching images it executes. So HACK ALERT on that. + # + # So, here is what we do. + # 1. Sign $1 using the regular signing, probably dual signing it using local certs. + # 2. Make temporary copy of $1 as $1.dual + # 3. Do SHA-256 corp code signing of $1 + # 4. Add the SHA-256 signature from $1 to $1.dual using bldRTSignTool. + # 5. Replace $1 with $1.dual. + # + # @param 1 The file to sign. + # @param 2 File description. Optional. + # @param 3 Additional parameters. Optional. + # @param 4 Set to 2 if the expression will be expanded twice before chopped into commands (for _CMDS). + # @param 5 Disables dual & tripple signing if non-empty. + # @param 6 Disables tripple signing if non-empty. + # + # @remarks The parameters are the same as VBOX_SIGN_FILE_FN. + VBOX_SIGN_IMAGE_WITH_EV_FN = $(call VBOX_SIGN_FILE_FN,$1,$2,$3,$4,$5)$(if-expr "$5" == "" && "$(target)" != "bldRTSignTool",\ + $(if-expr "$4" == "2",$$(NLTAB),$(NLTAB))$(RM) -f -- "$1.dual" \ + $(if-expr "$4" == "2",$$(NLTAB),$(NLTAB))$(CP) -- "$1" "$1.dual" \ + $(if-expr "$4" == "2",$$(NLTAB),$(NLTAB))$(call VBOX_CCS_SIGN_CMD,microsoftev,$1,,-digest_algo SHA2) \ + $(if-expr "$4" == "2",$$(NLTAB),$(NLTAB))$(VBOX_RTSIGNTOOL) add-nested-$(if-expr "$(suffix $1)" == ".cat",cat,exe)-signature -v "$1.dual" "$1" \ + $(if-expr "$4" == "2",$$(NLTAB),$(NLTAB))$(MV) -f -- "$1.dual" "$1" \ + ,) + + ## Corp code signing for drivers and catalogs, plan B. # # Since the corp code signing cannot dual signing and doesn't even have a @@ -3584,7 +3639,7 @@ # @param 5 Disables dual signing if non-empty. # # @remarks The parameters are the same as VBOX_SIGN_FILE_FN. - VBOX_SIGN_IMAGE_PLAN_B_FN = $(VBOX_SIGNTOOL) \ + VBOX_SIGN_IMAGE_PLAN_B_FN = $(VBOX_SIGNTOOL_SHA1) \ sign /fd sha1\ $(VBOX_CROSS_CERTIFICATE_FILE_ARGS) \ $(VBOX_CERTIFICATE_STORE_ARGS) \ @@ -3593,7 +3648,7 @@ $(VBOX_TSA_URL_ARGS) \ $(if $(strip $(2)),/d "$(strip $(2))",) \ $(3) \ - $(1) \ + "$(1)" \ $(if-expr "$5" == "",\ $(if-expr "$4" == "2",$$(NLTAB),$(NLTAB))$(RM) -f -- "$1.ccs" \ $(if-expr "$4" == "2",$$(NLTAB),$(NLTAB))$(CP) -- "$1" "$1.ccs" \ @@ -3606,14 +3661,21 @@ # @param 1 The file to sign. # @param 2 File description. Optional. # @param 3 Set to 2 if the expression will be expanded twice before chopped into commands (for _CMDS). - VBOX_SIGN_IMAGE_FN ?= $(call VBOX_SIGN_FILE_FN,$(1),$(2),/ph,$(3)) + if1of (win_with_ev,$(VBOX_WITH_CORP_CODE_SIGNING)) + VBOX_SIGN_IMAGE_FN ?= $(call VBOX_SIGN_IMAGE_WITH_EV_FN,$(1),$(2),/ph,$(3)) + VBOX_SIGN_IMAGE_ORDERDEPS ?= $(VBOX_RTSIGNTOOL) $(VBOX_SIGNTOOL_ORDERDEPS) + else + VBOX_SIGN_IMAGE_FN ?= $(call VBOX_SIGN_FILE_FN,$(1),$(2),/ph,$(3)) + VBOX_SIGN_IMAGE_ORDERDEPS ?= $(VBOX_SIGNTOOL_ORDERDEPS) + endif ## Commands for signing a driver image after link. if $(intersects win_planb,$(VBOX_WITH_CORP_CODE_SIGNING)) - VBOX_SIGN_DRIVER_CMDS ?= $(if $(eq $(tool_do),LINK_LIBRARY),,$(call VBOX_SIGN_IMAGE_PLAN_B_FN,$(out),,/ph,2)) - VBOX_SIGN_DRIVER_ORDERDEPS ?= $(VBOX_RTSIGNTOOL) + VBOX_SIGN_DRIVER_CMDS ?= $(if $(eq $(tool_do),LINK_LIBRARY),,$(call VBOX_SIGN_IMAGE_PLAN_B_FN,$(out),,/ph,2)) + VBOX_SIGN_DRIVER_ORDERDEPS ?= $(VBOX_RTSIGNTOOL) $(VBOX_SIGNTOOL_ORDERDEPS) else - VBOX_SIGN_DRIVER_CMDS ?= $(if $(eq $(tool_do),LINK_LIBRARY),,$(call VBOX_SIGN_IMAGE_FN,$(out),,2)) + VBOX_SIGN_DRIVER_CMDS ?= $(if $(eq $(tool_do),LINK_LIBRARY),,$(call VBOX_SIGN_IMAGE_FN,$(out),,2)) + VBOX_SIGN_DRIVER_ORDERDEPS ?= $(if $(eq $(tool_do),LINK_LIBRARY),,$(VBOX_SIGN_IMAGE_ORDERDEPS)) endif ## Create a security catalog file. @@ -3642,10 +3704,18 @@ # Go nuts, sign everything. if "$(VBOX_SIGNING_MODE)" == "release" || defined(VBOX_WITH_HARDENING) ## Commands for signing an executable or a dll image after link. - VBOX_SIGN_IMAGE_CMDS ?= $(if $(eq $(tool_do),LINK_LIBRARY),,$(call VBOX_SIGN_IMAGE_FN,$(out),,2)) + VBOX_SIGN_IMAGE_CMDS ?= $(if $(eq $(tool_do),LINK_LIBRARY),,$(call VBOX_SIGN_IMAGE_FN,$(out),,2)) + VBOX_SIGN_IMAGE_CMDS_ORDERDEPS ?= $(if $(eq $(tool_do),LINK_LIBRARY),,$(VBOX_SIGN_IMAGE_ORDERDEPS)) endif ## Enable signing of the additions. VBOX_SIGN_ADDITIONS ?= 1 + ## Set if we should incldue the legacy timestamp CA. + ifndef VBOX_WITH_VBOX_LEGACY_TS_CA + if "$(findstring 55287c0d517e273696d67c690dd5d9f0a1d6d725,$(VBOX_TSA_URL_ARGS))" != "" + VBOX_WITH_VBOX_LEGACY_TS_CA = 1 + endif + endif + VBOX_LEGACY_TS_CA_FILE = $(PATH_ROOT)/src/VBox/HostDrivers/Support/Certificates/Timestamp-VBoxLegacyWinCA.crt else ifeq ($(KBUILD_HOST),darwin) # @@ -3672,6 +3742,10 @@ VBOX_DARWIN_KEXT_SIGN_FILES = CodeResources endif + # Always enable the hardened runtime when signing. Can be disabled if + # trying to build on quite old macOS, which will likely need some effort. + VBOX_WITH_MACOS_HARDENED_RUNTIME ?= 1 + ## # Corp Code Notarization command line. Modifies the file because the tickets are stapled. # @param 1 The file to be submitted for signing. @@ -3705,7 +3779,7 @@ $(if-expr defined(VBOX_TSA_URL),--timestamp="$(VBOX_TSA_URL)") \ $(3) \ $(VBOX_CERTIFICATE_SUBJECT_NAME_ARGS) \ - $(1) $(if $(2),--identifier "$(2)",) + "$(1)" $(if $(2),--identifier "$(2)",) endif ## Sign a Mach-O image. @@ -3728,7 +3802,7 @@ $(if-expr defined(VBOX_TSA_URL),--timestamp="$(VBOX_TSA_URL)") \ $(VBOX_CERTIFICATE_SUBJECT_NAME_ARGS) \ $(3) \ - $(1) \ + "$(1)" \ $(if $(2),--identifier "$(2)",) endif @@ -3770,7 +3844,7 @@ $(if-expr defined(VBOX_TSA_URL),--timestamp="$(VBOX_TSA_URL)") \ $(if $(2),--identifier "$(2)",) \ $(VBOX_CERTIFICATE_SUBJECT_NAME_ARGS) \ - $(1) + "$(1)" endif ## Sign a DMG image. @@ -3861,7 +3935,7 @@ $(VBOX_CERTIFICATE_FILE_ARGS) \ $(VBOX_TOKEN_NAME_ARGS) \ $(VBOX_PIN_ARGS) \ - -e $(1) + -e "$(1)" ## Commands for signing a driver image after link. if $(intersects solaris all 1,$(VBOX_WITH_CORP_CODE_SIGNING)) @@ -3938,7 +4012,7 @@ $(1)_VBOX_RE_SIGNED_$(n) := 1 $(eval $(1)_CLEAN += $$($(1)_0_OUTDIR)/$(n)) - $$($(1)_0_OUTDIR)/$(n): $(2) $(VBOX_VERSION_STAMP) | $$(dir $$@) + $$($(1)_0_OUTDIR)/$(n): $(2) $(VBOX_VERSION_STAMP) | $$(dir $$@) $(VBOX_SIGN_IMAGE_ORDERDEPS) $(call MSG_TOOL,SIGNTOOL,,$<,$@) $(RM) -f -- "$@" $(CP) -- "$<" "$@" @@ -4176,6 +4250,19 @@ $(PATH_STAGE_LIB)/VBox-libssl-x86$(VBOX_SUFF_LIB) \ $(PATH_STAGE_LIB)/VBox-libcrypto-x86$(VBOX_SUFF_LIB) +ifdef VBOX_WITH_BLD_RTSIGNTOOL_SIGNING + SDK_VBOX_OPENSSL_BLDPROG := OpenSSL - Build tools verison (i.e. bldRTSignTool) + SDK_VBOX_OPENSSL_BLDPROG_INCS ?= $(SDK_VBOX_OPENSSL_VBOX_DEFAULT_INCS) + SDK_VBOX_OPENSSL_BLDPROG_ORDERDEPS ?= $(crypto-headers_1_TARGET) + if !defined(VBOX_ONLY_SDK) \ + && ("$(SDK_VBOX_OPENSSL_INCS)" == "$(SDK_VBOX_OPENSSL_VBOX_DEFAULT_INCS)") + SDK_VBOX_OPENSSL_BLDPROG_DEPS ?= $(SDK_VBOX_OPENSSL_INCS)/openssl/openssl-mangling.h + endif + SDK_VBOX_OPENSSL_BLDPROG_LIBS ?= \ + $(PATH_STAGE_LIB)/VBoxBldProg-libssl$(VBOX_SUFF_LIB) \ + $(PATH_STAGE_LIB)/VBoxBldProg-libcrypto$(VBOX_SUFF_LIB) +endif + SDK_VBOX_OPENSSL2 = What you should be using. SDK_VBOX_OPENSSL2_EXTENDS = VBOX_OPENSSL if "$(SDK_VBOX_OPENSSL_INCS)" == "$(SDK_VBOX_OPENSSL_VBOX_DEFAULT_INCS)" @@ -4349,6 +4436,7 @@ TEMPLATE_VBoxRc_LIBS += \ $(PATH_STAGE_LIB)/RuntimeRCStub$(VBOX_SUFF_LIB) TEMPLATE_VBoxRc_POST_CMDS = $(VBOX_SIGN_IMAGE_CMDS) + TEMPLATE_VBoxRc_ORDERDEPS = $(VBOX_SIGN_IMAGE_CMDS_ORDERDEPS) endif # pe ifeq ($(VBOX_LDR_FMT32),elf) @@ -4502,11 +4590,14 @@ TEMPLATE_VBoxR0_TOOL = $(VBOX_GCC_TOOL) TEMPLATE_VBoxR0_CFLAGS = -fno-pie -nostdinc -g $(VBOX_GCC_pipe) $(VBOX_GCC_WERR) $(VBOX_GCC_PEDANTIC_C) \ $(VBOX_GCC_Wno-variadic-macros) $(VBOX_GCC_R0_OPT) $(VBOX_GCC_R0_FP) -fno-strict-aliasing -fno-exceptions \ - $(VBOX_GCC_fno-stack-protector) -fno-common $(VBOX_GCC_fvisibility-hidden) -std=gnu99 $(VBOX_GCC_IPRT_FMT_CHECK) + $(VBOX_GCC_fno-stack-protector) -fno-common -ffreestanding $(VBOX_GCC_fvisibility-hidden) -std=gnu99 $(VBOX_GCC_IPRT_FMT_CHECK) TEMPLATE_VBoxR0_CXXFLAGS = -fno-pie -nostdinc -g $(VBOX_GCC_pipe) $(VBOX_GCC_WERR) $(VBOX_GCC_PEDANTIC_CXX) \ $(VBOX_GCC_Wno-variadic-macros) $(VBOX_GCC_R0_OPT) $(VBOX_GCC_R0_FP) -fno-strict-aliasing -fno-exceptions \ $(VBOX_GCC_fno-stack-protector) -fno-common $(VBOX_GCC_fvisibility-inlines-hidden) $(VBOX_GCC_fvisibility-hidden) \ -fno-rtti $(VBOX_GCC_IPRT_FMT_CHECK) + if $(VBOX_GCC_VERSION_CC) >= 40500 # 4.1.2 complains, 4.5.2 is okay, didn't check which version inbetween made it okay with g++. +TEMPLATE_VBoxR0_CXXFLAGS += -ffreestanding + endif TEMPLATE_VBoxR0_CFLAGS.amd64 = -m64 -mno-red-zone -mno-sse -mno-mmx -mno-sse2 -mno-3dnow -fasynchronous-unwind-tables -ffreestanding TEMPLATE_VBoxR0_CXXFLAGS.amd64 = -m64 -mno-red-zone -mno-sse -mno-mmx -mno-sse2 -mno-3dnow -fasynchronous-unwind-tables TEMPLATE_VBoxR0_CXXFLAGS.freebsd = -ffreestanding @@ -4691,12 +4782,20 @@ $(QUIET)$$(RM) -Rf -- "$$(PATH_TARGET)/tst$(1)_mod" $(QUIET)$$(MKDIR) -p -- "$$(PATH_TARGET)/tst$(1)_mod" $(QUIET)$$(CP) -R -- "$$(PATH_STAGE_BIN)/../$$($(1)_INST)" "$$(PATH_TARGET)/tst$(1)_mod/" - + $(QUIET)make KBUILD_VERBOSE=$(KBUILD_VERBOSE) KERN_DIR=$(KERN_DIR) VBOX_KERN_QUIET=1 -C $$(PATH_TARGET)/tst$(1)_mod clean + + $(QUIET)make KBUILD_VERBOSE=$(KBUILD_VERBOSE) KERN_DIR=$(KERN_DIR) VBOX_KERN_QUIET=1 \ + KBUILD_TYPE= KBUILD_TARGET= KBUILD_TARGET_ARCH= KBUILD_HOST= KBUILD_HOST_ARCH= \ + KBUILD_TYPE= KBUILD_TARGET= KBUILD_TARGET_ARCH= KBUILD_TARGET_CPU= KBUILD_HOST= KBUILD_HOST_ARCH= KBUILD_HOST_CPU= \ + BUILD_TYPE= BUILD_TARGET= BUILD_TARGET_ARCH= BUILD_TARGET_CPU= BUILD_PLATFORM= BUILD_PLATFORM_ARCH= BUILD_PLATFORM_CPU= \ + -C $$(PATH_TARGET)/tst$(1)_mod clean ifneq ($(2),) $(QUIET)$$(CP) -f -- "$$<" "$$(PATH_TARGET)/tst$(1)_mod/Module.symvers" endif + $(QUIET)$(REDIRECT_EXT) -d2=1 -w1 "$$(PATH_TARGET)/tst$(1)_mod/make.err" -- \ - make KBUILD_VERBOSE=$(KBUILD_VERBOSE) KERN_DIR=$(KERN_DIR) VBOX_KERN_QUIET=1 $(if $(2),KBUILD_EXTRA_SYMBOLS="$$(PATH_TARGET)/tst$(1)_mod/Module.symvers",) $(if-expr $(KMK_OPTS_JOBS) != 0,JOBS=$(KMK_OPTS_JOBS),) -C $$(PATH_TARGET)/tst$(1)_mod + make KBUILD_VERBOSE=$(KBUILD_VERBOSE) KERN_DIR=$(KERN_DIR) VBOX_KERN_QUIET=1 $(if $(2),KBUILD_EXTRA_SYMBOLS="$$(PATH_TARGET)/tst$(1)_mod/Module.symvers",) $(if-expr $(KMK_OPTS_JOBS) != 0,JOBS=$(KMK_OPTS_JOBS),) \ + VBOX_KBUILD_TYPE=$(KBUILD_TYPE) VBOX_KBUILD_TARGET_ARCH=$(KBUILD_TARGET_ARCH) \ + KBUILD_TYPE= KBUILD_TARGET= KBUILD_TARGET_ARCH= KBUILD_TARGET_CPU= KBUILD_HOST= KBUILD_HOST_ARCH= KBUILD_HOST_CPU= \ + BUILD_TYPE= BUILD_TARGET= BUILD_TARGET_ARCH= BUILD_TARGET_CPU= BUILD_PLATFORM= BUILD_PLATFORM_ARCH= BUILD_PLATFORM_CPU= \ + -C $$(PATH_TARGET)/tst$(1)_mod $(CAT) "$$(PATH_TARGET)/tst$(1)_mod/make.err" $(QUIET)! grep "^WARNING: .* undefined!$$$$" "$$(PATH_TARGET)/tst$(1)_mod/make.err" if1of ($(USERNAME), bird) @@ -5174,6 +5273,7 @@ $(PATH_TOOL_$(TEMPLATE_VBOXR3EXE_TOOL.win.amd64)_LIB)/msvcprt$(VBOX_VCC_CRT_TYPE).lib \ $(PATH_TOOL_$(TEMPLATE_VBOXR3EXE_TOOL.win.amd64)_LIB)/oldnames.lib TEMPLATE_VBOXR3EXE_POST_CMDS = $(VBOX_SIGN_IMAGE_CMDS) + TEMPLATE_VBOXR3EXE_ORDERDEPS = $(VBOX_SIGN_IMAGE_CMDS_ORDERDEPS) if defined(VBOX_WITH_MORE_NT4_COMPAT_BINARIES) && "$(KBUILD_TARGET).$(KBUILD_TARGET_ARCH)" == "win.x86" TEMPLATE_VBOXR3EXE_POST_CMDS.win.x86 = $(if $(eq $(tool_do),LINK_LIBRARY),,$(VBOX_PE_SET_VERSION) $(out)$$(NLTAB)$(TEMPLATE_VBOXR3EXE_POST_CMDS)) TEMPLATE_VBOXR3EXE_LNK_DEPS.win.x86 = $(if $(eq $(tool_do),LINK_LIBRARY),,$(VBOX_PE_SET_VERSION)) @@ -6090,6 +6190,7 @@ $(PATH_TOOL_$(TEMPLATE_VBOXMAINEXE_TOOL.win.amd64)_LIB)/msvcprt$(VBOX_VCC_CRT_TYPE).lib \ $(PATH_TOOL_$(TEMPLATE_VBOXMAINEXE_TOOL.win.amd64)_LIB)/oldnames.lib TEMPLATE_VBOXMAINEXE_POST_CMDS = $(VBOX_SIGN_IMAGE_CMDS) + TEMPLATE_VBOXMAINEXE_ORDERDEPS = $(VBOX_SIGN_IMAGE_CMDS_ORDERDEPS) else # the GCC guys: @@ -6679,6 +6780,7 @@ $(PATH_TOOL_$(VBOX_VCC_TOOL)_LIB)/oldnames.lib \ $(PATH_TOOL_$(VBOX_VCC_TOOL)_LIB)/delayimp.lib TEMPLATE_VBOXQTGUIEXE_POST_CMDS = $(VBOX_SIGN_IMAGE_CMDS) + TEMPLATE_VBOXQTGUIEXE_ORDERDEPS = $(VBOX_SIGN_IMAGE_CMDS_ORDERDEPS) else # the gcc guys: TEMPLATE_VBOXQTGUIEXE_TOOL = $(VBOX_GCC_TOOL) @@ -7115,7 +7217,7 @@ TEMPLATE_VBOXGUESTR3EXE_SDKS = ReorderCompilerIncs $(VBOX_WINPSDK_GST) VBOX_NTDLL TEMPLATE_VBOXGUESTR3EXE_CFLAGS = $(filter-out -MD$(VBOX_VCC_CRT_TYPE), $(TEMPLATE_VBOXR3EXE_CFLAGS)) -MT$(VBOX_VCC_CRT_TYPE) TEMPLATE_VBOXGUESTR3EXE_CXXFLAGS = $(filter-out -MD$(VBOX_VCC_CRT_TYPE), $(TEMPLATE_VBOXR3EXE_CFLAGS)) -MT$(VBOX_VCC_CRT_TYPE) - TEMPLATE_VBOXGUESTR3EXE_LDFLAGS = $(filter-out /DISALLOWLIB:libcmt$(VBOX_VCC_CRT_TYPE).lib /DISALLOWLIB:libcpmt$(VBOX_VCC_CRT_TYPE).lib, $(TEMPLATE_VBOXR3EXE_LDFLAGS)) \ + TEMPLATE_VBOXGUESTR3EXE_LDFLAGS = $(filter-out -IntegrityCheck /DISALLOWLIB:libcmt$(VBOX_VCC_CRT_TYPE).lib /DISALLOWLIB:libcpmt$(VBOX_VCC_CRT_TYPE).lib, $(TEMPLATE_VBOXR3EXE_LDFLAGS)) \ /DISALLOWLIB:msvcrt$(VBOX_VCC_CRT_TYPE).lib \ /DISALLOWLIB:msvcprt$(VBOX_VCC_CRT_TYPE).lib TEMPLATE_VBOXGUESTR3EXE_LIBS.x86 = \ @@ -7701,7 +7803,7 @@ SVN ?= svn$(HOSTSUFF_EXE) VBOX_SVN_REV_KMK = $(PATH_OUT)/revision.kmk ifndef VBOX_SVN_REV - VBOX_SVN_REV_CONFIG_FALLBACK := $(patsubst %:,, $Rev: 149328 $ ) + VBOX_SVN_REV_CONFIG_FALLBACK := $(patsubst %:,, $Rev: 152435 $ ) VBOX_SVN_REV_FALLBACK := $(if-expr $(VBOX_SVN_REV_CONFIG_FALLBACK) > $(VBOX_SVN_REV_VERSION_FALLBACK),$(VBOX_SVN_REV_CONFIG_FALLBACK),$(VBOX_SVN_REV_VERSION_FALLBACK)) 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)),) diff -Nru virtualbox-hwe-6.1.34-dfsg/configure virtualbox-hwe-6.1.38-dfsg/configure --- virtualbox-hwe-6.1.34-dfsg/configure 2022-03-22 23:34:38.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/configure 2022-09-01 13:17:42.000000000 +0000 @@ -3,7 +3,7 @@ # libraries VBox OSE depends on. # -# Copyright (C) 2006-2020 Oracle Corporation +# Copyright (C) 2006-2021 Oracle Corporation # # This file is part of VirtualBox Open Source Edition (OSE), as # available from http://www.virtualbox.org. This file is free software; @@ -2027,7 +2027,7 @@ } EOF found= - SUPPYTHONLIBS="python2.7 python2.6 python3.1 python3.2 python3.3 python3.4 python3.4m python3.5 python3.5m python3.6 python3.6m python3.7 python3.7m python3.8 python3.8m python3.9 python3.9m" + SUPPYTHONLIBS="python2.7 python2.6 python3.1 python3.2 python3.3 python3.4 python3.4m python3.5 python3.5m python3.6 python3.6m python3.7 python3.7m python3.8 python3.8m python3.9 python3.9m python3.10 python3.10m" for p in $PYTHONDIR; do for d in $SUPPYTHONLIBS; do for b in lib/x86_64-linux-gnu lib/i386-linux-gnu lib64 lib/64 lib; do diff -Nru virtualbox-hwe-6.1.34-dfsg/debian/changelog virtualbox-hwe-6.1.38-dfsg/debian/changelog --- virtualbox-hwe-6.1.34-dfsg/debian/changelog 2022-05-13 07:38:13.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/debian/changelog 2022-09-07 11:10:33.000000000 +0000 @@ -1,11 +1,78 @@ -virtualbox-hwe (6.1.34-dfsg-3~ubuntu1.20.04.1) focal; urgency=medium +virtualbox-hwe (6.1.38-dfsg-3~ubuntu1.20.04.1) focal; urgency=medium - * SRU the latest package for Ubuntu focal (LP: #1973275) + * SRU the latest package for Ubuntu focal (LP: #1988473) * Revert drop of *guest-dkms packages for focal only. Such packages are still needed because kernel < 5.5. doesn't provide vboxsf + * Revert switch to dh-sequence-dkms, not enough new dkms is available in + focal - -- Gianfranco Costamagna Fri, 13 May 2022 09:38:13 +0200 + -- Gianfranco Costamagna Wed, 07 Sep 2022 13:10:33 +0200 + +virtualbox-hwe (6.1.38-dfsg-3ubuntu1.22.10.1) kinetic; urgency=medium + + * Build only the guest-* packages with hwe stack + + -- Gianfranco Costamagna Tue, 06 Sep 2022 22:05:30 +0200 + +virtualbox (6.1.38-dfsg-3) unstable; urgency=medium + + * Switch to upstream approach to fix FTBFS + + -- Gianfranco Costamagna Tue, 06 Sep 2022 22:01:06 +0200 + +virtualbox-hwe (6.1.38-dfsg-2ubuntu1.22.10.1) kinetic; urgency=medium + + * Build only the guest-* packages with hwe stack + + -- Gianfranco Costamagna Tue, 06 Sep 2022 15:27:06 +0200 + +virtualbox (6.1.38-dfsg-2) unstable; urgency=medium + + [ Andreas Beckmann ] + * Switch to dh-sequence-dkms. + * Declare Testsuite: autopkgtest-pkg-dkms. + + [ Gianfranco Costamagna ] + * Drop utf8x from https://github.com/latex3/latex2e/issues/833 + * And replace double arrow with two different arrows (left and right) + to avoid utf8 chars in documentation. + + -- Gianfranco Costamagna Tue, 06 Sep 2022 09:34:38 +0200 + +virtualbox-hwe (6.1.38-dfsg-1ubuntu1.22.10.1) kinetic; urgency=medium + + * Build only the guest-* packages with hwe stack + + -- Gianfranco Costamagna Sun, 04 Sep 2022 18:14:55 +0200 + +virtualbox (6.1.38-dfsg-1) unstable; urgency=medium + + * New upstream version 6.1.38-dfsg (Closes: #1012627, LP: #1988473) + + -- Gianfranco Costamagna Sun, 04 Sep 2022 18:12:39 +0200 + +virtualbox-hwe (6.1.36-dfsg-1ubuntu1.22.10.1) kinetic; urgency=medium + + * Build only the guest-* packages with hwe stack + + -- Gianfranco Costamagna Thu, 21 Jul 2022 19:06:15 +0200 + +virtualbox (6.1.36-dfsg-1) unstable; urgency=medium + + * New upstream version 6.1.36-dfsg + * Refresh patches, drop patches now upstream: + - 020-linux518.patch + - ffreestanding.patch + - python3.10.patch + + -- Gianfranco Costamagna Thu, 21 Jul 2022 19:03:38 +0200 + +virtualbox-hwe (6.1.34-dfsg-3ubuntu1.22.10.1) kinetic; urgency=medium + + * Build only the guest-* packages with hwe stack + + -- Gianfranco Costamagna Tue, 07 Jun 2022 14:14:58 +0200 virtualbox (6.1.34-dfsg-3) unstable; urgency=medium diff -Nru virtualbox-hwe-6.1.34-dfsg/debian/control virtualbox-hwe-6.1.38-dfsg/debian/control --- virtualbox-hwe-6.1.34-dfsg/debian/control 2022-05-13 07:38:13.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/debian/control 2022-09-07 11:10:33.000000000 +0000 @@ -255,7 +255,3 @@ utilities are meant to be run inside the virtual machine. They provide closer integration and allow to share data through shared folders between the host system and the virtual machine. - . - Either the virtualbox-guest-dkms or the virtualbox-guest-source package is - also required in order to compile the kernel modules needed for - virtualbox-guest-utils. diff -Nru virtualbox-hwe-6.1.34-dfsg/debian/patches/020-linux518.patch virtualbox-hwe-6.1.38-dfsg/debian/patches/020-linux518.patch --- virtualbox-hwe-6.1.34-dfsg/debian/patches/020-linux518.patch 2022-05-13 07:38:13.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/debian/patches/020-linux518.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,17 +0,0 @@ -Index: trunk/src/VBox/HostDrivers/VBoxNetFlt/linux/VBoxNetFlt-linux.c -=================================================================== ---- trunk/src/VBox/HostDrivers/VBoxNetFlt/linux/VBoxNetFlt-linux.c -+++ trunk/src/VBox/HostDrivers/VBoxNetFlt/linux/VBoxNetFlt-linux.c -@@ -2312,5 +2312,11 @@ - Log6(("vboxNetFltPortOsXmit: pBuf->cb dump:\n%.*Rhxd\n", sizeof(pBuf->cb), pBuf->cb)); - Log6(("vboxNetFltPortOsXmit: netif_rx_ni(%p)\n", pBuf)); -+#if RTLNX_VER_MIN(5,18,0) -+ local_bh_disable(); -+ err = netif_rx(pBuf); -+ local_bh_enable(); -+#else - err = netif_rx_ni(pBuf); -+#endif - if (err) - rc = RTErrConvertFromErrno(err); - diff -Nru virtualbox-hwe-6.1.34-dfsg/debian/patches/02-gsoap-build-fix.patch virtualbox-hwe-6.1.38-dfsg/debian/patches/02-gsoap-build-fix.patch --- virtualbox-hwe-6.1.34-dfsg/debian/patches/02-gsoap-build-fix.patch 2022-01-24 10:51:14.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/debian/patches/02-gsoap-build-fix.patch 2022-09-04 16:14:40.000000000 +0000 @@ -3,7 +3,7 @@ =================================================================== --- virtualbox-git-orig.orig/src/VBox/Main/webservice/Makefile.kmk 2013-12-02 12:32:51.211124975 -0500 +++ virtualbox-git-orig/src/VBox/Main/webservice/Makefile.kmk 2013-12-02 12:36:04.531133954 -0500 -@@ -771,7 +771,7 @@ +@@ -772,7 +772,7 @@ $(RECOMPILE_ON_MAKEFILE_CURRENT) | $$(dir $$@) $(call MSG_GENERATE,,lots of files,$(GSOAPH_RELEVANT)) $(RM) -f $@ diff -Nru virtualbox-hwe-6.1.34-dfsg/debian/patches/12-make-module.patch virtualbox-hwe-6.1.38-dfsg/debian/patches/12-make-module.patch --- virtualbox-hwe-6.1.34-dfsg/debian/patches/12-make-module.patch 2022-01-24 10:51:14.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/debian/patches/12-make-module.patch 2022-09-04 16:14:40.000000000 +0000 @@ -3,12 +3,12 @@ --- a/src/VBox/Installer/linux/Makefile-header.gmk +++ b/src/VBox/Installer/linux/Makefile-header.gmk -@@ -45,7 +45,7 @@ - # (We have to support basic cross building (ARCH=i386|x86_64).) - # While at it, warn about BUILD_* vars found to help with user problems. +@@ -50,7 +50,7 @@ # + + # VBOX_KBUILD_TARGET_ARCH = amd64|x86 -ifeq ($(filter-out x86_64 amd64 AMD64,$(shell uname -m)),) +ifeq ($(filter-out x86_64 amd64 AMD64,$(shell dpkg-architecture -qDEB_HOST_GNU_CPU)),) - BUILD_TARGET_ARCH_DEF := amd64 + VBOX_KBUILD_TARGET_ARCH_DEFAULT := amd64 else - BUILD_TARGET_ARCH_DEF := x86 + VBOX_KBUILD_TARGET_ARCH_DEFAULT := x86 diff -Nru virtualbox-hwe-6.1.34-dfsg/debian/patches/36-fix-vnc-version-string.patch virtualbox-hwe-6.1.38-dfsg/debian/patches/36-fix-vnc-version-string.patch --- virtualbox-hwe-6.1.34-dfsg/debian/patches/36-fix-vnc-version-string.patch 2022-01-24 10:51:14.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/debian/patches/36-fix-vnc-version-string.patch 2022-09-04 16:14:40.000000000 +0000 @@ -1,7 +1,7 @@ Description: fix version string for VNC plugin module. --- a/Config.kmk +++ b/Config.kmk -@@ -3256,6 +3256,7 @@ VBOX_EDIT_VERSION_AND_BUILD_CMD_FN = $(S +@@ -3261,6 +3261,7 @@ VBOX_EDIT_VERSION_AND_BUILD_CMD_FN = $(S -e 's/@VBOX_VERSION_MINOR@/$(VBOX_VERSION_MINOR)/g' \ -e 's/@VBOX_VERSION_BUILD@/$(VBOX_VERSION_BUILD)/g' \ -e 's/@VBOX_VERSION_STRING@/$(VBOX_VERSION_STRING)/g' \ diff -Nru virtualbox-hwe-6.1.34-dfsg/debian/patches/ffreestanding.patch virtualbox-hwe-6.1.38-dfsg/debian/patches/ffreestanding.patch --- virtualbox-hwe-6.1.34-dfsg/debian/patches/ffreestanding.patch 2022-04-29 07:50:22.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/debian/patches/ffreestanding.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,20 +0,0 @@ -diff --git a/Config.kmk b/Config.kmk -index 3df197404..4c6bd76bb 100644 ---- a/Config.kmk -+++ b/Config.kmk -@@ -4503,11 +4504,14 @@ ifeq ($(VBOX_LDR_FMT),elf) - TEMPLATE_VBoxR0_TOOL = $(VBOX_GCC_TOOL) - TEMPLATE_VBoxR0_CFLAGS = -fno-pie -nostdinc -g $(VBOX_GCC_pipe) $(VBOX_GCC_WERR) $(VBOX_GCC_PEDANTIC_C) \ - $(VBOX_GCC_Wno-variadic-macros) $(VBOX_GCC_R0_OPT) $(VBOX_GCC_R0_FP) -fno-strict-aliasing -fno-exceptions \ -- $(VBOX_GCC_fno-stack-protector) -fno-common $(VBOX_GCC_fvisibility-hidden) -std=gnu99 $(VBOX_GCC_IPRT_FMT_CHECK) -+ $(VBOX_GCC_fno-stack-protector) -fno-common -ffreestanding $(VBOX_GCC_fvisibility-hidden) -std=gnu99 $(VBOX_GCC_IPRT_FMT_CHECK) - TEMPLATE_VBoxR0_CXXFLAGS = -fno-pie -nostdinc -g $(VBOX_GCC_pipe) $(VBOX_GCC_WERR) $(VBOX_GCC_PEDANTIC_CXX) \ - $(VBOX_GCC_Wno-variadic-macros) $(VBOX_GCC_R0_OPT) $(VBOX_GCC_R0_FP) -fno-strict-aliasing -fno-exceptions \ - $(VBOX_GCC_fno-stack-protector) -fno-common $(VBOX_GCC_fvisibility-inlines-hidden) $(VBOX_GCC_fvisibility-hidden) \ - -fno-rtti $(VBOX_GCC_IPRT_FMT_CHECK) -+ if $(VBOX_GCC_VERSION_CC) >= 40500 # 4.1.2 complains, 4.5.2 is okay, didn't check which version inbetween made it okay with g++. -+TEMPLATE_VBoxR0_CXXFLAGS += -ffreestanding -+ endif - TEMPLATE_VBoxR0_CFLAGS.amd64 = -m64 -mno-red-zone -mno-sse -mno-mmx -mno-sse2 -mno-3dnow -fasynchronous-unwind-tables -ffreestanding - TEMPLATE_VBoxR0_CXXFLAGS.amd64 = -m64 -mno-red-zone -mno-sse -mno-mmx -mno-sse2 -mno-3dnow -fasynchronous-unwind-tables - TEMPLATE_VBoxR0_CXXFLAGS.freebsd = -ffreestanding diff -Nru virtualbox-hwe-6.1.34-dfsg/debian/patches/latex.patch virtualbox-hwe-6.1.38-dfsg/debian/patches/latex.patch --- virtualbox-hwe-6.1.34-dfsg/debian/patches/latex.patch 1970-01-01 00:00:00.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/debian/patches/latex.patch 2022-09-06 20:05:13.000000000 +0000 @@ -0,0 +1,46 @@ +Description: Cherry-pick upstream changes for LaTeX build fixes. + +Origin: https://www.virtualbox.org/changeset?reponame=vbox&new=96615%40trunk%2Fdoc%2Fmanual%2Fdocbook2latex.xsl&old=96407%40trunk%2Fdoc%2Fmanual%2Fdocbook2latex.xsl&format=diff + +Index: doc/manual/docbook2latex.xsl +=================================================================== +--- a/doc/manual/docbook2latex.xsl (revision 96407) ++++ b/doc/manual/docbook2latex.xsl (revision 96615) +@@ -94,6 +94,4 @@ + \usepackage{geometry} + \geometry{top=3cm,bottom=4cm} +-\usepackage{ucs} +-\usepackage[utf8x]{inputenc} + \usepackage[T1]{fontenc} + \usepackage{tabulary} +@@ -1246,5 +1244,29 @@ + + +- ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ + + diff -Nru virtualbox-hwe-6.1.34-dfsg/debian/patches/python3.10.patch virtualbox-hwe-6.1.38-dfsg/debian/patches/python3.10.patch --- virtualbox-hwe-6.1.34-dfsg/debian/patches/python3.10.patch 2022-01-24 10:51:14.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/debian/patches/python3.10.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,15 +0,0 @@ -Description: Support python3.10 -Author: Gianfranco Costamagna -Last-Update: 2022-01-16 - ---- virtualbox-6.1.30-dfsg.orig/configure -+++ virtualbox-6.1.30-dfsg/configure -@@ -2022,7 +2022,7 @@ extern "C" int main(void) - } - EOF - found= -- SUPPYTHONLIBS="python2.7 python2.6 python3.1 python3.2 python3.3 python3.4 python3.4m python3.5 python3.5m python3.6 python3.6m python3.7 python3.7m python3.8 python3.8m python3.9 python3.9m" -+ SUPPYTHONLIBS="python2.7 python2.6 python3.1 python3.2 python3.3 python3.4 python3.4m python3.5 python3.5m python3.6 python3.6m python3.7 python3.7m python3.8 python3.8m python3.9 python3.9m python3.10 python3.10m" - for p in $PYTHONDIR; do - for d in $SUPPYTHONLIBS; do - for b in lib/x86_64-linux-gnu lib/i386-linux-gnu lib64 lib/64 lib; do diff -Nru virtualbox-hwe-6.1.34-dfsg/debian/patches/series virtualbox-hwe-6.1.38-dfsg/debian/patches/series --- virtualbox-hwe-6.1.34-dfsg/debian/patches/series 2022-05-13 07:38:13.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/debian/patches/series 2022-09-06 13:27:06.000000000 +0000 @@ -14,6 +14,4 @@ 35-libvdeplug-soname.patch 36-fix-vnc-version-string.patch 37-do-not-run-if-not-in-vm.patch -python3.10.patch -ffreestanding.patch -020-linux518.patch +latex.patch diff -Nru virtualbox-hwe-6.1.34-dfsg/debian/virtualbox-guest-utils-hwe.udev virtualbox-hwe-6.1.38-dfsg/debian/virtualbox-guest-utils-hwe.udev --- virtualbox-hwe-6.1.34-dfsg/debian/virtualbox-guest-utils-hwe.udev 2022-01-24 10:51:14.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/debian/virtualbox-guest-utils-hwe.udev 2022-09-06 13:27:06.000000000 +0000 @@ -1,2 +1,2 @@ -KERNEL=="vboxguest", NAME="vboxguest", OWNER="root", MODE="0660" -KERNEL=="vboxuser", NAME="vboxuser", OWNER="root", MODE="0666" +KERNEL=="vboxguest", OWNER="root", MODE="0660" +KERNEL=="vboxuser", OWNER="root", MODE="0666" diff -Nru virtualbox-hwe-6.1.34-dfsg/doc/manual/en_US/man_VBoxManage-modifyvm.xml virtualbox-hwe-6.1.38-dfsg/doc/manual/en_US/man_VBoxManage-modifyvm.xml --- virtualbox-hwe-6.1.34-dfsg/doc/manual/en_US/man_VBoxManage-modifyvm.xml 2022-03-22 23:34:40.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/doc/manual/en_US/man_VBoxManage-modifyvm.xml 2022-09-01 13:17:43.000000000 +0000 @@ -452,6 +452,7 @@ --recordingscreens= all + none screen-ID [screen-ID...] --recordingfile=filename diff -Nru virtualbox-hwe-6.1.34-dfsg/doc/manual/user_ChangeLogImpl.xml virtualbox-hwe-6.1.38-dfsg/doc/manual/user_ChangeLogImpl.xml --- virtualbox-hwe-6.1.34-dfsg/doc/manual/user_ChangeLogImpl.xml 2022-03-22 23:34:41.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/doc/manual/user_ChangeLogImpl.xml 2022-09-01 13:17:44.000000000 +0000 @@ -46,6 +46,196 @@ + + Version 6.1.38 (2022-09-02) + + This is a maintenance release. The following items were fixed + and/or added: + + + + + GUI: Improvements in Native Language Support area + + + + Main: OVF Export: Added support for exporting VMs containing + Virtio-SCSI controllers + + + + Recording settings: Fixed a regression which could cause not starting the COM + server (VBoxSVC) under certain circumstances (bug #21034) + + + + Recording: More deterministic naming for recorded files (will now + overwrite old .webm files if present) + + + + Linux Host and Guest Additions installer: Improved check for systemd presence + in the system (bug #19033) + + + + Linux Guest Additions: Introduced initial support for kernel 6.0 + + + + Linux Guest Additions: Additional fixes for kernel + RHEL 9.1 (bug #21065) + + + + Windows Guest Additions: Improvements in Drag and Drop area + + + + + + + Version 6.1.36 (2022-07-19) + + This is a maintenance release. The following items were fixed + and/or added: + + + + + VMM: Fixed possible Linux guest kernel crash when configuring + Speculative Store Bypass for a single vCPU VM + + + + GUI: In the storage page of the virtual machine settings dialog, + fixed a bug which disrupted mouse interaction with the native file + selector on KDE + + + + NAT: Prevent issue when host resolver incorrectly returned NXDOMAIN + for unsupported queries (bug #20977) + + + + Audio: General improvements in saved state area + + + + Recording: Various fixes for settings handling + + + + VGA: Performance improvements for screen updates when VBE + banking is used + + + + USB: Fixed rare crashes when detaching a USB device + + + + ATA: Fixed NT4 guests taking a minute to eject CDs + + + + vboximg-mount: Fixed broken write support (bug #20896) + + + + SDK: Fixed Python bindings incorrectly trying to convert + arbitrary byte data into unicode objects with Python 3, causing + exceptions (bug #19740) + + + + API: Fixed an issue when virtual USB mass storage devices or + virtual USB DVD drives are added while the VM is not running are + by default not marked as hot-pluggable + + + + API: Initial support for Python 3.10 + + + + API: Solaris OS types cleanup + + + + Windows host: Fixed regression in 6.1.32 leading to guest hangs + when Hyper-V is used (bug #20787) + + + + Windows host: Fixed possible issues with saving and restoring + VM state when using Hyper-V/NEM mode + + + + Linux and Solaris hosts: Allow to mount shared folder if it is + represented as a symlink on a host side (bug #17491) + + + + Linux Host and Guest drivers: Introduced initial support + for kernels 5.18, 5.19 and RHEL 9.1 (bugs #20914, #20941) + + + + Linux Host and Guest drivers: Better support for kernels built + with clang compiler (bugs #20425 and #20998) + + + + Solaris Guest Additions: General improvements in + installer area + + + + Solaris Guest Additions: Fixed guest screen resize in VMSVGA + graphics configuration + + + + Linux and Solaris Guest Additions: Fixed multi-screen handling in + VBoxVGA and VBoxSVGA graphics configuration + + + + Linux and Solaris Guest Additions: Added support for setting + primary screen via VBoxManage + + + + Linux and Solaris Guest Additions: Fixed X11 resources leak + when resizing guest screens + + + + Linux and Solaris Guest Additions: Fixed file descriptor leak when + starting a process using guest control (bug #20902) + + + + Linux and Solaris Guest Additions: Fixed guest control executing + processes as root + + + + Linux Guest Additions: Improved guests booting time by preventing + kernel modules from being rebuilt when it is not necessary (bug #20502) + + + + Windows Guest Additions: Fixed VBoxTray crash on + startup in NT4 guests on rare circumstances + + + + + Version 6.1.34 (2022-03-22) @@ -323,12 +513,12 @@ - macOS host: fix multiple bugs specific to macOS Monterey in + macOS host: Fix multiple bugs specific to macOS Monterey in installer and startup of kernel extensions - macOS host: show message indicating the unsupported CPU on M1 + macOS host: Show message indicating the unsupported CPU on M1 based Macs and abort installation diff -Nru virtualbox-hwe-6.1.34-dfsg/include/iprt/asn1-generator-pass.h virtualbox-hwe-6.1.38-dfsg/include/iprt/asn1-generator-pass.h --- virtualbox-hwe-6.1.34-dfsg/include/iprt/asn1-generator-pass.h 2022-03-22 23:34:46.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/include/iprt/asn1-generator-pass.h 2022-09-01 13:17:50.000000000 +0000 @@ -116,8 +116,8 @@ # define RTASN1TMPL_MEMBER_OPT_XTAG_EX(a_TnNm, a_CtxTagN, a_Name, a_Type, a_Api, a_uTag, a_Constraints) \ extern "C" DECLHIDDEN(RTASN1COREVTABLE const) RT_CONCAT5(g_,RTASN1TMPL_INT_NAME,_XTAG_,a_Name,_Vtable) -# define RTASN1TMPL_MEMBER_DYN_BEGIN(a_enmType, a_enmMembNm, a_Allocation) RTASN1TMPL_SEMICOLON_DUMMY() -# define RTASN1TMPL_MEMBER_DYN_END(a_enmType, a_enmMembNm, a_Allocation) RTASN1TMPL_SEMICOLON_DUMMY() +# define RTASN1TMPL_MEMBER_DYN_BEGIN(a_ObjIdMembNm, a_enmType, a_enmMembNm, a_Allocation) RTASN1TMPL_SEMICOLON_DUMMY() +# define RTASN1TMPL_MEMBER_DYN_END(a_ObjIdMembNm, a_enmType, a_enmMembNm, a_Allocation) RTASN1TMPL_SEMICOLON_DUMMY() # define RTASN1TMPL_END_SEQCORE() RTASN1TMPL_SEMICOLON_DUMMY() # define RTASN1TMPL_END_SETCORE() RTASN1TMPL_SEMICOLON_DUMMY() @@ -151,8 +151,8 @@ # define RTASN1TMPL_BEGIN_SEQCORE() RTASN1TMPL_SEMICOLON_DUMMY() # define RTASN1TMPL_BEGIN_SETCORE() RTASN1TMPL_SEMICOLON_DUMMY() # define RTASN1TMPL_MEMBER_EX(a_Name, a_Type, a_Api, a_Constraints) RTASN1TMPL_SEMICOLON_DUMMY() -# define RTASN1TMPL_MEMBER_DYN_BEGIN(a_enmType, a_enmMembNm, a_Allocation) RTASN1TMPL_SEMICOLON_DUMMY() -# define RTASN1TMPL_MEMBER_DYN_END(a_enmType, a_enmMembNm, a_Allocation) RTASN1TMPL_SEMICOLON_DUMMY() +# define RTASN1TMPL_MEMBER_DYN_BEGIN(a_ObjIdMembNm, a_enmType, a_enmMembNm, a_Allocation) RTASN1TMPL_SEMICOLON_DUMMY() +# define RTASN1TMPL_MEMBER_DYN_END(a_ObjIdMembNm, a_enmType, a_enmMembNm, a_Allocation) RTASN1TMPL_SEMICOLON_DUMMY() # define RTASN1TMPL_MEMBER_OPT_XTAG_EX(a_TnNm, a_CtxTagN, a_Name, a_Type, a_Api, a_uTag, a_Constraints) \ /* This is the method we need to make it work. */ \ static DECLCALLBACK(int) RT_CONCAT4(RTASN1TMPL_INT_NAME,_XTAG_,a_Name,_Enum)(PRTASN1CORE pThisCore, \ @@ -291,8 +291,8 @@ AssertCompileMemberOffset(RTASN1TMPL_TYPE, SetCore, 0); \ RTASN1TMPL_BEGIN_COMMON(ASN1_TAG_SET, ASN1_TAGCLASS_UNIVERSAL | ASN1_TAGFLAG_CONSTRUCTED) # define RTASN1TMPL_MEMBER_EX(a_Name, a_Type, a_Api, a_Constraints) RTASN1TMPL_SEMICOLON_DUMMY() -# define RTASN1TMPL_MEMBER_DYN_BEGIN(a_enmType, a_enmMembNm, a_Allocation) RTASN1TMPL_SEMICOLON_DUMMY() -# define RTASN1TMPL_MEMBER_DYN_END(a_enmType, a_enmMembNm, a_Allocation) RTASN1TMPL_SEMICOLON_DUMMY() +# define RTASN1TMPL_MEMBER_DYN_BEGIN(a_ObjIdMembNm, a_enmType, a_enmMembNm, a_Allocation) RTASN1TMPL_SEMICOLON_DUMMY() +# define RTASN1TMPL_MEMBER_DYN_END(a_ObjIdMembNm, a_enmType, a_enmMembNm, a_Allocation) RTASN1TMPL_SEMICOLON_DUMMY() # define RTASN1TMPL_END_SEQCORE() RTASN1TMPL_SEMICOLON_DUMMY() # define RTASN1TMPL_END_SETCORE() RTASN1TMPL_SEMICOLON_DUMMY() @@ -339,12 +339,12 @@ if (RT_SUCCESS(rc)) \ rc = RT_CONCAT(a_Api,_Init)(&pThis->a_Name, pAllocator) -# define RTASN1TMPL_MEMBER_DYN_BEGIN(a_enmType, a_enmMembNm, a_Allocation) \ +# define RTASN1TMPL_MEMBER_DYN_BEGIN(a_ObjIdMembNm, a_enmType, a_enmMembNm, a_Allocation) \ RTAsn1MemInitAllocation(&pThis->Allocation, pAllocator); \ pThis->a_enmMembNm = RT_CONCAT(a_enmType,_NOT_PRESENT) # define RTASN1TMPL_MEMBER_DYN_COMMON(a_UnionNm, a_PtrName, a_Type, a_Api, a_Allocation, a_enmMembNm, a_enmValue, a_IfStmt) \ do { } while (0) -# define RTASN1TMPL_MEMBER_DYN_END(a_enmType, a_enmMembNm, a_Allocation) do { } while (0) +# define RTASN1TMPL_MEMBER_DYN_END(a_ObjIdMembNm, a_enmType, a_enmMembNm, a_Allocation) do { } while (0) # define RTASN1TMPL_MEMBER_DEF_ITAG_EX(a_Name, a_Type, a_Api, a_uTag, a_fClue, a_DefVal, a_Constraints) \ if (RT_SUCCESS(rc)) \ @@ -362,12 +362,15 @@ # define RTASN1TMPL_END_SETCORE() RTASN1TMPL_END_SEQCORE() /* No choice, just an empty, non-present structure. */ -# define RTASN1TMPL_BEGIN_PCHOICE() RTASN1TMPL_BEGIN_COMMON(); int rc = VINF_SUCCESS +# define RTASN1TMPL_BEGIN_PCHOICE() \ + RTASN1TMPL_BEGIN_COMMON(); \ + RTAsn1MemInitAllocation(&pThis->Allocation, pAllocator); \ + int rc = VINF_SUCCESS # define RTASN1TMPL_PCHOICE_ITAG_EX(a_uTag, a_enmChoice, a_PtrName, a_Name, a_Type, a_Api, a_fClue, a_Constraints) \ do { } while (0) # define RTASN1TMPL_PCHOICE_XTAG_EX(a_uTag, a_enmChoice, a_PtrTnNm, a_CtxTagN, a_Name, a_Type, a_Api, a_Constraints) \ do { } while (0) -# define RTASN1TMPL_END_PCHOICE() RTASN1TMPL_END_COMMON() +# define RTASN1TMPL_END_PCHOICE() RTASN1TMPL_END_COMMON() # define RTASN1TMPL_SET_SEQ_OF_COMMON(a_ItemType, a_ItemApi, a_OfApi, a_OfMember) \ @@ -420,7 +423,7 @@ if (RT_SUCCESS(rc)) \ rc = RT_CONCAT(a_Api,_DecodeAsn1)(pCursor, 0, &pThis->a_Name, #a_Name) -# define RTASN1TMPL_MEMBER_DYN_BEGIN(a_enmType, a_enmMembNm, a_Allocation) \ +# define RTASN1TMPL_MEMBER_DYN_BEGIN(a_ObjIdMembNm, a_enmType, a_enmMembNm, a_Allocation) \ if (RT_SUCCESS(rc)) \ { \ int rc2; /* not initialized! */ \ @@ -438,7 +441,7 @@ rc2 = RT_CONCAT(a_Api,_DecodeAsn1)(pCursor, 0, pThis->a_UnionNm.a_PtrName, #a_UnionNm "." #a_PtrName); \ } \ } while (0) -# define RTASN1TMPL_MEMBER_DYN_END(a_enmType, a_enmMembNm, a_Allocation) \ +# define RTASN1TMPL_MEMBER_DYN_END(a_ObjIdMembNm, a_enmType, a_enmMembNm, a_Allocation) \ rc = rc2; /* Should trigger warning if a _DEFAULT is missing. */ \ } @@ -623,7 +626,7 @@ # define RTASN1TMPL_MEMBER_EX(a_Name, a_Type, a_Api, a_Constraints) \ if (rc == VINF_SUCCESS) \ rc = pfnCallback(RT_CONCAT(a_Api,_GetAsn1Core)(&pThis->a_Name), #a_Name, uDepth, pvUser) -# define RTASN1TMPL_MEMBER_DYN_BEGIN(a_enmType, a_enmMembNm, a_Allocation) \ +# define RTASN1TMPL_MEMBER_DYN_BEGIN(a_ObjIdMembNm, a_enmType, a_enmMembNm, a_Allocation) \ if (rc == VINF_SUCCESS) \ switch (pThis->a_enmMembNm) \ { \ @@ -633,7 +636,7 @@ rc = pfnCallback(RT_CONCAT(a_Api,_GetAsn1Core)(pThis->a_UnionNm.a_PtrName), #a_UnionNm "." #a_PtrName, \ uDepth, pvUser); \ break -# define RTASN1TMPL_MEMBER_DYN_END(a_enmType, a_enmMembNm, a_Allocation) \ +# define RTASN1TMPL_MEMBER_DYN_END(a_ObjIdMembNm, a_enmType, a_enmMembNm, a_Allocation) \ case RT_CONCAT(a_enmType,_NOT_PRESENT): break; \ } # define RTASN1TMPL_MEMBER_OPT_EX(a_Name, a_Type, a_Api, a_Constraints) \ @@ -701,7 +704,7 @@ if (RT_SUCCESS(rc)) \ rc = RT_CONCAT(a_Api,_Clone)(&pThis->a_Name, &pSrc->a_Name, pAllocator); \ -# define RTASN1TMPL_MEMBER_DYN_BEGIN(a_enmType, a_enmMembNm, a_Allocation) \ +# define RTASN1TMPL_MEMBER_DYN_BEGIN(a_ObjIdMembNm, a_enmType, a_enmMembNm, a_Allocation) \ if (RT_SUCCESS(rc)) \ { \ RTAsn1MemInitAllocation(&pThis->Allocation, pAllocator); \ @@ -716,7 +719,7 @@ if (RT_SUCCESS(rc)) \ rc = RT_CONCAT(a_Api,_Clone)(pThis->a_UnionNm.a_PtrName, pSrc->a_UnionNm.a_PtrName, pAllocator); \ break -# define RTASN1TMPL_MEMBER_DYN_END(a_enmType, a_enmMembNm, a_Allocation) \ +# define RTASN1TMPL_MEMBER_DYN_END(a_ObjIdMembNm, a_enmType, a_enmMembNm, a_Allocation) \ case RT_CONCAT(a_enmType,_NOT_PRESENT): break; \ } \ } @@ -830,20 +833,20 @@ } RTASN1TMPL_SEMICOLON_DUMMY() #endif -# define RTASN1TMPL_MEMBER_DYN_BEGIN(a_enmType, a_enmMembNm, a_Allocation) RTASN1TMPL_SEMICOLON_DUMMY() -# define RTASN1TMPL_MEMBER_DYN_END(a_enmType, a_enmMembNm, a_Allocation) RTASN1TMPL_SEMICOLON_DUMMY() -# define RTASN1TMPL_END_SEQCORE() RTASN1TMPL_SEMICOLON_DUMMY() -# define RTASN1TMPL_END_SETCORE() RTASN1TMPL_SEMICOLON_DUMMY() +# define RTASN1TMPL_MEMBER_DYN_BEGIN(a_ObjIdMembNm, a_enmType, a_enmMembNm, a_Allocation) RTASN1TMPL_SEMICOLON_DUMMY() +# define RTASN1TMPL_MEMBER_DYN_END(a_ObjIdMembNm, a_enmType, a_enmMembNm, a_Allocation) RTASN1TMPL_SEMICOLON_DUMMY() +# define RTASN1TMPL_END_SEQCORE() RTASN1TMPL_SEMICOLON_DUMMY() +# define RTASN1TMPL_END_SETCORE() RTASN1TMPL_SEMICOLON_DUMMY() -# define RTASN1TMPL_BEGIN_PCHOICE() RTASN1TMPL_SEMICOLON_DUMMY() +# define RTASN1TMPL_BEGIN_PCHOICE() RTASN1TMPL_SEMICOLON_DUMMY() # define RTASN1TMPL_PCHOICE_ITAG_EX(a_uTag, a_enmChoice, a_PtrName, a_Name, a_Type, a_Api, a_fClue, a_Constraints) RTASN1TMPL_SEMICOLON_DUMMY() # define RTASN1TMPL_PCHOICE_XTAG_EX(a_uTag, a_enmChoice, a_PtrTnNm, a_CtxTagN, a_Name, a_Type, a_Api, a_Constraints) RTASN1TMPL_SEMICOLON_DUMMY() -# define RTASN1TMPL_END_PCHOICE() RTASN1TMPL_SEMICOLON_DUMMY() +# define RTASN1TMPL_END_PCHOICE() RTASN1TMPL_SEMICOLON_DUMMY() -# define RTASN1TMPL_SEQ_OF(a_ItemType, a_ItemApi) RTASN1TMPL_SEMICOLON_DUMMY() -# define RTASN1TMPL_SET_OF(a_ItemType, a_ItemApi) RTASN1TMPL_SEMICOLON_DUMMY() +# define RTASN1TMPL_SEQ_OF(a_ItemType, a_ItemApi) RTASN1TMPL_SEMICOLON_DUMMY() +# define RTASN1TMPL_SET_OF(a_ItemType, a_ItemApi) RTASN1TMPL_SEMICOLON_DUMMY() @@ -853,22 +856,100 @@ * Member setters. * */ -# define RTASN1TMPL_BEGIN_SEQCORE() RTASN1TMPL_SEMICOLON_DUMMY() -# define RTASN1TMPL_BEGIN_SETCORE() RTASN1TMPL_SEMICOLON_DUMMY() -# define RTASN1TMPL_MEMBER_EX(a_Name, a_Type, a_Api, a_Constraints) RTASN1TMPL_SEMICOLON_DUMMY() -# define RTASN1TMPL_MEMBER_DYN_BEGIN(a_enmType, a_enmMembNm, a_Allocation) RTASN1TMPL_SEMICOLON_DUMMY() -# define RTASN1TMPL_MEMBER_DYN_END(a_enmType, a_enmMembNm, a_Allocation) RTASN1TMPL_SEMICOLON_DUMMY() -# define RTASN1TMPL_END_SEQCORE() RTASN1TMPL_SEMICOLON_DUMMY() -# define RTASN1TMPL_END_SETCORE() RTASN1TMPL_SEMICOLON_DUMMY() +# define RTASN1TMPL_BEGIN_SEQCORE() RTASN1TMPL_SEMICOLON_DUMMY() +# define RTASN1TMPL_BEGIN_SETCORE() RTASN1TMPL_SEMICOLON_DUMMY() +# define RTASN1TMPL_MEMBER_EX(a_Name, a_Type, a_Api, a_Constraints) RTASN1TMPL_SEMICOLON_DUMMY() +# define RTASN1TMPL_MEMBER_DYN_BEGIN(a_ObjIdMembNm, a_enmType, a_enmMembNm, a_Allocation) RTASN1TMPL_SEMICOLON_DUMMY() + +# define RTASN1TMPL_MEMBER_DYN(a_UnionNm, a_PtrName, a_Name, a_Type, a_Api, a_Allocation, a_ObjIdMembNm, a_enmMembNm, a_enmValue, a_szObjId) \ +RTASN1TMPL_DECL(int) RT_CONCAT3(RTASN1TMPL_EXT_NAME,_Set,a_Name)(RT_CONCAT(P,RTASN1TMPL_TYPE) pThis, \ + RT_CONCAT(PC,a_Type) pToClone,\ + PCRTASN1ALLOCATORVTABLE pAllocator) \ +{ \ + AssertPtr(pThis); AssertPtrNull(pToClone); Assert(!pToClone || RT_CONCAT(a_Api,_IsPresent)(pToClone)); \ + AssertReturn(pThis->a_UnionNm.a_PtrName == NULL, VERR_INVALID_STATE); /* for now */ \ + /* Set the type */ \ + if (RTAsn1ObjId_IsPresent(&pThis->a_ObjIdMembNm)) \ + RTAsn1ObjId_Delete(&pThis->a_ObjIdMembNm); \ + int rc = RTAsn1ObjId_InitFromString(&pThis->a_ObjIdMembNm, a_szObjId, pAllocator); \ + if (RT_SUCCESS(rc)) \ + { \ + pThis->a_enmMembNm = a_enmValue; \ + \ + /* Allocate memory for the structure we're targeting. */ \ + rc = RTAsn1MemAllocZ(&pThis->a_Allocation, (void **)&pThis->a_UnionNm.a_PtrName, sizeof(*pThis->a_UnionNm.a_PtrName)); \ + if (RT_SUCCESS(rc)) \ + { \ + if (pToClone) /* If nothing to clone, just initialize the structure. */ \ + rc = RT_CONCAT(a_Api,_Clone)(pThis->a_UnionNm.a_PtrName, pToClone, pAllocator); \ + else \ + rc = RT_CONCAT(a_Api,_Init)(pThis->a_UnionNm.a_PtrName, pAllocator); \ + } \ + } \ + return rc; \ +} RTASN1TMPL_SEMICOLON_DUMMY() + + + +# define RTASN1TMPL_MEMBER_DYN_END(a_ObjIdMembNm, a_enmType, a_enmMembNm, a_Allocation) RTASN1TMPL_SEMICOLON_DUMMY() +# define RTASN1TMPL_END_SEQCORE() RTASN1TMPL_SEMICOLON_DUMMY() +# define RTASN1TMPL_END_SETCORE() RTASN1TMPL_SEMICOLON_DUMMY() + +# define RTASN1TMPL_MEMBER_OPT_ITAG_EX(a_Name, a_Type, a_Api, a_uTag, a_fClue, a_Constraints) \ +RTASN1TMPL_DECL(int) RT_CONCAT3(RTASN1TMPL_EXT_NAME,_Set,a_Name)(RT_CONCAT(P,RTASN1TMPL_TYPE) pThis, \ + RT_CONCAT(PC,a_Type) pToClone,\ + PCRTASN1ALLOCATORVTABLE pAllocator) \ +{ \ + AssertPtr(pThis); AssertPtrNull(pToClone); Assert(!pToClone || RT_CONCAT(a_Api,_IsPresent)(pToClone)); \ + if (RT_CONCAT(a_Api,_IsPresent)(&pThis->a_Name)) \ + RT_CONCAT(a_Api,_Delete)(&pThis->a_Name); \ + \ + int rc; \ + if (pToClone) \ + rc = RT_CONCAT(a_Api,_Clone)(&pThis->a_Name, pToClone, pAllocator); \ + else \ + rc = RT_CONCAT(a_Api,_Init)(&pThis->a_Name, pAllocator); \ + if (RT_SUCCESS(rc)) \ + { \ + RTAsn1Core_ResetImplict(RT_CONCAT(a_Api,_GetAsn1Core)(&pThis->a_Name)); /* probably not needed */ \ + rc = RTAsn1Core_SetTagAndFlags(RT_CONCAT(a_Api,_GetAsn1Core)(&pThis->a_Name), \ + a_uTag, RTASN1TMPL_ITAG_F_EXPAND(a_fClue)); \ + } \ + return rc; \ +} RTASN1TMPL_SEMICOLON_DUMMY() +# define RTASN1TMPL_MEMBER_OPT_XTAG_EX(a_TnNm, a_CtxTagN, a_Name, a_Type, a_Api, a_uTag, a_Constraints) \ +RTASN1TMPL_DECL(int) RT_CONCAT3(RTASN1TMPL_EXT_NAME,_Set,a_Name)(RT_CONCAT(P,RTASN1TMPL_TYPE) pThis, \ + RT_CONCAT(PC,a_Type) pToClone,\ + PCRTASN1ALLOCATORVTABLE pAllocator) \ +{ \ + AssertPtr(pThis); AssertPtrNull(pToClone); Assert(!pToClone || RT_CONCAT(a_Api,_IsPresent)(pToClone)); \ + if (RTASN1CORE_IS_PRESENT(&pThis->a_TnNm.a_CtxTagN.Asn1Core)) \ + RT_CONCAT(a_Api,_Delete)(&pThis->a_TnNm.a_Name); \ + \ + int rc = RT_CONCAT3(RTAsn1ContextTag,a_uTag,_Init)(&pThis->a_TnNm.a_CtxTagN, \ + &RT_CONCAT5(g_,RTASN1TMPL_INT_NAME,_XTAG_,a_Name,_Vtable), \ + pAllocator); \ + if (RT_SUCCESS(rc)) \ + { \ + if (pToClone) \ + rc = RT_CONCAT(a_Api,_Clone)(&pThis->a_TnNm.a_Name, pToClone, pAllocator); \ + else \ + rc = RT_CONCAT(a_Api,_Init)(&pThis->a_TnNm.a_Name, pAllocator); \ + if (RT_SUCCESS(rc) && pToClone) \ + RTAsn1Core_ResetImplict(RT_CONCAT(a_Api,_GetAsn1Core)(&pThis->a_TnNm.a_Name)); \ + } \ + return rc; \ +} RTASN1TMPL_SEMICOLON_DUMMY() # define RTASN1TMPL_BEGIN_PCHOICE() RTASN1TMPL_SEMICOLON_DUMMY() # define RTASN1TMPL_PCHOICE_ITAG_EX(a_uTag, a_enmChoice, a_PtrName, a_Name, a_Type, a_Api, a_fClue, a_Constraints) \ -RTASN1TMPL_DECL(int) RT_CONCAT3(RTASN1TMPL_EXT_NAME,_Set,a_Name)(RT_CONCAT(P,RTASN1TMPL_TYPE) pThis, RT_CONCAT(PC,a_Type) pSrc,\ +RTASN1TMPL_DECL(int) RT_CONCAT3(RTASN1TMPL_EXT_NAME,_Set,a_Name)(RT_CONCAT(P,RTASN1TMPL_TYPE) pThis, \ + RT_CONCAT(PC,a_Type) pToClone,\ PCRTASN1ALLOCATORVTABLE pAllocator) \ { \ - AssertPtr(pSrc); AssertPtr(pThis); \ + AssertPtrNull(pToClone); AssertPtr(pThis); \ RT_CONCAT(RTASN1TMPL_EXT_NAME,_Delete)(pThis); /* See _Init. */ \ RTAsn1Dummy_InitEx(&pThis->Dummy); \ pThis->Dummy.Asn1Core.pOps = &RT_CONCAT3(g_,RTASN1TMPL_INT_NAME,_Vtable); \ @@ -877,10 +958,14 @@ int rc = RTAsn1MemAllocZ(&pThis->Allocation, (void **)&pThis->a_PtrName, sizeof(*pThis->a_PtrName)); \ if (RT_SUCCESS(rc)) \ { \ - rc = RT_CONCAT(a_Api,_Clone)(pThis->a_PtrName, pSrc, pAllocator); \ + if (pToClone) \ + rc = RT_CONCAT(a_Api,_Clone)(pThis->a_PtrName, pToClone, pAllocator); \ + else \ + rc = RT_CONCAT(a_Api,_Init)(pThis->a_PtrName, pAllocator); \ if (RT_SUCCESS(rc)) \ { \ - RTAsn1Core_ResetImplict(RT_CONCAT(a_Api,_GetAsn1Core)(pThis->a_PtrName)); \ + if (pToClone) \ + RTAsn1Core_ResetImplict(RT_CONCAT(a_Api,_GetAsn1Core)(pThis->a_PtrName)); \ rc = RTAsn1Core_SetTagAndFlags(RT_CONCAT(a_Api,_GetAsn1Core)(pThis->a_PtrName), \ a_uTag, RTASN1TMPL_ITAG_F_EXPAND(a_fClue)); \ } \ @@ -889,10 +974,11 @@ } RTASN1TMPL_SEMICOLON_DUMMY() # define RTASN1TMPL_PCHOICE_XTAG_EX(a_uTag, a_enmChoice, a_PtrTnNm, a_CtxTagN, a_Name, a_Type, a_Api, a_Constraints) \ -RTASN1TMPL_DECL(int) RT_CONCAT3(RTASN1TMPL_EXT_NAME,_Set,a_Name)(RT_CONCAT(P,RTASN1TMPL_TYPE) pThis, RT_CONCAT(PC,a_Type) pSrc,\ +RTASN1TMPL_DECL(int) RT_CONCAT3(RTASN1TMPL_EXT_NAME,_Set,a_Name)(RT_CONCAT(P,RTASN1TMPL_TYPE) pThis, \ + RT_CONCAT(PC,a_Type) pToClone,\ PCRTASN1ALLOCATORVTABLE pAllocator) \ { \ - AssertPtr(pThis); AssertPtr(pSrc); Assert(RT_CONCAT(a_Api,_IsPresent)(pSrc)); \ + AssertPtr(pThis); AssertPtrNull(pToClone); Assert(!pToClone || RT_CONCAT(a_Api,_IsPresent)(pToClone)); \ RT_CONCAT(RTASN1TMPL_EXT_NAME,_Delete)(pThis); /* See _Init. */ \ RTAsn1Dummy_InitEx(&pThis->Dummy); \ pThis->Dummy.Asn1Core.pOps = &RT_CONCAT3(g_,RTASN1TMPL_INT_NAME,_Vtable); \ @@ -906,8 +992,11 @@ pAllocator); \ if (RT_SUCCESS(rc)) \ { \ - rc = RT_CONCAT(a_Api,_Clone)(&pThis->a_PtrTnNm->a_Name, pSrc, pAllocator); \ - if (RT_SUCCESS(rc)) \ + if (pToClone) \ + rc = RT_CONCAT(a_Api,_Clone)(&pThis->a_PtrTnNm->a_Name, pToClone, pAllocator); \ + else \ + rc = RT_CONCAT(a_Api,_Init)(&pThis->a_PtrTnNm->a_Name, pAllocator); \ + if (RT_SUCCESS(rc) && pToClone) \ RTAsn1Core_ResetImplict(RT_CONCAT(a_Api,_GetAsn1Core)(&pThis->a_PtrTnNm->a_Name)); \ } \ } \ @@ -927,19 +1016,19 @@ * Array operations. * */ -# define RTASN1TMPL_BEGIN_SEQCORE() RTASN1TMPL_SEMICOLON_DUMMY() -# define RTASN1TMPL_BEGIN_SETCORE() RTASN1TMPL_SEMICOLON_DUMMY() -# define RTASN1TMPL_MEMBER_EX(a_Name, a_Type, a_Api, a_Constraints) RTASN1TMPL_SEMICOLON_DUMMY() -# define RTASN1TMPL_MEMBER_DYN_BEGIN(a_enmType, a_enmMembNm, a_Allocation) RTASN1TMPL_SEMICOLON_DUMMY() -# define RTASN1TMPL_MEMBER_DYN_END(a_enmType, a_enmMembNm, a_Allocation) RTASN1TMPL_SEMICOLON_DUMMY() -# define RTASN1TMPL_END_SEQCORE() RTASN1TMPL_SEMICOLON_DUMMY() -# define RTASN1TMPL_END_SETCORE() RTASN1TMPL_SEMICOLON_DUMMY() -# define RTASN1TMPL_BEGIN_PCHOICE() RTASN1TMPL_SEMICOLON_DUMMY() +# define RTASN1TMPL_BEGIN_SEQCORE() RTASN1TMPL_SEMICOLON_DUMMY() +# define RTASN1TMPL_BEGIN_SETCORE() RTASN1TMPL_SEMICOLON_DUMMY() +# define RTASN1TMPL_MEMBER_EX(a_Name, a_Type, a_Api, a_Constraints) RTASN1TMPL_SEMICOLON_DUMMY() +# define RTASN1TMPL_MEMBER_DYN_BEGIN(a_ObjIdMembNm, a_enmType, a_enmMembNm, a_Allocation) RTASN1TMPL_SEMICOLON_DUMMY() +# define RTASN1TMPL_MEMBER_DYN_END(a_ObjIdMembNm, a_enmType, a_enmMembNm, a_Allocation) RTASN1TMPL_SEMICOLON_DUMMY() +# define RTASN1TMPL_END_SEQCORE() RTASN1TMPL_SEMICOLON_DUMMY() +# define RTASN1TMPL_END_SETCORE() RTASN1TMPL_SEMICOLON_DUMMY() +# define RTASN1TMPL_BEGIN_PCHOICE() RTASN1TMPL_SEMICOLON_DUMMY() # define RTASN1TMPL_PCHOICE_ITAG_EX(a_uTag, a_enmChoice, a_PtrName, a_Name, a_Type, a_Api, a_fClue, a_Constraints) \ - RTASN1TMPL_SEMICOLON_DUMMY() + RTASN1TMPL_SEMICOLON_DUMMY() # define RTASN1TMPL_PCHOICE_XTAG_EX(a_uTag, a_enmChoice, a_PtrTnNm, a_CtxTagN, a_Name, a_Type, a_Api, a_Constraints) \ - RTASN1TMPL_SEMICOLON_DUMMY() -# define RTASN1TMPL_END_PCHOICE() RTASN1TMPL_SEMICOLON_DUMMY() + RTASN1TMPL_SEMICOLON_DUMMY() +# define RTASN1TMPL_END_PCHOICE() RTASN1TMPL_SEMICOLON_DUMMY() # define RTASN1TMPL_SET_SEQ_OF_COMMON(a_ItemType, a_ItemApi) \ RTASN1TMPL_DECL(int) RT_CONCAT(RTASN1TMPL_EXT_NAME,_Erase)(RT_CONCAT(P,RTASN1TMPL_TYPE) pThis, uint32_t iPosition) \ @@ -1048,7 +1137,7 @@ # define RTASN1TMPL_MEMBER_EX(a_Name, a_Type, a_Api, a_Constraints) \ if (!iDiff) \ iDiff = RT_CONCAT(a_Api,_Compare)(&pLeft->a_Name, &pRight->a_Name) -# define RTASN1TMPL_MEMBER_DYN_BEGIN(a_enmType, a_enmMembNm, a_Allocation) \ +# define RTASN1TMPL_MEMBER_DYN_BEGIN(a_ObjIdMembNm, a_enmType, a_enmMembNm, a_Allocation) \ if (!iDiff && pLeft->a_enmMembNm != pRight->a_enmMembNm) \ iDiff = pLeft->a_enmMembNm < pRight->a_enmMembNm ? -1 : 1; \ else if (!iDiff) \ @@ -1057,7 +1146,7 @@ default: break # define RTASN1TMPL_MEMBER_DYN_COMMON(a_UnionNm, a_PtrName, a_Type, a_Api, a_Allocation, a_enmMembNm, a_enmValue, a_IfStmt) \ case a_enmValue: iDiff = RT_CONCAT(a_Api,_Compare)(pLeft->a_UnionNm.a_PtrName, pRight->a_UnionNm.a_PtrName); break -# define RTASN1TMPL_MEMBER_DYN_END(a_enmType, a_enmMembNm, a_Allocation) \ +# define RTASN1TMPL_MEMBER_DYN_END(a_ObjIdMembNm, a_enmType, a_enmMembNm, a_Allocation) \ case RT_CONCAT(a_enmType,_NOT_PRESENT): break; \ } # define RTASN1TMPL_MEMBER_OPT_XTAG_EX(a_TnNm, a_CtxTagN, a_Name, a_Type, a_Api, a_uTag, a_Constraints) \ @@ -1146,7 +1235,7 @@ rc = RTErrInfoSetF(pErrInfo, VERR_GENERAL_FAILURE, "%s: Missing member %s (%s).", \ pszErrorTag, #a_Name, RT_XSTR(RTASN1TMPL_TYPE)); \ } do {} while (0) -# define RTASN1TMPL_MEMBER_DYN_BEGIN(a_enmType, a_enmMembNm, a_Allocation) \ +# define RTASN1TMPL_MEMBER_DYN_BEGIN(a_ObjIdMembNm, a_enmType, a_enmMembNm, a_Allocation) \ if (RT_SUCCESS(rc)) \ switch (pThis->a_enmMembNm) \ { \ @@ -1159,7 +1248,7 @@ rc = RT_CONCAT(a_Api,_CheckSanity)(pThis->a_UnionNm.a_PtrName, fFlags & RTASN1_CHECK_SANITY_F_COMMON_MASK, \ pErrInfo, RT_XSTR(RTASN1TMPL_TYPE) "::" #a_UnionNm "." #a_PtrName); \ break -# define RTASN1TMPL_MEMBER_DYN_END(a_enmType, a_enmMembNm, a_Allocation) \ +# define RTASN1TMPL_MEMBER_DYN_END(a_ObjIdMembNm, a_enmType, a_enmMembNm, a_Allocation) \ case RT_CONCAT(a_enmType,_NOT_PRESENT): \ rc = RTErrInfoSetF(pErrInfo, VERR_GENERAL_FAILURE, \ "%s: Invalid " #a_enmMembNm " value: " #a_enmType "_NOT_PRESENT", pszErrorTag); \ @@ -1325,7 +1414,7 @@ # define RTASN1TMPL_BEGIN_SEQCORE() RTASN1TMPL_BEGIN_COMMON() # define RTASN1TMPL_BEGIN_SETCORE() RTASN1TMPL_BEGIN_COMMON() # define RTASN1TMPL_MEMBER_EX(a_Name, a_Type, a_Api, a_Constraints) RT_CONCAT(a_Api,_Delete)(&pThis->a_Name) -# define RTASN1TMPL_MEMBER_DYN_BEGIN(a_enmType, a_enmMembNm, a_Allocation) \ +# define RTASN1TMPL_MEMBER_DYN_BEGIN(a_ObjIdMembNm, a_enmType, a_enmMembNm, a_Allocation) \ switch (pThis->a_enmMembNm) \ { \ default: break @@ -1338,7 +1427,7 @@ pThis->a_UnionNm.a_PtrName = NULL; \ } \ break -# define RTASN1TMPL_MEMBER_DYN_END(a_enmType, a_enmMembNm, a_Allocation) \ +# define RTASN1TMPL_MEMBER_DYN_END(a_ObjIdMembNm, a_enmType, a_enmMembNm, a_Allocation) \ } # define RTASN1TMPL_END_SEQCORE() RTASN1TMPL_END_COMMON() # define RTASN1TMPL_END_SETCORE() RTASN1TMPL_END_COMMON() @@ -1425,21 +1514,21 @@ /* Any/dynamic members. */ #ifndef RTASN1TMPL_MEMBER_DYN_BEGIN -# define RTASN1TMPL_MEMBER_DYN_BEGIN(a_enmType, a_enmMembNm, a_Allocation) do { } while (0) +# define RTASN1TMPL_MEMBER_DYN_BEGIN(a_ObjIdMembNm, a_enmType, a_enmMembNm, a_Allocation) do { } while (0) #endif #ifndef RTASN1TMPL_MEMBER_DYN_END -# define RTASN1TMPL_MEMBER_DYN_END(a_enmType, a_enmMembNm, a_Allocation) do { } while (0) +# define RTASN1TMPL_MEMBER_DYN_END(a_ObjIdMembNm, a_enmType, a_enmMembNm, a_Allocation) do { } while (0) #endif #ifndef RTASN1TMPL_MEMBER_DYN_COMMON # define RTASN1TMPL_MEMBER_DYN_COMMON(a_UnionNm, a_PtrName, a_Type, a_Api, a_Allocation, a_enmMembNm, a_enmValue, a_IfStmt) \ RTASN1TMPL_MEMBER(a_UnionNm.a_PtrName, a_Type, a_Api) #endif #ifndef RTASN1TMPL_MEMBER_DYN -# define RTASN1TMPL_MEMBER_DYN(a_UnionNm, a_PtrName, a_Type, a_Api, a_Allocation, a_enmMembNm, a_enmValue, a_WhenExpr) \ - RTASN1TMPL_MEMBER_DYN_COMMON(a_UnionNm, a_PtrName, a_Type, a_Api, a_Allocation, a_enmMembNm, a_enmValue, if (a_WhenExpr)) +# define RTASN1TMPL_MEMBER_DYN(a_UnionNm, a_PtrName, a_Name, a_Type, a_Api, a_Allocation, a_ObjIdMembNm, a_enmMembNm, a_enmValue, a_szObjId) \ + RTASN1TMPL_MEMBER_DYN_COMMON(a_UnionNm, a_PtrName, a_Type, a_Api, a_Allocation, a_enmMembNm, a_enmValue, if (RTAsn1ObjId_CompareWithString(&pThis->a_ObjIdMembNm, a_szObjId) == 0)) #endif #ifndef RTASN1TMPL_MEMBER_DYN_DEFAULT -# define RTASN1TMPL_MEMBER_DYN_DEFAULT(a_UnionNm, a_PtrName, a_Type, a_Api, a_Allocation, a_enmMembNm, a_enmValue) \ +# define RTASN1TMPL_MEMBER_DYN_DEFAULT(a_UnionNm, a_PtrName, a_Type, a_Api, a_Allocation, a_ObjIdMembNm, a_enmMembNm, a_enmValue) \ RTASN1TMPL_MEMBER_DYN_COMMON(a_UnionNm, a_PtrName, a_Type, a_Api, a_Allocation, a_enmMembNm, a_enmValue, RT_NOTHING) #endif diff -Nru virtualbox-hwe-6.1.34-dfsg/include/iprt/asn1.h virtualbox-hwe-6.1.38-dfsg/include/iprt/asn1.h --- virtualbox-hwe-6.1.34-dfsg/include/iprt/asn1.h 2022-03-22 23:34:46.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/include/iprt/asn1.h 2022-09-01 13:17:50.000000000 +0000 @@ -949,7 +949,7 @@ * * @remarks Currently assume unsigned number. */ -RTDECL(int) RTAsn1Integer_ToString(PRTASN1INTEGER pThis, char *pszBuf, size_t cbBuf, uint32_t fFlags, size_t *pcbActual); +RTDECL(int) RTAsn1Integer_ToString(PCRTASN1INTEGER pThis, char *pszBuf, size_t cbBuf, uint32_t fFlags, size_t *pcbActual); RTASN1_IMPL_GEN_SEQ_OF_TYPEDEFS_AND_PROTOS(RTASN1SEQOFINTEGERS, RTASN1INTEGER, RTDECL, RTAsn1SeqOfIntegers); RTASN1_IMPL_GEN_SET_OF_TYPEDEFS_AND_PROTOS(RTASN1SETOFINTEGERS, RTASN1INTEGER, RTDECL, RTAsn1SetOfIntegers); @@ -1025,8 +1025,37 @@ */ RTDECL(int) RTAsn1Time_CompareWithTimeSpec(PCRTASN1TIME pLeft, PCRTTIMESPEC pTsRight); +/** + * Extended init function that lets you select the kind of time object (UTC or + * generalized). + */ RTDECL(int) RTAsn1Time_InitEx(PRTASN1TIME pThis, uint32_t uTag, PCRTASN1ALLOCATORVTABLE pAllocator); +/** + * Combines RTAsn1Time_InitEx() and RTAsn1Time_SetTime(). + */ +RTDECL(int) RTAsn1Time_InitWithTime(PRTASN1TIME pThis, uint32_t uTag, PCRTASN1ALLOCATORVTABLE pAllocator, PCRTTIME pTime); + +/** + * Sets the ASN.1 time value to @a pTime. + * + * @returns IPRT status code. + * @param pThis The ASN.1 time object to modify. + * @param pAllocator The allocator to use. + * @param pTime The time to set. + */ +RTDECL(int) RTAsn1Time_SetTime(PRTASN1TIME pThis, PCRTASN1ALLOCATORVTABLE pAllocator, PCRTTIME pTime); + +/** + * Sets the ASN.1 time value to @a pTimeSpec. + * + * @returns IPRT status code. + * @param pThis The ASN.1 time object to modify. + * @param pAllocator The allocator to use. + * @param pTimeSpec The time to set. + */ +RTDECL(int) RTAsn1Time_SetTimeSpec(PRTASN1TIME pThis, PCRTASN1ALLOCATORVTABLE pAllocator, PCRTTIMESPEC pTimeSpec); + /** @name Predicate macros for determing the exact type of RTASN1TIME. * @{ */ /** True if UTC time. */ @@ -1075,6 +1104,7 @@ RTASN1TYPE_STANDARD_PROTOTYPES(RTASN1OBJID, RTDECL, RTAsn1ObjId, Asn1Core); RTDECL(int) RTAsn1ObjId_InitFromString(PRTASN1OBJID pThis, const char *pszObjId, PCRTASN1ALLOCATORVTABLE pAllocator); +RTDECL(int) RTAsn1ObjId_SetFromString(PRTASN1OBJID pThis, const char *pszObjId, PCRTASN1ALLOCATORVTABLE pAllocator); /** * Compares an ASN.1 object identifier with a dotted object identifier string. @@ -1153,6 +1183,8 @@ */ #define RTASN1BITSTRING_GET_BYTE_SIZE(a_pBitString) ( ((a_pBitString)->cBits + 7U) >> 3 ) +RTDECL(int) RTAsn1BitString_InitWithData(PRTASN1BITSTRING pThis, void const *pvSrc, uint32_t cSrcBits, + PCRTASN1ALLOCATORVTABLE pAllocator); RTDECL(int) RTAsn1BitString_DecodeAsn1Ex(PRTASN1CURSOR pCursor, uint32_t fFlags, uint32_t cMaxBits, PRTASN1BITSTRING pThis, const char *pszErrorTag); RTDECL(uint64_t) RTAsn1BitString_GetAsUInt64(PCRTASN1BITSTRING pThis); @@ -1190,6 +1222,10 @@ RTASN1TYPE_STANDARD_PROTOTYPES(RTASN1OCTETSTRING, RTDECL, RTAsn1OctetString, Asn1Core); +RTDECL(int) RTAsn1OctetString_AllocContent(PRTASN1OCTETSTRING pThis, void const *pvSrc, size_t cb, + PCRTASN1ALLOCATORVTABLE pAllocator); +RTDECL(int) RTAsn1OctetString_SetContent(PRTASN1OCTETSTRING pThis, void const *pvSrc, size_t cbSrc, + PCRTASN1ALLOCATORVTABLE pAllocator); RTDECL(bool) RTAsn1OctetString_AreContentBytesValid(PCRTASN1OCTETSTRING pThis, uint32_t fFlags); RTDECL(int) RTAsn1OctetString_RefreshContent(PRTASN1OCTETSTRING pThis, uint32_t fFlags, PCRTASN1ALLOCATORVTABLE pAllocator, PRTERRINFO pErrInfo); @@ -1473,6 +1509,7 @@ /** Pointer to a const ASN.1 dynamic type record. */ typedef RTASN1DYNTYPE const *PCRTASN1DYNTYPE; RTASN1TYPE_STANDARD_PROTOTYPES(RTASN1DYNTYPE, RTDECL, RTAsn1DynType, u.Core); +RTDECL(int) RTAsn1DynType_SetToNull(PRTASN1DYNTYPE pThis); /** @name Virtual Method Table Based API @@ -1630,6 +1667,28 @@ */ RTDECL(int) RTAsn1EncodeToBuffer(PCRTASN1CORE pRoot, uint32_t fFlags, void *pvBuf, size_t cbBuf, PRTERRINFO pErrInfo); +/** + * Helper for when DER encoded ASN.1 is needed for something. + * + * Handy when interfacing with OpenSSL and the many d2i_Xxxxx OpenSSL functions, + * but also handy when structures needs to be digested or similar during signing + * or verification. + * + * We sometimes can use the data we've decoded directly, but often we have + * encode it into a temporary heap buffer. + * + * @returns IPRT status code, details in @a pErrInfo if present. + * @param pRoot The ASN.1 root of the structure to be passed to OpenSSL. + * @param ppbRaw Where to return the pointer to raw encoded data. + * @param pcbRaw Where to return the size of the raw encoded data. + * @param ppvFree Where to return what to pass to RTMemTmpFree, i.e. NULL + * if we use the previously decoded data directly and + * non-NULL if we had to allocate heap and encode it. + * @param pErrInfo Where to return details about encoding issues. Optional. + */ +RTDECL(int) RTAsn1EncodeQueryRawBits(PRTASN1CORE pRoot, const uint8_t **ppbRaw, uint32_t *pcbRaw, + void **ppvFree, PRTERRINFO pErrInfo); + /** @} */ diff -Nru virtualbox-hwe-6.1.34-dfsg/include/iprt/base64.h virtualbox-hwe-6.1.38-dfsg/include/iprt/base64.h --- virtualbox-hwe-6.1.34-dfsg/include/iprt/base64.h 2022-03-22 23:34:46.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/include/iprt/base64.h 2022-09-01 13:17:50.000000000 +0000 @@ -52,7 +52,11 @@ /** Insert line breaks into encoded string. * The size of the end-of-line marker is that that of the host platform. */ -#define RTBASE64_FLAGS_NO_LINE_BREAKS RT_BIT_32(0) +#define RTBASE64_FLAGS_EOL_NATIVE UINT32_C(0) /**< Use native newlines. */ +#define RTBASE64_FLAGS_NO_LINE_BREAKS UINT32_C(1) /**< No newlines. */ +#define RTBASE64_FLAGS_EOL_LF UINT32_C(2) /**< Use UNIX-style newlines. */ +#define RTBASE64_FLAGS_EOL_CRLF UINT32_C(3) /**< Use DOS-style newlines. */ +#define RTBASE64_FLAGS_EOL_STYLE_MASK UINT32_C(3) /**< End-of-line style mask. */ /** @} */ diff -Nru virtualbox-hwe-6.1.34-dfsg/include/iprt/cpp/ministring.h virtualbox-hwe-6.1.38-dfsg/include/iprt/cpp/ministring.h --- virtualbox-hwe-6.1.34-dfsg/include/iprt/cpp/ministring.h 2022-03-22 23:34:47.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/include/iprt/cpp/ministring.h 2022-09-01 13:17:50.000000000 +0000 @@ -852,6 +852,18 @@ int replaceNoThrow(size_t offStart, size_t cchLength, const char *pszReplacement, size_t cchReplacement) RT_NOEXCEPT; /** + * Truncates the string to a max length of @a cchMax. + * + * If the string is shorter than @a cchMax characters, no change is made. + * + * If the @a cchMax is not at the start of a UTF-8 sequence, it will be adjusted + * down to the start of the UTF-8 sequence. Thus, after a truncation, the + * length() may be smaller than @a cchMax. + * + */ + RTCString &truncate(size_t cchMax) RT_NOEXCEPT; + + /** * Index operator. * * Returns the byte at the given index, or a null byte if the index is not diff -Nru virtualbox-hwe-6.1.34-dfsg/include/iprt/crypto/pem.h virtualbox-hwe-6.1.38-dfsg/include/iprt/crypto/pem.h --- virtualbox-hwe-6.1.34-dfsg/include/iprt/crypto/pem.h 2022-03-22 23:34:47.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/include/iprt/crypto/pem.h 2022-09-01 13:17:50.000000000 +0000 @@ -30,6 +30,8 @@ #endif #include +#include /* PRTASN1CORE */ +#include /* PFNRTSTROUTPUT */ RT_C_DECLS_BEGIN @@ -205,6 +207,85 @@ RTDECL(const char *) RTCrPemFindFirstSectionInContent(void const *pvContent, size_t cbContent, PCRTCRPEMMARKER paMarkers, size_t cMarkers); + +/** + * PEM formatter for a binary data blob. + * + * @returns Number of output bytes (sum of @a pfnOutput return values). + * @param pfnOutput The output callback function. + * @param pvUser The user argument to the output callback. + * @param pvContent The binary blob to output. + * @param cbContent Size of the binary blob. + * @param pszMarker The PEM marker, .e.g "PRIVATE KEY", "CERTIFICATE" or + * similar. + * @sa RTCrPemWriteAsn1, RTCrPemWriteAsn1ToVfsFile, + * RTCrPemWriteAsn1ToVfsFile + */ +RTDECL(size_t) RTCrPemWriteBlob(PFNRTSTROUTPUT pfnOutput, void *pvUser, + const void *pvContent, size_t cbContent, const char *pszMarker); + +RTDECL(ssize_t) RTCrPemWriteBlobToVfsIoStrm(RTVFSIOSTREAM hVfsIos, const void *pvContent, size_t cbContent, const char *pszMarker); +RTDECL(ssize_t) RTCrPemWriteBlobToVfsFile(RTVFSFILE hVfsFile, const void *pvContent, size_t cbContent, const char *pszMarker); + +/** + * PEM formatter for a generic ASN.1 structure. + * + * This will call both RTAsn1EncodePrepare() and RTAsn1EncodeWrite() on + * @a pRoot. Uses DER encoding. + * + * @returns Number of outputted chars (sum of @a pfnOutput return values), + * negative values are error status codes from the ASN.1 encoding. + * @param pfnOutput The output callback function. + * @param pvUser The user argument to the output callback. + * @param fFlags Reserved, MBZ. + * @param pRoot The root of the ASN.1 to encode and format as PEM. + * @param pszMarker The PEM marker, .e.g "PRIVATE KEY", "CERTIFICATE" or + * similar. + * @param pErrInfo For encoding errors. Optional. + * @sa RTCrPemWriteAsn1ToVfsFile, RTCrPemWriteAsn1ToVfsFile, + * RTCrPemWriteBlob + */ +RTDECL(ssize_t) RTCrPemWriteAsn1(PFNRTSTROUTPUT pfnOutput, void *pvUser, PRTASN1CORE pRoot, + uint32_t fFlags, const char *pszMarker, PRTERRINFO pErrInfo); + +/** + * PEM formatter for a generic ASN.1 structure and output it to @a hVfsIos. + * + * This will call both RTAsn1EncodePrepare() and RTAsn1EncodeWrite() on + * @a pRoot. Uses DER encoding. + * + * @returns Number of chars written, negative values are error status codes from + * the ASN.1 encoding or from RTVfsIoStrmWrite(). + * @param hVfsIos Handle to the I/O stream to write it to. + * @param fFlags Reserved, MBZ. + * @param pRoot The root of the ASN.1 to encode and format as PEM. + * @param pszMarker The PEM marker, .e.g "PRIVATE KEY", "CERTIFICATE" or + * similar. + * @param pErrInfo For encoding errors. Optional. + * @sa RTCrPemWriteAsn1ToVfsFile, RTCrPemWriteAsn1, RTCrPemWriteBlob + */ +RTDECL(ssize_t) RTCrPemWriteAsn1ToVfsIoStrm(RTVFSIOSTREAM hVfsIos, PRTASN1CORE pRoot, + uint32_t fFlags, const char *pszMarker, PRTERRINFO pErrInfo); + +/** + * PEM formatter for a generic ASN.1 structure and output it to @a hVfsFile. + * + * This will call both RTAsn1EncodePrepare() and RTAsn1EncodeWrite() on + * @a pRoot. Uses DER encoding. + * + * @returns Number of chars written, negative values are error status codes from + * the ASN.1 encoding or from RTVfsIoStrmWrite(). + * @param hVfsFile Handle to the file to write it to. + * @param fFlags Reserved, MBZ. + * @param pRoot The root of the ASN.1 to encode and format as PEM. + * @param pszMarker The PEM marker, .e.g "PRIVATE KEY", "CERTIFICATE" or + * similar. + * @param pErrInfo For encoding errors. Optional. + * @sa RTCrPemWriteAsn1ToVfsIoStrm, RTCrPemWriteAsn1, RTCrPemWriteBlob + */ +RTDECL(ssize_t) RTCrPemWriteAsn1ToVfsFile(RTVFSFILE hVfsFile, PRTASN1CORE pRoot, + uint32_t fFlags, const char *pszMarker, PRTERRINFO pErrInfo); + /** @} */ RT_C_DECLS_END diff -Nru virtualbox-hwe-6.1.34-dfsg/include/iprt/crypto/pkcs7.h virtualbox-hwe-6.1.38-dfsg/include/iprt/crypto/pkcs7.h --- virtualbox-hwe-6.1.34-dfsg/include/iprt/crypto/pkcs7.h 2022-03-22 23:34:47.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/include/iprt/crypto/pkcs7.h 2022-09-01 13:17:51.000000000 +0000 @@ -154,8 +154,27 @@ typedef RTCRPKCS7ATTRIBUTE const *PCRTCRPKCS7ATTRIBUTE; RTASN1TYPE_STANDARD_PROTOTYPES(RTCRPKCS7ATTRIBUTE, RTDECL, RTCrPkcs7Attribute, SeqCore.Asn1Core); +RTDECL(int) RTCrPkcs7Attribute_SetAppleMultiCdPlist(PRTCRPKCS7ATTRIBUTE pThis, PCRTASN1SETOFOCTETSTRINGS pToClone, + PCRTASN1ALLOCATORVTABLE pAllocator); +RTDECL(int) RTCrPkcs7Attribute_SetContentType(PRTCRPKCS7ATTRIBUTE pThis, PCRTASN1SETOFOBJIDS pToClone, + PCRTASN1ALLOCATORVTABLE pAllocator); +RTDECL(int) RTCrPkcs7Attribute_SetCounterSignatures(PRTCRPKCS7ATTRIBUTE pThis, PCRTCRPKCS7SIGNERINFOS pToClone, + PCRTASN1ALLOCATORVTABLE pAllocator); +RTDECL(int) RTCrPkcs7Attribute_SetMessageDigest(PRTCRPKCS7ATTRIBUTE pThis, PCRTASN1SETOFOCTETSTRINGS pToClone, + PCRTASN1ALLOCATORVTABLE pAllocator); +RTDECL(int) RTCrPkcs7Attribute_SetMsStatementType(PRTCRPKCS7ATTRIBUTE pThis, PCRTASN1SETOFOBJIDSEQS pToClone, + PCRTASN1ALLOCATORVTABLE pAllocator); +RTDECL(int) RTCrPkcs7Attribute_SetMsNestedSignature(PRTCRPKCS7ATTRIBUTE pThis, struct RTCRPKCS7SETOFCONTENTINFOS const *pToClone, + PCRTASN1ALLOCATORVTABLE pAllocator); +RTDECL(int) RTCrPkcs7Attribute_SetMsTimestamp(PRTCRPKCS7ATTRIBUTE pThis, struct RTCRPKCS7SETOFCONTENTINFOS const *pToClone, + PCRTASN1ALLOCATORVTABLE pAllocator); +RTDECL(int) RTCrPkcs7Attribute_SetSigningTime(PRTCRPKCS7ATTRIBUTE pThis, PCRTASN1SETOFTIMES pToClone, + PCRTASN1ALLOCATORVTABLE pAllocator); + RTASN1_IMPL_GEN_SET_OF_TYPEDEFS_AND_PROTOS(RTCRPKCS7ATTRIBUTES, RTCRPKCS7ATTRIBUTE, RTDECL, RTCrPkcs7Attributes); +RTDECL(int) RTCrPkcs7Attributes_HashAttributes(PRTCRPKCS7ATTRIBUTES pAttributes, RTCRDIGEST hDigest, PRTERRINFO pErrInfo); + /** * One PKCS \#7 SignerInfo (IPRT representation). @@ -187,6 +206,11 @@ } RTCRPKCS7SIGNERINFO; RTASN1TYPE_STANDARD_PROTOTYPES(RTCRPKCS7SIGNERINFO, RTDECL, RTCrPkcs7SignerInfo, SeqCore.Asn1Core); +RTDECL(int) RTCrPkcs7SignerInfo_SetAuthenticatedAttributes(PRTCRPKCS7SIGNERINFO pThis, PCRTCRPKCS7ATTRIBUTES pAttributes, + PCRTASN1ALLOCATORVTABLE pAllocator); +RTDECL(int) RTCrPkcs7SignerInfo_SetUnauthenticatedAttributes(PRTCRPKCS7SIGNERINFO pThis, PCRTCRPKCS7ATTRIBUTES pAttributes, + PCRTASN1ALLOCATORVTABLE pAllocator); + /** RTCRPKCS7SIGNERINFO::Version value. */ #define RTCRPKCS7SIGNERINFO_V1 1 @@ -366,6 +390,12 @@ RTASN1TYPE_STANDARD_PROTOTYPES(RTCRPKCS7CERT, RTDECL, RTCrPkcs7Cert, Dummy.Asn1Core); RTASN1_IMPL_GEN_SET_OF_TYPEDEFS_AND_PROTOS(RTCRPKCS7SETOFCERTS, RTCRPKCS7CERT, RTDECL, RTCrPkcs7SetOfCerts); +RTDECL(int) RTCrPkcs7Cert_SetX509Cert(PRTCRPKCS7CERT pThis, PCRTCRX509CERTIFICATE pToClone, PCRTASN1ALLOCATORVTABLE pAllocator); +RTDECL(int) RTCrPkcs7Cert_SetExtendedCert(PRTCRPKCS7CERT pThis, PCRTASN1CORE pToClone, PCRTASN1ALLOCATORVTABLE pAllocator); +RTDECL(int) RTCrPkcs7Cert_SetAcV1(PRTCRPKCS7CERT pThis, PCRTASN1CORE pToClone, PCRTASN1ALLOCATORVTABLE pAllocator); +RTDECL(int) RTCrPkcs7Cert_SetAcV2(PRTCRPKCS7CERT pThis, PCRTASN1CORE pToClone, PCRTASN1ALLOCATORVTABLE pAllocator); +RTDECL(int) RTCrPkcs7Cert_SetOtherCert(PRTCRPKCS7CERT pThis, PCRTASN1CORE pToClone, PCRTASN1ALLOCATORVTABLE pAllocator); + RTDECL(PCRTCRX509CERTIFICATE) RTCrPkcs7SetOfCerts_FindX509ByIssuerAndSerialNumber(PCRTCRPKCS7SETOFCERTS pCertificates, PCRTCRX509NAME pIssuer, PCRTASN1INTEGER pSerialNumber); @@ -419,6 +449,8 @@ * OTHER type present (RFC-5652, section 5.1). */ #define RTCRPKCS7SIGNEDDATA_V5 5 +RTDECL(int) RTCrPkcs7SignedData_SetCertificates(PRTCRPKCS7SIGNEDDATA pThis, PCRTCRPKCS7SETOFCERTS pCerts, PCRTASN1ALLOCATORVTABLE pAllocator); +RTDECL(int) RTCrPkcs7SignedData_SetCrls(PRTCRPKCS7SIGNEDDATA pThis, PCRTASN1CORE pCerts, PCRTASN1ALLOCATORVTABLE pAllocator); /** @name RTCRPKCS7SIGNEDDATA_SANITY_F_XXX - Flags for RTPkcs7SignedDataCheckSantiy. * @{ */ @@ -430,6 +462,22 @@ #define RTCRPKCS7SIGNEDDATA_SANITY_F_SIGNING_CERT_PRESENT RT_BIT_32(2) /** @} */ +/** PKCS\#7/CMS (content info) markers. */ +extern RTDATADECL(RTCRPEMMARKER const) g_aRTCrPkcs7Markers[]; +/** Number of entries in g_aRTCrPkcs7Markers. */ +extern RTDATADECL(uint32_t const) g_cRTCrPkcs7Markers; + +/** @name Flags for RTCrPkcs7ContentInfo_ReadFromBuffer + * @{ */ +/** Only allow PEM certificates, not binary ones. + * @sa RTCRPEMREADFILE_F_ONLY_PEM */ +#define RTCRPKCS7_READ_F_PEM_ONLY RT_BIT(1) +/** @} */ + +RTDECL(int) RTCrPkcs7_ReadFromBuffer(PRTCRPKCS7CONTENTINFO pContentInfo, const void *pvBuf, size_t cbBuf, + uint32_t fFlags, PCRTASN1ALLOCATORVTABLE pAllocator, + bool *pfCmsLabeled, PRTERRINFO pErrInfo, const char *pszErrorTag); + /** * PKCS \#7 DigestInfo (IPRT representation). @@ -551,16 +599,17 @@ PFNRTCRPKCS7VERIFYCERTCALLBACK pfnVerifyCert, void *pvUser, void const *pvData, size_t cbData, PRTERRINFO pErrInfo); -/** @name RTCRPKCS7VERIFY_SD_F_XXX - Flags for RTCrPkcs7VerifySignedData +/** @name RTCRPKCS7VERIFY_SD_F_XXX - Flags for RTCrPkcs7VerifySignedData and + * RTCrPkcs7VerifySignedDataWithExternalData * @{ */ /** Always use the signing time attribute if present, requiring it to be * verified as valid. The default behavior is to ignore unverifiable * signing time attributes and use the @a pValidationTime instead. */ #define RTCRPKCS7VERIFY_SD_F_ALWAYS_USE_SIGNING_TIME_IF_PRESENT RT_BIT_32(0) /** Same as RTCRPKCS7VERIFY_SD_F_ALWAYS_USE_SIGNING_TIME_IF_PRESENT for the MS - * timestamp counter sigantures. */ + * timestamp counter signatures. */ #define RTCRPKCS7VERIFY_SD_F_ALWAYS_USE_MS_TIMESTAMP_IF_PRESENT RT_BIT_32(1) -/** Only use signging time attributes from counter signatures. */ +/** Only use signing time attributes from counter signatures. */ #define RTCRPKCS7VERIFY_SD_F_COUNTER_SIGNATURE_SIGNING_TIME_ONLY RT_BIT_32(2) /** Don't validate the counter signature containing the signing time, just use * it unverified. This is useful if we don't necessarily have the root @@ -576,6 +625,9 @@ * usage bit present. This is used for recursivly verifying MS timestamp * signatures. */ #define RTCRPKCS7VERIFY_SD_F_USAGE_TIMESTAMPING RT_BIT_32(6) +/** Skip the verification of the certificate trust paths, taking all + * certificates to be trustworthy. */ +#define RTCRPKCS7VERIFY_SD_F_TRUST_ALL_CERTS RT_BIT_32(7) /** Indicates internally that we're validating a counter signature and should * use different rules when checking out the authenticated attributes. @@ -583,6 +635,29 @@ #define RTCRPKCS7VERIFY_SD_F_COUNTER_SIGNATURE RT_BIT_32(31) /** @} */ + +RTDECL(int) RTCrPkcs7SimpleSignSignedData(uint32_t fFlags, PCRTCRX509CERTIFICATE pSigner, RTCRKEY hPrivateKey, + void const *pvData, size_t cbData, RTDIGESTTYPE enmDigestType, + RTCRSTORE hAdditionalCerts, PCRTCRPKCS7ATTRIBUTES pAdditionalAuthenticatedAttribs, + void *pvResult, size_t *pcbResult, PRTERRINFO pErrInfo); + +/** @name RTCRPKCS7SIGN_SD_F_XXX - Flags for RTCrPkcs7SimpleSign. + * @{ */ +/** Detached data. */ +#define RTCRPKCS7SIGN_SD_F_DEATCHED RT_BIT_32(0) +/** No SMIME capabilities attribute. */ +#define RTCRPKCS7SIGN_SD_F_NO_SMIME_CAP RT_BIT_32(1) +/** Produce version 1 output (PKCS\#7), rather than version 3 (CMS). */ +#define RTCRPKCS7SIGN_SD_F_USE_V1 RT_BIT_32(2) +/** Avoid extra OCTET STRING encapsulation around the data blob. + * This is needed for Authenticode signatures. This requires that the + * content type is supplied via the additional authenticated attributes. + * @note Currently only works with RTCRPKCS7SIGN_SD_F_USE_V1. */ +#define RTCRPKCS7SIGN_SD_F_NO_DATA_ENCAP RT_BIT_32(3) +/** Valid flag mask. */ +#define RTCRPKCS7SIGN_SD_F_VALID_MASK UINT32_C(0x0000000f) +/** @} */ + /** @} */ RT_C_DECLS_END diff -Nru virtualbox-hwe-6.1.34-dfsg/include/iprt/crypto/pkix.h virtualbox-hwe-6.1.38-dfsg/include/iprt/crypto/pkix.h --- virtualbox-hwe-6.1.34-dfsg/include/iprt/crypto/pkix.h 2022-03-22 23:34:47.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/include/iprt/crypto/pkix.h 2022-09-01 13:17:51.000000000 +0000 @@ -34,6 +34,7 @@ RT_C_DECLS_BEGIN +struct RTCRX509CERTIFICATE; struct RTCRX509SUBJECTPUBLICKEYINFO; /** @defgroup grp_rt_crpkix RTCrPkix - Public Key Infrastructure APIs @@ -92,6 +93,17 @@ void const *pvSignedDigest, size_t cbSignedDigest, RTCRDIGEST hDigest, PRTERRINFO pErrInfo); +/** + * Checks if the hash size can be handled by the given public key. + */ +RTDECL(bool) RTCrPkixPubKeyCanHandleDigestType(struct RTCRX509SUBJECTPUBLICKEYINFO const *pPublicKeyInfo, + RTDIGESTTYPE enmDigestType, PRTERRINFO pErrInfo); + +/** + * Checks if the hash size can be handled by the given certificate's public key. + */ +RTDECL(bool) RTCrPkixCanCertHandleDigestType(struct RTCRX509CERTIFICATE const *pCertificate, + RTDIGESTTYPE enmDigestType, PRTERRINFO pErrInfo); /** * Signs a digest (@a hDigest) using the specified private key (@a pPrivateKey) and algorithm. @@ -145,6 +157,8 @@ #define RTCR_PKCS1_SHA384_WITH_RSA_OID "1.2.840.113549.1.1.12" #define RTCR_PKCS1_SHA512_WITH_RSA_OID "1.2.840.113549.1.1.13" #define RTCR_PKCS1_SHA224_WITH_RSA_OID "1.2.840.113549.1.1.14" +#define RTCR_PKCS1_SHA512T224_WITH_RSA_OID "1.2.840.113549.1.1.15" +#define RTCR_PKCS1_SHA512T256_WITH_RSA_OID "1.2.840.113549.1.1.16" /** @} */ diff -Nru virtualbox-hwe-6.1.34-dfsg/include/iprt/crypto/rsa.h virtualbox-hwe-6.1.38-dfsg/include/iprt/crypto/rsa.h --- virtualbox-hwe-6.1.34-dfsg/include/iprt/crypto/rsa.h 2022-03-22 23:34:47.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/include/iprt/crypto/rsa.h 2022-09-01 13:17:51.000000000 +0000 @@ -61,6 +61,9 @@ typedef RTCRRSAPUBLICKEY const *PCRTCRRSAPUBLICKEY; RTASN1TYPE_STANDARD_PROTOTYPES(RTCRRSAPUBLICKEY, RTDECL, RTCrRsaPublicKey, SeqCore.Asn1Core); +RTDECL(bool) RTCrRsaPublicKey_CanHandleDigestType(PCRTCRRSAPUBLICKEY pRsaPublicKey, RTDIGESTTYPE enmDigestType, + PRTERRINFO pErrInfo); + /** * RSA other prime info (ASN.1 IPRT representation). @@ -123,6 +126,9 @@ #define RTCRRSAPRIVATEKEY_VERSION_MULTI 1 /** @} */ +RTDECL(bool) RTCrRsaPrivateKey_CanHandleDigestType(PCRTCRRSAPRIVATEKEY pRsaPrivateKey, RTDIGESTTYPE enmDigestType, + PRTERRINFO pErrInfo); + /** * RSA DigestInfo used by the EMSA-PKCS1-v1_5 encoding method. diff -Nru virtualbox-hwe-6.1.34-dfsg/include/iprt/crypto/spc.h virtualbox-hwe-6.1.38-dfsg/include/iprt/crypto/spc.h --- virtualbox-hwe-6.1.34-dfsg/include/iprt/crypto/spc.h 2022-03-22 23:34:47.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/include/iprt/crypto/spc.h 2022-09-01 13:17:51.000000000 +0000 @@ -43,6 +43,9 @@ * @{ */ +/** Value for RTCR_PKCS9_ID_MS_STATEMENT_TYPE. */ +#define RTCRSPC_STMT_TYPE_INDIVIDUAL_CODE_SIGNING "1.3.6.1.4.1.311.2.1.21" + /** * PE Image page hash table, generic union. * @@ -180,6 +183,11 @@ typedef RTCRSPCSERIALIZEDOBJECTATTRIBUTE const *PCRTCRSPCSERIALIZEDOBJECTATTRIBUTE; RTASN1TYPE_STANDARD_PROTOTYPES(RTCRSPCSERIALIZEDOBJECTATTRIBUTE, RTDECL, RTCrSpcSerializedObjectAttribute, SeqCore.Asn1Core); +RTDECL(int) RTCrSpcSerializedObjectAttribute_SetV1Hashes(PRTCRSPCSERIALIZEDOBJECTATTRIBUTE pThis, + PCRTCRSPCSERIALIZEDPAGEHASHES, PCRTASN1ALLOCATORVTABLE pAllocator); +RTDECL(int) RTCrSpcSerializedObjectAttribute_SetV2Hashes(PRTCRSPCSERIALIZEDOBJECTATTRIBUTE pThis, + PCRTCRSPCSERIALIZEDPAGEHASHES, PCRTASN1ALLOCATORVTABLE pAllocator); + /** @name RTCRSPCSERIALIZEDOBJECTATTRIBUTE::Type values * @{ */ /** Serialized object attribute type for page hashes version 1. */ @@ -290,6 +298,9 @@ typedef RTCRSPCSTRING const *PCRTCRSPCSTRING; RTASN1TYPE_STANDARD_PROTOTYPES(RTCRSPCSTRING, RTDECL, RTCrSpcString, Dummy.Asn1Core); +RTDECL(int) RTCrSpcString_SetUcs2(PRTCRSPCSTRING pThis, PCRTASN1STRING pToClone, PCRTASN1ALLOCATORVTABLE pAllocator); +RTDECL(int) RTCrSpcString_SetAscii(PRTCRSPCSTRING pThis, PCRTASN1STRING pToClone, PCRTASN1ALLOCATORVTABLE pAllocator); + /** * RTCRSPCSTRING choices. @@ -347,6 +358,10 @@ typedef RTCRSPCLINK const *PCRTCRSPCLINK; RTASN1TYPE_STANDARD_PROTOTYPES(RTCRSPCLINK, RTDECL, RTCrSpcLink, Dummy.Asn1Core); +RTDECL(int) RTCrSpcLink_SetUrl(PRTCRSPCLINK pThis, PCRTASN1STRING pToClone, PCRTASN1ALLOCATORVTABLE pAllocator); +RTDECL(int) RTCrSpcLink_SetMoniker(PRTCRSPCLINK pThis, PCRTCRSPCSERIALIZEDOBJECT pToClone, PCRTASN1ALLOCATORVTABLE pAllocator); +RTDECL(int) RTCrSpcLink_SetFile(PRTCRSPCLINK pThis, PCRTCRSPCSTRING pToClone, PCRTASN1ALLOCATORVTABLE pAllocator); + #if 0 /** @todo Might not be the correct bit order. */ /** @@ -386,6 +401,9 @@ typedef RTCRSPCPEIMAGEDATA const *PCRTCRSPCPEIMAGEDATA; RTASN1TYPE_STANDARD_PROTOTYPES(RTCRSPCPEIMAGEDATA, RTDECL, RTCrSpcPeImageData, SeqCore.Asn1Core); +RTDECL(int) RTCrSpcPeImageData_SetFlags(PRTCRSPCPEIMAGEDATA pThis, PCRTASN1BITSTRING pToClone, PCRTASN1ALLOCATORVTABLE pAllocator); +RTDECL(int) RTCrSpcPeImageData_SetFile(PRTCRSPCPEIMAGEDATA pThis, PCRTCRSPCLINK pToClone, PCRTASN1ALLOCATORVTABLE pAllocator); + /** The object ID for SpcPeImageData. */ #define RTCRSPCPEIMAGEDATA_OID "1.3.6.1.4.1.311.2.1.15" @@ -442,6 +460,8 @@ typedef RTCRSPCATTRIBUTETYPEANDOPTIONALVALUE const *PCRTCRSPCATTRIBUTETYPEANDOPTIONALVALUE; RTASN1TYPE_STANDARD_PROTOTYPES(RTCRSPCATTRIBUTETYPEANDOPTIONALVALUE, RTDECL, RTCrSpcAttributeTypeAndOptionalValue, SeqCore.Asn1Core); +RTDECL(int) RTCrSpcAttributeTypeAndOptionalValue_SetPeImage(PRTCRSPCATTRIBUTETYPEANDOPTIONALVALUE pThis, + PCRTCRSPCPEIMAGEDATA pToClone, PCRTASN1ALLOCATORVTABLE pAllocator); /** * Authenticode indirect data content. diff -Nru virtualbox-hwe-6.1.34-dfsg/include/iprt/crypto/store.h virtualbox-hwe-6.1.38-dfsg/include/iprt/crypto/store.h --- virtualbox-hwe-6.1.34-dfsg/include/iprt/crypto/store.h 2022-03-22 23:34:47.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/include/iprt/crypto/store.h 2022-09-01 13:17:51.000000000 +0000 @@ -132,6 +132,12 @@ /** Open the certificate store of the system containg trusted CAs * and certificates. */ RTCRSTOREID_SYSTEM_TRUSTED_CAS_AND_CERTIFICATES, + /** Open the certificate store of the current user containing intermediate CAs. + * @remarks This may or may not include all the certificates in the system + * store, that's host dependent. So, you better look in both. */ + RTCRSTOREID_USER_INTERMEDIATE_CAS, + /** Open the certificate store of the system containg intermediate CAs. */ + RTCRSTOREID_SYSTEM_INTERMEDIATE_CAS, /** End of valid values. */ RTCRSTOREID_END, /** Traditional enum type compression prevention hack. */ @@ -145,8 +151,6 @@ * There will be no duplicates in this one. * * @returns IPRT status code. - * @retval VWRN_ALREADY_EXISTS if the certificate is already present and - * RTCRCERTCTX_F_ADD_IF_NOT_FOUND was specified. * @param phStore Where to return the store handle. Use * RTCrStoreRelease to release it. * @param enmStoreId The store to snapshot. @@ -158,6 +162,7 @@ RTDECL(int) RTCrStoreCreateSnapshotOfUserAndSystemTrustedCAsAndCerts(PRTCRSTORE phStore, PRTERRINFO pErrInfo); RTDECL(int) RTCrStoreCreateInMem(PRTCRSTORE phStore, uint32_t cSizeHint); +RTDECL(int) RTCrStoreCreateInMemEx(PRTCRSTORE phStore, uint32_t cSizeHint, RTCRSTORE hParentStore); RTDECL(uint32_t) RTCrStoreRetain(RTCRSTORE hStore); RTDECL(uint32_t) RTCrStoreRelease(RTCRSTORE hStore); @@ -181,6 +186,24 @@ RTDECL(int) RTCrStoreCertAddEncoded(RTCRSTORE hStore, uint32_t fFlags, void const *pvSrc, size_t cbSrc, PRTERRINFO pErrInfo); /** + * Add an X.509 packaged certificate to the store. + * + * @returns IPRT status code. + * @retval VWRN_ALREADY_EXISTS if the certificate is already present and + * RTCRCERTCTX_F_ADD_IF_NOT_FOUND was specified. + * @retval VERR_WRITE_PROTECT if the store doesn't support adding. + * @param hStore The store to add the certificate to. + * @param fFlags RTCRCERTCTX_F_XXX. Encoding must is optional, + * but must be RTCRCERTCTX_F_ENC_X509_DER if given. + * RTCRCERTCTX_F_ADD_IF_NOT_FOUND is supported. + * @param pCertificate The certificate to add. We may have to encode + * it, thus not const. + * @param pErrInfo Where to return additional error/warning info. + * Optional. + */ +RTDECL(int) RTCrStoreCertAddX509(RTCRSTORE hStore, uint32_t fFlags, PRTCRX509CERTIFICATE pCertificate, PRTERRINFO pErrInfo); + +/** * Adds certificates from files in the specified directory. * * @returns IPRT status code. Even when RTCRCERTCTX_F_ADD_CONTINUE_ON_ERROR is @@ -309,8 +332,8 @@ RTDECL(PCRTCRCERTCTX) RTCrStoreCertSearchNext(RTCRSTORE hStore, PRTCRSTORECERTSEARCH pSearch); RTDECL(int) RTCrStoreCertSearchDestroy(RTCRSTORE hStore, PRTCRSTORECERTSEARCH pSearch); -RTDECL(int) RTCrStoreConvertToOpenSslCertStore(RTCRSTORE hStore, uint32_t fFlags, void **ppvOpenSslStore); -RTDECL(int) RTCrStoreConvertToOpenSslCertStack(RTCRSTORE hStore, uint32_t fFlags, void **ppvOpenSslStack); +RTDECL(int) RTCrStoreConvertToOpenSslCertStore(RTCRSTORE hStore, uint32_t fFlags, void **ppvOpenSslStore, PRTERRINFO pErrInfo); +RTDECL(int) RTCrStoreConvertToOpenSslCertStack(RTCRSTORE hStore, uint32_t fFlags, void **ppvOpenSslStack, PRTERRINFO pErrInfo); /** @} */ diff -Nru virtualbox-hwe-6.1.34-dfsg/include/iprt/crypto/x509.h virtualbox-hwe-6.1.38-dfsg/include/iprt/crypto/x509.h --- virtualbox-hwe-6.1.34-dfsg/include/iprt/crypto/x509.h 2022-03-22 23:34:47.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/include/iprt/crypto/x509.h 2022-09-01 13:17:51.000000000 +0000 @@ -151,6 +151,10 @@ #define RTCRX509ALGORITHMIDENTIFIERID_SHA224 "2.16.840.1.101.3.4.2.4" #define RTCRX509ALGORITHMIDENTIFIERID_SHA512T224 "2.16.840.1.101.3.4.2.5" #define RTCRX509ALGORITHMIDENTIFIERID_SHA512T256 "2.16.840.1.101.3.4.2.6" +#define RTCRX509ALGORITHMIDENTIFIERID_SHA3_224 "2.16.840.1.101.3.4.2.7" +#define RTCRX509ALGORITHMIDENTIFIERID_SHA3_256 "2.16.840.1.101.3.4.2.8" +#define RTCRX509ALGORITHMIDENTIFIERID_SHA3_384 "2.16.840.1.101.3.4.2.9" +#define RTCRX509ALGORITHMIDENTIFIERID_SHA3_512 "2.16.840.1.101.3.4.2.10" #define RTCRX509ALGORITHMIDENTIFIERID_WHIRLPOOL "1.0.10118.3.0.55" /** @} */ @@ -158,15 +162,21 @@ * @remarks The PKCS variants are the default ones, alternative OID are marked * as such. * @{ */ -#define RTCRX509ALGORITHMIDENTIFIERID_RSA "1.2.840.113549.1.1.1" -#define RTCRX509ALGORITHMIDENTIFIERID_MD2_WITH_RSA "1.2.840.113549.1.1.2" -#define RTCRX509ALGORITHMIDENTIFIERID_MD4_WITH_RSA "1.2.840.113549.1.1.3" -#define RTCRX509ALGORITHMIDENTIFIERID_MD5_WITH_RSA "1.2.840.113549.1.1.4" -#define RTCRX509ALGORITHMIDENTIFIERID_SHA1_WITH_RSA "1.2.840.113549.1.1.5" -#define RTCRX509ALGORITHMIDENTIFIERID_SHA256_WITH_RSA "1.2.840.113549.1.1.11" -#define RTCRX509ALGORITHMIDENTIFIERID_SHA384_WITH_RSA "1.2.840.113549.1.1.12" -#define RTCRX509ALGORITHMIDENTIFIERID_SHA512_WITH_RSA "1.2.840.113549.1.1.13" -#define RTCRX509ALGORITHMIDENTIFIERID_SHA224_WITH_RSA "1.2.840.113549.1.1.14" +#define RTCRX509ALGORITHMIDENTIFIERID_RSA "1.2.840.113549.1.1.1" +#define RTCRX509ALGORITHMIDENTIFIERID_MD2_WITH_RSA "1.2.840.113549.1.1.2" +#define RTCRX509ALGORITHMIDENTIFIERID_MD4_WITH_RSA "1.2.840.113549.1.1.3" +#define RTCRX509ALGORITHMIDENTIFIERID_MD5_WITH_RSA "1.2.840.113549.1.1.4" +#define RTCRX509ALGORITHMIDENTIFIERID_SHA1_WITH_RSA "1.2.840.113549.1.1.5" +#define RTCRX509ALGORITHMIDENTIFIERID_SHA256_WITH_RSA "1.2.840.113549.1.1.11" +#define RTCRX509ALGORITHMIDENTIFIERID_SHA384_WITH_RSA "1.2.840.113549.1.1.12" +#define RTCRX509ALGORITHMIDENTIFIERID_SHA512_WITH_RSA "1.2.840.113549.1.1.13" +#define RTCRX509ALGORITHMIDENTIFIERID_SHA224_WITH_RSA "1.2.840.113549.1.1.14" +#define RTCRX509ALGORITHMIDENTIFIERID_SHA512T224_WITH_RSA "1.2.840.113549.1.1.15" +#define RTCRX509ALGORITHMIDENTIFIERID_SHA512T256_WITH_RSA "1.2.840.113549.1.1.16" +#define RTCRX509ALGORITHMIDENTIFIERID_SHA3_224_WITH_RSA "2.16.840.1.101.3.4.3.13" +#define RTCRX509ALGORITHMIDENTIFIERID_SHA3_256_WITH_RSA "2.16.840.1.101.3.4.3.14" +#define RTCRX509ALGORITHMIDENTIFIERID_SHA3_384_WITH_RSA "2.16.840.1.101.3.4.3.15" +#define RTCRX509ALGORITHMIDENTIFIERID_SHA3_512_WITH_RSA "2.16.840.1.101.3.4.3.16" /** @} */ @@ -1036,6 +1046,21 @@ extern RTDATADECL(uint32_t const) g_cRTCrX509CertificateMarkers; +/** Wrapper around RTCrPemWriteAsn1ToVfsIoStrm(). */ +DECLINLINE(ssize_t) RTCrX509Certificate_WriteToVfsIoStrm(RTVFSIOSTREAM hVfsIos, PRTCRX509CERTIFICATE pCertificate, + PRTERRINFO pErrInfo) +{ + return RTCrPemWriteAsn1ToVfsIoStrm(hVfsIos, &pCertificate->SeqCore.Asn1Core, 0 /*fFlags*/, + g_aRTCrX509CertificateMarkers[0].paWords[0].pszWord, pErrInfo); +} + +/** Wrapper around RTCrPemWriteAsn1ToVfsFile(). */ +DECLINLINE(ssize_t) RTCrX509Certificate_WriteToVfsFile(RTVFSFILE hVfsFile, PRTCRX509CERTIFICATE pCertificate, + PRTERRINFO pErrInfo) +{ + return RTCrPemWriteAsn1ToVfsFile(hVfsFile, &pCertificate->SeqCore.Asn1Core, 0 /*fFlags*/, + g_aRTCrX509CertificateMarkers[0].paWords[0].pszWord, pErrInfo); +} /** @name X.509 Certificate Extensions * @{ */ diff -Nru virtualbox-hwe-6.1.34-dfsg/include/iprt/ldr.h virtualbox-hwe-6.1.38-dfsg/include/iprt/ldr.h --- virtualbox-hwe-6.1.34-dfsg/include/iprt/ldr.h 2022-03-22 23:34:49.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/include/iprt/ldr.h 2022-09-01 13:17:52.000000000 +0000 @@ -1104,6 +1104,18 @@ * @remarks This generally starts with a PKCS \#7 Content structure, the * SignedData bit is found a few levels down into this as per RFC. */ RTLDRPROP_PKCS7_SIGNED_DATA, + /** Query the number of pages that needs hashing. + * This is for RTLDRPROP_SHA1_PAGE_HASHES and RTLDRPROP_SHA256_PAGE_HASHES + * buffer size calculations. */ + RTLDRPROP_HASHABLE_PAGES, + /** Query the SHA-1 page hashes. + * Returns an array with entries made of a 32-bit file offset and a SHA-1 + * digest. Use RTLDRPROP_HASHABLE_PAGES to calculate the buffer size. */ + RTLDRPROP_SHA1_PAGE_HASHES, + /** Query the SHA-256 page hashes. + * Returns an array with entries made of a 32-bit file offset and a SHA-256 + * digest. Use RTLDRPROP_HASHABLE_PAGES to calculate the buffer size. */ + RTLDRPROP_SHA256_PAGE_HASHES, /** Query whether code signature checks are enabled. */ RTLDRPROP_SIGNATURE_CHECKS_ENFORCED, @@ -1277,10 +1289,12 @@ * @returns IPRT status code. * @param hLdrMod The module handle. * @param enmDigest Which kind of digest. - * @param pszDigest Where to store the image digest. - * @param cbDigest Size of the buffer @a pszDigest points at. + * @param pabHash Where to store the image hash. + * @param cbHash Size of the buffer @a pabHash points at. The + * required and returned size can be derived from the + * digest type (@a enmDigest). */ -RTDECL(int) RTLdrHashImage(RTLDRMOD hLdrMod, RTDIGESTTYPE enmDigest, char *pszDigest, size_t cbDigest); +RTDECL(int) RTLdrHashImage(RTLDRMOD hLdrMod, RTDIGESTTYPE enmDigest, uint8_t *pabHash, size_t cbHash); /** * Try use unwind information to unwind one frame. diff -Nru virtualbox-hwe-6.1.34-dfsg/include/iprt/mangling.h virtualbox-hwe-6.1.38-dfsg/include/iprt/mangling.h --- virtualbox-hwe-6.1.34-dfsg/include/iprt/mangling.h 2022-03-22 23:34:49.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/include/iprt/mangling.h 2022-09-01 13:17:52.000000000 +0000 @@ -2028,6 +2028,42 @@ # define RTSha512t256Init RT_MANGLER(RTSha512t256Init) # define RTSha512t256ToString RT_MANGLER(RTSha512t256ToString) # define RTSha512t256Update RT_MANGLER(RTSha512t256Update) +# define RTSha3t224 RT_MANGLER(RTSha3t224) +# define RTSha3t224Check RT_MANGLER(RTSha3t224Check) +# define RTSha3t224Cleanup RT_MANGLER(RTSha3t224Cleanup) +# define RTSha3t224Clone RT_MANGLER(RTSha3t224Clone) +# define RTSha3t224Init RT_MANGLER(RTSha3t224Init) +# define RTSha3t224Final RT_MANGLER(RTSha3t224Final) +# define RTSha3t224FromString RT_MANGLER(RTSha3t224FromString) +# define RTSha3t224ToString RT_MANGLER(RTSha3t224ToString) +# define RTSha3t224Update RT_MANGLER(RTSha3t224Update) +# define RTSha3t256 RT_MANGLER(RTSha3t256) +# define RTSha3t256Check RT_MANGLER(RTSha3t256Check) +# define RTSha3t256Cleanup RT_MANGLER(RTSha3t256Cleanup) +# define RTSha3t256Clone RT_MANGLER(RTSha3t256Clone) +# define RTSha3t256Init RT_MANGLER(RTSha3t256Init) +# define RTSha3t256Final RT_MANGLER(RTSha3t256Final) +# define RTSha3t256FromString RT_MANGLER(RTSha3t256FromString) +# define RTSha3t256ToString RT_MANGLER(RTSha3t256ToString) +# define RTSha3t256Update RT_MANGLER(RTSha3t256Update) +# define RTSha3t384 RT_MANGLER(RTSha3t384) +# define RTSha3t384Check RT_MANGLER(RTSha3t384Check) +# define RTSha3t384Cleanup RT_MANGLER(RTSha3t384Cleanup) +# define RTSha3t384Clone RT_MANGLER(RTSha3t384Clone) +# define RTSha3t384Init RT_MANGLER(RTSha3t384Init) +# define RTSha3t384Final RT_MANGLER(RTSha3t384Final) +# define RTSha3t384FromString RT_MANGLER(RTSha3t384FromString) +# define RTSha3t384ToString RT_MANGLER(RTSha3t384ToString) +# define RTSha3t384Update RT_MANGLER(RTSha3t384Update) +# define RTSha3t512 RT_MANGLER(RTSha3t512) +# define RTSha3t512Check RT_MANGLER(RTSha3t512Check) +# define RTSha3t512Cleanup RT_MANGLER(RTSha3t512Cleanup) +# define RTSha3t512Clone RT_MANGLER(RTSha3t512Clone) +# define RTSha3t512Init RT_MANGLER(RTSha3t512Init) +# define RTSha3t512Final RT_MANGLER(RTSha3t512Final) +# define RTSha3t512FromString RT_MANGLER(RTSha3t512FromString) +# define RTSha3t512ToString RT_MANGLER(RTSha3t512ToString) +# define RTSha3t512Update RT_MANGLER(RTSha3t512Update) # define RTShMemClose RT_MANGLER(RTShMemClose) # define RTShMemDelete RT_MANGLER(RTShMemDelete) # define RTShMemMapRegion RT_MANGLER(RTShMemMapRegion) @@ -2158,6 +2194,8 @@ # define RTStrmOpenFV RT_MANGLER(RTStrmOpenFV) # define RTStrmPrintf RT_MANGLER(RTStrmPrintf) # define RTStrmPrintfV RT_MANGLER(RTStrmPrintfV) +# define RTStrmWrappedPrintf RT_MANGLER(RTStrmWrappedPrintf) +# define RTStrmWrappedPrintfV RT_MANGLER(RTStrmWrappedPrintfV) # define RTStrmDumpPrintfV RT_MANGLER(RTStrmDumpPrintfV) # define RTStrmPutCh RT_MANGLER(RTStrmPutCh) # define RTStrmPutStr RT_MANGLER(RTStrmPutStr) @@ -2700,6 +2738,8 @@ # define RTVfsFileOpen RT_MANGLER(RTVfsFileOpen) # define RTVfsFileOpenNormal RT_MANGLER(RTVfsFileOpenNormal) # define RTVfsFilePoll RT_MANGLER(RTVfsFilePoll) +# define RTVfsFilePrintf RT_MANGLER(RTVfsFilePrintf) +# define RTVfsFilePrintfV RT_MANGLER(RTVfsFilePrintfV) # define RTVfsFileQueryInfo RT_MANGLER(RTVfsFileQueryInfo) # define RTVfsFileQueryMaxSize RT_MANGLER(RTVfsFileQueryMaxSize) # define RTVfsFileRead RT_MANGLER(RTVfsFileRead) @@ -2737,6 +2777,8 @@ # define RTVfsIoStrmIsAtEnd RT_MANGLER(RTVfsIoStrmIsAtEnd) # define RTVfsIoStrmOpenNormal RT_MANGLER(RTVfsIoStrmOpenNormal) # define RTVfsIoStrmPoll RT_MANGLER(RTVfsIoStrmPoll) +# define RTVfsIoStrmPrintf RT_MANGLER(RTVfsIoStrmPrintf) +# define RTVfsIoStrmPrintfV RT_MANGLER(RTVfsIoStrmPrintfV) # define RTVfsIoStrmQueryInfo RT_MANGLER(RTVfsIoStrmQueryInfo) # define RTVfsIoStrmRead RT_MANGLER(RTVfsIoStrmRead) # define RTVfsIoStrmReadAt RT_MANGLER(RTVfsIoStrmReadAt) @@ -2748,6 +2790,7 @@ # define RTVfsIoStrmSgRead RT_MANGLER(RTVfsIoStrmSgRead) # define RTVfsIoStrmSgWrite RT_MANGLER(RTVfsIoStrmSgWrite) # define RTVfsIoStrmSkip RT_MANGLER(RTVfsIoStrmSkip) +# define RTVfsIoStrmStrOutputCallback RT_MANGLER(RTVfsIoStrmStrOutputCallback) # define RTVfsIoStrmTell RT_MANGLER(RTVfsIoStrmTell) # define RTVfsIoStrmToFile RT_MANGLER(RTVfsIoStrmToFile) # define RTVfsIoStrmValidateUtf8Encoding RT_MANGLER(RTVfsIoStrmValidateUtf8Encoding) @@ -2909,6 +2952,7 @@ # define RTAsn1EncodePrepare RT_MANGLER(RTAsn1EncodePrepare) # define RTAsn1EncodeRecalcHdrSize RT_MANGLER(RTAsn1EncodeRecalcHdrSize) # define RTAsn1EncodeToBuffer RT_MANGLER(RTAsn1EncodeToBuffer) +# define RTAsn1EncodeQueryRawBits RT_MANGLER(RTAsn1EncodeQueryRawBits) # define RTAsn1EncodeWrite RT_MANGLER(RTAsn1EncodeWrite) # define RTAsn1EncodeWriteHeader RT_MANGLER(RTAsn1EncodeWriteHeader) # define RTAsn1BitString_CheckSanity RT_MANGLER(RTAsn1BitString_CheckSanity) @@ -2918,6 +2962,7 @@ # define RTAsn1BitString_Enum RT_MANGLER(RTAsn1BitString_Enum) # define RTAsn1BitString_GetAsUInt64 RT_MANGLER(RTAsn1BitString_GetAsUInt64) # define RTAsn1BitString_Init RT_MANGLER(RTAsn1BitString_Init) +# define RTAsn1BitString_InitWithData RT_MANGLER(RTAsn1BitString_InitWithData) # define RTAsn1BitString_AreContentBitsValid RT_MANGLER(RTAsn1BitString_AreContentBitsValid) # define RTAsn1BitString_RefreshContent RT_MANGLER(RTAsn1BitString_RefreshContent) # define RTAsn1SeqOfBitStrings_CheckSanity RT_MANGLER(RTAsn1SeqOfBitStrings_CheckSanity) @@ -2988,6 +3033,7 @@ # define RTAsn1Core_DecodeAsn1 RT_MANGLER(RTAsn1Core_DecodeAsn1) # define RTAsn1SeqOfCores_DecodeAsn1 RT_MANGLER(RTAsn1SeqOfCores_DecodeAsn1) # define RTAsn1SetOfCores_DecodeAsn1 RT_MANGLER(RTAsn1SetOfCores_DecodeAsn1) +# define RTAsn1DynType_SetToNull RT_MANGLER(RTAsn1DynType_SetToNull) # define RTAsn1DynType_CheckSanity RT_MANGLER(RTAsn1DynType_CheckSanity) # define RTAsn1DynType_Clone RT_MANGLER(RTAsn1DynType_Clone) # define RTAsn1DynType_Compare RT_MANGLER(RTAsn1DynType_Compare) @@ -3043,6 +3089,7 @@ # define RTAsn1ObjId_Enum RT_MANGLER(RTAsn1ObjId_Enum) # define RTAsn1ObjId_Init RT_MANGLER(RTAsn1ObjId_Init) # define RTAsn1ObjId_InitFromString RT_MANGLER(RTAsn1ObjId_InitFromString) +# define RTAsn1ObjId_SetFromString RT_MANGLER(RTAsn1ObjId_SetFromString) # define RTAsn1ObjId_StartsWith RT_MANGLER(RTAsn1ObjId_StartsWith) # define RTAsn1SeqOfObjIds_CheckSanity RT_MANGLER(RTAsn1SeqOfObjIds_CheckSanity) # define RTAsn1SeqOfObjIds_Clone RT_MANGLER(RTAsn1SeqOfObjIds_Clone) @@ -3072,6 +3119,8 @@ # define RTAsn1ObjId_DecodeAsn1 RT_MANGLER(RTAsn1ObjId_DecodeAsn1) # define RTAsn1SeqOfObjIds_DecodeAsn1 RT_MANGLER(RTAsn1SeqOfObjIds_DecodeAsn1) # define RTAsn1SetOfObjIds_DecodeAsn1 RT_MANGLER(RTAsn1SetOfObjIds_DecodeAsn1) +# define RTAsn1OctetString_AllocContent RT_MANGLER(RTAsn1OctetString_AllocContent) +# define RTAsn1OctetString_SetContent RT_MANGLER(RTAsn1OctetString_SetContent) # define RTAsn1OctetString_CheckSanity RT_MANGLER(RTAsn1OctetString_CheckSanity) # define RTAsn1OctetString_Clone RT_MANGLER(RTAsn1OctetString_Clone) # define RTAsn1OctetString_Compare RT_MANGLER(RTAsn1OctetString_Compare) @@ -3220,6 +3269,9 @@ # define RTAsn1Time_Enum RT_MANGLER(RTAsn1Time_Enum) # define RTAsn1Time_Init RT_MANGLER(RTAsn1Time_Init) # define RTAsn1Time_InitEx RT_MANGLER(RTAsn1Time_InitEx) +# define RTAsn1Time_InitWithTime RT_MANGLER(RTAsn1Time_InitWithTime) +# define RTAsn1Time_SetTime RT_MANGLER(RTAsn1Time_SetTime) +# define RTAsn1Time_SetTimeSpec RT_MANGLER(RTAsn1Time_SetTimeSpec) # define RTAsn1UtcTime_CheckSanity RT_MANGLER(RTAsn1UtcTime_CheckSanity) # define RTAsn1UtcTime_Clone RT_MANGLER(RTAsn1UtcTime_Clone) # define RTAsn1UtcTime_Compare RT_MANGLER(RTAsn1UtcTime_Compare) @@ -3320,18 +3372,40 @@ # define RTCrRsaOtherPrimeInfo_CheckSanity RT_MANGLER(RTCrRsaOtherPrimeInfo_CheckSanity) # define RTCrRsaOtherPrimeInfos_CheckSanity RT_MANGLER(RTCrRsaOtherPrimeInfos_CheckSanity) # define RTCrRsaPrivateKey_CheckSanity RT_MANGLER(RTCrRsaPrivateKey_CheckSanity) +# define RTCrRsaPrivateKey_CanHandleDigestType RT_MANGLER(RTCrRsaPrivateKey_CanHandleDigestType) # define RTCrRsaPublicKey_CheckSanity RT_MANGLER(RTCrRsaPublicKey_CheckSanity) +# define RTCrRsaPublicKey_CanHandleDigestType RT_MANGLER(RTCrRsaPublicKey_CanHandleDigestType) # define RTCrPemFindFirstSectionInContent RT_MANGLER(RTCrPemFindFirstSectionInContent) # define RTCrPemFreeSections RT_MANGLER(RTCrPemFreeSections) # define RTCrPemParseContent RT_MANGLER(RTCrPemParseContent) # define RTCrPemReadFile RT_MANGLER(RTCrPemReadFile) +# define RTCrPemWriteBlob RT_MANGLER(RTCrPemWriteBlob) +# define RTCrPemWriteBlobToVfsIoStrm RT_MANGLER(RTCrPemWriteBlobToVfsIoStrm) +# define RTCrPemWriteBlobToVfsFile RT_MANGLER(RTCrPemWriteBlobToVfsFile) +# define RTCrPemWriteAsn1 RT_MANGLER(RTCrPemWriteAsn1) +# define RTCrPemWriteAsn1ToVfsIoStrm RT_MANGLER(RTCrPemWriteAsn1ToVfsIoStrm) +# define RTCrPemWriteAsn1ToVfsFile RT_MANGLER(RTCrPemWriteAsn1ToVfsFile) # define RTCrPkcs5Pbkdf2Hmac RT_MANGLER(RTCrPkcs5Pbkdf2Hmac) +# define RTCrPkcs7_ReadFromBuffer RT_MANGLER(RTCrPkcs7_ReadFromBuffer) +# define RTCrPkcs7Attribute_SetAppleMultiCdPlist RT_MANGLER(RTCrPkcs7Attribute_SetAppleMultiCdPlist) +# define RTCrPkcs7Attribute_SetContentType RT_MANGLER(RTCrPkcs7Attribute_SetContentType) +# define RTCrPkcs7Attribute_SetCounterSignatures RT_MANGLER(RTCrPkcs7Attribute_SetCounterSignatures) +# define RTCrPkcs7Attribute_SetMessageDigest RT_MANGLER(RTCrPkcs7Attribute_SetMessageDigest) +# define RTCrPkcs7Attribute_SetMsStatementType RT_MANGLER(RTCrPkcs7Attribute_SetMsStatementType) +# define RTCrPkcs7Attribute_SetMsNestedSignature RT_MANGLER(RTCrPkcs7Attribute_SetMsNestedSignature) +# define RTCrPkcs7Attribute_SetMsTimestamp RT_MANGLER(RTCrPkcs7Attribute_SetMsTimestamp) +# define RTCrPkcs7Attribute_SetSigningTime RT_MANGLER(RTCrPkcs7Attribute_SetSigningTime) +# define RTCrPkcs7Attributes_HashAttributes RT_MANGLER(RTCrPkcs7Attributes_HashAttributes) # define RTCrPkcs7Attribute_DecodeAsn1 RT_MANGLER(RTCrPkcs7Attribute_DecodeAsn1) # define RTCrPkcs7Attributes_DecodeAsn1 RT_MANGLER(RTCrPkcs7Attributes_DecodeAsn1) # define RTCrPkcs7ContentInfo_DecodeAsn1 RT_MANGLER(RTCrPkcs7ContentInfo_DecodeAsn1) # define RTCrPkcs7DigestInfo_DecodeAsn1 RT_MANGLER(RTCrPkcs7DigestInfo_DecodeAsn1) # define RTCrPkcs7IssuerAndSerialNumber_DecodeAsn1 RT_MANGLER(RTCrPkcs7IssuerAndSerialNumber_DecodeAsn1) +# define RTCrPkcs7SignedData_SetCertificates RT_MANGLER(RTCrPkcs7SignedData_SetCertificates) +# define RTCrPkcs7SignedData_SetCrls RT_MANGLER(RTCrPkcs7SignedData_SetCrls) # define RTCrPkcs7SignedData_DecodeAsn1 RT_MANGLER(RTCrPkcs7SignedData_DecodeAsn1) +# define RTCrPkcs7SignerInfo_SetAuthenticatedAttributes RT_MANGLER(RTCrPkcs7SignerInfo_SetAuthenticatedAttributes) +# define RTCrPkcs7SignerInfo_SetUnauthenticatedAttributes RT_MANGLER(RTCrPkcs7SignerInfo_SetUnauthenticatedAttributes) # define RTCrPkcs7SignerInfo_DecodeAsn1 RT_MANGLER(RTCrPkcs7SignerInfo_DecodeAsn1) # define RTCrPkcs7SignerInfos_DecodeAsn1 RT_MANGLER(RTCrPkcs7SignerInfos_DecodeAsn1) # define RTCrPkcs7Attribute_Compare RT_MANGLER(RTCrPkcs7Attribute_Compare) @@ -3385,10 +3459,16 @@ # define RTCrPkcs7SignedData_CheckSanity RT_MANGLER(RTCrPkcs7SignedData_CheckSanity) # define RTCrPkcs7SignerInfo_CheckSanity RT_MANGLER(RTCrPkcs7SignerInfo_CheckSanity) # define RTCrPkcs7SignerInfos_CheckSanity RT_MANGLER(RTCrPkcs7SignerInfos_CheckSanity) +# define RTCrPkcs7SimpleSignSignedData RT_MANGLER(RTCrPkcs7SimpleSignSignedData) # define RTCrPkcs7VerifyCertCallbackCodeSigning RT_MANGLER(RTCrPkcs7VerifyCertCallbackCodeSigning) # define RTCrPkcs7VerifyCertCallbackDefault RT_MANGLER(RTCrPkcs7VerifyCertCallbackDefault) # define RTCrPkcs7VerifySignedData RT_MANGLER(RTCrPkcs7VerifySignedData) # define RTCrPkcs7VerifySignedDataWithExternalData RT_MANGLER(RTCrPkcs7VerifySignedDataWithExternalData) +# define RTCrPkcs7Cert_SetX509Cert RT_MANGLER(RTCrPkcs7Cert_SetX509Cert) +# define RTCrPkcs7Cert_SetExtendedCert RT_MANGLER(RTCrPkcs7Cert_SetExtendedCert) +# define RTCrPkcs7Cert_SetAcV1 RT_MANGLER(RTCrPkcs7Cert_SetAcV1) +# define RTCrPkcs7Cert_SetAcV2 RT_MANGLER(RTCrPkcs7Cert_SetAcV2) +# define RTCrPkcs7Cert_SetOtherCert RT_MANGLER(RTCrPkcs7Cert_SetOtherCert) # define RTCrPkcs7Cert_CheckSanity RT_MANGLER(RTCrPkcs7Cert_CheckSanity) # define RTCrPkcs7Cert_Clone RT_MANGLER(RTCrPkcs7Cert_Clone) # define RTCrPkcs7Cert_Compare RT_MANGLER(RTCrPkcs7Cert_Compare) @@ -3434,11 +3514,18 @@ # define RTCrPkixPubKeyVerifySignature RT_MANGLER(RTCrPkixPubKeyVerifySignature) # define RTCrPkixPubKeyVerifySignedDigest RT_MANGLER(RTCrPkixPubKeyVerifySignedDigest) # define RTCrPkixPubKeyVerifySignedDigestByCertPubKeyInfo RT_MANGLER(RTCrPkixPubKeyVerifySignedDigestByCertPubKeyInfo) +# define RTCrPkixPubKeyCanHandleDigestType RT_MANGLER(RTCrPkixPubKeyCanHandleDigestType) +# define RTCrPkixCanCertHandleDigestType RT_MANGLER(RTCrPkixCanCertHandleDigestType) # define RTCrRandBytes RT_MANGLER(RTCrRandBytes) +# define RTCrSpcAttributeTypeAndOptionalValue_SetPeImage RT_MANGLER(RTCrSpcAttributeTypeAndOptionalValue_SetPeImage) # define RTCrSpcAttributeTypeAndOptionalValue_DecodeAsn1 RT_MANGLER(RTCrSpcAttributeTypeAndOptionalValue_DecodeAsn1) # define RTCrSpcIndirectDataContent_DecodeAsn1 RT_MANGLER(RTCrSpcIndirectDataContent_DecodeAsn1) # define RTCrSpcLink_DecodeAsn1 RT_MANGLER(RTCrSpcLink_DecodeAsn1) +# define RTCrSpcPeImageData_SetFile RT_MANGLER(RTCrSpcPeImageData_SetFile) +# define RTCrSpcPeImageData_SetFlags RT_MANGLER(RTCrSpcPeImageData_SetFlags) # define RTCrSpcPeImageData_DecodeAsn1 RT_MANGLER(RTCrSpcPeImageData_DecodeAsn1) +# define RTCrSpcSerializedObjectAttribute_SetV1Hashes RT_MANGLER(RTCrSpcSerializedObjectAttribute_SetV1Hashes) +# define RTCrSpcSerializedObjectAttribute_SetV2Hashes RT_MANGLER(RTCrSpcSerializedObjectAttribute_SetV2Hashes) # define RTCrSpcSerializedObjectAttribute_DecodeAsn1 RT_MANGLER(RTCrSpcSerializedObjectAttribute_DecodeAsn1) # define RTCrSpcSerializedObjectAttributes_DecodeAsn1 RT_MANGLER(RTCrSpcSerializedObjectAttributes_DecodeAsn1) # define RTCrSpcSerializedObject_DecodeAsn1 RT_MANGLER(RTCrSpcSerializedObject_DecodeAsn1) @@ -3451,6 +3538,9 @@ # define RTCrSpcIndirectDataContent_Delete RT_MANGLER(RTCrSpcIndirectDataContent_Delete) # define RTCrSpcIndirectDataContent_Enum RT_MANGLER(RTCrSpcIndirectDataContent_Enum) # define RTCrSpcIndirectDataContent_GetPeImageObjAttrib RT_MANGLER(RTCrSpcIndirectDataContent_GetPeImageObjAttrib) +# define RTCrSpcLink_SetFile RT_MANGLER(RTCrSpcLink_SetFile) +# define RTCrSpcLink_SetMoniker RT_MANGLER(RTCrSpcLink_SetMoniker) +# define RTCrSpcLink_SetUrl RT_MANGLER(RTCrSpcLink_SetUrl) # define RTCrSpcLink_Compare RT_MANGLER(RTCrSpcLink_Compare) # define RTCrSpcLink_Delete RT_MANGLER(RTCrSpcLink_Delete) # define RTCrSpcLink_Enum RT_MANGLER(RTCrSpcLink_Enum) @@ -3477,6 +3567,8 @@ # define RTCrSpcAttributeTypeAndOptionalValue_Init RT_MANGLER(RTCrSpcAttributeTypeAndOptionalValue_Init) # define RTCrSpcIndirectDataContent_Clone RT_MANGLER(RTCrSpcIndirectDataContent_Clone) # define RTCrSpcIndirectDataContent_Init RT_MANGLER(RTCrSpcIndirectDataContent_Init) +# define RTCrSpcString_SetAscii RT_MANGLER(RTCrSpcString_SetAscii) +# define RTCrSpcString_SetUcs2 RT_MANGLER(RTCrSpcString_SetUcs2) # define RTCrSpcLink_Clone RT_MANGLER(RTCrSpcLink_Clone) # define RTCrSpcLink_Init RT_MANGLER(RTCrSpcLink_Init) # define RTCrSpcPeImageData_Clone RT_MANGLER(RTCrSpcPeImageData_Clone) @@ -3816,6 +3908,7 @@ # define RTCrCertCtxRelease RT_MANGLER(RTCrCertCtxRelease) # define RTCrCertCtxRetain RT_MANGLER(RTCrCertCtxRetain) # define RTCrStoreCertAddEncoded RT_MANGLER(RTCrStoreCertAddEncoded) +# define RTCrStoreCertAddX509 RT_MANGLER(RTCrStoreCertAddX509) # define RTCrStoreCertByIssuerAndSerialNo RT_MANGLER(RTCrStoreCertByIssuerAndSerialNo) # define RTCrStoreCertCount RT_MANGLER(RTCrStoreCertCount) # define RTCrStoreCertFindAll RT_MANGLER(RTCrStoreCertFindAll) @@ -3827,6 +3920,7 @@ # define RTCrStoreRelease RT_MANGLER(RTCrStoreRelease) # define RTCrStoreRetain RT_MANGLER(RTCrStoreRetain) # define RTCrStoreCreateInMem RT_MANGLER(RTCrStoreCreateInMem) +# define RTCrStoreCreateInMemEx RT_MANGLER(RTCrStoreCreateInMemEx) # define RTCrStoreCreateSnapshotById RT_MANGLER(RTCrStoreCreateSnapshotById) # define RTCrStoreCreateSnapshotOfUserAndSystemTrustedCAsAndCerts RT_MANGLER(RTCrStoreCreateSnapshotOfUserAndSystemTrustedCAsAndCerts) # define RTCrStoreCertAddFromDir RT_MANGLER(RTCrStoreCertAddFromDir) @@ -4005,6 +4099,8 @@ # define g_RTAsn1DefaultAllocator RT_MANGLER(g_RTAsn1DefaultAllocator) # define g_RTAsn1EFenceAllocator RT_MANGLER(g_RTAsn1EFenceAllocator) # define g_RTAsn1SaferAllocator RT_MANGLER(g_RTAsn1SaferAllocator) +# define g_aRTCrPkcs7Markers RT_MANGLER(g_aRTCrPkcs7Markers) +# define g_cRTCrPkcs7Markers RT_MANGLER(g_cRTCrPkcs7Markers) # define g_aRTCrX509CertificateMarkers RT_MANGLER(g_aRTCrX509CertificateMarkers) # define g_cRTCrX509CertificateMarkers RT_MANGLER(g_cRTCrX509CertificateMarkers) # define g_aRTCrKeyPublicMarkers RT_MANGLER(g_aRTCrKeyPublicMarkers) diff -Nru virtualbox-hwe-6.1.34-dfsg/include/iprt/sha.h virtualbox-hwe-6.1.38-dfsg/include/iprt/sha.h --- virtualbox-hwe-6.1.34-dfsg/include/iprt/sha.h 2022-03-22 23:34:50.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/include/iprt/sha.h 2022-09-01 13:17:54.000000000 +0000 @@ -513,6 +513,68 @@ RTSHA512_DECLARE_VARIANT(512t256,512T256); +/** + * SHA3 context. + */ +typedef union RTSHA3CONTEXT +{ + uint64_t a64Padding[26]; + uint8_t abPadding[208]; +#ifdef RT_SHA3_PRIVATE_CONTEXT + RTSHA3PRIVATECTX Private; +#endif +#ifdef RT_SHA3_PRIVATE_ALT_CONTEXT + RTSHA3ALTPRIVATECTX AltPrivate; +#endif +} RTSHA3CONTEXT; +/** Pointer to an SHA3 context. */ +typedef RTSHA3CONTEXT *PRTSHA3CONTEXT; + +/** Macro for declaring the interface for a SHA3 variation. + * + * @note The interface differes slightly from the older checksums: + * - Must call Final and/or Cleanup method. + * - Must use Clone instead of memcpy'ing the context. + * - Status codes are returned, Init may really fail. + * + * @internal */ +#define RTSHA3_DECLARE_VARIANT(a_Bits) \ + typedef struct RT_CONCAT3(RTSHA3T,a_Bits,CONTEXT) { RTSHA3CONTEXT Sha3; } RT_CONCAT3(RTSHA3T,a_Bits,CONTEXT); \ + typedef RT_CONCAT3(RTSHA3T,a_Bits,CONTEXT) *RT_CONCAT3(PRTSHA3T,a_Bits,CONTEXT); \ + RTDECL(int) RT_CONCAT(RTSha3t,a_Bits)(const void *pvBuf, size_t cbBuf, uint8_t pabHash[RT_CONCAT3(RTSHA3_,a_Bits,_HASH_SIZE)]); \ + RTDECL(bool) RT_CONCAT3(RTSha3t,a_Bits,Check)(const void *pvBuf, size_t cbBuf, uint8_t const pabHash[RT_CONCAT3(RTSHA3_,a_Bits,_HASH_SIZE)]); \ + RTDECL(int) RT_CONCAT3(RTSha3t,a_Bits,Init)(RT_CONCAT3(PRTSHA3T,a_Bits,CONTEXT) pCtx); \ + RTDECL(int) RT_CONCAT3(RTSha3t,a_Bits,Update)(RT_CONCAT3(PRTSHA3T,a_Bits,CONTEXT) pCtx, const void *pvBuf, size_t cbBuf); \ + RTDECL(int) RT_CONCAT3(RTSha3t,a_Bits,Final)(RT_CONCAT3(PRTSHA3T,a_Bits,CONTEXT) pCtx, uint8_t pabHash[RT_CONCAT3(RTSHA3_,a_Bits,_HASH_SIZE)]); \ + RTDECL(int) RT_CONCAT3(RTSha3t,a_Bits,Cleanup)(RT_CONCAT3(PRTSHA3T,a_Bits,CONTEXT) pCtx); \ + RTDECL(int) RT_CONCAT3(RTSha3t,a_Bits,Clone)(RT_CONCAT3(PRTSHA3T,a_Bits,CONTEXT) pCtx, RT_CONCAT3(RTSHA3T,a_Bits,CONTEXT) const *pCtxSrc); \ + RTDECL(int) RT_CONCAT3(RTSha3t,a_Bits,ToString)(uint8_t const pabHash[RT_CONCAT3(RTSHA3_,a_Bits,_HASH_SIZE)], char *pszDigest, size_t cchDigest); \ + RTDECL(int) RT_CONCAT3(RTSha3t,a_Bits,FromString)(char const *pszDigest, uint8_t pabHash[RT_CONCAT3(RTSHA3_,a_Bits,_HASH_SIZE)]) + +/** The size of a SHA-224 hash. */ +#define RTSHA3_224_HASH_SIZE 28 +/** The length of a SHA-224 digest string. The terminator is not included. */ +#define RTSHA3_224_DIGEST_LEN 56 +RTSHA3_DECLARE_VARIANT(224); + +/** The size of a SHA-256 hash. */ +#define RTSHA3_256_HASH_SIZE 32 +/** The length of a SHA-256 digest string. The terminator is not included. */ +#define RTSHA3_256_DIGEST_LEN 64 +RTSHA3_DECLARE_VARIANT(256); + +/** The size of a SHA-384 hash. */ +#define RTSHA3_384_HASH_SIZE 48 +/** The length of a SHA-384 digest string. The terminator is not included. */ +#define RTSHA3_384_DIGEST_LEN 96 +RTSHA3_DECLARE_VARIANT(384); + +/** The size of a SHA-512 hash. */ +#define RTSHA3_512_HASH_SIZE 64 +/** The length of a SHA-512 digest string. The terminator is not included. */ +#define RTSHA3_512_DIGEST_LEN 128 +RTSHA3_DECLARE_VARIANT(512); + /** @} */ RT_C_DECLS_END diff -Nru virtualbox-hwe-6.1.34-dfsg/include/iprt/stdarg.h virtualbox-hwe-6.1.38-dfsg/include/iprt/stdarg.h --- virtualbox-hwe-6.1.34-dfsg/include/iprt/stdarg.h 2022-03-22 23:34:50.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/include/iprt/stdarg.h 2022-09-01 13:17:54.000000000 +0000 @@ -45,7 +45,7 @@ # endif # elif defined(RT_OS_LINUX) && defined(IN_RING0) # include "linux/version.h" -# if RTLNX_VER_MIN(5,15,0) +# if RTLNX_VER_MIN(5,15,0) || RTLNX_RHEL_MAJ_PREREQ(9,1) # include # else # include diff -Nru virtualbox-hwe-6.1.34-dfsg/include/iprt/stream.h virtualbox-hwe-6.1.38-dfsg/include/iprt/stream.h --- virtualbox-hwe-6.1.34-dfsg/include/iprt/stream.h 2022-03-22 23:34:50.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/include/iprt/stream.h 2022-09-01 13:17:54.000000000 +0000 @@ -310,6 +310,72 @@ RTR3DECL(int) RTStrmPrintfV(PRTSTREAM pStream, const char *pszFormat, va_list args) RT_IPRT_FORMAT_ATTR(2, 0); /** + * Prints a formatted string to the specified stream, performing wrapping of + * lines considered too long. + * + * If the stream is to a terminal, the terminal width is used as the max line + * width. Otherwise, the width is taken from @a fFlags + * (RTSTRMWRAPPED_F_NON_TERMINAL_WIDTH_MASK / + * RTSTRMWRAPPED_F_NON_TERMINAL_WIDTH_SHIFT), defaulting to 80 if zero. + * + * @returns Low 16 bits is the line offset, high 16 bits the number of lines + * outputted. Apply RTSTRMWRAPPED_F_LINE_OFFSET_MASK to the value and + * it can be passed via @a fFlags to the next invocation (not necessary + * if all format strings ends with a newline). + * Negative values are IPRT error status codes. + * @param pStream The stream to print to. + * @param fFlags RTSTRMWRAPPED_F_XXX - flags, configuration and state. + * @param pszFormat Runtime format string. + * @param ... Arguments specified by pszFormat. + * @sa RTStrmWrappedPrintfV, RTStrmPrintf, RTStrmPrintfV + */ +RTDECL(int32_t) RTStrmWrappedPrintf(PRTSTREAM pStream, uint32_t fFlags, const char *pszFormat, ...) RT_IPRT_FORMAT_ATTR(3, 4); + +/** + * Prints a formatted string to the specified stream, performing wrapping of + * lines considered too long. + * + * If the stream is to a terminal, the terminal width is used as the max line + * width. Otherwise, the width is taken from @a fFlags + * (RTSTRMWRAPPED_F_NON_TERMINAL_WIDTH_MASK / + * RTSTRMWRAPPED_F_NON_TERMINAL_WIDTH_SHIFT), defaulting to 80 if zero. + * + * @returns Low 16 bits is the line offset, high 16 bits the number of lines + * outputted. Apply RTSTRMWRAPPED_F_LINE_OFFSET_MASK to the value and + * it can be passed via @a fFlags to the next invocation (not necessary + * if all format strings ends with a newline). + * Negative values are IPRT error status codes. + * @param pStream The stream to print to. + * @param fFlags RTSTRMWRAPPED_F_XXX - flags, configuration and state. + * @param pszFormat Runtime format string. + * @param va Arguments specified by pszFormat. + * @sa RTStrmWrappedPrintf, RTStrmPrintf, RTStrmPrintfV + */ +RTDECL(int32_t) RTStrmWrappedPrintfV(PRTSTREAM pStream, uint32_t fFlags, const char *pszFormat, + va_list va) RT_IPRT_FORMAT_ATTR(3, 0); + +/** @name RTSTRMWRAPPED_F_XXX - Flags for RTStrmWrappedPrintf & + * RTStrmWrappedPrintfV. + * @{ */ +/** The current line offset mask. + * This should be used to passed the line off state from one call to the next + * when printing incomplete lines. If all format strings ends with a newline, + * this is not necessary. */ +#define RTSTRMWRAPPED_F_LINE_OFFSET_MASK UINT32_C(0x00000fff) +/** The non-terminal width mask. Defaults to 80 if not specified (zero). */ +#define RTSTRMWRAPPED_F_NON_TERMINAL_WIDTH_MASK UINT32_C(0x000ff000) +/** The non-terminal width shift. */ +#define RTSTRMWRAPPED_F_NON_TERMINAL_WIDTH_SHIFT 12 +/** The hanging indent level mask - defaults to 4 if zero. + * Used when RTSTRMWRAPPED_F_HANGING_INDENT is set. */ +#define RTSTRMWRAPPED_F_HANGING_INDENT_MASK UINT32_C(0x01f00000) +/** The hanging indent level shift. */ +#define RTSTRMWRAPPED_F_HANGING_INDENT_SHIFT 20 +/** Hanging indent. Used for command synopsis and such. */ +#define RTSTRMWRAPPED_F_HANGING_INDENT UINT32_C(0x80000000) +/** @} */ + +/** * Dumper vprintf-like function outputting to a stream. * * @param pvUser The stream to print to. NULL means standard output. diff -Nru virtualbox-hwe-6.1.34-dfsg/include/iprt/system.h virtualbox-hwe-6.1.38-dfsg/include/iprt/system.h --- virtualbox-hwe-6.1.34-dfsg/include/iprt/system.h 2022-03-22 23:34:50.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/include/iprt/system.h 2022-09-01 13:17:54.000000000 +0000 @@ -354,6 +354,11 @@ */ RTDECL(uint64_t) RTSystemGetNtVersion(void); +/** + * Get the Windows NT product type (OSVERSIONINFOW::wProductType). + */ +RTDECL(uint8_t) RTSystemGetNtProductType(void); + #endif /* RT_OS_WINDOWS */ /** @} */ diff -Nru virtualbox-hwe-6.1.34-dfsg/include/iprt/types.h virtualbox-hwe-6.1.38-dfsg/include/iprt/types.h --- virtualbox-hwe-6.1.34-dfsg/include/iprt/types.h 2022-03-22 23:34:51.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/include/iprt/types.h 2022-09-01 13:17:54.000000000 +0000 @@ -2966,6 +2966,20 @@ RTDIGESTTYPE_SHA512T224, /** SHA-512/256 checksum. */ RTDIGESTTYPE_SHA512T256, + /** SHA3-224 checksum. */ + RTDIGESTTYPE_SHA3_224, + /** SHA3-256 checksum. */ + RTDIGESTTYPE_SHA3_256, + /** SHA3-384 checksum. */ + RTDIGESTTYPE_SHA3_384, + /** SHA3-512 checksum. */ + RTDIGESTTYPE_SHA3_512, +#if 0 + /** SHAKE128 checksum. */ + RTDIGESTTYPE_SHAKE128, + /** SHAKE256 checksum. */ + RTDIGESTTYPE_SHAKE256, +#endif /** End of valid types. */ RTDIGESTTYPE_END, /** Usual 32-bit type blowup. */ diff -Nru virtualbox-hwe-6.1.34-dfsg/include/iprt/vfs.h virtualbox-hwe-6.1.38-dfsg/include/iprt/vfs.h --- virtualbox-hwe-6.1.34-dfsg/include/iprt/vfs.h 2022-03-22 23:34:51.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/include/iprt/vfs.h 2022-09-01 13:17:55.000000000 +0000 @@ -1206,6 +1206,68 @@ #define RTVFS_VALIDATE_UTF8_VALID_MASK UINT32_C(0x00000003) /** @} */ +/** + * Printf-like write function. + * + * @returns Number of characters written on success, negative error status on + * failure. + * @param hVfsIos The VFS I/O stream handle to write to. + * @param pszFormat The format string. + * @param ... Format arguments. + */ +RTDECL(ssize_t) RTVfsIoStrmPrintf(RTVFSIOSTREAM hVfsIos, const char *pszFormat, ...); + +/** + * Printf-like write function. + * + * @returns Number of characters written on success, negative error status on + * failure. + * @param hVfsIos The VFS I/O stream handle to write to. + * @param pszFormat The format string. + * @param va Format arguments. + */ +RTDECL(ssize_t) RTVfsIoStrmPrintfV(RTVFSIOSTREAM hVfsIos, const char *pszFormat, va_list va); + +/** + * VFS I/O stream output buffer structure to use with + * RTVfsIoStrmStrOutputCallback(). + */ +typedef struct VFSIOSTRMOUTBUF +{ + /** The I/O stream handle. */ + RTVFSIOSTREAM hVfsIos; + /** Size of this structure (for sanity). */ + size_t cbSelf; + /** Status code of the operation. */ + int rc; + /** Current offset into szBuf (number of output bytes pending). */ + size_t offBuf; + /** Modest output buffer. */ + char szBuf[256]; +} VFSIOSTRMOUTBUF; +/** Pointer to an VFS I/O stream output buffer for use with + * RTVfsIoStrmStrOutputCallback() */ +typedef VFSIOSTRMOUTBUF *PVFSIOSTRMOUTBUF; + +/** Initializer for a VFS I/O stream output buffer. */ +#define VFSIOSTRMOUTBUF_INIT(a_pOutBuf, a_hVfsIos) \ + do { \ + (a_pOutBuf)->hVfsIos = a_hVfsIos; \ + (a_pOutBuf)->cbSelf = sizeof(*(a_pOutBuf)); \ + (a_pOutBuf)->rc = VINF_SUCCESS; \ + (a_pOutBuf)->offBuf = 0; \ + (a_pOutBuf)->szBuf[0] = '\0'; \ + } while (0) + +/** + * @callback_method_impl{FNRTSTROUTPUT, + * For use with VFSIOSTRMOUTBUF. + * + * Users must use VFSIOSTRMOUTBUF_INIT to initialize a VFSIOSTRMOUTBUF and pass + * that as the outputter argument to the function this callback is handed to.} + */ +RTDECL(size_t) RTVfsIoStrmStrOutputCallback(void *pvArg, const char *pachChars, size_t cbChars); + /** @} */ @@ -1483,6 +1545,28 @@ */ RTDECL(uint64_t) RTVfsFileGetOpenFlags(RTVFSFILE hVfsFile); +/** + * Printf-like write function. + * + * @returns Number of characters written on success, negative error status on + * failure. + * @param hVfsFile The VFS file handle to write to. + * @param pszFormat The format string. + * @param ... Format arguments. + */ +RTDECL(ssize_t) RTVfsFilePrintf(RTVFSFILE hVfsFile, const char *pszFormat, ...); + +/** + * Printf-like write function. + * + * @returns Number of characters written on success, negative error status on + * failure. + * @param hVfsFile The VFS file handle to write to. + * @param pszFormat The format string. + * @param va Format arguments. + */ +RTDECL(ssize_t) RTVfsFilePrintfV(RTVFSFILE hVfsFile, const char *pszFormat, va_list va); + /** @} */ diff -Nru virtualbox-hwe-6.1.34-dfsg/include/iprt/x86.h virtualbox-hwe-6.1.38-dfsg/include/iprt/x86.h --- virtualbox-hwe-6.1.34-dfsg/include/iprt/x86.h 2022-03-22 23:34:51.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/include/iprt/x86.h 2022-09-01 13:17:55.000000000 +0000 @@ -634,6 +634,8 @@ #define X86_CPUID_STEXT_FEATURE_EDX_FLUSH_CMD RT_BIT_32(28) /** EDX Bit 29 - ARCHCAP - Supports the IA32_ARCH_CAPABILITIES MSR. */ #define X86_CPUID_STEXT_FEATURE_EDX_ARCHCAP RT_BIT_32(29) +/** EDX Bit 31 - SSBD - Supports the SSBD flag in IA32_SPEC_CTRL. */ +#define X86_CPUID_STEXT_FEATURE_EDX_SSBD RT_BIT_32(31) /** @} */ @@ -784,18 +786,34 @@ * @{ */ /** Bit 0 - CLZERO - Clear zero instruction. */ -#define X86_CPUID_AMD_EFEID_EBX_CLZERO RT_BIT_32(0) +#define X86_CPUID_AMD_EFEID_EBX_CLZERO RT_BIT_32(0) /** Bit 1 - IRPerf - Instructions retired count support. */ -#define X86_CPUID_AMD_EFEID_EBX_IRPERF RT_BIT_32(1) +#define X86_CPUID_AMD_EFEID_EBX_IRPERF RT_BIT_32(1) /** Bit 2 - XSaveErPtr - Always XSAVE* and XRSTR* error pointers. */ -#define X86_CPUID_AMD_EFEID_EBX_XSAVE_ER_PTR RT_BIT_32(2) +#define X86_CPUID_AMD_EFEID_EBX_XSAVE_ER_PTR RT_BIT_32(2) /** Bit 4 - RDPRU - Supports the RDPRU instruction. */ -#define X86_CPUID_AMD_EFEID_EBX_RDPRU RT_BIT_32(4) +#define X86_CPUID_AMD_EFEID_EBX_RDPRU RT_BIT_32(4) /** Bit 8 - MCOMMIT - Supports the MCOMMIT instruction. */ -#define X86_CPUID_AMD_EFEID_EBX_MCOMMIT RT_BIT_32(8) +#define X86_CPUID_AMD_EFEID_EBX_MCOMMIT RT_BIT_32(8) /* AMD pipeline length: 9 feature bits ;-) */ /** Bit 12 - IBPB - Supports the IBPB command in IA32_PRED_CMD. */ -#define X86_CPUID_AMD_EFEID_EBX_IBPB RT_BIT_32(12) +#define X86_CPUID_AMD_EFEID_EBX_IBPB RT_BIT_32(12) +/** Bit 14 - IBRS - Supports the IBRS bit in IA32_SPEC_CTRL. */ +#define X86_CPUID_AMD_EFEID_EBX_IBRS RT_BIT_32(14) +/** Bit 15 - STIBP - Supports the STIBP bit in IA32_SPEC_CTRL. */ +#define X86_CPUID_AMD_EFEID_EBX_STIBP RT_BIT_32(15) +/** Bit 16 - IBRS always on mode - IBRS should be set once during boot only. */ +#define X86_CPUID_AMD_EFEID_EBX_IBRS_ALWAYS_ON RT_BIT_32(16) +/** Bit 17 - STIBP always on mode - STIBP should be set once during boot only. */ +#define X86_CPUID_AMD_EFEID_EBX_STIBP_ALWAYS_ON RT_BIT_32(17) +/** Bit 18 - IBRS preferred - IBRS is preferred over software mitigations. */ +#define X86_CPUID_AMD_EFEID_EBX_IBRS_PREFERRED RT_BIT_32(18) +/** Bit 24 - Speculative Store Bypass Disable supported in SPEC_CTL. */ +#define X86_CPUID_AMD_EFEID_EBX_SPEC_CTRL_SSBD RT_BIT_32(24) +/** Bit 25 - Speculative Store Bypass Disable supported in VIRT_SPEC_CTL. */ +#define X86_CPUID_AMD_EFEID_EBX_VIRT_SPEC_CTRL_SSBD RT_BIT_32(25) +/** Bit 26 - Speculative Store Bypass Disable not required. */ +#define X86_CPUID_AMD_EFEID_EBX_NO_SSBD_REQUIRED RT_BIT_32(26) /** @} */ @@ -1214,6 +1232,8 @@ #define MSR_IA32_SPEC_CTRL_F_IBRS RT_BIT_32(0) /** STIBP - Single thread indirect branch predictors. */ #define MSR_IA32_SPEC_CTRL_F_STIBP RT_BIT_32(1) +/** SSBD - Speculative Store Bypass Disable. */ +#define MSR_IA32_SPEC_CTRL_F_SSBD RT_BIT_32(2) /** Prediction command register. * Write only, logical processor scope, no state since write only. */ @@ -1845,6 +1865,16 @@ * host state during world switch. */ #define MSR_K8_VM_HSAVE_PA UINT32_C(0xc0010117) +/** Virtualized speculation control for AMD processors. + * + * Unified interface among different CPU generations. + * The VMM will set any architectural MSRs based on the CPU. + * See "White Paper: AMD64 Technology Speculative Store Bypass Disable 5.21.18" + * (12441_AMD64_SpeculativeStoreBypassDisable_Whitepaper_final.pdf) */ +#define MSR_AMD_VIRT_SPEC_CTL UINT32_C(0xc001011f) +/** Speculative Store Bypass Disable. */ +# define MSR_AMD_VIRT_SPEC_CTL_F_SSBD RT_BIT(2) + /** @} */ diff -Nru virtualbox-hwe-6.1.34-dfsg/include/VBox/GuestHost/DragAndDrop.h virtualbox-hwe-6.1.38-dfsg/include/VBox/GuestHost/DragAndDrop.h --- virtualbox-hwe-6.1.34-dfsg/include/VBox/GuestHost/DragAndDrop.h 2022-03-22 23:34:41.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/include/VBox/GuestHost/DragAndDrop.h 2022-09-01 13:17:45.000000000 +0000 @@ -34,6 +34,8 @@ #include #include +#include + /** DnDURIDroppedFiles flags. */ typedef uint32_t DNDURIDROPPEDFILEFLAGS; @@ -89,6 +91,8 @@ int DnDDroppedFilesReset(PDNDDROPPEDFILES pDF, bool fDelete); int DnDDroppedFilesRollback(PDNDDROPPEDFILES pDF); +const char *DnDActionToStr(VBOXDNDACTION uAction); + bool DnDMIMEHasFileURLs(const char *pcszFormat, size_t cchFormatMax); bool DnDMIMENeedsDropDir(const char *pcszFormat, size_t cchFormatMax); diff -Nru virtualbox-hwe-6.1.34-dfsg/include/VBox/ostypes.h virtualbox-hwe-6.1.38-dfsg/include/VBox/ostypes.h --- virtualbox-hwe-6.1.34-dfsg/include/VBox/ostypes.h 2022-03-22 23:34:43.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/include/VBox/ostypes.h 2022-09-01 13:17:47.000000000 +0000 @@ -126,8 +126,10 @@ VBOXOSTYPE_NetBSD = 0x62000, VBOXOSTYPE_NetBSD_x64 = 0x62100, VBOXOSTYPE_Netware = 0x70000, - VBOXOSTYPE_Solaris = 0x80000, - VBOXOSTYPE_Solaris_x64 = 0x80100, + VBOXOSTYPE_Solaris = 0x80000, // Solaris 10U7 (5/09) and earlier + VBOXOSTYPE_Solaris_x64 = 0x80100, // Solaris 10U7 (5/09) and earlier + VBOXOSTYPE_Solaris10U8_or_later = 0x80001, + VBOXOSTYPE_Solaris10U8_or_later_x64 = 0x80101, VBOXOSTYPE_OpenSolaris = 0x81000, VBOXOSTYPE_OpenSolaris_x64 = 0x81100, VBOXOSTYPE_Solaris11_x64 = 0x82100, diff -Nru virtualbox-hwe-6.1.34-dfsg/include/VBox/settings.h virtualbox-hwe-6.1.38-dfsg/include/VBox/settings.h --- virtualbox-hwe-6.1.34-dfsg/include/VBox/settings.h 2022-03-22 23:34:43.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/include/VBox/settings.h 2022-09-01 13:17:47.000000000 +0000 @@ -544,7 +544,7 @@ struct RecordingScreenSettings { - RecordingScreenSettings(); + RecordingScreenSettings(uint32_t idScreen = UINT32_MAX); virtual ~RecordingScreenSettings(); @@ -554,17 +554,23 @@ bool isFeatureEnabled(RecordingFeature_T enmFeature) const; + static const char *getDefaultOptions(void); + bool operator==(const RecordingScreenSettings &d) const; + /** Screen ID. + * UINT32_MAX if not set. */ + uint32_t idScreen; /** Whether to record this screen or not. */ bool fEnabled; // requires settings version 1.14 (VirtualBox 4.3) /** Destination to record to. */ - RecordingDestination_T enmDest; /** @todo Implement with next settings version bump. */ + RecordingDestination_T enmDest; /** Which features are enable or not. */ RecordingFeatureMap featureMap; /** @todo Implement with next settings version bump. */ /** Maximum time (in s) to record. If set to 0, no time limit is set. */ uint32_t ulMaxTimeS; // requires settings version 1.14 (VirtualBox 4.3) - /** Options string for hidden / advanced / experimental features. */ + /** Options string for hidden / advanced / experimental features. + * Use RecordingScreenSettings::getDefaultOptions(). */ com::Utf8Str strOptions; // new since VirtualBox 5.2. /** @@ -621,16 +627,34 @@ : ulMaxSizeMB(0) { } /** Maximum size (in MB) the file is allowed to have. - * When reaching the limit, recording will stop. */ + * When reaching the limit, recording will stop. 0 means no limit. */ uint32_t ulMaxSizeMB; // requires settings version 1.14 (VirtualBox 4.3) - /** Absolute file name path to use for recording. */ + /** Absolute file name path to use for recording. + * When empty, this is considered as being the default setting. */ com::Utf8Str strName; // requires settings version 1.14 (VirtualBox 4.3) } File; }; /** Map for keeping settings per virtual screen. * The key specifies the screen ID. */ -typedef std::map RecordingScreenMap; +typedef std::map RecordingScreenSettingsMap; + +/** + * Common recording settings, shared among all per-screen recording settings. + */ +struct RecordingCommonSettings +{ + RecordingCommonSettings(); + + void applyDefaults(void); + + bool areDefaultSettings(void) const; + + bool operator==(const RecordingCommonSettings &d) const; + + /** Whether recording as a whole is enabled or disabled. */ + bool fEnabled; // requires settings version 1.14 (VirtualBox 4.3) +}; /** * NOTE: If you add any fields in here, you must update a) the constructor and b) @@ -645,13 +669,13 @@ bool areDefaultSettings(void) const; - bool operator==(const RecordingSettings &d) const; + bool operator==(const RecordingSettings &that) const; - /** Whether recording as a whole is enabled or disabled. */ - bool fEnabled; // requires settings version 1.14 (VirtualBox 4.3) + /** Common settings for all per-screen recording settings. */ + RecordingCommonSettings common; /** Map of handled recording screen settings. * The key specifies the screen ID. */ - RecordingScreenMap mapScreens; + RecordingScreenSettingsMap mapScreens; }; /** @@ -1145,7 +1169,6 @@ VRDESettings vrdeSettings; BIOSSettings biosSettings; - RecordingSettings recordingSettings; GraphicsAdapter graphicsAdapter; USB usbSettings; NetworkAdaptersList llNetworkAdapters; @@ -1220,19 +1243,20 @@ bool operator==(const Snapshot &s) const; - com::Guid uuid; - com::Utf8Str strName, - strDescription; // optional - RTTIMESPEC timestamp; + com::Guid uuid; + com::Utf8Str strName, + strDescription; // optional + RTTIMESPEC timestamp; - com::Utf8Str strStateFile; // for online snapshots only + com::Utf8Str strStateFile; // for online snapshots only - Hardware hardware; + Hardware hardware; - Debugging debugging; - Autostart autostart; + Debugging debugging; + Autostart autostart; + RecordingSettings recordingSettings; - SnapshotsList llChildSnapshots; + SnapshotsList llChildSnapshots; static const struct Snapshot Empty; }; @@ -1291,6 +1315,7 @@ MediaRegistry mediaRegistry; Debugging debugging; Autostart autostart; + RecordingSettings recordingSettings; StringsMap mapExtraDataItems; @@ -1338,6 +1363,7 @@ void readTeleporter(const xml::ElementNode *pElmTeleporter, MachineUserData *pUserData); void readDebugging(const xml::ElementNode *pElmDbg, Debugging *pDbg); void readAutostart(const xml::ElementNode *pElmAutostart, Autostart *pAutostart); + void readRecordingSettings(const xml::ElementNode &elmRecording, uint32_t cMonitors, RecordingSettings &recording); void readGroups(const xml::ElementNode *elmGroups, StringsList *pllGroups); bool readSnapshot(const com::Guid &curSnapshotUuid, uint32_t depth, const xml::ElementNode &elmSnapshot, Snapshot &snap); void convertOldOSType_pre1_5(com::Utf8Str &str); @@ -1351,6 +1377,7 @@ std::list *pllElementsWithUuidAttributes); void buildDebuggingXML(xml::ElementNode *pElmParent, const Debugging *pDbg); void buildAutostartXML(xml::ElementNode *pElmParent, const Autostart *pAutostart); + void buildRecordingXML(xml::ElementNode &elmParent, const RecordingSettings &recording); void buildGroupsXML(xml::ElementNode *pElmParent, const StringsList *pllGroups); void buildSnapshotXML(uint32_t depth, xml::ElementNode &elmParent, const Snapshot &snap); diff -Nru virtualbox-hwe-6.1.34-dfsg/include/VBox/sup.h virtualbox-hwe-6.1.38-dfsg/include/VBox/sup.h --- virtualbox-hwe-6.1.34-dfsg/include/VBox/sup.h 2022-03-22 23:34:43.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/include/VBox/sup.h 2022-09-01 13:17:47.000000000 +0000 @@ -2142,6 +2142,26 @@ */ SUPR0DECL(uint32_t) SUPR0GetKernelFeatures(void); +/** + * Notification from R0 VMM prior to loading the guest-FPU register state. + * + * @returns Whether the host-FPU register state has been saved by the host kernel. + * @param fCtxHook Whether thread-context hooks are enabled. + * + * @remarks Called with preemption disabled. + */ +SUPR0DECL(bool) SUPR0FpuBegin(bool fCtxHook); + +/** + * Notification from R0 VMM after saving the guest-FPU register state (and + * potentially restoring the host-FPU register state) in ring-0. + * + * @param fCtxHook Whether thread-context hooks are enabled. + * + * @remarks Called with preemption disabled. + */ +SUPR0DECL(void) SUPR0FpuEnd(bool fCtxHook); + /** @copydoc RTLogGetDefaultInstanceEx * @remarks To allow overriding RTLogGetDefaultInstanceEx locally. */ SUPR0DECL(struct RTLOGGER *) SUPR0GetDefaultLogInstanceEx(uint32_t fFlagsAndGroup); diff -Nru virtualbox-hwe-6.1.34-dfsg/include/VBox/VBoxGuest.h virtualbox-hwe-6.1.38-dfsg/include/VBox/VBoxGuest.h --- virtualbox-hwe-6.1.34-dfsg/include/VBox/VBoxGuest.h 2022-03-22 23:34:42.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/include/VBox/VBoxGuest.h 2022-09-01 13:17:45.000000000 +0000 @@ -125,7 +125,7 @@ #elif defined(RT_OS_SOLARIS) /* No automatic buffering, size limited to 255 bytes => use VBGLBIGREQ for everything. */ # include -# define VBGL_IOCTL_CODE_SIZE(Function, Size) _IOWRN('V', (Function), sizeof(VBGLREQHDR)) +# define VBGL_IOCTL_CODE_SIZE(Function, Size) ((uintptr_t)(_IOWRN('V', (Function), sizeof(VBGLREQHDR)))) # define VBGL_IOCTL_CODE_BIG(Function) _IOWRN('V', (Function), sizeof(VBGLREQHDR)) # define VBGL_IOCTL_CODE_FAST(Function) _IO( 'F', (Function)) # define VBGL_IOCTL_CODE_STRIPPED(a_uIOCtl) (a_uIOCtl) diff -Nru virtualbox-hwe-6.1.34-dfsg/include/VBox/vmm/pdmdrv.h virtualbox-hwe-6.1.38-dfsg/include/VBox/vmm/pdmdrv.h --- virtualbox-hwe-6.1.34-dfsg/include/VBox/vmm/pdmdrv.h 2022-03-22 23:34:45.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/include/VBox/vmm/pdmdrv.h 2022-09-01 13:17:48.000000000 +0000 @@ -1330,6 +1330,15 @@ */ DECLR3CALLBACKMEMBER(int, pfnSTAMDeregisterByPrefix,(PPDMDRVINS pDrvIns, const char *pszPrefix)); + /** + * Destroys a timer. + * + * @returns VBox status. + * @param pDrvIns Driver instance. + * @param hTimer The timer handle to destroy. + */ + DECLR3CALLBACKMEMBER(int, pfnTimerDestroy,(PPDMDRVINS pDrvIns, TMTIMERHANDLE hTimer)); + DECLR3CALLBACKMEMBER(void, pfnReserved2,(PPDMDRVINS pDrvIns)); DECLR3CALLBACKMEMBER(void, pfnReserved3,(PPDMDRVINS pDrvIns)); DECLR3CALLBACKMEMBER(void, pfnReserved4,(PPDMDRVINS pDrvIns)); @@ -1337,7 +1346,6 @@ DECLR3CALLBACKMEMBER(void, pfnReserved6,(PPDMDRVINS pDrvIns)); DECLR3CALLBACKMEMBER(void, pfnReserved7,(PPDMDRVINS pDrvIns)); DECLR3CALLBACKMEMBER(void, pfnReserved8,(PPDMDRVINS pDrvIns)); - DECLR3CALLBACKMEMBER(void, pfnReserved9,(PPDMDRVINS pDrvIns)); /** @} */ /** Just a safety precaution. */ @@ -1531,6 +1539,15 @@ } /** + * @copydoc PDMDRVHLPR3::pfnTimerDestroy + */ +DECLINLINE(int) PDMDrvHlpTimerDestroy(PPDMDRVINS pDrvIns, TMTIMERHANDLE hTimer) + +{ + return pDrvIns->pHlpR3->pfnTimerDestroy(pDrvIns, hTimer); +} + +/** * @copydoc PDMDRVHLPR3::pfnTimerSetMillies */ DECLINLINE(int) PDMDrvHlpTimerSetMillies(PPDMDRVINS pDrvIns, TMTIMERHANDLE hTimer, uint64_t cMilliesToNext) diff -Nru virtualbox-hwe-6.1.34-dfsg/include/VBox/vmm/pdmnetinline.h virtualbox-hwe-6.1.38-dfsg/include/VBox/vmm/pdmnetinline.h --- virtualbox-hwe-6.1.34-dfsg/include/VBox/vmm/pdmnetinline.h 2022-03-22 23:34:45.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/include/VBox/vmm/pdmnetinline.h 2022-09-01 13:17:48.000000000 +0000 @@ -149,6 +149,10 @@ if (RT_LIKELY(enmType != PDMNETWORKGSOTYPE_IPV4_UDP || pGso->cbMaxSeg >= RTNETUDP_MIN_LEN)) { /* likely */ } else return false; + /* Make sure the segment size is not zero. */ + if (RT_LIKELY(pGso->cbMaxSeg > 0)) + { /* likely */ } else return false; + return true; } diff -Nru virtualbox-hwe-6.1.34-dfsg/include/VBox/vusb.h virtualbox-hwe-6.1.38-dfsg/include/VBox/vusb.h --- virtualbox-hwe-6.1.34-dfsg/include/VBox/vusb.h 2022-03-22 23:34:46.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/include/VBox/vusb.h 2022-09-01 13:17:49.000000000 +0000 @@ -563,6 +563,52 @@ typedef struct VUSBURB *PVUSBURB; +/** + * VUSB device reset completion callback function. + * This is called by the reset thread when the reset has been completed. + * + * @param pDevice Pointer to the virtual USB device core. + * @param uPort The port of the device which completed the reset. + * @param rc The VBox status code of the reset operation. + * @param pvUser User specific argument. + * + * @thread The reset thread or EMT. + */ +typedef DECLCALLBACKTYPE(void, FNVUSBRESETDONE,(PVUSBIDEVICE pDevice, uint32_t uPort, int rc, void *pvUser)); +/** Pointer to a device reset completion callback function (FNUSBRESETDONE). */ +typedef FNVUSBRESETDONE *PFNVUSBRESETDONE; + + +/** + * The state of a VUSB Device. + * + * @remark The order of these states is vital. + */ +typedef enum VUSBDEVICESTATE +{ + VUSB_DEVICE_STATE_INVALID = 0, + VUSB_DEVICE_STATE_DETACHED, + VUSB_DEVICE_STATE_ATTACHED, + VUSB_DEVICE_STATE_POWERED, + VUSB_DEVICE_STATE_DEFAULT, + VUSB_DEVICE_STATE_ADDRESS, + VUSB_DEVICE_STATE_CONFIGURED, + VUSB_DEVICE_STATE_SUSPENDED, + /** The device is being reset. Don't mess with it. + * Next states: VUSB_DEVICE_STATE_DEFAULT, VUSB_DEVICE_STATE_DESTROYED + */ + VUSB_DEVICE_STATE_RESET, + /** The device has been destroyed. */ + VUSB_DEVICE_STATE_DESTROYED, + /** The usual 32-bit hack. */ + VUSB_DEVICE_STATE_32BIT_HACK = 0x7fffffff +} VUSBDEVICESTATE; + + +/** Maximum number of USB devices supported. */ +#define VUSB_DEVICES_MAX 128 +/** An invalid device port. */ +#define VUSB_DEVICE_PORT_INVALID UINT32_MAX /** * VBox USB port bitmap. @@ -572,10 +618,11 @@ typedef struct VUSBPORTBITMAP { /** 128 bits */ - char ach[16]; + char ach[VUSB_DEVICES_MAX / 8]; } VUSBPORTBITMAP; /** Pointer to a VBox USB port bitmap. */ typedef VUSBPORTBITMAP *PVUSBPORTBITMAP; +AssertCompile(sizeof(VUSBPORTBITMAP) * 8 >= VUSB_DEVICES_MAX); #ifndef RDESKTOP @@ -606,26 +653,25 @@ * A device is being attached to a port in the roothub. * * @param pInterface Pointer to this structure. - * @param pDev Pointer to the device being attached. * @param uPort The port number assigned to the device. + * @param enmSpeed The speed of the device being attached. */ - DECLR3CALLBACKMEMBER(int, pfnAttach,(PVUSBIROOTHUBPORT pInterface, PVUSBIDEVICE pDev, unsigned uPort)); + DECLR3CALLBACKMEMBER(int, pfnAttach,(PVUSBIROOTHUBPORT pInterface, uint32_t uPort, VUSBSPEED enmSpeed)); /** * A device is being detached from a port in the roothub. * * @param pInterface Pointer to this structure. - * @param pDev Pointer to the device being detached. * @param uPort The port number assigned to the device. */ - DECLR3CALLBACKMEMBER(void, pfnDetach,(PVUSBIROOTHUBPORT pInterface, PVUSBIDEVICE pDev, unsigned uPort)); + DECLR3CALLBACKMEMBER(void, pfnDetach,(PVUSBIROOTHUBPORT pInterface, uint32_t uPort)); /** * Reset the root hub. * * @returns VBox status code. * @param pInterface Pointer to this structure. - * @param pResetOnLinux Whether or not to do real reset on linux. + * @param fResetOnLinux Whether or not to do real reset on linux. */ DECLR3CALLBACKMEMBER(int, pfnReset,(PVUSBIROOTHUBPORT pInterface, bool fResetOnLinux)); @@ -638,7 +684,7 @@ * @param pInterface Pointer to this structure. * @param pUrb Pointer to the URB in question. */ - DECLR3CALLBACKMEMBER(void, pfnXferCompletion,(PVUSBIROOTHUBPORT pInterface, PVUSBURB urb)); + DECLR3CALLBACKMEMBER(void, pfnXferCompletion,(PVUSBIROOTHUBPORT pInterface, PVUSBURB pUrb)); /** * Handle transfer errors. @@ -676,7 +722,7 @@ } VUSBIROOTHUBPORT; /** VUSBIROOTHUBPORT interface ID. */ -# define VUSBIROOTHUBPORT_IID "6571aece-6c33-4714-a8ac-9508a3b8b429" +# define VUSBIROOTHUBPORT_IID "2ece01c2-4dbf-4bd5-96ca-09fc14164cd4" /** Pointer to a VUSB RootHub connector interface. */ typedef struct VUSBIROOTHUBCONNECTOR *PVUSBIROOTHUBCONNECTOR; @@ -703,6 +749,31 @@ DECLR3CALLBACKMEMBER(int, pfnSetUrbParams, (PVUSBIROOTHUBCONNECTOR pInterface, size_t cbHci, size_t cbHciTd)); /** + * Resets the roothub. + * + * @returns VBox status code. + * @param pInterface Pointer to this struct. + * @param fResetOnLinux Whether or not to do real reset on linux. + */ + DECLR3CALLBACKMEMBER(int, pfnReset, (PVUSBIROOTHUBCONNECTOR pInterface, bool fResetOnLinux)); + + /** + * Powers on the roothub. + * + * @returns VBox status code. + * @param pInterface Pointer to this struct. + */ + DECLR3CALLBACKMEMBER(int, pfnPowerOn, (PVUSBIROOTHUBCONNECTOR pInterface)); + + /** + * Power off the roothub. + * + * @returns VBox status code. + * @param pInterface Pointer to this struct. + */ + DECLR3CALLBACKMEMBER(int, pfnPowerOff, (PVUSBIROOTHUBCONNECTOR pInterface)); + + /** * Allocates a new URB for a transfer. * * Either submit using pfnSubmitUrb or free using VUSBUrbFree(). @@ -713,7 +784,7 @@ * at submit time, since that makes the usage of this api simpler. * @param pInterface Pointer to this struct. * @param DstAddress The destination address of the URB. - * @param pDev Optional device pointer the URB is for. + * @param uPort Optional port of the device the URB is for, use VUSB_DEVICE_PORT_INVALID to indicate to use the destination address. * @param enmType Type of the URB. * @param enmDir Data transfer direction. * @param cbData The amount of data space required. @@ -724,7 +795,7 @@ * @note pDev should be NULL in most cases. The only useful case is for USB3 where * it is required for the SET_ADDRESS request because USB3 uses unicast traffic. */ - DECLR3CALLBACKMEMBER(PVUSBURB, pfnNewUrb,(PVUSBIROOTHUBCONNECTOR pInterface, uint8_t DstAddress, PVUSBIDEVICE pDev, + DECLR3CALLBACKMEMBER(PVUSBURB, pfnNewUrb,(PVUSBIROOTHUBCONNECTOR pInterface, uint8_t DstAddress, uint32_t uPort, VUSBXFERTYPE enmType, VUSBDIRECTION enmDir, uint32_t cbData, uint32_t cTds, const char *pszTag)); /** @@ -760,10 +831,10 @@ * @returns Other VBox status code. * * @param pInterface Pointer to this struct. - * @param pDevice Pointer to a USB device. + * @param uPort Port of the device to reap URBs on. * @param cMillies Number of milliseconds to poll for completion. */ - DECLR3CALLBACKMEMBER(void, pfnReapAsyncUrbs,(PVUSBIROOTHUBCONNECTOR pInterface, PVUSBIDEVICE pDevice, RTMSINTERVAL cMillies)); + DECLR3CALLBACKMEMBER(void, pfnReapAsyncUrbs,(PVUSBIROOTHUBCONNECTOR pInterface, uint32_t uPort, RTMSINTERVAL cMillies)); /** * Cancels and completes - with CRC failure - all URBs queued on an endpoint. @@ -789,11 +860,11 @@ * * @returns VBox status code. * @param pInterface Pointer to this struct. - * @param pDevice Pointer to a USB device. + * @param uPort Port of the device. * @param EndPt Endpoint number. * @param enmDir Endpoint direction. */ - DECLR3CALLBACKMEMBER(int, pfnAbortEp,(PVUSBIROOTHUBCONNECTOR pInterface, PVUSBIDEVICE pDevice, int EndPt, VUSBDIRECTION enmDir)); + DECLR3CALLBACKMEMBER(int, pfnAbortEp,(PVUSBIROOTHUBCONNECTOR pInterface, uint32_t uPort, int EndPt, VUSBDIRECTION enmDir)); /** * Attach the device to the root hub. @@ -801,9 +872,9 @@ * * @returns VBox status code. * @param pInterface Pointer to this struct. - * @param pDevice Pointer to the device (interface) to attach. + * @param uPort Port of the device to attach. */ - DECLR3CALLBACKMEMBER(int, pfnAttachDevice,(PVUSBIROOTHUBCONNECTOR pInterface, PVUSBIDEVICE pDevice)); + DECLR3CALLBACKMEMBER(int, pfnAttachDevice,(PVUSBIROOTHUBCONNECTOR pInterface, uint32_t uPort)); /** * Detach the device from the root hub. @@ -811,9 +882,9 @@ * * @returns VBox status code. * @param pInterface Pointer to this struct. - * @param pDevice Pointer to the device (interface) to detach. + * @param uPort Port of the device to detach. */ - DECLR3CALLBACKMEMBER(int, pfnDetachDevice,(PVUSBIROOTHUBCONNECTOR pInterface, PVUSBIDEVICE pDevice)); + DECLR3CALLBACKMEMBER(int, pfnDetachDevice,(PVUSBIROOTHUBCONNECTOR pInterface, uint32_t uPort)); /** * Sets periodic frame processing. @@ -842,17 +913,90 @@ * @returns Delta between currently and previously scheduled frame. * @retval 0 if no previous frame was set. * @param pInterface Pointer to this struct. - * @param pDevice Pointer to a USB device. + * @param uPort Port of the device. * @param EndPt Endpoint number. * @param enmDir Endpoint direction. * @param uNewFrameID The frame ID of a new transfer. * @param uBits The number of significant bits in frame ID. */ - DECLR3CALLBACKMEMBER(uint32_t, pfnUpdateIsocFrameDelta, (PVUSBIROOTHUBCONNECTOR pInterface, PVUSBIDEVICE pDevice, + DECLR3CALLBACKMEMBER(uint32_t, pfnUpdateIsocFrameDelta, (PVUSBIROOTHUBCONNECTOR pInterface, uint32_t uPort, int EndPt, VUSBDIRECTION enmDir, uint16_t uNewFrameID, uint8_t uBits)); - /** Alignment dummy. */ - RTR3PTR Alignment; + /** + * Resets the device. + * + * Since a device reset shall take at least 10ms from the guest point of view, + * it must be performed asynchronously. We create a thread which performs this + * operation and ensures it will take at least 10ms. + * + * At times - like init - a synchronous reset is required, this can be done + * by passing NULL for pfnDone. + * + * -- internal stuff, move it -- + * While the device is being reset it is in the VUSB_DEVICE_STATE_RESET state. + * On completion it will be in the VUSB_DEVICE_STATE_DEFAULT state if successful, + * or in the VUSB_DEVICE_STATE_DETACHED state if the rest failed. + * -- internal stuff, move it -- + * + * @returns VBox status code. + * @param pInterface Pointer to this struct. + * @param uPort Port of the device to reset. + * @param fResetOnLinux Set if we can permit a real reset and a potential logical + * device reconnect on linux hosts. + * @param pfnDone Pointer to the completion routine. If NULL a synchronous + * reset is performed not respecting the 10ms. + * @param pvUser User argument to the completion routine. + * @param pVM The cross context VM structure. Required if pfnDone + * is not NULL. + */ + DECLR3CALLBACKMEMBER(int, pfnDevReset,(PVUSBIROOTHUBCONNECTOR pInterface, uint32_t uPort, bool fResetOnLinux, + PFNVUSBRESETDONE pfnDone, void *pvUser, PVM pVM)); + + /** + * Powers on the device. + * + * @returns VBox status code. + * @param pInterface Pointer to this struct. + * @param uPort Port of the device to power on. + */ + DECLR3CALLBACKMEMBER(int, pfnDevPowerOn,(PVUSBIROOTHUBCONNECTOR pInterface, uint32_t uPort)); + + /** + * Powers off the device. + * + * @returns VBox status code. + * @param pInterface Pointer to this struct. + * @param uPort Port of the device to power off. + */ + DECLR3CALLBACKMEMBER(int, pfnDevPowerOff,(PVUSBIROOTHUBCONNECTOR pInterface, uint32_t uPort)); + + /** + * Get the state of the device. + * + * @returns Device state. + * @param pInterface Pointer to this struct. + * @param uPort Port of the device to get the state for. + */ + DECLR3CALLBACKMEMBER(VUSBDEVICESTATE, pfnDevGetState,(PVUSBIROOTHUBCONNECTOR pInterface, uint32_t uPort)); + + /** + * Returns whether the device implements the saved state handlers + * and doesn't need to get detached. + * + * @returns true if the device supports saving the state, false otherwise. + * @param pInterface Pointer to this struct. + * @param uPort Port of the device to query saved state support for. + */ + DECLR3CALLBACKMEMBER(bool, pfnDevIsSavedStateSupported,(PVUSBIROOTHUBCONNECTOR pInterface, uint32_t uPort)); + + /** + * Get the speed the device is operating at. + * + * @returns Device state. + * @param pInterface Pointer to this struct. + * @param uPort Port of the device to query the speed for. + */ + DECLR3CALLBACKMEMBER(VUSBSPEED, pfnDevGetSpeed,(PVUSBIROOTHUBCONNECTOR pInterface, uint32_t uPort)); } VUSBIROOTHUBCONNECTOR; AssertCompileSizeAlignment(VUSBIROOTHUBCONNECTOR, 8); @@ -868,10 +1012,10 @@ } /** @copydoc VUSBIROOTHUBCONNECTOR::pfnNewUrb */ -DECLINLINE(PVUSBURB) VUSBIRhNewUrb(PVUSBIROOTHUBCONNECTOR pInterface, uint8_t DstAddress, PVUSBIDEVICE pDev, +DECLINLINE(PVUSBURB) VUSBIRhNewUrb(PVUSBIROOTHUBCONNECTOR pInterface, uint8_t DstAddress, uint32_t uPort, VUSBXFERTYPE enmType, VUSBDIRECTION enmDir, uint32_t cbData, uint32_t cTds, const char *pszTag) { - return pInterface->pfnNewUrb(pInterface, DstAddress, pDev, enmType, enmDir, cbData, cTds, pszTag); + return pInterface->pfnNewUrb(pInterface, DstAddress, uPort, enmType, enmDir, cbData, cTds, pszTag); } /** @copydoc VUSBIROOTHUBCONNECTOR::pfnFreeUrb */ @@ -887,9 +1031,9 @@ } /** @copydoc VUSBIROOTHUBCONNECTOR::pfnReapAsyncUrbs */ -DECLINLINE(void) VUSBIRhReapAsyncUrbs(PVUSBIROOTHUBCONNECTOR pInterface, PVUSBIDEVICE pDevice, RTMSINTERVAL cMillies) +DECLINLINE(void) VUSBIRhReapAsyncUrbs(PVUSBIROOTHUBCONNECTOR pInterface, uint32_t uPort, RTMSINTERVAL cMillies) { - pInterface->pfnReapAsyncUrbs(pInterface, pDevice, cMillies); + pInterface->pfnReapAsyncUrbs(pInterface, uPort, cMillies); } /** @copydoc VUSBIROOTHUBCONNECTOR::pfnCancelAllUrbs */ @@ -899,15 +1043,15 @@ } /** @copydoc VUSBIROOTHUBCONNECTOR::pfnAttachDevice */ -DECLINLINE(int) VUSBIRhAttachDevice(PVUSBIROOTHUBCONNECTOR pInterface, PVUSBIDEVICE pDevice) +DECLINLINE(int) VUSBIRhAttachDevice(PVUSBIROOTHUBCONNECTOR pInterface, uint32_t uPort) { - return pInterface->pfnAttachDevice(pInterface, pDevice); + return pInterface->pfnAttachDevice(pInterface, uPort); } /** @copydoc VUSBIROOTHUBCONNECTOR::pfnDetachDevice */ -DECLINLINE(int) VUSBIRhDetachDevice(PVUSBIROOTHUBCONNECTOR pInterface, PVUSBIDEVICE pDevice) +DECLINLINE(int) VUSBIRhDetachDevice(PVUSBIROOTHUBCONNECTOR pInterface, uint32_t uPort) { - return pInterface->pfnDetachDevice(pInterface, pDevice); + return pInterface->pfnDetachDevice(pInterface, uPort); } /** @copydoc VUSBIROOTHUBCONNECTOR::pfnSetPeriodicFrameProcessing */ @@ -921,49 +1065,47 @@ { return pInterface->pfnGetPeriodicFrameRate(pInterface); } -# endif /* IN_RING3 */ -#endif /* ! RDESKTOP */ +/** @copydoc VUSBIROOTHUBCONNECTOR::pfnDevReset */ +DECLINLINE(int) VUSBIRhDevReset(PVUSBIROOTHUBCONNECTOR pInterface, uint32_t uPort, bool fResetOnLinux, + PFNVUSBRESETDONE pfnDone, void *pvUser, PVM pVM) +{ + return pInterface->pfnDevReset(pInterface, uPort, fResetOnLinux, pfnDone, pvUser, pVM); +} +/** @copydoc VUSBIROOTHUBCONNECTOR::pfnDevPowerOn */ +DECLINLINE(int) VUSBIRhDevPowerOn(PVUSBIROOTHUBCONNECTOR pInterface, uint32_t uPort) +{ + return pInterface->pfnDevPowerOn(pInterface, uPort); +} -/** - * VUSB device reset completion callback function. - * This is called by the reset thread when the reset has been completed. - * - * @param pDev Pointer to the virtual USB device core. - * @param rc The VBox status code of the reset operation. - * @param pvUser User specific argument. - * - * @thread The reset thread or EMT. - */ -typedef DECLCALLBACK(void) FNVUSBRESETDONE(PVUSBIDEVICE pDevice, int rc, void *pvUser); -/** Pointer to a device reset completion callback function (FNUSBRESETDONE). */ -typedef FNVUSBRESETDONE *PFNVUSBRESETDONE; +/** @copydoc VUSBIROOTHUBCONNECTOR::pfnDevPowerOff */ +DECLINLINE(int) VUSBIRhDevPowerOff(PVUSBIROOTHUBCONNECTOR pInterface, uint32_t uPort) +{ + return pInterface->pfnDevPowerOff(pInterface, uPort); +} -/** - * The state of a VUSB Device. - * - * @remark The order of these states is vital. - */ -typedef enum VUSBDEVICESTATE +/** @copydoc VUSBIROOTHUBCONNECTOR::pfnDevGetState */ +DECLINLINE(VUSBDEVICESTATE) VUSBIRhDevGetState(PVUSBIROOTHUBCONNECTOR pInterface, uint32_t uPort) { - VUSB_DEVICE_STATE_INVALID = 0, - VUSB_DEVICE_STATE_DETACHED, - VUSB_DEVICE_STATE_ATTACHED, - VUSB_DEVICE_STATE_POWERED, - VUSB_DEVICE_STATE_DEFAULT, - VUSB_DEVICE_STATE_ADDRESS, - VUSB_DEVICE_STATE_CONFIGURED, - VUSB_DEVICE_STATE_SUSPENDED, - /** The device is being reset. Don't mess with it. - * Next states: VUSB_DEVICE_STATE_DEFAULT, VUSB_DEVICE_STATE_DESTROYED - */ - VUSB_DEVICE_STATE_RESET, - /** The device has been destroyed. */ - VUSB_DEVICE_STATE_DESTROYED, - /** The usual 32-bit hack. */ - VUSB_DEVICE_STATE_32BIT_HACK = 0x7fffffff -} VUSBDEVICESTATE; + return pInterface->pfnDevGetState(pInterface, uPort); +} + +/** @copydoc VUSBIROOTHUBCONNECTOR::pfnDevGetState */ +DECLINLINE(bool) VUSBIRhDevIsSavedStateSupported(PVUSBIROOTHUBCONNECTOR pInterface, uint32_t uPort) +{ + return pInterface->pfnDevIsSavedStateSupported(pInterface, uPort); +} + +/** @copydoc VUSBIROOTHUBCONNECTOR::pfnDevGetSpeed */ +DECLINLINE(VUSBSPEED) VUSBIRhDevGetSpeed(PVUSBIROOTHUBCONNECTOR pInterface, uint32_t uPort) +{ + return pInterface->pfnDevGetSpeed(pInterface, uPort); +} +# endif /* IN_RING3 */ + +#endif /* ! RDESKTOP */ + #ifndef RDESKTOP diff -Nru virtualbox-hwe-6.1.34-dfsg/src/libs/Makefile.kmk virtualbox-hwe-6.1.38-dfsg/src/libs/Makefile.kmk --- virtualbox-hwe-6.1.34-dfsg/src/libs/Makefile.kmk 2022-03-22 23:46:16.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/src/libs/Makefile.kmk 2022-09-01 13:29:42.000000000 +0000 @@ -55,9 +55,9 @@ # OpenSSL. if !defined(VBOX_ONLY_SDK) \ && (!defined(VBOX_ONLY_ADDITIONS) || !defined(VBOX_ONLY_ADDITIONS_WITHOUT_RTISOMAKER)) \ - && (!defined(VBOX_ONLY_EXTPACKS) || defined(VBOX_NEED_EXTPACK_OPENSSL) || !defined(VBOX_ONLY_EXTPACKS_USE_IMPLIBS)) \ + && (!defined(VBOX_ONLY_EXTPACKS) || defined(VBOX_NEED_EXTPACK_OPENSSL) || defined(VBOX_WITH_BLD_RTSIGNTOOL_SIGNING) || !defined(VBOX_ONLY_EXTPACKS_USE_IMPLIBS)) \ && ("$(SDK_VBOX_OPENSSL_INCS)" == "$(SDK_VBOX_OPENSSL_VBOX_DEFAULT_INCS)" || defined(VBOX_NEED_EXTPACK_OPENSSL)) - include $(PATH_SUB_CURRENT)/openssl-1.1.1l/Makefile.kmk + include $(PATH_SUB_CURRENT)/openssl-1.1.1q/Makefile.kmk endif # libjpeg for VRDP video redirection and ExtPack's DrvHostWebcam diff -Nru virtualbox-hwe-6.1.34-dfsg/src/libs/xpcom18a4/python/gen_python_deps.py virtualbox-hwe-6.1.38-dfsg/src/libs/xpcom18a4/python/gen_python_deps.py --- virtualbox-hwe-6.1.34-dfsg/src/libs/xpcom18a4/python/gen_python_deps.py 2022-03-22 23:47:49.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/src/libs/xpcom18a4/python/gen_python_deps.py 2022-09-01 13:31:15.000000000 +0000 @@ -1,7 +1,7 @@ #!/usr/bin/python """ -Copyright (C) 2009-2016 Oracle Corporation +Copyright (C) 2009-2021 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,7 +16,7 @@ import os,sys from distutils.version import StrictVersion -versions = ["2.6", "2.7", "3.1", "3.2", "3.2m", "3.3", "3.3m", "3.4", "3.4m", "3.5", "3.5m", "3.6", "3.6m", "3.7", "3.7m", "3.8", "3.8m", "3.9", "3.9m" ] +versions = ["2.6", "2.7", "3.1", "3.2", "3.2m", "3.3", "3.3m", "3.4", "3.4m", "3.5", "3.5m", "3.6", "3.6m", "3.7", "3.7m", "3.8", "3.8m", "3.9", "3.9m", "3.10", "3.10m" ] prefixes = ["/usr", "/usr/local", "/opt", "/opt/local"] known = {} diff -Nru virtualbox-hwe-6.1.34-dfsg/src/libs/xpcom18a4/python/Makefile.kmk virtualbox-hwe-6.1.38-dfsg/src/libs/xpcom18a4/python/Makefile.kmk --- virtualbox-hwe-6.1.34-dfsg/src/libs/xpcom18a4/python/Makefile.kmk 2022-03-22 23:47:48.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/src/libs/xpcom18a4/python/Makefile.kmk 2022-09-01 13:31:15.000000000 +0000 @@ -4,7 +4,7 @@ # # -# Copyright (C) 2009-2017 Oracle Corporation +# Copyright (C) 2009-2021 Oracle Corporation # # This file is part of VirtualBox Open Source Edition (OSE), as # available from http://www.virtualbox.org. This file is free software; @@ -26,7 +26,7 @@ # # List of supported Python versions, defining a number of -# VBOX_PYTHON[26|27|31|32|32M|33|33M|34|34M|35|35M|36|36M|37|37M|38|38M|39|39M|DEF]_[INC|LIB] variables +# VBOX_PYTHON[26|27|31|32|32M|33|33M|34|34M|35|35M|36|36M|37|37M|38|38M|39|39M|310|310M|DEF]_[INC|LIB] variables # which get picked up below. # ifeq ($(KBUILD_TARGET),darwin) # Relatively predictable, don't script. @@ -579,6 +579,52 @@ endif endif +ifdef VBOX_PYTHON310_INC +# +# Python 3.10 version +# +DLLS += VBoxPython3_10 +VBoxPython3_10_EXTENDS = VBoxPythonBase +VBoxPython3_10_EXTENDS_BY = appending +VBoxPython3_10_TEMPLATE = XPCOM +VBoxPython3_10_INCS = $(VBOX_PYTHON310_INC) +VBoxPython3_10_LIBS = $(VBOX_PYTHON310_LIB) + + ifdef VBOX_WITH_32_ON_64_MAIN_API + ifdef VBOX_PYTHON310_LIB_X86 +DLLS += VBoxPython3_10_x86 +VBoxPython3_10_x86_EXTENDS = VBoxPythonBase_x86 +VBoxPython3_10_x86_EXTENDS_BY = appending +VBoxPython3_10_x86_TEMPLATE = XPCOM +VBoxPython3_10_x86_INCS = $(VBOX_PYTHON310_INC) +VBoxPython3_10_x86_LIBS = $(VBOX_PYTHON310_LIB_X86) + endif + endif +endif + +ifdef VBOX_PYTHON310M_INC +# +# Python 3.10 version with pymalloc +# +DLLS += VBoxPython3_10m +VBoxPython3_10m_EXTENDS = VBoxPythonBase_m +VBoxPython3_10m_EXTENDS_BY = appending +VBoxPython3_10m_TEMPLATE = XPCOM +VBoxPython3_10m_INCS = $(VBOX_PYTHON310M_INC) +VBoxPython3_10m_LIBS = $(VBOX_PYTHON310M_LIB) + + ifdef VBOX_WITH_32_ON_64_MAIN_API + ifdef VBOX_PYTHON310M_LIB_X86 +DLLS += VBoxPython3_10m_x86 +VBoxPython3_10m_x86_EXTENDS = VBoxPythonBase_x86_m +VBoxPython3_10m_x86_EXTENDS_BY = appending +VBoxPython3_10m_x86_TEMPLATE_ = XPCOM +VBoxPython3_10m_x86_INCS = $(VBOX_PYTHON310M_INC) +VBoxPython3_10m_x86_LIBS = $(VBOX_PYTHON310M_LIB_X86) + endif + endif +endif + ifdef VBOX_PYTHONDEF_INC # # Python without versioning @@ -634,4 +680,3 @@ include $(FILE_KBUILD_SUB_FOOTER) - diff -Nru virtualbox-hwe-6.1.34-dfsg/src/libs/xpcom18a4/python/src/module/_xpcom.cpp virtualbox-hwe-6.1.38-dfsg/src/libs/xpcom18a4/python/src/module/_xpcom.cpp --- virtualbox-hwe-6.1.34-dfsg/src/libs/xpcom18a4/python/src/module/_xpcom.cpp 2022-03-22 23:47:49.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/src/libs/xpcom18a4/python/src/module/_xpcom.cpp 2022-09-01 13:31:16.000000000 +0000 @@ -84,7 +84,11 @@ # define MANGLE_MODULE_INIT(a_Name) RT_CONCAT(a_Name, MODULE_NAME_SUFFIX) # endif # ifdef VBOX_PYXPCOM_VERSIONED -# if PY_VERSION_HEX >= 0x03090000 && PY_VERSION_HEX < 0x030a0000 +# if PY_VERSION_HEX >= 0x030a0000 && PY_VERSION_HEX < 0x030b0000 +# define MODULE_NAME MANGLE_MODULE_NAME("VBoxPython3_10") +# define initVBoxPython MANGLE_MODULE_INIT(PyInit_VBoxPython3_10) + +# elif PY_VERSION_HEX >= 0x03090000 && PY_VERSION_HEX < 0x030a0000 # define MODULE_NAME MANGLE_MODULE_NAME("VBoxPython3_9") # define initVBoxPython MANGLE_MODULE_INIT(PyInit_VBoxPython3_9) diff -Nru virtualbox-hwe-6.1.34-dfsg/src/libs/xpcom18a4/python/src/PyXPCOM.h virtualbox-hwe-6.1.38-dfsg/src/libs/xpcom18a4/python/src/PyXPCOM.h --- virtualbox-hwe-6.1.34-dfsg/src/libs/xpcom18a4/python/src/PyXPCOM.h 2022-03-22 23:47:49.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/src/libs/xpcom18a4/python/src/PyXPCOM.h 2022-09-01 13:31:15.000000000 +0000 @@ -137,11 +137,13 @@ # define PyInt_Check(o) PyLong_Check(o) # define PyInt_AsLong(o) PyLong_AsLong(o) # define PyNumber_Int(o) PyNumber_Long(o) -# ifndef PyUnicode_AsUTF8 -# define PyUnicode_AsUTF8(o) _PyUnicode_AsString(o) -# endif -# ifndef PyUnicode_AsUTF8AndSize -# define PyUnicode_AsUTF8AndSize(o,s) _PyUnicode_AsStringAndSize(o,s) +# if PY_VERSION_HEX <= 0x03030000 /* 3.3 added PyUnicode_AsUTF8AndSize */ +# ifndef PyUnicode_AsUTF8 +# define PyUnicode_AsUTF8(o) _PyUnicode_AsString(o) +# endif +# ifndef PyUnicode_AsUTF8AndSize +# define PyUnicode_AsUTF8AndSize(o,s) _PyUnicode_AsStringAndSize(o,s) +# endif # endif typedef struct PyMethodChain { diff -Nru virtualbox-hwe-6.1.34-dfsg/src/libs/xpcom18a4/python/src/VariantUtils.cpp virtualbox-hwe-6.1.38-dfsg/src/libs/xpcom18a4/python/src/VariantUtils.cpp --- virtualbox-hwe-6.1.34-dfsg/src/libs/xpcom18a4/python/src/VariantUtils.cpp 2022-03-22 23:47:49.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/src/libs/xpcom18a4/python/src/VariantUtils.cpp 2022-09-01 13:31:16.000000000 +0000 @@ -628,7 +628,7 @@ #if PY_MAJOR_VERSION <= 2 return PyString_FromStringAndSize( (char *)array_ptr, sequence_size ); #else - return PyUnicode_FromStringAndSize( (char *)array_ptr, sequence_size ); + return PyBytes_FromStringAndSize( (char *)array_ptr, sequence_size ); #endif PRUint32 array_element_size = GetArrayElementSize(array_type); diff -Nru virtualbox-hwe-6.1.34-dfsg/src/VBox/Additions/common/VBoxGuest/linux/Makefile virtualbox-hwe-6.1.38-dfsg/src/VBox/Additions/common/VBoxGuest/linux/Makefile --- virtualbox-hwe-6.1.34-dfsg/src/VBox/Additions/common/VBoxGuest/linux/Makefile 2022-03-22 23:37:48.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/src/VBox/Additions/common/VBoxGuest/linux/Makefile 2022-09-01 13:20:47.000000000 +0000 @@ -124,11 +124,11 @@ generic/mppresent-generic.o \ VBox/log-vbox.o \ VBox/logbackdoor.o - ifeq ($(BUILD_TARGET_ARCH),amd64) + ifeq ($(VBOX_KBUILD_TARGET_ARCH),amd64) VBOXMOD_OBJS += common/alloc/heapsimple.o endif endif # VBOX_WITHOUT_COMBINED_SOURCES -ifeq ($(BUILD_TARGET_ARCH),x86) +ifeq ($(VBOX_KBUILD_TARGET_ARCH),x86) VBOXMOD_OBJS += \ common/math/gcc/divdi3.o \ common/math/gcc/divmoddi4.o \ @@ -150,7 +150,7 @@ RT_WITH_VBOX \ VBGL_VBOXGUEST \ VBOX_WITH_HGCM -ifeq ($(BUILD_TARGET_ARCH),amd64) +ifeq ($(VBOX_KBUILD_TARGET_ARCH),amd64) VBOXMOD_DEFS += VBOX_WITH_64_BITS_GUESTS endif ifeq ($(KERN_VERSION),24) diff -Nru virtualbox-hwe-6.1.34-dfsg/src/VBox/Additions/common/VBoxGuest/VBoxGuest-win.cpp virtualbox-hwe-6.1.38-dfsg/src/VBox/Additions/common/VBoxGuest/VBoxGuest-win.cpp --- virtualbox-hwe-6.1.34-dfsg/src/VBox/Additions/common/VBoxGuest/VBoxGuest-win.cpp 2022-03-22 23:37:46.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/src/VBox/Additions/common/VBoxGuest/VBoxGuest-win.cpp 2022-09-01 13:20:45.000000000 +0000 @@ -1485,7 +1485,7 @@ rc = vgdrvNtSetupDevice(pDevExt, pDeviceObject, NULL /*pIrp*/, pDrvObj, pRegPath); if (NT_SUCCESS(rc)) { - Log(("vgdrvNt4CreateDevice: Returning rc = 0x%x (succcess)\n", rc)); + Log(("vgdrvNt4CreateDevice: Returning rc = 0x%x (success)\n", rc)); return rc; } diff -Nru virtualbox-hwe-6.1.34-dfsg/src/VBox/Additions/common/VBoxService/VBoxServiceControlProcess.cpp virtualbox-hwe-6.1.38-dfsg/src/VBox/Additions/common/VBoxService/VBoxServiceControlProcess.cpp --- virtualbox-hwe-6.1.34-dfsg/src/VBox/Additions/common/VBoxService/VBoxServiceControlProcess.cpp 2022-03-22 23:37:49.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/src/VBox/Additions/common/VBoxService/VBoxServiceControlProcess.cpp 2022-09-01 13:20:47.000000000 +0000 @@ -33,6 +33,7 @@ #include #include #include +#include #include #include @@ -1289,13 +1290,7 @@ * On Windows Vista (and up) sysprep is located in "system32\\Sysprep\\sysprep.exe", * so detect the OS and use a different path. */ - OSVERSIONINFOEX OSInfoEx; - RT_ZERO(OSInfoEx); - OSInfoEx.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX); - BOOL fRet = GetVersionEx((LPOSVERSIONINFO) &OSInfoEx); - if ( fRet - && OSInfoEx.dwPlatformId == VER_PLATFORM_WIN32_NT - && OSInfoEx.dwMajorVersion >= 6 /* Vista or later */) + if (RTSystemGetNtVersion() >= RTSYSTEM_MAKE_NT_VERSION(6,0,0) /* Vista and later */) { rc = RTEnvGetEx(RTENV_DEFAULT, "windir", szSysprepCmd, sizeof(szSysprepCmd), NULL); #ifndef RT_ARCH_AMD64 @@ -1318,8 +1313,6 @@ if (RT_FAILURE(rc)) VGSvcError("Failed to detect sysrep location, rc=%Rrc\n", rc); } - else if (!fRet) - VGSvcError("Failed to retrieve OS information, last error=%ld\n", GetLastError()); VGSvcVerbose(3, "Sysprep executable is: %s\n", szSysprepCmd); diff -Nru virtualbox-hwe-6.1.34-dfsg/src/VBox/Additions/common/VBoxService/VBoxServiceControlSession.cpp virtualbox-hwe-6.1.38-dfsg/src/VBox/Additions/common/VBoxService/VBoxServiceControlSession.cpp --- virtualbox-hwe-6.1.34-dfsg/src/VBox/Additions/common/VBoxService/VBoxServiceControlSession.cpp 2022-03-22 23:37:49.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/src/VBox/Additions/common/VBoxService/VBoxServiceControlSession.cpp 2022-09-01 13:20:47.000000000 +0000 @@ -2633,6 +2633,11 @@ VbglR3GuestCtrlSessionStartupInfoFree(pThread->pStartupInfo); pThread->pStartupInfo = NULL; + RTPipeClose(pThread->hKeyPipe); + pThread->hKeyPipe = NIL_RTPIPE; + + RTCritSectDelete(&pThread->CritSect); + /* Remove session from list and destroy object. */ RTListNodeRemove(&pThread->Node); diff -Nru virtualbox-hwe-6.1.34-dfsg/src/VBox/Additions/common/VBoxService/VBoxService.cpp virtualbox-hwe-6.1.38-dfsg/src/VBox/Additions/common/VBoxService/VBoxService.cpp --- virtualbox-hwe-6.1.34-dfsg/src/VBox/Additions/common/VBoxService/VBoxService.cpp 2022-03-22 23:37:49.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/src/VBox/Additions/common/VBoxService/VBoxService.cpp 2022-09-01 13:20:47.000000000 +0000 @@ -1218,14 +1218,13 @@ RT_ZERO(OSInfoEx); OSInfoEx.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX); + SetLastError(NO_ERROR); HANDLE hMutexAppRunning; - if ( GetVersionEx((LPOSVERSIONINFO)&OSInfoEx) - && OSInfoEx.dwPlatformId == VER_PLATFORM_WIN32_NT - && OSInfoEx.dwMajorVersion >= 5 /* NT 5.0 a.k.a W2K */) - hMutexAppRunning = CreateMutex(NULL, FALSE, "Global\\" VBOXSERVICE_NAME); + if (RTSystemGetNtVersion() >= RTSYSTEM_MAKE_NT_VERSION(5,0,0)) /* Windows 2000 */ + hMutexAppRunning = CreateMutexW(NULL, FALSE, L"Global\\" RT_CONCAT(L,VBOXSERVICE_NAME)); else - hMutexAppRunning = CreateMutex(NULL, FALSE, VBOXSERVICE_NAME); + hMutexAppRunning = CreateMutexW(NULL, FALSE, RT_CONCAT(L,VBOXSERVICE_NAME)); if (hMutexAppRunning == NULL) { DWORD dwErr = GetLastError(); diff -Nru virtualbox-hwe-6.1.34-dfsg/src/VBox/Additions/common/VBoxService/VBoxServiceVMInfo-win.cpp virtualbox-hwe-6.1.38-dfsg/src/VBox/Additions/common/VBoxService/VBoxServiceVMInfo-win.cpp --- virtualbox-hwe-6.1.34-dfsg/src/VBox/Additions/common/VBoxService/VBoxServiceVMInfo-win.cpp 2022-03-22 23:37:50.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/src/VBox/Additions/common/VBoxService/VBoxServiceVMInfo-win.cpp 2022-09-01 13:20:48.000000000 +0000 @@ -133,9 +133,6 @@ /** @} */ -/** Windows version. */ -static OSVERSIONINFOEXA g_WinVersion; - /** * An RTOnce callback function. @@ -146,7 +143,7 @@ /* SECUR32 */ RTLDRMOD hLdrMod; - int rc = RTLdrLoadSystem("secur32.dll", true, &hLdrMod); + int rc = RTLdrLoadSystem("secur32.dll", true /*fNoUnload*/, &hLdrMod); if (RT_SUCCESS(rc)) { rc = RTLdrGetSymbol(hLdrMod, "LsaGetLogonSessionData", (void **)&g_pfnLsaGetLogonSessionData); @@ -163,11 +160,11 @@ g_pfnLsaGetLogonSessionData = NULL; g_pfnLsaEnumerateLogonSessions = NULL; g_pfnLsaFreeReturnBuffer = NULL; - Assert(g_WinVersion.dwMajorVersion < 5); + Assert(RTSystemGetNtVersion() < RTSYSTEM_MAKE_NT_VERSION(5, 0, 0)); } /* WTSAPI32 */ - rc = RTLdrLoadSystem("wtsapi32.dll", true, &hLdrMod); + rc = RTLdrLoadSystem("wtsapi32.dll", true /*fNoUnload*/, &hLdrMod); if (RT_SUCCESS(rc)) { rc = RTLdrGetSymbol(hLdrMod, "WTSFreeMemory", (void **)&g_pfnWTSFreeMemory); @@ -181,11 +178,11 @@ VGSvcVerbose(1, "WtsApi32.dll APIs are not available (%Rrc)\n", rc); g_pfnWTSFreeMemory = NULL; g_pfnWTSQuerySessionInformationA = NULL; - Assert(g_WinVersion.dwMajorVersion < 5); + Assert(RTSystemGetNtVersion() < RTSYSTEM_MAKE_NT_VERSION(5, 0, 0)); } /* PSAPI */ - rc = RTLdrLoadSystem("psapi.dll", true, &hLdrMod); + rc = RTLdrLoadSystem("psapi.dll", true /*fNoUnload*/, &hLdrMod); if (RT_SUCCESS(rc)) { rc = RTLdrGetSymbol(hLdrMod, "EnumProcesses", (void **)&g_pfnEnumProcesses); @@ -199,43 +196,27 @@ VGSvcVerbose(1, "psapi.dll APIs are not available (%Rrc)\n", rc); g_pfnEnumProcesses = NULL; g_pfnGetModuleFileNameExW = NULL; - Assert(g_WinVersion.dwMajorVersion < 5); + Assert(RTSystemGetNtVersion() < RTSYSTEM_MAKE_NT_VERSION(5, 0, 0)); } /* Kernel32: */ - rc = RTLdrLoadSystem("kernel32.dll", true, &hLdrMod); + rc = RTLdrLoadSystem("kernel32.dll", true /*fNoUnload*/, &hLdrMod); AssertRCReturn(rc, rc); rc = RTLdrGetSymbol(hLdrMod, "QueryFullProcessImageNameW", (void **)&g_pfnQueryFullProcessImageNameW); if (RT_FAILURE(rc)) { - Assert(g_WinVersion.dwMajorVersion < 6); + Assert(RTSystemGetNtVersion() < RTSYSTEM_MAKE_NT_VERSION(6, 0, 0)); g_pfnQueryFullProcessImageNameW = NULL; } RTLdrClose(hLdrMod); - /* - * Get the extended windows version once and for all. - */ - g_WinVersion.dwOSVersionInfoSize = sizeof(g_WinVersion); - if (!GetVersionExA((OSVERSIONINFO *)&g_WinVersion)) - { - RT_ZERO(g_WinVersion); - g_WinVersion.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); - if (!GetVersionExA((OSVERSIONINFO *)&g_WinVersion)) - { - AssertFailed(); - RT_ZERO(g_WinVersion); - } - } - return VINF_SUCCESS; } static bool vgsvcVMInfoSession0Separation(void) { - return g_WinVersion.dwPlatformId == VER_PLATFORM_WIN32_NT - && g_WinVersion.dwMajorVersion >= 6; /* Vista = 6.0 */ + return RTSystemGetNtVersion() >= RTSYSTEM_MAKE_NT_VERSION(6, 0, 0); /* Vista */ } @@ -244,61 +225,57 @@ * * @return IPRT status code. */ -static int vgsvcVMInfoWinProcessesGetModuleNameA(PVBOXSERVICEVMINFOPROC const pProc, PRTUTF16 *ppszName) +static int vgsvcVMInfoWinProcessesGetModuleNameW(PVBOXSERVICEVMINFOPROC const pProc, PRTUTF16 *ppszName) { - AssertPtrReturn(pProc, VERR_INVALID_POINTER); + *ppszName = NULL; AssertPtrReturn(ppszName, VERR_INVALID_POINTER); + AssertPtrReturn(pProc, VERR_INVALID_POINTER); + AssertReturn(g_pfnGetModuleFileNameExW || g_pfnQueryFullProcessImageNameW, VERR_NOT_SUPPORTED); - /** @todo Only do this once. Later. */ - /* Platform other than NT (e.g. Win9x) not supported. */ - if (g_WinVersion.dwPlatformId != VER_PLATFORM_WIN32_NT) - return VERR_NOT_SUPPORTED; - - int rc = VINF_SUCCESS; - + /* + * Open the process. + */ DWORD dwFlags = PROCESS_QUERY_INFORMATION | PROCESS_VM_READ; - if (g_WinVersion.dwMajorVersion >= 6 /* Vista or later */) + if (RTSystemGetNtVersion() >= RTSYSTEM_MAKE_NT_VERSION(6, 0, 0)) /* Vista and later */ dwFlags = PROCESS_QUERY_LIMITED_INFORMATION; /* possible to do on more processes */ - HANDLE h = OpenProcess(dwFlags, FALSE, pProc->id); - if (h == NULL) + HANDLE hProcess = OpenProcess(dwFlags, FALSE, pProc->id); + if (hProcess == NULL) { DWORD dwErr = GetLastError(); if (g_cVerbosity) VGSvcError("Unable to open process with PID=%u, error=%u\n", pProc->id, dwErr); - rc = RTErrConvertFromWin32(dwErr); + return RTErrConvertFromWin32(dwErr); } + + /* + * Since GetModuleFileNameEx has trouble with cross-bitness stuff (32-bit apps + * cannot query 64-bit apps and vice verse) we have to use a different code + * path for Vista and up. + * + * So use QueryFullProcessImageNameW when available (Vista+), fall back on + * GetModuleFileNameExW on older windows version ( + */ + WCHAR wszName[_1K]; + DWORD dwLen = _1K; + BOOL fRc; + if (g_pfnQueryFullProcessImageNameW) + fRc = g_pfnQueryFullProcessImageNameW(hProcess, 0 /*PROCESS_NAME_NATIVE*/, wszName, &dwLen); else - { - /* Since GetModuleFileNameEx has trouble with cross-bitness stuff (32-bit apps cannot query 64-bit - apps and vice verse) we have to use a different code path for Vista and up. */ - WCHAR wszName[_1K]; - DWORD dwLen = sizeof(wszName); /** @todo r=bird: wrong? */ - - /* Use QueryFullProcessImageNameW if available (Vista+). */ - if (g_pfnQueryFullProcessImageNameW) - { - if (!g_pfnQueryFullProcessImageNameW(h, 0 /*PROCESS_NAME_NATIVE*/, wszName, &dwLen)) - rc = VERR_ACCESS_DENIED; - } - else if (!g_pfnGetModuleFileNameExW(h, NULL /* Get main executable */, wszName, dwLen)) - rc = VERR_ACCESS_DENIED; - - if ( RT_FAILURE(rc) - && g_cVerbosity > 3) - VGSvcError("Unable to retrieve process name for PID=%u, error=%u\n", pProc->id, GetLastError()); - else - { - PRTUTF16 pszName = RTUtf16Dup(wszName); - if (pszName) - *ppszName = pszName; - else - rc = VERR_NO_MEMORY; - } + fRc = g_pfnGetModuleFileNameExW(hProcess, NULL /* Get main executable */, wszName, dwLen); - CloseHandle(h); + int rc; + if (fRc) + rc = RTUtf16DupEx(ppszName, wszName, 0); + else + { + DWORD dwErr = GetLastError(); + if (g_cVerbosity > 3) + VGSvcError("Unable to retrieve process name for PID=%u, LastError=%Rwc\n", pProc->id, dwErr); + rc = RTErrConvertFromWin32(dwErr); } + CloseHandle(hProcess); return rc; } @@ -686,7 +663,7 @@ if (g_cVerbosity) { PRTUTF16 pszName; - int rc2 = vgsvcVMInfoWinProcessesGetModuleNameA(&paProcs[i], &pszName); + int rc2 = vgsvcVMInfoWinProcessesGetModuleNameW(&paProcs[i], &pszName); VGSvcVerbose(4, "Session %RU32: PID=%u (fInt=%RTbool): %ls\n", pSessionData->Session, paProcs[i].id, paProcs[i].fInteractive, RT_SUCCESS(rc2) ? pszName : L""); @@ -856,29 +833,30 @@ pUserInfo->wszUser, pSessionData->Session, pSessionData->LogonId.HighPart, pSessionData->LogonId.LowPart, pUserInfo->wszAuthenticationPackage, pUserInfo->wszLogonDomain); - /** - * Note: On certain Windows OSes WTSQuerySessionInformation leaks memory when used - * under a heavy stress situation. There are hotfixes available from Microsoft. + /* KB970910 (check http://support.microsoft.com/kb/970910 on archive.org) + * indicates that WTSQuerySessionInformation may leak memory and return the + * wrong status code for WTSApplicationName and WTSInitialProgram queries. + * + * The system must be low on resources, and presumably some internal operation + * must fail because of this, triggering an error handling path that forgets + * to free memory and set last error. * - * See: http://support.microsoft.com/kb/970910 + * bird 2022-08-26: However, we do not query either of those info items. We + * query WTSConnectState, which is a rather simple affair. So, I've + * re-enabled the code for all systems that includes the API. */ if (!s_fSkipRDPDetection) { - /* Skip RDP detection on non-NT systems. */ - if (g_WinVersion.dwPlatformId != VER_PLATFORM_WIN32_NT) - s_fSkipRDPDetection = true; - - /* Skip RDP detection on Windows 2000. - * For Windows 2000 however we don't have any hotfixes, so just skip the - * RDP detection in any case. */ - if ( g_WinVersion.dwMajorVersion == 5 - && g_WinVersion.dwMinorVersion == 0) - s_fSkipRDPDetection = true; - /* Skip if we don't have the WTS API. */ if (!g_pfnWTSQuerySessionInformationA) s_fSkipRDPDetection = true; - +#if 0 /* bird: see above */ + /* Skip RDP detection on Windows 2000 and older. + For Windows 2000 however we don't have any hotfixes, so just skip the + RDP detection in any case. */ + else if (RTSystemGetNtVersion() < RTSYSTEM_MAKE_NT_VERSION(5, 1, 0)) /* older than XP */ + s_fSkipRDPDetection = true; +#endif if (s_fSkipRDPDetection) VGSvcVerbose(0, "Detection of logged-in users via RDP is disabled\n"); } diff -Nru virtualbox-hwe-6.1.34-dfsg/src/VBox/Additions/linux/drm/vbox_drv.c virtualbox-hwe-6.1.38-dfsg/src/VBox/Additions/linux/drm/vbox_drv.c --- virtualbox-hwe-6.1.34-dfsg/src/VBox/Additions/linux/drm/vbox_drv.c 2022-03-22 23:37:53.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/src/VBox/Additions/linux/drm/vbox_drv.c 2022-09-01 13:20:52.000000000 +0000 @@ -83,7 +83,7 @@ int ret = 0; # if RTLNX_VER_MIN(5,14,0) || RTLNX_RHEL_RANGE(8,6, 8,99) -# if RTLNX_VER_MIN(5,15,0) +# if RTLNX_VER_MIN(5,15,0) || RTLNX_RHEL_MIN(9,1) ret = drm_aperture_remove_conflicting_pci_framebuffers(pdev, &driver); # else ret = drm_aperture_remove_conflicting_pci_framebuffers(pdev, "vboxvideofb"); @@ -367,7 +367,7 @@ #endif .fops = &vbox_fops, -#if RTLNX_VER_MAX(5,15,0) +#if RTLNX_VER_MAX(5,15,0) && !RTLNX_RHEL_MAJ_PREREQ(9,1) .irq_handler = vbox_irq_handler, #endif .name = DRIVER_NAME, diff -Nru virtualbox-hwe-6.1.34-dfsg/src/VBox/Additions/linux/drm/vbox_drv.h virtualbox-hwe-6.1.38-dfsg/src/VBox/Additions/linux/drm/vbox_drv.h --- virtualbox-hwe-6.1.34-dfsg/src/VBox/Additions/linux/drm/vbox_drv.h 2022-03-22 23:37:53.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/src/VBox/Additions/linux/drm/vbox_drv.h 2022-09-01 13:20:53.000000000 +0000 @@ -157,7 +157,7 @@ # include # include # include -# if RTLNX_VER_MAX(5,15,0) +# if RTLNX_VER_MAX(5,15,0) && !RTLNX_RHEL_MAJ_PREREQ(9,1) # include # endif # include @@ -185,6 +185,10 @@ # include #endif +#if RTLNX_VER_MIN(6,0,0) +# include +#endif + #include "vboxvideo_guest.h" #include "vboxvideo_vbe.h" #include "hgsmi_ch_setup.h" @@ -519,7 +523,7 @@ int vbox_irq_init(struct vbox_private *vbox); void vbox_irq_fini(struct vbox_private *vbox); void vbox_report_hotplug(struct vbox_private *vbox); -#if RTLNX_VER_MAX(5,15,0) +#if RTLNX_VER_MAX(5,15,0) && !RTLNX_RHEL_MAJ_PREREQ(9,1) irqreturn_t vbox_irq_handler(int irq, void *arg); #endif diff -Nru virtualbox-hwe-6.1.34-dfsg/src/VBox/Additions/linux/drm/vbox_fb.c virtualbox-hwe-6.1.38-dfsg/src/VBox/Additions/linux/drm/vbox_fb.c --- virtualbox-hwe-6.1.34-dfsg/src/VBox/Additions/linux/drm/vbox_fb.c 2022-03-22 23:37:53.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/src/VBox/Additions/linux/drm/vbox_fb.c 2022-09-01 13:20:53.000000000 +0000 @@ -362,6 +362,9 @@ info->screen_size = size; #ifdef CONFIG_FB_DEFERRED_IO +# if RTLNX_VER_MIN(5,19,0) + info->fix.smem_len = info->screen_size; +# endif info->fbdefio = &vbox_defio; fb_deferred_io_init(info); #endif diff -Nru virtualbox-hwe-6.1.34-dfsg/src/VBox/Additions/linux/drm/vbox_irq.c virtualbox-hwe-6.1.38-dfsg/src/VBox/Additions/linux/drm/vbox_irq.c --- virtualbox-hwe-6.1.34-dfsg/src/VBox/Additions/linux/drm/vbox_irq.c 2022-03-22 23:37:54.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/src/VBox/Additions/linux/drm/vbox_irq.c 2022-09-01 13:20:53.000000000 +0000 @@ -205,7 +205,7 @@ { INIT_WORK(&vbox->hotplug_work, vbox_hotplug_worker); vbox_update_mode_hints(vbox); -#if RTLNX_VER_MIN(5,15,0) +#if RTLNX_VER_MIN(5,15,0) || RTLNX_RHEL_MAJ_PREREQ(9,1) return request_irq(VBOX_DRM_TO_PCI_DEV(vbox->dev)->irq, vbox_irq_handler, IRQF_SHARED, vbox->dev->driver->name, vbox->dev); #elif RTLNX_VER_MIN(3,16,0) || RTLNX_RHEL_MAJ_PREREQ(7,1) return drm_irq_install(vbox->dev, VBOX_DRM_TO_PCI_DEV(vbox->dev)->irq); @@ -216,7 +216,7 @@ void vbox_irq_fini(struct vbox_private *vbox) { -#if RTLNX_VER_MIN(5,15,0) +#if RTLNX_VER_MIN(5,15,0) || RTLNX_RHEL_MAJ_PREREQ(9,1) free_irq(VBOX_DRM_TO_PCI_DEV(vbox->dev)->irq, vbox->dev); #else drm_irq_uninstall(vbox->dev); diff -Nru virtualbox-hwe-6.1.34-dfsg/src/VBox/Additions/linux/drm/vbox_mode.c virtualbox-hwe-6.1.38-dfsg/src/VBox/Additions/linux/drm/vbox_mode.c --- virtualbox-hwe-6.1.34-dfsg/src/VBox/Additions/linux/drm/vbox_mode.c 2022-03-22 23:37:54.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/src/VBox/Additions/linux/drm/vbox_mode.c 2022-09-01 13:20:53.000000000 +0000 @@ -46,6 +46,10 @@ # include #endif +#if RTLNX_VER_MIN(6,0,0) +# include +#endif + #include "VBoxVideo.h" static int vbox_cursor_set2(struct drm_crtc *crtc, struct drm_file *file_priv, diff -Nru virtualbox-hwe-6.1.34-dfsg/src/VBox/Additions/linux/drm/vbox_ttm.c virtualbox-hwe-6.1.38-dfsg/src/VBox/Additions/linux/drm/vbox_ttm.c --- virtualbox-hwe-6.1.34-dfsg/src/VBox/Additions/linux/drm/vbox_ttm.c 2022-03-22 23:37:54.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/src/VBox/Additions/linux/drm/vbox_ttm.c 2022-09-01 13:20:53.000000000 +0000 @@ -320,8 +320,10 @@ if (ttm_tt_init(tt, bdev, size, page_flags, dummy_read_page)) { #elif RTLNX_VER_MAX(5,11,0) && !RTLNX_RHEL_RANGE(8,5, 8,99) if (ttm_tt_init(tt, bo, page_flags)) { -#else +#elif RTLNX_VER_MAX(5,19,0) if (ttm_tt_init(tt, bo, page_flags, ttm_write_combined)) { +#else + if (ttm_tt_init(tt, bo, page_flags, ttm_write_combined, 0)) { #endif kfree(tt); return NULL; diff -Nru virtualbox-hwe-6.1.34-dfsg/src/VBox/Additions/linux/installer/install.sh.in virtualbox-hwe-6.1.38-dfsg/src/VBox/Additions/linux/installer/install.sh.in --- virtualbox-hwe-6.1.34-dfsg/src/VBox/Additions/linux/installer/install.sh.in 2022-03-22 23:37:54.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/src/VBox/Additions/linux/installer/install.sh.in 2022-09-01 13:20:53.000000000 +0000 @@ -33,8 +33,8 @@ PUBLIC_UNINSTALL_HOOK="/usr/sbin/vbox-uninstall-guest-additions" ROUTINES="routines.sh" INSTALLATION_VER="_VERSION_" -BUILD_TYPE="_BUILDTYPE_" -USERNAME="_USERNAME_" +BUILD_VBOX_KBUILD_TYPE="_BUILDTYPE_" +BUILD_USERNAME="_USERNAME_" UNINSTALL_SCRIPTS="vboxadd-x11 vboxvfs vboxadd-timesync vboxadd-service vboxadd" INSTALLATION_DIR="/opt/$PACKAGE-$INSTALLATION_VER" @@ -448,8 +448,8 @@ # Package version INSTALL_VER='$INSTALLATION_VER' # Build type and user name for logging purposes -BUILD_TYPE='$BUILD_TYPE' -USERNAME='$USERNAME' +BUILD_VBOX_KBUILD_TYPE='$BUILD_BUILDTYPE' +BUILD_USERNAME='$USERNAME' EOF # Give the modules the chance to write their stuff diff -Nru virtualbox-hwe-6.1.34-dfsg/src/VBox/Additions/linux/installer/vboxadd.sh virtualbox-hwe-6.1.38-dfsg/src/VBox/Additions/linux/installer/vboxadd.sh --- virtualbox-hwe-6.1.34-dfsg/src/VBox/Additions/linux/installer/vboxadd.sh 2022-03-22 23:37:54.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/src/VBox/Additions/linux/installer/vboxadd.sh 2022-09-01 13:20:53.000000000 +0000 @@ -1,7 +1,7 @@ #! /bin/sh # $Id: vboxadd.sh $ ## @file -# Linux Additions kernel module init script ($Revision: 135976 $) +# Linux Additions kernel module init script ($Revision: 152074 $) # # @@ -61,7 +61,7 @@ test -z "${TARGET_VER}" && TARGET_VER=`uname -r` # Marker to ignore a particular kernel version which was already installed. SKIPFILE_BASE=/var/lib/VBoxGuestAdditions/skip -export BUILD_TYPE +export VBOX_KBUILD_TYPE export USERNAME setup_log() @@ -135,6 +135,13 @@ MODULE_SRC="$INSTALL_DIR/src/vboxguest-$INSTALL_VER" BUILDINTMP="$MODULE_SRC/build_in_tmp" +# Attempt to detect VirtualBox Guest Additions version and revision information. +VBOXCLIENT="${INSTALL_DIR}/bin/VBoxClient" +VBOX_VERSION="`"$VBOXCLIENT" --version | cut -d r -f1`" +[ -n "$VBOX_VERSION" ] || VBOX_VERSION='unknown' +VBOX_REVISION="r`"$VBOXCLIENT" --version | cut -d r -f2`" +[ "$VBOX_REVISION" != "r" ] || VBOX_REVISION='unknown' + running_vboxguest() { lsmod | grep -q "vboxguest[^_-]" @@ -283,6 +290,16 @@ export KERN_VER info "Building the modules for kernel $KERN_VER." + # Detect if kernel was built with clang. + unset LLVM + vbox_cc_is_clang=$(/lib/modules/"$KERN_VER"/build/scripts/config \ + --file /lib/modules/"$KERN_VER"/build/.config \ + --state CONFIG_CC_IS_CLANG 2>/dev/null) + if test "${vbox_cc_is_clang}" = "y"; then + info "Using clang compiler." + export LLVM=1 + fi + log "Building the main Guest Additions $INSTALL_VER module for kernel $KERN_VER." if ! myerr=`$BUILDINTMP \ --save-module-symvers /tmp/vboxguest-Module.symvers \ @@ -403,6 +420,75 @@ fi } +# Returns path to module file as seen by modinfo(8) or empty string. +module_path() +{ + mod="$1" + [ -n "$mod" ] || return + + modinfo "$mod" 2>/dev/null | grep -e "^filename:" | tr -s ' ' | cut -d " " -f2 +} + +# Returns module version if module is available or empty string. +module_version() +{ + mod="$1" + [ -n "$mod" ] || return + + modinfo "$mod" 2>/dev/null | grep -e "^version:" | tr -s ' ' | cut -d " " -f2 +} + +# Returns module revision if module is available in the system or empty string. +module_revision() +{ + mod="$1" + [ -n "$mod" ] || return + + modinfo "$mod" 2>/dev/null | grep -e "^version:" | tr -s ' ' | cut -d " " -f3 +} + +# Returns "1" if externally built module is available in the system and its +# version and revision number do match to current VirtualBox installation. +# Or empty string otherwise. +module_available() +{ + mod="$1" + [ -n "$mod" ] || return + + [ "$VBOX_VERSION" = "$(module_version "$mod")" ] || return + [ "$VBOX_REVISION" = "$(module_revision "$mod")" ] || return + + # Check if module belongs to VirtualBox installation. + # + # We have a convention that only modules from /lib/modules/*/misc + # belong to us. Modules from other locations are treated as + # externally built. + mod_path="$(module_path "$mod")" + + # If module path points to a symbolic link, resolve actual file location. + [ -L "$mod_path" ] && mod_path="$(readlink -e -- "$mod_path")" + + # File exists? + [ -f "$mod_path" ] || return + + # Extract last component of module path and check whether it is located + # outside of /lib/modules/*/misc. + mod_dir="$(dirname "$mod_path" | sed 's;^.*/;;')" + [ "$mod_dir" = "misc" ] || return + + echo "1" +} + +# Check if required modules are installed in the system and versions match. +setup_complete() +{ + [ "$(module_available vboxguest)" = "1" ] || return + [ "$(module_available vboxsf)" = "1" ] || return + + # All modules are in place. + echo "1" +} + # setup_script setup() { @@ -411,18 +497,25 @@ chcon -t bin_t "$BUILDINTMP" 2>/dev/null if test -z "$INSTALL_NO_MODULE_BUILDS"; then - info "Building the VirtualBox Guest Additions kernel modules. This may take a while." - info "To build modules for other installed kernels, run" - info " /sbin/rcvboxadd quicksetup " - info "or" - info " /sbin/rcvboxadd quicksetup all" - if test -d /lib/modules/"$TARGET_VER"/build; then - setup_modules "$TARGET_VER" - depmod + # Check whether modules setup is already complete for currently running kernel. + # Prevent unnecessary rebuilding in order to speed up booting process. + if test "$(setup_complete)" = "1"; then + info "VirtualBox Guest Additions kernel modules $VBOX_VERSION $VBOX_REVISION are" + info "already available for kernel $TARGET_VER and do not require to be rebuilt." else - info "Kernel headers not found for target kernel $TARGET_VER. \ + info "Building the VirtualBox Guest Additions kernel modules. This may take a while." + info "To build modules for other installed kernels, run" + info " /sbin/rcvboxadd quicksetup " + info "or" + info " /sbin/rcvboxadd quicksetup all" + if test -d /lib/modules/"$TARGET_VER"/build; then + setup_modules "$TARGET_VER" + depmod + else + info "Kernel headers not found for target kernel $TARGET_VER. \ Please install them and execute /sbin/rcvboxadd setup" + fi fi fi create_vbox_user diff -Nru virtualbox-hwe-6.1.34-dfsg/src/VBox/Additions/linux/sharedfolders/dirops.c virtualbox-hwe-6.1.38-dfsg/src/VBox/Additions/linux/sharedfolders/dirops.c --- virtualbox-hwe-6.1.34-dfsg/src/VBox/Additions/linux/sharedfolders/dirops.c 2022-03-22 23:37:55.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/src/VBox/Additions/linux/sharedfolders/dirops.c 2022-09-01 13:20:55.000000000 +0000 @@ -1400,7 +1400,9 @@ #if RTLNX_VER_MIN(4,9,0) .rename = vbsf_inode_rename, #else +# if RTLNX_VER_MAX(3,17,0) .rename = vbsf_inode_rename_no_flags, +# endif # if RTLNX_VER_MIN(3,15,0) .rename2 = vbsf_inode_rename, # endif diff -Nru virtualbox-hwe-6.1.34-dfsg/src/VBox/Additions/linux/sharedfolders/Makefile.module virtualbox-hwe-6.1.38-dfsg/src/VBox/Additions/linux/sharedfolders/Makefile.module --- virtualbox-hwe-6.1.34-dfsg/src/VBox/Additions/linux/sharedfolders/Makefile.module 2022-03-22 23:37:55.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/src/VBox/Additions/linux/sharedfolders/Makefile.module 2022-09-01 13:20:55.000000000 +0000 @@ -42,7 +42,7 @@ VBoxGuestR0LibInit.o \ VBoxGuestR0LibPhysHeap.o \ VBoxGuestR0LibSharedFolders.o -ifeq ($(BUILD_TARGET_ARCH),x86) +ifeq ($(VBOX_KBUILD_TARGET_ARCH),x86) VBOXMOD_OBJS += \ divdi3.o \ moddi3.o \ @@ -66,7 +66,7 @@ IN_GUEST \ IN_GUEST_R0 \ RT_NO_EXPORT_SYMBOL -ifeq ($(BUILD_TARGET_ARCH),amd64) +ifeq ($(VBOX_KBUILD_TARGET_ARCH),amd64) VBOXMOD_DEFS += VBOX_WITH_64_BITS_GUESTS endif ifneq ($(filter %uek.x86_64,$(KERN_VER)),) diff -Nru virtualbox-hwe-6.1.34-dfsg/src/VBox/Additions/linux/sharedfolders/regops.c virtualbox-hwe-6.1.38-dfsg/src/VBox/Additions/linux/sharedfolders/regops.c --- virtualbox-hwe-6.1.34-dfsg/src/VBox/Additions/linux/sharedfolders/regops.c 2022-03-22 23:37:55.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/src/VBox/Additions/linux/sharedfolders/regops.c 2022-09-01 13:20:55.000000000 +0000 @@ -2095,6 +2095,12 @@ #endif /* < 5.10.0 */ #if RTLNX_VER_MIN(2,6,19) +/* See kernel 6.0.0 change eba2d3d798295dc43cae8fade102f9d083a2a741. */ +# if RTLNX_VER_MIN(6,0,0) +# define VBOX_IOV_GET_PAGES iov_iter_get_pages2 +# else +# define VBOX_IOV_GET_PAGES iov_iter_get_pages +# endif /** * Companion to vbsf_iter_lock_pages(). @@ -2185,9 +2191,11 @@ while (!iov_iter_single_seg_count(iter)) /* Old code didn't skip empty segments which caused EFAULTs. */ iov_iter_advance(iter, 0); # endif - cbSegRet = iov_iter_get_pages(iter, papPages, iov_iter_count(iter), cMaxPages, &offPage0); + cbSegRet = VBOX_IOV_GET_PAGES(iter, papPages, iov_iter_count(iter), cMaxPages, &offPage0); if (cbSegRet > 0) { +# if RTLNX_VER_MAX(6,0,0) iov_iter_advance(iter, cbSegRet); +#endif cbChunk = (size_t)cbSegRet; cPages = RT_ALIGN_Z(offPage0 + cbSegRet, PAGE_SIZE) >> PAGE_SHIFT; cMaxPages -= cPages; @@ -2211,9 +2219,11 @@ iov_iter_advance(iter, 0); cbSeg = iov_iter_single_seg_count(iter); } - cbSegRet = iov_iter_get_pages(iter, &papPages[cPages], iov_iter_count(iter), 1, &offPgProbe); + cbSegRet = VBOX_IOV_GET_PAGES(iter, &papPages[cPages], iov_iter_count(iter), 1, &offPgProbe); if (cbSegRet > 0) { +# if RTLNX_VER_MAX(6,0,0) iov_iter_advance(iter, cbSegRet); /** @todo maybe not do this if we stash the page? */ +#endif Assert(offPgProbe + cbSegRet <= PAGE_SIZE); if (offPgProbe == 0) { cbChunk += cbSegRet; @@ -2229,11 +2239,13 @@ */ cbSeg -= cbSegRet; if (cbSeg > 0) { - cbSegRet = iov_iter_get_pages(iter, &papPages[cPages], iov_iter_count(iter), cMaxPages, &offPgProbe); + cbSegRet = VBOX_IOV_GET_PAGES(iter, &papPages[cPages], iov_iter_count(iter), cMaxPages, &offPgProbe); if (cbSegRet > 0) { size_t const cPgRet = RT_ALIGN_Z((size_t)cbSegRet, PAGE_SIZE) >> PAGE_SHIFT; Assert(offPgProbe == 0); +# if RTLNX_VER_MAX(6,0,0) iov_iter_advance(iter, cbSegRet); +# endif SFLOG3(("vbsf_iter_lock_pages: iov_iter_get_pages() -> %#zx; %#zx pages\n", cbSegRet, cPgRet)); cPages += cPgRet; cMaxPages -= cPgRet; @@ -3581,8 +3593,14 @@ * Needed for mmap and reads+writes when the file is mmapped in a * shared+writeable fashion. */ +#if RTLNX_VER_MIN(5,19,0) +static int vbsf_read_folio(struct file *file, struct folio *folio) +{ + struct page *page = &folio->page; +#else static int vbsf_readpage(struct file *file, struct page *page) { +#endif struct inode *inode = VBSF_GET_F_DENTRY(file)->d_inode; int err; @@ -3728,8 +3746,7 @@ /** * Called when writing thru the page cache (which we shouldn't be doing). */ -int vbsf_write_begin(struct file *file, struct address_space *mapping, loff_t pos, - unsigned len, unsigned flags, struct page **pagep, void **fsdata) +static inline void vbsf_write_begin_warn(loff_t pos, unsigned len, unsigned flags) { /** @todo r=bird: We shouldn't ever get here, should we? Because we don't use * the page cache for any writes AFAIK. We could just as well use @@ -3745,8 +3762,24 @@ WARN_ON(1); # endif } +} + +# if RTLNX_VER_MIN(5,19,0) +int vbsf_write_begin(struct file *file, struct address_space *mapping, loff_t pos, + unsigned len, struct page **pagep, void **fsdata) +{ + vbsf_write_begin_warn(pos, len, 0); + return simple_write_begin(file, mapping, pos, len, pagep, fsdata); +} +# else +int vbsf_write_begin(struct file *file, struct address_space *mapping, loff_t pos, + unsigned len, unsigned flags, struct page **pagep, void **fsdata) +{ + vbsf_write_begin_warn(pos, len, flags); return simple_write_begin(file, mapping, pos, len, flags, pagep, fsdata); } +# endif + #endif /* KERNEL_VERSION >= 2.6.24 */ #if RTLNX_VER_MIN(5,14,0) @@ -3820,10 +3853,16 @@ * @todo the FsPerf touch/flush (mmap) test fails on 4.4.0 (ubuntu 16.04 lts). */ struct address_space_operations vbsf_reg_aops = { +#if RTLNX_VER_MIN(5,19,0) + .read_folio = vbsf_read_folio, +#else .readpage = vbsf_readpage, +#endif .writepage = vbsf_writepage, /** @todo Need .writepages if we want msync performance... */ -#if RTLNX_VER_MIN(2,5,12) +#if RTLNX_VER_MIN(5,18,0) + .dirty_folio = filemap_dirty_folio, +#elif RTLNX_VER_MIN(2,5,12) .set_page_dirty = __set_page_dirty_buffers, #endif #if RTLNX_VER_MIN(5,14,0) @@ -3840,4 +3879,3 @@ .direct_IO = vbsf_direct_IO, #endif }; - diff -Nru virtualbox-hwe-6.1.34-dfsg/src/VBox/Additions/Makefile.kmk virtualbox-hwe-6.1.38-dfsg/src/VBox/Additions/Makefile.kmk --- virtualbox-hwe-6.1.34-dfsg/src/VBox/Additions/Makefile.kmk 2022-03-22 23:37:34.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/src/VBox/Additions/Makefile.kmk 2022-09-01 13:20:32.000000000 +0000 @@ -294,6 +294,9 @@ GUESTADDITIONS_FILESPEC.win += cert/vbox-sha256-r3.cer=$(VBOX_PATH_ADDITIONS.win)/vbox-sha256-r3.cer endif endif + ifdef VBOX_WITH_VBOX_LEGACY_TS_CA + GUESTADDITIONS_FILESPEC.win += cert/vbox-legacy-timestamp-ca.cer=$(VBOX_PATH_ADDITIONS.win)/vbox-legacy-timestamp-ca.cer + endif GUESTADDITIONS_FILESPEC.win += windows11-bypass.reg=$(VBOX_PATH_ADDITIONS_SRC)/WINNT/tools/windows11-bypass.reg endif diff -Nru virtualbox-hwe-6.1.34-dfsg/src/VBox/Additions/solaris/Installer/postinstall.sh virtualbox-hwe-6.1.38-dfsg/src/VBox/Additions/solaris/Installer/postinstall.sh --- virtualbox-hwe-6.1.34-dfsg/src/VBox/Additions/solaris/Installer/postinstall.sh 2022-03-22 23:37:57.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/src/VBox/Additions/solaris/Installer/postinstall.sh 2022-09-01 13:20:56.000000000 +0000 @@ -367,7 +367,7 @@ # take a while to complete, using disable/enable -s doesn't work either. So we restart it, and poll in # 1 second intervals to see if our service has been successfully imported and timeout after 'cmax' seconds. /usr/sbin/svcadm restart svc:system/manifest-import:default - /usr/bin/svcs virtualbox/vboxservice virtualbox/vboxmslnk >/dev/null 2>&1 + /usr/bin/svcs virtualbox/vboxservice >/dev/null 2>&1 && /usr/bin/svcs virtualbox/vboxmslnk >/dev/null 2>&1 while test "$?" -ne 0; do sleep 1 @@ -376,7 +376,7 @@ success=1 break fi - /usr/bin/svcs virtualbox/vboxservice virtualbox/vboxmslnk >/dev/null 2>&1 + /usr/bin/svcs virtualbox/vboxservice >/dev/null 2>&1 && /usr/bin/svcs virtualbox/vboxmslnk >/dev/null 2>&1 done if test "$success" -eq 0; then echo "Enabling services..." diff -Nru virtualbox-hwe-6.1.34-dfsg/src/VBox/Additions/x11/VBoxClient/display-svga-x11.cpp virtualbox-hwe-6.1.38-dfsg/src/VBox/Additions/x11/VBoxClient/display-svga-x11.cpp --- virtualbox-hwe-6.1.34-dfsg/src/VBox/Additions/x11/VBoxClient/display-svga-x11.cpp 2022-03-22 23:37:59.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/src/VBox/Additions/x11/VBoxClient/display-svga-x11.cpp 2022-09-01 13:20:58.000000000 +0000 @@ -80,6 +80,33 @@ /** Shutdown indicator for the monitor thread. */ static bool g_fMonitorThreadShutdown = false; +#define X_VMwareCtrlSetRes 1 + +typedef struct +{ + CARD8 reqType; + CARD8 VMwareCtrlReqType; + CARD16 length B16; + CARD32 screen B32; + CARD32 x B32; + CARD32 y B32; +} xVMwareCtrlSetResReq; +#define sz_xVMwareCtrlSetResReq 16 + +typedef struct +{ + BYTE type; + BYTE pad1; + CARD16 sequenceNumber B16; + CARD32 length B32; + CARD32 screen B32; + CARD32 x B32; + CARD32 y B32; + CARD32 pad2 B32; + CARD32 pad3 B32; + CARD32 pad4 B32; +} xVMwareCtrlSetResReply; +#define sz_xVMwareCtrlSetResReply 32 typedef struct { CARD8 reqType; /* always X_VMwareCtrlReqCode */ @@ -156,6 +183,9 @@ XRRCrtcInfo* (*pXRRGetCrtcInfo) (Display *, XRRScreenResources *, RRCrtc crtc); void (*pXRRFreeCrtcInfo)(XRRCrtcInfo *); void (*pXRRAddOutputMode)(Display *, RROutput, RRMode); + void (*pXRRDeleteOutputMode)(Display *, RROutput, RRMode); + void (*pXRRDestroyMode)(Display *, RRMode); + void (*pXRRSetOutputPrimary)(Display *, Window, RROutput); }; static X11CONTEXT x11Context; @@ -167,6 +197,7 @@ uint32_t width; uint32_t height; bool fEnabled; + bool fPrimary; }; struct DisplayModeR { @@ -433,6 +464,33 @@ return Mode; } +#ifdef RT_OS_SOLARIS +static bool VMwareCtrlSetRes( + Display *dpy, int hExtensionMajorOpcode, int screen, int x, int y) +{ + xVMwareCtrlSetResReply rep; + xVMwareCtrlSetResReq *pReq; + bool fResult = false; + + LockDisplay(dpy); + + GetReq(VMwareCtrlSetRes, pReq); + AssertPtrReturn(pReq, false); + + pReq->reqType = hExtensionMajorOpcode; + pReq->VMwareCtrlReqType = X_VMwareCtrlSetRes; + pReq->screen = screen; + pReq->x = x; + pReq->y = y; + + fResult = !!_XReply(dpy, (xReply *)&rep, (SIZEOF(xVMwareCtrlSetResReply) - SIZEOF(xReply)) >> 2, xFalse); + + UnlockDisplay(dpy); + + return fResult; +} +#endif /* RT_OS_SOLARIS */ + /** Makes a call to vmwarectrl extension. This updates the * connection information and possible resolutions (modes) * of each monitor on the driver. Also sets the preferred mode @@ -476,6 +534,10 @@ { if (!sMonitorName) return -1; +#ifdef RT_OS_SOLARIS + if (!strcmp(sMonitorName, "default")) + return 1; +#endif int iLen = strlen(sMonitorName); if (iLen <= 0) return -1; @@ -648,6 +710,11 @@ { int hHeight = 600; int hWidth = 800; + bool fResult = false; + int idxDefaultScreen = DefaultScreen(x11Context.pDisplay); + + AssertReturn(idxDefaultScreen >= 0, false); + AssertReturn(idxDefaultScreen < x11Context.hOutputCount, false); xXineramaScreenInfo *extents = (xXineramaScreenInfo *)malloc(x11Context.hOutputCount * sizeof(xXineramaScreenInfo)); if (!extents) @@ -671,10 +738,17 @@ extents[i].height = hHeight; hRunningOffset += hWidth; } - return VMwareCtrlSetTopology(x11Context.pDisplay, x11Context.hVMWCtrlMajorOpCode, - DefaultScreen(x11Context.pDisplay), - extents, x11Context.hOutputCount); +#ifdef RT_OS_SOLARIS + fResult = VMwareCtrlSetRes(x11Context.pDisplay, x11Context.hVMWCtrlMajorOpCode, + idxDefaultScreen, extents[idxDefaultScreen].width, + extents[idxDefaultScreen].height); +#else + fResult = VMwareCtrlSetTopology(x11Context.pDisplay, x11Context.hVMWCtrlMajorOpCode, + idxDefaultScreen, extents, x11Context.hOutputCount); +#endif free(extents); + + return fResult; } /** @@ -797,7 +871,7 @@ /* If DRM client is already running don't start this service. */ if (checkDRMClient()) { - VBClLogFatalError("DRM resizing is already running. Exiting this service\n"); + VBClLogInfo("DRM resizing is already running. Exiting this service\n"); return false; } if (isXwayland()) @@ -911,6 +985,15 @@ *(void **)(&x11Context.pXRRAddOutputMode) = dlsym(x11Context.pRandLibraryHandle, "XRRAddOutputMode"); checkFunctionPtr(x11Context.pXRRAddOutputMode); + *(void **)(&x11Context.pXRRDeleteOutputMode) = dlsym(x11Context.pRandLibraryHandle, "XRRDeleteOutputMode"); + checkFunctionPtr(x11Context.pXRRDeleteOutputMode); + + *(void **)(&x11Context.pXRRDestroyMode) = dlsym(x11Context.pRandLibraryHandle, "XRRDestroyMode"); + checkFunctionPtr(x11Context.pXRRDestroyMode); + + *(void **)(&x11Context.pXRRSetOutputPrimary) = dlsym(x11Context.pRandLibraryHandle, "XRRSetOutputPrimary"); + checkFunctionPtrReturn(x11Context.pXRRSetOutputPrimary); + return VINF_SUCCESS; } #endif @@ -937,6 +1020,9 @@ x11Context.pXRRGetCrtcInfo = NULL; x11Context.pXRRFreeCrtcInfo = NULL; x11Context.pXRRAddOutputMode = NULL; + x11Context.pXRRDeleteOutputMode = NULL; + x11Context.pXRRDestroyMode = NULL; + x11Context.pXRRSetOutputPrimary = NULL; x11Context.fWmwareCtrlExtention = false; x11Context.fMonitorInfoAvailable = false; x11Context.hRandRMajor = 0; @@ -1022,9 +1108,7 @@ if (x11Context.pXRRGetScreenResources) x11Context.pScreenResources = x11Context.pXRRGetScreenResources(x11Context.pDisplay, x11Context.rootWindow); #endif - /* Currently without the VMWARE_CTRL extension we cannot connect outputs and set outputs' preferred mode. - * So we set the output count to 1 to get the 1st output position correct. */ - x11Context.hOutputCount = x11Context.fWmwareCtrlExtention ? determineOutputCount() : 1; + x11Context.hOutputCount = RT_VALID_PTR(x11Context.pScreenResources) ? determineOutputCount() : 0; #ifdef WITH_DISTRO_XRAND_XINERAMA XRRFreeScreenResources(x11Context.pScreenResources); #else @@ -1159,7 +1243,14 @@ #endif XRRScreenSize newSize = currentSize(); - if (!event || newSize.width != (int)iXRes || newSize.height != (int)iYRes) + /* On Solaris guest, new screen size is not reported properly despite + * RRScreenChangeNotify event arrives. Hense, only check for event here. + * Linux guests do report new size correctly. */ + if ( !event +#ifndef RT_OS_SOLARIS + || newSize.width != (int)iXRes || newSize.height != (int)iYRes +#endif + ) { VBClLogError("Resizing frame buffer to %d %d has failed, current mode %d %d\n", iXRes, iYRes, newSize.width, newSize.height); @@ -1184,7 +1275,10 @@ DisplayModeR mode = f86CVTMode(iXRes, iYRes, 60 /*VRefresh */, true /*Reduced */, false /* Interlaced */); - pModeInfo->dotClock = mode.Clock; + /* Convert kHz to Hz: f86CVTMode returns clock value in units of kHz, + * XRRCreateMode will expect it in units of Hz. */ + pModeInfo->dotClock = mode.Clock * 1000; + pModeInfo->hSyncStart = mode.HSyncStart; pModeInfo->hSyncEnd = mode.HSyncEnd; pModeInfo->hTotal = mode.HTotal; @@ -1221,6 +1315,14 @@ VBClLogError("Output index %d is greater than # of oputputs %d\n", iOutputIndex, x11Context.hOutputCount); return false; } + + AssertReturn(iOutputIndex >= 0, false); + AssertReturn(iOutputIndex < VMW_MAX_HEADS, false); + + /* Remember the last instantiated display mode ID here. This mode will be replaced with the + * new one on the next guest screen resize event. */ + static RRMode aPrevMode[VMW_MAX_HEADS]; + RROutput outputId = x11Context.pScreenResources->outputs[iOutputIndex]; XRROutputInfo *pOutputInfo = NULL; #ifdef WITH_DISTRO_XRAND_XINERAMA @@ -1241,6 +1343,7 @@ { /* A mode with required size was not found. Create a new one. */ pModeInfo = createMode(paOutputs[iOutputIndex].width, paOutputs[iOutputIndex].height); + VBClLogInfo("create mode %s (%u) on output %d\n", pModeInfo->name, pModeInfo->id, iOutputIndex); fNewMode = true; } if (!pModeInfo) @@ -1256,6 +1359,41 @@ if (x11Context.pXRRAddOutputMode) x11Context.pXRRAddOutputMode(x11Context.pDisplay, outputId, pModeInfo->id); #endif + + /* If mode has been newly created, destroy and forget mode created on previous guest screen resize event. */ + if ( aPrevMode[iOutputIndex] > 0 + && pModeInfo->id != aPrevMode[iOutputIndex] + && fNewMode) + { + VBClLogInfo("removing unused mode %u from output %d\n", aPrevMode[iOutputIndex], iOutputIndex); +#ifdef WITH_DISTRO_XRAND_XINERAMA + XRRDeleteOutputMode(x11Context.pDisplay, outputId, aPrevMode[iOutputIndex]); + XRRDestroyMode(x11Context.pDisplay, aPrevMode[iOutputIndex]); +#else + if (x11Context.pXRRDeleteOutputMode) + x11Context.pXRRDeleteOutputMode(x11Context.pDisplay, outputId, aPrevMode[iOutputIndex]); + if (x11Context.pXRRDestroyMode) + x11Context.pXRRDestroyMode(x11Context.pDisplay, aPrevMode[iOutputIndex]); +#endif + /* Forget destroyed mode. */ + aPrevMode[iOutputIndex] = 0; + } + + /* Only cache modes created "by us". XRRDestroyMode will complain if provided mode + * was not created by XRRCreateMode call. */ + if (fNewMode) + aPrevMode[iOutputIndex] = pModeInfo->id; + + if (paOutputs[iOutputIndex].fPrimary) + { +#ifdef WITH_DISTRO_XRAND_XINERAMA + XRRSetOutputPrimary(x11Context.pDisplay, x11Context.rootWindow, outputId); +#else + if (x11Context.pXRRSetOutputPrimary) + x11Context.pXRRSetOutputPrimary(x11Context.pDisplay, x11Context.rootWindow, outputId); +#endif + } + /* Make sure outputs crtc is set. */ pOutputInfo->crtc = pOutputInfo->crtcs[0]; @@ -1312,8 +1450,8 @@ if (x11Context.pXRRGetScreenResources) x11Context.pScreenResources = x11Context.pXRRGetScreenResources(x11Context.pDisplay, x11Context.rootWindow); #endif - x11Context.hOutputCount = x11Context.fWmwareCtrlExtention ? determineOutputCount() : 1; + x11Context.hOutputCount = RT_VALID_PTR(x11Context.pScreenResources) ? determineOutputCount() : 0; if (!x11Context.pScreenResources) { XUngrabServer(x11Context.pDisplay); @@ -1380,7 +1518,10 @@ break; if (!paOutputs[i].fEnabled) continue; - configureOutput(i, paOutputs); + if (configureOutput(i, paOutputs)) + VBClLogInfo("output[%d] successfully configured\n", i); + else + VBClLogError("failed to configure output[%d]\n", i); } XSync(x11Context.pDisplay, False); #ifdef WITH_DISTRO_XRAND_XINERAMA @@ -1475,6 +1616,7 @@ aOutputs[j].width = aMonitors[j].cx; aOutputs[j].height = aMonitors[j].cy; aOutputs[j].fEnabled = !(aMonitors[j].fDisplayFlags & VMMDEV_DISPLAY_DISABLED); + aOutputs[j].fPrimary = (aMonitors[j].fDisplayFlags & VMMDEV_DISPLAY_PRIMARY); if (aOutputs[j].fEnabled) iRunningX += aOutputs[j].width; } diff -Nru virtualbox-hwe-6.1.34-dfsg/src/VBox/Devices/Audio/DevSB16.cpp virtualbox-hwe-6.1.38-dfsg/src/VBox/Devices/Audio/DevSB16.cpp --- virtualbox-hwe-6.1.34-dfsg/src/VBox/Devices/Audio/DevSB16.cpp 2022-03-22 23:40:35.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/src/VBox/Devices/Audio/DevSB16.cpp 2022-09-01 13:23:47.000000000 +0000 @@ -2464,18 +2464,21 @@ pHlp->pfnSSMGetS32(pSSM, &pThis->dsp_in_idx); pHlp->pfnSSMGetS32(pSSM, &pThis->dsp_out_data_len); - rc = pHlp->pfnSSMGetS32(pSSM, &i32Tmp); /* Output stream: Numer of channels. */ + rc = pHlp->pfnSSMGetS32(pSSM, &i32Tmp); /* Output stream: Number of channels. */ AssertRCReturn(rc, rc); - PDMAudioPropsSetChannels(&pStream->Cfg.Props, i32Tmp); + AssertReturn((uint32_t)i32Tmp <= 1, VERR_INVALID_PARAMETER); /* Paranoia. */ + if (i32Tmp) /* PDMAudioPropsSetChannels() will assert if channels are 0 (will be re-set on DMA run command). */ + PDMAudioPropsSetChannels(&pStream->Cfg.Props, (uint8_t)i32Tmp); pHlp->pfnSSMGetS32(pSSM, &i32Tmp); /* Output stream: Signed format bit. */ pStream->Cfg.Props.fSigned = i32Tmp != 0; rc = pHlp->pfnSSMGetS32(pSSM, &i32Tmp); /* Output stream: Sample size in bits. */ AssertRCReturn(rc, rc); - PDMAudioPropsSetSampleSize(&pStream->Cfg.Props, i32Tmp / 8); + if (i32Tmp) /* PDMAudioPropsSetSampleSize() will assert if sample size is 0 (will be re-set on DMA run command). */ + PDMAudioPropsSetSampleSize(&pStream->Cfg.Props, (uint8_t)(i32Tmp / 8)); pHlp->pfnSSMSkip (pSSM, sizeof(int32_t)); /* Legacy; was PDMAUDIOFMT, unused now. */ pHlp->pfnSSMGetS32(pSSM, &pStream->dma_auto); - pHlp->pfnSSMGetS32(pSSM, &pThis->aStreams[SB16_IDX_OUT].cbDmaBlockSize); + pHlp->pfnSSMGetS32(pSSM, &pStream->cbDmaBlockSize); pHlp->pfnSSMGetS32(pSSM, &pStream->fifo); pHlp->pfnSSMGetS32(pSSM, &i32Tmp); pStream->Cfg.Props.uHz = i32Tmp; pHlp->pfnSSMGetS32(pSSM, &pStream->time_const); @@ -2517,7 +2520,12 @@ AssertRCReturn(rc, rc); if (fStreamEnabled) + { + /* Sanity: If stream is going be enabled, PCM props must be valid. Otherwise the saved state is borked somehow. */ + AssertMsgReturn(AudioHlpPcmPropsAreValid(&pStream->Cfg.Props), + ("PCM properties for stream #%RU8 are invalid\n", pStream->uIdx), VERR_SSM_DATA_UNIT_FORMAT_CHANGED); sb16StreamControl(pDevIns, pThis, pStream, true /* fRun */); + } /* Update the master (mixer) and PCM out volumes. */ sb16UpdateVolume(pThis); Binary files /tmp/tmpf0d0r25a/mI3UAcA4FD/virtualbox-hwe-6.1.34-dfsg/src/VBox/Devices/EFI/FirmwareBin/VBoxEFI32.fd and /tmp/tmpf0d0r25a/pQ8IruulI3/virtualbox-hwe-6.1.38-dfsg/src/VBox/Devices/EFI/FirmwareBin/VBoxEFI32.fd differ Binary files /tmp/tmpf0d0r25a/mI3UAcA4FD/virtualbox-hwe-6.1.34-dfsg/src/VBox/Devices/EFI/FirmwareBin/VBoxEFI64.fd and /tmp/tmpf0d0r25a/pQ8IruulI3/virtualbox-hwe-6.1.38-dfsg/src/VBox/Devices/EFI/FirmwareBin/VBoxEFI64.fd differ diff -Nru virtualbox-hwe-6.1.34-dfsg/src/VBox/Devices/Graphics/BIOS/VBoxVgaBiosAlternative286.asm virtualbox-hwe-6.1.38-dfsg/src/VBox/Devices/Graphics/BIOS/VBoxVgaBiosAlternative286.asm --- virtualbox-hwe-6.1.34-dfsg/src/VBox/Devices/Graphics/BIOS/VBoxVgaBiosAlternative286.asm 2022-03-22 23:42:42.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/src/VBox/Devices/Graphics/BIOS/VBoxVgaBiosAlternative286.asm 2022-09-01 13:26:05.000000000 +0000 @@ -8036,7 +8036,7 @@ section _DATA progbits vstart=0x4780 align=1 ; size=0x3727 class=DATA group=DGROUP ; disGetNextSymbol 0xc4780 LB 0x3727 -> off=0x0 cb=000000000000002f uValue=00000000000c0000 '_msg_vga_init' _msg_vga_init: ; 0xc4780 LB 0x2f - db 'Oracle VM VirtualBox Version 6.1.34 VGA BIOS', 00dh, 00ah, 000h + db 'Oracle VM VirtualBox Version 6.1.38 VGA BIOS', 00dh, 00ah, 000h ; disGetNextSymbol 0xc47af LB 0x36f8 -> off=0x0 cb=0000000000000080 uValue=00000000000c002f 'vga_modes' vga_modes: ; 0xc47af LB 0x80 db 000h, 000h, 000h, 004h, 000h, 0b8h, 0ffh, 002h, 001h, 000h, 000h, 004h, 000h, 0b8h, 0ffh, 002h @@ -8955,7 +8955,7 @@ db 'Oracle VM VirtualBox VBE Adapter', 000h ; disGetNextSymbol 0xc7e2f LB 0x78 -> off=0x0 cb=0000000000000024 uValue=00000000000c36af '_vbebios_product_revision' _vbebios_product_revision: ; 0xc7e2f LB 0x24 - db 'Oracle VM VirtualBox Version 6.1.34', 000h + db 'Oracle VM VirtualBox Version 6.1.38', 000h ; disGetNextSymbol 0xc7e53 LB 0x54 -> off=0x0 cb=000000000000002b uValue=00000000000c36d3 '_vbebios_info_string' _vbebios_info_string: ; 0xc7e53 LB 0x2b db 'VirtualBox VBE Display Adapter enabled', 00dh, 00ah, 00dh, 00ah, 000h @@ -8973,13 +8973,12 @@ ; Padding 0x158 bytes at 0xc7ea8 db 000h, 000h, 000h, 000h, 001h, 000h, 000h, 000h, 000h, 000h, 000h, 02fh, 068h, 06fh, 06dh, 065h db 02fh, 067h, 061h, 06ch, 069h, 074h, 073h, 079h, 06eh, 02fh, 063h, 06fh, 06dh, 070h, 069h, 06ch - db 065h, 02dh, 063h, 061h, 063h, 068h, 065h, 02fh, 076h, 062h, 06fh, 078h, 02dh, 072h, 065h, 06ch - db 065h, 061h, 073h, 065h, 02fh, 062h, 072h, 061h, 06eh, 063h, 068h, 065h, 073h, 02fh, 056h, 042h - db 06fh, 078h, 02dh, 036h, 02eh, 031h, 02fh, 06fh, 075h, 074h, 02fh, 06ch, 069h, 06eh, 075h, 078h - db 02eh, 061h, 06dh, 064h, 036h, 034h, 02fh, 072h, 065h, 06ch, 065h, 061h, 073h, 065h, 02fh, 06fh - db 062h, 06ah, 02fh, 056h, 042h, 06fh, 078h, 056h, 067h, 061h, 042h, 069h, 06fh, 073h, 032h, 038h - db 036h, 02fh, 056h, 042h, 06fh, 078h, 056h, 067h, 061h, 042h, 069h, 06fh, 073h, 032h, 038h, 036h - db 02eh, 073h, 079h, 06dh, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h + db 065h, 02dh, 063h, 061h, 063h, 068h, 065h, 02fh, 076h, 062h, 06fh, 078h, 02fh, 062h, 072h, 061h + db 06eh, 063h, 068h, 065h, 073h, 02fh, 056h, 042h, 06fh, 078h, 02dh, 036h, 02eh, 031h, 02fh, 06fh + db 075h, 074h, 02fh, 06ch, 069h, 06eh, 075h, 078h, 02eh, 061h, 06dh, 064h, 036h, 034h, 02fh, 072h + db 065h, 06ch, 065h, 061h, 073h, 065h, 02fh, 06fh, 062h, 06ah, 02fh, 056h, 042h, 06fh, 078h, 056h + db 067h, 061h, 042h, 069h, 06fh, 073h, 032h, 038h, 036h, 02fh, 056h, 042h, 06fh, 078h, 056h, 067h + db 061h, 042h, 069h, 06fh, 073h, 032h, 038h, 036h, 02eh, 073h, 079h, 06dh, 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, 000h @@ -8992,4 +8991,5 @@ 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, 00ah + 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, 010h diff -Nru virtualbox-hwe-6.1.34-dfsg/src/VBox/Devices/Graphics/BIOS/VBoxVgaBiosAlternative286.md5sum virtualbox-hwe-6.1.38-dfsg/src/VBox/Devices/Graphics/BIOS/VBoxVgaBiosAlternative286.md5sum --- virtualbox-hwe-6.1.34-dfsg/src/VBox/Devices/Graphics/BIOS/VBoxVgaBiosAlternative286.md5sum 2022-03-22 23:42:42.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/src/VBox/Devices/Graphics/BIOS/VBoxVgaBiosAlternative286.md5sum 2022-09-01 13:26:05.000000000 +0000 @@ -1 +1 @@ -1e56cfd41ad0f31e352d8a86b52ee72a *VBoxVgaBios286.rom +5185614d1cb50785b9e746181fb9058a *VBoxVgaBios286.rom diff -Nru virtualbox-hwe-6.1.34-dfsg/src/VBox/Devices/Graphics/BIOS/VBoxVgaBiosAlternative386.asm virtualbox-hwe-6.1.38-dfsg/src/VBox/Devices/Graphics/BIOS/VBoxVgaBiosAlternative386.asm --- virtualbox-hwe-6.1.34-dfsg/src/VBox/Devices/Graphics/BIOS/VBoxVgaBiosAlternative386.asm 2022-03-22 23:42:42.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/src/VBox/Devices/Graphics/BIOS/VBoxVgaBiosAlternative386.asm 2022-09-01 13:26:05.000000000 +0000 @@ -7507,7 +7507,7 @@ section _DATA progbits vstart=0x4780 align=1 ; size=0x3727 class=DATA group=DGROUP ; disGetNextSymbol 0xc4780 LB 0x3727 -> off=0x0 cb=000000000000002f uValue=00000000000c0000 '_msg_vga_init' _msg_vga_init: ; 0xc4780 LB 0x2f - db 'Oracle VM VirtualBox Version 6.1.34 VGA BIOS', 00dh, 00ah, 000h + db 'Oracle VM VirtualBox Version 6.1.38 VGA BIOS', 00dh, 00ah, 000h ; disGetNextSymbol 0xc47af LB 0x36f8 -> off=0x0 cb=0000000000000080 uValue=00000000000c002f 'vga_modes' vga_modes: ; 0xc47af LB 0x80 db 000h, 000h, 000h, 004h, 000h, 0b8h, 0ffh, 002h, 001h, 000h, 000h, 004h, 000h, 0b8h, 0ffh, 002h @@ -8426,7 +8426,7 @@ db 'Oracle VM VirtualBox VBE Adapter', 000h ; disGetNextSymbol 0xc7e2f LB 0x78 -> off=0x0 cb=0000000000000024 uValue=00000000000c36af '_vbebios_product_revision' _vbebios_product_revision: ; 0xc7e2f LB 0x24 - db 'Oracle VM VirtualBox Version 6.1.34', 000h + db 'Oracle VM VirtualBox Version 6.1.38', 000h ; disGetNextSymbol 0xc7e53 LB 0x54 -> off=0x0 cb=000000000000002b uValue=00000000000c36d3 '_vbebios_info_string' _vbebios_info_string: ; 0xc7e53 LB 0x2b db 'VirtualBox VBE Display Adapter enabled', 00dh, 00ah, 00dh, 00ah, 000h @@ -8444,13 +8444,12 @@ ; Padding 0x158 bytes at 0xc7ea8 db 000h, 000h, 000h, 000h, 001h, 000h, 000h, 000h, 000h, 000h, 000h, 02fh, 068h, 06fh, 06dh, 065h db 02fh, 067h, 061h, 06ch, 069h, 074h, 073h, 079h, 06eh, 02fh, 063h, 06fh, 06dh, 070h, 069h, 06ch - db 065h, 02dh, 063h, 061h, 063h, 068h, 065h, 02fh, 076h, 062h, 06fh, 078h, 02dh, 072h, 065h, 06ch - db 065h, 061h, 073h, 065h, 02fh, 062h, 072h, 061h, 06eh, 063h, 068h, 065h, 073h, 02fh, 056h, 042h - db 06fh, 078h, 02dh, 036h, 02eh, 031h, 02fh, 06fh, 075h, 074h, 02fh, 06ch, 069h, 06eh, 075h, 078h - db 02eh, 061h, 06dh, 064h, 036h, 034h, 02fh, 072h, 065h, 06ch, 065h, 061h, 073h, 065h, 02fh, 06fh - db 062h, 06ah, 02fh, 056h, 042h, 06fh, 078h, 056h, 067h, 061h, 042h, 069h, 06fh, 073h, 033h, 038h - db 036h, 02fh, 056h, 042h, 06fh, 078h, 056h, 067h, 061h, 042h, 069h, 06fh, 073h, 033h, 038h, 036h - db 02eh, 073h, 079h, 06dh, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h + db 065h, 02dh, 063h, 061h, 063h, 068h, 065h, 02fh, 076h, 062h, 06fh, 078h, 02fh, 062h, 072h, 061h + db 06eh, 063h, 068h, 065h, 073h, 02fh, 056h, 042h, 06fh, 078h, 02dh, 036h, 02eh, 031h, 02fh, 06fh + db 075h, 074h, 02fh, 06ch, 069h, 06eh, 075h, 078h, 02eh, 061h, 06dh, 064h, 036h, 034h, 02fh, 072h + db 065h, 06ch, 065h, 061h, 073h, 065h, 02fh, 06fh, 062h, 06ah, 02fh, 056h, 042h, 06fh, 078h, 056h + db 067h, 061h, 042h, 069h, 06fh, 073h, 033h, 038h, 036h, 02fh, 056h, 042h, 06fh, 078h, 056h, 067h + db 061h, 042h, 069h, 06fh, 073h, 033h, 038h, 036h, 02eh, 073h, 079h, 06dh, 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, 000h @@ -8463,4 +8462,5 @@ 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, 092h + 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, 098h diff -Nru virtualbox-hwe-6.1.34-dfsg/src/VBox/Devices/Graphics/BIOS/VBoxVgaBiosAlternative386.md5sum virtualbox-hwe-6.1.38-dfsg/src/VBox/Devices/Graphics/BIOS/VBoxVgaBiosAlternative386.md5sum --- virtualbox-hwe-6.1.34-dfsg/src/VBox/Devices/Graphics/BIOS/VBoxVgaBiosAlternative386.md5sum 2022-03-22 23:42:42.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/src/VBox/Devices/Graphics/BIOS/VBoxVgaBiosAlternative386.md5sum 2022-09-01 13:26:05.000000000 +0000 @@ -1 +1 @@ -e869c929d4a8b77a10728333b0b69c9f *VBoxVgaBios386.rom +3f0ac62ea5424bbc83c73349dad36dea *VBoxVgaBios386.rom diff -Nru virtualbox-hwe-6.1.34-dfsg/src/VBox/Devices/Graphics/BIOS/VBoxVgaBiosAlternative8086.asm virtualbox-hwe-6.1.38-dfsg/src/VBox/Devices/Graphics/BIOS/VBoxVgaBiosAlternative8086.asm --- virtualbox-hwe-6.1.34-dfsg/src/VBox/Devices/Graphics/BIOS/VBoxVgaBiosAlternative8086.asm 2022-03-22 23:42:42.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/src/VBox/Devices/Graphics/BIOS/VBoxVgaBiosAlternative8086.asm 2022-09-01 13:26:05.000000000 +0000 @@ -8196,7 +8196,7 @@ section _DATA progbits vstart=0x4780 align=1 ; size=0x3727 class=DATA group=DGROUP ; disGetNextSymbol 0xc4780 LB 0x3727 -> off=0x0 cb=000000000000002f uValue=00000000000c0000 '_msg_vga_init' _msg_vga_init: ; 0xc4780 LB 0x2f - db 'Oracle VM VirtualBox Version 6.1.34 VGA BIOS', 00dh, 00ah, 000h + db 'Oracle VM VirtualBox Version 6.1.38 VGA BIOS', 00dh, 00ah, 000h ; disGetNextSymbol 0xc47af LB 0x36f8 -> off=0x0 cb=0000000000000080 uValue=00000000000c002f 'vga_modes' vga_modes: ; 0xc47af LB 0x80 db 000h, 000h, 000h, 004h, 000h, 0b8h, 0ffh, 002h, 001h, 000h, 000h, 004h, 000h, 0b8h, 0ffh, 002h @@ -9115,7 +9115,7 @@ db 'Oracle VM VirtualBox VBE Adapter', 000h ; disGetNextSymbol 0xc7e2f LB 0x78 -> off=0x0 cb=0000000000000024 uValue=00000000000c36af '_vbebios_product_revision' _vbebios_product_revision: ; 0xc7e2f LB 0x24 - db 'Oracle VM VirtualBox Version 6.1.34', 000h + db 'Oracle VM VirtualBox Version 6.1.38', 000h ; disGetNextSymbol 0xc7e53 LB 0x54 -> off=0x0 cb=000000000000002b uValue=00000000000c36d3 '_vbebios_info_string' _vbebios_info_string: ; 0xc7e53 LB 0x2b db 'VirtualBox VBE Display Adapter enabled', 00dh, 00ah, 00dh, 00ah, 000h @@ -9133,13 +9133,12 @@ ; Padding 0x158 bytes at 0xc7ea8 db 000h, 000h, 000h, 000h, 001h, 000h, 000h, 000h, 000h, 000h, 000h, 02fh, 068h, 06fh, 06dh, 065h db 02fh, 067h, 061h, 06ch, 069h, 074h, 073h, 079h, 06eh, 02fh, 063h, 06fh, 06dh, 070h, 069h, 06ch - db 065h, 02dh, 063h, 061h, 063h, 068h, 065h, 02fh, 076h, 062h, 06fh, 078h, 02dh, 072h, 065h, 06ch - db 065h, 061h, 073h, 065h, 02fh, 062h, 072h, 061h, 06eh, 063h, 068h, 065h, 073h, 02fh, 056h, 042h - db 06fh, 078h, 02dh, 036h, 02eh, 031h, 02fh, 06fh, 075h, 074h, 02fh, 06ch, 069h, 06eh, 075h, 078h - db 02eh, 061h, 06dh, 064h, 036h, 034h, 02fh, 072h, 065h, 06ch, 065h, 061h, 073h, 065h, 02fh, 06fh - db 062h, 06ah, 02fh, 056h, 042h, 06fh, 078h, 056h, 067h, 061h, 042h, 069h, 06fh, 073h, 038h, 030h - db 038h, 036h, 02fh, 056h, 042h, 06fh, 078h, 056h, 067h, 061h, 042h, 069h, 06fh, 073h, 038h, 030h - db 038h, 036h, 02eh, 073h, 079h, 06dh, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h + db 065h, 02dh, 063h, 061h, 063h, 068h, 065h, 02fh, 076h, 062h, 06fh, 078h, 02fh, 062h, 072h, 061h + db 06eh, 063h, 068h, 065h, 073h, 02fh, 056h, 042h, 06fh, 078h, 02dh, 036h, 02eh, 031h, 02fh, 06fh + db 075h, 074h, 02fh, 06ch, 069h, 06eh, 075h, 078h, 02eh, 061h, 06dh, 064h, 036h, 034h, 02fh, 072h + db 065h, 06ch, 065h, 061h, 073h, 065h, 02fh, 06fh, 062h, 06ah, 02fh, 056h, 042h, 06fh, 078h, 056h + db 067h, 061h, 042h, 069h, 06fh, 073h, 038h, 030h, 038h, 036h, 02fh, 056h, 042h, 06fh, 078h, 056h + db 067h, 061h, 042h, 069h, 06fh, 073h, 038h, 030h, 038h, 036h, 02eh, 073h, 079h, 06dh, 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, 000h @@ -9152,4 +9151,5 @@ 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, 07fh + 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, 085h diff -Nru virtualbox-hwe-6.1.34-dfsg/src/VBox/Devices/Graphics/BIOS/VBoxVgaBiosAlternative8086.md5sum virtualbox-hwe-6.1.38-dfsg/src/VBox/Devices/Graphics/BIOS/VBoxVgaBiosAlternative8086.md5sum --- virtualbox-hwe-6.1.34-dfsg/src/VBox/Devices/Graphics/BIOS/VBoxVgaBiosAlternative8086.md5sum 2022-03-22 23:42:42.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/src/VBox/Devices/Graphics/BIOS/VBoxVgaBiosAlternative8086.md5sum 2022-09-01 13:26:05.000000000 +0000 @@ -1 +1 @@ -970b398262f95a2e18ca380c7a3a9fb5 *VBoxVgaBios8086.rom +c315e962c1d0b9f5f4a9ad662005f71d *VBoxVgaBios8086.rom diff -Nru virtualbox-hwe-6.1.34-dfsg/src/VBox/Devices/Graphics/DevVGA.cpp virtualbox-hwe-6.1.38-dfsg/src/VBox/Devices/Graphics/DevVGA.cpp --- virtualbox-hwe-6.1.34-dfsg/src/VBox/Devices/Graphics/DevVGA.cpp 2022-03-22 23:42:43.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/src/VBox/Devices/Graphics/DevVGA.cpp 2022-09-01 13:26:06.000000000 +0000 @@ -390,6 +390,44 @@ /** + * Mark a page in VGA A0000-AFFFF range as remapped. + * + * @param pThis VGA instance data. + * @param offVGAMem The offset within VGA memory. + */ +DECLINLINE(void) vgaMarkRemapped(PVGASTATE pThis, RTGCPHYS offVGAMem) +{ + AssertMsg(offVGAMem < _64K, ("offVGAMem = %p > 64K\n", offVGAMem)); + ASMBitSet(&pThis->bmPageMapBitmap, offVGAMem >> PAGE_SHIFT); + pThis->fRemappedVGA = true; +} + +/** + * Checks if a page in VGA A0000-AFFFF range is remapped. + * + * @returns true if remapped. + * @returns false if not remapped (accesses will trap). + * @param pThis VGA instance data. + * @param offVGAMem The offset within VGA memory. + */ +DECLINLINE(bool) vgaIsRemapped(PVGASTATE pThis, RTGCPHYS offVGAMem) +{ + AssertMsg(offVGAMem < _64K, ("offVGAMem = %p > 64K\n", offVGAMem)); + return ASMBitTest(&pThis->bmPageMapBitmap, offVGAMem >> PAGE_SHIFT); +} + +/** + * Reset page remap tracking bits. + * + * @param pThis VGA instance data. + */ +DECLINLINE(void) vgaResetRemapped(PVGASTATE pThis) +{ + pThis->fRemappedVGA = false; + ASMBitClearRange(&pThis->bmPageMapBitmap, 0, _64K >> PAGE_SHIFT); +} + +/** * Set a VRAM page dirty. * * @param pThis VGA instance data. @@ -402,6 +440,8 @@ pThis->fHasDirtyBits = true; } +#ifdef IN_RING3 + /** * Tests if a VRAM page is dirty. * @@ -410,13 +450,12 @@ * @param pThis VGA instance data. * @param offVRAM The VRAM offset of the page to check. */ -DECLINLINE(bool) vgaIsDirty(PVGASTATE pThis, RTGCPHYS offVRAM) +DECLINLINE(bool) vgaR3IsDirty(PVGASTATE pThis, RTGCPHYS offVRAM) { AssertMsg(offVRAM < pThis->vram_size, ("offVRAM = %p, pThis->vram_size = %p\n", offVRAM, pThis->vram_size)); return ASMBitTest(&pThis->bmDirtyBitmap[0], offVRAM >> PAGE_SHIFT); } -#ifdef IN_RING3 /** * Reset dirty flags in a give range. @@ -788,7 +827,8 @@ if (pThis->fRemappedVGA) { IOMMmioResetRegion(PDMDevHlpGetVM(pDevIns), pDevIns, pThis->hMmioLegacy); - pThis->fRemappedVGA = false; + STAM_COUNTER_INC(&pThis->StatMapReset); + vgaResetRemapped(pThis); } } #endif @@ -827,7 +867,8 @@ if (pThis->fRemappedVGA) { IOMMmioResetRegion(PDMDevHlpGetVM(pDevIns), pDevIns, pThis->hMmioLegacy); - pThis->fRemappedVGA = false; + STAM_COUNTER_INC(&pThis->StatMapReset); + vgaResetRemapped(pThis); } } #endif @@ -1084,7 +1125,8 @@ if (pThis->fRemappedVGA) { IOMMmioResetRegion(PDMDevHlpGetVM(pDevIns), pDevIns, pThis->hMmioLegacy); - pThis->fRemappedVGA = false; + STAM_COUNTER_INC(&pThis->StatMapReset); + vgaResetRemapped(pThis); } # endif break; @@ -1193,7 +1235,8 @@ if (pThis->fRemappedVGA) { IOMMmioResetRegion(PDMDevHlpGetVM(pDevIns), pDevIns, pThis->hMmioLegacy); - pThis->fRemappedVGA = false; + STAM_COUNTER_INC(&pThis->StatMapReset); + vgaResetRemapped(pThis); } break; } @@ -1288,7 +1331,7 @@ #ifndef IN_RC /* If all planes are accessible, then map the page to the frame buffer and make it writable. */ if ( (pThis->sr[2] & 3) == 3 - && !vgaIsDirty(pThis, addr) + && !vgaIsRemapped(pThis, GCPhys - 0xa0000) && pThis->GCPhysVRAM) { /** @todo only allow read access (doesn't work now) */ @@ -1297,7 +1340,7 @@ pThis->hMmio2VRam, addr, X86_PTE_RW | X86_PTE_P); /* Set as dirty as write accesses won't be noticed now. */ vgaR3MarkDirty(pThis, addr); - pThis->fRemappedVGA = true; + vgaMarkRemapped(pThis, GCPhys - 0xa0000); } #endif /* !IN_RC */ VERIFY_VRAM_READ_OFF_RETURN(pThis, addr, *prc); @@ -1397,13 +1440,13 @@ #ifndef IN_RC /* If all planes are accessible, then map the page to the frame buffer and make it writable. */ if ( (pThis->sr[2] & 3) == 3 - && !vgaIsDirty(pThis, addr) + && !vgaIsRemapped(pThis, GCPhys - 0xa0000) && pThis->GCPhysVRAM) { STAM_COUNTER_INC(&pThis->StatMapPage); IOMMmioMapMmio2Page(PDMDevHlpGetVM(pDevIns), pDevIns, pThis->hMmioLegacy, GCPhys - 0xa0000, pThis->hMmio2VRam, addr, X86_PTE_RW | X86_PTE_P); - pThis->fRemappedVGA = true; + vgaMarkRemapped(pThis, GCPhys - 0xa0000); } #endif /* !IN_RC */ @@ -2351,10 +2394,10 @@ * irrespective of alignment. Not guaranteed for high res modes, i.e. * anything wider than 2050 pixels @32bpp. Need to check all pages * between the first and last one. */ - bool fUpdate = fFullUpdate | vgaIsDirty(pThis, offPage0) | vgaIsDirty(pThis, offPage1); + bool fUpdate = fFullUpdate | vgaR3IsDirty(pThis, offPage0) | vgaR3IsDirty(pThis, offPage1); if (offPage1 - offPage0 > PAGE_SIZE) /* if wide line, can use another page */ - fUpdate |= vgaIsDirty(pThis, offPage0 + PAGE_SIZE); + fUpdate |= vgaR3IsDirty(pThis, offPage0 + PAGE_SIZE); /* explicit invalidation for the hardware cursor */ fUpdate |= (pThis->invalidated_y_table[y >> 5] >> (y & 0x1f)) & 1; if (fUpdate) @@ -2550,10 +2593,10 @@ * irrespective of alignment. Not guaranteed for high res modes, i.e. * anything wider than 2050 pixels @32bpp. Need to check all pages * between the first and last one. */ - bool update = full_update | vgaIsDirty(pThis, page0) | vgaIsDirty(pThis, page1); + bool update = full_update | vgaR3IsDirty(pThis, page0) | vgaR3IsDirty(pThis, page1); if (page1 - page0 > PAGE_SIZE) { /* if wide line, can use another page */ - update |= vgaIsDirty(pThis, page0 + PAGE_SIZE); + update |= vgaR3IsDirty(pThis, page0 + PAGE_SIZE); } /* explicit invalidation for the hardware cursor */ update |= (pThis->invalidated_y_table[y >> 5] >> (y & 0x1f)) & 1; @@ -4693,6 +4736,7 @@ pHlp->pfnPrintf(pHlp, " Linear scanline pitch: 0x%04x\n", pThis->vbe_line_offset); pHlp->pfnPrintf(pHlp, " Linear display start : 0x%04x\n", pThis->vbe_start_addr); pHlp->pfnPrintf(pHlp, " Selected bank: 0x%04x\n", pThis->vbe_regs[VBE_DISPI_INDEX_BANK]); + pHlp->pfnPrintf(pHlp, " DAC: %d-bit\n", pThis->vbe_regs[VBE_DISPI_INDEX_ENABLE] & VBE_DISPI_8BIT_DAC ? 8 : 6); } } @@ -4847,7 +4891,8 @@ if (pThis->fRemappedVGA) { IOMMmioResetRegion(PDMDevHlpGetVM(pDevIns), pDevIns, pThis->hMmioLegacy); - pThis->fRemappedVGA = false; + STAM_COUNTER_INC(&pThis->StatMapReset); + vgaResetRemapped(pThis); } rc = vgaR3UpdateDisplay(pDevIns, pThis, pThisCC, false /*fUpdateAll*/, false /*fFailOnResize*/, true /*reset_dirty*/, @@ -4875,7 +4920,8 @@ if (pThis->fRemappedVGA) { IOMMmioResetRegion(PDMDevHlpGetVM(pDevIns), pDevIns, pThis->hMmioLegacy); - pThis->fRemappedVGA = false; + STAM_COUNTER_INC(&pThis->StatMapReset); + vgaResetRemapped(pThis); } pThis->graphic_mode = -1; /* force full update */ @@ -6092,7 +6138,8 @@ if (pThis->fRemappedVGA) { IOMMmioResetRegion(PDMDevHlpGetVM(pDevIns), pDevIns, pThis->hMmioLegacy); - pThis->fRemappedVGA = false; + STAM_COUNTER_INC(&pThis->StatMapReset); + vgaResetRemapped(pThis); } /* @@ -7251,6 +7298,7 @@ PDMDevHlpSTAMRegister(pDevIns, &pThis->StatRZMemoryWrite, STAMTYPE_PROFILE, "RZ/MMIO-Write", STAMUNIT_TICKS_PER_CALL, "Profiling of the VGAGCMemoryWrite() body."); PDMDevHlpSTAMRegister(pDevIns, &pThis->StatR3MemoryWrite, STAMTYPE_PROFILE, "R3/MMIO-Write", STAMUNIT_TICKS_PER_CALL, "Profiling of the VGAGCMemoryWrite() body."); PDMDevHlpSTAMRegister(pDevIns, &pThis->StatMapPage, STAMTYPE_COUNTER, "MapPageCalls", STAMUNIT_OCCURENCES, "Calls to IOMMmioMapMmio2Page."); + PDMDevHlpSTAMRegister(pDevIns, &pThis->StatMapReset, STAMTYPE_COUNTER, "MapPageReset", STAMUNIT_OCCURENCES, "Calls to IOMMmioResetRegion."); PDMDevHlpSTAMRegister(pDevIns, &pThis->StatUpdateDisp, STAMTYPE_COUNTER, "UpdateDisplay", STAMUNIT_OCCURENCES, "Calls to vgaR3PortUpdateDisplay()."); # endif # ifdef VBOX_WITH_HGSMI diff -Nru virtualbox-hwe-6.1.34-dfsg/src/VBox/Devices/Graphics/DevVGA.h virtualbox-hwe-6.1.38-dfsg/src/VBox/Devices/Graphics/DevVGA.h --- virtualbox-hwe-6.1.34-dfsg/src/VBox/Devices/Graphics/DevVGA.h 2022-03-22 23:42:43.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/src/VBox/Devices/Graphics/DevVGA.h 2022-09-01 13:26:06.000000000 +0000 @@ -350,6 +350,8 @@ uint32_t cMilliesRefreshInterval; /** Bitmap tracking dirty pages. */ uint64_t bmDirtyBitmap[VGA_VRAM_MAX / PAGE_SIZE / 64]; + /** Bitmap tracking remapped pages (only needs 16 bits). */ + uint64_t bmPageMapBitmap; /** Flag indicating that there are dirty bits. This is used to optimize the handler resetting. */ bool fHasDirtyBits; @@ -507,7 +509,8 @@ STAMPROFILE StatR3MemoryRead; STAMPROFILE StatRZMemoryWrite; STAMPROFILE StatR3MemoryWrite; - STAMCOUNTER StatMapPage; /**< Counts IOMMMIOMapMMIO2Page calls. */ + STAMCOUNTER StatMapPage; /**< Counts IOMMmioMapMmio2Page calls. */ + STAMCOUNTER StatMapReset; /**< Counts IOMMmioResetRegion calls. */ STAMCOUNTER StatUpdateDisp; /**< Counts vgaPortUpdateDisplay calls. */ #ifdef VBOX_WITH_HGSMI STAMCOUNTER StatHgsmiMdaCgaAccesses; @@ -522,6 +525,7 @@ AssertCompileMemberAlignment(VGASTATE, font_offsets, 8); AssertCompileMemberAlignment(VGASTATE, last_ch_attr, 8); AssertCompileMemberAlignment(VGASTATE, u32Marker, 8); +AssertCompile(sizeof(uint64_t)/*bmPageMapBitmap*/ >= (_64K / PAGE_SIZE / 8)); #endif diff -Nru virtualbox-hwe-6.1.34-dfsg/src/VBox/Devices/Graphics/DevVGA-SVGA3d-win.cpp virtualbox-hwe-6.1.38-dfsg/src/VBox/Devices/Graphics/DevVGA-SVGA3d-win.cpp --- virtualbox-hwe-6.1.34-dfsg/src/VBox/Devices/Graphics/DevVGA-SVGA3d-win.cpp 2022-03-22 23:42:43.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/src/VBox/Devices/Graphics/DevVGA-SVGA3d-win.cpp 2022-09-01 13:26:06.000000000 +0000 @@ -1516,8 +1516,13 @@ AssertRCReturn(rc, rc); } - Assert(pSurfaceSrc->enmD3DResType != VMSVGA3D_D3DRESTYPE_VOLUME_TEXTURE); /// @todo - Assert(pSurfaceDest->enmD3DResType != VMSVGA3D_D3DRESTYPE_VOLUME_TEXTURE); /// @todo + AssertReturn(pSurfaceSrc->enmD3DResType != VMSVGA3D_D3DRESTYPE_VOLUME_TEXTURE, VERR_NOT_IMPLEMENTED); /// @todo + AssertReturn(pSurfaceDest->enmD3DResType != VMSVGA3D_D3DRESTYPE_VOLUME_TEXTURE, VERR_NOT_IMPLEMENTED); /// @todo + + /* Surface copy only makes sense between surfaces with identical layout. */ + AssertReturn(pSurfaceSrc->cbBlock == pSurfaceDest->cbBlock, VERR_INVALID_PARAMETER); + AssertReturn(pSurfaceSrc->cxBlock == pSurfaceDest->cxBlock, VERR_INVALID_PARAMETER); + AssertReturn(pSurfaceSrc->cyBlock == pSurfaceDest->cyBlock, VERR_INVALID_PARAMETER); if ( pSurfaceSrc->u.pSurface && pSurfaceDest->u.pSurface) @@ -1728,9 +1733,6 @@ sidDest, dest.face, dest.mipmap, pBox[i].x, pBox[i].y)); Assert(!clipBox.srcz && !clipBox.z); - Assert(pSurfaceSrc->cbBlock == pSurfaceDest->cbBlock); - Assert(pSurfaceSrc->cxBlock == pSurfaceDest->cxBlock); - Assert(pSurfaceSrc->cyBlock == pSurfaceDest->cyBlock); uint32_t cBlocksX = (clipBox.w + pSurfaceSrc->cxBlock - 1) / pSurfaceSrc->cxBlock; uint32_t cBlocksY = (clipBox.h + pSurfaceSrc->cyBlock - 1) / pSurfaceSrc->cyBlock; diff -Nru virtualbox-hwe-6.1.34-dfsg/src/VBox/Devices/Network/DevVirtioNet_1_0.cpp virtualbox-hwe-6.1.38-dfsg/src/VBox/Devices/Network/DevVirtioNet_1_0.cpp --- virtualbox-hwe-6.1.34-dfsg/src/VBox/Devices/Network/DevVirtioNet_1_0.cpp 2022-03-22 23:43:01.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/src/VBox/Devices/Network/DevVirtioNet_1_0.cpp 2022-09-01 13:26:25.000000000 +0000 @@ -1431,6 +1431,9 @@ pGso->offHdr1 = sizeof(RTNETETHERHDR); pGso->cbHdrsTotal = pPktHdr->uHdrLen; pGso->cbMaxSeg = pPktHdr->uGsoSize; + /* Mark GSO frames with zero MSS as PDMNETWORKGSOTYPE_INVALID, so they will be ignored by send. */ + if (pPktHdr->uGsoType != VIRTIONET_HDR_GSO_NONE && pPktHdr->uGsoSize == 0) + pGso->u8Type = PDMNETWORKGSOTYPE_INVALID; return pGso; } @@ -2250,6 +2253,9 @@ ((PPDMNETWORKGSO)pSgBuf->pvUser)->cbHdrsSeg = pGso->cbHdrsSeg; Log4Func(("%s adjusted HdrLen to %d.\n", pThis->szInst, pGso->cbHdrsTotal)); + case PDMNETWORKGSOTYPE_INVALID: + LogFunc(("%s ignoring invalid GSO frame\n", pThis->szInst)); + return VERR_INVALID_PARAMETER; } Log2Func(("%s gso type=%x cbHdrsTotal=%u cbHdrsSeg=%u mss=%u off1=0x%x off2=0x%x\n", pThis->szInst, pGso->u8Type, pGso->cbHdrsTotal, pGso->cbHdrsSeg, diff -Nru virtualbox-hwe-6.1.34-dfsg/src/VBox/Devices/Network/DevVirtioNet.cpp virtualbox-hwe-6.1.38-dfsg/src/VBox/Devices/Network/DevVirtioNet.cpp --- virtualbox-hwe-6.1.34-dfsg/src/VBox/Devices/Network/DevVirtioNet.cpp 2022-03-22 23:43:01.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/src/VBox/Devices/Network/DevVirtioNet.cpp 2022-09-01 13:26:25.000000000 +0000 @@ -1229,6 +1229,9 @@ pGso->offHdr1 = sizeof(RTNETETHERHDR); pGso->cbHdrsTotal = pHdr->u16HdrLen; pGso->cbMaxSeg = pHdr->u16GSOSize; + /* Mark GSO frames with zero MSS as PDMNETWORKGSOTYPE_INVALID, so they will be ignored by send. */ + if (pHdr->u8GSOType != VNETHDR_GSO_NONE && pHdr->u16GSOSize == 0) + pGso->u8Type = PDMNETWORKGSOTYPE_INVALID; return pGso; } @@ -1328,6 +1331,9 @@ pGso->cbHdrsTotal = (uint8_t)(pHdr->u16CSumStart + sizeof(RTNETUDP)); pGso->cbHdrsSeg = pHdr->u16CSumStart; break; + case PDMNETWORKGSOTYPE_INVALID: + LogFunc(("%s ignoring invalid GSO frame\n", INSTANCE(pThis))); + return VERR_INVALID_PARAMETER; } /* Update GSO structure embedded into the frame */ ((PPDMNETWORKGSO)pSgBuf->pvUser)->cbHdrsTotal = pGso->cbHdrsTotal; diff -Nru virtualbox-hwe-6.1.34-dfsg/src/VBox/Devices/Network/slirp/hostres.c virtualbox-hwe-6.1.38-dfsg/src/VBox/Devices/Network/slirp/hostres.c --- virtualbox-hwe-6.1.34-dfsg/src/VBox/Devices/Network/slirp/hostres.c 2022-03-22 23:43:06.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/src/VBox/Devices/Network/slirp/hostres.c 2022-09-01 13:26:29.000000000 +0000 @@ -512,7 +512,7 @@ && qclass != Class_ANY) { LogErr(("NAT: hostres: unsupported qclass %d\n", qclass)); - return refuse(res, RCode_NXDomain); + return refuse(res, RCode_NoError); } if ( qtype != Type_A @@ -521,7 +521,7 @@ && qtype != Type_ANY) { LogErr(("NAT: hostres: unsupported qtype %d\n", qtype)); - return refuse(res, RCode_NXDomain); + return refuse(res, RCode_NoError); } diff -Nru virtualbox-hwe-6.1.34-dfsg/src/VBox/Devices/Network/slirp/sbuf.c virtualbox-hwe-6.1.38-dfsg/src/VBox/Devices/Network/slirp/sbuf.c --- virtualbox-hwe-6.1.34-dfsg/src/VBox/Devices/Network/slirp/sbuf.c 2022-03-22 23:43:07.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/src/VBox/Devices/Network/slirp/sbuf.c 2022-09-01 13:26:30.000000000 +0000 @@ -80,7 +80,7 @@ { sb->sb_wptr = sb->sb_rptr = - sb->sb_data = (char *)RTMemRealloc(sb->sb_data, size); + sb->sb_data = (char *)RTMemReallocZ(sb->sb_data, sb->sb_datalen, size); sb->sb_cc = 0; if (sb->sb_wptr) sb->sb_datalen = size; @@ -90,7 +90,7 @@ } else { - sb->sb_wptr = sb->sb_rptr = sb->sb_data = (char *)RTMemAlloc(size); + sb->sb_wptr = sb->sb_rptr = sb->sb_data = (char *)RTMemAllocZ(size); sb->sb_cc = 0; if (sb->sb_wptr) sb->sb_datalen = size; @@ -146,7 +146,7 @@ if (m->m_next) { - buf = RTMemAlloc(mlen); + buf = RTMemAllocZ(mlen); if (buf == NULL) { ret = 0; diff -Nru virtualbox-hwe-6.1.34-dfsg/src/VBox/Devices/PC/BIOS/VBoxBiosAlternative286.asm virtualbox-hwe-6.1.38-dfsg/src/VBox/Devices/PC/BIOS/VBoxBiosAlternative286.asm --- virtualbox-hwe-6.1.34-dfsg/src/VBox/Devices/PC/BIOS/VBoxBiosAlternative286.asm 2022-03-22 23:43:08.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/src/VBox/Devices/PC/BIOS/VBoxBiosAlternative286.asm 2022-09-01 13:26:31.000000000 +0000 @@ -1208,7 +1208,7 @@ section CONST2 progbits vstart=0xed8 align=1 ; size=0x3fa class=DATA group=DGROUP ; disGetNextSymbol 0xf0ed8 LB 0x3fa -> off=0x0 cb=0000000000000012 uValue=00000000000f0ed8 'bios_cvs_version_string' bios_cvs_version_string: ; 0xf0ed8 LB 0x12 - db 'VirtualBox 6.1.34', 000h + db 'VirtualBox 6.1.38', 000h ; disGetNextSymbol 0xf0eea LB 0x3e8 -> off=0x0 cb=0000000000000008 uValue=00000000000f0eea '_bios_prefix_string' _bios_prefix_string: ; 0xf0eea LB 0x8 db 'BIOS: ', 000h, 000h @@ -19425,4 +19425,4 @@ cpu_reset: ; 0xffff0 LB 0x10 jmp far 0f000h:0e05bh ; ea 5b e0 00 f0 ; 0xffff0 orgs.asm:2063 ; disGetNextSymbol 0xffff5 LB 0xb -> off=0xb cb=0000000000000000 uValue=0000000000100000 '_dummy_addr_0x100000' - db 030h, 036h, 02fh, 032h, 033h, 02fh, 039h, 039h, 000h, 0fch, 0a1h + db 030h, 036h, 02fh, 032h, 033h, 02fh, 039h, 039h, 000h, 0fch, 09dh diff -Nru virtualbox-hwe-6.1.34-dfsg/src/VBox/Devices/PC/BIOS/VBoxBiosAlternative286.md5sum virtualbox-hwe-6.1.38-dfsg/src/VBox/Devices/PC/BIOS/VBoxBiosAlternative286.md5sum --- virtualbox-hwe-6.1.34-dfsg/src/VBox/Devices/PC/BIOS/VBoxBiosAlternative286.md5sum 2022-03-22 23:43:08.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/src/VBox/Devices/PC/BIOS/VBoxBiosAlternative286.md5sum 2022-09-01 13:26:31.000000000 +0000 @@ -1 +1 @@ -3715974b2fe1d3212dd34c357a44b8f3 *VBoxPcBios286.rom +f451343282e8d6a8fab3e49ed83b6d4b *VBoxPcBios286.rom diff -Nru virtualbox-hwe-6.1.34-dfsg/src/VBox/Devices/PC/BIOS/VBoxBiosAlternative386.asm virtualbox-hwe-6.1.38-dfsg/src/VBox/Devices/PC/BIOS/VBoxBiosAlternative386.asm --- virtualbox-hwe-6.1.34-dfsg/src/VBox/Devices/PC/BIOS/VBoxBiosAlternative386.asm 2022-03-22 23:43:08.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/src/VBox/Devices/PC/BIOS/VBoxBiosAlternative386.asm 2022-09-01 13:26:31.000000000 +0000 @@ -1173,7 +1173,7 @@ section CONST2 progbits vstart=0xf12 align=1 ; size=0x3fa class=DATA group=DGROUP ; disGetNextSymbol 0xf0f12 LB 0x3fa -> off=0x0 cb=0000000000000012 uValue=00000000000f0f12 'bios_cvs_version_string' bios_cvs_version_string: ; 0xf0f12 LB 0x12 - db 'VirtualBox 6.1.34', 000h + db 'VirtualBox 6.1.38', 000h ; disGetNextSymbol 0xf0f24 LB 0x3e8 -> off=0x0 cb=0000000000000008 uValue=00000000000f0f24 '_bios_prefix_string' _bios_prefix_string: ; 0xf0f24 LB 0x8 db 'BIOS: ', 000h, 000h @@ -19200,4 +19200,4 @@ cpu_reset: ; 0xffff0 LB 0x10 jmp far 0f000h:0e05bh ; ea 5b e0 00 f0 ; 0xffff0 orgs.asm:2063 ; disGetNextSymbol 0xffff5 LB 0xb -> off=0xb cb=0000000000000000 uValue=0000000000100000 '_dummy_addr_0x100000' - db 030h, 036h, 02fh, 032h, 033h, 02fh, 039h, 039h, 000h, 0fch, 0ebh + db 030h, 036h, 02fh, 032h, 033h, 02fh, 039h, 039h, 000h, 0fch, 0e7h diff -Nru virtualbox-hwe-6.1.34-dfsg/src/VBox/Devices/PC/BIOS/VBoxBiosAlternative386.md5sum virtualbox-hwe-6.1.38-dfsg/src/VBox/Devices/PC/BIOS/VBoxBiosAlternative386.md5sum --- virtualbox-hwe-6.1.34-dfsg/src/VBox/Devices/PC/BIOS/VBoxBiosAlternative386.md5sum 2022-03-22 15:48:48.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/src/VBox/Devices/PC/BIOS/VBoxBiosAlternative386.md5sum 2022-09-01 13:26:31.000000000 +0000 @@ -1 +1 @@ -8066c9277cd640b9a3b5cb394a5791a2 *VBoxPcBios386.rom +1bc856526ce7497f88fa1e40c730c766 *VBoxPcBios386.rom diff -Nru virtualbox-hwe-6.1.34-dfsg/src/VBox/Devices/PC/BIOS/VBoxBiosAlternative8086.asm virtualbox-hwe-6.1.38-dfsg/src/VBox/Devices/PC/BIOS/VBoxBiosAlternative8086.asm --- virtualbox-hwe-6.1.34-dfsg/src/VBox/Devices/PC/BIOS/VBoxBiosAlternative8086.asm 2022-03-22 23:43:08.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/src/VBox/Devices/PC/BIOS/VBoxBiosAlternative8086.asm 2022-09-01 13:26:31.000000000 +0000 @@ -1208,7 +1208,7 @@ section CONST2 progbits vstart=0xed8 align=1 ; size=0x3fa class=DATA group=DGROUP ; disGetNextSymbol 0xf0ed8 LB 0x3fa -> off=0x0 cb=0000000000000012 uValue=00000000000f0ed8 'bios_cvs_version_string' bios_cvs_version_string: ; 0xf0ed8 LB 0x12 - db 'VirtualBox 6.1.34', 000h + db 'VirtualBox 6.1.38', 000h ; disGetNextSymbol 0xf0eea LB 0x3e8 -> off=0x0 cb=0000000000000008 uValue=00000000000f0eea '_bios_prefix_string' _bios_prefix_string: ; 0xf0eea LB 0x8 db 'BIOS: ', 000h, 000h @@ -19899,4 +19899,4 @@ cpu_reset: ; 0xffff0 LB 0x10 jmp far 0f000h:0e05bh ; ea 5b e0 00 f0 ; 0xffff0 orgs.asm:2063 ; disGetNextSymbol 0xffff5 LB 0xb -> off=0xb cb=0000000000000000 uValue=0000000000100000 '_dummy_addr_0x100000' - db 030h, 036h, 02fh, 032h, 033h, 02fh, 039h, 039h, 000h, 0fbh, 023h + db 030h, 036h, 02fh, 032h, 033h, 02fh, 039h, 039h, 000h, 0fbh, 01fh diff -Nru virtualbox-hwe-6.1.34-dfsg/src/VBox/Devices/PC/BIOS/VBoxBiosAlternative8086.md5sum virtualbox-hwe-6.1.38-dfsg/src/VBox/Devices/PC/BIOS/VBoxBiosAlternative8086.md5sum --- virtualbox-hwe-6.1.34-dfsg/src/VBox/Devices/PC/BIOS/VBoxBiosAlternative8086.md5sum 2022-03-22 23:43:08.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/src/VBox/Devices/PC/BIOS/VBoxBiosAlternative8086.md5sum 2022-09-01 13:26:31.000000000 +0000 @@ -1 +1 @@ -552484d57cbc17c2bdffa18e1236d510 *VBoxPcBios8086.rom +8198eb3f832f14e1bbdbb8ea54584711 *VBoxPcBios8086.rom diff -Nru virtualbox-hwe-6.1.34-dfsg/src/VBox/Devices/Storage/DevATA.cpp virtualbox-hwe-6.1.38-dfsg/src/VBox/Devices/Storage/DevATA.cpp --- virtualbox-hwe-6.1.34-dfsg/src/VBox/Devices/Storage/DevATA.cpp 2022-03-22 23:43:35.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/src/VBox/Devices/Storage/DevATA.cpp 2022-09-01 13:26:58.000000000 +0000 @@ -3751,7 +3751,7 @@ break; } atapiR3CmdOK(pCtl, s); - ataSetStatus(pCtl, s, ATA_STAT_SEEK); /* Linux expects this. */ + ataSetStatus(pCtl, s, ATA_STAT_SEEK); /* Linux expects this. Required by ATAPI 2.x when seek completes. */ break; } case SCSI_START_STOP_UNIT: @@ -3788,7 +3788,10 @@ break; } if (RT_SUCCESS(rc)) + { atapiR3CmdOK(pCtl, s); + ataSetStatus(pCtl, s, ATA_STAT_SEEK); /* Needed by NT 3.51/4.0, see @bugref{5869}. */ + } else atapiR3CmdErrorSimple(pCtl, s, SCSI_SENSE_NOT_READY, SCSI_ASC_MEDIA_LOAD_OR_EJECT_FAILED); break; diff -Nru virtualbox-hwe-6.1.34-dfsg/src/VBox/Devices/USB/DevOHCI.cpp virtualbox-hwe-6.1.38-dfsg/src/VBox/Devices/USB/DevOHCI.cpp --- virtualbox-hwe-6.1.34-dfsg/src/VBox/Devices/USB/DevOHCI.cpp 2022-03-22 23:43:36.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/src/VBox/Devices/USB/DevOHCI.cpp 2022-09-01 13:26:59.000000000 +0000 @@ -135,6 +135,8 @@ /* Macro to query the number of currently configured ports. */ #define OHCI_NDP_CFG(pohci) ((pohci)->RootHub.desc_a & OHCI_RHA_NDP) +/** Macro to convert a EHCI port index (zero based) to a VUSB roothub port ID (one based). */ +#define OHCI_PORT_2_VUSB_PORT(a_uPort) ((a_uPort) + 1) /** Pointer to OHCI device data. */ typedef struct OHCI *POHCI; @@ -179,15 +181,10 @@ { /** The port register. */ uint32_t fReg; -#if HC_ARCH_BITS == 64 - uint32_t Alignment0; /**< Align the pointer correctly. */ -#endif - /** The device attached to the port. */ - R3PTRTYPE(PVUSBIDEVICE) pDev; + /** Flag whether there is a device attached to the port. */ + bool fAttached; + bool afPadding[3]; } OHCIHUBPORT; -#if HC_ARCH_BITS == 64 -AssertCompile(sizeof(OHCIHUBPORT) == 16); /* saved state */ -#endif /** Pointer to an OHCI hub port. */ typedef OHCIHUBPORT *POHCIHUBPORT; @@ -221,8 +218,6 @@ R3PTRTYPE(PPDMIBASE) pIBase; /** Pointer to the connector interface of the VUSB RootHub. */ R3PTRTYPE(PVUSBIROOTHUBCONNECTOR) pIRhConn; - /** Pointer to the device interface of the VUSB RootHub. */ - R3PTRTYPE(PVUSBIDEVICE) pIDev; /** The base interface exposed to the roothub driver. */ PDMIBASE IBase; /** The roothub port interface exposed to the roothub driver. */ @@ -241,24 +236,6 @@ /** Pointer to the OHCI ring-3 root hub data. */ typedef OHCIROOTHUBR3 *POHCIROOTHUBR3; - -/** - * Data used for reattaching devices on a state load. - */ -typedef struct OHCILOAD -{ - /** Timer used once after state load to inform the guest about new devices. - * We do this to be sure the guest get any disconnect / reconnect on the - * same port. */ - TMTIMERHANDLE hTimer; - /** Number of detached devices. */ - unsigned cDevs; - /** Array of devices which were detached. */ - PVUSBIDEVICE apDevs[OHCI_NDP_MAX]; -} OHCILOAD; -/** Pointer to an OHCILOAD structure. */ -typedef OHCILOAD *POHCILOAD; - #ifdef VBOX_WITH_OHCI_PHYS_READ_CACHE typedef struct OHCIPAGECACHE { @@ -282,6 +259,8 @@ /** frame number overflow. */ uint32_t fno : 1; + /** Align roothub structure on a 8-byte boundary. */ + uint32_t u32Alignment0; /** Root hub device, shared data. */ OHCIROOTHUB RootHub; @@ -422,8 +401,6 @@ /** Critical section to synchronize the framer and URB completion handler. */ RTCRITSECT CritSect; - /** Pointer to state load data. */ - R3PTRTYPE(POHCILOAD) pLoad; /** The restored periodic frame rate. */ uint32_t uRestoredPeriodicFrameRate; } OHCIR3; @@ -889,7 +866,7 @@ RT_C_DECLS_BEGIN #ifdef IN_RING3 /* Update host controller state to reflect a device attach */ -static void ohciR3RhPortPower(POHCIROOTHUB pRh, unsigned iPort, bool fPowerUp); +static void ohciR3RhPortPower(POHCIROOTHUBR3 pRh, unsigned iPort, bool fPowerUp); static void ohciR3BusResume(PPDMDEVINS pDevIns, POHCI pOhci, POHCICC pThisCC, bool fHardware); static void ohciR3BusStop(POHCICC pThisCC); #ifdef VBOX_WITH_OHCI_PHYS_READ_CACHE @@ -903,7 +880,6 @@ # if defined(VBOX_STRICT) || defined(LOG_ENABLED) static int ohciR3InDoneQueueFind(POHCICC pThisCC, uint32_t GCPhysTD); # endif -static DECLCALLBACK(void) ohciR3LoadReattachDevices(PPDMDEVINS pDevIns, PTMTIMER pTimer, void *pvUser); #endif /* IN_RING3 */ RT_C_DECLS_END @@ -1037,7 +1013,7 @@ PDMDevHlpCritSectEnter(pDevIns, pDevIns->pCritSectRoR3, VERR_IGNORED); for (unsigned iPort = 0; iPort < OHCI_NDP_CFG(pThis); iPort++) - if (!pThis->RootHub.aPorts[iPort].pDev) + if (!pThis->RootHub.aPorts[iPort].fAttached) { cPorts++; ASMBitSet(pAvailable, iPort + 1); @@ -1061,20 +1037,13 @@ } -/** - * A device is being attached to a port in the roothub. - * - * @param pInterface Pointer to this structure. - * @param pDev Pointer to the device being attached. - * @param uPort The port number assigned to the device. - */ -static DECLCALLBACK(int) ohciR3RhAttach(PVUSBIROOTHUBPORT pInterface, PVUSBIDEVICE pDev, unsigned uPort) +/** @interface_method_impl{VUSBIROOTHUBPORT,pfnAttach} */ +static DECLCALLBACK(int) ohciR3RhAttach(PVUSBIROOTHUBPORT pInterface, uint32_t uPort, VUSBSPEED enmSpeed) { POHCICC pThisCC = VUSBIROOTHUBPORT_2_OHCI(pInterface); PPDMDEVINS pDevIns = pThisCC->pDevInsR3; POHCI pThis = PDMDEVINS_2_DATA(pDevIns, POHCI); - VUSBSPEED enmSpeed; - LogFlow(("ohciR3RhAttach: pDev=%p uPort=%u\n", pDev, uPort)); + LogFlow(("ohciR3RhAttach: uPort=%u\n", uPort)); PDMDevHlpCritSectEnter(pDevIns, pDevIns->pCritSectRoR3, VERR_IGNORED); /* @@ -1082,8 +1051,7 @@ */ Assert(uPort >= 1 && uPort <= OHCI_NDP_CFG(pThis)); uPort--; - Assert(!pThis->RootHub.aPorts[uPort].pDev); - enmSpeed = pDev->pfnGetSpeed(pDev); + Assert(!pThis->RootHub.aPorts[uPort].fAttached); /* Only LS/FS devices should end up here. */ Assert(enmSpeed == VUSB_SPEED_LOW || enmSpeed == VUSB_SPEED_FULL); @@ -1093,8 +1061,8 @@ pThis->RootHub.aPorts[uPort].fReg = OHCI_PORT_CCS | OHCI_PORT_CSC; if (enmSpeed == VUSB_SPEED_LOW) pThis->RootHub.aPorts[uPort].fReg |= OHCI_PORT_LSDA; - pThis->RootHub.aPorts[uPort].pDev = pDev; - ohciR3RhPortPower(&pThis->RootHub, uPort, 1 /* power on */); + pThis->RootHub.aPorts[uPort].fAttached = true; + ohciR3RhPortPower(&pThisCC->RootHub, uPort, 1 /* power on */); ohciR3RemoteWakeup(pDevIns, pThis, pThisCC); ohciR3SetInterrupt(pDevIns, pThis, OHCI_INTR_ROOT_HUB_STATUS_CHANGE); @@ -1108,16 +1076,14 @@ * A device is being detached from a port in the roothub. * * @param pInterface Pointer to this structure. - * @param pDev Pointer to the device being detached. * @param uPort The port number assigned to the device. */ -static DECLCALLBACK(void) ohciR3RhDetach(PVUSBIROOTHUBPORT pInterface, PVUSBIDEVICE pDev, unsigned uPort) +static DECLCALLBACK(void) ohciR3RhDetach(PVUSBIROOTHUBPORT pInterface, uint32_t uPort) { POHCICC pThisCC = VUSBIROOTHUBPORT_2_OHCI(pInterface); PPDMDEVINS pDevIns = pThisCC->pDevInsR3; POHCI pThis = PDMDEVINS_2_DATA(pDevIns, POHCI); - RT_NOREF(pDev); - LogFlow(("ohciR3RhDetach: pDev=%p uPort=%u\n", pDev, uPort)); + LogFlow(("ohciR3RhDetach: uPort=%u\n", uPort)); PDMDevHlpCritSectEnter(pDevIns, pDevIns->pCritSectRoR3, VERR_IGNORED); /* @@ -1125,12 +1091,12 @@ */ Assert(uPort >= 1 && uPort <= OHCI_NDP_CFG(pThis)); uPort--; - Assert(pThis->RootHub.aPorts[uPort].pDev == pDev); + Assert(pThis->RootHub.aPorts[uPort].fAttached); /* * Detach it. */ - pThis->RootHub.aPorts[uPort].pDev = NULL; + pThis->RootHub.aPorts[uPort].fAttached = false; if (pThis->RootHub.aPorts[uPort].fReg & OHCI_PORT_PES) pThis->RootHub.aPorts[uPort].fReg = OHCI_PORT_CSC | OHCI_PORT_PESC; else @@ -1151,13 +1117,14 @@ * during a root hub reset. * * @param pDev The root hub device. + * @param uPort The port of the device completing the reset. * @param rc The result of the operation. * @param pvUser Pointer to the controller. */ -static DECLCALLBACK(void) ohciR3RhResetDoneOneDev(PVUSBIDEVICE pDev, int rc, void *pvUser) +static DECLCALLBACK(void) ohciR3RhResetDoneOneDev(PVUSBIDEVICE pDev, uint32_t uPort, int rc, void *pvUser) { LogRel(("OHCI: root hub reset completed with %Rrc\n", rc)); - NOREF(pDev); NOREF(rc); NOREF(pvUser); + RT_NOREF(pDev, uPort, rc, pvUser); } @@ -1199,13 +1166,14 @@ */ for (unsigned iPort = 0; iPort < OHCI_NDP_CFG(pThis); iPort++) { - if (pThis->RootHub.aPorts[iPort].pDev) + if (pThis->RootHub.aPorts[iPort].fAttached) { pThis->RootHub.aPorts[iPort].fReg = OHCI_PORT_CCS | OHCI_PORT_CSC | OHCI_PORT_PPS; if (fResetOnLinux) { PVM pVM = PDMDevHlpGetVM(pDevIns); - VUSBIDevReset(pThis->RootHub.aPorts[iPort].pDev, fResetOnLinux, ohciR3RhResetDoneOneDev, pThis, pVM); + VUSBIRhDevReset(pThisCC->RootHub.pIRhConn, OHCI_PORT_2_VUSB_PORT(iPort), fResetOnLinux, + ohciR3RhResetDoneOneDev, pThis, pVM); } } else @@ -1301,7 +1269,7 @@ * device construction, so nothing to worry about there.) */ if (fNewMode == OHCI_USB_RESET) - VUSBIDevReset(pThisCC->RootHub.pIDev, fResetOnLinux, NULL, NULL, NULL); + pThisCC->RootHub.pIRhConn->pfnReset(pThisCC->RootHub.pIRhConn, fResetOnLinux); } @@ -3068,7 +3036,7 @@ /* * Allocate and initialize a new URB. */ - PVUSBURB pUrb = VUSBIRhNewUrb(pThisCC->RootHub.pIRhConn, pEd->hwinfo & ED_HWINFO_FUNCTION, NULL, + PVUSBURB pUrb = VUSBIRhNewUrb(pThisCC->RootHub.pIRhConn, pEd->hwinfo & ED_HWINFO_FUNCTION, VUSB_DEVICE_PORT_INVALID, enmType, enmDir, Buf.cbTotal, 1, NULL); if (!pUrb) return false; /* retry later... */ @@ -3238,7 +3206,7 @@ /* * Allocate and initialize a new URB. */ - PVUSBURB pUrb = VUSBIRhNewUrb(pThisCC->RootHub.pIRhConn, pEd->hwinfo & ED_HWINFO_FUNCTION, NULL, + PVUSBURB pUrb = VUSBIRhNewUrb(pThisCC->RootHub.pIRhConn, pEd->hwinfo & ED_HWINFO_FUNCTION, VUSB_DEVICE_PORT_INVALID, enmType, enmDir, cbTotal, cTds, "ohciR3ServiceTdMultiple"); if (!pUrb) /* retry later... */ @@ -3472,7 +3440,7 @@ /* * Allocate and initialize a new URB. */ - PVUSBURB pUrb = VUSBIRhNewUrb(pThisCC->RootHub.pIRhConn, pEd->hwinfo & ED_HWINFO_FUNCTION, NULL, + PVUSBURB pUrb = VUSBIRhNewUrb(pThisCC->RootHub.pIRhConn, pEd->hwinfo & ED_HWINFO_FUNCTION, VUSB_DEVICE_PORT_INVALID, VUSBXFERTYPE_ISOC, enmDir, cbTotal, 1, NULL); if (!pUrb) /* retry later... */ @@ -4362,7 +4330,7 @@ */ static void ohciR3BusStart(PPDMDEVINS pDevIns, POHCI pThis, POHCICC pThisCC) { - VUSBIDevPowerOn(pThisCC->RootHub.pIDev); + pThisCC->RootHub.pIRhConn->pfnPowerOn(pThisCC->RootHub.pIRhConn); pThis->dqic = 0x7; Log(("ohci: Bus started\n")); @@ -4380,7 +4348,7 @@ { int rc = pThisCC->RootHub.pIRhConn->pfnSetPeriodicFrameProcessing(pThisCC->RootHub.pIRhConn, 0); AssertRC(rc); - VUSBIDevPowerOff(pThisCC->RootHub.pIDev); + pThisCC->RootHub.pIRhConn->pfnPowerOff(pThisCC->RootHub.pIRhConn); } @@ -4403,7 +4371,7 @@ /* Power a port up or down */ -static void ohciR3RhPortPower(POHCIROOTHUB pRh, unsigned iPort, bool fPowerUp) +static void ohciR3RhPortPower(POHCIROOTHUBR3 pRh, unsigned iPort, bool fPowerUp) { POHCIHUBPORT pPort = &pRh->aPorts[iPort]; bool fOldPPS = !!(pPort->fReg & OHCI_PORT_PPS); @@ -4413,19 +4381,19 @@ if (fPowerUp) { /* power up */ - if (pPort->pDev) + if (pPort->fAttached) pPort->fReg |= OHCI_PORT_CCS; if (pPort->fReg & OHCI_PORT_CCS) pPort->fReg |= OHCI_PORT_PPS; - if (pPort->pDev && !fOldPPS) - VUSBIDevPowerOn(pPort->pDev); + if (pPort->fAttached && !fOldPPS) + VUSBIRhDevPowerOn(pRh->pIRhConn, OHCI_PORT_2_VUSB_PORT(iPort)); } else { /* power down */ pPort->fReg &= ~(OHCI_PORT_PPS | OHCI_PORT_CCS | OHCI_PORT_PSS | OHCI_PORT_PRS); - if (pPort->pDev && fOldPPS) - VUSBIDevPowerOff(pPort->pDev); + if (pPort->fAttached && fOldPPS) + VUSBIRhDevPowerOff(pRh->pIRhConn, OHCI_PORT_2_VUSB_PORT(iPort)); } } @@ -4520,7 +4488,7 @@ /** @todo This should probably do a real reset, but we don't implement * that correctly in the roothub reset callback yet. check it's * comments and argument for more details. */ - VUSBIDevReset(pThisCC->RootHub.pIDev, false /* don't do a real reset */, NULL, NULL, NULL); + pThisCC->RootHub.pIRhConn->pfnReset(pThisCC->RootHub.pIRhConn, false /* don't do a real reset */); break; } } @@ -5167,6 +5135,8 @@ static VBOXSTRICTRC HcRhStatus_w(PPDMDEVINS pDevIns, POHCI pThis, uint32_t iReg, uint32_t val) { #ifdef IN_RING3 + POHCICC pThisCC = PDMDEVINS_2_DATA_CC(pDevIns, POHCICC); + /* log */ uint32_t old = pThis->RootHub.status; uint32_t chg; @@ -5188,7 +5158,7 @@ unsigned i; Log2(("ohci: global power up\n")); for (i = 0; i < OHCI_NDP_CFG(pThis); i++) - ohciR3RhPortPower(&pThis->RootHub, i, true /* power up */); + ohciR3RhPortPower(&pThisCC->RootHub, i, true /* power up */); } /* ClearGlobalPower */ @@ -5197,7 +5167,7 @@ unsigned i; Log2(("ohci: global power down\n")); for (i = 0; i < OHCI_NDP_CFG(pThis); i++) - ohciR3RhPortPower(&pThis->RootHub, i, false /* power down */); + ohciR3RhPortPower(&pThisCC->RootHub, i, false /* power down */); } if ( val & OHCI_RHS_DRWE ) @@ -5253,27 +5223,15 @@ * Completion callback for the vusb_dev_reset() operation. * @thread EMT. */ -static DECLCALLBACK(void) ohciR3PortResetDone(PVUSBIDEVICE pDev, int rc, void *pvUser) +static DECLCALLBACK(void) ohciR3PortResetDone(PVUSBIDEVICE pDev, uint32_t uPort, int rc, void *pvUser) { - PPDMDEVINS pDevIns = (PPDMDEVINS)pvUser; - POHCI pThis = PDMDEVINS_2_DATA(pDevIns, POHCI); + RT_NOREF(pDev); - /* - * Find the port in question - */ - POHCIHUBPORT pPort = NULL; - unsigned iPort; - for (iPort = 0; iPort < OHCI_NDP_CFG(pThis); iPort++) /* lazy bird */ - if (pThis->RootHub.aPorts[iPort].pDev == pDev) - { - pPort = &pThis->RootHub.aPorts[iPort]; - break; - } - if (!pPort) - { - Assert(pPort); /* sometimes happens because of @bugref{1510} */ - return; - } + Assert(uPort >= 1); + PPDMDEVINS pDevIns = (PPDMDEVINS)pvUser; + POHCI pThis = PDMDEVINS_2_DATA(pDevIns, POHCI); + POHCICC pThisCC = PDMDEVINS_2_DATA_CC(pDevIns, POHCICC); + POHCIHUBPORT pPort = &pThis->RootHub.aPorts[uPort - 1]; if (RT_SUCCESS(rc)) { @@ -5287,8 +5245,8 @@ else { /* desperate measures. */ - if ( pPort->pDev - && VUSBIDevGetState(pPort->pDev) == VUSB_DEVICE_STATE_ATTACHED) + if ( pPort->fAttached + && VUSBIRhDevGetState(pThisCC->RootHub.pIRhConn, uPort) == VUSB_DEVICE_STATE_ATTACHED) { /* * Damn, something weird happened during reset. We'll pretend the user did an @@ -5353,6 +5311,7 @@ { #ifdef IN_RING3 const unsigned i = iReg - 21; + POHCICC pThisCC = PDMDEVINS_2_DATA_CC(pDevIns, POHCICC); POHCIHUBPORT p = &pThis->RootHub.aPorts[i]; uint32_t old_state = p->fReg; @@ -5400,7 +5359,8 @@ { PVM pVM = PDMDevHlpGetVM(pDevIns); p->fReg &= ~OHCI_PORT_PRSC; - VUSBIDevReset(p->pDev, false /* don't reset on linux */, ohciR3PortResetDone, pDevIns, pVM); + VUSBIRhDevReset(pThisCC->RootHub.pIRhConn, OHCI_PORT_2_VUSB_PORT(i), false /* don't reset on linux */, + ohciR3PortResetDone, pDevIns, pVM); } else if (p->fReg & OHCI_PORT_PRS) { @@ -5417,15 +5377,15 @@ * sure it isn't gang powered */ if (val & OHCI_PORT_CLRPP) - ohciR3RhPortPower(&pThis->RootHub, i, false /* power down */); + ohciR3RhPortPower(&pThisCC->RootHub, i, false /* power down */); if (val & OHCI_PORT_PPS) - ohciR3RhPortPower(&pThis->RootHub, i, true /* power up */); + ohciR3RhPortPower(&pThisCC->RootHub, i, true /* power up */); } /** @todo r=frank: ClearSuspendStatus. Timing? */ if (val & OHCI_PORT_CLRSS) { - ohciR3RhPortPower(&pThis->RootHub, i, true /* power up */); + ohciR3RhPortPower(&pThisCC->RootHub, i, true /* power up */); pThis->RootHub.aPorts[i].fReg &= ~OHCI_PORT_PSS; pThis->RootHub.aPorts[i].fReg |= OHCI_PORT_PSSC; ohciR3SetInterrupt(pDevIns, pThis, OHCI_INTR_ROOT_HUB_STATUS_CHANGE); @@ -5571,58 +5531,6 @@ #ifdef IN_RING3 /** - * Prepares for state saving. - * All URBs needs to be canceled. - * - * @returns VBox status code. - * @param pDevIns The device instance. - * @param pSSM The handle to save the state to. - */ -static DECLCALLBACK(int) ohciR3SavePrep(PPDMDEVINS pDevIns, PSSMHANDLE pSSM) -{ - RT_NOREF(pSSM); - POHCICC pThisCC = PDMDEVINS_2_DATA_CC(pDevIns, POHCICC); - POHCI pThis = PDMDEVINS_2_DATA(pDevIns, POHCI); - LogFlow(("ohciR3SavePrep: \n")); - - /* - * Detach all proxied devices. - */ - PDMDevHlpCritSectEnter(pDevIns, pDevIns->pCritSectRoR3, VERR_IGNORED); - /** @todo this won't work well when continuing after saving! */ - for (unsigned i = 0; i < RT_ELEMENTS(pThis->RootHub.aPorts); i++) - { - PVUSBIDEVICE pDev = pThis->RootHub.aPorts[i].pDev; - if (pDev) - { - if (!VUSBIDevIsSavedStateSupported(pDev)) - { - VUSBIRhDetachDevice(pThisCC->RootHub.pIRhConn, pDev); - /* - * Save the device pointers here so we can reattach them afterwards. - * This will work fine even if the save fails since the Done handler is - * called unconditionally if the Prep handler was called. - */ - pThis->RootHub.aPorts[i].pDev = pDev; - } - } - } - PDMDevHlpCritSectLeave(pDevIns, pDevIns->pCritSectRoR3); - - /* - * Kill old load data which might be hanging around. - */ - if (pThisCC->pLoad) - { - PDMDevHlpTimerDestroy(pDevIns, pThisCC->pLoad->hTimer); - PDMDevHlpMMHeapFree(pDevIns, pThisCC->pLoad); - pThisCC->pLoad = NULL; - } - return VINF_SUCCESS; -} - - -/** * Saves the state of the OHCI device. * * @returns VBox status code. @@ -5644,102 +5552,6 @@ /** - * Done state save operation. - * - * @returns VBox load code. - * @param pDevIns Device instance of the device which registered the data unit. - * @param pSSM SSM operation handle. - */ -static DECLCALLBACK(int) ohciR3SaveDone(PPDMDEVINS pDevIns, PSSMHANDLE pSSM) -{ - POHCI pThis = PDMDEVINS_2_DATA(pDevIns, POHCI); - POHCICC pThisCC = PDMDEVINS_2_DATA_CC(pDevIns, POHCICC); - LogFlow(("ohciR3SaveDone:\n")); - RT_NOREF(pSSM); - - /* - * NULL the dev pointers. - */ - POHCIROOTHUB pRh = &pThis->RootHub; - OHCIROOTHUB Rh = *pRh; - for (unsigned i = 0; i < RT_ELEMENTS(pRh->aPorts); i++) - { - if ( pRh->aPorts[i].pDev - && !VUSBIDevIsSavedStateSupported(pRh->aPorts[i].pDev)) - pRh->aPorts[i].pDev = NULL; - } - - /* - * Attach the devices. - */ - for (unsigned i = 0; i < RT_ELEMENTS(pRh->aPorts); i++) - { - PVUSBIDEVICE pDev = Rh.aPorts[i].pDev; - if ( pDev - && !VUSBIDevIsSavedStateSupported(pDev)) - VUSBIRhAttachDevice(pThisCC->RootHub.pIRhConn, pDev); - } - - return VINF_SUCCESS; -} - - -/** - * Prepare loading the state of the OHCI device. - * This must detach the devices currently attached and save - * the up for reconnect after the state load have been completed - * - * @returns VBox status code. - * @param pDevIns The device instance. - * @param pSSM The handle to the saved state. - */ -static DECLCALLBACK(int) ohciR3LoadPrep(PPDMDEVINS pDevIns, PSSMHANDLE pSSM) -{ - POHCICC pThisCC = PDMDEVINS_2_DATA_CC(pDevIns, POHCICC); - POHCI pThis = PDMDEVINS_2_DATA(pDevIns, POHCI); - LogFlow(("ohciR3LoadPrep:\n")); - RT_NOREF(pSSM); - - if (!pThisCC->pLoad) - { - /* - * Detach all devices which are present in this session. Save them in the load - * structure so we can reattach them after restoring the guest. - */ - POHCIROOTHUB pRh = &pThis->RootHub; - OHCILOAD Load; - Load.hTimer = NIL_TMTIMERHANDLE; - Load.cDevs = 0; - for (unsigned i = 0; i < RT_ELEMENTS(pRh->aPorts); i++) - { - PVUSBIDEVICE pDev = pRh->aPorts[i].pDev; - if ( pDev - && !VUSBIDevIsSavedStateSupported(pDev)) - { - Load.apDevs[Load.cDevs++] = pDev; - VUSBIRhDetachDevice(pThisCC->RootHub.pIRhConn, pDev); - Assert(!pRh->aPorts[i].pDev); - } - } - - /* - * Any devices to reattach, if so duplicate the Load struct. - */ - if (Load.cDevs) - { - pThisCC->pLoad = (POHCILOAD)PDMDevHlpMMHeapAlloc(pDevIns, sizeof(Load)); - if (!pThisCC->pLoad) - return VERR_NO_MEMORY; - *pThisCC->pLoad = Load; - } - } - /* else: we ASSUME no device can be attached or detach in the period - * between a state load and the pLoad stuff is processed. */ - return VINF_SUCCESS; -} - - -/** * Loads the state of the OHCI device. * * @returns VBox status code. @@ -5801,62 +5613,6 @@ /** - * Done state load operation. - * - * @returns VBox load code. - * @param pDevIns Device instance of the device which registered the data unit. - * @param pSSM SSM operation handle. - */ -static DECLCALLBACK(int) ohciR3LoadDone(PPDMDEVINS pDevIns, PSSMHANDLE pSSM) -{ - POHCICC pThisCC = PDMDEVINS_2_DATA_CC(pDevIns, POHCICC); - LogFlow(("ohciR3LoadDone:\n")); - RT_NOREF(pSSM); - - /* - * Start a timer if we've got devices to reattach - */ - if (pThisCC->pLoad) - { - int rc = PDMDevHlpTimerCreate(pDevIns, TMCLOCK_VIRTUAL, ohciR3LoadReattachDevices, NULL /*pvUser*/, - TMTIMER_FLAGS_NO_CRIT_SECT, "OHCI reattach devices on load", &pThisCC->pLoad->hTimer); - if (RT_SUCCESS(rc)) - rc = PDMDevHlpTimerSetMillies(pDevIns, pThisCC->pLoad->hTimer, 250); - return rc; - } - - return VINF_SUCCESS; -} - - -/** - * @callback_method_impl{FNTMTIMERDEV, - * Reattaches devices after a saved state load.} - */ -static DECLCALLBACK(void) ohciR3LoadReattachDevices(PPDMDEVINS pDevIns, PTMTIMER pTimer, void *pvUser) -{ - POHCICC pThisCC = PDMDEVINS_2_DATA_CC(pDevIns, POHCICC); - POHCILOAD pLoad = pThisCC->pLoad; - LogFlow(("ohciR3LoadReattachDevices:\n")); - RT_NOREF(pTimer, pvUser); - - /* - * Reattach devices. - */ - for (unsigned i = 0; i < pLoad->cDevs; i++) - VUSBIRhAttachDevice(pThisCC->RootHub.pIRhConn, pLoad->apDevs[i]); - - /* - * Cleanup. - */ - PDMDevHlpTimerDestroy(pDevIns, pLoad->hTimer); - pLoad->hTimer = NIL_TMTIMERHANDLE; - PDMDevHlpMMHeapFree(pDevIns, pLoad); - pThisCC->pLoad = NULL; -} - - -/** * Reset notification. * * @returns VBox status code. @@ -6106,8 +5862,8 @@ */ rc = PDMDevHlpSSMRegisterEx(pDevIns, OHCI_SAVED_STATE_VERSION, sizeof(*pThis), NULL, NULL, NULL, NULL, - ohciR3SavePrep, ohciR3SaveExec, ohciR3SaveDone, - ohciR3LoadPrep, ohciR3LoadExec, ohciR3LoadDone); + NULL, ohciR3SaveExec, NULL, + NULL, ohciR3LoadExec, NULL); AssertRCReturn(rc, rc); /* @@ -6123,10 +5879,6 @@ AssertMsgReturn(pThisCC->RootHub.pIRhConn, ("Configuration error: The driver doesn't provide the VUSBIROOTHUBCONNECTOR interface!\n"), VERR_PDM_MISSING_INTERFACE); - pThisCC->RootHub.pIDev = PDMIBASE_QUERY_INTERFACE(pThisCC->RootHub.pIBase, VUSBIDEVICE); - AssertMsgReturn(pThisCC->RootHub.pIDev, - ("Configuration error: The driver doesn't provide the VUSBIDEVICE interface!\n"), - VERR_PDM_MISSING_INTERFACE); /* * Attach status driver (optional). diff -Nru virtualbox-hwe-6.1.34-dfsg/src/VBox/Devices/USB/DrvVUSBRootHub.cpp virtualbox-hwe-6.1.38-dfsg/src/VBox/Devices/USB/DrvVUSBRootHub.cpp --- virtualbox-hwe-6.1.34-dfsg/src/VBox/Devices/USB/DrvVUSBRootHub.cpp 2022-03-22 23:43:36.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/src/VBox/Devices/USB/DrvVUSBRootHub.cpp 2022-09-01 13:26:59.000000000 +0000 @@ -219,6 +219,118 @@ #include "VBoxDD.h" +#define VUSB_ROOTHUB_SAVED_STATE_VERSION 1 + + +/** + * Data used for reattaching devices on a state load. + */ +typedef struct VUSBROOTHUBLOAD +{ + /** Timer used once after state load to inform the guest about new devices. + * We do this to be sure the guest get any disconnect / reconnect on the + * same port. */ + TMTIMERHANDLE hTimer; + /** Number of detached devices. */ + unsigned cDevs; + /** Array of devices which were detached. */ + PVUSBDEV apDevs[VUSB_DEVICES_MAX]; +} VUSBROOTHUBLOAD; + + +/** + * Returns the attached VUSB device for the given port or NULL if none is attached. + * + * @returns Pointer to the VUSB device or NULL if not found. + * @param pThis The VUSB roothub device instance. + * @param uPort The port to get the device for. + * @param pszWho Caller of this method. + * + * @note The reference count of the VUSB device structure is retained to prevent it from going away. + */ +static PVUSBDEV vusbR3RhGetVUsbDevByPortRetain(PVUSBROOTHUB pThis, uint32_t uPort, const char *pszWho) +{ + PVUSBDEV pDev = NULL; + + AssertReturn(uPort < RT_ELEMENTS(pThis->apDevByPort), NULL); + + RTCritSectEnter(&pThis->CritSectDevices); + + pDev = pThis->apDevByPort[uPort]; + if (RT_LIKELY(pDev)) + vusbDevRetain(pDev, pszWho); + + RTCritSectLeave(&pThis->CritSectDevices); + + return pDev; +} + + +/** + * Returns the attached VUSB device for the given port or NULL if none is attached. + * + * @returns Pointer to the VUSB device or NULL if not found. + * @param pThis The VUSB roothub device instance. + * @param u8Address The address to get the device for. + * @param pszWho Caller of this method. + * + * @note The reference count of the VUSB device structure is retained to prevent it from going away. + */ +static PVUSBDEV vusbR3RhGetVUsbDevByAddrRetain(PVUSBROOTHUB pThis, uint8_t u8Address, const char *pszWho) +{ + PVUSBDEV pDev = NULL; + + AssertReturn(u8Address < RT_ELEMENTS(pThis->apDevByAddr), NULL); + + RTCritSectEnter(&pThis->CritSectDevices); + + pDev = pThis->apDevByAddr[u8Address]; + if (RT_LIKELY(pDev)) + vusbDevRetain(pDev, pszWho); + + RTCritSectLeave(&pThis->CritSectDevices); + + return pDev; +} + + +/** + * Returns a human readable string fromthe given USB speed enum. + * + * @returns Human readable string. + * @param enmSpeed The speed to stringify. + */ +static const char *vusbGetSpeedString(VUSBSPEED enmSpeed) +{ + const char *pszSpeed = NULL; + + switch (enmSpeed) + { + case VUSB_SPEED_LOW: + pszSpeed = "Low"; + break; + case VUSB_SPEED_FULL: + pszSpeed = "Full"; + break; + case VUSB_SPEED_HIGH: + pszSpeed = "High"; + break; + case VUSB_SPEED_VARIABLE: + pszSpeed = "Variable"; + break; + case VUSB_SPEED_SUPER: + pszSpeed = "Super"; + break; + case VUSB_SPEED_SUPERPLUS: + pszSpeed = "SuperPlus"; + break; + default: + pszSpeed = "Unknown"; + break; + } + return pszSpeed; +} + /** * Attaches a device to a specific hub. @@ -226,17 +338,112 @@ * This function is called by the vusb_add_device() and vusbRhAttachDevice(). * * @returns VBox status code. - * @param pHub The hub to attach it to. + * @param pThis The roothub to attach it to. * @param pDev The device to attach. * @thread EMT */ -static int vusbHubAttach(PVUSBHUB pHub, PVUSBDEV pDev) +static int vusbHubAttach(PVUSBROOTHUB pThis, PVUSBDEV pDev) +{ + LogFlow(("vusbHubAttach: pThis=%p[%s] pDev=%p[%s]\n", pThis, pThis->pszName, pDev, pDev->pUsbIns->pszName)); + + /* + * Assign a port. + */ + int iPort = ASMBitFirstSet(&pThis->Bitmap, sizeof(pThis->Bitmap) * 8); + if (iPort < 0) + { + LogRel(("VUSB: No ports available!\n")); + return VERR_VUSB_NO_PORTS; + } + ASMBitClear(&pThis->Bitmap, iPort); + pThis->cDevices++; + pDev->i16Port = iPort; + + /* Call the device attach helper, so it can initialize its state. */ + int rc = vusbDevAttach(pDev, pThis); + if (RT_SUCCESS(rc)) + { + RTCritSectEnter(&pThis->CritSectDevices); + Assert(!pThis->apDevByPort[iPort]); + pThis->apDevByPort[iPort] = pDev; + RTCritSectLeave(&pThis->CritSectDevices); + + /* + * Call the HCI attach routine and let it have its say before the device is + * linked into the device list of this hub. + */ + VUSBSPEED enmSpeed = pDev->IDevice.pfnGetSpeed(&pDev->IDevice); + rc = pThis->pIRhPort->pfnAttach(pThis->pIRhPort, iPort, enmSpeed); + if (RT_SUCCESS(rc)) + { + LogRel(("VUSB: Attached '%s' to port %d on %s (%sSpeed)\n", pDev->pUsbIns->pszName, + iPort, pThis->pszName, vusbGetSpeedString(pDev->pUsbIns->enmSpeed))); + return VINF_SUCCESS; + } + + /* Remove from the port in case of failure. */ + RTCritSectEnter(&pThis->CritSectDevices); + Assert(!pThis->apDevByPort[iPort]); + pThis->apDevByPort[iPort] = NULL; + RTCritSectLeave(&pThis->CritSectDevices); + + vusbDevDetach(pDev); + } + + ASMBitSet(&pThis->Bitmap, iPort); + pThis->cDevices--; + pDev->i16Port = -1; + LogRel(("VUSB: Failed to attach '%s' to port %d, rc=%Rrc\n", pDev->pUsbIns->pszName, iPort, rc)); + + return rc; +} + + +/** + * Detaches the given device from the given roothub. + * + * @returns VBox status code. + * @param pThis The roothub to detach the device from. + * @param pDev The device to detach. + */ +static int vusbHubDetach(PVUSBROOTHUB pThis, PVUSBDEV pDev) { - LogFlow(("vusbHubAttach: pHub=%p[%s] pDev=%p[%s]\n", pHub, pHub->pszName, pDev, pDev->pUsbIns->pszName)); - return vusbDevAttach(pDev, pHub); + Assert(pDev->i16Port != -1); + + /* + * Detach the device and mark the port as available. + */ + unsigned uPort = pDev->i16Port; + pDev->i16Port = -1; + pThis->pIRhPort->pfnDetach(pThis->pIRhPort, uPort); + ASMBitSet(&pThis->Bitmap, uPort); + pThis->cDevices--; + + /* Check that it's attached and remove it. */ + RTCritSectEnter(&pThis->CritSectDevices); + Assert(pThis->apDevByPort[uPort] == pDev); + pThis->apDevByPort[uPort] = NULL; + + if (pDev->u8Address != VUSB_INVALID_ADDRESS) + { + Assert(pThis->apDevByAddr[pDev->u8Address] == pDev); + pThis->apDevByAddr[pDev->u8Address] = NULL; + + pDev->u8Address = VUSB_INVALID_ADDRESS; + pDev->u8NewAddress = VUSB_INVALID_ADDRESS; + } + RTCritSectLeave(&pThis->CritSectDevices); + + /* Cancel all in-flight URBs from this device. */ + vusbDevCancelAllUrbs(pDev, true); + + /* Free resources. */ + vusbDevDetach(pDev); + return VINF_SUCCESS; } + /* -=-=-=-=-=- PDMUSBHUBREG methods -=-=-=-=-=- */ /** @interface_method_impl{PDMUSBHUBREG,pfnAttachDevice} */ @@ -253,7 +460,7 @@ if (RT_SUCCESS(rc)) { pUsbIns->pvVUsbDev2 = pDev; - rc = vusbHubAttach(&pThis->Hub, pDev); + rc = vusbHubAttach(pThis, pDev); if (RT_SUCCESS(rc)) { *piPort = UINT32_MAX; /// @todo implement piPort @@ -263,7 +470,7 @@ RTMemFree(pDev->paIfStates); pUsbIns->pvVUsbDev2 = NULL; } - vusbDevRelease(pDev); + vusbDevRelease(pDev, "vusbPDMHubAttachDevice"); return rc; } @@ -271,23 +478,20 @@ /** @interface_method_impl{PDMUSBHUBREG,pfnDetachDevice} */ static DECLCALLBACK(int) vusbPDMHubDetachDevice(PPDMDRVINS pDrvIns, PPDMUSBINS pUsbIns, uint32_t iPort) { - RT_NOREF(pDrvIns, iPort); + RT_NOREF(iPort); + PVUSBROOTHUB pThis = PDMINS_2_DATA(pDrvIns, PVUSBROOTHUB); PVUSBDEV pDev = (PVUSBDEV)pUsbIns->pvVUsbDev2; Assert(pDev); + LogRel(("VUSB: Detached '%s' from port %u on %s\n", pDev->pUsbIns->pszName, pDev->i16Port, pThis->pszName)); + /* * Deal with pending async reset. * (anything but reset) */ vusbDevSetStateCmp(pDev, VUSB_DEVICE_STATE_DEFAULT, VUSB_DEVICE_STATE_RESET); - - /* - * Detach and free resources. - */ - if (pDev->pHub) - vusbDevDetach(pDev); - - vusbDevRelease(pDev); + vusbHubDetach(pThis, pDev); + vusbDevRelease(pDev, "vusbPDMHubDetachDevice"); return VINF_SUCCESS; } @@ -307,34 +511,6 @@ /** - * Finds an device attached to a roothub by it's address. - * - * @returns Pointer to the device. - * @returns NULL if not found. - * @param pRh Pointer to the root hub. - * @param Address The device address. - */ -static PVUSBDEV vusbRhFindDevByAddress(PVUSBROOTHUB pRh, uint8_t Address) -{ - unsigned iHash = vusbHashAddress(Address); - PVUSBDEV pDev = NULL; - - RTCritSectEnter(&pRh->CritSectDevices); - for (PVUSBDEV pCur = pRh->apAddrHash[iHash]; pCur; pCur = pCur->pNextHash) - if (pCur->u8Address == Address) - { - pDev = pCur; - break; - } - - if (pDev) - vusbDevRetain(pDev); - RTCritSectLeave(&pRh->CritSectDevices); - return pDev; -} - - -/** * Callback for freeing an URB. * @param pUrb The URB to free. */ @@ -349,6 +525,10 @@ Assert(pUrb->enmState != VUSBURBSTATE_FREE); +#ifdef LOG_ENABLED + vusbUrbTrace(pUrb, "vusbRhFreeUrb", true); +#endif + /* * Free the URB description (logging builds only). */ @@ -364,21 +544,21 @@ PVUSBDEV pDev = pUrb->pVUsb->pDev; vusbUrbPoolFree(&pUrb->pVUsb->pDev->UrbPool, pUrb); - vusbDevRelease(pDev); + vusbDevRelease(pDev, "vusbRhFreeUrb"); } else - vusbUrbPoolFree(&pRh->Hub.Dev.UrbPool, pUrb); + vusbUrbPoolFree(&pRh->UrbPool, pUrb); } /** * Worker routine for vusbRhConnNewUrb(). */ -static PVUSBURB vusbRhNewUrb(PVUSBROOTHUB pRh, uint8_t DstAddress, PVUSBDEV pDev, VUSBXFERTYPE enmType, +static PVUSBURB vusbRhNewUrb(PVUSBROOTHUB pRh, uint8_t DstAddress, uint32_t uPort, VUSBXFERTYPE enmType, VUSBDIRECTION enmDir, uint32_t cbData, uint32_t cTds, const char *pszTag) { RT_NOREF(pszTag); - PVUSBURBPOOL pUrbPool = &pRh->Hub.Dev.UrbPool; + PVUSBURBPOOL pUrbPool = &pRh->UrbPool; if (RT_UNLIKELY(cbData > (32 * _1M))) { @@ -386,10 +566,11 @@ return NULL; } - if (!pDev) - pDev = vusbRhFindDevByAddress(pRh, DstAddress); + PVUSBDEV pDev; + if (uPort == VUSB_DEVICE_PORT_INVALID) + pDev = vusbR3RhGetVUsbDevByAddrRetain(pRh, DstAddress, "vusbRhNewUrb"); else - vusbDevRetain(pDev); + pDev = vusbR3RhGetVUsbDevByPortRetain(pRh, uPort, "vusbRhNewUrb"); if (pDev) pUrbPool = &pDev->UrbPool; @@ -429,6 +610,8 @@ RTStrAPrintf(&pUrb->pszDesc, "URB %p %s%c%04d (%s)", pUrb, pszType, (pUrb->enmDir == VUSBDIRECTION_IN) ? '<' : ((pUrb->enmDir == VUSBDIRECTION_SETUP) ? 's' : '>'), pRh->iSerial, pszTag ? pszTag : ""); + + vusbUrbTrace(pUrb, "vusbRhNewUrb", false); #endif } @@ -630,12 +813,57 @@ } +/** @interface_method_impl{VUSBIROOTHUBCONNECTOR,pfnReset} */ +static DECLCALLBACK(int) vusbR3RhReset(PVUSBIROOTHUBCONNECTOR pInterface, bool fResetOnLinux) +{ + PVUSBROOTHUB pRh = VUSBIROOTHUBCONNECTOR_2_VUSBROOTHUB(pInterface); + return pRh->pIRhPort->pfnReset(pRh->pIRhPort, fResetOnLinux); +} + + +/** @interface_method_impl{VUSBIROOTHUBCONNECTOR,pfnPowerOn} */ +static DECLCALLBACK(int) vusbR3RhPowerOn(PVUSBIROOTHUBCONNECTOR pInterface) +{ + PVUSBROOTHUB pRh = VUSBIROOTHUBCONNECTOR_2_VUSBROOTHUB(pInterface); + LogFlow(("vusR3bRhPowerOn: pRh=%p\n", pRh)); + + Assert( pRh->enmState != VUSB_DEVICE_STATE_DETACHED + && pRh->enmState != VUSB_DEVICE_STATE_RESET); + + if (pRh->enmState == VUSB_DEVICE_STATE_ATTACHED) + pRh->enmState = VUSB_DEVICE_STATE_POWERED; + + return VINF_SUCCESS; +} + + +/** @interface_method_impl{VUSBIROOTHUBCONNECTOR,pfnPowerOff} */ +static DECLCALLBACK(int) vusbR3RhPowerOff(PVUSBIROOTHUBCONNECTOR pInterface) +{ + PVUSBROOTHUB pThis = VUSBIROOTHUBCONNECTOR_2_VUSBROOTHUB(pInterface); + LogFlow(("vusbR3RhDevPowerOff: pThis=%p\n", pThis)); + + Assert( pThis->enmState != VUSB_DEVICE_STATE_DETACHED + && pThis->enmState != VUSB_DEVICE_STATE_RESET); + + /* + * Cancel all URBs and reap them. + */ + VUSBIRhCancelAllUrbs(&pThis->IRhConnector); + for (uint32_t uPort = 0; uPort < RT_ELEMENTS(pThis->apDevByPort); uPort++) + VUSBIRhReapAsyncUrbs(&pThis->IRhConnector, uPort, 0); + + pThis->enmState = VUSB_DEVICE_STATE_ATTACHED; + return VINF_SUCCESS; +} + + /** @interface_method_impl{VUSBIROOTHUBCONNECTOR,pfnNewUrb} */ -static DECLCALLBACK(PVUSBURB) vusbRhConnNewUrb(PVUSBIROOTHUBCONNECTOR pInterface, uint8_t DstAddress, PVUSBIDEVICE pDev, VUSBXFERTYPE enmType, +static DECLCALLBACK(PVUSBURB) vusbRhConnNewUrb(PVUSBIROOTHUBCONNECTOR pInterface, uint8_t DstAddress, uint32_t uPort, VUSBXFERTYPE enmType, VUSBDIRECTION enmDir, uint32_t cbData, uint32_t cTds, const char *pszTag) { PVUSBROOTHUB pRh = VUSBIROOTHUBCONNECTOR_2_VUSBROOTHUB(pInterface); - return vusbRhNewUrb(pRh, DstAddress, (PVUSBDEV)pDev, enmType, enmDir, cbData, cTds, pszTag); + return vusbRhNewUrb(pRh, DstAddress, uPort, enmType, enmDir, cbData, cTds, pszTag); } @@ -726,13 +954,11 @@ } else { - vusbDevRetain(&pRh->Hub.Dev); - pUrb->pVUsb->pDev = &pRh->Hub.Dev; Log(("vusb: pRh=%p: SUBMIT: Address %i not found!!!\n", pRh, pUrb->DstAddress)); pUrb->enmState = VUSBURBSTATE_REAPED; pUrb->enmStatus = VUSBSTATUS_DNR; - vusbUrbCompletionRh(pUrb); + vusbUrbCompletionRhEx(pRh, pUrb); rc = VINF_SUCCESS; } @@ -759,18 +985,23 @@ } /** @interface_method_impl{VUSBIROOTHUBCONNECTOR,pfnReapAsyncUrbs} */ -static DECLCALLBACK(void) vusbRhReapAsyncUrbs(PVUSBIROOTHUBCONNECTOR pInterface, PVUSBIDEVICE pDevice, RTMSINTERVAL cMillies) +static DECLCALLBACK(void) vusbRhReapAsyncUrbs(PVUSBIROOTHUBCONNECTOR pInterface, uint32_t uPort, RTMSINTERVAL cMillies) { PVUSBROOTHUB pRh = VUSBIROOTHUBCONNECTOR_2_VUSBROOTHUB(pInterface); NOREF(pRh); - PVUSBDEV pDev = (PVUSBDEV)pDevice; + PVUSBDEV pDev = vusbR3RhGetVUsbDevByPortRetain(pRh, uPort, "vusbRhReapAsyncUrbs"); - if (RTListIsEmpty(&pDev->LstAsyncUrbs)) + if (!pDev) return; - STAM_PROFILE_START(&pRh->StatReapAsyncUrbs, a); - int rc = vusbDevIoThreadExecSync(pDev, (PFNRT)vusbRhReapAsyncUrbsWorker, 2, pDev, cMillies); - AssertRC(rc); - STAM_PROFILE_STOP(&pRh->StatReapAsyncUrbs, a); + if (!RTListIsEmpty(&pDev->LstAsyncUrbs)) + { + STAM_PROFILE_START(&pRh->StatReapAsyncUrbs, a); + int rc = vusbDevIoThreadExecSync(pDev, (PFNRT)vusbRhReapAsyncUrbsWorker, 2, pDev, cMillies); + AssertRC(rc); + STAM_PROFILE_STOP(&pRh->StatReapAsyncUrbs, a); + } + + vusbDevRelease(pDev, "vusbRhReapAsyncUrbs"); } @@ -823,16 +1054,16 @@ /** @interface_method_impl{VUSBIROOTHUBCONNECTOR,pfnCancelAllUrbs} */ static DECLCALLBACK(void) vusbRhCancelAllUrbs(PVUSBIROOTHUBCONNECTOR pInterface) { - PVUSBROOTHUB pRh = VUSBIROOTHUBCONNECTOR_2_VUSBROOTHUB(pInterface); + PVUSBROOTHUB pThis = VUSBIROOTHUBCONNECTOR_2_VUSBROOTHUB(pInterface); - RTCritSectEnter(&pRh->CritSectDevices); - PVUSBDEV pDev = pRh->pDevices; - while (pDev) + RTCritSectEnter(&pThis->CritSectDevices); + for (unsigned i = 0; i < RT_ELEMENTS(pThis->apDevByPort); i++) { - vusbDevIoThreadExecSync(pDev, (PFNRT)vusbRhCancelAllUrbsWorker, 1, pDev); - pDev = pDev->pNext; + PVUSBDEV pDev = pThis->apDevByPort[i]; + if (pDev) + vusbDevIoThreadExecSync(pDev, (PFNRT)vusbRhCancelAllUrbsWorker, 1, pDev); } - RTCritSectLeave(&pRh->CritSectDevices); + RTCritSectLeave(&pThis->CritSectDevices); } /** @@ -870,16 +1101,16 @@ /** @interface_method_impl{VUSBIROOTHUBCONNECTOR,pfnAbortEp} */ -static DECLCALLBACK(int) vusbRhAbortEp(PVUSBIROOTHUBCONNECTOR pInterface, PVUSBIDEVICE pDevice, int EndPt, VUSBDIRECTION enmDir) +static DECLCALLBACK(int) vusbRhAbortEp(PVUSBIROOTHUBCONNECTOR pInterface, uint32_t uPort, int EndPt, VUSBDIRECTION enmDir) { PVUSBROOTHUB pRh = VUSBIROOTHUBCONNECTOR_2_VUSBROOTHUB(pInterface); - if (&pRh->Hub != ((PVUSBDEV)pDevice)->pHub) + PVUSBDEV pDev = vusbR3RhGetVUsbDevByPortRetain(pRh, uPort, "vusbRhAbortEp"); + + if (pDev->pHub != pRh) AssertFailedReturn(VERR_INVALID_PARAMETER); - RTCritSectEnter(&pRh->CritSectDevices); - PVUSBDEV pDev = (PVUSBDEV)pDevice; vusbDevIoThreadExecSync(pDev, (PFNRT)vusbRhAbortEpWorker, 3, pDev, EndPt, enmDir); - RTCritSectLeave(&pRh->CritSectDevices); + vusbDevRelease(pDev, "vusbRhAbortEp"); /* The reaper thread will take care of completing the URB. */ @@ -887,24 +1118,6 @@ } -/** @interface_method_impl{VUSBIROOTHUBCONNECTOR,pfnAttachDevice} */ -static DECLCALLBACK(int) vusbRhAttachDevice(PVUSBIROOTHUBCONNECTOR pInterface, PVUSBIDEVICE pDevice) -{ - PVUSBROOTHUB pRh = VUSBIROOTHUBCONNECTOR_2_VUSBROOTHUB(pInterface); - return vusbHubAttach(&pRh->Hub, (PVUSBDEV)pDevice); -} - - -/** @interface_method_impl{VUSBIROOTHUBCONNECTOR,pfnDetachDevice} */ -static DECLCALLBACK(int) vusbRhDetachDevice(PVUSBIROOTHUBCONNECTOR pInterface, PVUSBIDEVICE pDevice) -{ - PVUSBROOTHUB pRh = VUSBIROOTHUBCONNECTOR_2_VUSBROOTHUB(pInterface); - if (&pRh->Hub != ((PVUSBDEV)pDevice)->pHub) - AssertFailedReturn(VERR_INVALID_PARAMETER); - return vusbDevDetach((PVUSBDEV)pDevice); -} - - /** @interface_method_impl{VUSBIROOTHUBCONNECTOR,pfnSetPeriodicFrameProcessing} */ static DECLCALLBACK(int) vusbRhSetFrameProcessing(PVUSBIROOTHUBCONNECTOR pInterface, uint32_t uFrameRate) { @@ -979,12 +1192,12 @@ } /** @interface_method_impl{VUSBIROOTHUBCONNECTOR,pfnUpdateIsocFrameDelta} */ -static DECLCALLBACK(uint32_t) vusbRhUpdateIsocFrameDelta(PVUSBIROOTHUBCONNECTOR pInterface, PVUSBIDEVICE pDevice, +static DECLCALLBACK(uint32_t) vusbRhUpdateIsocFrameDelta(PVUSBIROOTHUBCONNECTOR pInterface, uint32_t uPort, int EndPt, VUSBDIRECTION enmDir, uint16_t uNewFrameID, uint8_t uBits) { PVUSBROOTHUB pRh = VUSBIROOTHUBCONNECTOR_2_VUSBROOTHUB(pInterface); AssertReturn(pRh, 0); - PVUSBDEV pDev = (PVUSBDEV)pDevice; + PVUSBDEV pDev = vusbR3RhGetVUsbDevByPortRetain(pRh, uPort, "vusbRhUpdateIsocFrameDelta"); AssertPtr(pDev); PVUSBPIPE pPipe = &pDev->aPipes[EndPt]; uint32_t *puLastFrame; int32_t uFrameDelta; @@ -997,214 +1210,280 @@ if (uFrameDelta < 0) uFrameDelta += uMaxVal; + vusbDevRelease(pDev, "vusbRhUpdateIsocFrameDelta"); return (uint16_t)uFrameDelta; } -/* -=-=-=-=-=- VUSB Device methods (for the root hub) -=-=-=-=-=- */ +/** @interface_method_impl{VUSBIROOTHUBCONNECTOR,pfnDevReset} */ +static DECLCALLBACK(int) vusbR3RhDevReset(PVUSBIROOTHUBCONNECTOR pInterface, uint32_t uPort, bool fResetOnLinux, + PFNVUSBRESETDONE pfnDone, void *pvUser, PVM pVM) +{ + PVUSBROOTHUB pThis = VUSBIROOTHUBCONNECTOR_2_VUSBROOTHUB(pInterface); + PVUSBDEV pDev = vusbR3RhGetVUsbDevByPortRetain(pThis, uPort, "vusbR3RhDevReset"); + AssertPtr(pDev); -/** - * @interface_method_impl{VUSBIDEVICE,pfnReset} - */ -static DECLCALLBACK(int) vusbRhDevReset(PVUSBIDEVICE pInterface, bool fResetOnLinux, - PFNVUSBRESETDONE pfnDone, void *pvUser, PVM pVM) + int rc = VUSBIDevReset(&pDev->IDevice, fResetOnLinux, pfnDone, pvUser, pVM); + vusbDevRelease(pDev, "vusbR3RhDevReset"); + return rc; +} + + +/** @interface_method_impl{VUSBIROOTHUBCONNECTOR,pfnDevPowerOn} */ +static DECLCALLBACK(int) vusbR3RhDevPowerOn(PVUSBIROOTHUBCONNECTOR pInterface, uint32_t uPort) { - RT_NOREF(pfnDone, pvUser, pVM); - PVUSBROOTHUB pRh = RT_FROM_MEMBER(pInterface, VUSBROOTHUB, Hub.Dev.IDevice); - Assert(!pfnDone); - return pRh->pIRhPort->pfnReset(pRh->pIRhPort, fResetOnLinux); /** @todo change rc from bool to vbox status everywhere! */ + PVUSBROOTHUB pThis = VUSBIROOTHUBCONNECTOR_2_VUSBROOTHUB(pInterface); + PVUSBDEV pDev = vusbR3RhGetVUsbDevByPortRetain(pThis, uPort, "vusbR3RhDevPowerOn"); + AssertPtr(pDev); + + int rc = VUSBIDevPowerOn(&pDev->IDevice); + vusbDevRelease(pDev, "vusbR3RhDevPowerOn"); + return rc; } -/** - * @interface_method_impl{VUSBIDEVICE,pfnPowerOn} - */ -static DECLCALLBACK(int) vusbRhDevPowerOn(PVUSBIDEVICE pInterface) +/** @interface_method_impl{VUSBIROOTHUBCONNECTOR,pfnDevPowerOff} */ +static DECLCALLBACK(int) vusbR3RhDevPowerOff(PVUSBIROOTHUBCONNECTOR pInterface, uint32_t uPort) { - PVUSBROOTHUB pRh = RT_FROM_MEMBER(pInterface, VUSBROOTHUB, Hub.Dev.IDevice); - LogFlow(("vusbRhDevPowerOn: pRh=%p\n", pRh)); + PVUSBROOTHUB pThis = VUSBIROOTHUBCONNECTOR_2_VUSBROOTHUB(pInterface); + PVUSBDEV pDev = vusbR3RhGetVUsbDevByPortRetain(pThis, uPort, "vusbR3RhDevPowerOff"); + AssertPtr(pDev); - Assert( pRh->Hub.Dev.enmState != VUSB_DEVICE_STATE_DETACHED - && pRh->Hub.Dev.enmState != VUSB_DEVICE_STATE_RESET); + int rc = VUSBIDevPowerOff(&pDev->IDevice); + vusbDevRelease(pDev, "vusbR3RhDevPowerOff"); + return rc; +} - if (pRh->Hub.Dev.enmState == VUSB_DEVICE_STATE_ATTACHED) - pRh->Hub.Dev.enmState = VUSB_DEVICE_STATE_POWERED; - return VINF_SUCCESS; +/** @interface_method_impl{VUSBIROOTHUBCONNECTOR,pfnDevGetState} */ +static DECLCALLBACK(VUSBDEVICESTATE) vusbR3RhDevGetState(PVUSBIROOTHUBCONNECTOR pInterface, uint32_t uPort) +{ + PVUSBROOTHUB pThis = VUSBIROOTHUBCONNECTOR_2_VUSBROOTHUB(pInterface); + PVUSBDEV pDev = vusbR3RhGetVUsbDevByPortRetain(pThis, uPort, "vusbR3RhDevGetState"); + AssertPtr(pDev); + + VUSBDEVICESTATE enmState = VUSBIDevGetState(&pDev->IDevice); + vusbDevRelease(pDev, "vusbR3RhDevGetState"); + return enmState; } -/** - * @interface_method_impl{VUSBIDEVICE,pfnPowerOff} - */ -static DECLCALLBACK(int) vusbRhDevPowerOff(PVUSBIDEVICE pInterface) +/** @interface_method_impl{VUSBIROOTHUBCONNECTOR,pfnDevIsSavedStateSupported} */ +static DECLCALLBACK(bool) vusbR3RhDevIsSavedStateSupported(PVUSBIROOTHUBCONNECTOR pInterface, uint32_t uPort) { - PVUSBROOTHUB pRh = RT_FROM_MEMBER(pInterface, VUSBROOTHUB, Hub.Dev.IDevice); - LogFlow(("vusbRhDevPowerOff: pRh=%p\n", pRh)); + PVUSBROOTHUB pThis = VUSBIROOTHUBCONNECTOR_2_VUSBROOTHUB(pInterface); + PVUSBDEV pDev = vusbR3RhGetVUsbDevByPortRetain(pThis, uPort, "vusbR3RhDevIsSavedStateSupported"); + AssertPtr(pDev); - Assert( pRh->Hub.Dev.enmState != VUSB_DEVICE_STATE_DETACHED - && pRh->Hub.Dev.enmState != VUSB_DEVICE_STATE_RESET); + bool fSavedStateSupported = VUSBIDevIsSavedStateSupported(&pDev->IDevice); + vusbDevRelease(pDev, "vusbR3RhDevIsSavedStateSupported"); + return fSavedStateSupported; +} - /* - * Cancel all URBs and reap them. - */ - VUSBIRhCancelAllUrbs(&pRh->IRhConnector); - RTCritSectEnter(&pRh->CritSectDevices); - PVUSBDEV pDev = pRh->pDevices; - while (pDev) - { - VUSBIRhReapAsyncUrbs(&pRh->IRhConnector, (PVUSBIDEVICE)pDev, 0); - pDev = pDev->pNext; - } - RTCritSectLeave(&pRh->CritSectDevices); - pRh->Hub.Dev.enmState = VUSB_DEVICE_STATE_ATTACHED; - return VINF_SUCCESS; +/** @interface_method_impl{VUSBIROOTHUBCONNECTOR,pfnDevGetSpeed} */ +static DECLCALLBACK(VUSBSPEED) vusbR3RhDevGetSpeed(PVUSBIROOTHUBCONNECTOR pInterface, uint32_t uPort) +{ + PVUSBROOTHUB pThis = VUSBIROOTHUBCONNECTOR_2_VUSBROOTHUB(pInterface); + PVUSBDEV pDev = vusbR3RhGetVUsbDevByPortRetain(pThis, uPort, "vusbR3RhDevGetSpeed"); + AssertPtr(pDev); + + VUSBSPEED enmSpeed = pDev->IDevice.pfnGetSpeed(&pDev->IDevice); + vusbDevRelease(pDev, "vusbR3RhDevGetSpeed"); + return enmSpeed; } + /** - * @interface_method_impl{VUSBIDEVICE,pfnGetState} + * @callback_method_impl{FNSSMDRVSAVEPREP, All URBs needs to be canceled.} */ -static DECLCALLBACK(VUSBDEVICESTATE) vusbRhDevGetState(PVUSBIDEVICE pInterface) +static DECLCALLBACK(int) vusbR3RhSavePrep(PPDMDRVINS pDrvIns, PSSMHANDLE pSSM) { - PVUSBROOTHUB pRh = RT_FROM_MEMBER(pInterface, VUSBROOTHUB, Hub.Dev.IDevice); - return pRh->Hub.Dev.enmState; -} + PVUSBROOTHUB pThis = PDMINS_2_DATA(pDrvIns, PVUSBROOTHUB); + LogFlow(("vusbR3RhSavePrep:\n")); + RT_NOREF(pSSM); + /* + * Detach all proxied devices. + */ + RTCritSectEnter(&pThis->CritSectDevices); -static const char *vusbGetSpeedString(VUSBSPEED enmSpeed) -{ - const char *pszSpeed = NULL; + /** @todo we a) can't tell which are proxied, and b) this won't work well when continuing after saving! */ + for (unsigned i = 0; i < RT_ELEMENTS(pThis->apDevByPort); i++) + { + PVUSBDEV pDev = pThis->apDevByPort[i]; + if (pDev) + { + if (!VUSBIDevIsSavedStateSupported(&pDev->IDevice)) + { + int rc = vusbHubDetach(pThis, pDev); + AssertRC(rc); + + /* + * Save the device pointers here so we can reattach them afterwards. + * This will work fine even if the save fails since the Done handler is + * called unconditionally if the Prep handler was called. + */ + pThis->apDevByPort[i] = pDev; + } + } + } - switch (enmSpeed) + RTCritSectLeave(&pThis->CritSectDevices); + + /* + * Kill old load data which might be hanging around. + */ + if (pThis->pLoad) { - case VUSB_SPEED_LOW: - pszSpeed = "Low"; - break; - case VUSB_SPEED_FULL: - pszSpeed = "Full"; - break; - case VUSB_SPEED_HIGH: - pszSpeed = "High"; - break; - case VUSB_SPEED_VARIABLE: - pszSpeed = "Variable"; - break; - case VUSB_SPEED_SUPER: - pszSpeed = "Super"; - break; - case VUSB_SPEED_SUPERPLUS: - pszSpeed = "SuperPlus"; - break; - default: - pszSpeed = "Unknown"; - break; + PDMDrvHlpTimerDestroy(pDrvIns, pThis->pLoad->hTimer); + pThis->pLoad->hTimer = NIL_TMTIMERHANDLE; + RTMemFree(pThis->pLoad); + pThis->pLoad = NULL; } - return pszSpeed; -} -/* -=-=-=-=-=- VUSB Hub methods -=-=-=-=-=- */ + return VINF_SUCCESS; +} /** - * Attach the device to the hub. - * Port assignments and all such stuff is up to this routine. - * - * @returns VBox status code. - * @param pHub Pointer to the hub. - * @param pDev Pointer to the device. + * @callback_method_impl{FNSSMDRVSAVEDONE} */ -static int vusbRhHubOpAttach(PVUSBHUB pHub, PVUSBDEV pDev) +static DECLCALLBACK(int) vusbR3RhSaveDone(PPDMDRVINS pDrvIns, PSSMHANDLE pSSM) { - PVUSBROOTHUB pRh = (PVUSBROOTHUB)pHub; + PVUSBROOTHUB pThis = PDMINS_2_DATA(pDrvIns, PVUSBROOTHUB); + PVUSBDEV aPortsOld[VUSB_DEVICES_MAX]; + unsigned i; + LogFlow(("vusbR3RhSaveDone:\n")); + RT_NOREF(pSSM); + + /* Save the current data. */ + memcpy(aPortsOld, pThis->apDevByPort, sizeof(aPortsOld)); + AssertCompile(sizeof(aPortsOld) == sizeof(pThis->apDevByPort)); /* - * Assign a port. + * NULL the dev pointers. */ - int iPort = ASMBitFirstSet(&pRh->Bitmap, sizeof(pRh->Bitmap) * 8); - if (iPort < 0) - { - LogRel(("VUSB: No ports available!\n")); - return VERR_VUSB_NO_PORTS; - } - ASMBitClear(&pRh->Bitmap, iPort); - pHub->cDevices++; - pDev->i16Port = iPort; + for (i = 0; i < RT_ELEMENTS(pThis->apDevByPort); i++) + if (pThis->apDevByPort[i] && !VUSBIDevIsSavedStateSupported(&pThis->apDevByPort[i]->IDevice)) + pThis->apDevByPort[i] = NULL; /* - * Call the HCI attach routine and let it have its say before the device is - * linked into the device list of this hub. + * Attach the devices. */ - int rc = pRh->pIRhPort->pfnAttach(pRh->pIRhPort, &pDev->IDevice, iPort); - if (RT_SUCCESS(rc)) + for (i = 0; i < RT_ELEMENTS(pThis->apDevByPort); i++) { - RTCritSectEnter(&pRh->CritSectDevices); - pDev->pNext = pRh->pDevices; - pRh->pDevices = pDev; - RTCritSectLeave(&pRh->CritSectDevices); - LogRel(("VUSB: Attached '%s' to port %d on %s (%sSpeed)\n", pDev->pUsbIns->pszName, - iPort, pHub->pszName, vusbGetSpeedString(pDev->pUsbIns->enmSpeed))); + PVUSBDEV pDev = aPortsOld[i]; + if (pDev && !VUSBIDevIsSavedStateSupported(&pDev->IDevice)) + vusbHubAttach(pThis, pDev); } - else - { - ASMBitSet(&pRh->Bitmap, iPort); - pHub->cDevices--; - pDev->i16Port = -1; - LogRel(("VUSB: Failed to attach '%s' to port %d, rc=%Rrc\n", pDev->pUsbIns->pszName, iPort, rc)); + + return VINF_SUCCESS; +} + + +/** + * @callback_method_impl{FNSSMDRVLOADPREP, This must detach the devices + * currently attached and save them for reconnect after the state load has been + * completed.} + */ +static DECLCALLBACK(int) vusbR3RhLoadPrep(PPDMDRVINS pDrvIns, PSSMHANDLE pSSM) +{ + PVUSBROOTHUB pThis = PDMINS_2_DATA(pDrvIns, PVUSBROOTHUB); + int rc = VINF_SUCCESS; + LogFlow(("vusbR3RhLoadPrep:\n")); + RT_NOREF(pSSM); + + if (!pThis->pLoad) + { + VUSBROOTHUBLOAD Load; + unsigned i; + + /// @todo This is all bogus. + /* + * Detach all devices which are present in this session. Save them in the load + * structure so we can reattach them after restoring the guest. + */ + Load.hTimer = NIL_TMTIMERHANDLE; + Load.cDevs = 0; + for (i = 0; i < RT_ELEMENTS(pThis->apDevByPort); i++) + { + PVUSBDEV pDev = pThis->apDevByPort[i]; + if (pDev && !VUSBIDevIsSavedStateSupported(&pDev->IDevice)) + { + Load.apDevs[Load.cDevs++] = pDev; + vusbHubDetach(pThis, pDev); + Assert(!pThis->apDevByPort[i]); + } + } + + /* + * Any devices to reattach? If so, duplicate the Load struct. + */ + if (Load.cDevs) + { + pThis->pLoad = (PVUSBROOTHUBLOAD)RTMemAllocZ(sizeof(Load)); + if (!pThis->pLoad) + return VERR_NO_MEMORY; + *pThis->pLoad = Load; + } } + /* else: we ASSUME no device can be attached or detached in the time + * between a state load and the pLoad stuff processing. */ return rc; } /** - * Detach the device from the hub. - * - * @returns VBox status code. - * @param pHub Pointer to the hub. - * @param pDev Pointer to the device. + * Reattaches devices after a saved state load. */ -static void vusbRhHubOpDetach(PVUSBHUB pHub, PVUSBDEV pDev) +static DECLCALLBACK(void) vusbR3RhLoadReattachDevices(PPDMDRVINS pDrvIns, PTMTIMER pTimer, void *pvUser) { - PVUSBROOTHUB pRh = (PVUSBROOTHUB)pHub; - Assert(pDev->i16Port != -1); + PVUSBROOTHUB pThis = PDMINS_2_DATA(pDrvIns, PVUSBROOTHUB); + PVUSBROOTHUBLOAD pLoad = pThis->pLoad; + LogFlow(("vusbR3RhLoadReattachDevices:\n")); + RT_NOREF(pTimer, pvUser); /* - * Check that it's attached and unlink it from the linked list. + * Reattach devices. */ - RTCritSectEnter(&pRh->CritSectDevices); - if (pRh->pDevices != pDev) - { - PVUSBDEV pPrev = pRh->pDevices; - while (pPrev && pPrev->pNext != pDev) - pPrev = pPrev->pNext; - Assert(pPrev); - pPrev->pNext = pDev->pNext; - } - else - pRh->pDevices = pDev->pNext; - pDev->pNext = NULL; - RTCritSectLeave(&pRh->CritSectDevices); + for (unsigned i = 0; i < pLoad->cDevs; i++) + vusbHubAttach(pThis, pLoad->apDevs[i]); /* - * Detach the device and mark the port as available. + * Cleanup. */ - unsigned uPort = pDev->i16Port; - pRh->pIRhPort->pfnDetach(pRh->pIRhPort, &pDev->IDevice, uPort); - LogRel(("VUSB: Detached '%s' from port %u on %s\n", pDev->pUsbIns->pszName, uPort, pHub->pszName)); - ASMBitSet(&pRh->Bitmap, uPort); - pHub->cDevices--; + PDMDrvHlpTimerDestroy(pDrvIns, (TMTIMERHANDLE)pTimer); + pLoad->hTimer = NIL_TMTIMERHANDLE; + RTMemFree(pLoad); + pThis->pLoad = NULL; } /** - * The Hub methods implemented by the root hub. + * @callback_method_impl{FNSSMDRVLOADDONE} */ -static const VUSBHUBOPS s_VUsbRhHubOps = +static DECLCALLBACK(int) vusbR3RhLoadDone(PPDMDRVINS pDrvIns, PSSMHANDLE pSSM) { - vusbRhHubOpAttach, - vusbRhHubOpDetach -}; + PVUSBROOTHUB pThis = PDMINS_2_DATA(pDrvIns, PVUSBROOTHUB); + LogFlow(("vusbR3RhLoadDone:\n")); + RT_NOREF(pSSM); + /* + * Start a timer if we've got devices to reattach + */ + if (pThis->pLoad) + { + int rc = PDMDrvHlpTMTimerCreate(pDrvIns, TMCLOCK_VIRTUAL, vusbR3RhLoadReattachDevices, NULL, + TMTIMER_FLAGS_NO_CRIT_SECT, + "VUSB reattach on load", &pThis->pLoad->hTimer); + if (RT_SUCCESS(rc)) + rc = PDMDrvHlpTimerSetMillies(pDrvIns, pThis->pLoad->hTimer, 250); + return rc; + } + + return VINF_SUCCESS; +} /* -=-=-=-=-=- PDM Base interface methods -=-=-=-=-=- */ @@ -1220,7 +1499,6 @@ PDMIBASE_RETURN_INTERFACE(pszIID, PDMIBASE, &pDrvIns->IBase); PDMIBASE_RETURN_INTERFACE(pszIID, VUSBIROOTHUBCONNECTOR, &pRh->IRhConnector); - PDMIBASE_RETURN_INTERFACE(pszIID, VUSBIDEVICE, &pRh->Hub.Dev.IDevice); return NULL; } @@ -1241,11 +1519,11 @@ PVUSBROOTHUB pRh = PDMINS_2_DATA(pDrvIns, PVUSBROOTHUB); PDMDRV_CHECK_VERSIONS_RETURN_VOID(pDrvIns); - vusbUrbPoolDestroy(&pRh->Hub.Dev.UrbPool); - if (pRh->Hub.pszName) + vusbUrbPoolDestroy(&pRh->UrbPool); + if (pRh->pszName) { - RTStrFree(pRh->Hub.pszName); - pRh->Hub.pszName = NULL; + RTStrFree(pRh->pszName); + pRh->pszName = NULL; } if (pRh->hSniffer != VUSBSNIFFER_NIL) VUSBSnifferDestroy(pRh->hSniffer); @@ -1304,26 +1582,17 @@ */ pDrvIns->IBase.pfnQueryInterface = vusbRhQueryInterface; /* the usb device */ - pThis->Hub.Dev.enmState = VUSB_DEVICE_STATE_ATTACHED; - pThis->Hub.Dev.u8Address = VUSB_INVALID_ADDRESS; - pThis->Hub.Dev.u8NewAddress = VUSB_INVALID_ADDRESS; - pThis->Hub.Dev.i16Port = -1; - pThis->Hub.Dev.cRefs = 1; - pThis->Hub.Dev.IDevice.pfnReset = vusbRhDevReset; - pThis->Hub.Dev.IDevice.pfnPowerOn = vusbRhDevPowerOn; - pThis->Hub.Dev.IDevice.pfnPowerOff = vusbRhDevPowerOff; - pThis->Hub.Dev.IDevice.pfnGetState = vusbRhDevGetState; - /* the hub */ - pThis->Hub.pOps = &s_VUsbRhHubOps; - pThis->Hub.pRootHub = pThis; + pThis->enmState = VUSB_DEVICE_STATE_ATTACHED; //pThis->hub.cPorts - later - pThis->Hub.cDevices = 0; - pThis->Hub.Dev.pHub = &pThis->Hub; - RTStrAPrintf(&pThis->Hub.pszName, "RootHub#%d", pDrvIns->iInstance); + pThis->cDevices = 0; + RTStrAPrintf(&pThis->pszName, "RootHub#%d", pDrvIns->iInstance); /* misc */ pThis->pDrvIns = pDrvIns; /* the connector */ pThis->IRhConnector.pfnSetUrbParams = vusbRhSetUrbParams; + pThis->IRhConnector.pfnReset = vusbR3RhReset; + pThis->IRhConnector.pfnPowerOn = vusbR3RhPowerOn; + pThis->IRhConnector.pfnPowerOff = vusbR3RhPowerOff; pThis->IRhConnector.pfnNewUrb = vusbRhConnNewUrb; pThis->IRhConnector.pfnFreeUrb = vusbRhConnFreeUrb; pThis->IRhConnector.pfnSubmitUrb = vusbRhSubmitUrb; @@ -1331,11 +1600,15 @@ pThis->IRhConnector.pfnCancelUrbsEp = vusbRhCancelUrbsEp; pThis->IRhConnector.pfnCancelAllUrbs = vusbRhCancelAllUrbs; pThis->IRhConnector.pfnAbortEp = vusbRhAbortEp; - pThis->IRhConnector.pfnAttachDevice = vusbRhAttachDevice; - pThis->IRhConnector.pfnDetachDevice = vusbRhDetachDevice; pThis->IRhConnector.pfnSetPeriodicFrameProcessing = vusbRhSetFrameProcessing; pThis->IRhConnector.pfnGetPeriodicFrameRate = vusbRhGetPeriodicFrameRate; pThis->IRhConnector.pfnUpdateIsocFrameDelta = vusbRhUpdateIsocFrameDelta; + pThis->IRhConnector.pfnDevReset = vusbR3RhDevReset; + pThis->IRhConnector.pfnDevPowerOn = vusbR3RhDevPowerOn; + pThis->IRhConnector.pfnDevPowerOff = vusbR3RhDevPowerOff; + pThis->IRhConnector.pfnDevGetState = vusbR3RhDevGetState; + pThis->IRhConnector.pfnDevIsSavedStateSupported = vusbR3RhDevIsSavedStateSupported; + pThis->IRhConnector.pfnDevGetSpeed = vusbR3RhDevGetSpeed; pThis->hSniffer = VUSBSNIFFER_NIL; pThis->cbHci = 0; pThis->cbHciTd = 0; @@ -1353,8 +1626,8 @@ * Get number of ports and the availability bitmap. * ASSUME that the number of ports reported now at creation time is the max number. */ - pThis->Hub.cPorts = pThis->pIRhPort->pfnGetAvailablePorts(pThis->pIRhPort, &pThis->Bitmap); - Log(("vusbRhConstruct: cPorts=%d\n", pThis->Hub.cPorts)); + pThis->cPorts = pThis->pIRhPort->pfnGetAvailablePorts(pThis->pIRhPort, &pThis->Bitmap); + Log(("vusbRhConstruct: cPorts=%d\n", pThis->cPorts)); /* * Get the USB version of the attached HC. @@ -1363,7 +1636,7 @@ pThis->fHcVersions = pThis->pIRhPort->pfnGetUSBVersions(pThis->pIRhPort); Log(("vusbRhConstruct: fHcVersions=%u\n", pThis->fHcVersions)); - rc = vusbUrbPoolInit(&pThis->Hub.Dev.UrbPool); + rc = vusbUrbPoolInit(&pThis->UrbPool); if (RT_FAILURE(rc)) return rc; @@ -1382,12 +1655,21 @@ * Register ourselves as a USB hub. * The current implementation uses the VUSBIRHCONFIG interface for communication. */ - PCPDMUSBHUBHLP pHlp; /* not used currently */ - rc = PDMDrvHlpUSBRegisterHub(pDrvIns, pThis->fHcVersions, pThis->Hub.cPorts, &g_vusbHubReg, &pHlp); + PCPDMUSBHUBHLP pHlpUsb; /* not used currently */ + rc = PDMDrvHlpUSBRegisterHub(pDrvIns, pThis->fHcVersions, pThis->cPorts, &g_vusbHubReg, &pHlpUsb); if (RT_FAILURE(rc)) return rc; /* + * Register the saved state data unit for attaching devices. + */ + rc = PDMDrvHlpSSMRegisterEx(pDrvIns, VUSB_ROOTHUB_SAVED_STATE_VERSION, 0, + NULL, NULL, NULL, + vusbR3RhSavePrep, NULL, vusbR3RhSaveDone, + vusbR3RhLoadPrep, NULL, vusbR3RhLoadDone); + AssertRCReturn(rc, rc); + + /* * Statistics. (It requires a 30" monitor or extremely tiny fonts to edit this "table".) */ #ifdef VBOX_WITH_STATISTICS @@ -1513,7 +1795,8 @@ PDMDrvHlpSTAMRegisterF(pDrvIns, &pThis->StatFramesProcessedThread, STAMTYPE_COUNTER, STAMVISIBILITY_ALWAYS, STAMUNIT_OCCURENCES, "Processed frames in the dedicated thread", "/VUSB/%d/FramesProcessedThread", pDrvIns->iInstance); PDMDrvHlpSTAMRegisterF(pDrvIns, &pThis->StatFramesProcessedClbk, STAMTYPE_COUNTER, STAMVISIBILITY_ALWAYS, STAMUNIT_OCCURENCES, "Processed frames in the URB completion callback", "/VUSB/%d/FramesProcessedClbk", pDrvIns->iInstance); #endif - PDMDrvHlpSTAMRegisterF(pDrvIns, (void *)&pThis->Hub.Dev.UrbPool.cUrbsInPool, STAMTYPE_U32, STAMVISIBILITY_ALWAYS, STAMUNIT_COUNT, "The number of URBs in the pool.", "/VUSB/%d/cUrbsInPool", pDrvIns->iInstance); + PDMDrvHlpSTAMRegisterF(pDrvIns, (void *)&pThis->UrbPool.cUrbsInPool, STAMTYPE_U32, STAMVISIBILITY_ALWAYS, STAMUNIT_COUNT, "The number of URBs in the pool.", + "/VUSB/%d/cUrbsInPool", pDrvIns->iInstance); return VINF_SUCCESS; } diff -Nru virtualbox-hwe-6.1.34-dfsg/src/VBox/Devices/USB/VUSBDevice.cpp virtualbox-hwe-6.1.38-dfsg/src/VBox/Devices/USB/VUSBDevice.cpp --- virtualbox-hwe-6.1.34-dfsg/src/VBox/Devices/USB/VUSBDevice.cpp 2022-03-22 23:43:36.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/src/VBox/Devices/USB/VUSBDevice.cpp 2022-09-01 13:27:00.000000000 +0000 @@ -308,11 +308,11 @@ vusbDevSetState(pDev, VUSB_DEVICE_STATE_CONFIGURED); if (pDev->pUsbIns->pReg->pfnUsbSetConfiguration) { - RTCritSectEnter(&pDev->pHub->pRootHub->CritSectDevices); + RTCritSectEnter(&pDev->pHub->CritSectDevices); int rc = vusbDevIoThreadExecSync(pDev, (PFNRT)pDev->pUsbIns->pReg->pfnUsbSetConfiguration, 5, pDev->pUsbIns, pNewCfgDesc->Core.bConfigurationValue, pDev->pCurCfgDesc, pDev->paIfStates, pNewCfgDesc); - RTCritSectLeave(&pDev->pHub->pRootHub->CritSectDevices); + RTCritSectLeave(&pDev->pHub->CritSectDevices); if (RT_FAILURE(rc)) { Log(("vusb: error: %s: failed to set config %i (%Rrc) !!!\n", pDev->pUsbIns->pszName, iCfg, rc)); @@ -458,9 +458,9 @@ if (pDev->pUsbIns->pReg->pfnUsbSetInterface) { - RTCritSectEnter(&pDev->pHub->pRootHub->CritSectDevices); + RTCritSectEnter(&pDev->pHub->CritSectDevices); int rc = vusbDevIoThreadExecSync(pDev, (PFNRT)pDev->pUsbIns->pReg->pfnUsbSetInterface, 3, pDev->pUsbIns, iIf, iAlt); - RTCritSectLeave(&pDev->pHub->pRootHub->CritSectDevices); + RTCritSectLeave(&pDev->pHub->CritSectDevices); if (RT_FAILURE(rc)) { LogFlow(("vusbDevStdReqSetInterface: error: %s: couldn't find alt interface %u.%u (%Rrc)\n", pDev->pUsbIns->pszName, iIf, iAlt, rc)); @@ -532,10 +532,10 @@ && pSetup->wValue == 0 /* ENDPOINT_HALT */ && pDev->pUsbIns->pReg->pfnUsbClearHaltedEndpoint) { - RTCritSectEnter(&pDev->pHub->pRootHub->CritSectDevices); + RTCritSectEnter(&pDev->pHub->CritSectDevices); int rc = vusbDevIoThreadExecSync(pDev, (PFNRT)pDev->pUsbIns->pReg->pfnUsbClearHaltedEndpoint, 2, pDev->pUsbIns, pSetup->wIndex); - RTCritSectLeave(&pDev->pHub->pRootHub->CritSectDevices); + RTCritSectLeave(&pDev->pHub->CritSectDevices); return RT_SUCCESS(rc); } break; @@ -927,57 +927,6 @@ /** - * Add a device to the address hash - */ -static void vusbDevAddressHash(PVUSBDEV pDev) -{ - if (pDev->u8Address == VUSB_INVALID_ADDRESS) - return; - uint8_t u8Hash = vusbHashAddress(pDev->u8Address); - pDev->pNextHash = pDev->pHub->pRootHub->apAddrHash[u8Hash]; - pDev->pHub->pRootHub->apAddrHash[u8Hash] = pDev; -} - -/** - * Remove a device from the address hash - */ -static void vusbDevAddressUnHash(PVUSBDEV pDev) -{ - if (pDev->u8Address == VUSB_INVALID_ADDRESS) - return; - - uint8_t u8Hash = vusbHashAddress(pDev->u8Address); - pDev->u8Address = VUSB_INVALID_ADDRESS; - pDev->u8NewAddress = VUSB_INVALID_ADDRESS; - - RTCritSectEnter(&pDev->pHub->pRootHub->CritSectDevices); - PVUSBDEV pCur = pDev->pHub->pRootHub->apAddrHash[u8Hash]; - if (pCur == pDev) - { - /* special case, we're at the head */ - pDev->pHub->pRootHub->apAddrHash[u8Hash] = pDev->pNextHash; - pDev->pNextHash = NULL; - } - else - { - /* search the list */ - PVUSBDEV pPrev; - for (pPrev = pCur, pCur = pCur->pNextHash; - pCur; - pPrev = pCur, pCur = pCur->pNextHash) - { - if (pCur == pDev) - { - pPrev->pNextHash = pCur->pNextHash; - pDev->pNextHash = NULL; - break; - } - } - } - RTCritSectLeave(&pDev->pHub->pRootHub->CritSectDevices); -} - -/** * Sets the address of a device. * * Called by status_completion() and vusbDevResetWorker(). @@ -1010,30 +959,43 @@ if (pDev->u8Address == u8Address) return; + /** @todo The following logic belongs to the roothub and should actually be in that file. */ PVUSBROOTHUB pRh = vusbDevGetRh(pDev); AssertPtrReturnVoid(pRh); - if (pDev->u8Address == VUSB_DEFAULT_ADDRESS) - pRh->pDefaultAddress = NULL; - vusbDevAddressUnHash(pDev); + RTCritSectEnter(&pRh->CritSectDevices); + + /* Remove the device from the current address. */ + if (pDev->u8Address != VUSB_INVALID_ADDRESS) + { + Assert(pRh->apDevByAddr[pDev->u8Address] == pDev); + pRh->apDevByAddr[pDev->u8Address] = NULL; + } if (u8Address == VUSB_DEFAULT_ADDRESS) { - if (pRh->pDefaultAddress != NULL) + PVUSBDEV pDevDef = pRh->apDevByAddr[VUSB_DEFAULT_ADDRESS]; + + if (pDevDef) { - vusbDevAddressUnHash(pRh->pDefaultAddress); - vusbDevSetStateCmp(pRh->pDefaultAddress, VUSB_DEVICE_STATE_POWERED, VUSB_DEVICE_STATE_DEFAULT); + pDevDef->u8Address = VUSB_INVALID_ADDRESS; + pDevDef->u8NewAddress = VUSB_INVALID_ADDRESS; + vusbDevSetStateCmp(pDevDef, VUSB_DEVICE_STATE_POWERED, VUSB_DEVICE_STATE_DEFAULT); Log(("2 DEFAULT ADDRS\n")); } - pRh->pDefaultAddress = pDev; + pRh->apDevByAddr[VUSB_DEFAULT_ADDRESS] = pDev; vusbDevSetState(pDev, VUSB_DEVICE_STATE_DEFAULT); } else + { + Assert(!pRh->apDevByAddr[u8Address]); + pRh->apDevByAddr[u8Address] = pDev; vusbDevSetState(pDev, VUSB_DEVICE_STATE_ADDRESS); + } pDev->u8Address = u8Address; - vusbDevAddressHash(pDev); + RTCritSectLeave(&pRh->CritSectDevices); Log(("vusb: %p[%s]/%i: Assigned address %u\n", pDev, pDev->pUsbIns->pszName, pDev->i16Port, u8Address)); @@ -1217,9 +1179,9 @@ * * @returns VBox status code. * @param pDev The device to attach. - * @param pHub THe hub to attach to. + * @param pHub The roothub to attach to. */ -int vusbDevAttach(PVUSBDEV pDev, PVUSBHUB pHub) +int vusbDevAttach(PVUSBDEV pDev, PVUSBROOTHUB pHub) { AssertMsg(pDev->enmState == VUSB_DEVICE_STATE_DETACHED, ("enmState=%d\n", pDev->enmState)); @@ -1232,9 +1194,6 @@ /* Create I/O thread and attach to the hub. */ int rc = vusbDevUrbIoThreadCreate(pDev); - if (RT_SUCCESS(rc)) - rc = pHub->pOps->pfnAttach(pHub, pDev); - if (RT_FAILURE(rc)) { pDev->pHub = NULL; @@ -1259,18 +1218,6 @@ VUSBDEV_ASSERT_VALID_STATE(pDev->enmState); Assert(pDev->enmState != VUSB_DEVICE_STATE_RESET); - vusbDevCancelAllUrbs(pDev, true); - vusbDevAddressUnHash(pDev); - - PVUSBROOTHUB pRh = vusbDevGetRh(pDev); - if (!pRh) - AssertMsgFailedReturn(("Not attached!\n"), VERR_VUSB_DEVICE_NOT_ATTACHED); - if (pRh->pDefaultAddress == pDev) - pRh->pDefaultAddress = NULL; - - pDev->pHub->pOps->pfnDetach(pDev->pHub, pDev); - pDev->i16Port = -1; - /* * Destroy I/O thread and request queue last because they might still be used * when cancelling URBs. @@ -1361,10 +1308,9 @@ vusbDevSetState(pDev, VUSB_DEVICE_STATE_DEFAULT); pDev->u16Status = 0; vusbDevDoSelectConfig(pDev, &g_Config0); - if (!vusbDevIsRh(pDev)) - vusbDevSetAddress(pDev, VUSB_DEFAULT_ADDRESS); + vusbDevSetAddress(pDev, VUSB_DEFAULT_ADDRESS); if (pfnDone) - pfnDone(&pDev->IDevice, rc, pvUser); + pfnDone(&pDev->IDevice, pDev->i16Port, rc, pvUser); } @@ -1573,16 +1519,6 @@ return VERR_VUSB_DEVICE_IS_RESETTING; } - /* - * If it's a root hub, we will have to cancel all URBs and reap them. - */ - if (vusbDevIsRh(pDev)) - { - PVUSBROOTHUB pRh = (PVUSBROOTHUB)pDev; - VUSBIRhCancelAllUrbs(&pRh->IRhConnector); - VUSBIRhReapAsyncUrbs(&pRh->IRhConnector, pInterface, 0); - } - vusbDevSetState(pDev, VUSB_DEVICE_STATE_ATTACHED); return VINF_SUCCESS; } @@ -1775,8 +1711,6 @@ pDev->IDevice.pfnIsSavedStateSupported = vusbIDeviceIsSavedStateSupported; pDev->IDevice.pfnGetSpeed = vusbIDeviceGetSpeed; pDev->pUsbIns = pUsbIns; - pDev->pNext = NULL; - pDev->pNextHash = NULL; pDev->pHub = NULL; pDev->enmState = VUSB_DEVICE_STATE_DETACHED; pDev->cRefs = 1; diff -Nru virtualbox-hwe-6.1.34-dfsg/src/VBox/Devices/USB/VUSBInternal.h virtualbox-hwe-6.1.38-dfsg/src/VBox/Devices/USB/VUSBInternal.h --- virtualbox-hwe-6.1.34-dfsg/src/VBox/Devices/USB/VUSBInternal.h 2022-03-22 23:43:36.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/src/VBox/Devices/USB/VUSBInternal.h 2022-09-01 13:27:00.000000000 +0000 @@ -3,7 +3,7 @@ * Virtual USB - Internal header. * * This subsystem implements USB devices in a host controller independent - * way. All the host controller code has to do is use VUSBHUB for its + * way. All the host controller code has to do is use VUSBROOTHUB for its * root hub implementation and any emulated USB device may be plugged into * the virtual bus. */ @@ -56,8 +56,6 @@ /** Pointer to a Virtual USB device (core). */ typedef struct VUSBDEV *PVUSBDEV; -/** Pointer to a VUSB hub device. */ -typedef struct VUSBHUB *PVUSBHUB; /** Pointer to a VUSB root hub. */ typedef struct VUSBROOTHUB *PVUSBROOTHUB; @@ -219,19 +217,15 @@ typedef struct VUSBDEV { /** The device interface exposed to the HCI. */ - VUSBIDEVICE IDevice; + VUSBIDEVICE IDevice; /** Pointer to the PDM USB device instance. */ - PPDMUSBINS pUsbIns; - /** Next device in the chain maintained by the roothub. */ - PVUSBDEV pNext; - /** Pointer to the next device with the same address hash. */ - PVUSBDEV pNextHash; - /** Pointer to the hub this device is attached to. */ - PVUSBHUB pHub; + PPDMUSBINS pUsbIns; + /** Pointer to the roothub this device is attached to. */ + PVUSBROOTHUB pHub; /** The device state. */ - VUSBDEVICESTATE volatile enmState; + VUSBDEVICESTATE volatile enmState; /** Reference counter to protect the device structure from going away. */ - uint32_t volatile cRefs; + uint32_t volatile cRefs; /** The device address. */ uint8_t u8Address; @@ -294,16 +288,10 @@ int vusbDevInit(PVUSBDEV pDev, PPDMUSBINS pUsbIns, const char *pszCaptureFilename); void vusbDevDestroy(PVUSBDEV pDev); - -DECLINLINE(bool) vusbDevIsRh(PVUSBDEV pDev) -{ - return (pDev->pHub == (PVUSBHUB)pDev); -} - bool vusbDevDoSelectConfig(PVUSBDEV dev, PCVUSBDESCCONFIGEX pCfg); void vusbDevMapEndpoint(PVUSBDEV dev, PCVUSBDESCENDPOINTEX ep); int vusbDevDetach(PVUSBDEV pDev); -int vusbDevAttach(PVUSBDEV pDev, PVUSBHUB pHub); +int vusbDevAttach(PVUSBDEV pDev, PVUSBROOTHUB pHub); DECLINLINE(PVUSBROOTHUB) vusbDevGetRh(PVUSBDEV pDev); size_t vusbDevMaxInterfaces(PVUSBDEV dev); @@ -319,34 +307,6 @@ */ -/** Virtual method table for USB hub devices. - * Hub and roothub drivers need to implement these functions in addition to the - * vusb_dev_ops. - */ -typedef struct VUSBHUBOPS -{ - int (*pfnAttach)(PVUSBHUB pHub, PVUSBDEV pDev); - void (*pfnDetach)(PVUSBHUB pHub, PVUSBDEV pDev); -} VUSBHUBOPS; -/** Pointer to a const HUB method table. */ -typedef const VUSBHUBOPS *PCVUSBHUBOPS; - -/** A VUSB Hub Device - Hub and roothub drivers need to use this struct - * @todo eliminate this (PDM / roothubs only). - */ -typedef struct VUSBHUB -{ - VUSBDEV Dev; - PCVUSBHUBOPS pOps; - PVUSBROOTHUB pRootHub; - uint16_t cPorts; - uint16_t cDevices; - /** Name of the hub. Used for logging. */ - char *pszName; -} VUSBHUB; -AssertCompileMemberAlignment(VUSBHUB, pOps, 8); -AssertCompileSizeAlignment(VUSBHUB, 8); - /** @} */ @@ -374,8 +334,8 @@ -/** The address hash table size. */ -#define VUSB_ADDR_HASHSZ 5 +/** Pointer to a VUSBROOTHUBLOAD struct. */ +typedef struct VUSBROOTHUBLOAD *PVUSBROOTHUBLOAD; /** * The instance data of a root hub driver. @@ -386,25 +346,32 @@ */ typedef struct VUSBROOTHUB { - /** The HUB. - * @todo remove this? */ - VUSBHUB Hub; - /** Address hash table. */ - PVUSBDEV apAddrHash[VUSB_ADDR_HASHSZ]; - /** The default address. */ - PVUSBDEV pDefaultAddress; - /** Pointer to the driver instance. */ - PPDMDRVINS pDrvIns; + PPDMDRVINS pDrvIns; /** Pointer to the root hub port interface we're attached to. */ - PVUSBIROOTHUBPORT pIRhPort; + PVUSBIROOTHUBPORT pIRhPort; /** Connector interface exposed upwards. */ - VUSBIROOTHUBCONNECTOR IRhConnector; + VUSBIROOTHUBCONNECTOR IRhConnector; - /** Critical section protecting the device list. */ - RTCRITSECT CritSectDevices; - /** Chain of devices attached to this hub. */ - PVUSBDEV pDevices; + /** Critical section protecting the device arrays. */ + RTCRITSECT CritSectDevices; + /** Array of pointers to USB devices indexed by the port the device is on. */ + PVUSBDEV apDevByPort[VUSB_DEVICES_MAX]; + /** Array of pointers to USB devices indexed by the address assigned. */ + PVUSBDEV apDevByAddr[VUSB_DEVICES_MAX]; + /** Structure after a saved state load to re-attach devices. */ + PVUSBROOTHUBLOAD pLoad; + + /** Roothub device state. */ + VUSBDEVICESTATE enmState; + /** Number of ports this roothub offers. */ + uint16_t cPorts; + /** Number of devices attached to this roothub currently. */ + uint16_t cDevices; + /** Name of the roothub. Used for logging. */ + char *pszName; + /** URB pool for URBs from the roothub. */ + VUSBURBPOOL UrbPool; #if HC_ARCH_BITS == 32 uint32_t Alignment0; @@ -514,9 +481,9 @@ void vusbUrbCancel(PVUSBURB pUrb, CANCELMODE mode); void vusbUrbCancelAsync(PVUSBURB pUrb, CANCELMODE mode); void vusbUrbRipe(PVUSBURB pUrb); -void vusbUrbCompletionRh(PVUSBURB pUrb); +void vusbUrbCompletionRhEx(PVUSBROOTHUB pRh, PVUSBURB pUrb); int vusbUrbSubmitHardError(PVUSBURB pUrb); -int vusbUrbErrorRh(PVUSBURB pUrb); +int vusbUrbErrorRhEx(PVUSBROOTHUB pRh, PVUSBURB pUrb); int vusbDevUrbIoThreadWakeup(PVUSBDEV pDev); int vusbDevUrbIoThreadCreate(PVUSBDEV pDev); int vusbDevUrbIoThreadDestroy(PVUSBDEV pDev); @@ -607,6 +574,26 @@ RTCritSectLeave(&pDev->CritSectAsyncUrbs); } + +DECLINLINE(int) vusbUrbErrorRh(PVUSBURB pUrb) +{ + PVUSBDEV pDev = pUrb->pVUsb->pDev; + PVUSBROOTHUB pRh = vusbDevGetRh(pDev); + AssertPtrReturn(pRh, VERR_VUSB_DEVICE_NOT_ATTACHED); + + return vusbUrbErrorRhEx(pRh, pUrb); +} + + +DECLINLINE(void) vusbUrbCompletionRh(PVUSBURB pUrb) +{ + PVUSBROOTHUB pRh = vusbDevGetRh(pUrb->pVUsb->pDev); + AssertPtrReturnVoid(pRh); + + vusbUrbCompletionRhEx(pRh, pUrb); +} + + /** @def vusbUrbAssert * Asserts that a URB is valid. */ @@ -634,21 +621,6 @@ /** @} */ - - -/** - * Addresses are between 0 and 127 inclusive - */ -DECLINLINE(uint8_t) vusbHashAddress(uint8_t Address) -{ - uint8_t u8Hash = Address; - u8Hash ^= (Address >> 2); - u8Hash ^= (Address >> 3); - u8Hash %= VUSB_ADDR_HASHSZ; - return u8Hash; -} - - /** * Gets the roothub of a device. * @@ -660,7 +632,7 @@ { if (!pDev->pHub) return NULL; - return pDev->pHub->pRootHub; + return pDev->pHub; } @@ -715,12 +687,14 @@ * * @returns New reference count. * @param pThis The VUSB device pointer. + * @param pszWho Caller of the retaining. */ -DECLINLINE(uint32_t) vusbDevRetain(PVUSBDEV pThis) +DECLINLINE(uint32_t) vusbDevRetain(PVUSBDEV pThis, const char *pszWho) { AssertPtrReturn(pThis, UINT32_MAX); uint32_t cRefs = ASMAtomicIncU32(&pThis->cRefs); + LogFlowFunc(("pThis=%p{.cRefs=%u}[%s]\n", pThis, cRefs, pszWho)); RT_NOREF(pszWho); AssertMsg(cRefs > 1 && cRefs < _1M, ("%#x %p\n", cRefs, pThis)); return cRefs; } @@ -730,12 +704,15 @@ * * @returns New reference count. * @retval 0 if no onw is holding a reference anymore causing the device to be destroyed. + * @param pThis The VUSB device pointer. + * @param pszWho Caller of the retaining. */ -DECLINLINE(uint32_t) vusbDevRelease(PVUSBDEV pThis) +DECLINLINE(uint32_t) vusbDevRelease(PVUSBDEV pThis, const char *pszWho) { AssertPtrReturn(pThis, UINT32_MAX); uint32_t cRefs = ASMAtomicDecU32(&pThis->cRefs); + LogFlowFunc(("pThis=%p{.cRefs=%u}[%s]\n", pThis, cRefs, pszWho)); RT_NOREF(pszWho); AssertMsg(cRefs < _1M, ("%#x %p\n", cRefs, pThis)); if (cRefs == 0) vusbDevDestroy(pThis); diff -Nru virtualbox-hwe-6.1.34-dfsg/src/VBox/Devices/USB/VUSBUrb.cpp virtualbox-hwe-6.1.38-dfsg/src/VBox/Devices/USB/VUSBUrb.cpp --- virtualbox-hwe-6.1.34-dfsg/src/VBox/Devices/USB/VUSBUrb.cpp 2022-03-22 23:43:36.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/src/VBox/Devices/USB/VUSBUrb.cpp 2022-09-01 13:27:00.000000000 +0000 @@ -215,23 +215,24 @@ * * @returns true if it could be retried. * @returns false if it should be completed with failure. + * @param pRh The roothub the URB originated from. * @param pUrb The URB in question. */ -int vusbUrbErrorRh(PVUSBURB pUrb) +int vusbUrbErrorRhEx(PVUSBROOTHUB pRh, PVUSBURB pUrb) { PVUSBDEV pDev = pUrb->pVUsb->pDev; - PVUSBROOTHUB pRh = vusbDevGetRh(pDev); - AssertPtrReturn(pRh, VERR_VUSB_DEVICE_NOT_ATTACHED); LogFlow(("%s: vusbUrbErrorRh: pDev=%p[%s] rh=%p\n", pUrb->pszDesc, pDev, pDev->pUsbIns ? pDev->pUsbIns->pszName : "", pRh)); + RT_NOREF(pDev); return pRh->pIRhPort->pfnXferError(pRh->pIRhPort, pUrb); } /** * Does URB completion on roothub level. * + * @param pRh The roothub the URB originated from. * @param pUrb The URB to complete. */ -void vusbUrbCompletionRh(PVUSBURB pUrb) +void vusbUrbCompletionRhEx(PVUSBROOTHUB pRh, PVUSBURB pUrb) { LogFlow(("%s: vusbUrbCompletionRh: type=%s status=%s\n", pUrb->pszDesc, vusbUrbTypeName(pUrb->enmType), vusbUrbStatusName(pUrb->enmStatus))); @@ -249,9 +250,6 @@ LogRel(("VUSB: Capturing URB completion event failed with %Rrc\n", rc)); } - PVUSBROOTHUB pRh = vusbDevGetRh(pUrb->pVUsb->pDev); - AssertPtrReturnVoid(pRh); - /* If there is a sniffer on the roothub record the completed URB there too. */ if (pRh->hSniffer != VUSBSNIFFER_NIL) { @@ -364,7 +362,7 @@ #endif case VUSBXFERTYPE_BULK: if (pUrb->enmStatus != VUSBSTATUS_OK) - vusbUrbErrorRh(pUrb); + vusbUrbErrorRhEx(pRh, pUrb); break; } #ifdef LOG_ENABLED diff -Nru virtualbox-hwe-6.1.34-dfsg/src/VBox/Devices/USB/VUSBUrbTrace.cpp virtualbox-hwe-6.1.38-dfsg/src/VBox/Devices/USB/VUSBUrbTrace.cpp --- virtualbox-hwe-6.1.34-dfsg/src/VBox/Devices/USB/VUSBUrbTrace.cpp 2022-03-22 23:43:36.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/src/VBox/Devices/USB/VUSBUrbTrace.cpp 2022-09-01 13:27:00.000000000 +0000 @@ -146,7 +146,7 @@ DECLHIDDEN(void) vusbUrbTrace(PVUSBURB pUrb, const char *pszMsg, bool fComplete) { PVUSBDEV pDev = pUrb->pVUsb ? pUrb->pVUsb->pDev : NULL; /* Can be NULL when called from usbProxyConstruct and friends. */ - PVUSBPIPE pPipe = &pDev->aPipes[pUrb->EndPt]; + PVUSBPIPE pPipe = pDev ? &pDev->aPipes[pUrb->EndPt] : NULL; const uint8_t *pbData = pUrb->abData; uint32_t cbData = pUrb->cbData; PCVUSBSETUP pSetup = NULL; diff -Nru virtualbox-hwe-6.1.34-dfsg/src/VBox/Devices/VMMDev/VMMDev.cpp virtualbox-hwe-6.1.38-dfsg/src/VBox/Devices/VMMDev/VMMDev.cpp --- virtualbox-hwe-6.1.34-dfsg/src/VBox/Devices/VMMDev/VMMDev.cpp 2022-03-22 23:43:37.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/src/VBox/Devices/VMMDev/VMMDev.cpp 2022-09-01 13:27:00.000000000 +0000 @@ -214,6 +214,7 @@ case VBOXOSTYPE_NetBSD: pszOs = "NetBSD"; break; case VBOXOSTYPE_Netware: pszOs = "Netware"; break; case VBOXOSTYPE_Solaris: pszOs = "Solaris"; break; + case VBOXOSTYPE_Solaris10U8_or_later: pszOs = "Solaris 10"; break; case VBOXOSTYPE_OpenSolaris: pszOs = "OpenSolaris"; break; case VBOXOSTYPE_Solaris11_x64 & ~VBOXOSTYPE_x64: pszOs = "Solaris 11"; break; case VBOXOSTYPE_MacOS: pszOs = "Mac OS X"; break; diff -Nru virtualbox-hwe-6.1.34-dfsg/src/VBox/Frontends/VBoxManage/VBoxManageAppliance.cpp virtualbox-hwe-6.1.38-dfsg/src/VBox/Frontends/VBoxManage/VBoxManageAppliance.cpp --- virtualbox-hwe-6.1.34-dfsg/src/VBox/Frontends/VBoxManage/VBoxManageAppliance.cpp 2022-03-22 23:44:14.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/src/VBox/Frontends/VBoxManage/VBoxManageAppliance.cpp 2022-09-01 13:27:38.000000000 +0000 @@ -805,6 +805,22 @@ } break; + case VirtualSystemDescriptionType_HardDiskControllerVirtioSCSI: + if (fIgnoreThis) + { + RTPrintf("%2u: VirtioSCSI controller, type %ls -- disabled\n", + a, + aVBoxValues[a]); + aEnabled[a] = false; + } + else + RTPrintf("%2u: VirtioSCSI controller, type %ls" + "\n (disable with \"--vsys %u --unit %u --ignore\")\n", + a, + aVBoxValues[a], + i, a); + break; + case VirtualSystemDescriptionType_HardDiskImage: if (fIgnoreThis) { diff -Nru virtualbox-hwe-6.1.34-dfsg/src/VBox/Frontends/VBoxManage/VBoxManageGuestCtrl.cpp virtualbox-hwe-6.1.38-dfsg/src/VBox/Frontends/VBoxManage/VBoxManageGuestCtrl.cpp --- virtualbox-hwe-6.1.34-dfsg/src/VBox/Frontends/VBoxManage/VBoxManageGuestCtrl.cpp 2022-03-22 23:44:14.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/src/VBox/Frontends/VBoxManage/VBoxManageGuestCtrl.cpp 2022-09-01 13:27:38.000000000 +0000 @@ -3361,11 +3361,6 @@ { AssertPtr(pArg); -#ifdef DEBUG_andy_disabled - if (RT_FAILURE(tstTranslatePath())) - return RTEXITCODE_FAILURE; -#endif - /* * Command definitions. */ diff -Nru virtualbox-hwe-6.1.34-dfsg/src/VBox/Frontends/VBoxManage/VBoxManageHelp.cpp virtualbox-hwe-6.1.38-dfsg/src/VBox/Frontends/VBoxManage/VBoxManageHelp.cpp --- virtualbox-hwe-6.1.34-dfsg/src/VBox/Frontends/VBoxManage/VBoxManageHelp.cpp 2022-03-22 23:44:14.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/src/VBox/Frontends/VBoxManage/VBoxManageHelp.cpp 2022-09-01 13:27:38.000000000 +0000 @@ -751,7 +751,7 @@ #endif #ifdef VBOX_WITH_RECORDING " [--recording on|off]\n" - " [--recordingscreens all| [ ...]]\n" + " [--recordingscreens all|none| [ ...]]\n" " [--recordingfile ]\n" " [--recordingvideores ]\n" " [--recordingvideorate ]\n" diff -Nru virtualbox-hwe-6.1.34-dfsg/src/VBox/Frontends/VBoxManage/VBoxManageInfo.cpp virtualbox-hwe-6.1.38-dfsg/src/VBox/Frontends/VBoxManage/VBoxManageInfo.cpp --- virtualbox-hwe-6.1.34-dfsg/src/VBox/Frontends/VBoxManage/VBoxManageInfo.cpp 2022-03-22 23:44:14.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/src/VBox/Frontends/VBoxManage/VBoxManageInfo.cpp 2022-09-01 13:27:38.000000000 +0000 @@ -1129,12 +1129,19 @@ mediumAttach.asOutParam()); BOOL fIsEjected = FALSE; BOOL fTempEject = FALSE; + BOOL fHotPlug = FALSE; + BOOL fNonRotational = FALSE; + BOOL fDiscard = FALSE; DeviceType_T devType = DeviceType_Null; if (mediumAttach) { mediumAttach->COMGETTER(TemporaryEject)(&fTempEject); mediumAttach->COMGETTER(IsEjected)(&fIsEjected); mediumAttach->COMGETTER(Type)(&devType); + mediumAttach->COMGETTER(HotPluggable)(&fHotPlug); + mediumAttach->COMGETTER(NonRotational)(&fNonRotational); + mediumAttach->COMGETTER(Discard)(&fDiscard); + } rc = machine->GetMedium(storageCtlName.raw(), i, k, medium.asOutParam()); @@ -1165,6 +1172,15 @@ RTPrintf("\"%ls-IsEjected\"=\"%s\"\n", storageCtlName.raw(), fIsEjected ? "on" : "off"); } + if ( storageCtlName.compare(Bstr("SATA"), Bstr::CaseInsensitive)== 0 + || storageCtlName.compare(Bstr("USB"), Bstr::CaseInsensitive)== 0) + RTPrintf("\"%ls-hot-pluggable\"=\"%s\"\n", storageCtlName.raw(), + fHotPlug ? "on" : "off"); + + RTPrintf("\"%ls-nonrotational\"=\"%s\"\n", storageCtlName.raw(), + fNonRotational ? "on" : "off"); + RTPrintf("\"%ls-discard\"=\"%s\"\n", storageCtlName.raw(), + fDiscard ? "on" : "off"); } else { @@ -1177,6 +1193,12 @@ RTPrintf(" (temp eject)"); if (fIsEjected) RTPrintf(" (ejected)"); + if (fHotPlug) + RTPrintf(" (hot-pluggable)"); + if (fNonRotational) + RTPrintf(" (non-rotational (SSD))"); + if (fDiscard) + RTPrintf(" (discards unused blocks)"); RTPrintf("\n"); } } @@ -2483,74 +2505,92 @@ #ifdef VBOX_WITH_RECORDING { - /* Video capture */ - BOOL fCaptureVideo = FALSE; -# ifdef VBOX_WITH_AUDIO_RECORDING - BOOL fCaptureAudio = FALSE; -# endif - ComPtr recordingSettings; CHECK_ERROR_RET(machine, COMGETTER(RecordingSettings)(recordingSettings.asOutParam()), rc); - SafeIfaceArray saRecordingScreenScreens; - CHECK_ERROR_RET(recordingSettings, COMGETTER(Screens)(ComSafeArrayAsOutParam(saRecordingScreenScreens)), rc); + BOOL fEnabled; + CHECK_ERROR_RET(recordingSettings, COMGETTER(Enabled)(&fEnabled), rc); + SHOW_BOOL_VALUE_EX("recording_enabled", "Recording enabled:", fEnabled, "yes", "no"); + + SafeIfaceArray saScreenSettings; + CHECK_ERROR_RET(recordingSettings, COMGETTER(Screens)(ComSafeArrayAsOutParam(saScreenSettings)), rc); + + SHOW_ULONG_VALUE("recording_screens", "Recording screens:", saScreenSettings.size(), ""); + + for (size_t i = 0; i < saScreenSettings.size(); ++i) + { + ComPtr screenSettings = saScreenSettings[i]; + + FmtNm(szNm, details == VMINFO_MACHINEREADABLE ? "rec_screen%zu" : "Screen %u:", i); + RTPrintf(" %s\n", szNm); + + CHECK_ERROR_RET(screenSettings, COMGETTER(Enabled)(&fEnabled), rc); + ULONG idScreen; + CHECK_ERROR_RET(screenSettings, COMGETTER(Id)(&idScreen), rc); + ULONG fFeatures; + CHECK_ERROR_RET(screenSettings, COMGETTER(Features)(&fFeatures), rc); + ULONG Width; + CHECK_ERROR_RET(screenSettings, COMGETTER(VideoWidth)(&Width), rc); + ULONG Height; + CHECK_ERROR_RET(screenSettings, COMGETTER(VideoHeight)(&Height), rc); + ULONG Rate; + CHECK_ERROR_RET(screenSettings, COMGETTER(VideoRate)(&Rate), rc); + ULONG Fps; + CHECK_ERROR_RET(screenSettings, COMGETTER(VideoFPS)(&Fps), rc); + RecordingDestination_T enmDst; + CHECK_ERROR_RET(screenSettings, COMGETTER(Destination)(&enmDst), rc); + Bstr bstrFile; + CHECK_ERROR_RET(screenSettings, COMGETTER(Filename)(bstrFile.asOutParam()), rc); + Bstr bstrOptions; + CHECK_ERROR_RET(screenSettings, COMGETTER(Options)(bstrOptions.asOutParam()), rc); - /* For now all screens have the same configuration; so take screen 0 and work with that. */ - ULONG fFeatures; - CHECK_ERROR_RET(saRecordingScreenScreens[0], COMGETTER(Features)(&fFeatures), rc); - ULONG Width; - CHECK_ERROR_RET(saRecordingScreenScreens[0], COMGETTER(VideoWidth)(&Width), rc); - ULONG Height; - CHECK_ERROR_RET(saRecordingScreenScreens[0], COMGETTER(VideoHeight)(&Height), rc); - ULONG Rate; - CHECK_ERROR_RET(saRecordingScreenScreens[0], COMGETTER(VideoRate)(&Rate), rc); - ULONG Fps; - CHECK_ERROR_RET(saRecordingScreenScreens[0], COMGETTER(VideoFPS)(&Fps), rc); - Bstr bstrFile; - CHECK_ERROR_RET(saRecordingScreenScreens[0], COMGETTER(Filename)(bstrFile.asOutParam()), rc); - Bstr bstrOptions; - CHECK_ERROR_RET(saRecordingScreenScreens[0], COMGETTER(Options)(bstrOptions.asOutParam()), rc); - - Utf8Str strOptions(bstrOptions); - size_t pos = 0; - com::Utf8Str key, value; - while ((pos = strOptions.parseKeyValue(key, value, pos)) != com::Utf8Str::npos) - { - if (key.compare("vc_enabled", Utf8Str::CaseInsensitive) == 0) - { - fCaptureVideo = value.compare("true", Utf8Str::CaseInsensitive) == 0; - } - else if (key.compare("ac_enabled", Utf8Str::CaseInsensitive) == 0) + BOOL fRecordVideo = FALSE; +# ifdef VBOX_WITH_AUDIO_RECORDING + BOOL fRecordAudio = FALSE; +# endif + Utf8Str strOptions(bstrOptions); + size_t pos = 0; + com::Utf8Str key, value; + while ((pos = strOptions.parseKeyValue(key, value, pos)) != com::Utf8Str::npos) { + if (key.compare("vc_enabled", Utf8Str::CaseInsensitive) == 0) + { + fRecordVideo = value.compare("true", Utf8Str::CaseInsensitive) == 0; + } + else if (key.compare("ac_enabled", Utf8Str::CaseInsensitive) == 0) + { # ifdef VBOX_WITH_AUDIO_RECORDING - fCaptureAudio = value.compare("true", Utf8Str::CaseInsensitive) == 0; + fRecordAudio = value.compare("true", Utf8Str::CaseInsensitive) == 0; # endif + } } - } - SHOW_BOOL_VALUE_EX("videocap", "Capturing:", fCaptureVideo, "active", "not active"); + SHOW_BOOL_VALUE_EX("rec_screen_enabled", " Enabled:", fEnabled, + "yes", "no"); + SHOW_ULONG_VALUE ("rec_screen_id", " ID:", idScreen, ""); + SHOW_BOOL_VALUE_EX("rec_screen_video_enabled", " Record video:", fRecordVideo, + "yes", "no"); # ifdef VBOX_WITH_AUDIO_RECORDING - SHOW_BOOL_VALUE_EX("videocapaudio", "Capture audio:", fCaptureAudio, "active", "not active"); + SHOW_BOOL_VALUE_EX("rec_screen_audio_enabled", " Record audio:", fRecordAudio, + "yes", "no"); # endif - szValue[0] = '\0'; - for (size_t i = 0, off = 0; i < saRecordingScreenScreens.size(); i++) - { - BOOL fEnabled; - CHECK_ERROR_RET(saRecordingScreenScreens[i], COMGETTER(Enabled)(&fEnabled), rc); - if (fEnabled && off < sizeof(szValue) - 3) - off += RTStrPrintf(&szValue[off], sizeof(szValue) - off, off ? ",%zu" : "%zu", i); - } - SHOW_UTF8_STRING("capturescreens", "Capture screens:", szValue); - SHOW_BSTR_STRING("capturefilename", "Capture file:", bstrFile); - RTStrPrintf(szValue, sizeof(szValue), "%ux%u", Width, Height); - SHOW_UTF8_STRING("captureres", "Capture dimensions:", szValue); - SHOW_ULONG_VALUE("capturevideorate", "Capture rate:", Rate, "kbps"); - SHOW_ULONG_VALUE("capturevideofps", "Capture FPS:", Fps, "kbps"); - SHOW_BSTR_STRING("captureopts", "Capture options:", bstrOptions); + SHOW_UTF8_STRING("rec_screen_dest", " Destination:", + enmDst == RecordingDestination_File + ? "File" : "Unknown"); + /** @todo Implement other destinations. */ + if (enmDst == RecordingDestination_File) + SHOW_BSTR_STRING("rec_screen_dest_filename", " File:", bstrFile); + + SHOW_BSTR_STRING ("rec_screen_opts", " Options:", bstrOptions); + + /* Video properties. */ + RTStrPrintf(szValue, sizeof(szValue), "%ux%u", Width, Height); + SHOW_UTF8_STRING ("rec_screen_video_res_xy", " Video dimensions:", szValue); + SHOW_ULONG_VALUE ("rec_screen_video_rate_kbps", " Video rate:", Rate, "kbps"); + SHOW_ULONG_VALUE ("rec_screen_video_fps", " Video FPS:", Fps, "fps"); - if (details != VMINFO_MACHINEREADABLE) - RTPrintf("\n"); - /** @todo Add more audio capturing profile / information here. */ + /** @todo Add more audio capturing profile / information here. */ + } } #endif /* VBOX_WITH_RECORDING */ diff -Nru virtualbox-hwe-6.1.34-dfsg/src/VBox/Frontends/VBoxManage/VBoxManageModifyVM.cpp virtualbox-hwe-6.1.38-dfsg/src/VBox/Frontends/VBoxManage/VBoxManageModifyVM.cpp --- virtualbox-hwe-6.1.34-dfsg/src/VBox/Frontends/VBoxManage/VBoxManageModifyVM.cpp 2022-03-22 23:44:14.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/src/VBox/Frontends/VBoxManage/VBoxManageModifyVM.cpp 2022-09-01 13:27:38.000000000 +0000 @@ -480,30 +480,51 @@ } #ifdef VBOX_WITH_RECORDING -static int parseScreens(const char *pcszScreens, com::SafeArray *pScreens) +/** + * Parses a string for a list of screen numbers. + * + * @returns VBox status code. + * @param pcszScreens String to parse. + * Can be a delimited list (e.g. "1,2,3") or ("all") all screens. + * @param pScreens Where to return to the parsed screens. + * The array needs to be pre-allocated by the maximum number of screens. + */ +int parseScreens(const char *pcszScreens, com::SafeArray *pScreens) { + if (!RTStrICmp(pcszScreens, "all")) + { + for (uint32_t i = 0; i < pScreens->size(); i++) + (*pScreens)[i] = TRUE; + return VINF_SUCCESS; + } + if (!RTStrICmp(pcszScreens, "none")) + { + for (uint32_t i = 0; i < pScreens->size(); i++) + (*pScreens)[i] = FALSE; + return VINF_SUCCESS; + } while (pcszScreens && *pcszScreens) { char *pszNext; uint32_t iScreen; int rc = RTStrToUInt32Ex(pcszScreens, &pszNext, 0, &iScreen); if (RT_FAILURE(rc)) - return 1; + return VERR_PARSE_ERROR; if (iScreen >= pScreens->size()) - return 1; + return VERR_PARSE_ERROR; if (pszNext && *pszNext) { pszNext = RTStrStripL(pszNext); if (*pszNext != ',') - return 1; + return VERR_PARSE_ERROR; pszNext++; } - (*pScreens)[iScreen] = true; + (*pScreens)[iScreen] = FALSE; pcszScreens = pszNext; } - return 0; + return VINF_SUCCESS; } -#endif +#endif /* VBOX_WITH_RECORDING */ static int parseNum(uint32_t uIndex, unsigned cMaxIndex, const char *pszName) { @@ -3035,7 +3056,7 @@ ULONG cMonitors = 64; CHECK_ERROR(pGraphicsAdapter, COMGETTER(MonitorCount)(&cMonitors)); com::SafeArray screens(cMonitors); - if (parseScreens(ValueUnion.psz, &screens)) + if (RT_FAILURE(parseScreens(ValueUnion.psz, &screens))) { errorArgument("Invalid list of screens specified\n"); rc = E_FAIL; diff -Nru virtualbox-hwe-6.1.34-dfsg/src/VBox/Frontends/VirtualBox/nls/ApprovedLanguages.kmk virtualbox-hwe-6.1.38-dfsg/src/VBox/Frontends/VirtualBox/nls/ApprovedLanguages.kmk --- virtualbox-hwe-6.1.34-dfsg/src/VBox/Frontends/VirtualBox/nls/ApprovedLanguages.kmk 2022-03-22 23:44:34.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/src/VBox/Frontends/VirtualBox/nls/ApprovedLanguages.kmk 2022-09-01 13:27:57.000000000 +0000 @@ -33,12 +33,15 @@ id \ it \ ja \ + ka \ ko \ lt \ nl \ pl \ + pt \ pt_BR \ ru \ + sk \ sl \ th \ tr \ diff -Nru virtualbox-hwe-6.1.34-dfsg/src/VBox/Frontends/VirtualBox/nls/qt_ka.ts virtualbox-hwe-6.1.38-dfsg/src/VBox/Frontends/VirtualBox/nls/qt_ka.ts --- virtualbox-hwe-6.1.34-dfsg/src/VBox/Frontends/VirtualBox/nls/qt_ka.ts 1970-01-01 00:00:00.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/src/VBox/Frontends/VirtualBox/nls/qt_ka.ts 2022-09-01 13:28:00.000000000 +0000 @@ -0,0 +1,6614 @@ + + + + ka + + Temuri Doghonadze <temuri.doghonadze@gmail.com> + + + + Poedit 3.0.1 + Project-Id-Version,POT-Creation-Date,PO-Revision-Date,Last-Translator,Language-Team,Language,MIME-Version,Content-Type,Content-Transfer-Encoding,Plural-Forms,X-Language,X-Qt-Contexts,X-Generator + + CloseButton + + Close Tab + ჩანართის დახურვა + + + + MAC_APPLICATION_MENU + + Services + სერვისები + + + Hide %1 + %1-ის დამალვა + + + Hide Others + სხვების დამალვა + + + Show All + ყველას ჩვენება + + + Preferences... + მორგება... + + + Quit %1 + %1-დან გასვლა + + + About %1 + %1-ის შესახებ + + + + QAbstractSocket + + Host not found + ჰოსტი ნაპოვნი არაა + + + Connection refused + დაკავშირება უარყოფილია + + + Socket operation timed out + სოკეტის ოპერაციის დრო გავიდა + + + Socket is not connected + სოკეტი დაკავშირებული არაა + + + Operation on socket is not supported + ოპერაცია სოკეტზე მხარდაუჭერელია + + + Connection timed out + კავშირის ვადა გავიდა + + + Trying to connect while connection is in progress + დაკავშირების მცდელობა მაშინ, როცა კავშირი უკვე მიმდინარეობს + + + Network unreachable + ქსელი მიუწვდომელია + + + + QAbstractSpinBox + + &Step up + &ნაბიჯით მაღლა + + + Step &down + ნაბიჯით &დაბლა + + + &Select All + &ყველას არჩევა + + + + QAccessibleActionInterface + + Press + დააწექით + + + Increase + გაზრდა + + + Decrease + შემცირება + + + ShowMenu + მენიუს ჩვენება + + + SetFocus + ფოკუსის დაყენება + + + Toggle + გადართვა + + + Scroll Left + მარცხნივ გაწევა + + + Scroll Right + მარჯვნივ გაწევა + + + Scroll Up + მაღლა აწევა + + + Scroll Down + დაბლა ჩამოწევა + + + Previous Page + წინა გვერდი + + + Next Page + შემდეგი გვერდი + + + Triggers the action + ქმედების გაშვება + + + Increase the value + მნიშვნელობის გაზრდა + + + Decrease the value + მნიშვნელობის შემცირება + + + Shows the menu + მენიუს ჩვენება + + + Sets the focus + ფოკუსის დაყენება + + + Toggles the state + მდგომარეობის გადართვა + + + Scrolls to the left + მარცხნივ გაწევა + + + Scrolls to the right + მარჯვნივ გაწევა + + + Scrolls up + მაღლა აწევა + + + Scrolls down + დაბლა ჩამოწევა + + + Goes back a page + წინა გვერდზე გადასვლა + + + Goes to the next page + შემდეგ გვერდზე გადასვლა + + + + QAndroidPlatformTheme + + Yes + დიახ + + + Yes to All + დიახ ყველაფერზე + + + No + არა + + + No to All + არა ყველაფერზე + + + + QApplication + + Executable '%1' requires Qt %2, found Qt %3. + გამშვებს %1 სჭირდება qt %2. ნაპოვნია Qt %3. + + + Incompatible Qt Library Error + Qt ბიბლიოთეკის შეუთავსებლობა + + + + QCocoaMenuItem + + About Qt + Qt-ის შესახებ + + + About + შესახებ + + + Config + კონფიგურაცია + + + Preference + მორგება + + + Options + პარამეტრები + + + Setting + პარამეტრები + + + Setup + მორგება + + + Quit + გასვლა + + + Exit + გასვლა + + + Cut + ამოჭრა + + + Copy + კოპირება + + + Paste + ჩასმა + + + Select All + ყველაფრის მონიშვნა + + + + QCocoaTheme + + Don't Save + არ შეინახო + + + + QColorDialog + + Hu&e: + &ტონი: + + + &Sat: + &ნაჯერობა: + + + &Val: + &მნიშვნ: + + + &Red: + &წითელი: + + + &Green: + &მწვანე: + + + Bl&ue: + &ლურჯი: + + + A&lpha channel: + &ალფა არხი: + + + &Basic colors + &ძირითადი ფერები + + + &Custom colors + &ხელით მითითებული ფერები + + + &Add to Custom Colors + &ხელით მითითებული ფერების ადამატება + + + &HTML: + &HTML: + + + Cursor at %1, %2 +Press ESC to cancel + კურსორი %1, %2 +გაუქმებისთვის დააწექით ESX + + + Select Color + აირჩიეთ ფერი + + + &Pick Screen Color + &აირჩიეთ ეკრანის ფერი + + + + QComboBox + + False + ტყუილი + + + True + სიმართლე + + + Open the combo box selection popup + კომბო ყუთის ასარჩევი ფანჯრის გახსნა + + + + QCommandLineParser + + Displays version information. + ვერსიის ჩვენება. + + + Displays this help. + ამ დახმარების ჩვენება. + + + Unknown option '%1'. + უცნობი პარამეტრი '%1'. + + + Unknown options: %1. + უცნობი პარამეტრი %1. + + + Missing value after '%1'. + აკლია %1-ის მნიშვნელობა. + + + Unexpected value after '%1'. + %1-ის მოულოდნელი მნიშვნელობა. + + + [options] + [პარამეტრები] + + + Usage: %1 + გამოყენება: %1 + + + Options: + პარამეტრები: + + + Arguments: + არგუმენტები: + + + + QCoreApplication + + %1: key is empty + QSystemSemaphore + %1: გასაღები ცარიელია + + + %1: unable to make key + QSystemSemaphore + %1: გასაღების შექმნა შეუძლებელია + + + %1: ftok failed + QSystemSemaphore + %1: ftok-ის შეცდომა + + + + QCupsJobWidget + + Job + დავალება + + + Job Control + დავალებების კონტროლი + + + Scheduled printing: + დაგეგმილი დაბეჭდვა: + + + Billing information: + გადახდის ინფორმაცია: + + + Job priority: + დავალებების პრიორიტეტები: + + + Banner Pages + ბანერის გვერდები + + + End: + Banner page at end + დასასრული: + + + Start: + Banner page at start + დასაწყისი: + + + Print Immediately + ახლავე დაბეჭდვა + + + Hold Indefinitely + უსასრულოდ შეჩერება + + + Day (06:00 to 17:59) + დღე (06:00-დან 17:59-მდე) + + + Night (18:00 to 05:59) + ღამე {18:00-დან 05:59-მდე) + + + Second Shift (16:00 to 23:59) + მეორე ცვლა (16:00-დან 23:59-მდე) + + + Third Shift (00:00 to 07:59) + მესამე ცვლა (00:00-დან 07:59-მდე) + + + Weekend (Saturday to Sunday) + შაბათ-კვირა + + + Specific Time + მითითებული დრო + + + None + CUPS Banner page + არცერთი + + + Standard + CUPS Banner page + სტანდარტული + + + Unclassified + CUPS Banner page + არასაიდუმლო + + + Confidential + CUPS Banner page + კონფიდენციალური + + + Classified + CUPS Banner page + საიდუმლო + + + Secret + CUPS Banner page + სამხედრო საიდუმლო + + + Top Secret + CUPS Banner page + უმაღლესი დონის საიდუმლო + + + + QDB2Driver + + Unable to connect + დაკავშირება შეუძლებელია + + + Unable to commit transaction + ტრანზაქციის გადაცემა შეუძლებელია + + + Unable to rollback transaction + ტრანზაქციის დაბრუნება შეუძლებელია + + + Unable to set autocommit + ავტომატური გადაგზავნის დაყენება შეუძლებელია + + + + QDB2Result + + Unable to execute statement + ავტომატური გაშვების დაყენება შეუძლებელია + + + Unable to prepare statement + ინსტრუქციის მომზადების შეცდომა + + + Unable to bind variable + ცვლადის მიბმა შეუძლებელია + + + Unable to fetch record %1 + ჩანაწერის გაუქმების შეუძლებელია: %1 + + + Unable to fetch next + შემდეგის გამოთხოვა შეუძლებელია + + + Unable to fetch first + პირველის გამოთხოვა შეუძლებელია + + + + QDBusTrayIcon + + OK + დიახ + + + + QDateTimeParser + + AM + AM + + + am + am + + + PM + PM + + + pm + pm + + + + QDialog + + What's This? + რა არის ეს? + + + + QDialogButtonBox + + OK + დიახ + + + + QDirModel + + Name + სახელი + + + Size + ზომა + + + Kind + Match OS X Finder + ტიპი + + + Type + All other platforms + ტიპი + + + Date Modified + შეცვლის თარიღი + + + + QDnsLookup + + Operation cancelled + ოპერაცია გაუქმებულია + + + + QDnsLookupRunnable + + IPv6 addresses for nameservers are currently not supported + IPv6 მისამართები DNS სერვერებისთვის ჯერ მხარდაჭერილი არაა + + + Invalid domain name + დომენის არასწორი სახელი + + + Not yet supported on Android + Androd-ის მხარდაჭერა ჯერ არ არსებობს + + + Resolver functions not found + გადამჭრელი ფუნქცია ვერ ვიპოვე + + + Resolver initialization failed + გადამჭრელის ინიციალიზაციის პრობლემა + + + Server could not process query + სერვერს მოთხოვნის დამუშავება არ შეუძლია + + + Server failure + სერვერის შეცდომა + + + Non existent domain + არარსებული დომენი + + + Server refused to answer + სერვერთან დაკავშირება უარყოფილია + + + Invalid reply received + მიღებულია პასუხი არასწორია + + + Could not expand domain name + დომენის სახელის გაფართოების შეცდომა + + + Invalid IPv4 address record + არასწორი IPv4 მისამართი + + + Invalid IPv6 address record + არასწორი IPv6 მისამართი + + + Invalid canonical name record + არასწორი კანონიკური სახელი + + + Invalid name server record + არასწორი NS ჩანაწერი + + + Invalid pointer record + არასწორი მაჩვენებელი + + + Invalid mail exchange record + არასწორი MX ჩანაწერი + + + Invalid service record + სერვისის არასწორი ჩანაწერი + + + Invalid text record + არასწორი ტექსტური ჩანაწერი + + + Resolver library can't be loaded: No runtime library loading support + გადამჭრელი ბიბლიოთეკის ჩატვირთვის შეცდომა:ბიბლიოთეკის ჩატვირთვის მხარდაჭერა არ არსებობს + + + No hostname given + ჰოსტის სახელი მითითებული არაა + + + Invalid hostname + ჰოსტის არასწორი სახელი + + + Host %1 could not be found. + ჰოსტის %1 პოვნა შეუძლებელია. + + + Unknown error + უცნობი შეცდომა + + + + QDockWidget + + Close + Accessible name for button closing a dock widget + დახურვა + + + Float + Accessible name for button undocking a dock widget (floating state) + მცურავი + + + Undocks and re-attaches the dock widget + მიმაგრებადი ვიჯეტის მოხსნა და თავიდან მიმაგრება + + + Closes the dock widget + მიმაგრებადი ვიჯეტის დახურვა + + + + QErrorMessage + + Debug Message: + გამართვის შეტყობინება: + + + Warning: + გაფთხილება: + + + Fatal Error: + ფატალური შეცდომა: + + + &Show this message again + &ამ ფანჯრის კიდევ ჩვენება + + + &OK + &დიახ + + + + QFile + + Destination file is the same file. + სამიზნე ფაილი იგივე საწყისი ფაილია. + + + Source file does not exist. + საწყისი ფაილი არ არსებობს. + + + Destination file exists + სამიზნე ფაილი უკვე არსებობს + + + Error while renaming. + სახელის გადარქმევის შეცდომა. + + + Unable to restore from %1: %2 + %1-დან აღდგენის შეცდომა: %2 + + + Will not rename sequential file using block copy + ფაილის სახელის გადარქმევა ბლოკური კოპირებით შეუძლებელია + + + Cannot remove source file + საწყისი ფაილის წაშლის შეცდომა + + + Cannot open %1 for input + %1-ის წასაკითხად გახსნის შეცდომა + + + Cannot open for output + ჩასაწერად გახსნის შეცდომა + + + Failure to write block + ბლოკის ჩაწერის შეცდომა + + + Cannot create %1 for output + %1-ის ჩასაწერად გახსნის შეცდომა + + + + QFileDevice + + No file engine available or engine does not support UnMapExtension + ფაილის ძრავი მიუწვდომელია ან ძრავს UnMapExtension-ს მხარდაჭერა არ გააჩნია + + + + QFileDialog + + All Files (*) + ყველა ფაილი (*) + + + Directories + საქაღალდეები + + + &Open + &გახსნა + + + &Save + &შენახვა + + + Open + გახსნა + + + %1 already exists. +Do you want to replace it? + %1 უკვე არსებობს +გნებავთ გადააწეროთ? + + + %1 +File not found. +Please verify the correct file name was given. + %1 +ფაილი ნაპოვნი არაა. +შეამოწმეთ ფაილის სახელი. + + + My Computer + ჩემი კომპიუტერი + + + &Rename + &სახელის გადარქმევა + + + &Delete + &წაშლა + + + Show &hidden files + დამალული &ფაილების ჩვენება + + + Back + უკან + + + Parent Directory + ზედა საქაღალდე + + + List View + სიის ხედი + + + Detail View + დეტალური ხედი + + + Files of type: + ტიპები: + + + Directory: + საქაღალდე: + + + %1 +Directory not found. +Please verify the correct directory name was given. + %1 +საქაღალდე ნაპოვნი არაა. +შეამოწმეთ საქაღალდის სახელი. + + + '%1' is write protected. +Do you want to delete it anyway? + '%1' დაცულია ჩაწერისგან. +გნებავთ მაინც წაშალოთ? + + + Could not delete directory. + საქაღალდის წაშლის შეცდომა. + + + Save As + შენახვა, როგორც + + + Drive + დისკი + + + File + ფაილი + + + Unknown + უცნობი + + + Find Directory + საქაღალდის ძებნა + + + Show + ჩვენება + + + Forward + წინ + + + New Folder + ახალი საქაღალდე + + + &New Folder + &ახალი საქაღალდე + + + &Choose + &არჩევა + + + Remove + წაშლა + + + File &name: + ფაილის &სახელი: + + + Look in: + ჩაიხედე: + + + Create New Folder + ახალი საქაღალდის შექმნა + + + Go back + უკან გადასვლა + + + Alt+Left + Alt+მარცხნივ + + + Go forward + წინ გადასვლა + + + Alt+Right + Alt+მარჯვნივ + + + Go to the parent directory + ზედა საქაღალდეზე გადასვლა + + + Alt+Up + Alt+მაღლა + + + Create a New Folder + ახალი საქაღალდის შექმნა + + + Change to list view mode + სიის ხედზე გადართვა + + + Change to detail view mode + დეტალური ხედზე გადართვა + + + Sidebar + გვერდითი პანელი + + + List of places and bookmarks + ადგილებისა და სანიშნების სია + + + Files + ფაილები + + + All files (*) + ყველა ფაილი (*) + + + Delete + წაშლა + + + Are you sure you want to delete '%1'? + დარწმუნებული ბრძანდებით, რომ გნებავთ წაშალოთ '%1'? + + + Recent Places + ბოლოს ნანახი ადგილები + + + %1 File + %1 is a file name suffix, for example txt + %1 ფაილი + + + File Folder + Match Windows Explorer + ფაილის საქაღალდე + + + Folder + All other platforms + საქაღალდე + + + Alias + OS X Finder + მეტსახელი + + + Shortcut + All other platforms + მალსახმობი + + + + QFileSystemModel + + Invalid filename + ფაილის არასწორი სახელი + + + <b>The name "%1" can not be used.</b><p>Try using another name, with fewer characters or no punctuations marks. + <b> სახელი %1-ის გამოყენება არ შეიძლება</b><p>სცადეთ სხვა სახელი, უფრო მოკლე, და სასვენი ნიშნების გარეშე. + + + Name + სახელი + + + Size + ზომა + + + Kind + Match OS X Finder + ტიპი + + + Type + All other platforms + ტიპი + + + Date Modified + შეცვლის თარიღი + + + My Computer + ჩემი კომპიუტერი + + + Computer + ჩემი კომპიუტერი + + + %1 TB + %1 ტბ + + + %1 GB + %1 გბ + + + %1 MB + %1 მბ + + + %1 KB + %1 კბ + + + %1 bytes + %1 ბაიტი + + + %1 byte(s) + %1 ბაიტი + + + + QFontDatabase + + Bold + სქელი + + + Demi Bold + ნახევრად სქელი + + + Black + შავი + + + Demi + The word for "Demi" as in "Demi Bold" used as a pattern for string searches + ნახევრად + + + Light + მსუბუქი + + + Italic + დახრილი + + + Oblique + ირიბი + + + Any + ნებისმიერი + + + Latin + ლათინური + + + Greek + ბერძნული + + + Cyrillic + კირილიცა + + + Armenian + სომხური + + + Hebrew + ივრითი + + + Arabic + არაბული + + + Syriac + სირიული + + + Thaana + თაანური + + + Devanagari + დევაგანური + + + Bengali + ბენგალური + + + Gurmukhi + გურმუხული + + + Gujarati + გუჯარათული + + + Oriya + ორიული + + + Tamil + თამილური + + + Telugu + ტელუგური + + + Kannada + კანადური + + + Malayalam + მალაიზიური + + + Sinhala + სინჰალური + + + Thai + ტაილანდური + + + Lao + ლაოსური + + + Tibetan + ტიბეტური + + + Myanmar + ნიანმანური + + + Georgian + ქართული + + + Khmer + ხმერული + + + Simplified Chinese + გამარტივებული ჩინური + + + Traditional Chinese + ტრადიციული ჩინური + + + Japanese + იაპონური + + + Korean + კორეული + + + Vietnamese + ვიეტნამური + + + Symbol + სიმბოლო + + + Ogham + ოგამი + + + Runic + რუნები + + + Normal + The Normal or Regular font weight + ნორმალური + + + Medium + The Medium font weight + საშუალო + + + Thin + თხელი + + + Extra Light + ძალიან თხელი + + + Extra Bold + ძალიან სქელი + + + Extra + The word for "Extra" as in "Extra Bold, Extra Thin" used as a pattern for string searches + დამატებით + + + N'Ko + N'ko + + + + QFontDialog + + &Font + &ფონტი + + + Font st&yle + ფონტის &სტილი + + + &Size + &ზომა + + + Effects + ეფექტები + + + Stri&keout + გამონა&თება + + + &Underline + &ხაზგასმა + + + Sample + მაგალითი + + + Wr&iting System + &დამწერლობა + + + Select Font + აირჩიეთ ფონტი + + + + QFtp + + Not connected + დაკავშირებული არაა + + + Host %1 not found + ჰოსტი %1 ნაპოვნი არაა + + + Connection refused to host %1 + ჰოსტთან %1 დაკავშირება უარყოფილია + + + Connected to host %1 + დაკავშირებულია ჰოსტთან %1 + + + Unknown error + უცნობი შეცდომა + + + Connecting to host failed: +%1 + ჰოსტთან დაკავშირება უარყოფილია: +%1 + + + Login failed: +%1 + შესვლის შეცდომა: %1 + + + Listing directory failed: +%1 + საქაღალდის სიის მიღების შეცდომა: %1 + + + Changing directory failed: +%1 + საქაღალდის შეცვლის შეცდომა: %1 + + + Downloading file failed: +%1 + ფაილის გადმოწერის შეცდომა: %1 + + + Uploading file failed: +%1 + ფაილის ატვირთვის შეცდომა: %1 + + + Removing file failed: +%1 + ფაილის წაშლის შეცდომა: %1 + + + Creating directory failed: +%1 + საქაღალდის შექმნის შეცდომა: %1 + + + Removing directory failed: +%1 + საქაღალდის წაშლის შეცდომა: %1 + + + Connection closed + კავშირი დახურულია + + + Connection timed out to host %1 + ჰოსტამდე %1 კავშირის ვადა გავიდა + + + Data Connection refused + მონაცემების კავშირი უარყოფილია + + + + QGnomeTheme + + &OK + &დიახ + + + &Save + &შენახვა + + + &Cancel + &გაუქმება + + + &Close + &დახურვა + + + Close without Saving + დახურვა შენახვის გარეშე + + + + QGuiApplication + + QT_LAYOUT_DIRECTION + Translate this string to the string 'LTR' in left-to-right languages or to 'RTL' in right-to-left languages (such as Hebrew and Arabic) to get proper widget layout. + QT_LAYOUT_DIRECTION + + + + QHostInfo + + Unknown error + უცნობი შეცდომა + + + No host name given + ჰოსტის სახელი მითითებული არაა + + + + QHostInfoAgent + + Host not found + ჰოსტი ნაპოვნი არაა + + + Unknown address type + მისამართის არასწორი ტიპი + + + Unknown error + უცნობი შეცდომა + + + No host name given + ჰოსტის სახელი მითითებული არაა + + + Invalid hostname + ჰოსტის არასწორი სახელი + + + Unknown error (%1) + უცნობი შეცდომა (%1) + + + + QHttp + + Connection refused + დაკავშირება უარყოფილია + + + Host %1 not found + ჰოსტი %1 ნაპოვნი არაა + + + Connection closed + კავშირი დახურულია + + + Proxy requires authentication + პროქსის ავთენტიკაცია სჭირდება + + + Host requires authentication + ჰოსტს ავთენტიკაცია სჭირდება + + + Data corrupted + მონაცემები დაზიანებულია + + + Unknown protocol specified + მითითებული პროტოკოლი უცნობია + + + SSL handshake failed + SSL კავშირის ადრეული შეცდომა + + + Too many redirects + მეტისმეტად ბევრი გადამისამართება + + + Insecure redirect + დაუცველი გადამისამართება + + + + QHttpSocketEngine + + Authentication required + ავთენტიკაცია სჭირდება + + + Did not receive HTTP response from proxy + პროქსიდან პასუხი არ დაბრუნებულა + + + Error parsing authentication request from proxy + პროქსის ავთენტიკაციის მოთხოვნის დამუშავების შეცდომა + + + Proxy denied connection + პროქსი უარყოფს დაკავშირებას + + + Error communicating with HTTP proxy + HTTP პროქსის გავლით დაკავშირების შეცდომა + + + Proxy server not found + პროქსი სერვერი ნაპოვნი არაა + + + Proxy connection refused + პროქსის კავშირი უარყოფილია + + + Proxy server connection timed out + პროქსი სერვერის კავშირს ვადა გაუვიდა + + + Proxy connection closed prematurely + პროქსის კავშირი ვადაზე ადრე დაიხურა + + + + QIBaseDriver + + Error opening database + მონაცემთა ბაზის გახსნა შეუძლებელია + + + Could not start transaction + ტრანზაქციის დაწყების შეცდომა + + + Unable to commit transaction + ტრანზაქციის გადაცემა შეუძლებელია + + + Unable to rollback transaction + ტრანზაქციის დაბრუნება შეუძლებელია + + + + QIBaseResult + + Unable to create BLOB + BLOB-ის შექმნა შეუძლებელია + + + Unable to write BLOB + BLOB-ის ჩაწერა შეუძლებელია + + + Unable to open BLOB + BLOB-ის გახსნა შეუძლებელია + + + Unable to read BLOB + BLOB-ის წაკითხვა შეუძლებელია + + + Could not find array + მასივი ვერ ვიპოვე + + + Could not get array data + მასივის მონაცემების მიღების შეცდომა + + + Could not get query info + მოთხოვნის ინფორმაციის მიღების შეცდომა + + + Could not start transaction + ტრანზაქციის დაწყების შეცდომა + + + Unable to commit transaction + ტრანზაქციის გადაცემა შეუძლებელია + + + Could not allocate statement + ინსტრუქციის გამოყოფის შეცდომა + + + Could not prepare statement + ინსტრუქციის მომზადების შეცდომა + + + Could not describe input statement + შეყვანის ინსტრუქციის აღწერის შეცდომა + + + Could not describe statement + ინსტრუქციის აღწერის შეცდომა + + + Unable to close statement + ინსტრუქციის დახურვის შეცდომა + + + Unable to execute query + მოთხოვნის შესრულების შეცდომა + + + Could not fetch next item + შემდეგი ჩანაწერის გამოთხოვის შეცდომა + + + Could not get statement info + ინსტრუქციის ინფორმაციის მიღების შეცდომა + + + + QIODevice + + Permission denied + წვდომა აკრძალულია + + + Too many open files + მეტისმეტად ბევრი გახსნილი ფაილი + + + No such file or directory + ფაილი ან საქაღალდე არ არსებობს + + + No space left on device + მოწყობილობაზე ადგილი არ დარჩა + + + Unknown error + უცნობი შეცდომა + + + file to open is a directory + გასახსნელი ფაილი საქაღალდეს წარმოადგენს + + + + QImageReader + + Invalid device + არასწორი მოწყობილობა + + + File not found + ფაილი ნაპოვნი არაა + + + Unsupported image format + გამოსახულების მხარდაუჭერელი ფორმატი + + + Unable to read image data + გამოსახულების წაკითხვის შეცდომა + + + Unknown error + უცნობი შეცდომა + + + + QImageWriter + + Unknown error + უცნობი შეცდომა + + + Device is not set + მოწყობილობა დაყენებული არაა + + + Device not writable + მოწყობილობა ჩაწერადი არაა + + + Unsupported image format + გამოსახულების მხარდაუჭერელი ფორმატი + + + + QInputDialog + + Enter a value: + შეიყვანეთ მნიშვნელობა: + + + + QJsonParseError + + no error occurred + შეცდომა არ მომხდარა + + + unterminated object + დაუსრულებელი ობიექტი + + + missing name separator + აკლია სახელის გამყოფი + + + unterminated array + დაუსრულებელი მასივი + + + missing value separator + აკლია მნიშვნელობების გამყოფი + + + illegal value + არასწორი მნიშვნელობა + + + invalid termination by number + არასწორი გაყოფა რიცხვით + + + illegal number + არასწორი რიცხვი + + + invalid escape sequence + გადატანის არასწორი მიმდევრობა + + + invalid UTF8 string + არასწორი UTF-8 სტრიქონი + + + unterminated string + დაუსრულებელი სტრიქონი + + + object is missing after a comma + აკლია ობიექტი მძიმის შემდეგ + + + too deeply nested document + დოკუმენტების ერთმანეთში ჩალაგების მეტისმეტად დიდი სიღრმე + + + too large document + მეტისმეტად დიდი დოკუმენტი + + + garbage at the end of the document + ნაგავი დოკუმენტის ბოლოში + + + + QKeySequenceEdit + + Press shortcut + დააწექით მალსახმობს + + + %1, ... + This text is an "unfinished" shortcut, expands like "Ctrl+A, ..." + %1, ... + + + + QLibrary + + The plugin '%1' uses incompatible Qt library. (%2.%3.%4) [%5] + დამატება %1 იყენებს შეუთავსებელ Qt-ის ბიბლიოთეკას . (%2.%3.%4) [%5] + + + Unknown error + უცნობი შეცდომა + + + The shared library was not found. + ზიარი ბიბლიოთეკა ვერ ვიპოვე. + + + The file '%1' is not a valid Qt plugin. + %1 Qt-ის სწორი დამატება არაა. + + + The plugin '%1' uses incompatible Qt library. (Cannot mix debug and release libraries.) + დამატება %1 იყენებს შეუთავსებელ Qt-ის ბიბლიოთეკას .(სრული და გასამართი ბიბლიოთეკების შერევა აკრძალულია) + + + '%1' is not an ELF object (%2) + %1 ELF ობიექტს არ წარმოადგენს (%2) + + + '%1' is not an ELF object + %1 ELF ობიექტს არ წარმოადგენს + + + '%1' is an invalid ELF object (%2) + %1 არასწორი ELF ობიექტია (%2) + + + Failed to extract plugin meta data from '%1' + დამატების მეტაინფორმაციის %1-დან მიღება შეუძლებელია + + + Cannot load library %1: %2 + ბიბლიოთეკის (%1) წაკითხვა შეუძლებელია: %2 + + + Cannot unload library %1: %2 + ბიბლიოთეკის (%1) გამოტვირთვის შეცდომა: %2 + + + Cannot resolve symbol "%1" in %2: %3 + სიმბოლოს "%1" პოვნის შეცდომა %2-ში: %3 + + + '%1' is not a valid Mach-O binary (%2) + %1 არასწორი Mach-O ბინარული ფაილია (%2) + + + file is corrupt + ფაილი დაზიანებულია + + + file too small + ფაილი ძალიან პატარაა + + + no suitable architecture in fat binary + მსუქან ბინარულ ფაილში შესაბამისი არქიტექტურა არ არსებობს + + + invalid magic %1 + არასწორი მაგიური რიცხვი %1 + + + wrong architecture + არასწორი არქტიტექტურა + + + not a dynamic library + არ წარმოადგენს დინამიკურ ბიბლიოთეკას + + + '%1' is not a Qt plugin + %1 არ წარმოადგენს Qt-ის დამატებას + + + + QLineEdit + + &Undo + &დაბრუნება + + + &Redo + &თავიდან + + + Cu&t + &ამოჭრა + + + &Copy + &კოპირება + + + &Paste + &ჩასმა + + + Delete + წაშლა + + + Select All + ყველაფრის მონიშვნა + + + + QLocalServer + + %1: Name error + %1: სახელის შეცდომა + + + %1: Permission denied + %1: წვდომა აკრძალულია + + + %1: Address in use + %1: მისამართ უკვე გამოიყენება + + + %1: Unknown error %2 + %1: უცნობი შეცდომა (%2) + + + + QLocalSocket + + %1: Connection refused + %1: დაკავშირება უარყოფილია + + + %1: Remote closed + %1: კავშირი დახურულია + + + %1: Invalid name + %1: არასწორი სახელი + + + %1: Socket access error + %1: სოკეტის წვდომის შეცდომა + + + %1: Socket resource error + %1: სოკეტის რესურსის შეცდომა + + + %1: Socket operation timed out + %1: სოკეტთან კავშირის ვადა გავიდა + + + %1: Datagram too large + %1: დატაგრამა ძალიან დიდია + + + %1: Connection error + %1: დაკავშირების შეცდომა + + + %1: The socket operation is not supported + %1: ოპერაცია სოკეტზე მხარდაუჭერელია + + + %1: Unknown error %2 + %1: უცნობი შეცდომა (%2) + + + %1: Operation not permitted when socket is in this state + %1: ოპერაცია შეუძლებელია, სანამ სოკეტი ამ მდგომარეობაშია + + + %1: Unknown error + %1: უცნობი შეცდომა + + + Trying to connect while connection is in progress + დაკავშირების მცდელობა მაშინ, როცა კავშირი უკვე მიმდინარეობს + + + %1: Access denied + %1: წვდომა აკრძალულია + + + + QMYSQLDriver + + Unable to connect + დაკავშირება შეუძლებელია + + + Unable to begin transaction + ტრანზაქციის გადაცემა შეუძლებელია + + + Unable to commit transaction + ტრანზაქციის გადაცემა შეუძლებელია + + + Unable to rollback transaction + ტრანზაქციის დაბრუნება შეუძლებელია + + + Unable to allocate a MYSQL object + MYSQL ობიექტის გამოყოფის შეცდომა + + + Unable to open database '%1' + მონაცემთა ბაზის გახსნა შეუძლებელია: %1 + + + + QMYSQLResult + + Unable to fetch data + მონაცემების გამოთხოვა შეუძლებელია + + + Unable to execute query + მოთხოვნის შესრულების შეცდომა + + + Unable to store result + შედეგის შენახვა შეუძლებელია + + + Unable to prepare statement + ინსტრუქციის მომზადების შეცდომა + + + Unable to reset statement + ინსტრუქციის საწყის მდგომარეობაზე დაბრუნება შეუძლებელია + + + Unable to bind value + ცვლადის მიბმა შეუძლებელია + + + Unable to execute statement + ინსტრუქციის გაშვება შეუძლებელია + + + Unable to bind outvalues + გამოტანილი ცვლადის მიბმა შეუძლებელია + + + Unable to store statement results + ინსტრუქციის შედეგების შენახვა შეუძლებელია + + + Unable to execute next query + შემდეგი მოთხოვნის შესრულება შეუძლებელია + + + Unable to store next result + შემდეგი შედეგის შენახვა შეუძლებელია + + + + QMdiArea + + (Untitled) + (უსახელო) + + + + QMdiSubWindow + + %1 - [%2] + %1 - [%2] + + + Close + დახურვა + + + Minimize + ჩაკეცვა + + + Restore Down + ქვემოთ აღდგენა + + + &Restore + &აღდგენა + + + &Move + &გადატანა + + + &Size + &ზომა + + + Mi&nimize + &ჩაკეცვა + + + Ma&ximize + &აკეცვა + + + Stay on &Top + &ზემოთ დარჩენა + + + &Close + &დახურვა + + + - [%1] + - [%1] + + + Maximize + აკეცვა + + + Unshade + განჩრდილვა + + + Shade + დაჩრდილვა + + + Restore + აღდგენა + + + Help + დახმარება + + + Menu + მენიუ + + + + QMessageBox + + Help + დახმარება + + + OK + დიახ + + + About Qt + Qt-ის შესახებ + + + Show Details... + დეტალების ჩვენება.. + + + Hide Details... + დეტალების დამალვა... + + + <h3>About Qt</h3><p>This program uses Qt version %1.</p> + <h3>Qt-ის შესახებ</h3><p>ეს პროგრამა იყენებს Qt-ის ვერსიას %1.</p> + + + <p>Qt is a C++ toolkit for cross-platform application development.</p><p>Qt provides single-source portability across all major desktop operating systems. It is also available for embedded Linux and other embedded and mobile operating systems.</p><p>Qt is available under three different licensing options designed to accommodate the needs of our various users.</p><p>Qt licensed under our commercial license agreement is appropriate for development of proprietary/commercial software where you do not want to share any source code with third parties or otherwise cannot comply with the terms of the GNU LGPL version 3 or GNU LGPL version 2.1.</p><p>Qt licensed under the GNU LGPL version 3 is appropriate for the development of Qt&nbsp;applications provided you can comply with the terms and conditions of the GNU LGPL version 3.</p><p>Qt licensed under the GNU LGPL version 2.1 is appropriate for the development of Qt&nbsp;applications provided you can comply with the terms and conditions of the GNU LGPL version 2.1.</p><p>Please see <a href="http://%2/">%2</a> for an overview of Qt licensing.</p><p>Copyright (C) %1 The Qt Company Ltd and other contributors.</p><p>Qt and the Qt logo are trademarks of The Qt Company Ltd.</p><p>Qt is The Qt Company Ltd product developed as an open source project. See <a href="http://%3/">%3</a> for more information.</p> + + + + + QNativeSocketEngine + + The remote host closed the connection + დაშორებილმა ჰოსტმა კავშირი დახურა + + + Network operation timed out + ქსელური ოპერაციის ვადა გავიდა + + + Out of resources + არასაკმარისი რესურსები + + + Unsupported socket operation + სოკეტის მხარდაუჭერელი ოპერაცია + + + Protocol type not supported + პროტოკოლის ტიპი მხარდაუჭერელია + + + Invalid socket descriptor + სოკეტის არასწორი დესკრიპტორი + + + Network unreachable + ქსელი მიუწვდომელია + + + Permission denied + წვდომა აკრძალულია + + + Connection timed out + კავშირის ვადა გავიდა + + + Connection refused + დაკავშირება უარყოფილია + + + The bound address is already in use + მიბმული მისამართი უკვე გამოიყენება + + + The address is not available + მისამართი მიუწვდომელია + + + The address is protected + მისამართი დაცულია + + + Unable to send a message + შეტყობინების გაგზავნის შეცდომა + + + Unable to receive a message + შეტყობინების მიღების შეცდომა + + + Unable to write + ჩაწერის შეცდომა + + + Network error + ქსელის შეცდომა + + + Another socket is already listening on the same port + ამ პორტზე სხვა სოკეტი უკვე უსმენს + + + Unable to initialize non-blocking socket + არა-ბლოკირებული სოკეტის ინიციალიზაცია შეუძლებელია + + + Unable to initialize broadcast socket + გამოცხადების სოკეტის ინიციალიზაცია შეუძლებელია + + + Attempt to use IPv6 socket on a platform with no IPv6 support + IPv6 სოკეტის გამოყენება პლატფორმაზე, რომელსაც არ აქვს IPv6-ის მხარდაჭერა, შეუძლებელია + + + Host unreachable + ჰოსტი მიუწვდომელია + + + Datagram was too large to send + დატაგრამა ძალიან დიდია გასაგზავნად + + + Operation on non-socket + ოპერაცია არა-სოკეტზე + + + Unknown error + უცნობი შეცდომა + + + The proxy type is invalid for this operation + პროქსის ტიპი ამ ოპერაციისთვის არასწორია + + + Temporary error + დროებითი შეცდომა + + + Network dropped connection on reset + ქსელის გადატვირთვისას კავშირი დაიკარგა + + + Connection reset by peer + კავშირი გაწყვეტილია პარტნიორის მიერ + + + + QNetworkAccessCacheBackend + + Error opening %1 + %1-ის გახსნის შეცდომა + + + + QNetworkAccessDataBackend + + Invalid URI: %1 + არასწორი URI: %1 + + + + QNetworkAccessDebugPipeBackend + + Write error writing to %1: %2 + %1-ში ჩაწერის შეცდომა: %2 + + + Socket error on %1: %2 + სოკეტის შეცდომა %1-ზე: %2 + + + Remote host closed the connection prematurely on %1 + დაშორებილმა ჰოსტმა კავშირი ნაადრევად დახურა %1-ზე + + + + QNetworkAccessFileBackend + + Request for opening non-local file %1 + არალოკალური ფაილის გახსნის მოთხოვნა: %1 + + + Error opening %1: %2 + %1-ის გახსნის შეცდომა: %2 + + + Write error writing to %1: %2 + %1-ში ჩაწერის შეცდომა: %2 + + + Cannot open %1: Path is a directory + %1-ის წასაკითხად გახსნის შეცდომა: ბილიკი საქაღალდეა + + + Read error reading from %1: %2 + %1-დან კითხვის შეცდომა: %2 + + + + QNetworkAccessFtpBackend + + Cannot open %1: is a directory + %1-ის წასაკითხად გახსნის შეცდომა: ბილიკი საქაღალდეა + + + Logging in to %1 failed: authentication required + %1-ში შესვლა შეუძლებელია. საჭიროა ავთენტიკაცია + + + Error while downloading %1: %2 + %1-ის გადმოწერის შეცდომა: %2 + + + Error while uploading %1: %2 + %1-ის ატვირთვის შეცდომა: %2 + + + No suitable proxy found + შესაბამისი პროქსი ნაპოვნი არაა + + + + QNetworkAccessManager + + Network access is disabled. + ქსელთან წვდომა აკრძალულია. + + + + QNetworkReply + + Protocol "%1" is unknown + უცნობი პროტოკოლი: %1 + + + Error transferring %1 - server replied: %2 + %1-ის გაგზავნის შეცდომა: სერვერის პასუხი: %2 + + + Background request not allowed. + ფონური მოთხოვნა აკრძალულია. + + + Network session error. + ქსელის სესიის შეცდომა. + + + backend start error. + ფონური პროგრამის გაშვების შეცდომა. + + + Temporary network failure. + ქსელის დროებითი შეცდომა. + + + + QNetworkReplyHttpImpl + + Operation canceled + ოპერაცია გაუქმებულია + + + No suitable proxy found + შესაბამისი პროქსი ნაპოვნი არაა + + + + QNetworkReplyImpl + + Operation canceled + ოპერაცია გაუქმებულია + + + + QNetworkSession + + Invalid configuration. + არასწორია კონფიგურაცია. + + + + QNetworkSessionPrivateImpl + + Unknown session error. + სესიის უცნობი შეცდომა. + + + The session was aborted by the user or system. + სესია გაუქმებულია მომხმარებლის ან სისტემის მიერ. + + + The requested operation is not supported by the system. + მოთხოვნილი ოპერაცია მხარდაუჭერელია სისტემის მიერ. + + + The specified configuration cannot be used. + მითითებული კონფიგურაციის გამოყენება შეუძლებელია. + + + Roaming was aborted or is not possible. + გატანა გაუქმდა ან შეუძლებელია. + + + + QOCIDriver + + Unable to logon + შესვლის შეცდომა + + + Unable to initialize + QOCIDriver + ინიციალიზაციის შეცდომა + + + Unable to begin transaction + ტრანზაქციის დაწყება შეუძლებელია + + + Unable to commit transaction + ტრანზაქციის გადაცემა შეუძლებელია + + + Unable to rollback transaction + ტრანზაქციის დაბრუნება შეუძლებელია + + + + QOCIResult + + Unable to bind column for batch execute + სვეტზე მიბმის შეცდომა პაკეტური შესრულებისთვის + + + Unable to execute batch statement + ინსტრუქციების ნაკრების გაშვება შეუძლებელია + + + Unable to goto next + შემდეგზე გადასვლა შეუძლებელია + + + Unable to alloc statement + ინსტრუქციის გამოყოფა შეუძლებელია + + + Unable to prepare statement + ინსტრუქციის მომზადება შეუძლებელია + + + Unable to bind value + ცვლადის მიბმა შეუძლებელია + + + Unable to execute statement + ინსტრუქციის გაშვება შეუძლებელია + + + Unable to get statement type + ინსტრუქციის ტიპის მიღება შეუძლებელია + + + + QODBCDriver + + Unable to connect + დაკავშირება შეუძლებელია + + + Unable to disable autocommit + ავტომატური გადაგზავნის დაყენება შეუძლებელია + + + Unable to commit transaction + ტრანზაქციის გადაცემა შეუძლებელია + + + Unable to rollback transaction + ტრანზაქციის დაბრუნება შეუძლებელია + + + Unable to enable autocommit + ავტომატური გადაგზავნის დაყენება შეუძლებელია + + + Unable to connect - Driver doesn't support all functionality required + დაკავშირების შეცდოამ - დრაივერს ყველა მოთხოვნილი ფუნქციონალის მხარდაჭერა არ გააჩნია + + + + QODBCResult + + QODBCResult::reset: Unable to set 'SQL_CURSOR_STATIC' as statement attribute. Please check your ODBC driver configuration + QODBCResult::reset: Unable to set 'SQL_CURSOR_STATIC' as statement attribute. Please check your ODBC driver configuration + + + Unable to execute statement + ინსტრუქციის გაშვება შეუძლებელია + + + Unable to fetch next + შემდეგის გამოთხოვა შეუძლებელია + + + Unable to prepare statement + ინსტრუქციის მომზადება შეუძლებელია + + + Unable to bind variable + ცვლადის მიბმა შეუძლებელია + + + Unable to fetch last + ბოლოს გამოთხოვნა შეუძლებელია + + + Unable to fetch + გამოთხოვა შეუძლებელია + + + Unable to fetch first + პირველის გამოთხოვა შეუძლებელია + + + Unable to fetch previous + წინას გამოთხოვა შეუძლებელია + + + + QPSQLDriver + + Unable to connect + დაკავშირება შეუძლებელია + + + Could not begin transaction + ტრანზაქციის გადაცემა შეუძლებელია + + + Could not commit transaction + ტრანზაქციის გადაცემა შეუძლებელია + + + Could not rollback transaction + ტრანზაქციის დაბრუნება შეუძლებელია + + + Unable to subscribe + გამოწერა შეუძლებელია + + + Unable to unsubscribe + გამოწერის გაუქმება შეუძლებელია + + + + QPSQLResult + + Unable to create query + მოთხოვნის შექმნა შეუძლებელია + + + Unable to prepare statement + ინსტრუქციის მომზადების შეცდომა + + + + QPageSetupWidget + + Millimeters (mm) + მილიმეტრი (მმ) + + + Inches (in) + ინჩი (in) + + + Points (pt) + წერტილი (წრტ) + + + Form + ფორმა + + + Paper + ქაღალდი + + + Page size: + გვერდის ზომა: + + + Width: + სიგანე: + + + Height: + სიმაღლე: + + + Paper source: + ქაღალდის წყარო: + + + Orientation + ორიენტაცია + + + Portrait + პორტრეტი + + + Landscape + ლანდშაფტი + + + Reverse landscape + ლანდშაფტის შებრუნება + + + Reverse portrait + პორტრეტის შებრუნება + + + Margins + გვერდის ველები + + + top margin + ზედა ზღვარი + + + left margin + მარცხენა ზღვარი + + + right margin + მარჯვენა ზღვარი + + + bottom margin + ქვედა ზღვარი + + + Page Layout + გვერდის განლაგება + + + Page order: + გვერდების მიმდევრობა: + + + Pages per sheet: + გვერდები ფურცელზე: + + + Pica (P̸) + პიკა (პ) + + + Didot (DD) + Didot (DD) + + + Cicero (CC) + Cicero (CC) + + + Custom + ხელით + + + mm + Unit 'Millimeter' + მმ + + + pt + Unit 'Points' + წრტ + + + in + Unit 'Inch' + in + + + P̸ + Unit 'Pica' + + + + DD + Unit 'Didot' + DD + + + CC + Unit 'Cicero' + CC + + + + QPageSize + + Custom (%1mm x %2mm) + Custom size name in millimeters + ხელით მითითებული (%1მმ x %2მმ) + + + Custom (%1pt x %2pt) + Custom size name in points + ხელით მითითებული (%1წრტ x %2წრტ) + + + Custom (%1in x %2in) + Custom size name in inches + ხელით მითითებული (%1in x %2in) + + + Custom (%1pc x %2pc) + Custom size name in picas + ხელით მითითებული (%1pc x %2pc) + + + Custom (%1DD x %2DD) + Custom size name in didots + ხელით მითითბული (%1DD x %2DD) + + + Custom (%1CC x %2CC) + Custom size name in ciceros + ხელით მითითბული (%1CC x %2CC) + + + %1 x %2 in + Page size in 'Inch'. + %1 x %2 in + + + A0 + A0 + + + A1 + A1 + + + A2 + A2 + + + A3 + A3 + + + A4 + A4 + + + A5 + A5 + + + A6 + A6 + + + A7 + A7 + + + A8 + A8 + + + A9 + A9 + + + A10 + A10 + + + B0 + B0 + + + B1 + B1 + + + B2 + B2 + + + B3 + B3 + + + B4 + B4 + + + B5 + B5 + + + B6 + B6 + + + B7 + B7 + + + B8 + B8 + + + B9 + B9 + + + B10 + B10 + + + Executive (7.5 x 10 in) + აღმასრულებელი (7.5 x 10 in) + + + Executive (7.25 x 10.5 in) + აღმასრულებელი (7.25 x 10.5 in) + + + Folio (8.27 x 13 in) + ფოლიო (8.27 x 13 in) + + + Legal + იურიდიული + + + Letter / ANSI A + წერილი / ANSI A + + + Tabloid / ANSI B + ტაბლოიდი / ANSI B + + + Ledger / ANSI B + ლეჯერი / ANSI B + + + Custom + ხელით + + + A3 Extra + A3 ექსტრა + + + A4 Extra + A4 ექსტრა + + + A4 Plus + A4 პლუსი + + + A4 Small + A4 პატარა + + + A5 Extra + A5 ექსტრა + + + B5 Extra + B5 ექსტრა + + + JIS B0 + JIS B0 + + + JIS B1 + JIS B1 + + + JIS B2 + JIS B2 + + + JIS B3 + JIS B3 + + + JIS B4 + JIS B4 + + + JIS B5 + JIS B5 + + + JIS B6 + JIS B6 + + + JIS B7 + JIS B7 + + + JIS B8 + JIS B8 + + + JIS B9 + JIS B9 + + + JIS B10 + JIS B10 + + + ANSI C + ANSI C + + + ANSI D + ANSI D + + + ANSI E + ANSI E + + + Legal Extra + იურიდიული ექსტრა + + + Letter Extra + წერილი ექსტრა + + + Letter Plus + წერილი პლუსი + + + Letter Small + პატარა წერილი + + + Tabloid Extra + ექსტრა ტაბლოიდი + + + Architect A + Architect A + + + Architect B + Architect B + + + Architect C + Architect C + + + Architect D + Architect D + + + Architect E + Architect E + + + Note + შენიშვნა + + + Quarto + კვარტო + + + Statement + ინსტრუქცია + + + Super A + Super A + + + Super B + Super B + + + Postcard + საფოსტო ბარათი + + + Double Postcard + ორმაგი საფოსტო ბარათი + + + PRC 16K + PRC 16K + + + PRC 32K + PRC 32K + + + PRC 32K Big + PRC 32K დიდი + + + Fan-fold US (14.875 x 11 in) + Fan-fold აშშ (14.875 x 11 in) + + + Fan-fold German (8.5 x 12 in) + Fan-fold გერმანული (8.5 x 12 in) + + + Fan-fold German Legal (8.5 x 13 in) + Fan-fold გერმანული იურიდიული (8.5 x 13 in) + + + Envelope B4 + კონვერტი B4 + + + Envelope B5 + კონვერტი B5 + + + Envelope B6 + კონვერტი B6 + + + Envelope C0 + კონვერტი C0 + + + Envelope C1 + კონვერტი C1 + + + Envelope C2 + კონვერტი C2 + + + Envelope C3 + კონვერტი C3 + + + Envelope C4 + კონვერტი C4 + + + Envelope C5 + კონვერტი C5 + + + Envelope C6 + კონვერტი C6 + + + Envelope C65 + კონვერტი C65 + + + Envelope C7 + კონვერტი C7 + + + Envelope DL + კონვერტი DL + + + Envelope US 9 + კონვერტი აშშ 9 + + + Envelope US 10 + კონვერტი აშშ 10 + + + Envelope US 11 + კონვერტი აშშ 11 + + + Envelope US 12 + კონვერტი აშშ 12 + + + Envelope US 14 + კონვერტი აშშ 14 + + + Envelope Monarch + კონვერტი მონარქის + + + Envelope Personal + კონვერტი პერსონალური + + + Envelope Chou 3 + კონვერტი ჩუ 3 + + + Envelope Chou 4 + კონვერტი ჩუ 4 + + + Envelope Invite + მოსაწვევის კონვერტი + + + Envelope Italian + იტალიური კონვერტი + + + Envelope Kaku 2 + კონვერტი კაკუ 2 + + + Envelope Kaku 3 + კონვერტი კაკუ 3 + + + Envelope PRC 1 + კონვერტი RPC 1 + + + Envelope PRC 2 + კონვერტი RPC 2 + + + Envelope PRC 3 + კონვერტი RPC 3 + + + Envelope PRC 4 + კონვერტი RPC 4 + + + Envelope PRC 5 + კონვერტი RPC 5 + + + Envelope PRC 6 + კონვერტი RPC 6 + + + Envelope PRC 7 + კონვერტი RPC 7 + + + Envelope PRC 8 + კონვერტი RPC 8 + + + Envelope PRC 9 + კონვერტი RPC 9 + + + Envelope PRC 10 + კონვერტი RPC 10 + + + Envelope You 4 + კონვერთი თქვენ 4 + + + + QPlatformTheme + + OK + დიახ + + + Save + შენახვა + + + Save All + ყველას შენახვა + + + Open + გახსნა + + + &Yes + &დიახ + + + Yes to &All + &დიახ ყველაფერზე + + + &No + &არა + + + N&o to All + ა&რა ყველაფერზე + + + Abort + გაუქმება + + + Retry + თავიდან ცდა + + + Ignore + იგნორი + + + Close + დახურვა + + + Cancel + გაუქმება + + + Discard + მოცილება + + + Help + დახმარება + + + Apply + გადატარება + + + Reset + თავიდან ჩართვა + + + Restore Defaults + &ნაგულისხმევი პარამეტრების აღდგენა + + + + QPluginLoader + + Unknown error + უცნობი შეცდომა + + + The plugin was not loaded. + დამატება არ ჩაიტვირთა. + + + + QPrintDialog + + Print To File ... + ფაილში ბეჭდვა... + + + File %1 is not writable. +Please choose a different file name. + ფაილი %1 ჩაწერადი არაა. +აირჩიეთ ფაილის სხვა სახელი. + + + %1 already exists. +Do you want to overwrite it? + %1 უკვე არსებობს +გნებავთ გადააწეროთ? + + + %1 is a directory. +Please choose a different file name. + %1 საქაღალდეა +აირჩიეთ ფაილის სხვა სახელი. + + + &Options >> + &პარამეტრები >>> + + + &Print + &ბეჭდვა + + + &Options << + &პარამეტრები <<< + + + Print to File (PDF) + ფაილში ბეჭდვა(PDF)... + + + Local file + ლოკალური ფაილი + + + Print + ბეჭდვა + + + Left to Right, Top to Bottom + მარცხნიდან მარჯვნივ, ზემოდან ქვემოთ + + + Left to Right, Bottom to Top + მარცხნიდან მარჯვნივ, ქვემოდან ზემოთ + + + Right to Left, Bottom to Top + მარჯვნიდან მარცხნივ, ქვემოდან ზემოთ + + + Right to Left, Top to Bottom + მარჯვნიდან მარცხნივ, ზევიდან ქვემოთ + + + Bottom to Top, Left to Right + ქვემოდან ზემოთ, მარცხნიდან მარჯვნივ + + + Bottom to Top, Right to Left + ქვემოდან ზემოთ, მარჯვნიდან მარცხნივ + + + Top to Bottom, Left to Right + ზემოდან ქვემოთ, მარცხნიდან მარჯვნივ + + + Top to Bottom, Right to Left + ზემოდან ქვემოთ, მარჯვნიდან მარცხნივ + + + 1 (1x1) + 1 (1x1) + + + 2 (2x1) + 2 (2x1) + + + 4 (2x2) + 4 (2x2) + + + 6 (2x3) + 6 (2x3) + + + 9 (3x3) + 9 (3x3) + + + 16 (4x4) + 16 (4x4) + + + All Pages + ყველა გვერდი + + + Odd Pages + კენტი გვერდები + + + Even Pages + ლუწი გვერდები + + + Write PDF file + ფაილში ბეჭდვა(PDF) + + + Options 'Pages Per Sheet' and 'Page Set' cannot be used together. +Please turn one of those options off. + პარამეტრები "გვერდები ფურცელზე" და "გვერდების დაყენება" ერთად არ გამოიყენება. +გამოერთეთ ერთერთი მათგანი. + + + The 'From' value cannot be greater than the 'To' value. + "საიდან"-ის მნიშვნელობა "სადამდე"-ის მნიშვნელობაზე მეტი ვერ იქნება. + + + OK + დიახ + + + Automatic + ავტომატური + + + + QPrintPreviewDialog + + Page Setup + გვერდის პარამეტრები + + + Print Preview + დასაბეჭდის გადახედვა + + + Next page + შემდეგი გვერდი + + + Previous page + წინა გვერდი + + + First page + პირველი გვერდი + + + Last page + ბოლო გვერდი + + + Fit width + სიგანეში ჩატევა + + + Fit page + გვერდის ჩატევა + + + Zoom in + &გადიდება + + + Zoom out + &დაპატარავება + + + Portrait + პორტრეტი + + + Landscape + ლანდშაფტი + + + Show single page + ერთი გვერდის ჩვენება + + + Show facing pages + შემხვედრი გვერდების ჩვენება + + + Show overview of all pages + ყველაგვერდის გადახედვის ჩვენება + + + Print + ბეჭდვა + + + Page setup + გვერდის პარამეტრები + + + %1% + %1% + + + Export to PDF + PDF-ად გატანა + + + + QPrintPropertiesDialog + + Printer Properties + პრინტერის თვისებები + + + Job Options + ამოცანის პარამეტრები + + + + QPrintPropertiesWidget + + Form + ფორმა + + + Page + გვერდი + + + + QPrintSettingsOutput + + Form + ფორმა + + + Copies + ასლები + + + Print range + ბეჭდვის დიაპაზონი + + + Print all + ყველას დაბეჭდვა + + + Pages from + გვერდების დასაწყისი + + + to + რომელ გვერდამდე + + + Selection + მონიშნული + + + Output Settings + გამოტანის მორგება + + + Copies: + ასლები: + + + Collate + დაშლა + + + Reverse + პირიქით + + + Options + პარამეტრები + + + Color Mode + ფერის რეჟიმი + + + Color + ფერი + + + Grayscale + ნაცრისფერი + + + Duplex Printing + ორმხრივი ბეჭდვა + + + None + არა_ფერი + + + Long side + გრძელი კუთხე + + + Short side + მოკლე კუთხე + + + Current Page + მიმდინარე გვერდი + + + Page Set: + გვერდის დაყენება: + + + + QPrintWidget + + Form + ფორმა + + + Printer + პრინტერი + + + &Name: + &სახელი: + + + P&roperties + %თვისებები + + + Location: + მდებარეობა: + + + Preview + გადახედვა + + + Type: + ტიპი: + + + Output &file: + გამოსატანი &ფაილი: + + + ... + ... + + + + QProcess + + Process failed to start + პროცესის გაშვების შეცდომა + + + Process crashed + პროცესი ავარიულად დასრულდა + + + Process operation timed out + პროცესის ოპერაციის ვადა გავიდა + + + Error reading from process + პროცესიდან წაკითხვის შეცდომა + + + Error writing to process + პროცესში ჩაწერის შეცდომა + + + No program defined + პროგრამა აღწერილი არაა + + + Could not open input redirection for reading + შეყვანის გადამისამართება წასაკითხად შეუძლებელია + + + Resource error (fork failure): %1 + რესურსის შეცდომა : %1 + + + Could not open output redirection for writing + გამოტანის გადამისამართება ჩასაწერად შეუძლებელია + + + Process failed to start: %1 + პროცესის გაშვების შეცდომა: %1 + + + + QProgressDialog + + Cancel + გაუქმება + + + + QQnxFileDialogHelper + + All files (*.*) + ყველა ფაილი (*.*) + + + + QQnxFilePicker + + Pick a file + აირჩიეთ ფაილი + + + + QRegExp + + no error occurred + შეცდომა არ მომხდარა + + + disabled feature used + გამოყენება გამორთული თვისება + + + bad char class syntax + სიმბოლოს კლასის არასწორი სინტაქსი + + + bad lookahead syntax + წინმჭვრეტელის არასწორი სინთაქსი + + + bad repetition syntax + გამეორების არასწორი სინტაქსი + + + invalid octal value + არასწორი რვაობითი მნიშვნელობა + + + missing left delim + აკლია მარცხენა გამყოფი + + + unexpected end + მოულოდნელი დასასრული + + + met internal limit + მიღწეულია შიდა ლიმიტი + + + lookbehinds not supported, see QTBUG-2371 + უკანჭვრეტა მხარდაუჭერელია. იხ. QTBUG-2371 + + + invalid interval + არასწორი ინტერვალი + + + invalid category + არასწორი კატეგორია + + + + QRegularExpression + + no error + შეცდომის გარეშე + + + \ at end of pattern + \ ნიმუშის ბოლოში + + + \c at end of pattern + \c ნიმუშის ბოლოში + + + unrecognized character follows \ + \-ს გამოუცნობი სიმბოლო მოსდევს + + + numbers out of order in {} quantifier + მთვლელში რიცხვები დაულაგებელია {} + + + number too big in {} quantifier + მთვლელში {} რიცხვები ძალიან დიდია + + + missing terminating ] for character class + სიმბოლოების კლასს დამაბოლოებელი ] აკლია + + + invalid escape sequence in character class + სიმბოლოების კლასის არასწორი დამაბოლოებელი თანამიმდევრობა + + + range out of order in character class + სიმბოლოების კლასის დიაპაზონი მიმდევრობის გარეთაა + + + nothing to repeat + გასამეორებელი არაფერია + + + internal error: unexpected repeat + შიდა შეცდომა: მოულოდნელი გამეორება + + + unrecognized character after (? or (?- + უცნობი სიმბლოები (? ან (?- ის შემდეგ + + + POSIX named classes are supported only within a class + POSIX-ის დასახელებული კლასები მხოლოდ კლასის შიგნითაა ხელმისაწვდომი + + + missing ) + აკლია ) + + + reference to non-existent subpattern + ბმა არარსებულ ქვეშაბლონთან + + + erroffset passed as NULL + erroroffset-ი ცარიელია + + + unknown option bit(s) set + დაყენებული უცნობი პარამეტრები + + + missing ) after comment + კომენტარის შემდეგ ) აკლია + + + regular expression is too large + რეგულარული გამოსახულება ძალიან გრძელია + + + failed to get memory + მეხსიერებს მიღება შეუძლეებლია + + + unmatched parentheses + შეუთანხმებელი მშობლობა + + + internal error: code overflow + შიდა შეცდომა: კოდის გადავსება + + + unrecognized character after (?< + (?< ის შემდეგ უცნობი სიმბოლოა + + + lookbehind assertion is not fixed length + lookbehind assertion is not fixed length + + + malformed number or name after (?( + (?(-ის შემდეგ არასწორი რიცხვი ან სახელია + + + conditional group contains more than two branches + პირობითი ჯგუფი ორ ბრენჩზე მეტს შეიცავს + + + assertion expected after (?( + assertion expected after (?( + + + (?R or (?[+-]digits must be followed by ) + (?R or (?[+-]digits must be followed by ) + + + unknown POSIX class name + უცნობი POSIX-ის კლასის სახელი + + + POSIX collating elements are not supported + POSIX-ის გადაფარვადი ელემენტები მხარდაუჭერელია + + + this version of PCRE is not compiled with PCRE_UTF8 support + ეს PCRE ბიბლიოთეკა კომპილირებულია UTF8 კოდირების პარამეტრების მხარდაჭერის გარეშე + + + character value in \x{...} sequence is too large + character value in \x{...} sequence is too large + + + invalid condition (?(0) + არასწორი პირობა (?(0) + + + \C not allowed in lookbehind assertion + \C not allowed in lookbehind assertion + + + PCRE does not support \L, \l, \N{name}, \U, or \u + PCRE-ს არ გააჩნია მხარდაჭერა: \L, \l, \N{name}, \U, და \u + + + number after (?C is > 255 + რიცხვი (?C >255 + + + closing ) for (?C expected + (?C-სთვის საჭიროა დამხურავი ) + + + recursive call could loop indefinitely + რეკურსიული გამოძახება შეიძლება უსასრულოდ გაგრძელდეს + + + unrecognized character after (?P + უცნობი სიმბოლო (?P-ის შემდეგ + + + syntax error in subpattern name (missing terminator) + ქვეშაბლონის სახელის სინტაქსური შეცდომა (აკლია დამაბოლოებელი) + + + two named subpatterns have the same name + ორ სხვადასხვა ქვეშაბლონს ერთი და იგივე სახელი აქვთ + + + invalid UTF-8 string + არასწორი UTF-8 სტრიქონი + + + support for \P, \p, and \X has not been compiled + + + + malformed \P or \p sequence + + + + unknown property name after \P or \p + + + + subpattern name is too long (maximum 32 characters) + + + + too many named subpatterns (maximum 10000) + + + + octal value is greater than \377 (not in UTF-8 mode) + + + + internal error: overran compiling workspace + + + + internal error: previously-checked referenced subpattern not found + + + + DEFINE group contains more than one branch + + + + repeating a DEFINE group is not allowed + + + + inconsistent NEWLINE options + + + + \g is not followed by a braced, angle-bracketed, or quoted name/number or by a plain number + + + + a numbered reference must not be zero + + + + an argument is not allowed for (*ACCEPT), (*FAIL), or (*COMMIT) + + + + (*VERB) not recognized + + + + number is too big + რიცხვი ძალიან დიდია + + + subpattern name expected + + + + digit expected after (?+ + + + + ] is an invalid data character in JavaScript compatibility mode + + + + different names for subpatterns of the same number are not allowed + + + + (*MARK) must have an argument + + + + this version of PCRE is not compiled with PCRE_UCP support + + + + \c must be followed by an ASCII character + + + + \k is not followed by a braced, angle-bracketed, or quoted name + + + + internal error: unknown opcode in find_fixedlength() + + + + \N is not supported in a class + + + + too many forward references + + + + disallowed Unicode code point (>= 0xd800 && <= 0xdfff) + + + + invalid UTF-16 string + + + + name is too long in (*MARK), (*PRUNE), (*SKIP), or (*THEN) + + + + character value in \u.... sequence is too large + + + + invalid UTF-32 string + + + + setting UTF is disabled by the application + + + + non-hex character in \x{} (closing brace missing?) + + + + non-octal character in \o{} (closing brace missing?) + + + + missing opening brace after \o + + + + parentheses are too deeply nested + + + + invalid range in character class + + + + group name must start with a non-digit + + + + parentheses are too deeply nested (stack check) + + + + digits missing in \x{} or \o{} + + + + + QSQLite2Driver + + Unable to begin transaction + ტრანზაქციის დაწყება შეუძლებელია + + + Unable to commit transaction + ტრანზაქციის გადაცემა შეუძლებელია + + + Error opening database + მონაცემთა ბაზის გახსნა შეუძლებელია + + + Unable to rollback transaction + ტრანზაქციის დაბრუნება შეუძლებელია + + + + QSQLite2Result + + Unable to fetch results + შედეგების გამოთხოვა შეუძლებელია + + + Unable to execute statement + ინსტრუქციის გაშვება შეუძლებელია + + + + QSQLiteDriver + + Error opening database + მონაცემთა ბაზის გახსნა შეუძლებელია + + + Error closing database + მონაცემთა ბაზის დახურვა შეუძლებელია + + + Unable to begin transaction + ტრანზაქციის დაწყება შეუძლებელია + + + Unable to commit transaction + ტრანზაქციის გადაცემა შეუძლებელია + + + Unable to rollback transaction + ტრანზაქციის დაბრუნება შეუძლებელია + + + + QSQLiteResult + + Unable to fetch row + მწკრივის გამოთხოვა შეუძლებელია + + + Unable to execute statement + ინსტრუქციის გაშვება შეუძლებელია + + + Unable to reset statement + ინსტრუქციის საწყის მდგომარეობაზე დაბრუნება შეუძლებელია + + + Unable to bind parameters + პარამეტრების მიბმა შეუძლებელია + + + Parameter count mismatch + პარამეტრების რაოდენობა არ ემთხვევა + + + No query + მოთხოვნის გარეშე + + + Unable to execute multiple statements at a time + ბევრი ინსტრუქციის ერთდროული შესრულება შეუძლებელია + + + + QSaveFile + + Existing file %1 is not writable + არსებული ფაილი %1 ჩაწერადი არაა + + + Filename refers to a directory + ფაილის სახელი საქაღალდეზე მიუთითებს + + + Writing canceled by application + ჩაწერა გაუქმებულია აპლიკაციის მიერ + + + + QScrollBar + + Scroll here + აქ ჩამოქაჩვა + + + Left edge + მარცხენა კუთხე + + + Top + თავში + + + Right edge + მარჯვენა კუთხე + + + Bottom + ბოლოში + + + Page left + მარცხენა გვერდი + + + Page up + ზედა გვერდი + + + Page right + მარჯვენა გვერდი + + + Page down + ქვედა გვერდი + + + Scroll left + მარცხნივ გაწევა + + + Scroll up + მაღლა აწევა + + + Scroll right + მარჯვნივ გაწევა + + + Scroll down + დაბლა ჩამოწევა + + + + QSharedMemory + + %1: unable to set key on lock + %1: ბლოკზე გასაღების დადების შეცდომა + + + %1: create size is less then 0 + %1: შექმნის ზომა 0-ზე ნაკლებია + + + %1: unable to lock + %1: დაბლოკვის შეცდომა + + + %1: unable to unlock + %1: განბლოკვის შეცდომა + + + %1: permission denied + %1: წვდომა აკრძალულია + + + %1: already exists + %1 უკვე არსებობს + + + %1: out of resources + %1: არასაკმარისი რესურსები + + + %1: unknown error %2 + %1: უცნობი შეცდომა %2 + + + %1: key is empty + %1: გასაღები ცარიელია + + + %1: ftok failed + %1: ftok-ის შეცდომა + + + %1: unable to make key + %1: გასაღების შექმნა შეუძლებელია + + + %1: system-imposed size restrictions + %1: სისტემის მიერ ზომაზე დადებული შეზღუდვები + + + %1: not attached + %1: მიმაგრებული არაა + + + %1: bad name + %1: ცუდი სახელი + + + %1: UNIX key file doesn't exist + %1: UNIX გასაღების ფაილი არ არსებობს + + + %1: doesn't exist + %1: არ არსებობს + + + %1: invalid size + %1: არასწორი ზომა + + + %1: key error + %1: გასაღების შეცდომა + + + %1: size query failed + %1: ზომის შემოწმების შეცდომა + + + + QShortcut + + Space + This and all following "incomprehensible" strings in QShortcut context are key names. Please use the localized names appearing on actual keyboards or whatever is commonly used. + სივრცე + + + Esc + Esc + + + Tab + Tab + + + Backtab + Backtab + + + Backspace + Backspace + + + Return + Enter + + + Enter + Enter + + + Ins + Ins + + + Del + Del + + + Pause + შეჩერება + + + Print + ბეჭდვა + + + SysReq + SysReq + + + Home + Home + + + End + End + + + Left + მარცხნივ + + + Up + ზემოთ + + + Right + მარჯვნივ + + + Down + ქვემოთ + + + PgUp + PgUp + + + PgDown + PgDown + + + CapsLock + CapsLock + + + NumLock + NumLock + + + ScrollLock + ScrollLock + + + Menu + მენიუ + + + Help + დახმარება + + + Back + უკან + + + Forward + წინ + + + Stop + გაჩერება + + + Refresh + განახლება + + + Volume Down + ხმის დაწევა + + + Volume Mute + ხმის დადუმება + + + Volume Up + ხმის აწევა + + + Bass Boost + Bass-ის გაძლიერება + + + Bass Up + ბასის აწევა + + + Bass Down + ბასის დაწევა + + + Treble Up + მაღლების აწევა + + + Treble Down + მაღლების დაწევა + + + Media Play + მედიის დაკვრა + + + Media Stop + მედიის გაჩერება + + + Media Previous + წინა მედია + + + Media Next + შემდეგი მედია + + + Media Record + მედიის ჩანაწერი + + + Favorites + რჩეულები + + + Search + ძებნა + + + Standby + უქმე + + + Open URL + URL-ის გახსნა + + + Launch Mail + ელფოსტის გაშვება + + + Launch Media + მედიის გაშვება + + + Launch (0) + (0)-ის გაშვება + + + Launch (1) + (1)-ის გაშვება + + + Launch (2) + (2)-ის გაშვება + + + Launch (3) + (3)-ის გაშვება + + + Launch (4) + (4)-ის გაშვება + + + Launch (5) + (5)-ის გაშვება + + + Launch (6) + (6)-ის გაშვება + + + Launch (7) + (7)-ის გაშვება + + + Launch (8) + (8)-ის გაშვება + + + Launch (9) + (9)-ის გაშვება + + + Launch (A) + (A)-ის გაშვება + + + Launch (B) + (B)-ის გაშვება + + + Launch (C) + (C)-ის გაშვება + + + Launch (D) + (D)-ის გაშვება + + + Launch (E) + (E)-ის გაშვება + + + Launch (F) + (F)-ის გაშვება + + + Print Screen + ეკრანის დაბეჭდვა + + + Page Up + გვერდით მაღლა + + + Page Down + გვერდით დაბლა + + + Caps Lock + Caps Lock + + + Num Lock + Num Lock + + + Number Lock + Number Lock + + + Scroll Lock + Scroll Lock + + + Insert + ჩასმა + + + Delete + წაშლა + + + Escape + Escape + + + System Request + სისტემური მოთხოვნა + + + Select + არჩევა + + + Yes + დიახ + + + No + არა + + + Context1 + კონტექსტი1 + + + Context2 + კონტექსტი2 + + + Context3 + კონტექსტი3 + + + Context4 + კონტექსტი4 + + + Call + Button to start a call (note: a separate button is used to end the call) + დარეკვა + + + Hangup + Button to end a call (note: a separate button is used to start the call) + დაკიდება + + + Flip + გადაბრუნება + + + Ctrl + Ctrl + + + Shift + Shift + + + Alt + Alt + + + Meta + Meta + + + + + + + + + F%1 + F%1 + + + Home Page + საწყისი გვერდი + + + Media Pause + Media player pause button + მედიის გაჩერება + + + Toggle Media Play/Pause + Media player button to toggle between playing and paused + მედიის დაკვრა/გაჩერების გადართვა + + + Monitor Brightness Up + ეკრანის სიკაშკაშის აწევა + + + Monitor Brightness Down + ეკრანის სიკაშკაშის დაწევა + + + Keyboard Light On/Off + კლავიატურის განათების ჩართ/გამორთ + + + Keyboard Brightness Up + კლავიატურის სიკაშკაშის აწევა + + + Keyboard Brightness Down + კლავიატურის სიკაშკაშის დაწევა + + + Power Off + გამორთვა + + + Wake Up + გაღვიძება + + + Eject + გამოღება + + + Screensaver + ეკრანის დამცველი + + + WWW + WWW + + + Sleep + დაძინება + + + LightBulb + ნათურა + + + Shop + მაღაზია + + + History + ისტორია + + + Add Favorite + რჩეულის დამატება + + + Hot Links + ცხელი ბმულები + + + Adjust Brightness + სიკაშკაშის მორგება + + + Finance + ფინანსები + + + Community + საზგადოება + + + Media Rewind + მედიის გადახვევა + + + Back Forward + წინ უკან + + + Application Left + აპლიკაცა მარცხნივ + + + Application Right + აპლიკაცია მარჯვნივ + + + Book + წიგნი + + + CD + CD + + + Calculator + კალკულატორი + + + Clear + გასუფთავება + + + Clear Grab + ჩაჭიდების გასუფთავება + + + Close + დახურვა + + + Copy + კოპირება + + + Cut + ამოჭრა + + + Display + ეკრანი + + + DOS + DOS + + + Documents + დოკუმენტები + + + Spreadsheet + ელცხრილი + + + Browser + ბრაუზერი + + + Game + თამაში + + + Go + გადასვლა + + + iTouch + iTouch + + + Logoff + გასვლა + + + Market + მაღაზია + + + Meeting + შეხვედრა + + + Keyboard Menu + კლავიატურის მენიუ + + + Menu PB + PB-ის მენიუ + + + My Sites + ჩემი საიტები + + + News + სიახლეები + + + Home Office + სახლის ოფისი + + + Option + მორგება + + + Paste + ჩასმა + + + Phone + ტელეფონი + + + Reply + პასუხი + + + Reload + თავიდან ჩატვირთვა + + + Rotate Windows + ფანჯრის შემობრუნება + + + Rotation PB + PB-ის შემობრუნება + + + Rotation KB + KB-ის შემობრუნება + + + Save + შენახვა + + + Send + გაგზავნა + + + Spellchecker + სინტაქსის შემოწმება + + + Split Screen + ეკრანის გაყოფა + + + Support + მხარდაჭერა + + + Task Panel + დავალებების პანელი + + + Terminal + ტერმინალი + + + Tools + ხელსაწყოები + + + Travel + მოგზაურობა + + + Video + ვიდეო + + + Word Processor + რედაქტორი + + + XFer + XFer + + + Zoom In + გადიდება + + + Zoom Out + დაპატარავება + + + Away + გასული + + + Messenger + მესინჯერი + + + WebCam + ვეკამერა + + + Mail Forward + ელფოსტის გადაგზავნა + + + Pictures + სურათები + + + Music + მუსიკა + + + Battery + კვების ელემენტი + + + Bluetooth + ლურჯკბილა + + + Wireless + Wi-Fi + + + Ultra Wide Band + Ultra Wide Band + + + Media Fast Forward + მედიის სწრაფად გადახვევა + + + Audio Repeat + აუდიოს გამეორება + + + Audio Random Play + აუდიოს შემთხვევით დაკვრა + + + Subtitle + სუბტიტრები + + + Audio Cycle Track + აუდიო ტრეკების წრეზე დაკვრა + + + Time + დრო + + + Hibernate + პროგრამული ძილი + + + View + ხედი + + + Top Menu + ზედა მენიუ + + + Power Down + გამორთვა + + + Suspend + ძილი + + + Microphone Mute + მიკროფონის დადუმება + + + Red + წითელი + + + Green + მწვანე + + + Yellow + ყვითელი + + + Blue + ლურჯი + + + Channel Up + არხით მაღლა + + + Channel Down + არხით დაბლა + + + Guide + გიდი + + + Info + ინფორმაცია + + + Settings + მორგება + + + Microphone Volume Up + მიკროფონის ხმის აწევა + + + Microphone Volume Down + მიკროფონის ხმის დაწევა + + + New + ახალი + + + Open + გახსნა + + + Find + ძებნა + + + Undo + დაბრუნება + + + Redo + თავიდან + + + Toggle Call/Hangup + Button that will hang up if we're in call, or make a call if we're not. + ზარი/გათიშვის გადართვა + + + Voice Dial + Button to trigger voice dialing + ხმოვანი ზარი + + + Last Number Redial + Button to redial the last number called + ბოლო ნომერზე გადარეკვა + + + Camera Shutter + Button to trigger the camera shutter (take a picture) + კამერის შატერი + + + Camera Focus + Button to focus the camera + კამერის ფოკუსი + + + Kanji + კანჯი + + + Muhenkan + მუჰენკანი + + + Henkan + ჰენკანი + + + Romaji + რომაჯი + + + Hiragana + ჰირაგანა + + + Katakana + კატაკანა + + + Hiragana Katakana + ჰირაგანა კატაკანა + + + Zenkaku + ზენკაკუ + + + Hankaku + ჰანკაკუ + + + Zenkaku Hankaku + ზენკაკუ ჰანკაკუ + + + Touroku + ტუროკუ + + + Massyo + მასიო + + + Kana Lock + კანა ჩაკეტვა + + + Kana Shift + Kana Shift + + + Eisu Shift + Eisu Shift + + + Eisu toggle + Eisu toggle + + + Code input + კოდის შეყვანა + + + Multiple Candidate + მრავალი კანდიდატი + + + Previous Candidate + წინა კანდიდატი + + + Hangul + ჰანგული + + + Hangul Start + ჰანგულის დასაწყისი + + + Hangul End + ჰანგულის დასასრული + + + Hangul Hanja + ჰანგული ჰანჯა + + + Hangul Jamo + ჰანგული ჯამო + + + Hangul Romaja + ჰანგული რომაჯა + + + Hangul Jeonja + ჰანგულ ჯეონჯა + + + Hangul Banja + ჰანგული ბანჯა + + + Hangul PreHanja + ჰანგული პრეჰანჯა + + + Hangul PostHanja + ჰანგული პოსტჰანჯა + + + Hangul Special + ჰანგული სპეციალური + + + Cancel + გაუქმება + + + Printer + პრინტერი + + + Execute + გაშვება + + + Play + დაკვრა + + + Zoom + გადიდება + + + Exit + გასვლა + + + Touchpad Toggle + თაჩპედის ჩართ/გამორთ + + + Touchpad On + თაჩპედის ჩართვა + + + Touchpad Off + თაჩპედის გამორთვა + + + Num + რიცხვი + + + + QSocks5SocketEngine + + Network operation timed out + ქსელური ოპერაციის ვადა გავიდა + + + Connection to proxy refused + პროქსის კავშირი უარყოფილია + + + Connection to proxy closed prematurely + პროქსის კავშირი ვადაზე ადრე დაიხურა + + + Proxy host not found + პროქსის უცნობი ჰოსტი +%1 + + + Connection to proxy timed out + პროქსი სერვერის კავშირს ვადა გაუვიდა + + + Proxy authentication failed + პროქსის ავთენტიკაციის შეცდომა + + + Proxy authentication failed: %1 + პროქსის ავთენტიკაციის შეცდომა: %1 + + + SOCKS version 5 protocol error + SOCKsv5-ის პროტოკოლის შეცდომა + + + General SOCKSv5 server failure + SOCKSv5-ის სერვერის შეცდომა + + + Connection not allowed by SOCKSv5 server + SOCKSv5-ის სერვერი კავშირს უარყოფს + + + TTL expired + TTL-ს ვადა გაუვიდა + + + SOCKSv5 command not supported + SOCKSv5 ბრძანება მხარდაუჭერელია + + + Address type not supported + მისამართის ტიპი მხარდაუჭერელია + + + Unknown SOCKSv5 proxy error code 0x%1 + SOCKSv5 პროქსის შეცდომის არასწორი კოდი: 0x%1 + + + + QSpiAccessibleBridge + + invalid role + Role of an accessible object - the object is in an invalid state or could not be constructed + არასწორი როლი + + + title bar + Role of an accessible object + სათაურის ზოლი + + + menu bar + Role of an accessible object + მენიუს ზოლი + + + scroll bar + Role of an accessible object + ჩოჩიას ზოლი + + + grip + Role of an accessible object - the grip is usually used for resizing another object + მოჭიდება + + + sound + Role of an accessible object + ხმა + + + cursor + Role of an accessible object + კურსორი + + + text caret + Role of an accessible object + ტექსტის კარეტა + + + alert message + Role of an accessible object + გაფრთხილების შეტყობინება + + + frame + Role of an accessible object: a window with frame and title----------Role of an accessible object + ჩარჩო + + + filler + Role of an accessible object + შემვსები + + + popup menu + Role of an accessible object + მხტუნავი მენიუ + + + menu item + Role of an accessible object + მენიუს პუნქტი + + + tool tip + Role of an accessible object + მინიშნება + + + application + Role of an accessible object + აპლიკაცია + + + document + Role of an accessible object + დოკუმენტი + + + panel + Role of an accessible object + ზოლი + + + chart + Role of an accessible object + გრაფიკი + + + dialog + Role of an accessible object + ფანჯარა + + + separator + Role of an accessible object + გამყოფი + + + tool bar + Role of an accessible object + ხელსაწყოს ზოლი + + + status bar + Role of an accessible object + სტატუსის ზოლი + + + table + Role of an accessible object + ცხრილი + + + column header + Role of an accessible object - part of a table + სვეტის თავსართი + + + row header + Role of an accessible object - part of a table + მწკრივის თავსართი + + + column + Role of an accessible object - part of a table + სვეტი + + + row + Role of an accessible object - part of a table + მწკრივი + + + cell + Role of an accessible object - part of a table + უჯრედი + + + link + Role of an accessible object + ბული + + + help balloon + Role of an accessible object + დახმარების ბუშტი + + + assistant + Role of an accessible object - a helper dialog + დამხმარე + + + list + Role of an accessible object + სია + + + list item + Role of an accessible object + სიის ელემენტი + + + tree + Role of an accessible object + ხე + + + tree item + Role of an accessible object + ხის ელემენტი + + + page tab + Role of an accessible object + გვერდის ჩანართი + + + property page + Role of an accessible object + თვისების გვერდი + + + indicator + Role of an accessible object + მაჩვენებელი + + + graphic + Role of an accessible object + გრაფიკა + + + label + Role of an accessible object + ჭდე + + + text + Role of an accessible object + ტექსტი + + + push button + Role of an accessible object + დააწექით ღილაკს + + + check box + Role of an accessible object + ჩასართავი + + + radio button + Role of an accessible object + ღილაკი + + + combo box + Role of an accessible object + combo box + + + progress bar + Role of an accessible object + მიმდინარეობა + + + dial + Role of an accessible object + დარეკვა + + + hotkey field + Role of an accessible object + მალსახმობი + + + slider + Role of an accessible object + ცოცია + + + spin box + Role of an accessible object + ასარჩევი ზოლი + + + canvas + Role of an accessible object + ტილო + + + animation + Role of an accessible object + ანიმაცია + + + equation + Role of an accessible object + ტოლობა + + + button with drop down + Role of an accessible object + ჩამოსაშლელი ღილაკი + + + button menu + Role of an accessible object + ღილაკის მენიუ + + + button with drop down grid + Role of an accessible object - a button that expands a grid. + ღილაკი ჩამოსაშლელი ბადით + + + space + Role of an accessible object - blank space between other objects. + ადგილი + + + page tab list + Role of an accessible object + გვერდების ჩანართების სია + + + clock + Role of an accessible object + საათი + + + splitter + Role of an accessible object + გამყოფი + + + layered pane + Role of an accessible object + განშრევებული ზოლი + + + web document + Role of an accessible object + ვებ დოკუმენტი + + + paragraph + Role of an accessible object + პარაგრაფი + + + section + Role of an accessible object + სექცია + + + color chooser + Role of an accessible object + ფერის ამრჩევი + + + footer + Role of an accessible object + ძირი + + + form + Role of an accessible object + ფორმა + + + heading + Role of an accessible object + სათაური + + + note + Role of an accessible object + შენიშვნა + + + complementary content + Role of an accessible object + შემცვლელი შემცველობა + + + unknown + Role of an accessible object + უცნობი + + + + QSslSocket + + Unable to write data: %1 + მონაცემების ჩაწერის შეცდომა: %1 + + + Error while reading: %1 + კითხვის შეცდომა: %1 + + + Error during SSL handshake: %1 + SSL-ით დაკავშირების შეცდომა: %1 + + + Error creating SSL context (%1) + SSL კონტექსტის შექმნის შეცდომა: %1 + + + Invalid or empty cipher list (%1) + არასწორი ან ცარიელი შიფრების სია (%1) + + + Error creating SSL session, %1 + SSL სესსის შექმნის შეცდომა: %1 + + + Error creating SSL session: %1 + SSL სესსის შექმნის შეცდომა: %1 + + + Cannot provide a certificate with no key, %1 + გასაღების გარეშე სერტიფიკატის გაცემა შეუძლებელია, %1 + + + Error loading local certificate, %1 + ლოკალური სერტიფიკატის წაკითხვის შეცდომა, %1 + + + Error loading private key, %1 + პირადი გასაღების წაკითხვის შეცდომა, %1 + + + Error when setting the elliptic curves (%1) + ელიფსური მრუდების დაყენების შეცდომა (%1) + + + unsupported protocol + მხარდაუჭერელი პროტოკოლი + + + Private key does not certify public key, %1 + პირადი გასაღები საჯარო გასაღებს არ ემთხვევა, %1 + + + OpenSSL version too old, need at least v1.0.2 + OpenSSL-ის ვერსია ძალიან ძველია. მინიმალური ვერსიაა 1.0.2 + + + No error + შეცდომის გარეშე + + + The issuer certificate could not be found + გამომცემლის სერტიფიკატის პოვნა შეუძლებელია + + + The certificate signature could not be decrypted + სერტიფიკატის ხელმოწერის გაშიფვრა შეუძლებელია + + + The public key in the certificate could not be read + სერტიფიკატის საჯარო გასაღების წაკითხვა შეუძლებელია + + + The signature of the certificate is invalid + სერტიფიკატის ხელმოწერა არასწორია + + + The certificate is not yet valid + სერტიფიკატი ჯერ არასწორია + + + The certificate has expired + სერტიფიკატი ვადაგასულია + + + The certificate's notBefore field contains an invalid time + სერტიფიკატის "notBefore" ველი არასწორ მნიშვნელობას შეიცავს + + + The certificate's notAfter field contains an invalid time + სერტიფიკატის "notAfter" ველი არასწორ მნიშვნელობას შეიცავს + + + The certificate is self-signed, and untrusted + სერტიფიკატი თვითხელმოწერილი და მხარდაუჭერელია + + + The root certificate of the certificate chain is self-signed, and untrusted + ამ სერტიფიკატის სათაო სერტიფიკატი თვითხელმოწერეილი და მხარდაუჭერელია + + + The issuer certificate of a locally looked up certificate could not be found + + + + No certificates could be verified + სერტიფიკატის გადამოწმება შეუძლებელია + + + One of the CA certificates is invalid + ერთერთი სერტიფიკატი არასწორია + + + The basicConstraints path length parameter has been exceeded + + + + The supplied certificate is unsuitable for this purpose + + + + The root CA certificate is not trusted for this purpose + + + + The root CA certificate is marked to reject the specified purpose + + + + The current candidate issuer certificate was rejected because its subject name did not match the issuer name of the current certificate + + + + The current candidate issuer certificate was rejected because its issuer name and serial number was present and did not match the authority key identifier of the current certificate + + + + The peer did not present any certificate + + + + The host name did not match any of the valid hosts for this certificate + + + + The peer certificate is blacklisted + + + + Unknown error + უცნობი შეცდომა + + + The TLS/SSL connection has been closed + + + + Unable to init SSL Context: %1 + SSL კონტექსტის შექმნის შეცდომა: %1 + + + Unable to decrypt data: %1 + მონაცემების გაშიფვრის შეცდომა: %1 + + + + QStandardPaths + + Desktop + სამუშაო მაგიდა + + + Documents + დოკუმენტები + + + Fonts + შრიფტები + + + Applications + პლიკაციები + + + Music + მუსიკა + + + Movies + ფილმები + + + Pictures + სურათები + + + Temporary Directory + დროებითი საქაღალდე + + + Home + საწყისი + + + Cache + კეში + + + Shared Data + გაზიარებული მონაცემები + + + Runtime + გაშვებული ასლი + + + Configuration + გამართვა + + + Shared Configuration + გაზიარებული კონფიგურაცია + + + Shared Cache + გაზიარებული ქეში + + + Download + გადმოწერა + + + Application Data + აპლიკაციის მონაცემები + + + Application Configuration + აპლიკაციის გამართვა + + + + QStateMachine + + Missing initial state in compound state '%1' + + + + Missing default state in history state '%1' + + + + No common ancestor for targets and source of transition from state '%1' + + + + Unknown error + უცნობი შეცდომა + + + + QSystemSemaphore + + %1: permission denied + %1: წვდომა აკრძალულია + + + %1: already exists + %1 უკვე არსებობს + + + %1: does not exist + %1 არ არსებობს + + + %1: out of resources + %1: არასაკმარისი რესურსები + + + %1: unknown error %2 + %1: უცნობი შეცდომა %2 + + + + QTDSDriver + + Unable to open connection + კავშირის გახსნის შეცდომა + + + Unable to use database + მონაცემთა ბაზის გამოყენების შეცდომა + + + + QTabBar + + Scroll Left + მარცხნივ გაწევა + + + Scroll Right + მარჯვნივ გაწევა + + + + QTcpServer + + Operation on socket is not supported + ოპერაცია სოკეტზე მხარდაუჭერელია + + + + QUndoGroup + + Undo %1 + %1-ის დაბრუნება + + + Undo + Default text for undo action + დაბრუნება + + + Redo %1 + %1-ის გამეორება + + + Redo + Default text for redo action + გამეორება + + + + QUndoModel + + <empty> + <empty> + + + + QUndoStack + + Undo %1 + %1-ის დაბრუნება + + + Undo + Default text for undo action + დაბრუნება + + + Redo %1 + %1-ის გამეორება + + + Redo + Default text for redo action + გამეოერბა + + + + QUnicodeControlCharacterMenu + + LRM Left-to-right mark + LRM მარცხნიდან-მარჯვნივ + + + RLM Right-to-left mark + RLM მარჯვნიდან მარცხნივ + + + ZWJ Zero width joiner + ZWJ ნული შემაერთებლით + + + ZWNJ Zero width non-joiner + ZWNJ ნული არაშემაერთებლით + + + ZWSP Zero width space + + + + LRE Start of left-to-right embedding + + + + RLE Start of right-to-left embedding + + + + LRO Start of left-to-right override + + + + RLO Start of right-to-left override + + + + PDF Pop directional formatting + + + + Insert Unicode control character + + + + LRI Left-to-right isolate + + + + RLI Right-to-left isolate + + + + FSI First strong isolate + + + + PDI Pop directional isolate + + + + + QWhatsThisAction + + What's This? + რა არის ეს? + + + + QWidget + + * + * + + + + QWidgetTextControl + + &Undo + &დაბრუნება + + + &Redo + &გამეორება + + + Cu&t + &ამოჭრა + + + &Copy + &კოპირება + + + Copy &Link Location + ბმულის &მდებარეობის კოპირება + + + &Paste + &ჩასმა + + + Delete + წაშლა + + + Select All + ყველაფრის მონიშვნა + + + + QWindowsDirect2DIntegration + + Qt cannot load the direct2d platform plugin because the Direct2D version on this system is too old. The minimum system requirement for this platform plugin is Windows 7 SP1 with Platform Update. + +The minimum Direct2D version required is %1.%2.%3.%4. The Direct2D version on this system is %5.%6.%7.%8. + + + + Cannot load direct2d platform plugin + + + + + QWizard + + Go Back + უკან გადასვლა + + + Continue + გაგრძელება + + + Commit + კომიტი + + + Done + დასრულებული + + + Help + დახმარება + + + < &Back + < &უკან + + + &Finish + &დასრულება + + + Cancel + გაუქმება + + + &Help + &დახმარება + + + &Next + &შემდეგი + + + &Next > + &შემდეგი > + + + + QXml + + no error occurred + შეცდომა არ მომხდარა + + + error triggered by consumer + + + + unexpected end of file + + + + more than one document type definition + + + + error occurred while parsing element + + + + tag mismatch + + + + error occurred while parsing content + + + + unexpected character + + + + invalid name for processing instruction + + + + version expected while reading the XML declaration + + + + wrong value for standalone declaration + + + + encoding declaration or standalone declaration expected while reading the XML declaration + + + + standalone declaration expected while reading the XML declaration + + + + error occurred while parsing document type definition + + + + letter is expected + + + + error occurred while parsing comment + + + + error occurred while parsing reference + + + + internal general entity reference not allowed in DTD + + + + external parsed general entity reference not allowed in attribute value + + + + external parsed general entity reference not allowed in DTD + + + + unparsed entity reference in wrong context + + + + recursive entities + + + + error in the text declaration of an external entity + + + + + QXmlStream + + Extra content at end of document. + + + + Invalid entity value. + + + + Invalid XML character. + + + + Sequence ']]>' not allowed in content. + + + + Namespace prefix '%1' not declared + + + + Unexpected character '%1' in public id literal. + + + + Invalid XML version string. + + + + Unsupported XML version. + + + + %1 is an invalid encoding name. + + + + Encoding %1 is unsupported + + + + Standalone accepts only yes or no. + + + + Invalid attribute in XML declaration. + + + + Premature end of document. + + + + Invalid document. + + + + Expected + + + + , but got ' + + + + Unexpected ' + + + + Expected character data. + + + + Recursive entity detected. + + + + Start tag expected. + + + + XML declaration not at start of document. + + + + NDATA in parameter entity declaration. + + + + %1 is an invalid processing instruction name. + + + + Invalid processing instruction name. + + + + Illegal namespace declaration. + + + + Invalid XML name. + + + + Opening and ending tag mismatch. + + + + Reference to unparsed entity '%1'. + + + + Entity '%1' not declared. + + + + Reference to external entity '%1' in attribute value. + + + + Invalid character reference. + + + + Encountered incorrectly encoded content. + + + + The standalone pseudo attribute must appear after the encoding. + + + + %1 is an invalid PUBLIC identifier. + + + + Attribute '%1' redefined. + + + + diff -Nru virtualbox-hwe-6.1.34-dfsg/src/VBox/Frontends/VirtualBox/nls/qt_pt.ts virtualbox-hwe-6.1.38-dfsg/src/VBox/Frontends/VirtualBox/nls/qt_pt.ts --- virtualbox-hwe-6.1.34-dfsg/src/VBox/Frontends/VirtualBox/nls/qt_pt.ts 2022-03-22 23:44:35.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/src/VBox/Frontends/VirtualBox/nls/qt_pt.ts 2022-09-01 13:28:00.000000000 +0000 @@ -597,7 +597,7 @@ Host not found - Hospedeiro não encontrado + Anfitrião não encontrado Connection refused @@ -636,7 +636,7 @@ &Select All - Selecionar Tudo + &Selecionar Tudo @@ -981,43 +981,43 @@ QCommandLineParser Displays version information. - + Exibe a informação da versão. Displays this help. - + Exibe esta ajuda. Unknown option '%1'. - + Opção desconhecida '%1'. Unknown options: %1. - + Opções desconhecidas '%1'. Missing value after '%1'. - + Valor em falta depois de '%1'. Unexpected value after '%1'. - + Valor inesperado depois de '%1'. [options] - + [opções] Usage: %1 - + Utilização: %1 Options: - + Opções: Arguments: - + Argumentos: @@ -1042,41 +1042,41 @@ QCupsJobWidget Job - + Tarefa Job Control - + Controle de Tarefas Scheduled printing: - + Impressão agendada: Billing information: - + Informação de faturação: Job priority: - + Prioridade da tarefa: Banner Pages - + Páginas de Faixa End: Banner page at end - + Fim: Start: Banner page at start - + Início: Print Immediately - + Imprimir Imediatamente Hold Indefinitely @@ -1146,19 +1146,19 @@ QDB2Driver Unable to connect - Ligação não possível + Não é possível ligar Unable to commit transaction - Finalização de transacção não possível + Não é possível finalizar a transação Unable to rollback transaction - Anulação de transacção não possível + Não é possível anular a transação Unable to set autocommit - Finalização automática não possível + Não é possível finalizar automaticamente @@ -1218,19 +1218,19 @@ QDateTimeParser AM - AM + AM am - am + am PM - PM + PM pm - pm + pm @@ -1368,7 +1368,7 @@ QDnsLookup Operation cancelled - + Operação cancelada @@ -1455,19 +1455,19 @@ No hostname given - + Nenhum nome de anfitrião atribuido Invalid hostname - + Nome de anfitrião inválido Host %1 could not be found. - + Não foi possível encontrar o anfitrião %1. Unknown error - Erro desconhecido + Erro desconhecido @@ -1475,12 +1475,12 @@ Close Accessible name for button closing a dock widget - Fechar + Fechar Float Accessible name for button undocking a dock widget (floating state) - + Flutuar Undocks and re-attaches the dock widget @@ -1506,7 +1506,7 @@ QErrorMessage Debug Message: - Mensagem Depuração: + Mensagem de depuração: Warning: @@ -1514,7 +1514,7 @@ Fatal Error: - Erro Fatal: + Erro fatal: &Show this message again @@ -1529,7 +1529,7 @@ QFile Destination file exists - + O ficheiro de destino existe Cannot remove source file @@ -1587,7 +1587,7 @@ Directories - Pastas + Diretorias &Open @@ -1595,7 +1595,7 @@ &Save - &Gravar + &Guardar Open @@ -1625,49 +1625,49 @@ &Delete - &Apagar + E&liminar Show &hidden files - Mostrar ficheiros &escondidos + Mostrar ficheiros &ocultados Back - Recuar + Anterior Parent Directory - Pasta Mãe + Diretoria Fonte List View - Vista Abreviada + Visualização Abreviada Detail View - Vista Detalhada + Visualização Detalhada Files of type: - FIcheiros do tipo: + Ficheiros do tipo: Directory: - Pasta: + Diretoria: %1 Directory not found. Please verify the correct directory name was given. %1 -Pasta não encontrada. -Por favor verifique o nome da pasta. +Diretoria não encontrada. +Por favor, verifique o nome correto da diretoria. '%1' is write protected. Do you want to delete it anyway? - '%1' está protegido contra escrita. -Deseja apagar de qualquer forma? + '%1' está protegido contra gravação. +Mesmo assim, deseja eliminar? Are sure you want to delete '%1'? @@ -1675,15 +1675,15 @@ Could not delete directory. - Não foi possível apagar a pasta. + Não foi possível eliminar a diretoria. Recent Places - + Locais Recentes Save As - Gravar Como + Guardar Como Drive @@ -1699,43 +1699,43 @@ Find Directory - Procurar Pasta + Encontrar Diretoria Show - + Mostrar Forward - Seguinte + Avançar New Folder - Nova Pasta + Nova Pasta &New Folder - + &Nova Pasta &Choose - + &Escolher Remove - + Remover File &name: - &Nome do Ficheiro: + &Nome do ficheiro: Look in: - + Procurar em: Create New Folder - Criar Nova Pasta + Criar Nova Pasta @@ -1751,23 +1751,23 @@ Go back - + Anterior Alt+Left - + Alt+Esquerdo Go forward - + Avançar Alt+Right - + Alt+Direito Go to the parent directory - + Ir para diretoria fonte Alt+Up @@ -1775,7 +1775,7 @@ Create a New Folder - + Criar uma Nova Pasta Change to list view mode @@ -1787,7 +1787,7 @@ Sidebar - + Barra lateral List of places and bookmarks @@ -1795,34 +1795,34 @@ Files - + Ficheiros All files (*) - + Todos os Ficheiros (*) Delete - + Eliminar Are you sure you want to delete '%1'? - + Tem a certeza que deseja eliminar '%1'? %1 File %1 is a file name suffix, for example txt - + Ficheiro %1 File Folder Match Windows Explorer - + Pasta de Ficheiros Folder All other platforms - + Pasta Alias @@ -1832,34 +1832,34 @@ Shortcut All other platforms - + Atalho QFileSystemModel %1 TB - + %1 TB %1 GB - + %1 GB %1 MB - + %1 MB %1 KB - + %1 KB %1 bytes - + %1 bytes Invalid filename - + Nome do ficheiro inválido <b>The name "%1" can not be used.</b><p>Try using another name, with fewer characters or no punctuations marks. @@ -1867,44 +1867,44 @@ Name - Nome + Nome Size - Tamanho + Tamanho Kind Match OS X Finder - Tipo + Tipo Type All other platforms - Tipo + Tipo Date Modified - Data de Modificação + Data de Modificação My Computer - O Meu Computador + Meu Computador Computer - + Computador %1 byte(s) - + %1 byte(s) QFontDatabase Bold - + Negrito Demi Bold @@ -1925,7 +1925,7 @@ Italic - + Itálico Oblique @@ -1933,15 +1933,15 @@ Any - + Qualquer Latin - + Latim Greek - + Grego Cyrillic @@ -2033,27 +2033,27 @@ Simplified Chinese - + Chinês Simplificado Traditional Chinese - + Chinês Tradicional Japanese - + Japonês Korean - + Coreano Vietnamese - + Vietenamita Symbol - + Símbolo Ogham @@ -2066,7 +2066,7 @@ Normal The Normal or Regular font weight - + Normal Medium @@ -2131,7 +2131,7 @@ Select Font - Seleccione Tipo de Letra + Selecionar Tipo de Letra @@ -2142,19 +2142,19 @@ Host %1 not found - Servidor %1 não encontrado + Anfitrião %1 não encontrado Connection refused to host %1 - Ligação ao servidor %1 recusada + Ligação recusada ao anfitrião %1 Connection timed out to host %1 - + A ligação ao anfitrião %1 expirou Connected to host %1 - Ligado ao servidor %1 + Ligado ao anfitrião %1 Connection refused for data connection @@ -2167,7 +2167,7 @@ Connecting to host failed: %1 - A ligação ao servidor falhou: + A ligação ao anfitrião falhou: %1 @@ -2179,25 +2179,25 @@ Listing directory failed: %1 - A listagem da pasta falhou: + A listagem da diretoria falhou: %1 Changing directory failed: %1 - A mudança de pasta falhou: + A alteração da diretoria falhou: %1 Downloading file failed: %1 - A descarga do ficheiro falhou: + A transferência do ficheiro falhou: %1 Uploading file failed: %1 - O carregamento do ficheiro falhou: + O envio do ficheiro falhou: %1 @@ -2209,13 +2209,13 @@ Creating directory failed: %1 - A criação da pasta falhou: + A criação da diretoria falhou: %1 Removing directory failed: %1 - A remoção da pasta falhou: + A remoção da diretoria falhou: %1 @@ -2240,30 +2240,30 @@ Data Connection refused - + Ligação de dados recusada QGnomeTheme &OK - &OK + &OK &Save - &Gravar + &Guardar &Cancel - &Cancelar + &Cancelar &Close - &Fechar + &Fechar Close without Saving - Fechar sem Gravar + Fechar sem Guardar @@ -2282,14 +2282,14 @@ No host name given - + Nenhum nome de anfitrião atribuido QHostInfoAgent Host not found - Servidor Não encontrado + Anfitrião não encontrado Unknown address type @@ -2301,15 +2301,15 @@ No host name given - + Nenhum nome de anfitrião atribuido Invalid hostname - + Nome de anfitrião inválido Unknown error (%1) - + Error desconhecido (%1) @@ -2340,7 +2340,7 @@ Host %1 not found - Servidor %1 não encontrado + Anfitrião %1 não encontrado HTTP request failed @@ -2380,19 +2380,19 @@ Proxy requires authentication - + Proxy requer autenticação Host requires authentication - + Anfitrião requer autenticação Data corrupted - + Dados corrompidos Unknown protocol specified - + Espceficiado protocolo desconhecido SSL handshake failed @@ -2411,7 +2411,7 @@ QHttpSocketEngine Authentication required - + Autenticação necessária Did not receive HTTP response from proxy @@ -3164,7 +3164,7 @@ About Qt - Acerca do Qt + Sobre o Qt <p>This program uses Qt version %1.</p> @@ -3176,7 +3176,7 @@ Hide Details... - Não Mostrar Detalhes... + Ocultar Detalhes... <p>This program uses Qt Open Source Edition version %1.</p><p>Qt Open Source Edition is intended for the development of Open Source applications. You need a commercial Qt license for development of proprietary (closed source) applications.</p><p>Please see <a href="http://www.trolltech.com/company/model/">www.trolltech.com/company/model/</a> for an overview of Qt licensing.</p> @@ -3192,11 +3192,11 @@ <h3>About Qt</h3><p>This program uses Qt version %1.</p> - + <h3>Sobre o Qt</h3><p>Este programa utiliza a versão %1 do Qt.</p> <p>Qt is a C++ toolkit for cross-platform application development.</p><p>Qt provides single-source portability across all major desktop operating systems. It is also available for embedded Linux and other embedded and mobile operating systems.</p><p>Qt is available under three different licensing options designed to accommodate the needs of our various users.</p><p>Qt licensed under our commercial license agreement is appropriate for development of proprietary/commercial software where you do not want to share any source code with third parties or otherwise cannot comply with the terms of the GNU LGPL version 3 or GNU LGPL version 2.1.</p><p>Qt licensed under the GNU LGPL version 3 is appropriate for the development of Qt&nbsp;applications provided you can comply with the terms and conditions of the GNU LGPL version 3.</p><p>Qt licensed under the GNU LGPL version 2.1 is appropriate for the development of Qt&nbsp;applications provided you can comply with the terms and conditions of the GNU LGPL version 2.1.</p><p>Please see <a href="http://%2/">%2</a> for an overview of Qt licensing.</p><p>Copyright (C) %1 The Qt Company Ltd and other contributors.</p><p>Qt and the Qt logo are trademarks of The Qt Company Ltd.</p><p>Qt is The Qt Company Ltd product developed as an open source project. See <a href="http://%3/">%3</a> for more information.</p> - + <p>Qt é uma ferramenta de C++ para o desenvolvimento de aplicação de plataformas cruzadas.</p><p>Qt provides single-source portability across all major desktop operating systems. It is also available for embedded Linux and other embedded and mobile operating systems.</p><p>Qt is available under three different licensing options designed to accommodate the needs of our various users.</p><p>Qt licensed under our commercial license agreement is appropriate for development of proprietary/commercial software where you do not want to share any source code with third parties or otherwise cannot comply with the terms of the GNU LGPL version 3 or GNU LGPL version 2.1.</p><p>Qt licensed under the GNU LGPL version 3 is appropriate for the development of Qt&nbsp;applications provided you can comply with the terms and conditions of the GNU LGPL version 3.</p><p>Qt licensed under the GNU LGPL version 2.1 is appropriate for the development of Qt&nbsp;applications provided you can comply with the terms and conditions of the GNU LGPL version 2.1.</p><p>Please see <a href="http://%2/">%2</a> for an overview of Qt licensing.</p><p>Direitos de Autor (C) %1 A Qt Company Ltd e outros colaboradores.</p><p>Qt e o logótipo Qt são marcas registadas da Qt Company Ltd.</p><p>Qt é um produto da Qt Company Ltd desenvolvido como um projeto de fonte aberta. Consulte <a href="http://%3/">%3</a> para mais informação.</p> @@ -3221,7 +3221,7 @@ QNativeSocketEngine The remote host closed the connection - A máquina remota fechou a ligação + O anfitrião remoto fechou a ligação Network operation timed out @@ -3273,15 +3273,15 @@ Unable to send a message - Não foi possível enviar uma mensagem + Não é possível enviar uma mensagem Unable to receive a message - Não foi possível receber uma mensagem + Não é possível receber uma mensagem Unable to write - Não foi possível escrever + Não é possível gravar Network error @@ -3305,7 +3305,7 @@ Host unreachable - Máquina inalcançável + Anfitrião inalcançável Datagram was too large to send @@ -3325,7 +3325,7 @@ Temporary error - + Erro temporário Network dropped connection on reset @@ -3497,24 +3497,24 @@ QOCIDriver Unable to logon - Não foi possível autenticar + Não é possível iniciar a sessão Unable to initialize QOCIDriver - Não foi possível inicializar + Não é possível inicializar Unable to begin transaction - Não foi possível iniciar a transacção + Não é possível iniciar a transação Unable to commit transaction - + Não é possível finalizar a transação Unable to rollback transaction - + Não é possível anular a transação @@ -3560,7 +3560,7 @@ QODBCDriver Unable to connect - Não foi possível ligar + Não é possível ligar Unable to connect - Driver doesn't support all needed functionality @@ -3568,46 +3568,46 @@ Unable to disable autocommit - Não foi possível desactivar finalização automática + Não é possível desativar a finalização automática Unable to commit transaction - Não foi possível finalizar a transacção + Não é possível finalizar a transação Unable to rollback transaction - Não foi possível anular a transacção + Não é possível anular a transação Unable to enable autocommit - Não foi possível activar finalização automática + Não é possível ativar a finalização automática Unable to connect - Driver doesn't support all functionality required - + Não é possível ligar - O controlador não suporta todas as funcionalidades necessárias QODBCResult QODBCResult::reset: Unable to set 'SQL_CURSOR_STATIC' as statement attribute. Please check your ODBC driver configuration - QODBCResult::reset: Não foi possível definir 'SQL_CURSOR_STATIC' como atributo da expressão. Por favor verifique a configuração do seu 'driver' ODBC + QODBCResult::reset: Não é possível definir 'SQL_CURSOR_STATIC' como atributo da expressão. Por favor, verifique a configuração do seu controaldor ODBC Unable to execute statement - Não foi possível executar a expressão + Não é possível executar a expressão Unable to fetch next - Não foi possível obter o seguinte + Não é possível obter o seguinte Unable to prepare statement - Não foi possível preparar a expressão + Não é possível preparar a expressão Unable to bind variable - Não foi possível fazer o ligamento da variável + Não é possível associar a variável Unable to fetch last @@ -3615,7 +3615,7 @@ Unable to fetch - + Não é possível obter Unable to fetch first @@ -3648,53 +3648,53 @@ QPSQLDriver Unable to connect - Não foi possível ligar + Não é possível ligar Could not begin transaction - Não foi possível iniciar a transacção + Não foi possível iniciar a transação Could not commit transaction - Não foi possível finalizar a transacção + Não foi possível finalizar a transação Could not rollback transaction - Não foi possível anular a transacção + Não foi possível anular a transação Unable to subscribe - + Não é possível subscrever Unable to unsubscribe - + Não é possível cancelar subscrição QPSQLResult Unable to create query - Não foi possível criar a 'query' + Não é possível criar a consulta Unable to prepare statement - + Não é possível preparar a expressão QPageSetupWidget Millimeters (mm) - + Milimetros (mm) Inches (in) - + Polegadas (in) Points (pt) - + Pontos (pt) Form @@ -3706,15 +3706,15 @@ Page size: - Tamanho página: + Tamanho da página: Width: - + Largura: Height: - + Altura: Paper source: @@ -3722,15 +3722,15 @@ Orientation - + Orientação Portrait - Retrato + Vertical Landscape - Paisagem + Horizontal Reverse landscape @@ -3742,7 +3742,7 @@ Margins - + Margens top margin @@ -3786,37 +3786,37 @@ Custom - + Personalizado mm Unit 'Millimeter' - + mm pt Unit 'Points' - + pt in Unit 'Inch' - + pol Unit 'Pica' - + DD Unit 'Didot' - + DD CC Unit 'Cicero' - + CC @@ -3854,95 +3854,95 @@ %1 x %2 in Page size in 'Inch'. - + %1 x %2 in A0 - + A0 A1 - + A1 A2 - + A2 A3 - + A3 A4 - + A4 A5 - + A5 A6 - + A6 A7 - + A7 A8 - + A8 A9 - + A9 A10 - + A10 B0 - + B0 B1 - + B1 B2 - + B2 B3 - + B3 B4 - + B4 B5 - + B5 B6 - + B6 B7 - + B7 B8 - + B8 B9 - + B9 B10 - + B10 Executive (7.5 x 10 in) @@ -3958,7 +3958,7 @@ Legal - + Legal Letter / ANSI A @@ -3974,15 +3974,15 @@ Custom - + Personalizado A3 Extra - + A3 Extra A4 Extra - + A4 Extra A4 Plus @@ -3994,71 +3994,71 @@ A5 Extra - + A5 Extra B5 Extra - + B5 Extra JIS B0 - + JIS B0 JIS B1 - + JIS B1 JIS B2 - + JIS B2 JIS B3 - + JIS B3 JIS B4 - + JIS B4 JIS B5 - + JIS B5 JIS B6 - + JIS B6 JIS B7 - + JIS B7 JIS B8 - + JIS B8 JIS B9 - + JIS B9 JIS B10 - + JIS B10 ANSI C - + ANSI C ANSI D - + ANSI D ANSI E - + ANSI E Legal Extra - + Legal Extra Letter Extra @@ -4150,75 +4150,75 @@ Envelope B4 - + Envelope B4 Envelope B5 - + Envelope B5 Envelope B6 - + Envelope B6 Envelope C0 - + Envelope C0 Envelope C1 - + Envelope C1 Envelope C2 - + Envelope C2 Envelope C3 - + Envelope C3 Envelope C4 - + Envelope C4 Envelope C5 - + Envelope C5 Envelope C6 - + Envelope C6 Envelope C65 - + Envelope C65 Envelope C7 - + Envelope C7 Envelope DL - + Envelope DL Envelope US 9 - + Envelope US 9 Envelope US 10 - + Envelope US 10 Envelope US 11 - + Envelope US 11 Envelope US 12 - + Envelope US 12 Envelope US 14 - + Envelope US 14 Envelope Monarch @@ -4301,75 +4301,75 @@ QPlatformTheme OK - OK + OK Save - Gravar + Guardar Save All - Gravar Todos + Guardar Tudo Open - Abrir + Abrir &Yes - &Sim + &Sim Yes to &All - Sim para &Todos + Sim para &Tudo &No - &Não + &Não N&o to All - N&ão para Todos + N&ão para Tudo Abort - Abortar + Abortar Retry - Tentar Novamente + Repetir Ignore - Ignorar + Ignorar Close - Fechar + Fechar Cancel - Cancelar + Cancelar Discard - Descartar + Ignorar Help - Ajuda + Ajuda Apply - Aplicar + Aplicar Reset - Restaurar + Reiniciar Restore Defaults - Restaurar Predefinições + Restaurar Predefinições @@ -4380,7 +4380,7 @@ The plugin was not loaded. - + O "plug-in" não foi carregado. @@ -4399,13 +4399,13 @@ Print To File ... - Imprimir Para Ficheiro ... + Imprimir para Ficheiro ... File %1 is not writable. Please choose a different file name. - Não é possível escrever no ficheiro %1. -Por favor escolha um nome diferente. + O ficheiro %1 não é gravável. +Por favor, escolha um nome de ficheiro diferente. %1 already exists. @@ -4420,23 +4420,23 @@ &Options >> - + &Opções >> &Print - + &Imprimir &Options << - + &Opções << Print to File (PDF) - + Imprimir para Ficheiro (PDF) Local file - + Ficheiro local Portrait @@ -4724,31 +4724,31 @@ 1 (1x1) - + 1 (1x1) 2 (2x1) - + 2 (2x1) 4 (2x2) - + 4 (2x2) 6 (2x3) - + 6 (2x3) 9 (3x3) - + 9 (3x3) 16 (4x4) - + 16 (4x4) All Pages - + Todas as Páginas Odd Pages @@ -4769,7 +4769,7 @@ Automatic - + Automático @@ -4808,19 +4808,19 @@ Zoom in - + Zoom + Zoom out - + Zoom - Portrait - Retrato + Vertical Landscape - Paisagem + Horizontal Show single page @@ -4836,7 +4836,7 @@ Print - + Imprimir Page setup @@ -4848,11 +4848,11 @@ Export to PDF - + Exportar para PDF %1% - + %1% @@ -4871,65 +4871,65 @@ Printer Properties - + Propriedades da Impressora Job Options - + Opções de Tarefa QPrintPropertiesWidget Form - + De Page - + Página QPrintSettingsOutput Form - + De Copies - Cópias + Cópias Print range - Selecção de páginas + Seleção de páginas Print all - Imprimir todas + Imprimir tudo Pages from - Páginas de + Páginas de to - a + até Selection - Selecção + Seleção Output Settings - + Definições de Saída Copies: - + Cópias: Collate - Juntar + Juntar Reverse @@ -4937,19 +4937,19 @@ Options - Opções + Opções Color Mode - + Modo de Cor Color - + Cor Grayscale - + Preto e Branco Duplex Printing @@ -4969,7 +4969,7 @@ Current Page - + Página Atual Page Set: @@ -4984,35 +4984,35 @@ Printer - Impressora + Impressora &Name: - + &Nome: P&roperties - + P&ropriedades Location: - + Localização: Preview - + Pré-visualizar Type: - + Tipo: Output &file: - + &Ficheiro de saída: ... - + ... @@ -5076,14 +5076,14 @@ QQnxFileDialogHelper All files (*.*) - + Todos os Ficheiros (*.*) QQnxFilePicker Pick a file - + Escolher um ficheiro @@ -5097,7 +5097,7 @@ QRegExp no error occurred - sem erros + não ocorreu nenhum erro disabled feature used @@ -5148,7 +5148,7 @@ QRegularExpression no error - + sem erros \ at end of pattern @@ -6764,11 +6764,11 @@ Network operation timed out - Operação de rede expirada + Operação de rede expirou Connection to proxy refused - + Ligação ao proxy recusada Connection to proxy closed prematurely @@ -6804,7 +6804,7 @@ TTL expired - + TTL expirou SOCKSv5 command not supported @@ -6812,7 +6812,7 @@ Address type not supported - + Tipo de endereço não suportado Unknown SOCKSv5 proxy error code 0x%1 @@ -7521,11 +7521,11 @@ QTDSDriver Unable to open connection - Não foi possível estabelecer a ligação + Não é possível estabelecer ligação Unable to use database - Não foi possível utilizar a base de dados + Não é possível utilizar a base de dados @@ -7615,21 +7615,21 @@ Undo %1 - + Anular %1 Undo Default text for undo action - Desfazer + Anular Redo %1 - + Refazer %1 Redo Default text for redo action - Refazer + Refazer @@ -7651,21 +7651,21 @@ Undo %1 - + Anular %1 Undo Default text for undo action - Desfazer + Anular Redo %1 - + Refazer %1 Redo Default text for redo action - Refazer + Refazer @@ -7815,7 +7815,7 @@ QWhatsThisAction What's This? - O Que é Isto? + O que é isto? @@ -7829,35 +7829,35 @@ QWidgetTextControl &Undo - &Desfazer + An&ular &Redo - &Refazer + &Refazer Cu&t - Cor&tar + Cor&tar &Copy - &Copiar + &Copiar Copy &Link Location - Copiar &Localização da Ligação + Copiar Localização da Hiper&lLigação &Paste - Co&lar + Co&lar Delete - + Eliminar Select All - Seleccionar Tudo + Selecionar Tudo @@ -7877,11 +7877,11 @@ QWizard Go Back - + Anterior Continue - + Continuar Commit @@ -7897,31 +7897,31 @@ Help - Ajuda + Ajuda < &Back - < &Recuar + < &Anterior &Finish - &Terminar + &Terminar Cancel - Cancelar + Cancelar &Help - &Ajuda + &Ajuda &Next - + Segui&nte &Next > - &Avançar > + Segui&nte > diff -Nru virtualbox-hwe-6.1.34-dfsg/src/VBox/Frontends/VirtualBox/nls/qt_sk.ts virtualbox-hwe-6.1.38-dfsg/src/VBox/Frontends/VirtualBox/nls/qt_sk.ts --- virtualbox-hwe-6.1.34-dfsg/src/VBox/Frontends/VirtualBox/nls/qt_sk.ts 2022-03-22 23:44:35.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/src/VBox/Frontends/VirtualBox/nls/qt_sk.ts 2022-09-01 13:28:00.000000000 +0000 @@ -2252,23 +2252,23 @@ QGnomeTheme &OK - &OK + &OK &Save - &Uložiť + &Uložiť &Cancel - + &Zrušiť &Close - &Zavrieť + Za&vrieť Close without Saving - Zavrieť bez uloženia + Zavrieť bez uloženia @@ -2413,11 +2413,11 @@ Too many redirects - + Príliš veľa presmerovaní Insecure redirect - + Nezabezpečené presmerovanie @@ -2573,18 +2573,18 @@ file to open is a directory - + súbor, ktorý chcete otvoriť, je adresárom QImageReader Invalid device - + Neplatné zariadenie File not found - + Súbor nebol nájdený Unsupported image format diff -Nru virtualbox-hwe-6.1.34-dfsg/src/VBox/Frontends/VirtualBox/nls/VirtualBox_bg.ts virtualbox-hwe-6.1.38-dfsg/src/VBox/Frontends/VirtualBox/nls/VirtualBox_bg.ts --- virtualbox-hwe-6.1.34-dfsg/src/VBox/Frontends/VirtualBox/nls/VirtualBox_bg.ts 2022-03-22 23:44:34.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/src/VBox/Frontends/VirtualBox/nls/VirtualBox_bg.ts 2022-09-01 13:27:57.000000000 +0000 @@ -2592,6 +2592,10 @@ Primary Group + + Storage Controller (VirtioSCSI) + + UIApplianceImportEditorWidget @@ -3913,7 +3917,7 @@ Starting GuestSessionStatus - Стартиране + Стартиране Starting @@ -4107,8 +4111,8 @@ NAT - Bridget Adapter - + Bridged Adapter + Мостов адаптер Internal Network @@ -4675,6 +4679,50 @@ NetworkAttachmentType + + Undefined + GuestSessionStatus + + + + Started + GuestSessionStatus + + + + Terminating + GuestSessionStatus + + + + Terminated + GuestSessionStatus + + + + Timed Out (Killed) + GuestSessionStatus + + + + Timed Out (Abnormally) + GuestSessionStatus + + + + Down + GuestSessionStatus + + + + Error + GuestSessionStatus + + + + Cloud Network + + UICustomFileSystemModel @@ -6549,6 +6597,14 @@ No Guest Session found!<br>Please use the Session Panel to start a new guest session + + Close dialog without saving + + + + Reset Changes (%1) + + UIFilePathSelector @@ -13105,10 +13161,6 @@ - The hardware virtualization is enabled in the Acceleration section of the System page although it is not supported by the host system. It should be disabled in order to start the virtual system. - - - When checked, the nested hardware virtualization CPU feature will be exposed to the virtual machine. @@ -16102,18 +16154,6 @@ - Failed to open the medium with following ID: <nobr><b>%1</b></nobr>. - - - - Failed to acquire attachment parameter. - - - - Failed to acquire medium attribute. - - - Failed to create cloud machine. diff -Nru virtualbox-hwe-6.1.34-dfsg/src/VBox/Frontends/VirtualBox/nls/VirtualBox_ca.ts virtualbox-hwe-6.1.38-dfsg/src/VBox/Frontends/VirtualBox/nls/VirtualBox_ca.ts --- virtualbox-hwe-6.1.34-dfsg/src/VBox/Frontends/VirtualBox/nls/VirtualBox_ca.ts 2022-03-22 23:44:34.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/src/VBox/Frontends/VirtualBox/nls/VirtualBox_ca.ts 2022-09-01 13:27:57.000000000 +0000 @@ -1867,6 +1867,10 @@ Primary Group Grup primari + + Storage Controller (VirtioSCSI) + + UIApplianceImportEditorWidget @@ -3225,7 +3229,7 @@ NAT - Bridget Adapter + Bridged Adapter Adaptador pont @@ -3793,6 +3797,55 @@ NetworkAttachmentType + + Undefined + GuestSessionStatus + + + + Starting + GuestSessionStatus + S'està iniciant + + + Started + GuestSessionStatus + + + + Terminating + GuestSessionStatus + + + + Terminated + GuestSessionStatus + + + + Timed Out (Killed) + GuestSessionStatus + + + + Timed Out (Abnormally) + GuestSessionStatus + + + + Down + GuestSessionStatus + + + + Error + GuestSessionStatus + + + + Cloud Network + Xarxa al núvol + UICustomFileSystemModel @@ -4693,6 +4746,14 @@ No Guest Session found!<br>Please use the Session Panel to start a new guest session No hi ha sessió de convidat!<br>Si us plau feu servir el tauler de sessions per a engegar una sessió de convidat nova + + Close dialog without saving + Tanca el diàleg sense desar + + + Reset Changes (%1) + Reinicialitza els canvis (%1) + UIFilePathSelector @@ -7328,7 +7389,7 @@ The hardware virtualization is enabled in the Acceleration section of the System page although it is not supported by the host system. It should be disabled in order to start the virtual system. - La virtualització del maquinari està activada a la secció d'acceleració de la pàgina del sistema, tot i que no és compatible amb el sistema amfitrió. Cal desactivar-la per iniciar el sistema virtual. + La virtualització del maquinari està activada a la secció d'acceleració de la pàgina del sistema, tot i que no és compatible amb el sistema amfitrió. Cal desactivar-la per iniciar el sistema virtual. %1 CPU @@ -9157,15 +9218,15 @@ Failed to open the medium with following ID: <nobr><b>%1</b></nobr>. - Fallada en obrir el medi amb el següent ID: <nobr><b>%1</b></nobr>. + Fallada en obrir el medi amb el següent ID: <nobr><b>%1</b></nobr>. Failed to acquire attachment parameter. - No s'ha pogut adquirir el paràmetre de l'adjunt + No s'ha pogut adquirir el paràmetre de l'adjunt Failed to acquire medium attribute. - Fallada en adquirir els atributs del medi. + Fallada en adquirir els atributs del medi. Failed to create cloud machine. diff -Nru virtualbox-hwe-6.1.34-dfsg/src/VBox/Frontends/VirtualBox/nls/VirtualBox_ca_VA.ts virtualbox-hwe-6.1.38-dfsg/src/VBox/Frontends/VirtualBox/nls/VirtualBox_ca_VA.ts --- virtualbox-hwe-6.1.34-dfsg/src/VBox/Frontends/VirtualBox/nls/VirtualBox_ca_VA.ts 2022-03-22 23:44:34.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/src/VBox/Frontends/VirtualBox/nls/VirtualBox_ca_VA.ts 2022-09-01 13:27:57.000000000 +0000 @@ -2548,6 +2548,10 @@ Primary Group + + Storage Controller (VirtioSCSI) + + UIApplianceImportEditorWidget @@ -3837,7 +3841,7 @@ Starting GuestSessionStatus - S'està iniciant + S'està iniciant Starting @@ -4031,8 +4035,8 @@ NAT - Bridget Adapter - + Bridged Adapter + Adaptador pont Internal Network @@ -4599,6 +4603,50 @@ NetworkAttachmentType + + Undefined + GuestSessionStatus + + + + Started + GuestSessionStatus + + + + Terminating + GuestSessionStatus + + + + Terminated + GuestSessionStatus + + + + Timed Out (Killed) + GuestSessionStatus + + + + Timed Out (Abnormally) + GuestSessionStatus + + + + Down + GuestSessionStatus + + + + Error + GuestSessionStatus + + + + Cloud Network + + UICustomFileSystemModel @@ -6469,6 +6517,14 @@ No Guest Session found!<br>Please use the Session Panel to start a new guest session + + Close dialog without saving + + + + Reset Changes (%1) + + UIFilePathSelector @@ -12769,10 +12825,6 @@ - The hardware virtualization is enabled in the Acceleration section of the System page although it is not supported by the host system. It should be disabled in order to start the virtual system. - - - %1 CPU %1 is 1 for now @@ -15828,18 +15880,6 @@ - Failed to open the medium with following ID: <nobr><b>%1</b></nobr>. - - - - Failed to acquire attachment parameter. - - - - Failed to acquire medium attribute. - - - Failed to create cloud machine. diff -Nru virtualbox-hwe-6.1.34-dfsg/src/VBox/Frontends/VirtualBox/nls/VirtualBox_cs.ts virtualbox-hwe-6.1.38-dfsg/src/VBox/Frontends/VirtualBox/nls/VirtualBox_cs.ts --- virtualbox-hwe-6.1.34-dfsg/src/VBox/Frontends/VirtualBox/nls/VirtualBox_cs.ts 2022-03-22 23:44:34.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/src/VBox/Frontends/VirtualBox/nls/VirtualBox_cs.ts 2022-09-01 13:27:57.000000000 +0000 @@ -2571,6 +2571,10 @@ Primary Group + + Storage Controller (VirtioSCSI) + + UIApplianceImportEditorWidget @@ -3859,7 +3863,7 @@ Starting GuestSessionStatus - Spouští se + Spouští se Starting @@ -4053,8 +4057,8 @@ - Bridget Adapter - + Bridged Adapter + Síťový most Internal Network @@ -4627,6 +4631,50 @@ NetworkAttachmentType + + Undefined + GuestSessionStatus + + + + Started + GuestSessionStatus + + + + Terminating + GuestSessionStatus + + + + Terminated + GuestSessionStatus + + + + Timed Out (Killed) + GuestSessionStatus + + + + Timed Out (Abnormally) + GuestSessionStatus + + + + Down + GuestSessionStatus + + + + Error + GuestSessionStatus + + + + Cloud Network + + UICustomFileSystemModel @@ -6497,6 +6545,14 @@ No Guest Session found!<br>Please use the Session Panel to start a new guest session + + Close dialog without saving + + + + Reset Changes (%1) + + UIFilePathSelector @@ -13003,10 +13059,6 @@ - The hardware virtualization is enabled in the Acceleration section of the System page although it is not supported by the host system. It should be disabled in order to start the virtual system. - - - When checked, the nested hardware virtualization CPU feature will be exposed to the virtual machine. @@ -16113,18 +16165,6 @@ - Failed to open the medium with following ID: <nobr><b>%1</b></nobr>. - - - - Failed to acquire attachment parameter. - - - - Failed to acquire medium attribute. - - - Failed to create cloud machine. diff -Nru virtualbox-hwe-6.1.34-dfsg/src/VBox/Frontends/VirtualBox/nls/VirtualBox_da.ts virtualbox-hwe-6.1.38-dfsg/src/VBox/Frontends/VirtualBox/nls/VirtualBox_da.ts --- virtualbox-hwe-6.1.34-dfsg/src/VBox/Frontends/VirtualBox/nls/VirtualBox_da.ts 2022-03-22 23:44:34.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/src/VBox/Frontends/VirtualBox/nls/VirtualBox_da.ts 2022-09-01 13:27:58.000000000 +0000 @@ -2025,6 +2025,10 @@ Primary Group + + Storage Controller (VirtioSCSI) + + UIApplianceImportEditorWidget @@ -3225,7 +3229,7 @@ Starting GuestSessionStatus - Starter + Starter Starting @@ -3419,8 +3423,8 @@ NAT - Bridget Adapter - + Bridged Adapter + Netværksbro Internal Network @@ -3987,6 +3991,50 @@ NetworkAttachmentType + + Undefined + GuestSessionStatus + + + + Started + GuestSessionStatus + + + + Terminating + GuestSessionStatus + + + + Terminated + GuestSessionStatus + + + + Timed Out (Killed) + GuestSessionStatus + + + + Timed Out (Abnormally) + GuestSessionStatus + + + + Down + GuestSessionStatus + + + + Error + GuestSessionStatus + + + + Cloud Network + + UICustomFileSystemModel @@ -4929,6 +4977,14 @@ No Guest Session found!<br>Please use the Session Panel to start a new guest session + + Close dialog without saving + Luk dialog uden at gemme + + + Reset Changes (%1) + Nulstil ændringer (%1) + UIFilePathSelector @@ -8946,10 +9002,6 @@ - The hardware virtualization is enabled in the Acceleration section of the System page although it is not supported by the host system. It should be disabled in order to start the virtual system. - - - When checked, the nested hardware virtualization CPU feature will be exposed to the virtual machine. @@ -11009,18 +11061,6 @@ - Failed to open the medium with following ID: <nobr><b>%1</b></nobr>. - - - - Failed to acquire attachment parameter. - - - - Failed to acquire medium attribute. - - - Failed to create cloud machine. diff -Nru virtualbox-hwe-6.1.34-dfsg/src/VBox/Frontends/VirtualBox/nls/VirtualBox_de.ts virtualbox-hwe-6.1.38-dfsg/src/VBox/Frontends/VirtualBox/nls/VirtualBox_de.ts --- virtualbox-hwe-6.1.34-dfsg/src/VBox/Frontends/VirtualBox/nls/VirtualBox_de.ts 2022-03-22 23:44:34.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/src/VBox/Frontends/VirtualBox/nls/VirtualBox_de.ts 2022-09-01 13:27:58.000000000 +0000 @@ -2211,6 +2211,10 @@ Primary Group Primäre Gruppe + + Storage Controller (VirtioSCSI) + + UIApplianceImportEditorWidget @@ -3435,27 +3439,27 @@ Undefined GuestSessionStatus - Unbekannt + Unbekannt Starting GuestSessionStatus - wird gestartet + wird gestartet Started GuestSessionStatus - gestartet + gestartet Terminating GuestSessionStatus - wird beendet + wird beendet Terminated GuestSessionStatus - beendet + beendet TimedOutKilled @@ -3470,12 +3474,12 @@ Down GuestSessionStatus - beendet (down) + beendet (down) Error GuestSessionStatus - fehler + fehler Undefined @@ -3719,7 +3723,7 @@ NAT - Bridget Adapter + Bridged Adapter Netzwerkbrücke @@ -4287,6 +4291,20 @@ NetworkAttachmentType + + Timed Out (Killed) + GuestSessionStatus + + + + Timed Out (Abnormally) + GuestSessionStatus + + + + Cloud Network + Cloud-Netzwerk + UICustomFileSystemModel @@ -5290,6 +5308,14 @@ No Guest Session found!<br>Please use the Session Panel to start a new guest session Keine Gastsitzung vorhanden!<br>Bitte das Session-Panel nutzen um eine neue Gastsitzung zu starten + + Close dialog without saving + Dialog schließen, ohne die Änderungen zu sichern + + + Reset Changes (%1) + Änderungen verwerfen (%1) + UIFilePathSelector @@ -9900,7 +9926,7 @@ The hardware virtualization is enabled in the Acceleration section of the System page although it is not supported by the host system. It should be disabled in order to start the virtual system. - Die Hardware-Virtualisierung ist in den Systemeinstallungen aktiviert, obwohl dies vom Host-System nicht unterstützt wird. Deshalb sollte diese deaktiviert werden um ein virtuellen System starten zu können. + Die Hardware-Virtualisierung ist in den Systemeinstallungen aktiviert, obwohl dies vom Host-System nicht unterstützt wird. Deshalb sollte diese deaktiviert werden um ein virtuellen System starten zu können. %1 CPU @@ -12132,15 +12158,15 @@ Failed to open the medium with following ID: <nobr><b>%1</b></nobr>. - Das Medium konnte nicht mit folgender ID geöffnet werden: <nobr><b>%1</b></nobr>. + Das Medium konnte nicht mit folgender ID geöffnet werden: <nobr><b>%1</b></nobr>. Failed to acquire attachment parameter. - Der Parameter für die Anlage konnte nicht erfasst werden. + Der Parameter für die Anlage konnte nicht erfasst werden. Failed to acquire medium attribute. - Der Parameter für das Medium konnte nicht erfasst werden. + Der Parameter für das Medium konnte nicht erfasst werden. Failed to create cloud machine. @@ -17129,7 +17155,7 @@ nicht angeschlossen - Bridget Adapter + Bridged Adapter Netzwerkbrücke diff -Nru virtualbox-hwe-6.1.34-dfsg/src/VBox/Frontends/VirtualBox/nls/VirtualBox_el.ts virtualbox-hwe-6.1.38-dfsg/src/VBox/Frontends/VirtualBox/nls/VirtualBox_el.ts --- virtualbox-hwe-6.1.34-dfsg/src/VBox/Frontends/VirtualBox/nls/VirtualBox_el.ts 2022-03-22 23:44:34.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/src/VBox/Frontends/VirtualBox/nls/VirtualBox_el.ts 2022-09-01 13:27:58.000000000 +0000 @@ -2241,6 +2241,10 @@ Primary Group Πρωτογενής Ομάδα + + Storage Controller (VirtioSCSI) + + UIApplianceImportEditorWidget @@ -3460,7 +3464,7 @@ Starting GuestSessionStatus - Ξεκινάει + Ξεκινάει Starting @@ -3654,7 +3658,7 @@ NAT - Bridget Adapter + Bridged Adapter Γεφυρωμένη Κάρτα @@ -4222,6 +4226,50 @@ NetworkAttachmentType + + Undefined + GuestSessionStatus + + + + Started + GuestSessionStatus + + + + Terminating + GuestSessionStatus + + + + Terminated + GuestSessionStatus + + + + Timed Out (Killed) + GuestSessionStatus + + + + Timed Out (Abnormally) + GuestSessionStatus + + + + Down + GuestSessionStatus + + + + Error + GuestSessionStatus + + + + Cloud Network + + UICustomFileSystemModel @@ -5195,6 +5243,14 @@ No Guest Session found!<br>Please use the Session Panel to start a new guest session + + Close dialog without saving + Κλείσιμο διαλόγου χωρίς σώσιμο + + + Reset Changes (%1) + Επαναφορά Αλλαγών (%1) + UIFilePathSelector @@ -9841,7 +9897,7 @@ The hardware virtualization is enabled in the Acceleration section of the System page although it is not supported by the host system. It should be disabled in order to start the virtual system. - Η εικονοποίηση του εξοπλισμού είναι ενεργοποιημένη στην κατηγορία Επιτάχυνση της σελίδας Συστήματος, παρ' όλο που δεν υποστηρίζεται από τον οικοδεσπότη. Θα πρέπει να απενενεργοποιηθεί για να αρχίσετε το εικονικό σύστημα. + Η εικονοποίηση του εξοπλισμού είναι ενεργοποιημένη στην κατηγορία Επιτάχυνση της σελίδας Συστήματος, παρ' όλο που δεν υποστηρίζεται από τον οικοδεσπότη. Θα πρέπει να απενενεργοποιηθεί για να αρχίσετε το εικονικό σύστημα. When checked, the nested hardware virtualization CPU feature will be exposed to the virtual machine. @@ -12050,18 +12106,6 @@ - Failed to open the medium with following ID: <nobr><b>%1</b></nobr>. - - - - Failed to acquire attachment parameter. - - - - Failed to acquire medium attribute. - - - Failed to create cloud machine. @@ -17227,7 +17271,7 @@ NAT - Bridget Adapter + Bridged Adapter Γεφυρωμένη Κάρτα diff -Nru virtualbox-hwe-6.1.34-dfsg/src/VBox/Frontends/VirtualBox/nls/VirtualBox_es.ts virtualbox-hwe-6.1.38-dfsg/src/VBox/Frontends/VirtualBox/nls/VirtualBox_es.ts --- virtualbox-hwe-6.1.34-dfsg/src/VBox/Frontends/VirtualBox/nls/VirtualBox_es.ts 2022-03-22 23:44:34.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/src/VBox/Frontends/VirtualBox/nls/VirtualBox_es.ts 2022-09-01 13:27:58.000000000 +0000 @@ -2890,6 +2890,10 @@ Primary Group Grupo primario + + Storage Controller (VirtioSCSI) + + UIApplianceImportEditorWidget @@ -4286,27 +4290,27 @@ Undefined GuestSessionStatus - Indefinido + Indefinido Starting GuestSessionStatus - Iniciando + Iniciando Started GuestSessionStatus - Iniciada + Iniciada Terminating GuestSessionStatus - Terminando + Terminando Terminated GuestSessionStatus - Terminada + Terminada TimedOutKilled @@ -4321,12 +4325,12 @@ Down GuestSessionStatus - Parada + Parada Error GuestSessionStatus - Error + Error Undefined @@ -4570,7 +4574,7 @@ NAT - Bridget Adapter + Bridged Adapter Adaptador puente @@ -5138,6 +5142,20 @@ NetworkAttachmentType + + Timed Out (Killed) + GuestSessionStatus + + + + Timed Out (Abnormally) + GuestSessionStatus + + + + Cloud Network + Red en la nube + UICustomFileSystemModel @@ -7070,6 +7088,14 @@ No Guest Session found!<br>Please use the Session Panel to start a new guest session + + Close dialog without saving + Cerrar diálogo sin guardar + + + Reset Changes (%1) + Restaurar cambios (%1) + UIFilePathSelector @@ -13966,7 +13992,7 @@ The hardware virtualization is enabled in the Acceleration section of the System page although it is not supported by the host system. It should be disabled in order to start the virtual system. - El hardware de virtualización está habilitado en la sección Aceleración de la página Sistema aunque no está soportado por el sistema anfitrión. Debería ser deshabilitado para iniciar la máquina virtual. + El hardware de virtualización está habilitado en la sección Aceleración de la página Sistema aunque no está soportado por el sistema anfitrión. Debería ser deshabilitado para iniciar la máquina virtual. When checked, the nested hardware virtualization CPU feature will be exposed to the virtual machine. @@ -17280,15 +17306,15 @@ Failed to open the medium with following ID: <nobr><b>%1</b></nobr>. - Fallo al abrir el medio con el siguiente ID: <nobr><b>%1</b></nobr>. + Fallo al abrir el medio con el siguiente ID: <nobr><b>%1</b></nobr>. Failed to acquire attachment parameter. - Fallo al obtener parámetro de conexión. + Fallo al obtener parámetro de conexión. Failed to acquire medium attribute. - Fallo al obtener atributo de medio. + Fallo al obtener atributo de medio. Failed to create cloud machine. @@ -25969,7 +25995,7 @@ NAT - Bridget Adapter + Bridged Adapter Adaptador puente diff -Nru virtualbox-hwe-6.1.34-dfsg/src/VBox/Frontends/VirtualBox/nls/VirtualBox_eu.ts virtualbox-hwe-6.1.38-dfsg/src/VBox/Frontends/VirtualBox/nls/VirtualBox_eu.ts --- virtualbox-hwe-6.1.34-dfsg/src/VBox/Frontends/VirtualBox/nls/VirtualBox_eu.ts 2022-03-22 23:44:34.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/src/VBox/Frontends/VirtualBox/nls/VirtualBox_eu.ts 2022-09-01 13:27:58.000000000 +0000 @@ -37,7 +37,7 @@ QApplication - + Executable <b>%1</b> requires Qt %2.x, found Qt %3. Exekutagarria <b>%1</b> behar du Qt %2.x, aurkituta Qt %3. @@ -57,7 +57,7 @@ <html><b>%1 (rc=%2)</b><br/><br/> - + The VirtualBox Linux kernel driver is either not loaded or not set up correctly. Please try setting it up again by executing<br/><br/> <font color=blue>'/sbin/vboxconfig'</font><br/><br/>as root.<br/><br/>If your system has EFI Secure Boot enabled you may also need to sign the kernel modules (vboxdrv, vboxnetflt, vboxnetadp, vboxpci) before you can load them. Please see your Linux system's documentation for more information. @@ -77,7 +77,7 @@ Zihurtu kernel moduloa ongi gertatu dela. - + VirtualBox - Runtime Error VirtualBox - Jarduera Akatsa @@ -97,7 +97,7 @@ Kernel gidagailua ez dago eskuragarri - + 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. VirtualBox kernel moduloak ez datoz bat VirtualBox-en bertsio honekin. VirtualBox-en ezarpenak dirudienez ez da ongi egin. Mesedez saiatu osorik kentzen eta VirtualBox berriro ezartzen. @@ -180,7 +180,7 @@ QIMessageBox - + OK Ongi @@ -2633,7 +2633,7 @@ Aurreikuspen Monitorea %1 - + &Connect Network Adapter &Elkarketatu Sare Egokitzailea @@ -2740,12 +2740,12 @@ - + Description Azalpena - + License Baimena @@ -2781,6 +2781,11 @@ + Storage Controller (VirtioSCSI) + + + + Storage Controller (SAS) Biltegiratze Kontrolatzailea (SAS) @@ -2852,12 +2857,12 @@ <b>Jatorrizko Balioa:</b> %1 - + Configuration Itxurapena - + Detailed list of all components of all virtual machines of the current appliance @@ -2950,7 +2955,7 @@ UIApplianceModelItem - + %1 col.1 text %1% {1?} @@ -3384,8 +3389,8 @@ UICommon - - + + @@ -3485,7 +3490,7 @@ Prozesagailuak - + Powered Off MachineState Itzalita @@ -4384,9 +4389,67 @@ TCP + + + Undefined + GuestSessionStatus + + + + + Starting GuestSessionStatus - Abiatzen + Abiatzen + + + + + Started + GuestSessionStatus + + + + + + Terminating + GuestSessionStatus + + + + + + Terminated + GuestSessionStatus + + + + + + Timed Out (Killed) + GuestSessionStatus + + + + + + Timed Out (Abnormally) + GuestSessionStatus + + + + + + Down + GuestSessionStatus + + + + + + Error + GuestSessionStatus + Starting @@ -4638,12 +4701,12 @@ - + Controller Kontrolatzailea - + Input/Output @@ -4660,8 +4723,8 @@ - Bridget Adapter - + Bridged Adapter + Zubi Egokitzailea @@ -4684,7 +4747,12 @@ NAT Sarea - + + Cloud Network + + + + Disconnected serial port Etenda @@ -5128,7 +5196,7 @@ Agiri guztiak (*) - + Unknown device USB device details Gailu ezezaguna @@ -5206,7 +5274,7 @@ <nobr>Egoera: %1</nobr> - + User-defined serial port Erabiltzaileak-zehaztuta @@ -6311,7 +6379,7 @@ UIDetailsSet - + Contains the details of virtual machine '%1' @@ -6420,7 +6488,7 @@ UIErrorString - + Result&nbsp;Code: error info Emaitz&nbsp;Kodea: @@ -6517,11 +6585,21 @@ - + Close Itxi + + Close dialog without saving + + + + + Reset Changes (%1) + + + Clear @@ -6723,12 +6801,12 @@ - + Guest File System - + <b>Size:</b> %1 bytes @@ -7651,7 +7729,7 @@ Hedapen pakete agiriak (%1) - + Extensions Hedapenak @@ -10451,7 +10529,7 @@ Sostengu gabeko gailuak elkartuta hostalari PG-ra - + Select a filename for the screenshot ... Hautatu ikusleiho-argazkiarentzako agirizen bat... @@ -12111,7 +12189,7 @@ - + Choose/Create a disk image... @@ -12513,7 +12591,7 @@ Hautatu diska irudia... - + Remove disk from virtual drive Kendu diska gidagailu birtualetik @@ -12642,7 +12720,7 @@ %1 MB - + %1 CPU %1 is 1 for now %1 CPU @@ -12660,7 +12738,7 @@ %1% - + 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. Egintza zergaitiengaitik, makina birtualera erantsitako CPU birtual zenbatekoa ezin da hostalariko CPU fisikoak (<b>%1</b> baino bi aldiz gehiago izan. Mesedez murriztu CPU birtual zenbatekoa. @@ -12715,12 +12793,7 @@ - - The hardware virtualization is enabled in the Acceleration section of the System page although it is not supported by the host system. It should be disabled in order to start the virtual system. - - - - + The hardware virtualization is not currently enabled in the Acceleration section of the System page. This is needed for nested paging support. It will be enabled automatically if you confirm your changes. @@ -13543,7 +13616,7 @@ -- - + Removing medium ... @@ -13771,12 +13844,12 @@ UIMediumSelector - + Medium - + &Add... &Gehitu... @@ -13822,24 +13895,24 @@ - + Cancel Ezeztatu - - + + Leave Empty - - + + Choose - + Name Izena @@ -13854,7 +13927,7 @@ Oraingo Neurria - + Expand All @@ -13967,42 +14040,42 @@ UIMessageCenter - - + + VirtualBox - Information msg box title VirtualBox - Argibideak - - + + VirtualBox - Question msg box title VirtualBox - Galdera - - + + VirtualBox - Warning msg box title VirtualBox - Ohartarazpena - - + + VirtualBox - Error msg box title VirtualBox - Akatsa - - + + VirtualBox - Critical Error msg box title VirtualBox - Akats Larria - + <p>Failed to create the VirtualBoxClient COM object.</p><p>The application will now terminate.</p> <p>Hutsegitea VirtualBox COM objetua sortzerakoan.</p><p>Orain aplikazioak amaitu egingo du.</p> @@ -14154,7 +14227,7 @@ <p>Ezinezkoa <nobr><b>%1</b></nobr> diskete birtuala <b>%2</b> makinatik ateratzea.</p> - + <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> 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). @@ -14325,7 +14398,7 @@ Ez erakutsi mezu hau berriro - + Failed to open <tt>%1</tt>. Make sure your desktop environment can properly handle URLs of this type. Hutsegitea <tt>%1</tt> irekitzerakoan. Zihurtatu zure mahaigin inguruak mota honetako URL-ak egoki kudeatu ditzakeela. @@ -14349,7 +14422,7 @@ Hutsegitea USB azpisistemara sartzerakoan. - + Failed to create a new virtual machine. Hutsegitea makina birtual berri bat sortzerakoan. @@ -14368,7 +14441,7 @@ Hutsegitea <b>%1</b> makina birtuala abiarazterakoan. - + Failed to pause the execution of the virtual machine <b>%1</b>. Hutsegitea <b>%1</b> makina birtualaren exekuzioa pausatzerakoan. @@ -14423,13 +14496,13 @@ Hutsegitea <b>%1</b> makina birtualerako saio bat irekitzerakoan. - + Failed to remove the host network interface <b>%1</b>. Hutsegitea <b>%1</b> hostalari sare interfazea kentzerakoan. - + <p>Are you sure you want to delete the optical drive?</p><p>You will not be able to insert any optical disks or ISO images or install the Guest Additions without it!</p> <p>Zihur zaude gailu optikoa ezabatzea nahi duzula?</p><p>Ezingo duzu diska optikorik edo ISO irudirik txertatu edo Gonbidatu Gehigarririk ezarri bera gabe!</p> @@ -14595,21 +14668,6 @@ - Failed to open the medium with following ID: <nobr><b>%1</b></nobr>. - - - - - Failed to acquire attachment parameter. - - - - - Failed to acquire medium attribute. - - - - Failed to close the disk image file <nobr><b>%1</b></nobr>. Hutsegitea <nobr><b>%1</b></nobr> diska irudi agiria isterakoan. @@ -15022,7 +15080,7 @@ Hutsegitea <nobr><b>%1</b></nobr> baimen agiria irekitzerakoan. Egiaztatu agiri baimenak. - + Failed to send the ACPI Power Button press event to the virtual machine <b>%1</b>. Hutsegitea ACPI Indar Botoi sakatze gertaera <b>%1</b> makina birtualera bildatzerakoan. @@ -15065,7 +15123,7 @@ Osatu - + <p>The host key is currently defined as <b>%1</b>.</p> additional message box paragraph @@ -15078,7 +15136,7 @@ Harpena - + Check inaccessible media message box Egiaztatu @@ -15100,7 +15158,7 @@ Berrezarri - + Continue no hard disk attached Jarraitu @@ -15142,7 +15200,7 @@ <p>VirtualBox bertsio berri bat argitaratu da! <b>%1</b> bertsioa eskuragari dago hemen, <a href="https://www.virtualbox.org/">virtualbox.org</a>.</p><p>Bertsioa hau hurrengo lotura erabiliz jeitsi dezakezu:</p><p><a href=%2>%3</a></p> - + Release detach medium @@ -15159,12 +15217,12 @@ Kendu - + <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> <p>Jadanik badago <b>%1</b> diska gogor biltegi unitate kokalekua. Ezin duzu diska gogor birtual berri bat sortu kokaleku hau erabiliz jadanik beste diska gogor birtual batek erabili ahal dezakeelako.</p><p>Mesedez adierazi beste kokaleku bat.</p> - + Delete hard disk storage Ezabatu @@ -15182,7 +15240,7 @@ Hutsegitea <b>%1</b> diska gogorreko biltegiratze unitatea ezabatzerakoan. - + Failed to create the hard disk storage <nobr><b>%1</b>.</nobr> @@ -15211,7 +15269,7 @@ Jadanik badaude hurrengo agiriak:<br /><br />%1<br /><br />Zihur zaude ordeztea nahi dituzula? Hauek ordezteak beren edukiak gainidaztea eragingo du. - + You are running a prerelease version of VirtualBox. This version is not suitable for production use. VirtualBox aurreargitalpen bertsio bat ari zara erabiltzen. Bertsio hau ez da ekoizpen erabilpenerako. @@ -15221,7 +15279,7 @@ Gonbidatua ACPI indar botoiarekin itzaltzen saiatzen ari zara. Hau oraingoz ezinezkoa da gonbidatuak ez duelako software itzalketa sostengatzen. - + <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> <p>VT-x/AMD-V hardware bizkorpena gaitu egin da, baina ez dago eraginkor. Zure 64-biteko gonbidatuak huts egingo du 64-bit CPU bat atzematerakoan eta ez da abiatzeko gai izango.</p><p>Mesedez zihurtatu VT-x/AMD-V egoki gaituta duzula zure hostalari ordenagailuaren BIOS-ean.</p> @@ -15244,7 +15302,7 @@ Jarraitu - + Cancel @@ -15259,7 +15317,7 @@ Hutsegitea makina birtuala irekitzerakoan. - + Failed to open/interpret appliance <b>%1</b>. Hutsegitea <b>%1</b> gailua ireki/interpretatzerakoan. @@ -15324,7 +15382,7 @@ Hutsegitea agiria kentzerakoan. - + 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. Dirudienez USBFS agiri-sistema duzu muntatuta honela: /sys/bus/usb/drivers. Hau aldatzea gomendatzen dizugu, zure sistemaren itxurapen-oker larria denez eta USB gailuek ustekabeko moduan huts egitea eragin dezakeelako. @@ -15360,14 +15418,14 @@ - + Ignore Ezikusi - + Restore Leheneratu @@ -15444,7 +15502,7 @@ &Kendu - + <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. <p>VT-x/AMD-V hardware bizkorpena ez dago eskuragarri zure sisteman. Zure 64-biteko gonbidatuak huts egin du 64-bit CPU-a atzematean eta ezingo da abiarazi. @@ -15476,7 +15534,7 @@ <p>VirtualBox Erabiltzaile Eskuliburua ongi jeitsi da hemendik, <nobr><a href="%1">%2</a></nobr>baina ezin da tokian gorde honela <nobr><b>%3</b>.</nobr></p><p>Mesedez hautatu beste kokaleku bat agiriarentzat.</p> - + Failed to open virtual machine located in %1. Hutsegitea %1 kokalekuan dagoen makina birtuala irekitzerakoan. @@ -15499,7 +15557,7 @@ - + Remove Kendu @@ -15533,12 +15591,12 @@ <p>Diskete gehitzear zaude <b>%1</b> kontrolatzailera.</p><p>Diskete birtual bat hautatzea nahi duzu diskan jartzeko edo oraingoz hutsik uztea nahi duzu?</p> - + Failed to detach the hard disk (<nobr><b>%1</b></nobr>) from the slot <i>%2</i> of the machine <b>%3</b>. Hutsegitea (<nobr><b>%1</b></nobr>) diska gogorra <b>%3</b> makinaren <i>%2</i> eslotetik deseranstearakoan. - + Failed to install the Extension Pack <b>%1</b>. Hutsegitea <b>%1</b> Hedapen Paketea ezartzerakoan. @@ -15555,7 +15613,7 @@ &Kendu - + The current port forwarding rules are not valid. None of the host or guest port values may be set to zero. Oraingo berbidalketa ataka arauak ez dira baliozkoak. Hostalari edo gonbidatu ataka balioetako bat ere ezin daiteke hutsean ezarri. @@ -15576,7 +15634,7 @@ <p>Ohartu medio honen biltegi unitatea ez dela ezabatuko eta berriro erabili ahal izango dela geroago.</p> - + <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> <p>Makina birtualaren leihoa orain <b>Irudizkoa</b> modura aldatuko da. Leihotu modura itzuli zaitezke <b>%1</b> sakatuz.</p><p>Ohartu <i>Host</i> tekla <b>%2</b> bezala zehaztua dagoela.</p><p>Ohartu ere menu barra nagusia ezkutatu egiten dela irudizko moduan. Bertara <b>Host+Home</b> sakatuz sartu zaitezke.</p> @@ -15652,7 +15710,7 @@ <b>%1</b> makina birtutala erregistratzerakoan. - + <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> <p>Makinaren ezarpenak aldatu egin dira editatzen zenituen bitartean. Une honetan gordegabeko ezarpen aldaketak dituzu.</p><p>Aldatutako ezarpenak birgertatzea edo zeure aldaketei heustea nahi duzu?</p> @@ -15672,13 +15730,13 @@ Aldatzen ari zaren makina birtuala abiarazi egin da. Zenbait ezarpen bakarrik aldatu daitezke makina ekinean dagoela. Beste aldaketa guztiak galdu egingo dira leiho hau orain isten baduzu. - + Failed to clone the virtual machine <b>%1</b>. Hutsegitea <b>%1</b> makina birtuala klonatzerakoan. - + Create a snapshot of the current machine state Sortu makinaren oraingo egoeraren berehalako bat @@ -15687,7 +15745,7 @@ Barkatu, zenbati akats generiko gertatu dira. - + Could not load the Host USB Proxy Service (VERR_FILE_NOT_FOUND). The service might not be installed on the host computer Ezin da Hostalari USB Proxy Zerbitzua gertatu (VERR_FILE_NOT_FOUND). Badaiteke zerbitzua hostalari ordenagailuan ezarrita ez egotea @@ -15712,7 +15770,7 @@ Ezin da Hostalari USB Proxy zerbitzua gertatu - + Can't find snapshot named <b>%1</b>. Ezin da<b>%1</b> izeneko berehalakoa aurkitu. @@ -15721,7 +15779,7 @@ <p>Hutsegitea jeitsitako agiria gordetzerakoan,<nobr><b>%1</b>.</nobr></p> - + <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> <p><b><nobr>%2</nobr></b>-ren bertsio zahar bat (%1) duzu ezarrita.</p><p>Nahi duzu azkenengoa Internetetik jeistea?</p> @@ -15763,7 +15821,7 @@ Ongi - + <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> <p>Hutsegitea COM abiarazterakoan <b><nobr>%1</nobr></b> VirtualBox-en itxurapen orokorraren zuzenbidea ez dagoelako eskuragarri. Mesedez egiaztatu zuzenbide honen eta bere gaineko zuzenbidearen baimenak.</p><p>Aplikazioak orain amaitu egingo du.</p> @@ -15788,12 +15846,12 @@ <p>Hurrengo makina birtualak kentzear zaude makina zerrendatik:</p><p>%1</p><p>Makina birtuala duten agiriak zure diska gogorretik ere ezabatzea nahi dituzu?</p> - + Do you wish to cancel all current network operations? Une honetako sare eragiketa guztiak ezeztatzea nahi duzu? - + ACPI Shutdown machine ACPI Itzalketa @@ -15805,7 +15863,7 @@ Itzali - + <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> <p>Ezin da <nobr><b>%1</b> makina agiritegia kendu.</nobr></p><p>Mesedez egiaztatu agiritegi hau egitan dagoela eta kentzeko baimena duzula.</p> @@ -15815,7 +15873,7 @@ <p>Ezin da<b>%1</b> makina agiritegia sortu <nobr><b>%2</b> gaineko agiritegian.</nobr></p><p>Agiritegi hau jadanik badago eta zihurrenik beste makina batena da.</p> - + <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> <p>Zihur zaude hurrengo makina birtualen gordetako egoera baztertzea nahi duzula?</p><p><b>%1</b></p><p>Eragiketa hau gonbidatu SE-ren itzaltze egoki bat egin gabe makina itzaltzea edo berrezartzearen baliokidea da.</p> @@ -15865,7 +15923,7 @@ Hutsegitea <b>%1</b> makina birtualaren taldeak ezartzerakoan. - + <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> <p>Ezin da <b>%1</b> makina abiarazi hurrengo sare interfaze fisikoak ez direlako aurkitu:</p><p><b>%2</b></p><p>Makinaren sare ezarpenak aldatu edo makina gelditu dezakezu.</p> @@ -18214,7 +18272,7 @@ Gorde VirtualBox Oharra Honela - + <p><b>No machine</b> is currently selected or the selected machine is not valid. Please select a Virtual Machine to see its logs @@ -18528,7 +18586,7 @@ UIWelcomePane - + <h3>Welcome to VirtualBox!</h3><p>The left part of application window contains global tools and lists all virtual machines and virtual machine groups on your computer. You can import, add and create new VMs using corresponding toolbar buttons. You can popup a tools of currently selected element using corresponding element button.</p><p>You can press the <b>%1</b> key to get instant help, or visit <a href=https://www.virtualbox.org>www.virtualbox.org</a> for more information and latest news.</p> @@ -19446,7 +19504,7 @@ Hasi - + <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 using the Devices menu.</p> <p>Mesedez hautatu zure makina birtual berria bertatik abiarazteko diska optiko birtual agiri bat edo diska duen gidagailu optiko fisiko bat.</p><p>Diska bertatik ordenagailu bat abiarazteko bezala egon behar da eta makina birtualean ezartzea nahi duzun sistema eragilea eduki behar du orain egitea nahi baduzu. Diska gidagailu birtualetik berezgaitasunez aterako da makina birtuala itzaltzen duzun hurrengoan, baina hau zeuk ere egin dezakezu beharrezkoa bada Gailuak menua erabiliz.</p> @@ -19514,7 +19572,7 @@ - + Local File System @@ -19899,7 +19957,7 @@ Sortu - + Name and operating system Izena eta sistema eragilea diff -Nru virtualbox-hwe-6.1.34-dfsg/src/VBox/Frontends/VirtualBox/nls/VirtualBox_fa.ts virtualbox-hwe-6.1.38-dfsg/src/VBox/Frontends/VirtualBox/nls/VirtualBox_fa.ts --- virtualbox-hwe-6.1.34-dfsg/src/VBox/Frontends/VirtualBox/nls/VirtualBox_fa.ts 2022-03-22 23:44:34.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/src/VBox/Frontends/VirtualBox/nls/VirtualBox_fa.ts 2022-09-01 13:27:58.000000000 +0000 @@ -2412,6 +2412,10 @@ Primary Group + + Storage Controller (VirtioSCSI) + + UIApplianceImportEditorWidget @@ -3609,7 +3613,7 @@ Starting GuestSessionStatus - درحال شروع + درحال شروع Starting @@ -3803,8 +3807,8 @@ NAT - Bridget Adapter - + Bridged Adapter + آداپتور پل شده Internal Network @@ -4365,6 +4369,50 @@ NetworkAttachmentType + + Undefined + GuestSessionStatus + + + + Started + GuestSessionStatus + + + + Terminating + GuestSessionStatus + + + + Terminated + GuestSessionStatus + + + + Timed Out (Killed) + GuestSessionStatus + + + + Timed Out (Abnormally) + GuestSessionStatus + + + + Down + GuestSessionStatus + + + + Error + GuestSessionStatus + + + + Cloud Network + + UICustomFileSystemModel @@ -5621,6 +5669,14 @@ No Guest Session found!<br>Please use the Session Panel to start a new guest session + + Close dialog without saving + بستن پنجره بدون ذخیره سازی + + + Reset Changes (%1) + ریست تغییرات (%1) + UIFilePathSelector @@ -11273,10 +11329,6 @@ - The hardware virtualization is enabled in the Acceleration section of the System page although it is not supported by the host system. It should be disabled in order to start the virtual system. - - - When checked, the nested hardware virtualization CPU feature will be exposed to the virtual machine. @@ -13957,18 +14009,6 @@ - Failed to open the medium with following ID: <nobr><b>%1</b></nobr>. - - - - Failed to acquire attachment parameter. - - - - Failed to acquire medium attribute. - - - Failed to create cloud machine. diff -Nru virtualbox-hwe-6.1.34-dfsg/src/VBox/Frontends/VirtualBox/nls/VirtualBox_fi.ts virtualbox-hwe-6.1.38-dfsg/src/VBox/Frontends/VirtualBox/nls/VirtualBox_fi.ts --- virtualbox-hwe-6.1.34-dfsg/src/VBox/Frontends/VirtualBox/nls/VirtualBox_fi.ts 2022-03-22 23:44:34.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/src/VBox/Frontends/VirtualBox/nls/VirtualBox_fi.ts 2022-09-01 13:27:58.000000000 +0000 @@ -2215,6 +2215,10 @@ Primary Group + + Storage Controller (VirtioSCSI) + + UIApplianceImportEditorWidget @@ -3389,7 +3393,7 @@ Starting GuestSessionStatus - Käynnistetään + Käynnistetään Starting @@ -3583,7 +3587,7 @@ NAT - Bridget Adapter + Bridged Adapter @@ -4151,6 +4155,50 @@ NetworkAttachmentType + + Undefined + GuestSessionStatus + + + + Started + GuestSessionStatus + + + + Terminating + GuestSessionStatus + + + + Terminated + GuestSessionStatus + + + + Timed Out (Killed) + GuestSessionStatus + + + + Timed Out (Abnormally) + GuestSessionStatus + + + + Down + GuestSessionStatus + + + + Error + GuestSessionStatus + + + + Cloud Network + + UICustomFileSystemModel @@ -5606,6 +5654,14 @@ No Guest Session found!<br>Please use the Session Panel to start a new guest session + + Close dialog without saving + + + + Reset Changes (%1) + + UIFilePathSelector @@ -10653,10 +10709,6 @@ - The hardware virtualization is enabled in the Acceleration section of the System page although it is not supported by the host system. It should be disabled in order to start the virtual system. - - - %1 CPU %1 is 1 for now @@ -13187,18 +13239,6 @@ - Failed to open the medium with following ID: <nobr><b>%1</b></nobr>. - - - - Failed to acquire attachment parameter. - - - - Failed to acquire medium attribute. - - - Failed to create cloud machine. diff -Nru virtualbox-hwe-6.1.34-dfsg/src/VBox/Frontends/VirtualBox/nls/VirtualBox_fr.ts virtualbox-hwe-6.1.38-dfsg/src/VBox/Frontends/VirtualBox/nls/VirtualBox_fr.ts --- virtualbox-hwe-6.1.34-dfsg/src/VBox/Frontends/VirtualBox/nls/VirtualBox_fr.ts 2022-03-22 23:44:34.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/src/VBox/Frontends/VirtualBox/nls/VirtualBox_fr.ts 2022-09-01 13:27:58.000000000 +0000 @@ -2750,6 +2750,10 @@ Primary Group Groupe primaire + + Storage Controller (VirtioSCSI) + + UIApplianceImportEditorWidget @@ -4101,7 +4105,7 @@ Starting GuestSessionStatus - Démarrage + Démarrage Starting @@ -4295,7 +4299,7 @@ NAT - Bridget Adapter + Bridged Adapter Interface pontée @@ -4863,6 +4867,50 @@ NetworkAttachmentType + + Undefined + GuestSessionStatus + + + + Started + GuestSessionStatus + + + + Terminating + GuestSessionStatus + + + + Terminated + GuestSessionStatus + + + + Timed Out (Killed) + GuestSessionStatus + + + + Timed Out (Abnormally) + GuestSessionStatus + + + + Down + GuestSessionStatus + + + + Error + GuestSessionStatus + + + + Cloud Network + + UICustomFileSystemModel @@ -6592,6 +6640,14 @@ No Guest Session found!<br>Please use the Session Panel to start a new guest session + + Close dialog without saving + Fermer le dialogue sans sauvegarder + + + Reset Changes (%1) + Réinitialiser les modifications (%1) + UIFilePathSelector @@ -12717,7 +12773,7 @@ The hardware virtualization is enabled in the Acceleration section of the System page although it is not supported by the host system. It should be disabled in order to start the virtual system. - La virtualisation matérielle est activée dans la section Accélération de la page Système bien qu'elle ne soit pas prise en charge par le système hôte. Elle doit être désactivée pour pouvoir démarrer le système virtuel. + La virtualisation matérielle est activée dans la section Accélération de la page Système bien qu'elle ne soit pas prise en charge par le système hôte. Elle doit être désactivée pour pouvoir démarrer le système virtuel. The hardware virtualization is not currently enabled in the Acceleration section of the System page. This is needed for nested paging support. It will be enabled automatically if you confirm your changes. @@ -15584,18 +15640,6 @@ - Failed to open the medium with following ID: <nobr><b>%1</b></nobr>. - - - - Failed to acquire attachment parameter. - - - - Failed to acquire medium attribute. - - - Failed to create cloud machine. @@ -22098,7 +22142,7 @@ NAT - Bridget Adapter + Bridged Adapter Misspelling in source text? Interface pontée diff -Nru virtualbox-hwe-6.1.34-dfsg/src/VBox/Frontends/VirtualBox/nls/VirtualBox_gl.ts virtualbox-hwe-6.1.38-dfsg/src/VBox/Frontends/VirtualBox/nls/VirtualBox_gl.ts --- virtualbox-hwe-6.1.34-dfsg/src/VBox/Frontends/VirtualBox/nls/VirtualBox_gl.ts 2022-03-22 23:44:34.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/src/VBox/Frontends/VirtualBox/nls/VirtualBox_gl.ts 2022-09-01 13:27:58.000000000 +0000 @@ -2189,6 +2189,10 @@ Primary Group + + Storage Controller (VirtioSCSI) + + UIApplianceImportEditorWidget @@ -3363,7 +3367,7 @@ Starting GuestSessionStatus - Iniciando + Iniciando Starting @@ -3557,8 +3561,8 @@ NAT - Bridget Adapter - + Bridged Adapter + Adaptador ponte (bridged) Internal Network @@ -4125,6 +4129,50 @@ NetworkAttachmentType + + Undefined + GuestSessionStatus + + + + Started + GuestSessionStatus + + + + Terminating + GuestSessionStatus + + + + Terminated + GuestSessionStatus + + + + Timed Out (Killed) + GuestSessionStatus + + + + Timed Out (Abnormally) + GuestSessionStatus + + + + Down + GuestSessionStatus + + + + Error + GuestSessionStatus + + + + Cloud Network + + UICustomFileSystemModel @@ -5780,6 +5828,14 @@ No Guest Session found!<br>Please use the Session Panel to start a new guest session + + Close dialog without saving + + + + Reset Changes (%1) + + UIFilePathSelector @@ -10623,10 +10679,6 @@ - The hardware virtualization is enabled in the Acceleration section of the System page although it is not supported by the host system. It should be disabled in order to start the virtual system. - - - %1 CPU %1 is 1 for now @@ -13095,18 +13147,6 @@ - Failed to open the medium with following ID: <nobr><b>%1</b></nobr>. - - - - Failed to acquire attachment parameter. - - - - Failed to acquire medium attribute. - - - Failed to create cloud machine. diff -Nru virtualbox-hwe-6.1.34-dfsg/src/VBox/Frontends/VirtualBox/nls/VirtualBox_he.ts virtualbox-hwe-6.1.38-dfsg/src/VBox/Frontends/VirtualBox/nls/VirtualBox_he.ts --- virtualbox-hwe-6.1.34-dfsg/src/VBox/Frontends/VirtualBox/nls/VirtualBox_he.ts 2022-03-22 23:44:34.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/src/VBox/Frontends/VirtualBox/nls/VirtualBox_he.ts 2022-09-01 13:27:58.000000000 +0000 @@ -2075,6 +2075,10 @@ Primary Group + + Storage Controller (VirtioSCSI) + + UIApplianceImportEditorWidget @@ -3264,7 +3268,7 @@ Starting GuestSessionStatus - כעת מתחיל + כעת מתחיל Starting @@ -3458,7 +3462,7 @@ - Bridget Adapter + Bridged Adapter @@ -4026,6 +4030,50 @@ NetworkAttachmentType + + Undefined + GuestSessionStatus + + + + Started + GuestSessionStatus + + + + Terminating + GuestSessionStatus + + + + Terminated + GuestSessionStatus + + + + Timed Out (Killed) + GuestSessionStatus + + + + Timed Out (Abnormally) + GuestSessionStatus + + + + Down + GuestSessionStatus + + + + Error + GuestSessionStatus + + + + Cloud Network + + UICustomFileSystemModel @@ -4951,6 +4999,14 @@ No Guest Session found!<br>Please use the Session Panel to start a new guest session + + Close dialog without saving + + + + Reset Changes (%1) + + UIFilePathSelector @@ -8702,10 +8758,6 @@ - The hardware virtualization is enabled in the Acceleration section of the System page although it is not supported by the host system. It should be disabled in order to start the virtual system. - - - %1 CPU %1 is 1 for now @@ -10680,18 +10732,6 @@ - Failed to open the medium with following ID: <nobr><b>%1</b></nobr>. - - - - Failed to acquire attachment parameter. - - - - Failed to acquire medium attribute. - - - Failed to create cloud machine. diff -Nru virtualbox-hwe-6.1.34-dfsg/src/VBox/Frontends/VirtualBox/nls/VirtualBox_hr_HR.ts virtualbox-hwe-6.1.38-dfsg/src/VBox/Frontends/VirtualBox/nls/VirtualBox_hr_HR.ts --- virtualbox-hwe-6.1.34-dfsg/src/VBox/Frontends/VirtualBox/nls/VirtualBox_hr_HR.ts 2022-03-22 23:44:34.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/src/VBox/Frontends/VirtualBox/nls/VirtualBox_hr_HR.ts 2022-09-01 13:27:58.000000000 +0000 @@ -2051,6 +2051,10 @@ Primary Group + + Storage Controller (VirtioSCSI) + + UIApplianceImportEditorWidget @@ -3254,7 +3258,7 @@ Starting GuestSessionStatus - Pokrećem + Pokrećem Starting @@ -3448,8 +3452,8 @@ NAT - Bridget Adapter - + Bridged Adapter + Premošćen Adapter Internal Network @@ -4022,6 +4026,50 @@ NetworkAttachmentType + + Undefined + GuestSessionStatus + + + + Started + GuestSessionStatus + + + + Terminating + GuestSessionStatus + + + + Terminated + GuestSessionStatus + + + + Timed Out (Killed) + GuestSessionStatus + + + + Timed Out (Abnormally) + GuestSessionStatus + + + + Down + GuestSessionStatus + + + + Error + GuestSessionStatus + + + + Cloud Network + + UICustomFileSystemModel @@ -4955,6 +5003,14 @@ No Guest Session found!<br>Please use the Session Panel to start a new guest session + + Close dialog without saving + Zatvori dijalog bez spremanja + + + Reset Changes (%1) + Resetiraj Promjene (%1) + UIFilePathSelector @@ -9059,10 +9115,6 @@ - The hardware virtualization is enabled in the Acceleration section of the System page although it is not supported by the host system. It should be disabled in order to start the virtual system. - - - When checked, the nested hardware virtualization CPU feature will be exposed to the virtual machine. @@ -11183,18 +11235,6 @@ - Failed to open the medium with following ID: <nobr><b>%1</b></nobr>. - - - - Failed to acquire attachment parameter. - - - - Failed to acquire medium attribute. - - - Failed to create cloud machine. diff -Nru virtualbox-hwe-6.1.34-dfsg/src/VBox/Frontends/VirtualBox/nls/VirtualBox_hu.ts virtualbox-hwe-6.1.38-dfsg/src/VBox/Frontends/VirtualBox/nls/VirtualBox_hu.ts --- virtualbox-hwe-6.1.34-dfsg/src/VBox/Frontends/VirtualBox/nls/VirtualBox_hu.ts 2022-03-22 23:44:34.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/src/VBox/Frontends/VirtualBox/nls/VirtualBox_hu.ts 2022-09-01 13:27:58.000000000 +0000 @@ -2804,6 +2804,10 @@ Primary Group Elsődleges csoport + + Storage Controller (VirtioSCSI) + + UIApplianceImportEditorWidget @@ -4158,7 +4162,7 @@ Starting GuestSessionStatus - Indítás + Indítás Starting @@ -4347,7 +4351,7 @@ NAT - Bridget Adapter + Bridged Adapter Bridge-elt kártya @@ -4909,6 +4913,50 @@ NetworkAttachmentType + + Undefined + GuestSessionStatus + + + + Started + GuestSessionStatus + + + + Terminating + GuestSessionStatus + + + + Terminated + GuestSessionStatus + + + + Timed Out (Killed) + GuestSessionStatus + + + + Timed Out (Abnormally) + GuestSessionStatus + + + + Down + GuestSessionStatus + + + + Error + GuestSessionStatus + + + + Cloud Network + Felhő hálózat + UICustomFileSystemModel @@ -6811,6 +6859,14 @@ No Guest Session found!<br>Please use the Session Panel to start a new guest session Nem található vendég-munkamenet!<br>A Munkamenet panel használatával új vendég munkamenetet indíthatsz + + Close dialog without saving + Ablak bezárása mentés nélkül + + + Reset Changes (%1) + Módosítások visszaállítása (%1) + UIFilePathSelector @@ -13469,7 +13525,7 @@ The hardware virtualization is enabled in the Acceleration section of the System page although it is not supported by the host system. It should be disabled in order to start the virtual system. - A hardveres virtualizáció jelenleg be van kapcsolva a Rendszer lap Gyorsítás részében, azonban a gazda rendszer nem támogatja. Ki kellene kapcsolni a virtuális rendszer elindításához. + A hardveres virtualizáció jelenleg be van kapcsolva a Rendszer lap Gyorsítás részében, azonban a gazda rendszer nem támogatja. Ki kellene kapcsolni a virtuális rendszer elindításához. When checked, the nested hardware virtualization CPU feature will be exposed to the virtual machine. @@ -16451,15 +16507,15 @@ Failed to open the medium with following ID: <nobr><b>%1</b></nobr>. - A médium megnyitása sikertelen a következő azonosítóval: <nobr><b>%1</b></nobr>. + A médium megnyitása sikertelen a következő azonosítóval: <nobr><b>%1</b></nobr>. Failed to acquire attachment parameter. - A csatlakozási paraméterek lekérése sikertelen. + A csatlakozási paraméterek lekérése sikertelen. Failed to acquire medium attribute. - A médium attribútum lekérése sikertelen. + A médium attribútum lekérése sikertelen. Failed to create cloud machine. @@ -24575,7 +24631,7 @@ NAT - Bridget Adapter + Bridged Adapter Bridge-elt kártya diff -Nru virtualbox-hwe-6.1.34-dfsg/src/VBox/Frontends/VirtualBox/nls/VirtualBox_id.ts virtualbox-hwe-6.1.38-dfsg/src/VBox/Frontends/VirtualBox/nls/VirtualBox_id.ts --- virtualbox-hwe-6.1.34-dfsg/src/VBox/Frontends/VirtualBox/nls/VirtualBox_id.ts 2022-03-22 23:44:34.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/src/VBox/Frontends/VirtualBox/nls/VirtualBox_id.ts 2022-09-01 13:27:58.000000000 +0000 @@ -16,7 +16,7 @@ Oracle Corporation Comma-separated list of translators - David Yacobus <david_yacobus@yahoo.com>,Andika Triwidada <andika@gmail.com> + David Yacobus <david_yacobus@yahoo.com>, Andika Triwidada <andika@gmail.com> -- @@ -141,11 +141,11 @@ 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>'/sbin/rcvboxdrv 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 necessary. - Driver VirtualBox untuk kernel Linux (vboxdrv) mungkin tidak dimuat atau ada masalah izin dengan /dev/vboxdrv. Silakan pasang ulang modul kernel dengan menjalankan<br/><br/> <font color=blue>'/sbin/rcvboxdrv 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 diperlukan. + 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>'/sbin/rcvboxdrv 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 diperlukan. 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>'/sbin/vboxconfig'</font><br/><br/>as root. - Driver VirtualBox untuk kernel Linux (vboxdrv) mungkin tidak dimuat atau ada masalah izin dengan /dev/vboxdrv. Silakan pasang ulang modul kernel dengan menjalankan<br/><br/> <font color=blue>'/sbin/rcvboxdrv'</font><br/><br/>sebagai root. + 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>'/sbin/rcvboxdrv'</font><br/><br/>sebagai root. 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>'/sbin/vboxconfig'</font><br/><br/>may correct this. Make sure that you do not mix the OSE version and the PUEL version of VirtualBox. @@ -216,7 +216,7 @@ Could not locate the file on the server (response: %1) - Tidak dapat menemukan berkas tersebut pada server (respon: %1) + Tidak dapat menemukan file tersebut pada server (respon: %1) @@ -771,7 +771,7 @@ Show the VirtualBox Machine Definition file in Finder. - Menampilkan berkas Definisi Mesin VirtualBox di dalam Finder. + Menampilkan file Definisi Mesin VirtualBox di dalam Finder. Show in Explorer @@ -779,7 +779,7 @@ Show the VirtualBox Machine Definition file in Explorer. - Menampilkan berkas Definisi Mesin VirtualBox di dalam Explorer. + Menampilkan file Definisi Mesin VirtualBox di dalam Explorer. Show in File Manager @@ -835,7 +835,7 @@ Creates an Alias file to the VirtualBox Machine Definition file on your Desktop. - Buat berkas Alias ke berkas Definisi Mesin VirtualBox pada Desktop Anda. + Buat file Alias ke file Definisi Mesin VirtualBox pada Desktop Anda. Create Shortcut on Desktop @@ -843,7 +843,7 @@ Creates an Shortcut file to the VirtualBox Machine Definition file on your Desktop. - Buat berkas Pintasan ke berkas Definisi Mesin VirtualBox pada Desktop Anda. + Buat file Shortcut ke file Definisi Mesin VirtualBox pada Desktop Anda. &Close @@ -1114,7 +1114,7 @@ Allow remote desktop (RDP) connections to this machine - Izinkan koneksi remote desktop (RDP) ke mesin ini + Ijinkan koneksi remote desktop (RDP) ke mesin ini &Menu Bar @@ -2291,11 +2291,11 @@ Open Find Pane - Buka Panel Pencarian + Buka Panel Cari Open Filter Pane - Buka Panel Penyaring + Buka Panel Saring Open Bookmark Pane @@ -2387,7 +2387,7 @@ E&xport Locally... - E&kspor Secara Lokal... + E&kspor secara Lokal... Export selected virtual machine locally @@ -2395,11 +2395,11 @@ S&earch - &Cari + Car&i Search virtual machines with respect to a search term - Cari mesin virtual mengikuti istilah pencarian + Cari mesin virtual yang cocok dengan istilah pencarian Take Snapshot @@ -2423,7 +2423,7 @@ Add a disk image - Tambahkan suatu image disk + Tambah image disk Add Disk Image @@ -2431,7 +2431,7 @@ Create a new disk image - Ciptakan sebuah image disk baru + Buat image disk baru Create Disk Image @@ -2487,7 +2487,7 @@ Open Disk Image Search Pane - Buka Panel Pencarian Image Disk + Buka Panel Cari Image Disk Refresh the list of disk images @@ -2515,7 +2515,7 @@ Add Cloud Profile - Tambahkan Profil Cloud + Tambah Profil Cloud Import Cloud Profiles @@ -2535,11 +2535,11 @@ &Soft Keyboard... - &Papan Ketik Perangkat Lunak... + Papan &Ketik Peranti Lunak... Display soft keyboard - Tampilkan papan ketik perangkat lunak + Tampilkan papan ketik peranti lunak Guest Control Terminal... @@ -2738,6 +2738,10 @@ Primary Group Grup Utama + + Storage Controller (VirtioSCSI) + + UIApplianceImportEditorWidget @@ -2791,7 +2795,7 @@ &Machine Base Folder: - Folder Baasis &Mesin: + Folder Dasar &Mesin: Include all network adapter MAC addresses during importing. @@ -3429,12 +3433,12 @@ Restoring MachineState - Memulihkan + Mengembalikan Teleporting Paused VM MachineState - Meneleport VM yang Istirahat + Meneleport VM Istirahat Deleting Snapshot @@ -3444,12 +3448,12 @@ Restoring Snapshot MachineState - Memulihkan Snapshot + Mengembalikan Snapshot Setting Up MachineState - Menyiapkan + Menata Unlocked @@ -3659,7 +3663,7 @@ New dynamically allocated storage MediumVariant - Penyimpanan baru yang dialokasikan secara dinamis + Penyimpanan yang dialokasikan secara dinamis Dynamically allocated differencing storage @@ -3674,17 +3678,17 @@ Dynamically allocated storage split into files of less than 2GB MediumVariant - Penyimpanan yang dialokasikan secara dinamis memecah ke berkas dengan ukuran kurang dari 2GB + Penyimpanan yang dialokasikan secara dinamis memecah ke file berukuran kurang dari 2GB Dynamically allocated differencing storage split into files of less than 2GB MediumVariant - Penyimpanan pembeda yang dialokasikan secara dinamis memecah ke berkas berukuran kurang dari 2GB + Penyimpanan pembeda yang dialokasikan secara dinamis memecah ke file berukuran kurang dari 2GB Fixed size storage split into files of less than 2GB MediumVariant - Penyimpanan ukuran tetap dipecah dalam berkas-berkas berukuran kurang dari 2GB + Penyimpanan ukuran tetap memecah ke berkas-berkas berukuran kurang dari 2GB Dynamically allocated compressed storage @@ -4059,7 +4063,7 @@ Starting GuestSessionStatus - Memulai + Memulai Starting @@ -4097,24 +4101,24 @@ PB - IDE Primary Device 0 + IDE Primary Master StorageSlot - IDE Master Primer + IDE Master Primer - IDE Primary Device 1 + IDE Primary Slave StorageSlot - IDE Slave Primer + IDE Slave Primer - IDE Secondary Device 0 + IDE Secondary Master StorageSlot - IDE Master Sekunder + IDE Master Sekunder - IDE Secondary Device 1 + IDE Secondary Slave StorageSlot - IDE Slave Sekunder + IDE Slave Sekunder SATA Port %1 @@ -4254,7 +4258,7 @@ Bridget Adapter - Adaptor Ter-bridge + Adaptor Ter-bridge Internal Network @@ -4299,11 +4303,11 @@ Menu Bar - Bilah Menu + Bilah menu Status Bar - Bilah Status + Bilah status Mini Toolbar @@ -4537,7 +4541,7 @@ Video/Audio UISettingsDefs::RecordingMode - Video/Audio + Video/Suara Video Only @@ -4787,7 +4791,7 @@ Paravirtualized Network (virtio-net 1.0) NetworkAdapterType - Jaringan Ter-paravirtualisasi (virtio-ne 1.0) + Jaringan Ter-paravirtualisasi (virtio-net 1.0) PCnet-ISA (Am79C960) @@ -4796,25 +4800,93 @@ Acquire cloud instances ... - Mengambil instansi cloud ... + Mengambil instansi cloud ... Acquire cloud instance info ... - Mengambil info instansi cloud ... + Pause instance ... - Istirahatkan instance ... + Start instance ... - Memulai instance ... + Cloud Network [EXPERIMENTAL] NetworkAttachmentType + + Undefined + GuestSessionStatus + + + + Started + GuestSessionStatus + + + + Terminating + GuestSessionStatus + + + + Terminated + GuestSessionStatus + + + + Timed Out (Killed) + GuestSessionStatus + + + + Timed Out (Abnormally) + GuestSessionStatus + + + + Down + GuestSessionStatus + + + + Error + GuestSessionStatus + + + + IDE Primary Device 0 + StorageSlot + + + + IDE Primary Device 1 + StorageSlot + + + + IDE Secondary Device 0 + StorageSlot + + + + IDE Secondary Device 1 + StorageSlot + + + + Bridged Adapter + Adaptor Ter-bridge + + + Cloud Network + Jaringan Cloud + UICustomFileSystemModel @@ -5816,11 +5888,11 @@ Could not locate the file on the server (response: %1). - Tidak dapat menemukan berkas tersebut pada server (respon: %1). + Tidak dapat menemukan file tersebut pada server (respon: %1). <p>Failed to save the downloaded file as <nobr><b>%1</b>.</nobr></p> - <p>Gagal menyimpan berkas terunduh sebagai <nobr><b>%1</b>.</nobr></p> + <p>Gagal menyimpan file terdownload sebagai <nobr><b>%1</b>.</nobr></p> Select folder to save Guest Additions image to @@ -5863,7 +5935,7 @@ <p>Failed to save the downloaded file as <nobr><b>%1</b>.</nobr></p> - <p>Gagal menyimpan berkas terunduh sebagai <nobr><b>%1</b>.</nobr></p> + <p>Gagal menyimpan file terdownload sebagai <nobr><b>%1</b>.</nobr></p> Select folder to save Guest Additions image to @@ -6027,11 +6099,11 @@ Create a Manifest file for automatic data integrity checks on import. - Buat berkas Manifest untuk pemeriksaan integritas data otomatis saat impor. + Buat file Manifest untuk pemeriksaan integritas data otomatis saat impor. Write &Manifest file - Tulis berkas &Manifest + Tulis file &Manifest Appliance @@ -6039,7 +6111,7 @@ Select a file to export into - Pilih berkas tujuan ekspor + Pilih file tujuan ekspor Open Virtualization Format Archive (%1) @@ -6051,15 +6123,15 @@ Please choose a filename to export the OVF/OVA to. If you use an <i>ova</i> file name extension, then all the files will be combined into one Open Virtualization Format Archive. If you use an <i>ovf</i> extension, several files will be written separately. Other extensions are not allowed. - Silakan pilih nama berkas tujuan ekspor OVF/OVA. Bila Anda memakai ekstensi nama berkas <i>ova</i>, maka semua berkas akan digabungkan ke dalam satu Arsip Open Virtualization Format. Bila Anda memakai ekstensi <i>ovf</i>, beberapa berkas akan ditulis secara terpisah. Ekstensi lain tak diizinkan. + Silakan pilih nama file tujuan ekspor OVF/OVA. Bila Anda memakai ekstensi nama file <i>ova</i>, maka semua file akan digabungkan ke dalam satu Arsip Open Virtualization Format. Bila Anda memakai ekstensi <i>ovf</i>, beberapa file akan ditulis secara terpisah. Ekstensi lain tak diijinkan. Please complete the additional fields like the username, password and the bucket, and provide a filename for the OVF target. - Silakan lengkapi field tambahan seperti nama pengguna, password, dan bucket, dan berikan nama berkas bagi target OVF. + Silakan lengkapi field tambahan seperti nama pengguna, password, dan bucket, dan berikan nama file bagi target OVF. Please complete the additional fields like the username, password, hostname and the bucket, and provide a filename for the OVF target. - Silakan lengkapi field tambahan seperti nama pengguna, password, nama host, dan bucket, dan berikan nama berkas bagi target OVF. + Silakan lengkapi field tambahan seperti nama pengguna, password, nama host, dan bucket, dan berikan nama file bagi target OVF. @@ -6070,11 +6142,11 @@ Checking files ... - Memeriksa berkas ... + Memeriksa file ... Removing files ... - Menghapus berkas ... + Menghapus file ... Exporting Appliance ... @@ -6455,6 +6527,14 @@ No Guest Session found!<br>Please use the Session Panel to start a new guest session Tidak ditemukan Sesi Guest!<br>Harap pakai Panel Sesi untuk memulai suatu sesi guest baru + + Close dialog without saving + Tutup dialog tanpa menyimpan + + + Reset Changes (%1) + Reset Perubahan (%1) + UIFilePathSelector @@ -8655,7 +8735,7 @@ Remove All Terminated Sessions/Processes - Buang Semua Sesi/Proses yang Diakhiri + Hapus Semua Sesi/Proses yang Diakhiri Properties @@ -9176,11 +9256,11 @@ Adding network ... - Menambah jaringan... + Menambah jaringan ... Removing network ... - Menghapus jaringan... + Menghapus jaringan ... @@ -9440,7 +9520,7 @@ <p>This wizard will guide you through importing an appliance.</p><p>%1</p><p>VirtualBox currently supports importing appliances saved in the Open Virtualization Format (OVF). To continue, select the file to import below:</p> - <p>Wizard ini akan membimbing Anda melakukan pengimporan appliance.</p><p>%1</p><p>VirtualBox kini mendukung pengimporan appliance yang disimpan dalam Open Virtualization Format (OVF). Untuk melanjutkan, pilih berkas yang akan diimpor di bawah:</p> + <p>Wizard ini akan membimbing Anda melakukan pengimporan appliance.</p><p>%1</p><p>VirtualBox kini mendukung pengimporan appliance yang disimpan dalam Open Virtualization Format (OVF). Untuk melanjutkan, pilih file yang akan diimpor di bawah:</p> @@ -10615,7 +10695,7 @@ 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. - Saat tertandai, VM akan bertindak sebagai server Remote Desktop Protocol (RDP), mengizinkan client jarak jauh untuk terhubung dan mengoperasikan VM (saat berjalan) menggunakan klien RDP standar. + 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. &Enable Server @@ -10671,11 +10751,11 @@ Specifies whether multiple simultaneous connections to the VM are permitted. - Menyatakan apakah beberapa koneksi simultan ke VM diizinkan. + Menyatakan apakah beberapa koneksi simultan ke VM diijinkan. &Allow Multiple Connections - Izink&an Koneksi Berganda + Ijink&an Koneksi Berganda you have 3D Acceleration enabled for a operation system which uses the WDDM video driver. For maximal performance set the guest VRAM to at least <b>%1</b>. @@ -10862,7 +10942,7 @@ When checked, multiple simultaneous connections to the VM are permitted. - Bila dicentang, beberapa koneksi simultan ke VM diizinkan. + Bila dicentang, beberapa koneksi simultan ke VM diijinkan. Holds the filename VirtualBox uses to save the recorded content. @@ -11261,7 +11341,7 @@ UIMachineSettingsInterface Allows to modify VM menu-bar contents. - Mengizinkan mengubah isi bilah menu VM. + Mengijinkan mengubah isi bilah menu VM. Mini ToolBar: @@ -11285,7 +11365,7 @@ Allows to modify VM status-bar contents. - Mengizinkan mengubah isi bilah status VM. + Mengijinkan mengubah isi bilah status VM. @@ -11487,7 +11567,7 @@ The second digit in the MAC address may not be odd as only unicast addresses are allowed. - Dijit kedua dalam alamat MAC tidak boleh ganjil karena hanya alamat unicast yang diizinkan. + Dijit kedua dalam alamat MAC tidak boleh ganjil karena hanya alamt unicast yang diijinkan. No NAT network name is currently specified. @@ -12187,7 +12267,7 @@ When checked, allows the guest to send ATAPI commands directly to the host-drive which makes it possible to use CD/DVD writers connected to the host inside the VM. Note that writing audio CD inside the VM is not yet supported. - Bila ditandai, mengizinkan guest untuk mengirim perintah ATAPI secara langsung ke drive-host yang memungkinkannya untuk memakai pembakar CD/DVD yang tersambung ke host di dalam VM. Perhatikan bahwa menulis CD audio di dalam VM belum didukung. + Bila ditandai, mengijinkan guest untuk mengirim perintah ATAPI secara langsung ke drive-host yang memungkinkannya untuk memakai pembakar CD/DVD yang tersambung ke host di dalam VM. Perhatikan bahwa menulis CD audio di dalam VM belum didukung. &Passthrough @@ -12219,7 +12299,7 @@ Allows to use host I/O caching capabilities. - Mengizinkan pemakaian kapabilitas caching I/O host. + Mengijinkan pemakaian kapabilitas caching I/O host. Use Host I/O Cache @@ -12385,7 +12465,7 @@ When checked, allows to use host I/O caching capabilities. - Bila dicentang, mengizinkan pemakaian kapabilitas caching I/O host. + Bila dicentang, mengijinkan pemakaian kapabilitas caching I/O host. When checked, the virtual disk will not be removed when the guest system ejects it. @@ -12565,7 +12645,7 @@ Choose/Create a Virtual Hard Disk... - Pilih/Buat sebuah Hard Disk Virtual... + Pilih/buat sebuah Hard Disk Virtual... Choose a disk file... @@ -12758,7 +12838,7 @@ 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. - Membatasi lama waktu setiap CPU virtual diizinkan berjalan. Setiap CPU virtual akan diizinkan 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. + 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. you have set the processor execution cap to a low value. This can make the machine feel slow to respond. @@ -12902,7 +12982,7 @@ The hardware virtualization is enabled in the Acceleration section of the System page although it is not supported by the host system. It should be disabled in order to start the virtual system. - Virtualisasi perangkat keras difungsikan dalam seksi Akselerasi dari halaman Sistem walaupun tidak didukung oleh sistem host. Itu mesti dinonaktifkan untuk memulai sistem virtual. + Virtualisasi perangkat keras difungsikan dalam seksi Akselerasi dari halaman Sistem walaupun tidak didukung oleh sistem host. Itu mesti dinonaktifkan untuk memulai sistem virtual. When checked, the nested hardware virtualization CPU feature will be exposed to the virtual machine. @@ -13450,11 +13530,11 @@ Moving medium ... - Memindah medium... + Memindah medium ... Removing medium ... - Mennghapus medium... + Mencabut medium ... @@ -13878,7 +13958,7 @@ This type of medium is attached directly, allowed to be used concurrently by several machines. - Tipe medium ini dicantol secara langsung, diizinkan untuk dipakai bersamaan oleh beberapa mesin. + Tipe medium ini dicantol secara langsung, diijinkan untuk dipakai bersamaan oleh beberapa mesin. This type of medium is attached directly, and can be used by several machines. @@ -14076,11 +14156,11 @@ <p>The image file <b>%1</b> already exists. You cannot create a new virtual hard disk that uses this file, because it can be already used by another virtual hard disk.</p><p>Please specify a different image file name.</p> - <p>File image <b>%1</b> sudah ada. Anda tidak dapat menciptakan mesin virtual baru yang menggunakan berkas ini, karena ia sudah digunakan oleh hard disk virtual yang lain.</p><p>Silahkan memberikan nama image berkas yang berbeda.</p> + <p>File image <b>%1</b> sudah ada. Anda tidak dapat menciptakan mesin virtual baru yang menggunakan file ini, karena ia sudah digunakan oleh hard disk virtual yang lain.</p><p>Silahkan memberikan nama file image yang berbeda.</p> <p>Do you want to delete this hard disk's image file <nobr><b>%1</b>?</nobr></p><p>If you select <b>No</b> then the virtual hard disk will be unregistered and removed from the collection, but the image file will be left on your physical disk.</p><p>If you select <b>Yes</b> then the image file will be permanently deleted after unregistering the hard disk. This operation cannot be undone.</p> - <p>Apakah Anda ingin menghapus berkas image hard disk ini <nobr><b>%1</b>?</nobr></p><p>Bila Anda memilih <b>Tidak</b> maka hard disk virtual akan ter-unregister dan menghapusnya dari koleksi, namun berkas imagenya akan tetap ada pada disk fisik anda.</p><p>Bila Anda memilih <b>Ya</b> maka berkas image akan dihapus secara permanen setelah meng-unregister hard disk. Tindakan ini tidak bisa dibatalkan.</p> + <p>Apakah Anda ingin menghapus file image hard disk ini <nobr><b>%1</b>?</nobr></p><p>Bila Anda memilih <b>Tidak</b> maka hard disk virtual akan ter-unregister dan menghapusnya dari koleksi, namun file imagenya akan tetap ada pada disk fisik anda.</p><p>Bila Anda memilih <b>Ya</b> maka file image akan dihapus secara permanen setelah meng-unregister hard disk. Tindakan ini tidak bisa dibatalkan.</p> Failed to delete the virtual hard disk image <b>%1</b>. @@ -14238,11 +14318,11 @@ <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 main VirtualBox window, and select one of the existing languages on the <b>Language</b> page.</p> - <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 pada nilai awal bahasa sistem. Silahkan melihat dialog <b>Preferensi</b> yang dapat Anda buka dari menu <b>File</b> pada jendela utama VirtualBox , dan pilih satu dari bahasa yang tersedia pada halaman <b>Bahasa</b>.</p> + <p>Tidak dapat menemukan file bahasa untuk bahasa <b>%1</b> dalam direktori <b><nobr>%2</nobr></b>.</p><p>Bahasa akan sementara di-reset pada nilai awal bahasa sistem. Silahkan melihat dialog <b>Preferensi</b> yang dapat Anda buka dari menu <b>File</b> pada jendela utama VirtualBox , dan pilih satu dari bahasa yang tersedia pada halaman <b>Bahasa</b>.</p> <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 main VirtualBox window, and select one of the existing languages on the <b>Language</b> page.</p> - <p>Tidak dapat memuat berkas bahasa <b><nobr>%1</nobr></b>. <p>Bahasa akan sementara di-reset pada bahasa Inggris (built-in). Silahkan melihat dialog <b>Preferensi</b> yang dapat Anda buka dari menu <b>File</b> pada jendela utama VirtualBox , dan pilih satu dari bahasa yang tersedia pada halaman, <b>Bahasa</b>.</p> + <p>Tidak dapat memuat file bahasa <b><nobr>%1</nobr></b>. <p>Bahasa akan sementara di-reset pada bahasa Inggris (built-in). Silahkan melihat dialog <b>Preferensi</b> yang dapat Anda buka dari menu <b>File</b> pada jendela utama VirtualBox , dan pilih satu dari bahasa yang tersedia pada halaman, <b>Bahasa</b>.</p> <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> @@ -14270,7 +14350,7 @@ <p>Could not find the VirtualBox Guest Additions disk image file file <nobr><b>%1</b></nobr> or <nobr><b>%2</b>.</nobr></p><p>Do you wish to download this disk image file from the Internet?</p> - <p>Tidak dapat menemukan berkas image CD VirtualBox Guest Additions <nobr><b>%1</b></nobr> atau <nobr><b>%2</b>.</nobr></p><p>Apa Anda ingin men-download image CD ini dari Internet?</p> + <p>Tidak dapat menemukan file image CD VirtualBox Guest Additions <nobr><b>%1</b></nobr> atau <nobr><b>%2</b>.</nobr></p><p>Apa Anda ingin men-download image CD ini dari Internet?</p> <p>Failed to download the VirtualBox Guest Additions disk image file from <nobr><a href="%1">%2</a>.</nobr></p><p>%3</p> @@ -14298,7 +14378,7 @@ <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=https://www.virtualbox.org>https://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> directory, as well as a description of what you were doing when this error happened. Note that you can also access the above files by selecting <b>Show Log</b> from the <b>Machine</b> menu of the main VirualBox window.</p><p>Press <b>OK</b> if you want to power off the machine or press <b>Ignore</b> if you want to leave it as is for debugging. Please note that debugging requires special knowledge and tools, so it is recommended to press <b>OK</b> now.</p> - <p>Kesalahan kritikal telah terjadi saat menjalankan mesin virtual dan eksekusi mesin telah dihentikan.</p><p>Untuk bantuan, silahkan kunjungi bagian Community (Komunitas) <a href=https://www.virtualbox.org>https://www.virtualbox.org</a> atau kontrak pendukung Anda. Mohon sediakan isi dari berkas log <tt>VBox.log</tt> dan berkas image <tt>VBox.png</tt>, yang dapat Anda temukan pada direktori <nobr><b>%1</b></nobr>, demikian juga dengan deskripsi tentang apa yang Anda lakukan saat kesalahan ini terjadi. Perhatikan bahwa Anda juga dapat mengakses berkas di atas dengan memilih <b>Tampilkan Log</b> dari menu <b>Mesin</b> dalam jendela utama VirtualBox.</p><p>Tekan <b>Baik</b> bila Anda ingin mematikan mesin atau tekan <b>Abaikan</b> bila Anda ingin membiarkannya untuk debugging. Mohon perhatikan bahwa debugging membutuhkan pengetahuan dan alat khusus, sehingga dianjurkan untuk menekan <b>Baik</b> sekarang.</p> + <p>Kesalahan kritikal telah terjadi saat menjalankan mesin virtual dan eksekusi mesin telah dihentikan.</p><p>Untuk bantuan, silahkan kunjungi bagian Community (Komunitas) <a href=https://www.virtualbox.org>https://www.virtualbox.org</a> atau kontrak pendukung anda. Mohon sediakan isi dari file log file <tt>VBox.log</tt> dan file image <tt>VBox.png</tt>, yang dapat Anda temukan pada direktori <nobr><b>%1</b></nobr>, demikian juga dengan deskripsi tentang apa yang Anda lakukan saat kesalahan ini terjadi. Perhatikan bahwa Anda juga dapat mengakses file diatas dengan memilih <b>Tampilkan Log</b> dari menu <b>Mesin</b> dalam jendela utama VirtualBox.</p><p>Tekan <b>Baik</b> bila Anda ingin mematikan mesin atau tekan <b>Abaikan</b> bila Anda ingin membiarkannya untuk debugging. Mohon perhatikan bahwa debugging membutuhkan pengetahuan dan alat khusus, sehingga dianjurkan untuk menekan <b>Baik</b> sekarang.</p> <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> @@ -14306,11 +14386,11 @@ Failed to find license files in <nobr><b>%1</b></nobr>. - Gagal menemukan berkas lisensi dalam <nobr><b>%1</b></nobr>. + Gagal menemukan file lisensi dalam <nobr><b>%1</b></nobr>. Failed to open the license file <nobr><b>%1</b></nobr>. Check file permissions. - Gagal membuka berkas lisensi <nobr><b>%1</b></nobr>. Periksa permission berkas. + Gagal membuka file lisensi <nobr><b>%1</b></nobr>. Periksa permission file. Failed to send the ACPI Power Button press event to the virtual machine <b>%1</b>. @@ -14370,7 +14450,7 @@ <p>Do you want to delete this hard disk's image file <nobr><b>%1</b>?</nobr></p><p>If you select <b>Delete</b> then the image file will be permanently deleted after unregistering the hard disk. This operation cannot be undone.</p><p>If you select <b>Unregister</b> then the virtual hard disk will be unregistered and removed from the collection, but the image file will be left on your physical disk.</p> - <p>Apakah Anda ingin menghapus berkas image hard disk ini <nobr><b>%1</b>?</nobr></p><p>Bila Anda memilih <b>Hapus</b> maka berkas image akan terhapus secara permanen setelah melakukan unregister hard disk. Tindakan ini tidak dapat dibatalkan.</p><p>Bila Anda memilih <b>Unregister</b> maka hard disk virtual akan di-unregister dan hilang dari koleksi, namun berkas image akan tetap berada pada disk fisik.</p> + <p>Apakah Anda ingin menghapus file image hard disk ini <nobr><b>%1</b>?</nobr></p><p>Bila Anda memilih <b>Hapus</b> maka file image akan terhapus secara permanen setelah melakukan unregister hard disk. Tindakan ini tidak dapat dibatalkan.</p><p>Bila Anda memilih <b>Unregister</b> maka hard disk virtual akan di-unregister dan hilang dari koleksi, namun file image akan tetap berada pada disk fisik.</p> Delete @@ -14430,7 +14510,7 @@ <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>Backup</b> to create backup copies of the settings files in the old format before saving them in the new format;</li><li><b>Cancel</b> to not save the auto-converted settings files now.<li></ul><p>Note that if you select <b>Cancel</b>, the auto-converted settings files will be implicitly saved in the new format anyway once you change a setting or start a virtual machine, but <b>no</b> backup copies will be created in this case.</p> - <p>File setting VirtualBox berikut telah dikonversi secara otomatis ke versi format berkas pengaturan yang baru <b>%1</b>.</p><p>Adapun, hasil dari konversi saat ini belum disimpan ke dalam disk. Silahkan tekan:</p><ul><li><b>Simpan</b> untuk segera menyimpan semua berkas konversi otomatis (tidak memungkinkan untuk menggunakan berkas pengaturan tersebut dengan versi VirtualBox yang lebih lama di masa datang);</li><li><b>Backup</b> untuk menciptakan salinan cadangan dari berkas pengaturan pada format lama sebelum menyimpan mereka dalam format baru;</li><li><b>Batal</b> untuk tidak menyimpan berkas pengaturan yang dikonversi secara otomatis.<li></ul><p>Perhatikan bila Anda memilih <b>Batal</b>, File setting yang dikonversi secara otomatis akan tetap saja disimpan secara implisit ke dalam format baru seketika Anda mengubah setting atau menjalankan mesin virtual, namun <b>tidak ada</b> copy backup tercipta pada kasus ini.</p> + <p>File setting VirtualBox berikut telah dikonversi secara otomatis ke versi format file setting yang baru <b>%1</b>.</p><p>Adapun, hasil dari konversi saat ini belum disimpan ke dalam disk. Silahkan tekan:</p><ul><li><b>Simpan</b> untuk segera menyimpan semua file konversi otomatis (tidak memungkinkan untuk menggunakan file setting tersebut dengan versi VirtualBox yang lebih lama di masa datang);</li><li><b>Backup</b> untuk menciptakan copy backup dari file settings pada format lama sebelum menyimpan mereka dalam format baru;</li><li><b>Batal</b> untuk tidak menyimpan file setting yang dikonversi secara otomatis.<li></ul><p>Perhatikan bila Anda memilih <b>Batal</b>, File setting yang dikonversi secara otomatis akan tetap saja disimpan secara implisit ke dalam format baru seketika Anda mengubah setting atau menjalankan mesin virtual, namun <b>tidak ada</b> copy backup tercipta pada kasus ini.</p> &Save @@ -14478,7 +14558,7 @@ Failed to copy file <b><nobr>%1</nobr></b> to <b><nobr>%2</nobr></b> (%3). - Gagal menyalin berkas <b><nobr>%1</nobr></b> pada <b><nobr>%2</nobr></b> (%3). + Gagal meng-copy file <b><nobr>%1</nobr></b> pada <b><nobr>%2</nobr></b> (%3). <p>There are no unused hard disks available for the newly created attachment.</p><p>Press the <b>Create</b> button to start the <i>New Virtual Disk</i> wizard and create a new hard disk, or press the <b>Select</b> if you wish to open the <i>Virtual Disk Manager</i>.</p> @@ -14661,7 +14741,7 @@ <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=https://www.virtualbox.org>https://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> directory, as well as a description of what you were doing when this error happened. Note that you can also access the above files by selecting <b>Show Log</b> from the <b>Machine</b> menu of the main VirtualBox window.</p><p>Press <b>OK</b> if you want to power off the machine or press <b>Ignore</b> if you want to leave it as is for debugging. Please note that debugging requires special knowledge and tools, so it is recommended to press <b>OK</b> now.</p> - <p>Kesalahan kritikal telah terjadi saat menjalankan mesin virtual dan eksekusi mesin telah dihentikan.</p><p>Untuk bantuan, silakan kunjungi bagian Community pada <a href=https://www.virtualbox.org>https://www.virtualbox.org</a> atau kontrak pendukung Anda. Mohon sediakan isi dari berkas log <tt>VBox.log</tt> dan berkas image <tt>VBox.png</tt>, yang dapat Anda temukan pada direktori <nobr><b>%1</b></nobr>, demikian juga dengan deskripsi tentang apa yang Anda lakukan saat kesalahan ini terjadi. Perhatikan bahwa Anda juga dapat mengakses berkas di atas dengan memilih <b>Tampilkan Log</b> dari menu <b>Mesin</b> dalam jendela utama VirtualBox.</p><p>Tekan <b>OK</b> bila Anda ingin mematikan mesin atau tekan <b>Abaikan</b> bila Anda ingin membiarkannya untuk debugging. Mohon perhatikan bahwa debugging membutuhkan pengetahuan dan alat khusus, sehingga dianjurkan untuk menekan <b>OK</b> sekarang.</p> + <p>Kesalahan kritikal telah terjadi saat menjalankan mesin virtual dan eksekusi mesin telah dihentikan.</p><p>Untuk bantuan, silakan kunjungi bagian Community pada <a href=https://www.virtualbox.org>https://www.virtualbox.org</a> atau kontrak pendukung Anda. Mohon sediakan isi dari file log <tt>VBox.log</tt> dan file image <tt>VBox.png</tt>, yang dapat Anda temukan pada direktori <nobr><b>%1</b></nobr>, demikian juga dengan deskripsi tentang apa yang Anda lakukan saat kesalahan ini terjadi. Perhatikan bahwa Anda juga dapat mengakses file di atas dengan memilih <b>Tampilkan Log</b> dari menu <b>Mesin</b> dalam jendela utama VirtualBox.</p><p>Tekan <b>OK</b> bila Anda ingin mematikan mesin atau tekan <b>Abaikan</b> bila Anda ingin membiarkannya untuk debugging. Mohon perhatikan bahwa debugging membutuhkan pengetahuan dan alat khusus, sehingga dianjurkan untuk menekan <b>OK</b> sekarang.</p> hard disk @@ -14772,15 +14852,15 @@ Failed to check files. - Gagal memeriksa berkas. + Gagal memeriksa file. Failed to remove file. - Gagal menghapus berkas. + Gagal menghapus file. 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. - Sepertinya sistem berkas USBFS di-mount pada /sys/bus/usb/drivers. Kami sangat sarankan agar Anda mengubahnya, karena ini adalah miskonfigurasi sistem yang sangat parah yang dapat menyebabkan peranti USB gagal dengan cara yang tak disangka-sangka. + Sepertinya sistem file USBFS di-mount pada /sys/bus/usb/drivers. Kami sangat sarankan agar Anda mengubahnya, karena ini adalah miskonfigurasi sistem yang sangat parah yang dapat menyebabkan peranti USB gagal dengan cara yang tak disangka-sangka. You are running an EXPERIMENTAL build of VirtualBox. This version is not suitable for production use. @@ -14788,7 +14868,7 @@ <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> - <p>Menghapus snapshot akan menyebabkan informasi keadaan yang disimpan di dalamnya hilang, dan data disk yang disebar ke beberapa berkas image yang telah dibuat oleh VirtualBox, bersama dengan snapshot akan digabung ke dalam satu berkas. Proses ini bisa makan waktu lama, dan informasi di dalam snapshot tidak dapat diambil kembali.</p><p>Apakah Anda yakin hendak menghapus snapshot <b>%1</b>yang dipilih?</p> + <p>Menghapus snapshot akan menyebabkan informasi keadaan yang disimpan di dalamnya hilang, dan data disk yang disebar ke beberapa file image yang telah dibuat oleh VirtualBox, bersama dengan snapshot akan digabung ke dalam satu file. Proses ini bisa makan waktu lama, dan informasi di dalam snapshot tidak dapat diambil kembali.</p><p>Apakah Anda yakin hendak menghapus snapshot <b>%1</b>yang dipilih?</p> Delete @@ -14894,7 +14974,7 @@ <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> - <p>Menghapus snapshot %1 akan perlu lebih banyak ruang disk untuk sementara. Pada kasus terburuk ukurang image %2 akan bertambah %3, namun pada sistem berkas ini hanya ada ruang bebas %4.</p><p>Kehabisan ruang disk selama operasi penggabungan akan menghasilkan kerusakan image dan konfigurasi VM, yaitu hilangnya VM dan datanya.</p><p>Anda dapat melanjutkan penghapusan snapshot dengan risiko yang Anda tanggung sendiri.</p> + <p>Menghapus snapshot %1 akan perlu lebih banyak ruang disk untuk sementara. Pada kasus terburuk ukurang image %2 akan bertambah %3, namun pada sistem file ini hanya ada ruang bebas %4.</p><p>Kehabisan ruang disk selama operasi penggabungan akan menghasilkan kerusakan image dan konfigurasi VM, yaitu hilangnya VM dan datanya.</p><p>Anda dapat melanjutkan penghapusan snapshot dengan risiko yang Anda tanggung sendiri.</p> <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> @@ -14914,7 +14994,7 @@ <p>Could not find the VirtualBox User Manual <nobr><b>%1</b>.</nobr></p><p>Do you wish to download this file from the Internet?</p> - <p>Tak bisa temukan Manual Pengguna VirtualBox <nobr><b>%1</b>.</nobr></p><p>Apakah Anda hendak mengunduh berkas ini dari Internet?</p> + <p>Tak bisa temukan Manual Pengguna VirtualBox <nobr><b>%1</b>.</nobr></p><p>Apakah Anda hendak mendownload file ini dari Internet?</p> <p>Are you sure you want to download the VirtualBox User Manual from <nobr><a href="%1">%2</a></nobr> (size %3 bytes)?</p> @@ -14930,7 +15010,7 @@ <p>The VirtualBox User Manual has been successfully downloaded from <nobr><a href="%1">%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> - <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 berkas itu.</p> + <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> Failed to open virtual machine located in %1. @@ -14942,11 +15022,11 @@ <p>You are about to remove the virtual machine <b>%1</b> from the machine list.</p><p>Would you like to delete the files containing the virtual machine from your hard disk as well?</p> - <p>Anda akan menghapus mesin virtual <b>%1</b> dari daftar mesin.</p><p>Apakah Anda juga hendak menghapus berkas yang memuat mesin virtual dari hard disk Anda?</p> + <p>Anda akan menghapus mesin virtual <b>%1</b> dari daftar mesin.</p><p>Apakah Anda juga hendak menghapus file yang memuat mesin virtual dari hard disk Anda?</p> <p>You are about to remove the virtual machine <b>%1</b> from the machine list.</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> - <p>Anda akan menghapus mesin virtual <b>%1</b> dari daftar mesin.</p><p>Apakah Anda juga hendak menghapus berkas yang memuat mesin virtual dari hard disk Anda? Melakukan hal itu juga akan menghapus berkas yang memuat hard disk virtual mesin bila mereka tidak dipakai oleh mesin lain.</p> + <p>Anda akan menghapus mesin virtual <b>%1</b> dari daftar mesin.</p><p>Apakah Anda juga hendak menghapus file yang memuat mesin virtual dari hard disk Anda? Melakukan hal itu juga akan menghapus file yang memuat hard disk virtual mesin bila mereka tidak dipakai oleh mesin lain.</p> Delete all files @@ -14966,7 +15046,7 @@ <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> - <p>Anda akan menambahkan sebuah hard disk virtual ke pengendali <b>%1</b>.</p><p>Apakah Anda ingin membuat suatu berkas baru yang kosong untuk menampung isi disk atau memilih yang telah ada?</p> + <p>Anda akan menambahkan sebuah hard disk virtual ke pengendali <b>%1</b>.</p><p>Apakah Anda ingin membuat suatu file baru yang kosong untuk menampung isi disk atau memilih yang telah ada?</p> Create &new disk @@ -15175,11 +15255,11 @@ 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 - VirtualBox kini tak diizinkan mengakses peranti USB. Anda dapat mengubah ini dengan cara menambahkan pengguna Anda ke grup 'vboxusers'. Silakan lihat manual pengguna untuk penjelasan lebih terinci + VirtualBox kini tak diijinkan mengakses peranti USB. Anda dapat mengubah ini dengan cara menambahkan pengguna Anda ke grup 'vboxusers'. Silakan lihat manual pengguna untuk penjelasan lebih terinci 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 - VirtualBox kini tak diizinkan mengakses peranti USB. Anda dapat mengubah ini dengan cara mengizinkan pengguna Anda untuk mengakses folder dan berkas 'usbfs'. Silakan lihat manual pengguna untuk penjelasan lebih terinci + VirtualBox kini tak diijinkan mengakses peranti USB. Anda dapat mengubah ini dengan cara mengijinkan pengguna Anda untuk mengakses folder dan file 'usbfs'. Silakan lihat manual pengguna untuk penjelasan lebih terinci The USB Proxy Service has not yet been ported to this host @@ -15195,7 +15275,7 @@ <p>Failed to save the downloaded file as <nobr><b>%1</b>.</nobr></p> - <p>Gagal menyimpan berkas terunduh sebagai <nobr><b>%1</b>.</nobr></p> + <p>Gagal menyimpan file terdownload sebagai <nobr><b>%1</b>.</nobr></p> <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> @@ -15221,7 +15301,7 @@ <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> - <p><b><nobr>%1</nobr></b> telah sukses didownload dari <nobr><a href="%2">%2</a></nobr> tapi tak bisa disimpan secara lokal sebagai <nobr><b>%3</b>.</nobr></p><p>Silakan pilih lokasi lain bagi berkas itu.</p> + <p><b><nobr>%1</nobr></b> telah sukses didownload dari <nobr><a href="%2">%2</a></nobr> tapi tak bisa disimpan secara lokal sebagai <nobr><b>%3</b>.</nobr></p><p>Silakan pilih lokasi lain bagi file itu.</p> <p>Failed to download the <b><nobr>%1</nobr></b> from <nobr><a href="%2">%2</a>.</nobr></p><p>%3</p> @@ -15245,7 +15325,7 @@ <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> - <p>Gagal menginisiasi COM karena direktori konfigurasi global VirtualBox <b><nobr>%1</nobr></b> tidak dapat diakses. Harap periksa izin direktori ini dan direktori induknya.</p><p>Aplikasi kini akan berakhir.</p> + <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> <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> @@ -15982,15 +16062,15 @@ Failed to open the medium with following ID: <nobr><b>%1</b></nobr>. - Gagal membuka medium dengan ID berikut: <nobr><b>%1</b></nobr>. + Gagal membuka medium dengan ID berikut: <nobr><b>%1</b></nobr>. Failed to acquire attachment parameter. - Gagal mengambil parameter pencantolan. + Gagal mengambil parameter pencantolan. Failed to acquire medium attribute. - Gagal mengambil atribut medium. + Gagal mengambil atribut medium. Failed to create cloud machine. @@ -16154,7 +16234,7 @@ UINetworkAttachmentEditor &Attached to: - Terp&asang pada: + Terc&antol pada: &Name: @@ -16171,15 +16251,15 @@ Holds the name of the internal network that this network card will be connected to. You can create a new internal network by choosing a name which is not used by any other network cards in this virtual machine or others. - Menampung nama jaringan internal yang akan disambung ke kartu jaringan ini. Anda dapat membuat suatu jaringan internal baru dengan memilih nama yang tak dipakai oleh kartu jaringan lainnya di mesin virtual ini dan lainnya. + Menyimpan nama jaringan internal yang akan disambung ke kartu jaringan ini. Anda dapat membuat suatu jaringan internal baru dengan memilih nama yang tak dipakai oleh kartu jaringan lainnya di mesin virtual ini dan lainnya. Selects the virtual network adapter on the host system that traffic to and from this network card will go through. You can create and remove adapters using the global network settings in the virtual machine manager window. - Memilih adaptor jaringan virtual pada sistem host yang akan dilalui oleh lalu lintas dari dan ke kartu jaringan ini. Anda dapat membuat dan menghapus adaptor memakai pengaturan jaringan global dalam window manajer mesin virtual. + Pilih adaptor jaringan virtual pada sistem host yang akan dilalui oleh lalu lintas dari dan ke kartu jaringan ini. Anda dapat membuat dan menghapus adaptor memakai pengaturan jaringan global dalam window manajer mesin virtual. Selects the driver to be used with this network card. - Memilih driver yang akan dipakai untuk kartu jaringan ini. + Pilih driver yang akan dipakai untuk kartu jaringan ini. 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. @@ -16187,7 +16267,7 @@ (experimental) Holds the name of the cloud network that this network card will be connected to. You can add and remove cloud networks using the global network settings in the virtual machine manager window. - (eksperimen) Menampung nama jaringan cloud tempat kartu jaringan ini akan dihubungkan. Anda dapat menambah dan menghapus jaringan cloud memakai pengaturan jaringan global dalam jendela manajer mesin virtual. + (eksperimen) Menyimpan nama jaringan cloud tempat akan terhubungnya kartu jaringan ini. Anda dapat membuat dan menghapus jaringan memakai pengaturan jaringan global dalam jendela manajer mesin virtual. @@ -16341,7 +16421,7 @@ <p>Sebuah <b>image yang mengembang secara dinamis</b> awalnya menempati sejumlah kecil ruangan dalam hard disk fisik anda. Ia akan mengembang secara dinamis (mencapai ukuran yang ditentukan) saat Sistem Operasi Guest mengklaim ruangan disk.</p> -<p>Sebiah <b>image ukuran-tetap</b> tidak mengembang. Ia disimpan dalam sebuah berkas +<p>Sebiah <b>image ukuran-tetap</b> tidak mengembang. Ia disim[an dalam sebuah file kira-kira dengan ukuran yang sama sepertu ukuran hard disk virtual.</p> @@ -16363,8 +16443,8 @@ <p>Press the <b>Select</b> button to select the location and name of the file to store the virtual hard disk image or type a file name in the entry field.</p> - <p>Tekan tombol <b>Pilih</b> untuk memilih lokasi dan nama berkas -untuk menyimpan image hard disk virtual atau ketikkan nama berkas pada field entry.</p> + <p>Tekan tombol <b>Pilih</b> untuk memilih lokasi dan nama file +untuk menyimpan image hard disk virtual atau ketikkan nama file pada field entry.</p> &Image File Name @@ -16418,7 +16498,7 @@ Select a file for the new hard disk image file - Pilih sebuah berkas untuk berkas image hard disk baru + Pilih sebuah file untuk file image hard disk baru <p>Select the type of virtual hard disk image you want to create.</p> @@ -16432,7 +16512,7 @@ <p>Sebuah <b>image yang mengembang secara dinamis</b> mula-mula menempati sejumlah kecil ruang pada hard disk fisik anda. Ia akan mengembang secara dinamis (hingga ukuran yang ditetapkan) seiring dengan Operating SystemGuest mengambil ruang disk.</p> -<p>Sebuah <b>image berukuran tetap</b> tidak mengembang. Ia disimpan pada berkas kurang lebih +<p>Sebuah <b>image berukuran tetap</b> tidak mengembang. Ia disimpan pada file kurang lebih dengan ukuran yang sama dari hard disk virtual. Penciptaan image berukuran tetap dapat memakan waktu lama bergantung pada ukuran image dan performa tulis harddisk anda.</p> @@ -16481,7 +16561,7 @@ Please select the virtual disk which 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 a virtual disk file. - Silakan pilih disk virtual yang ingin Anda salin bila belum dipilih. Anda dapat memilih dari daftar atau memakai ikon folder di samping daftar untuk memilih berkas disk virtual. + Silakan pilih disk virtual yang ingin Anda salin bila belum dipilih. Anda dapat memilih dari daftar atau memakai ikon folder di samping daftar untuk memilih file disk virtual. &VDI (VirtualBox Disk Image) @@ -16505,15 +16585,15 @@ <p>Please choose the type of file that you would like to use for the new virtual disk. If you do not need to use it with other virtualization software you can leave this setting unchanged.</p> - <p>Silakan pilih tipe berkas yang ingin Anda pakai untuk disk virtual baru. Bila Anda tak perlu memakainya dengan software virtualisasi lain Anda dapat membiarkan setting ini tak diubah.</p> + <p>Silakan pilih tipe file yang ingin Anda pakai untuk disk virtual baru. Bila Anda tak perlu memakainya dengan software virtualisasi lain Anda dapat membiarkan setting ini tak diubah.</p> Virtual disk file type - Tipe berkas disk virtual + Tipe file disk virtual Please choose the type of file that you would like to use for the new virtual disk. If you do not need to use it with other virtualization software you can leave this setting unchanged. - Silakan pilih tipe berkas yang ingin Anda pakai untuk disk virtual baru. Bila Anda tak perlu memakainya dengan software virtualisasi lain Anda dapat membiarkan setting ini tak diubah. + Silakan pilih tipe file yang ingin Anda pakai untuk disk virtual baru. Bila Anda tak perlu memakainya dengan software virtualisasi lain Anda dapat membiarkan setting ini tak diubah. Virtual disk storage details @@ -16521,7 +16601,7 @@ Please choose whether the new virtual disk file should be allocated as it is used or if it should be created fully allocated. - Silakan pilih apakah berkas disk virtual baru mesti dialokasikan ketika dipakai atau mesti diciptakan teralokasi penuh. + Silakan pilih apakah file disk virtual baru mesti dialokasikan ketika dipakai atau mesti diciptakan teralokasi penuh. <p>A <b>dynamically allocated</b> virtual disk file will only use space on your physical hard disk as it fills up, although it will not shrink again automatically when space on it is freed.</p> @@ -16533,7 +16613,7 @@ <p>You can also choose to <b>split</b> the virtual disk 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. - <p>Anda juga dapat memilih untuk <b>memecah</b> 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 peranti USB removable atau sistem lama, yang mungkin tak bisa menangani berkas sangat besar. + <p>Anda juga dapat memilih untuk <b>memecah</b> disk virtual ke dalam beberapa file yang masing-masing berukuran sampai dengan dua giga byte. Ini terutama berguna bila Anda hendak menyimpan mesin virtual pada peranti USB removable atau sistem lama, yang mungkin tak bisa menangani file sangat besar. &Dynamically allocated @@ -16545,7 +16625,7 @@ &Split into files of less than 2GB - &Pecah ke dalam berkas kurang dari 2GB + &Pecah ke dalam file kurang dari 2GB Virtual disk file location and size @@ -16561,7 +16641,7 @@ Please type the name of the new virtual disk file into the box below or click on the folder icon to select a different folder to create the file in. - Silakan ketik nama berkas disk virtual baru ke kotak di bawah atau klik pada ikon folder untuk memilih folder lain tempat mencipta berkas. + Silakan ketik nama file disk virtual baru ke kotak di bawah atau klik pada ikon folder untuk memilih folder lain tempat mencipta file. <nobr>%1 (%2 B)</nobr> @@ -16577,7 +16657,7 @@ If the above settings are correct, press the <b>%1</b> button. Once you press it the new virtual disk file will be created. - Bila setting di atas sudah benar, tekan tombol <b>%1</b>. Setelah Anda menekannya, sebuah berkas disk virtual baru akan tercipta. + Bila setting di atas sudah benar, tekan tombol <b>%1</b>. Setelah Anda menekannya, sebuah file disk virtual baru akan tercipta. %1 B @@ -16586,7 +16666,7 @@ File type summary - Tipe berkas + Tipe file Details @@ -16610,7 +16690,7 @@ UINewHDWizardPageFormat File type - Tipe berkas + Tipe file @@ -16640,7 +16720,7 @@ Choose a virtual hard disk file... - Pilih berkas hard disk virtual... + Pilih file hard disk virtual... @@ -16658,7 +16738,7 @@ Select a file for the new hard disk image file - Pilih sebuah berkas untuk berkas image hard disk baru + Pilih sebuah file untuk file image hard disk baru Hard disk images (*.vdi) @@ -16960,7 +17040,7 @@ Choose a virtual hard disk file... - Pilih sebuah berkas hard disk virtual... + Pilih sebuah file hard disk virtual... The recommended size of the start-up disk is <b>%1</b>. @@ -17662,11 +17742,11 @@ Return Back to Layout List - Kembalikan ke Daftar Tata Letak + Kembali ke Daftar Tata Letak Back to Layout List - Kembali ke Daftar Tata Letak + Mundur ke Daftar Tata Letak Physical Layout @@ -17678,15 +17758,15 @@ Name of the Layout in English - Nama Tata Letak dalam bahasa Inggris + Nama Tata Letak dalam Bahasa Inggris Native Language Name - Nama Bahasa Native + Nama Bahasa Ibu Name of the Layout in the native Language - Nama Tata Letak dalam Bahasa native + Nama Tata Letak dalam Bahasa Ibu Scan Code @@ -17758,7 +17838,7 @@ Web browser go back - Peramban web kembali + Peramban web mundur Web browser go the home page @@ -17770,11 +17850,11 @@ Web browser reload the current page - Peramban web memuat ulang halaman saat ini + Peramban web muat ulang laman saat ini Web browser stop loading the page - Peramban web berhenti memuat halaman + Peramban web berhenti memuat laman Web browser search @@ -17786,7 +17866,7 @@ Jump to next media track - Lompat ke trek media selanjutnya + Lompat ke trek media setelahnya Stop playing @@ -17794,15 +17874,15 @@ Play or pause playing - Memutar atau jeda memutar + Putar atau jeda memutar Start email application - Memulai aplikasi surel + Mulai aplikasi surel Start calculator - Memulai kalkulator + Mulai kalkulator Show 'My Computer' @@ -17826,7 +17906,7 @@ Error! Could not create folder under - Galat! Tidak dapat mencipta folder di bawah + Kesalahan! Tidak dapat membuat folder di bawah Provide a file name @@ -17834,7 +17914,7 @@ is an invalid file name - adalah sebuah nama berkas yang tidak valid + adalah nama berkas yang tidak valid is saved @@ -17846,7 +17926,7 @@ This will delete the keyboard layout file as well. Proceed? - Ini juga akan menghapus berkas tata letak papan ketik. Lanjutkan? + Ini akan menghapus berkas tata letak papan ketik juga. Lanjut? The file @@ -17858,7 +17938,7 @@ Deleting the file - Menghapus berkas + Menghapus berkas has failed @@ -17870,7 +17950,7 @@ Reset the keyboard and release all keys - Reset papan ketik dan lepas semua tombol + Reset papan ketik dan lepaskan semua tombol Click to change the color. @@ -17886,7 +17966,7 @@ Hide NumPad - Sembunyikan Pad Angka + Sembunyikan NumPad Hide OS/Menu Keys @@ -17902,7 +17982,7 @@ Button Background Color - Warna Latar Belakang Tombol + Warna Latar Tombol Button Font Color @@ -17910,7 +17990,7 @@ Button Hover Color - Warna Mengapung Tombol + Warna Mengambang Tombol Button Edit Color @@ -17922,11 +18002,11 @@ Soft Keyboard - Papan Ketik Perangkat Lunak + Papan Ketik Peranti Lunak <p>Following layouts are edited/copied but not saved:</p>%1<p>Closing this dialog will cause loosing the changes. Proceed?</p> - <p>Tata letak berikut disunting/disalin tapi tidak disimpan:</p>%1<p>Menutup dialog ini akan menyebabkan hilangnya perubahan. Lanjutkan?</p> + <p>Tata letak berikut disunting/disalin tapi tidak disimpan:</p>%1<p>Menutup dialog ini akan menyebabkan hilangnya perubahan. Lanjut?</p> Layout @@ -18427,7 +18507,7 @@ Draw Area Chart - Gambar Area Bagan + Gambar Bagan Area Seconds @@ -18471,7 +18551,7 @@ Transmit Rate - Laju Pancar + Laju Transmisi Total Received @@ -18728,7 +18808,7 @@ %1 - VirtualBox Log Viewer - %1 - Penilik Log VirtualBox + %1 -Penilik Log VirtualBox &Refresh @@ -18910,7 +18990,7 @@ <p>No log files found. Press the <b>Refresh</b> button to rescan the log folder <nobr><b>%1</b></nobr>.</p> - <p>Tidak ada berkas log yang ditemukan. Tekan tombol <b>Segarkan</b> untuk memindai ulang folder log <nobr><b>%1</b></nobr>.</p> + <p>Tidak ada file log yang ditemukan. Tekan tombol <b>Segarkan</b> untuk memindai ulang folder log <nobr><b>%1</b></nobr>.</p> Go to the next bookmark @@ -19010,20 +19090,20 @@ UIVirtualMachineItemCloud Loading ... - Memuat ... + Up-To-Date - Mutakhir + <nobr><b>%1</b></nobr><br><nobr>Inaccessible</nobr> Inaccessible VM tooltip (name) - <nobr><b>%1</b></nobr><br><nobr>Tidak dapat diakses</nobr> + Inaccessible - Tidak dapat diakses + Tidak dapat diakses @@ -19031,16 +19111,16 @@ <nobr>%1<br></nobr><nobr>%2 since %3</nobr><br><nobr>Session %4</nobr> VM tooltip (name, last state change, session state) - <nobr>%1<br></nobr><nobr>%2 sejak %3</nobr><br><nobr>Sesi %4</nobr> + <nobr>%1<br></nobr><nobr>%2 sejak %3</nobr><br><nobr>Sesi %4</nobr> <nobr><b>%1</b><br></nobr><nobr>Inaccessible since %2</nobr> Inaccessible VM tooltip (name, last state change) - <nobr><b>%1</b><br></nobr><nobr>Tidak dapat diakses sejak %2</nobr> + <nobr><b>%1</b><br></nobr><nobr>Tidak dapat diakses sejak %2</nobr> Inaccessible - Tidak dapat diakses + Tidak dapat diakses @@ -19179,7 +19259,7 @@ Click to show/hide the tree view - Klik untuk menampilkan/menyembunikan tilikan pohon + Klik untuk menampilkan/menyembunyikan tilikan pohon Add selected file objects to VISO @@ -19244,11 +19324,11 @@ Choose a virtual hard drive file to copy... - Pilih berkas hard disk virtual yang akan disalin... + Pilih file hard disk virtual yang akan disalin... Hard drive file type - Tipe berkas hard disk + Tipe file hard disk 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. @@ -19284,7 +19364,7 @@ &Split into files of less than 2GB - &Pecah ke dalam berkas kurang dari 2GB + &Pecah ke dalam file kurang dari 2GB Please choose a location for new virtual hard drive file @@ -19832,7 +19912,7 @@ <p>Please choose a format to export the virtual appliance to.</p><p>The <b>Open Virtualization Format</b> supports only <b>ovf</b> or <b>ova</b> extensions. If you use the <b>ovf</b> extension, several files will be written separately. If you use the <b>ova</b> extension, all the files will be combined into one Open Virtualization Format archive.</p><p>The <b>Oracle Cloud Infrastructure</b> format supports exporting to remote cloud servers only. Main virtual disk of each selected machine will be uploaded to remote server.</p> - <p>Harap pilih suatu format tujuan ekspor appliance virtual.</p><p><b>Open Virtualization Format</b> hanya mendukung ekstensi <b>ovf</b> atau <b>ova</b>. <br>Bila Anda memakai ekstensi <b>ovf</b>, beberapa berkas akan ditulis secara terpisah.<br>Bila Anda memakai ekstensi <b>ova</b>, semua berkas akan dikombinasikan ke dalam satu arsip Open Virtualization Format.</p><p>Format <b>Oracle Cloud Infrastructure</b> mendukung mengekspor ke server cloud remote saja. Disk virtual utama dari setiap mesin yang dipilih akan diunggah ke server remote.</p> + <p>Harap pilih suatu format tujuan ekspor appliance virtual.</p><p><b>Open Virtualization Format</b> hanya mendukung ekstensi <b>ovf</b> atau <b>ova</b>. <br>Bila Anda memakai ekstensi <b>ovf</b>, beberapa berkas akan ditulis secara terpisah.<br>Bila Anda memakai ekstensi <b>ova>, semua berkas akan dikombinasikan ke dalam satu arsip Open Virtualization Format.</p><p>Format <b>Oracle Cloud Infrastructure</b> mendukung mengekspor ke server cloud remote saja. Disk virtual utama dari setiap mesin yang dipilih akan diunggah ke server remote.</p> Choose a file to export the virtual appliance to... @@ -19939,7 +20019,7 @@ UIWizardExportAppPageBasic3 <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> - <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 diizinkan.</p> + <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> Please complete the additional fields like the username, password and the bucket, and provide a filename for the OVF target. @@ -19962,7 +20042,7 @@ UIWizardExportAppPageExpert Choose a file to export the virtual appliance to... - Pilih berkas tujuan ekspor appliance virtual... + Pilih file tujuan ekspor appliance virtual... @@ -20044,7 +20124,7 @@ Appliance signed by %1 (expired!) - Appliance ditandatangani oleh %1 (kedaluwarsa!) + Appliance ditandatangani oleh %1 (kedaluarsa!) Unverified signature by %1! @@ -20056,7 +20136,7 @@ Self signed by %1 (expired!) - Tanda tangan sendiri oleh %1 (kedaluwarsa!) + Tanda tangan sendiri oleh %1 (kedaluarsa!) Unverified self signed signature by %1! @@ -20139,7 +20219,7 @@ UIWizardNewCloudVM Create Cloud Machine ... - Ciptakan Mesin Cloud... + Ciptakan Mesin Cloud ... Create Cloud Virtual Machine @@ -20195,7 +20275,7 @@ Acquire cloud images ... - Ambil image cloud ... + Mengambil image cloud ... &Destination: @@ -24333,7 +24413,7 @@ to attach to the currently highlighted slot.</qt> - <qt>Mengizinkan Virtual Disk Manager untuk memilih sebuah hard disk + <qt>Mengijinkan Virtual Disk Manager untuk memilih sebuah hard disk untuk dipasang pada slot yang sedang disorot.</qt>(new line) @@ -26298,7 +26378,7 @@ When checked, allows the guest to send ATAPI commands directly to the host drive which makes it possible to use CD/DVD writers connected to the host inside the VM. Note that writing audio CD inside the VM is not yet supported. - Saat tertandai, mengizinkan guest untuk mengirim perintah ATAPI langsung pada drive host yang memungkinkan penggunaan CD/DVD writer terpasang pada host dalam Mesin Virtual. Perhatikan bahwa menulis CD audio didalam Mesin VIrtual saat ini belum didukung. + Saat tertandai, mengijinkan guest untuk mengirim perintah ATAPI langsung pada drive host yang memungkinkan penggunaan CD/DVD writer terpasang pada host dalam Mesin Virtual. Perhatikan bahwa menulis CD audio didalam Mesin VIrtual saat ini belum didukung. Mounts the specified CD/DVD image to the virtual CD/DVD drive. @@ -26310,7 +26390,7 @@ Holds the image file to mount to the virtual CD/DVD drive and allows to quickly select a different image. - Menampilkan file image untuk dipasang pada CD/DVD virtual dan mengizinkan untuk memilih image yang berbeda secara cepat. + Menampilkan file image untuk dipasang pada CD/DVD virtual dan mengijinkan untuk memilih image yang berbeda secara cepat. Invokes the Virtual Disk Manager to select a CD/DVD image to mount. @@ -26721,7 +26801,7 @@ Holds the virtual hard disk to attach to this IDE slot and allows to quickly select a different hard disk. - Menampilkan hard disk virtual untuk dipasang pada slot IDE ini dan mengizinkan untuk memilih hard disk yang berbeda secara cepat. + Menampilkan hard disk virtual untuk dipasang pada slot IDE ini dan mengijinkan untuk memilih hard disk yang berbeda secara cepat. When checked, mounts the specified media to the CD/DVD drive of the virtual machine. Note that the CD/DVD drive is always connected to the Secondary Master IDE controller of the machine. @@ -26729,7 +26809,7 @@ Holds the image file to mount to the virtual CD/DVD drive and allows to quickly select a different image. - Menampilkan file image untuk dipasang pada CD/DVD virtual dan mengizinkan untuk memilih image yang berbeda secara cepat. + Menampilkan file image untuk dipasang pada CD/DVD virtual dan mengijinkan untuk memilih image yang berbeda secara cepat. When checked, mounts the specified media to the Floppy drive of the virtual machine. @@ -26737,7 +26817,7 @@ Holds the image file to mount to the virtual Floppy drive and allows to quickly select a different image. - Menampilkan file image untuk dipasang pada Floppy virtual dan mengizinkan untuk memilih image yang berbeda secara cepat. + Menampilkan file image untuk dipasang pada Floppy virtual dan mengijinkan untuk memilih image yang berbeda secara cepat. When checked, a virtual PCI audio card will be plugged into the virtual machine and will communicate with the host audio system using the specified driver. @@ -26745,7 +26825,7 @@ 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. - Saat tertandai, mesin virtual akan bertindak sebagai server Remote Desktop Protocol (RDP), mengizinkan client jarak jauh untuk terhubung dan mengendalikan mesin virtual (saat berjalan) menggunakan client RDP standar. + Saat tertandai, mesin virtual akan bertindak sebagai server Remote Desktop Protocol (RDP), mengijinkan client jarak jauh untuk terhubung dan mengendalikan mesin virtual (saat berjalan) menggunakan client RDP standar. <qt>%1&nbsp;MB</qt> @@ -26934,7 +27014,7 @@ When checked, allows the guest to send ATAPI commands directly to the host drive which makes it possible to use CD/DVD writers connected to the host inside the VM. Note that writing audio CD inside the VM is not yet supported. - Saat tertandai, mengizinkan guest untuk mengirim perintah ATAPI langsung pada drive host yang memungkinkan penggunaan CD/DVD writer terpasang pada host dalam Mesin Virtual. Perhatikan bahwa menulis CD audio didalam Mesin VIrtual saat ini belum didukung. + Saat tertandai, mengijinkan guest untuk mengirim perintah ATAPI langsung pada drive host yang memungkinkan penggunaan CD/DVD writer terpasang pada host dalam Mesin Virtual. Perhatikan bahwa menulis CD audio didalam Mesin VIrtual saat ini belum didukung. &Server Port @@ -27301,7 +27381,7 @@ Holds the image file to mount to the virtual Floppy drive and allows to quickly select a different image. - Menampilkan file image untuk dipasang pada Floppy virtual dan mengizinkan untuk memilih image yang berbeda secara cepat. + Menampilkan file image untuk dipasang pada Floppy virtual dan mengijinkan untuk memilih image yang berbeda secara cepat. Invokes the Virtual Disk Manager to select a Floppy image to mount. @@ -27312,7 +27392,7 @@ VBoxVMSettingsVRDP 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. - Saat tertandai, mesin virtual akan bertindak sebagai server Remote Desktop Protocol (RDP), mengizinkan client jarak jauh untuk terhubung dan mengendalikan mesin virtual (saat berjalan) menggunakan client RDP standar. + Saat tertandai, mesin virtual akan bertindak sebagai server Remote Desktop Protocol (RDP), mengijinkan client jarak jauh untuk terhubung dan mengendalikan mesin virtual (saat berjalan) menggunakan client RDP standar. &Enable VRDP Server diff -Nru virtualbox-hwe-6.1.34-dfsg/src/VBox/Frontends/VirtualBox/nls/VirtualBox_it.ts virtualbox-hwe-6.1.38-dfsg/src/VBox/Frontends/VirtualBox/nls/VirtualBox_it.ts --- virtualbox-hwe-6.1.34-dfsg/src/VBox/Frontends/VirtualBox/nls/VirtualBox_it.ts 2022-03-22 23:44:34.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/src/VBox/Frontends/VirtualBox/nls/VirtualBox_it.ts 2022-09-01 13:27:59.000000000 +0000 @@ -3094,6 +3094,10 @@ Primary Group Gruppo primario + + Storage Controller (VirtioSCSI) + + UIApplianceImportEditorWidget @@ -4505,27 +4509,27 @@ Undefined GuestSessionStatus - Non definita + Non definita Starting GuestSessionStatus - In avvio + In avvio Started GuestSessionStatus - Avviata + Avviata Terminating GuestSessionStatus - In chiusura + In chiusura Terminated GuestSessionStatus - Terminata + Terminata TimedOutKilled @@ -4540,12 +4544,12 @@ Down GuestSessionStatus - Giù + Giù Error GuestSessionStatus - Errore + Errore Undefined @@ -4635,22 +4639,22 @@ IDE Primary Device 0 StorageSlot - IDE master primario + Dispositivo IDE primario 0 IDE Primary Device 1 StorageSlot - IDE slave primario + Dispositivo IDE primario 1 IDE Secondary Device 0 StorageSlot - IDE master secondario + Dispositivo IDE secondario 0 IDE Secondary Device 1 StorageSlot - IDE slave secondario + Dispositivo IDE secondario 1 SATA Port %1 @@ -4790,7 +4794,7 @@ Bridget Adapter - Scheda con bridge + Scheda con bridge Internal Network @@ -5357,6 +5361,24 @@ NetworkAttachmentType Rete cloud [SPERIMENTALE] + + Timed Out (Killed) + GuestSessionStatus + + + + Timed Out (Abnormally) + GuestSessionStatus + + + + Bridged Adapter + Scheda con bridge + + + Cloud Network + Rete Cloud + UICustomFileSystemModel @@ -7301,6 +7323,14 @@ No Guest Session found!<br>Please use the Session Panel to start a new guest session Nessuna sessione guest trovata!<br>Utilizza il pannello Sessioni per iniziare una nuova sessione del guest + + Close dialog without saving + Chiudi la finestra senza salvare + + + Reset Changes (%1) + Ripristina modifiche (%1) + UIFileManagerLogViewer @@ -14837,7 +14867,7 @@ The hardware virtualization is enabled in the Acceleration section of the System page although it is not supported by the host system. It should be disabled in order to start the virtual system. - La virtualizzazione hardware è abilitata nella sezione Accelerazione della pagina Sistema nonostante non sia supportata dal sistema guest. Dovrebbe essere disabilitata per avviare il sistema virtuale. + La virtualizzazione hardware è abilitata nella sezione Accelerazione della pagina Sistema nonostante non sia supportata dal sistema guest. Dovrebbe essere disabilitata per avviare il sistema virtuale. When checked, the nested hardware virtualization CPU feature will be exposed to the virtual machine. @@ -18158,15 +18188,15 @@ Failed to open the medium with following ID: <nobr><b>%1</b></nobr>. - Apertura non riuscita del supporto con il seguente ID: <nobr><b>%1</b></nobr>. + Apertura non riuscita del supporto con il seguente ID: <nobr><b>%1</b></nobr>. Failed to acquire attachment parameter. - Acquisizione del parametro del collegamento non riuscito. + Acquisizione del parametro del collegamento non riuscito. Failed to acquire medium attribute. - Acquisizione del parametro del supporto non riuscito. + Acquisizione del parametro del supporto non riuscito. Failed to create cloud machine. diff -Nru virtualbox-hwe-6.1.34-dfsg/src/VBox/Frontends/VirtualBox/nls/VirtualBox_ja.ts virtualbox-hwe-6.1.38-dfsg/src/VBox/Frontends/VirtualBox/nls/VirtualBox_ja.ts --- virtualbox-hwe-6.1.34-dfsg/src/VBox/Frontends/VirtualBox/nls/VirtualBox_ja.ts 2022-03-22 23:44:34.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/src/VBox/Frontends/VirtualBox/nls/VirtualBox_ja.ts 2022-09-01 13:27:59.000000000 +0000 @@ -2918,6 +2918,10 @@ Primary Group プライマリグループ + + Storage Controller (VirtioSCSI) + + UIApplianceImportEditorWidget @@ -4139,7 +4143,7 @@ Starting GuestSessionStatus - 起動中 + 起動中 Starting @@ -4333,7 +4337,7 @@ NAT - Bridget Adapter + Bridged Adapter ブリッジアダプター @@ -4877,22 +4881,22 @@ Undefined GuestSessionStatus - 未定義 + 未定義 Started GuestSessionStatus - 起動中 + 起動中 Terminating GuestSessionStatus - 実行中 + 実行中 Terminated GuestSessionStatus - 終了 + 終了 TimedOutKilled @@ -4908,12 +4912,12 @@ Down GuestSessionStatus - ダウン + ダウン Error GuestSessionStatus - エラー + エラー Undefined @@ -4987,6 +4991,20 @@ NetworkAttachmentType + + Timed Out (Killed) + GuestSessionStatus + + + + Timed Out (Abnormally) + GuestSessionStatus + + + + Cloud Network + クラウドネットワーク + UICustomFileSystemModel @@ -6921,6 +6939,14 @@ セッションパネルでゲストセッションを 起動してください + + Close dialog without saving + 保存しないでダイアログを閉じる + + + Reset Changes (%1) + + UIFilePathSelector @@ -13979,7 +14005,7 @@ The hardware virtualization is enabled in the Acceleration section of the System page although it is not supported by the host system. It should be disabled in order to start the virtual system. - システム設定ページのアクセラレーションセクションでハードウェア仮想化が有効になっていますが、このホストシステムではサポートされていません。仮想システムを起動するには無効にする必要があります。 + システム設定ページのアクセラレーションセクションでハードウェア仮想化が有効になっていますが、このホストシステムではサポートされていません。仮想システムを起動するには無効にする必要があります。 When checked, the nested hardware virtualization CPU feature will be exposed to the virtual machine. @@ -17176,15 +17202,15 @@ Failed to open the medium with following ID: <nobr><b>%1</b></nobr>. - 次のIDのメディアを開くことができませんでした: <nobr><b>%1</b></nobr>。 + 次のIDのメディアを開くことができませんでした: <nobr><b>%1</b></nobr>。 Failed to acquire attachment parameter. - 属性パラメーターの確保に失敗しました。 + 属性パラメーターの確保に失敗しました。 Failed to acquire medium attribute. - メディア属性の確保に失敗しました。 + メディア属性の確保に失敗しました。 Failed to create cloud machine. @@ -25381,7 +25407,7 @@ NAT - Bridget Adapter + Bridged Adapter ブリッジアダプター diff -Nru virtualbox-hwe-6.1.34-dfsg/src/VBox/Frontends/VirtualBox/nls/VirtualBox_ka.ts virtualbox-hwe-6.1.38-dfsg/src/VBox/Frontends/VirtualBox/nls/VirtualBox_ka.ts --- virtualbox-hwe-6.1.34-dfsg/src/VBox/Frontends/VirtualBox/nls/VirtualBox_ka.ts 1970-01-01 00:00:00.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/src/VBox/Frontends/VirtualBox/nls/VirtualBox_ka.ts 2022-09-01 13:27:59.000000000 +0000 @@ -0,0 +1,12212 @@ + + + + + @@@ + + English + Native language name + ქართული + + + -- + Native language country name (empty if this language is for all countries) + -- + + + English + Language name, in English + Georgian + + + -- + Language country name, in English (empty if native country name is empty) + -- + + + Oracle Corporation + Comma-separated list of translators + თემური დოღონაძე + + + + QApplication + + Executable <b>%1</b> requires Qt %2.x, found Qt %3. + გამშვები ფაილი <b>%1</b> მოითხოვს Qt %2.x-ს, ნაპოვნია Qt %3-ი. + + + Incompatible Qt Library Error + Qt ბიბლიოთეკის შეუთავსებლობა + + + VirtualBox - Error In %1 + VirtualBox - შეცდომა %1-ში + + + <html><b>%1 (rc=%2)</b><br/><br/> + <html><b>%1 (rc=%2)</b><br/><br/> + + + Please try reinstalling VirtualBox. + სცადეთ თავიდან დააყენოთ VirtualBox-ი. + + + Make sure the kernel module has been loaded successfully. + დარწმუნდით, რომ ბირთვის მოდული წარმატებით ჩაიტვირთა. + + + VirtualBox - Runtime Error + VirtualBox - გაშვების შეცდომა + + + <b>Cannot access the kernel driver!</b><br/><br/> + <b>ბირთვის დრაივერთან წვდომა შეუძლებელია!</b><br/><br/> + + + Unknown error %2 during initialization of the Runtime + გამშვები ფაილების ინიციალიზაციის უცნობი შეცდომა: %2 + + + Kernel driver not accessible + ბირთვის დრაივერი მიუწვდომელია + + + 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. + VirtualBox-ის ბირთვის მოდულები არ ემთხვევა VirtualBox-ის ამ ვერსიას. როგორც ჩანს, დაყენება მხოლოდ ნაწილობრივ იყო წარმატებული. სცადეთ სრულად წაშალოთ და თავიდან დააყენოთ VirtualBox-ი. + + + This error means that the kernel driver was either not able to allocate enough memory or that some mapping operation failed. + ბირთვის დრაივერის მეხსიერებასთან მუშაობის პრობლემა. + + + The VirtualBox Linux kernel driver is either not loaded or not set up correctly. Please try setting it up again by executing<br/><br/> <font color=blue>'/sbin/vboxconfig'</font><br/><br/>as root.<br/><br/>If your system has EFI Secure Boot enabled you may also need to sign the kernel modules (vboxdrv, vboxnetflt, vboxnetadp, vboxpci) before you can load them. Please see your Linux system's documentation for more information. + + + + 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>'/sbin/vboxconfig'</font><br/><br/>may correct this. Make sure that you are not mixing builds of VirtualBox from different sources. + + + + + QIArrowButtonPress + + &Back + &უკან + + + &Next + &შემდეგი + + + + QIArrowSplitter + + &Details + &დეტალები + + + &Details (%1 of %2) + დ&ეტალები (%1 %2-დან) + + + + QIInputDialog + + Name: + სახელი: + + + + QILabel + + &Copy + &კოპირება + + + + QIMessageBox + + Copy all errors to the clipboard + ყველა შეცდომის ბაფერში კოპირება + + + OK + დიახ + + + Cancel + გაუქმება + + + Yes + დიახ + + + No + არა + + + Copy + კოპირება + + + + SFTreeViewItem + + %1, %2: %3, %4: %5, %6: %7, %8: %9 + col.1 text, col.2 name: col.2 text, col.3 name: col.3 text, col.4 name: col.4 text, col.5 name: col.5 text + %1, %2: %3, %4: %5, %6: %7, %8: %9 + + + Full + მთლიანი + + + Read-only + მხოლოდ წაკითხვა + + + Yes + დიახ + + + + UIActionPool + + Preview Monitor %1 + %1-ე მონიტორის გადახედვა + + + &Connect Network Adapter + &ქსელის ბარათის მიერთება + + + Connect Network Adapter &%1 + ქსელის &%1 ადაპტერის მიერთება + + + No USB Devices Connected + USB მოწყობილობები მიერთებული არაა + + + No supported devices connected to the host PC + ჰოსტზე მხარდაჭერილი მოწყობილობები მიერთებული არაა + + + No Webcams Connected + ვებკამერები მიერთებული არაა + + + No supported webcams connected to the host PC + ჰოსტზე მხარდაჭერილი ვებკამერები მიერთებული არაა + + + &VirtualBox + &VirtualBox + + + &File + &ფაილი + + + &Close... + &დახურვა... + + + Close the virtual machine + ვირტუალური მანქანის დახურვა + + + &Window + &ფანჯარა + + + &Minimize + &ჩაკეცვა + + + Minimize active window + აქტიური ფანჯრის ჩაკეცვა + + + &Help + &დახმარება + + + &Contents... + &შემცველობა... + + + Show help contents + დახმარების ჩვენება + + + &VirtualBox Web Site... + &VirtualBox-ის ვებსაიტი... + + + Open the browser and go to the VirtualBox product web site + ბრაუზერის გახსნა და VirtualBox-ის ვებგვერდზე გადასვლა + + + &VirtualBox Bug Tracker... + V&irtualbox-ის ცნობილი შეცდომები... + + + Open the browser and go to the VirtualBox product bug tracker + ბრაუზერის გახსნა და VirtualBox-ის შეცდომების გვერდზე გადასვლა + + + &VirtualBox Forums... + Vir&tualBox-ის ფორუმები... + + + Open the browser and go to the VirtualBox product forums + ბრაუზერის გახსნა და VirtualBox-ის ფორუმზე გადასვლა + + + &Oracle Web Site... + &Oracle-ის ვებსაიტი... + + + Open the browser and go to the Oracle web site + ბრაუზერს გახსნა და Oracle-ის ვებგვერდზე გადასვლა + + + &Reset All Warnings + &ყველა გაფრთხილების დამალვა + + + Go back to showing all suppressed warnings and messages + ყველა გაჩუმებული გაფრთხილების და შეტყობინების ისევ ჩვენება + + + &Network Operations Manager... + &ქსელური ოპერაციების მმართველი... + + + Display the Network Operations Manager window + ქსელური ოპერაციების მმართველის ფანჯრის ჩვენება + + + C&heck for Updates... + განახ&ლების შემოწმება... + + + Check for a new VirtualBox version + VirtualBox-ის ახალი ვერსიის შემოწმება + + + &About VirtualBox... + Virtual&Box-ის შესახებ... + + + Display a window with product information + პროდუქტის ინფორმაციის შესახებ ფანჯრის გახსნა + + + &Preferences... + global preferences window + &მორგება... + + + Display the global preferences window + გლობალური პარამეტრების ფანჯარა + + + &Log + &ჟურნალი + + + &Find + &ძებნა + + + Log Viewer + ჟურნალის ნახვა + + + Open pane with searching options + ძებნის პარამეტრების მორგება + + + &Filter + &ფილტრი + + + Open pane with filtering options + ფილტრის პარამეტრების მორგება + + + &Bookmark + &სანიშნი + + + Open pane with bookmarking options + სანიშნის პარამეტრების მორგება + + + &Options + &პარამეტრები + + + Open pane with log viewer options + ჟურნალის ნახვის მორგება + + + &Refresh + &განახლება + + + Refresh selected virtual machine log + ვირტუალური მანქანის ჟურნალის მორგება + + + &Save... + &შენახვა... + + + Save selected virtual machine log + მონიშნული ვირტუალური მანქანის ჟურნალის შენახვა + + + File Manager + ფაილების მმართველი + + + Host + ჰოსტი + + + Guest + სტუმარი + + + Copy to guest + სტუმარში კოპირება + + + Copy the selected object(s) from host to guest + მონიშნული ობიექტების ჰოსტიდან სტუმარში კოპირება + + + Copy to host + ჰოსტში კოპირება + + + Copy the selected object(s) from guest to host + მონიშნული ობიექტების სტუმრიდან ჰოსტზე კოპირება + + + Log + ჟურნალი + + + Session + სესია + + + Go one level up to parent folder + მშობელ საქაღალდეში 1 დონით მაღლა ასვლა + + + Go Home + საწყისზე გადასვლა + + + Go to home folder + საწყის გვერდზე გადასვლა + + + Go to Home Folder + საწყის გვერდზე გადასვლა + + + Delete + წაშლა + + + Delete selected file object(s) + მონიშნული ფაილის წაშლა + + + Refresh + განახლება + + + Rename + სახელის გადარქმევა + + + Create New Directory + ახალი საქაღალდის შექმნა + + + Copy + დააკოპირე + + + Copy selected file object(s) + მონიშნული ფაილების კოპირება + + + Cut + ამოჭრა + + + Cut selected file object(s) + მონიშნული ფაილების ამოჭრა + + + Paste + ჩასმა + + + Paste copied/cut file object(s) + კოპირებული/ამოჭრილი ფაილების ჩასმა + + + Select All + ყველაფრის მონიშვნა + + + Select all files objects + ყველა ფაილის მონიშვნა + + + Invert Selection + მონიშვნის ინვერსია + + + Invert the current selection + მონიშვნის ინვერსია + + + Show Properties + თვისებების ჩვენება + + + Show the properties of currently selected file object(s) + ამჟამად მონიშნული ფაილების თვისებების ჩვენება + + + &File + Mac OS X version + &ფაილი + + + &File + Non Mac OS X version + &ფაილი + + + &Virtual Media Manager... + &ვირტუალური მედიის მმართველი... + + + Display the Virtual Media Manager window + ვირტუალური მედიის მმართველის ფანჯარა + + + &Host Network Manager... + &ჰოსტის ქსელების მმართველი... + + + Display the Host Network Manager window + ჰოსტის ქსელური ოპერაციების მმართველის ფანჯრის ჩვენება + + + &Cloud Profile Manager... + &ღრუბლოვანი პროფილის მმართველი... + + + Display the Cloud Profile Manager window + &ღრუბლოვანი პროფილის მმართველი + + + Import + შემოტანა + + + &Import Appliance... + &შეკუმშული მანქანის შემოტანა... + + + Import an appliance into VirtualBox + შეკუმშული მანქანის შემოტანა + + + Export + გატანა + + + &Export Appliance... + &შეკუმშული მანქანის გატანა... + + + Export one or more VirtualBox virtual machines as an appliance + VirtualBox-ის ერთი ან მეტი ვირტუალური მანქანის შეკუმშულად გატანა + + + E&xtra Data Manager... + &დამატებითი მონაცემების მმართველი... + + + Display the Extra Data Manager window + დამატებითი მონაცემების მმართველის ფანჯრის ჩვენება + + + E&xit + გას&ვლა + + + Close application + აპლიკაციის დახურვა + + + &Group + &ჯგუფი + + + &New Machine... + &ახალი მანქანა... + + + Create new virtual machine + ახალი ვირტუალური მანქანის შექმნა + + + &Add Machine... + &მანქანის დამატება... + + + Add existing virtual machine + არსებული ვირტუალური მანქანის დამატება + + + Rena&me Group... + &ჯგუფის გადარქმევა... + + + Rename selected virtual machine group + ვირტუალური მანქანების მონიშნული ჯგუფის გადარქმევა + + + &Ungroup + &განჯგუფება + + + Ungroup items of selected virtual machine group + ვირტუალურიმანქანის მონიშნული ჯგუფის განჯგუფება + + + &Sort + &დალაგება + + + Sort items of selected virtual machine group alphabetically + მონიშნული ვირტუალური მანქანების ანბანის მიხედვით დალაგება + + + &Machine + &მანქანა + + + &New... + &ახალი... + + + &Add... + &დამატება.. + + + Gro&up + &დაჯგუფება + + + Add new group based on selected virtual machines + მონიშნული ვირტუალური მანქანებისგან ჯგუფის შექმნა + + + &Settings... + &გამართვა... + + + Display the virtual machine settings window + ვირტუალური მანქანების პარამეტრების ფანჯარა + + + Cl&one... + &კლონირება... + + + Clone selected virtual machine + მონიშნული ვირტუალური მანქანის კლონირება + + + &Move... + &გადატანა... + + + Move selected virtual machine + მონიშნული ვირტუალური მანქანის გადატანა + + + &Remove... + &წაშლა... + + + Remove selected virtual machines + მონიშნული ვირტუალური მანქანების წაშლა + + + Sort group of first selected virtual machine alphabetically + მონიშნული ვირტუალური მანქანების ანბანის მიხედვით დალაგება + + + S&tart + &გაშვება + + + Start selected virtual machines + მონიშნული ვირტუალური მანქანების გაშვება + + + S&how + &ჩვენება + + + Switch to the windows of selected virtual machines + მონიშნული ვირტუალური მანქანების ფანჯრებზე გადასვლა + + + &Normal Start + &ნორმალური გაშვება + + + &Headless Start + &უთავო გაშება + + + Start selected virtual machines in the background + მონიშნული ვირტუალური მანქანების ფონურად გაშვება + + + &Detachable Start + &მოხსნადი გაშვება + + + Start selected virtual machines with option of continuing in background + მონიშნული ვირტუალური მანქანების ფონურად გაშვების შესაძლებლობით შესრულება + + + &Pause + &შეყოვნება + + + Suspend execution of selected virtual machines + მონიშნული ვირტუალური მანქანების შესრულების შეჩერება + + + &Reset + თავიდან ჩა&რთვა + + + Reset selected virtual machines + მონიშნული ვირტუალური მანქანების თავდან გაშვება + + + Discard + მოცილება + + + D&iscard Saved State... + შენახული მდგომარეობის მოცილება... + + + Discard saved state of selected virtual machines + ვირტუალური მანქანების შენახული მდგომარეობის მონაცემების მოცილება + + + Show &Log... + &ჟურნალის ჩვენება ... + + + Show log files of selected virtual machines + მონიშნული ვირტუალური მანქანების ჟურნალის ფაილების ნახვა + + + Re&fresh + &განახლება + + + Refresh accessibility state of selected virtual machines + მონიშნული ვირტუალური მანქანების წვდომადობის მდგომარეობის განახლება + + + S&how in Finder + &Explorer-ში ჩვენება + + + Show the VirtualBox Machine Definition files in Finder + ვირტუალური მანქანის აღწერის ფაილების Finder-ში ჩვენება + + + S&how in Explorer + &Explorer-ში ჩვენება + + + Show the VirtualBox Machine Definition files in Explorer + ვირტუალური მანქანის აღწერის ფაილების Explorer-ში ჩვენება + + + S&how in File Manager + &ფაილების მმართველში ჩვენება + + + Show the VirtualBox Machine Definition files in the File Manager + ვირტუალური მანქანის აღწერის ფაილების ფაილების მმართველში ჩვენება + + + Cr&eate Alias on Desktop + &სამუშაო მაგიდაზე მალსახმობის შექმნა + + + Create alias files to the VirtualBox Machine Definition files on your desktop + სამუშაო მაგიდაზე ვირტუალური მანქანის აღწერის ფაილებამდე ბმულის შექმნა + + + Cr&eate Shortcut on Desktop + &სამუშაო მაგიდაზე მალსახმობის შექმნა + + + Create shortcut files to the VirtualBox Machine Definition files on your desktop + სამუშაო მაგიდაზე ვირტუალური მანქანის აღწერის ფაილებამდე ბმულის შექმნა + + + &Close + &დახურვა + + + &Detach GUI + &GUI-ის მოხსნა + + + Detach the GUI from headless VM + უთავო ვმ-ის ინტერფეისიადნ ინტერფეისიდან მოხსნა + + + &Save State + მდ&გომარეობის შენახვა + + + Save state of selected virtual machines + მონიშნული ვირტუალური მანქანების მდგომარეობის შენახვა + + + ACPI Sh&utdown + ACPI გამორთვა + + + Send ACPI Shutdown signal to selected virtual machines + ვირტუალური მანქანისთვის ACPI გამორთვის სიგნალის გაგზავნა + + + Po&wer Off + გ&ამორთვა + + + Power off selected virtual machines + მონიშნული ვირტუალური მანქანების გამორთვა + + + &Details + &დეტალები + + + Open the machine details pane + მაქანის დეტალების პანელის გახსნა + + + &Snapshots + ს&წრაფი ასლები + + + Open the machine snapshots pane + ვირტუალური მანქანის სწრაფი ასლების პანელის გახსნა + + + &Logs + &ჟურნალები + + + Open the machine logs pane + ვირტუალური მანქანის ჟურნალის პანელის გახსნა + + + &Global Tools Menu + &გლობალური ხელსაწყოების მენიუ + + + &Virtual Media Manager + &ვირტუალური მედიის მმართველი + + + Open the Virtual Media Manager + ვირტუალური მედიის მმართველის გახსნა + + + &Host Network Manager + &ჰოსტის ქსელების მმართველი + + + Open the Host Network Manager + ჰოსტის ქსელური ოპერაციების მმართველის გახსნა + + + &Cloud Profile Manager + &ღრუბლოვანი პროფილის მმართველი + + + Open the Cloud Profile Manager + ღრუბლოვანი პროფილის მმართველის გახსნა + + + &Snapshot + ს&წრაფი ასლი + + + &Take... + ა&ღება... + + + Snapshot Pane + სწრაფი ასლის ზოლი + + + Take a snapshot of the current virtual machine state + ვირტუალური მანქანის მიმდინარე მდგომარეობის სწრაფი ასლის აღება + + + &Delete... + &წაშლა... + + + Delete selected snapshot of the virtual machine + ვირტუალური მანქანის ყველა სწრაფი ასლის წაშლა + + + &Restore... + ა&დგენა... + + + Restore selected snapshot of the virtual machine + ვირტუალური მანქანის მონიშნული სწრაფი ასლის აღდგენა + + + &Properties + &თვისებები + + + Open pane with the selected snapshot properties + მონიშნული სწრაფი ასლის თვისებების პანელის გახსნა + + + &Clone... + &კლონირება... + + + &Medium + &საშუალო + + + Media Manager + მედიის მმართველი + + + &Copy... + &კოპირება... + + + Re&lease... + &რელიზი... + + + Re&fresh... + &განახლება... + + + &Network + &ქსელი + + + &Create... + &შექმნა... + + + Network Manager + ქსელის მმართველი + + + Create new host-only network + მხოლოდ-ჰოსტის ახალ ქსელის შექმნა + + + Remove selected host-only network + მონიშნული მხოლოდ-ჰოსტის ქსელის წაშლა + + + Open pane with selected host-only network properties + მხოლოდ-ჰოსტის ქსელის თვისებების პანელის გახსნა + + + Refresh the list of host-only networks + მხოლოდ-ჰოსტის ქსელების სიის განახლება + + + &Cloud + &ღრუბელი + + + Add + დამატება + + + &Add Profile... + &პროფილის დამატება... + + + Cloud Profile Manager + ღრუბლოვანი პროფილის მმართველი + + + Add new cloud profile + ღრუბლის ახალი პროფილის დამატება + + + &Import Profiles... + &პროფილების შემოტანა... + + + Import the list of cloud profiles from external files + ღრუბლოვანი პროფილების გარე ფაილებიდან შემოტანა + + + Remove + წაშლა + + + &Remove Profile... + &პროფილის წაშლა... + + + Remove selected cloud profile + მონიშნული ღრუბლოვანი პროფილის წაშლა + + + Properties + თვისებები + + + Profile &Properties + პროფილის &თვისებები + + + Open pane with selected cloud profile properties + ღრუბლოვანი პროფილის თვისებების პანელის გახსნა + + + Help + დახმარება + + + &Show Help... + &დახმარების ჩვენება... + + + Show cloud profile help + ღრუბლოვანი პროფილის დახმარების ჩვენება + + + Take Sn&apshot... + სწრაფი ას&ლის აღება... + + + Take a snapshot of the virtual machine + ვირტუალური მანქანის სწრაფი ასლის აღება + + + Session I&nformation... + სესიის &ინფორმაცია... + + + Display the virtual machine session information window + ვირტუალური მანქანის სესიის ინფორმაციის ფანჯრის ჩვენება + + + File Manager... + ფაილების მმართველი... + + + Suspend the execution of the virtual machine + ვირტუალური მანქანების შესრულების შეჩერება + + + Reset the virtual machine + ვირტუალური მანქანის თავიდან გაშვება + + + Save the state of the virtual machine + ვირტუალური მანქანის მდგომარეობის შენახვა + + + Send the ACPI Shutdown signal to the virtual machine + ვირტუალური მანქანისთვის ACPI გამორთვის სიგნალის გაგზავნა + + + Power off the virtual machine + ვირტუალური მანქანის გამორთვა + + + &View + &ნახვა + + + &Full-screen Mode + &მთელ-ეკრანზე + + + Switch between normal and full-screen mode + ნორმალურსა და მთელს-ეკრანზე რეჟიმებს შორის გადართვა + + + Seam&less Mode + &შეუმჩნეველი რეჟიმი + + + Switch between normal and seamless desktop integration mode + სამუშაო მაგიდის ინტერგრაციის ნორმალურსა და დამალულ რეჟიმებს შორის გადართვა + + + S&caled Mode + &გადიდებული რეჟიმი + + + Switch between normal and scaled mode + ნორმალურსა და გადიდებულ რეჟიმებს შორის გადართვა + + + &Minimize Window + &ფანჯრის ჩაკეცვა + + + &Adjust Window Size + ფანჯრის &ზომის გასწორება + + + Adjust window size and position to best fit the guest display + ფანჯრის ზომისა და მდებარეობის სტუმრის ეკრანზე საუკეთესოდ მოსარგებად შეცვლა + + + Auto-resize &Guest Display + &სტუმრის ეკრანის ზომის ავტომატური შეცვლა + + + Automatically resize the guest display when the window is resized + ფანჯრის ზომის შეცვლისას სტუმრის ეკრანის ზომის ავტომატური შეცვლა + + + Take Screensh&ot... + &ეკრანის ანაბეჭდის აღება... + + + Take guest display screenshot + სტუმრის ეკრანის ანაბეჭდის აღება + + + &Recording + &ჩაწერა + + + &Recording Settings... + &ჩაწერის მორგება... + + + Display virtual machine settings window to configure video/audio recording + ვმ-ის ვიდეო/აუდიო ჩანაწერის მოსარგები ფანჯრის გახსნა + + + Enable guest video/audio recording + სტუმრის აუდიო/ვიდეოს ჩაწერა + + + R&emote Display + &დაშორებული ეკრანი + + + Allow remote desktop (RDP) connections to this machine + ამ მანქანაზე RDP-ით დაკავშირების დაშვება + + + &Menu Bar + &მენიუს ზოლი + + + &Menu Bar Settings... + &მენიუს ზოლის მორგება... + + + Display window to configure menu-bar + მენიუს ზოლის მორგების ფანჯრის გახსნა + + + Show Menu &Bar + მენიუს &ზოლის ჩვენება + + + Enable menu-bar + მენიუს ზოლის ჩართვა + + + &Status Bar + &სტატუსის ზოლი + + + &Status Bar Settings... + &სტატუსის ზოლის მორგება... + + + Display window to configure status-bar + სტატუსის ზოლის მორგების ფანჯრის გახსნა + + + Show Status &Bar + მენიუს &ზოლის ჩვენება + + + Enable status-bar + სტატუსის ზოლის ჩართვა + + + &Input + &შეყვანა + + + &Keyboard + &კლავიატურა + + + &Keyboard Settings... + კლავიატურის მო&რგება... + + + Display global preferences window to configure keyboard shortcuts + გლობალური პარამეტრების ფანჯრის გახსნა მალსახმობების მოსარგებად + + + &Insert %1 + that means send the %1 key sequence to the virtual machine + %1-ის &ჩასმა + + + Send the %1 sequence to the virtual machine + ღილაკების მიმდევრობის %1 ვირტუალური მანქანისთვის გაგზავნა + + + &Mouse + &თაგუნა + + + &Mouse Integration + თ&აგუნას ინტეგრაცია + + + Enable host mouse pointer integration + ჰოსტის თაგუნას მაჩვენებლის ინტეგრაცია + + + &Devices + მოწყობ&ილობები + + + &Hard Disks + &მყარი დისკები + + + &Hard Disk Settings... + მყარი დი&სკის პარამეტრები... + + + Display virtual machine settings window to configure hard disks + ვირტუალური მანქანის მორგების ფანჯრის ჩვენება მყარი დისკების კონფიგურაციისათვის + + + &Optical Drives + &ოპტიკური დისკები + + + &Floppy Drives + დის&კეტები + + + &Audio + &აუდიო + + + Audio Output + აუდიო გამოტანა + + + Enable audio output + აუდიო გამოტანის ჩართვა + + + Audio Input + აუდიო შეტანა + + + Enable audio input + აუდიო შეტანის ჩართვა + + + &Network Settings... + &ქსელის მორგება... + + + Display virtual machine settings window to configure network adapters + ვირტუალური მანქანის მორგების ფანჯრის ჩვენება ქსელის ბარათების კონფიგურაციისათვის + + + &USB + &USB + + + &USB Settings... + U&SB-ის მორგება... + + + Display virtual machine settings window to configure USB devices + ვირტუალური მანქანის მორგების ფანჯრის ჩვენება USB მოწყობილობების კონფიგურაციისათვის + + + &Webcams + &ვებკამერები + + + Shared &Clipboard + &გაზიარებული ბუფერი + + + &Drag and Drop + გადათრე&ვა და გაშვება + + + &Shared Folders + გაზიარებული საქაღალდე&ები + + + &Shared Folders Settings... + გაზია&რებული საქაღალდეების მორგება... + + + Display virtual machine settings window to configure shared folders + ვირტუალური მანქანის მორგების ფანჯრის ჩვენება გაზიარებული საქაღალდეების კონფიგურაციისათვის + + + &Insert Guest Additions CD image... + &სტუმრის დამატებების დისკის ჩადება... + + + Insert the Guest Additions disk file into the virtual optical drive + სტუმრის დამატებების დისკის ჩადება ვირტუალურ მატარებელში + + + De&bug + გა&მართვა + + + &Statistics... + debug action + &სტატისტიკა... + + + &Command Line... + debug action + ბრძა&ნების სტრიქონი... + + + &Logging + debug action + &ჟურნალი + + + Show &Log... + debug action + &ჟურნალის ჩვენება ... + + + Dock Icon + მიმაგრების ხატულა + + + Show Monitor Preview + ეკრანის გადახედვის ჩვენება + + + Show Application Icon + აპლიკაციის ხატულის ჩვენება + + + Disable Dock Icon Overlay + მიაგრების ხატულის განლაგების გამორთვა + + + Scale to %1% + scale-factor + %1%-მდე გადიდება + + + Scale to %1% (unscaled output) + scale-factor + %1%-მდე გადიდება (გაუდიდებელი გამოტანა) + + + Scale to %1% (autoscaled output) + scale-factor + %1%-მდე გადიდება (ავტომატური გადიდება) + + + Enable + Virtual Screen + ჩართვა + + + Resize to %1x%2 + Virtual Screen + ზომის შეცვლა %1x%2-მდე + + + Popup Menu + მხტუნავი მენიუ + + + Options + მორგება + + + Open panel with file manager options + ფაილების მმართველის პარამეტრების შემცველი პანელის გახსნა + + + Open panel with file manager log + ფაილების მმართველის ჟურნალის შემცველი პანელის გახსნა + + + Operations + ოპერაციები + + + Open panel with file manager operations + ფაილების მმართველის ოპერაციების შემცველი პანელის გახსნა + + + Open panel with file manager session + ფაილების მმართველის სესიების შემცველი პანელის გახსნა + + + Go Up + მაღლა ასვლა + + + Display the virtual machine file manager window + ვირტუალური მანქანის ფაილების მმართველის ფანჯრის ჩვენება + + + Tools + ხელსაწყოები + + + E&xport to OCI... + &OCI-ში გატანა... + + + Export selected virtual machine to OCI + მონიშნული ვირტუალური მანქანის OCI-ში გატანა + + + Try + ცდა + + + &Try Oracle Cloud for Free... + &სცადეთ Oracle Cloud უფასოდ... + + + Try Oracle cloud for free + სცადეთ Oracle Cloud უფასოდ + + + Try Oracle Cloud for Free + სცადეთ Oracle Cloud უფასოდ + + + Display Global Preferences + გლობალური პარამეტრების ჩვენება + + + Open Find Pane + ძებნის პანელის ჩვენება + + + Open Filter Pane + ფილტრის პანელის ჩვენება + + + Open Bookmark Pane + სანიშნების პანელის ჩვენება + + + Open Options Pane + პარამეტრების პანელის ჩვენება + + + Refresh Virtual Machine Log + ვირტუალური მანქანის ჟურნალის განახლება + + + Save Virtual Machine Log + ვირტუალური მანქანის ჟურნალის შენახვა + + + Copy from Host to Guest + კოპირება ჰოსტიდან სტუმრამდე + + + Copy from Guest to Host + კოპირება სტუმრიდან ჰოსტამდე + + + Open Log Pane + ჟურნალის პანელის გახსნა + + + Open Operations Pane + ოპერაციების პანელის გახსნა + + + Open Session Pane + სესიების პანელის გახსნა + + + Go One Level Up + 1 დონით მაღლა ასვლა + + + Delete Selected Object(s) + მონიშნული ობიექტების წაშლა + + + Refresh Contents + შემცველობის განახლება + + + Rename selected file object + მონიშნული ფაილის გადარქმევა + + + Rename Selected Object + მონიშნული ობიექტის გადარქმევა + + + Copy Selected Object(s) + მონიშნული ობიექტების კოპირება + + + Cut Selected Object(s) + მონიშნული ობიექტების ამოჭრა + + + Paste Copied/Cut Object(s) + კოპირებული/ამოჭრილი ობიექტების ჩასმა + + + Select All Objects + ყველა ობიექტის მონიშვნა + + + Invert Current Selection + მონიშვნის ინვერსია + + + Show Properties of Current Object(s) + მიმდინარე ობიექტების თვისებების ჩვენება + + + &New Cloud VM... + &ახალი ღრუბლოვანი ვმ-ი... + + + Create new cloud virtual machine + ახალი ღრუბლოვანი ვირტუალური მანქანის შექმნა + + + E&xport Locally... + &ლოკალურად გატანა... + + + Export selected virtual machine locally + მონიშნული ვირტუალური მანქანის ლოკალურად გატანა + + + S&earch + &ძებნა + + + Search virtual machines with respect to a search term + ძებნის სტრიქონით ვირტუალური მანქანების მოძებნა + + + Take Snapshot + სწრაფი ასლის აღება + + + Delete Snapshot + სწრაფი ასლის წაშლა + + + Restore Snapshot + სწრაფი ასლის აღდგენა + + + Open Snapshot Properties + სწრაფი ასლის თვისებები + + + Clone Virtual Machine + ვირტუალური მანქანის კლონირება + + + Add a disk image + დისკის გამოსახულების დამატება + + + Add Disk Image + დისკის გამოსახულების დამატება + + + Create a new disk image + დისკის ახალი გამოსახულების შექმნა + + + Create Disk Image + დისკის ახალი გამოსახულების შექმნა + + + Copy selected disk image + დისკის მონიშნული გამოსახულების კოპირება + + + Copy Disk Image + დისკის მონიშნული გამოსახულების კოპირება + + + Move selected disk image + დისკის მონიშნული გამოსახულების გადატანა + + + Move Disk Image + დისკის მონიშნული გამოსახულების გადატანა + + + Remove selected disk image + დისკის მონიშნული გამოსახულების წაშლა + + + Remove Disk Image + დისკის მონიშნული გამოსახულების წაშლა + + + Release selected disk image + დისკის მონიშნული გამოსახულების გათავისუფლება + + + Release Disk Image + დისკის მონიშნული გამოსახულების გათავისუფლება + + + Open pane with selected disk image properties + მონიშნული დისკის გამოსახულების თვისებების პანელის გახსნა + + + Open Disk Image Properties + დისკის გამოსახულების თვისებების გახსნა + + + &Search + &ძებნა + + + Open the disk image search pane + დისკის გამოსახულების ძებნის პანელის ჩვენება + + + Open Disk Image Search Pane + დისკის გამოსახულების ძებნის პანელის ჩვენება + + + Refresh the list of disk images + დისკის გამოსახულებების სიის ჩვენება + + + Refresh Disk Images + დისკის გამოსახულებების განახლება + + + Create Host-only Network + მხოლოდ-ჰოსტის ქსელის შექმნა + + + Remove Host-only Network + მხოლოდ-ჰოსტის ქსელის წაშლა + + + Open Host-only Network Properties + მხოლოდ-ჰოსტის ქსელის თვისებების გახსნა + + + Refresh Host-only Networks + მხოლოდ-ჰოსტის ქსელების განახლება + + + Add Cloud Profile + ღრუბლოვანი პროფილის დამატება + + + Import Cloud Profiles + ღრუბლოვანი პროფილების შემოტანა + + + Remove Cloud Profile + ღრუბლოვანი პროფილის წაშლა + + + Open Cloud Profile Properties + ღრუბლოვანი პროფილის თვისებების ჩასწორება + + + Show Cloud Profile Help + ღრუბლოვანი პროფილის დახმარების ჩვენება + + + &Soft Keyboard... + &პროგრამული კლავიატურა... + + + Display soft keyboard + პროგრამული კლავიატურის ჩვენება + + + Guest Control Terminal... + debug action + სტუმრის კონტროლის ტერმინალი... + + + + UIAddDiskEncryptionPasswordDialog + + ID + password table field + ID + + + Password + password table field + პაროლი + + + <nobr>Used by the following %n hard disk(s):</nobr><br>%1 + 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 hard drives are in the tool-tip and doesn't need to be told). + + <nobr>გამოიყენება შემდეგი %n მყარი დისკის მიერ:</nobr><br>%1 + <nobr>გამოიყენება შემდეგი %n მყარი დისკის მიერ:</nobr><br>%1 + + + + %1 - Disk Encryption + %1 - დისკის დაშიფვრა + + + This virtual machine is password protected. Please enter the %n encryption password(s) below. + 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 passwords are in the list and doesn't need to be told). + + ეს ვირტუალური მანქანა პაროლითაა დაცული. შეიყვანეთ %n-ის დაშიფვრის პაროლი. + ეს ვირტუალური მანქანა პაროლითაა დაცული. შეიყვანეთ %n-ის დაშიფვრის პაროლი. + + + + + UIApplianceEditorWidget + + Virtual System %1 + %1 ვირტუალური სისტემა + + + Name + სახელი + + + Product + პროდუქტი + + + Product-URL + პროდუქტის URL + + + Vendor + მომწოდებელი + + + Vendor-URL + მომწოდებლის URL + + + Version + ვერსია + + + Description + აღწერა + + + License + ლიცენზია + + + Guest OS Type + სტუმარი ოს-ის ტიპი + + + CPU + პროცესორი + + + RAM + RAM + + + DVD + DVD + + + Floppy + დისკეტა + + + Network Adapter + ქსელის ბარათი + + + USB Controller + USB კონტროლერი + + + Sound Card + ხმის ბარათი + + + Virtual Disk Image + ვირტუალური დისკის გამოსახულება + + + Unknown Hardware Item + აპარატურის უცნობი ერთეული + + + <b>Original Value:</b> %1 + <b>პირველადი მნიშვნელობა:</b> %1 + + + Configuration + გამართვა + + + Warnings: + გაფრთხილებები: + + + Storage Controller (IDE) + საცავის კონტროლერი (IDE) + + + Storage Controller (SATA) + საცავის კონტროლერი (SATA) + + + Storage Controller (SCSI) + საცავის კონტროლერი (SCSI) + + + Storage Controller (SAS) + საცავის კონტროლერი (SAS) + + + Detailed list of all components of all virtual machines of the current appliance + შეკუმშულ ვირტუალურ მანქანაში არსებული კომპონენტების დეტალები + + + Settings File + პარამეტრების ფაილი + + + Base Folder + საბაზსო საქაღალდე + + + Primary Group + ძირითადი ჯგუფი + + + Storage Controller (VirtioSCSI) + + + + + UIApplianceImportEditorWidget + + Importing Appliance ... + შეკუმშული მანქანის შემოტანა... + + + Reading Appliance ... + შეკუმშული მანქანის წაკითხვა... + + + &Import hard drives as VDI + &მყარი დისკების VDI ფორმატში შემოტანა + + + MAC Address &Policy: + MAC მისამართების წესები: + + + Include all network adapter MAC addresses + ყველა ქსელის ბარათის MAC მისამართის დამატება + + + Include only NAT network adapter MAC addresses + მხოლოდ NAT ქსელის MAC მისამართების ჩასმა + + + Generate new MAC addresses for all network adapters + ყველა ქსელის ბარათისთვის ახალი MAC მისამართის გენერაცია + + + Additional Options: + დამატებითი პარამეტრები: + + + When checked, all the hard drives that belong to this appliance will be imported in VDI format. + თუ ჩართულია, ამ შეკუმშული მანქანის ყველა მყარი დისკი VDI ფორმატში იქნება შემოტანილი. + + + &Machine Base Folder: + &მანქანის ნაგულისხმები საქაღალდე: + + + Include all network adapter MAC addresses during importing. + შემოტანისას ყველა ქსელის ბარათის MAC მისამართის დამატება. + + + Include only NAT network adapter MAC addresses during importing. + შემოტანისას მხოლოდ NAT ქსელის MAC მისამართების ჩასმა. + + + Generate new MAC addresses for all network adapters during importing. + შემოტანისას ყველა ქსელის ბარათისთვის ახალი MAC მისამართის გენერაცია. + + + + UIApplianceModelItem + + %1 + col.1 text + %1% + + + %1: %2 + col.1 text: col.2 text + %1: %2 + + + + UIApplianceUnverifiedCertificateViewer + + Unverifiable Certificate! Continue? + შეუმოწმებადი სერტიფიკატი! გავაგრძლო? + + + <b>The appliance is signed by an unverified self signed certificate issued by '%1'. We recommend to only proceed with the importing if you are sure you should trust this entity.</b> + + + + <b>The appliance is signed by an unverified certificate issued to '%1'. We recommend to only proceed with the importing if you are sure you should trust this entity.</b> + + + + True + სიმართლე + + + False + ტყუილი + + + <tr><td>%1:</td><td>%2</td></tr> + key: value + <tr><td>%1:</td><td>%2</td></tr> + + + Issuer + გამომცემელი + + + Subject + სათაური + + + Not Valid Before + არასწორია თარიღამდე + + + Not Valid After + არასწორია თარიღის შემდეგ + + + Serial Number + სერიული ნომერი + + + Self-Signed + თვითხელმოწერილი + + + Authority (CA) + მთავარი სერტიფიკატი (CA) + + + Public Algorithm + საჯარო ალგორითმი + + + %1 (%2) + value (clarification) + %1 (%2) + + + Signature Algorithm + ხელმოწერის ალგორითმი + + + X.509 Version Number + X.509-ის ვერსია + + + + UIAudioControllerEditor + + Audio &Controller: + აუდიო &კონტროლერი: + + + + UIAudioHostDriverEditor + + Host Audio &Driver: + ჰოსტის აუდიო &დრაივერი: + + + + UIBaseMemoryEditor + + Base &Memory: + &საბაზისო მეხსიერება: + + + %1 MB + %1 მბ + + + MB + მბ + + + + UIBootOrderEditor + + &Boot Order: + &ჩატვირთვის მიმდევრობა: + + + Move Up + აწევა + + + Move Down + ჩამოწევა + + + + UIChooserAbstractModel + + New group + ახალი ჯგუფი + + + + UIChooserItemGroup + + <b>%1</b> + Group item tool-tip / Group name + <b>%1</b> + + + %n group(s) + Group item tool-tip / Group info + + %n ჯგუფი + %n ჯგუფი + + + + <nobr>%1</nobr> + Group item tool-tip / Group info wrapper + <nobr>%1</nobr> + + + %n machine(s) + Group item tool-tip / Machine info + + %n მანქანა + %n მანქანა + + + + (%n running) + Group item tool-tip / Running machine info + + (გაშვებულია %n) + (გაშვებულია %n) + + + + <nobr>%1</nobr> + Group item tool-tip / Machine info wrapper + <nobr>%1</nobr> + + + <nobr>%1 %2</nobr> + Group item tool-tip / Machine info wrapper, including running + <nobr>%1 %2</nobr> + + + Collapse group + ჯგუფის ჩაკეცვა + + + Expand group + ჯგუფის ამოკეცვა + + + + UIChooserNodeGlobal + + Tools + ხელსაწყოები + + + + UIChooserNodeGroup + + Virtual Machine group + ვირტუალური მანქანების ჯგუფი + + + + UIChooserNodeMachine + + Virtual Machine + ვირტუალური მანქანა + + + + UIChooserSearchWidget + + Navigate to the next item among the search results + ძებნის შედეგებში შემდეგ ჩანაწერზე გადასვლა + + + Navigate to the previous item among the search results + ძებნის შედეგებში წინა ჩანაწერზე გადასვლა + + + Enter a search term to be used during virtual machine search + შეიყვანეთ ვირტუალური მანქანების მოსაძებნი სტრიქონი + + + Close the search widget + ძებნის ღილაკის დახურვა + + + + UIChooserView + + Contains a tree of Virtual Machines and their groups + შეიცავს ვირტუალური მანქანებისა და მათი ჯგუფების ხეს + + + + UICloudProfileDetailsWidget + + Name: + სახელი: + + + Properties: + თვისებები: + + + Contains cloud profile settings + შეიცავს ღრუბლოვანი პროფილის პარამეტრებს + + + Enter a name for the new profile... + შეყვანეთ ახალი პროფილის სახელი... + + + Enter a name for this profile... + შეიყვანეთ ამ პროფილის სახელი... + + + Reset + თავიდან ჩართვა + + + Reset changes in current profile details + მიმდინარე პროფილის დეტალების ცვლილებების განულება + + + Reset Changes (%1) + ცვლილებების დაბრუნება (%1) + + + Add + დამატება + + + Add a new profile with following name + შეყვანეთ ახალი პროფილის სახელი + + + Add Profile (%1) + პროფილის დამატება (%1) + + + Apply + გადატარება + + + Apply changes in current profile details + მიმდინარე პროფილის დეტალების ცვლილებების გადატარება + + + Apply Changes (%1) + ცვლილებების გადატარება (%1) + + + + UICloudProfileManager + + Cloud Profile Manager + ღრუბლოვანი პროფილის მმართველი + + + Reset + თავიდან ჩართვა + + + Apply + გადატარება + + + Close + დახურვა + + + Reset changes in current cloud profile details + მიმდინარე ღრუბლოვანი პროფილის დეტალების ცვლილებების განულება + + + Apply changes in current cloud profile details + მიმდინარე ღრუბლოვანი პროფილის დეტალების ცვლილებების გადატარება + + + Close dialog without saving + დახურვა შენახვის გარეშე + + + Reset Changes (%1) + ცვლილებების დაბრუნება (%1) + + + Apply Changes (%1) + ცვლილებების გადატარება (%1) + + + Close Window (%1) + ფანჯრის დახურვა (%1) + + + Add Profile + პროფილის დამატება + + + + UICommon + + MB + size suffix MBytes=1024 KBytes + მბ + + + <nobr>%1 MB</nobr> + details report + <nobr>%1 მბ</nobr> + + + Enabled + details report (3D Acceleration) + ჩართულია + + + Disabled + details report (3D Acceleration) + გამორთული + + + not set + details report (execution engine) + დაყენებული არაა + + + Active + details report (Nested Paging) + აქტიური + + + Inactive + details report (Nested Paging) + არააქტიური + + + Active + details report (Unrestricted Execution) + აქტიური + + + Inactive + details report (Unrestricted Execution) + არააქტიური + + + Execution engine + details report + გამშვები ძრავი + + + Nested Paging + მეხსიერების გვერდების ერთმანეთში ჩალაგების მხარდაჭერა + + + Unrestricted Execution + შეუზღუდავი შესრულება + + + Execution Cap + details report + შესრულების პიკი + + + Paravirtualization Interface + details report + პარავირტუალიზაციის ინტერფეისი + + + Processors + details report + პროცესორები + + + Powered Off + MachineState + გამორთულია + + + Saved + MachineState + შენახულია + + + Aborted + MachineState + შეწყვეტილია + + + Teleported + MachineState + გადატანილია + + + Running + MachineState + გაშვებულია + + + Paused + MachineState + შეჩერებულია + + + Guru Meditation + MachineState + გურუ მედიტაცია + + + Teleporting + MachineState + გადატანა + + + Taking Snapshot + MachineState + სწრაფი ასლის აღება + + + Taking Online Snapshot + MachineState + ონლაინ სწრაფი ასლის აღება + + + Taking Live Snapshot + MachineState + ცოცხალი სწრაფი ასლის აღება + + + Starting + MachineState + გაშვება + + + Stopping + MachineState + შეჩერება + + + Saving + MachineState + შენახვა + + + Restoring + MachineState + აღდგენა + + + Teleporting Paused VM + MachineState + შეჩერებული ვმ-ის სწრაფი გადატანა + + + Deleting Snapshot + MachineState + სწრაფი ასლის წაშლა + + + Restoring Snapshot + MachineState + სწრაფი ასლის აღდგენა + + + Setting Up + MachineState + მორგება + + + Unlocked + SessionState + განბლოკილი + + + Locked + SessionState + დაბლოკილი + + + Spawning + SessionState + გაჩენა + + + Unlocking + SessionState + განბლოკვა + + + None + ParavirtProvider + არცერთი + + + Default + ParavirtProvider + ნაგულისხმევი + + + Legacy + ParavirtProvider + ძველი + + + Minimal + ParavirtProvider + მინიმალური + + + Hyper-V + ParavirtProvider + Hyper-V + + + KVM + ParavirtProvider + KVM + + + None + DeviceType + არცერთი + + + Floppy + DeviceType + დისკეტა + + + Optical + DeviceType + ოპტიკური + + + Hard Disk + DeviceType + მყარი დისკი + + + Network + DeviceType + ქსელი + + + USB + DeviceType + USB + + + Shared Folder + DeviceType + გაზიარებული საქაღალდე + + + Disabled + ClipboardType + გამორთულია + + + Host To Guest + ClipboardType + ჰოსტიდან სტუმრამდე + + + Guest To Host + ClipboardType + სტუმრიდან ჰოსტამდე + + + Bidirectional + ClipboardType + ორმხრივი + + + Disabled + DragAndDropType + გამორთული + + + Host To Guest + DragAndDropType + ჰოსტიდან სტუმრამდე + + + Guest To Host + DragAndDropType + სტუმრიდან ჰოსტამდე + + + Bidirectional + DragAndDropType + ორმხრივი + + + PS/2 Mouse + PointingHIDType + PS/2 თაგუნა + + + USB Mouse + PointingHIDType + USB თაგუნა + + + USB Tablet + PointingHIDType + USB ტაბლეტი + + + PS/2 and USB Mouse + PointingHIDType + PS/2 და USB თაგუნები + + + USB Multi-Touch Tablet + PointingHIDType + USB მუტლითაჩი ტაბლეტი + + + None + GraphicsControllerType + არცერთი + + + VBoxVGA + GraphicsControllerType + VBoxVGA + + + VMSVGA + GraphicsControllerType + VMSVGA + + + VBoxSVGA + GraphicsControllerType + VBoxSVGA + + + Normal + MediumType + ნორმალური + + + Immutable + MediumType + დაურღვეველი + + + Writethrough + MediumType + გამჭოლჩაწერილი + + + Shareable + MediumType + გაზიარებადი + + + Readonly + MediumType + მხოლოდ წასაკითხად + + + Multi-attach + MediumType + მრავლად-მიბმული + + + Dynamically allocated storage + MediumVariant + დინამიკურად გამოყოფილი საცავი + + + New dynamically allocated storage + MediumVariant + დინამიკურად გამოყოფილი ახალი საცავი + + + Dynamically allocated differencing storage + MediumVariant + დინამიკურად გამოყოფილი სხვაობიანი საცავი + + + Fixed size storage + MediumVariant + ფიქსირებული ზომის საცავი + + + Dynamically allocated storage split into files of less than 2GB + MediumVariant + დინამიკურად გამოყოფილი საცავი 2გბ-იან ფაილებად დაიყოფა + + + Dynamically allocated differencing storage split into files of less than 2GB + MediumVariant + დიმანიურად გამოყოფილი საცავი დაყოფილია 2გბ-ზე ნაკლებ ზომიან ფაილებად + + + Fixed size storage split into files of less than 2GB + MediumVariant + ფიქსირებული ზომის საცავი, დაყოფილი 2გბ-ზე ნაკლებ ზომიან ფაილებად + + + Dynamically allocated compressed storage + MediumVariant + დინამიკურად გამოყოფილი შეკუმშული საცავი + + + Dynamically allocated differencing compressed storage + MediumVariant + დინამიკურად გამოყოფლი შეკუმშული განმასხვავებელი საცავი + + + Fixed size ESX storage + MediumVariant + ფიქსირებული ზომის ESX საცავი + + + Fixed size storage on raw disk + MediumVariant + ფიქსირებული ზომის საცავი RAW დისკზე + + + Not attached + NetworkAttachmentType + მიმაგრებული არაა + + + NAT + NetworkAttachmentType + NAT + + + Bridged Adapter + NetworkAttachmentType + ხიდის ბარათი + + + Internal Network + NetworkAttachmentType + შიდა ქსელი + + + Host-only Adapter + NetworkAttachmentType + მხოლოდ-ჰოსტის ბარათი + + + Generic Driver + NetworkAttachmentType + ზოგადი დრაივერი + + + NAT Network + NetworkAttachmentType + NAT ქსელი + + + Cloud Network + NetworkAttachmentType + ღრუბლოვანი ქსელი + + + PCnet-PCI II (Am79C970A) + NetworkAdapterType + PCnet-PCI II (Am79C970A) + + + PCnet-FAST III (Am79C973) + NetworkAdapterType + PCnet-FAST III (Am79C973) + + + Intel PRO/1000 MT Desktop (82540EM) + NetworkAdapterType + Intel PRO/1000 MT Desktop (82540EM) + + + Intel PRO/1000 T Server (82543GC) + NetworkAdapterType + Intel PRO/1000 T Server (82543GC) + + + Intel PRO/1000 MT Server (82545EM) + NetworkAdapterType + Intel PRO/1000 MT Server (82545EM) + + + Paravirtualized Network (virtio-net) + NetworkAdapterType + პარავირტუალიზებული ქსელი (virtio-net) + + + Deny + NetworkAdapterPromiscModePolicy + აკრძალვა + + + Allow VMs + NetworkAdapterPromiscModePolicy + ვმ-ების დაშვება + + + Allow All + NetworkAdapterPromiscModePolicy + ყველას დაშვება + + + Disconnected + PortMode + განკავშირებულია + + + Host Pipe + PortMode + ჰოსტის ფაიფი + + + Host Device + PortMode + ჰოსტის მოწყობილობა + + + Raw File + PortMode + RAW ფაილი + + + TCP + PortMode + TCP + + + OHCI + USBControllerType + OHCI + + + EHCI + USBControllerType + EHCI + + + xHCI + USBControllerType + xHCI + + + Not supported + USBDeviceState + მხარდაუჭერელია + + + Unavailable + USBDeviceState + მიუწვდომელია + + + Busy + USBDeviceState + დაკავებულია + + + Available + USBDeviceState + ხელმისაწვდომია + + + Held + USBDeviceState + შეჩერება + + + Captured + USBDeviceState + დაჭერილია + + + Ignore + USBDeviceFilterAction + იგნორი + + + Hold + USBDeviceFilterAction + შეყოვნება + + + Null Audio Driver + AudioDriverType + ნულოვანი აუდიო დრაივერი + + + Windows Multimedia + AudioDriverType + Windows-ის მულტიმედია + + + OSS Audio Driver + AudioDriverType + OSS აუდიო დრაივერი + + + ALSA Audio Driver + AudioDriverType + ALSA აუდიო დრაივერი + + + Windows DirectSound + AudioDriverType + Windows DirectSound + + + CoreAudio + AudioDriverType + CoreAudio + + + PulseAudio + AudioDriverType + PulseAudio + + + Solaris Audio + AudioDriverType + Solaris Audio + + + ICH AC97 + AudioControllerType + ICH AC97 + + + SoundBlaster 16 + AudioControllerType + SoundBlaster 16 + + + Intel HD Audio + AudioControllerType + Intel HD Audio + + + Null + AuthType + არაფერი + + + External + AuthType + გარე + + + Guest + AuthType + სტუმარი + + + IDE + StorageBus + IDE + + + SATA + StorageBus + SATA + + + SCSI + StorageBus + SCSI + + + Floppy + StorageBus + დისკეტა + + + SAS + StorageBus + SAS + + + USB + StorageBus + USB + + + PCIe + StorageBus + PCIe + + + virtio-scsi + StorageBus + virtio-scsi + + + LsiLogic + StorageControllerType + LsiLogic + + + BusLogic + StorageControllerType + BusLogic + + + AHCI + StorageControllerType + AHCI + + + PIIX3 + StorageControllerType + PIIX3 + + + PIIX4 + StorageControllerType + PIIX4 + + + ICH6 + StorageControllerType + ICH6 + + + I82078 + StorageControllerType + I82078 + + + LsiLogic SAS + StorageControllerType + LsiLogic SAS + + + USB + StorageControllerType + USB + + + NVMe + StorageControllerType + NVMe + + + virtio-scsi + StorageControllerType + virtio-scsi + + + PIIX3 + ChipsetType + PIIX3 + + + ICH9 + ChipsetType + ICH9 + + + UDP + NATProtocol + UDP + + + TCP + NATProtocol + TCP + + + B + size suffix Bytes + B + + + KB + size suffix KBytes=1024 Bytes + კბ + + + GB + size suffix GBytes=1024 MBytes + გბ + + + TB + size suffix TBytes=1024 GBytes + ტბ + + + PB + size suffix PBytes=1024 TBytes + პბ + + + IDE Primary Device 0 + StorageSlot + IDE ძირითადი მოწყობილობა 0 + + + IDE Primary Device 1 + StorageSlot + IDE ძირითადი მოწყობილობა 1 + + + IDE Secondary Device 0 + StorageSlot + IDE მეორადი მოწყობილობა 0 + + + IDE Secondary Device 1 + StorageSlot + IDE მეორადი მოწყობილობა 1 + + + SATA Port %1 + StorageSlot + SATA პორტი %1 + + + SCSI Port %1 + StorageSlot + SCSI პორტი %1 + + + SAS Port %1 + StorageSlot + SAS პორტი %1 + + + Floppy Device %1 + StorageSlot + დისკეტა %1 + + + USB Port %1 + StorageSlot + USB პორტი %1 + + + NVMe Port %1 + StorageSlot + NVMe პორტი %1 + + + virtio-scsi Port %1 + StorageSlot + virtio-scsi პორტი %1 + + + Name + სახელი + + + OS + ოს-ი + + + Location + მდებარეობა + + + Groups + ჯგუფები + + + RAM + RAM + + + CPU Count + CPU-ის რაოდენობა + + + CPU Execution Cap + CPU-ის შესრულების პიკი + + + Boot Order + ჩატვირთვის მიმდევრობა + + + Chipset Type + ჩიპსეტის ტიპი + + + Firmware + მიკროკოდი + + + Acceleration + აპარატურული აჩქარება + + + VRAM + VRAM + + + Screen Count + ეკრანების რაოდენობა + + + Scale Factor + გადიდების ფაქტორი + + + Graphics Controller + გრაფიკული კონტროლერი + + + VRDE + VRDE + + + Recording + ჩაწერა + + + Hard Disks + მყარი დისკები + + + Optical Devices + ოპტიკური მოწყობილობები + + + Floppy Devices + დისკეტა + + + Driver + დრაივერი + + + Controller + კონტროლერი + + + Input/Output + შეტანა/გამოტანა + + + Not Attached + network adapter + მიმაგრებული არაა + + + NAT + NAT + + + Bridget Adapter + ხიდის ბარათი + + + Internal Network + შიდა ქსელი + + + Host Only Adapter + მხოლოდ-ჰოსტის ბარათი + + + Generic Driver + ზოგადი დრაივერი + + + NAT Network + NAT ქსელი + + + Disconnected + serial port + განკავშირებულია + + + Host Pipe + ჰოსტის ფაიფი + + + Host Device + ჰოსტის მოწყობილობა + + + Raw File + RAW ფაილი + + + TCP + TCP + + + Device Filters + მოწყობილობის ფილტრები + + + Menu Bar + მენიუს ზოლი + + + Status Bar + სტატუსის ზოლი + + + Mini Toolbar + მინი ზოლი + + + General + DetailsElementType + ზოგადი + + + Preview + DetailsElementType + გადახედვა + + + System + DetailsElementType + სისტემა + + + Display + DetailsElementType + ეკრანი + + + Storage + DetailsElementType + საცავი + + + Audio + DetailsElementType + აუდიო + + + Network + DetailsElementType + ქსელი + + + Serial ports + DetailsElementType + სერიული პორტები + + + USB + DetailsElementType + USB + + + Shared folders + DetailsElementType + გაზიარებული საქაღალდეები + + + User interface + DetailsElementType + მომხმარებლის ინტერფეისი + + + Description + DetailsElementType + აღწერა + + + Hard Disks + IndicatorType + მყარი დისკები + + + Optical Disks + IndicatorType + ოპტიკური დისკები + + + Floppy Disks + IndicatorType + ფლოპი დისკები + + + Audio + IndicatorType + აუდიო + + + Network + IndicatorType + ქსელი + + + USB + IndicatorType + USB + + + Shared Folders + IndicatorType + გაზიარებული საქაღალდეები + + + Display + IndicatorType + ეკრანი + + + Recording + IndicatorType + ჩაწერა + + + Features + IndicatorType + თვისებები + + + Mouse + IndicatorType + თაგუნა + + + Keyboard + IndicatorType + კლავიატურა + + + General + InformationElementType + ზოგადი + + + Preview + InformationElementType + გადახედვა + + + System + InformationElementType + სისტემა + + + Display + InformationElementType + ეკრანი + + + Storage + InformationElementType + საცავი + + + Audio + InformationElementType + აუდიო + + + Network + InformationElementType + ქსელი + + + Serial ports + InformationElementType + სერიული პორტები + + + USB + InformationElementType + USB + + + Shared folders + InformationElementType + გაზიარებული საქაღალდეები + + + User interface + InformationElementType + მომხმარებლის ინტერფეისი + + + Description + InformationElementType + აღწერა + + + Runtime attributes + InformationElementType + გაშვებული ასლის ატრიბუტები + + + Storage statistics + InformationElementType + საცავის სტატისტიკა + + + Network statistics + InformationElementType + ქსელის სტატისტიკა + + + VDI (VirtualBox Disk Image) + UIMediumFormat + VDI (VirtualBox-ის დისკის გამოსახულება) + + + VMDK (Virtual Machine Disk) + UIMediumFormat + VMDK (ვირტუალური მანქანის დისკი) + + + VHD (Virtual Hard Disk) + UIMediumFormat + VHD (ვირტუალური მყარი დისკი) + + + HDD (Parallels Hard Disk) + UIMediumFormat + HDD (Parallels-ის მყარი დისკი) + + + QED (QEMU enhanced disk) + UIMediumFormat + QED (QEMU-ის გაფართოებული დისკი) + + + QCOW (QEMU Copy-On-Write) + UIMediumFormat + QCOW (QEMU-ის Copy-On-Write) + + + Video/Audio + UISettingsDefs::RecordingMode + ვიდეო/აუდიო + + + Video Only + UISettingsDefs::RecordingMode + მხოლოდ ვიდეო + + + Audio Only + UISettingsDefs::RecordingMode + მხოლოდ აუდიო + + + %n year(s) + + %n წელი + %n წელი + + + + %n month(s) + + %n თვე + %n თვე + + + + %n day(s) + + %n დღე + %n დღე + + + + %n hour(s) + + %n საათი + %n საათი + + + + %n minute(s) + + %n წუთი + %n წუთი + + + + %n second(s) + + %n წამი + %n წამი + + + + Please choose a virtual hard disk file + აირჩიეთ ვირტუალური მყარი დისკის ფაილი + + + All virtual hard disk files (%1) + ყველა ვირტუალური მყარი დისკის ფაილი (%1) + + + Please choose a virtual optical disk file + აირჩიეთ ვირტუალური ოპტიკური დისკის ფაილი + + + All virtual optical disk files (%1) + ყველა ვირტუალური ოპტიკური დისკის ფაილი (%1) + + + Please choose a virtual floppy disk file + აირჩიეთ ვირტუალური დისკეტის ფაილი + + + All virtual floppy disk files (%1) + ყველა ვირტუალური დისკეტის ფაილი (%1) + + + All files (*) + ყველა ფაილი (*) + + + Unknown device + USB device details + უცნობი მოწყობილობა + + + Unknown device %1:%2 + USB device details + უცნობი მოწყობილობა %1:%2 + + + <nobr>Vendor ID: %1</nobr><br><nobr>Product ID: %2</nobr><br><nobr>Revision: %3</nobr> + USB device tooltip + <nobr>მომწოდებლის ID: %1</nobr><br><nobr>პროდუქტის ID: %2</nobr><br><nobr>რევიზია: %3</nobr> + + + <br><nobr>Serial No. %1</nobr> + USB device tooltip + <br><nobr>სერიული #. %1</nobr> + + + <br><nobr>State: %1</nobr> + USB device tooltip + <br><nobr>მდგომარეობა: %1</nobr> + + + <nobr>Vendor ID: %1</nobr> + USB filter tooltip + <nobr>მომწოდებლის ID: %1</nobr> + + + <nobr>Product ID: %2</nobr> + USB filter tooltip + <nobr>პროდუქტის ID: %2</nobr> + + + <nobr>Revision: %3</nobr> + USB filter tooltip + <nobr>რევიზია: %3</nobr> + + + <nobr>Product: %4</nobr> + USB filter tooltip + <nobr>პროდუქტი: %4</nobr> + + + <nobr>Manufacturer: %5</nobr> + USB filter tooltip + <nobr>მწარმოებელი: %5</nobr> + + + <nobr>Serial No.: %1</nobr> + USB filter tooltip + <nobr>სერიული #.: %1</nobr> + + + <nobr>Port: %1</nobr> + USB filter tooltip + <nobr>პორტი: %1</nobr> + + + <nobr>State: %1</nobr> + USB filter tooltip + <nobr>მდგომარეობა: %1</nobr> + + + User-defined + serial port + მომხმარებლის მიერ განსაზღვრული + + + Inaccessible + medium + მიუწვდომელი + + + Empty + medium + ცარიელი + + + Host Drive '%1' + medium + ჰოსტის დისკი "%1" + + + Host Drive %1 (%2) + medium + ჰოსტის დისკი %1 (%2) + + + <p style=white-space:pre>Type (Format): %1 (%2)</p> + medium + <p style=white-space:pre>ტიპი (ფორმატი): %1 (%2)</p> + + + <p>Attached to: %1</p> + image + <p>მიბმულია: %1</p> + + + <i>Not Attached</i> + image + <i>მიბმული არაა</i> + + + <i>Checking accessibility...</i> + medium + <i>წვდომის შემოწმება...</i> + + + Failed to check accessibility of disk image files. + medium + დისკის გამოსახულების ფაილების წვდომის შემოწმების შეცდომა. + + + <b>No disk image file selected</b> + medium + <b>დისკის გამოსახულების ფაილი არჩეული არაა</b> + + + You can also change this while the machine is running. + ამის შეცვლა შესაძლებელია მაშინაც კი, როცა მანქანა გაშვებულია. + + + <b>No disk image files available</b> + medium + <b>დისკის გამოსახულების ფაილი მიუწვდომელია</b> + + + You can create or add disk image files in the virtual machine settings. + დისკების გამოსახულების შექმნა ან დამატება მაშინაც კი, როცა მანქანა გაშვებულია. + + + Attaching this hard disk will be performed indirectly using a newly created differencing hard disk. + medium + + + + Encrypted + medium + დაშიფრული + + + Checking... + medium + შემოწმება… + + + Some of the files in this hard disk chain are inaccessible. Please use the Virtual Medium Manager to inspect these files. + medium + + + + This base hard disk is indirectly attached using the following differencing hard disk: + medium + + + + Differencing + MediumType + განსხვავება + + + Adapter %1 + ბარათი %1 + + + Please choose a location for new virtual hard disk file + აირჩიეთ დისკის ახალი ფაილის მდებარეობა + + + Paravirtualized Network (virtio-net 1.0) + NetworkAdapterType + პარავირტუალიზებული ქსელი (virtio-net 1.0) + + + PCnet-ISA (Am79C960) + NetworkAdapterType + PCnet-ISA (Am79C960) + + + Acquire cloud instances ... + ღრუბლოვანი გაშებულ ასლების მიღება ... + + + Acquire cloud instance info ... + + + + Pause instance ... + + + + Start instance ... + + + + Cloud Network [EXPERIMENTAL] + NetworkAttachmentType + + + + Undefined + GuestSessionStatus + + + + Starting + GuestSessionStatus + გაშვება + + + Started + GuestSessionStatus + + + + Terminating + GuestSessionStatus + + + + Terminated + GuestSessionStatus + + + + Timed Out (Killed) + GuestSessionStatus + + + + Timed Out (Abnormally) + GuestSessionStatus + + + + Down + GuestSessionStatus + + + + Error + GuestSessionStatus + + + + Bridged Adapter + ხიდის ბარათი + + + Cloud Network + ღრუბლოვანი ქსელი + + + + UICustomFileSystemModel + + Name + სახელი + + + Size + ზომა + + + Change Time + დროის შეცვლა + + + Owner + მფლობელი + + + Permissions + წვდომები + + + Path + ბილიკი + + + New Directory + ახალი საქაღალდე + + + Local Path + ლოკალური ბილიკი + + + + UIDetails + + Name + details (general) + სახელი + + + Operating System + details (general) + ოპერაციული სისტემა + + + Settings File Location + details (general) + პარამეტრების ფაილის მდებარეობა + + + Groups + details (general) + ჯგუფები + + + Information Inaccessible + details + ინფორმაცია მიუწვდომელია + + + Base Memory + details (system) + საბაზისო მეხსიერება + + + %1 MB + details + %1 მბ + + + Processors + details (system) + პროცესორი + + + Execution Cap + details (system) + შესრულების პიკი + + + %1% + details + %1% + + + Boot Order + details (system) + ჩატვირთვის მიმდევრობა + + + Chipset Type + details (system) + ჩიპსეტის ტიპი + + + EFI + details (system) + EFI + + + Enabled + details (system/EFI) + ჩართულია + + + Disabled + details (system/EFI) + გამორთული + + + VT-x/AMD-V + details (system) + VT-x/AMD-V + + + Nested Paging + details (system) + მეხსიერების გვერდების ერთმანეთში ჩალაგების მხარდაჭერა + + + PAE/NX + details (system) + PAE/NX + + + Minimal Paravirtualization + details (system) + მინიმალური პარავირტუალიზაცია + + + Hyper-V Paravirtualization + details (system) + Hyper-V პარავირტუალიზაცია + + + KVM Paravirtualization + details (system) + KVM პარავირტუალიზაცია + + + Acceleration + details (system) + აპარატურული აჩქარება + + + Video Memory + details (display) + ვიდეო მეხსიერება + + + Screens + details (display) + ეკრანები + + + Scale-factor + details (display) + გადიდების ფაქტორი + + + 2D Video + details (display) + 2D ვიდეო + + + 3D + details (display) + 3D + + + Acceleration + details (display) + აპარატურული აჩქარება + + + Remote Desktop Server Port + details (display/vrde) + დაშორებული სამუშაო მაგიდის სერვერის პორტი + + + Remote Desktop Server + details (display/vrde) + დაშორებული სამუშაო მაგიდის სერვერის სერვერი + + + Disabled + details (display/vrde/VRDE server) + გამორთული + + + Frame Size: %1x%2, Frame Rate: %3fps, Bit Rate: %4kbps + კადრის ზომა: %1x%2, კადრების სიჩქარე: %3კადრი/წმ, ბიტრეიტი: %4 კბ/წ + + + [Optical Drive] + details (storage) + [ოპტიკური დისკი] + + + Not Attached + details (storage) + მიმაგრებული არაა + + + Host Driver + details (audio) + ჰოსტის დრაივერი + + + Controller + details (audio) + კონტროლერი + + + Audio Output + details (audio) + აუდიო გამოტანა + + + Enabled + details (audio/output) + ჩართულია + + + Disabled + details (audio/output) + გამორთული + + + Audio Input + details (audio) + აუდიო შეტანა + + + Enabled + details (audio/input) + ჩართულია + + + Disabled + details (audio/input) + გამორთული + + + Disabled + details (audio) + გამორთული + + + Bridged Adapter, %1 + details (network) + ხიდის ბარათი, %1 + + + Internal Network, '%1' + details (network) + შიდა ქსელი, '%1' + + + Host-only Adapter, '%1' + details (network) + მხოლოდ-ჰოსტის ბარათი, '%1' + + + Generic Driver, '%1' + details (network) + ზოგადი დრაივერი, '%1' + + + Generic Driver, '%1' { %2 } + details (network) + ზოგადი დრაივერი, '%1' { %2 } + + + NAT Network, '%1' + details (network) + NAT ქსელი, '%1' + + + Adapter %1 + details (network) + ბარათი %1 + + + Disabled + details (network/adapter) + გამორთული + + + Port %1 + details (serial) + პორტი %1 + + + Disabled + details (serial) + გამორთული + + + USB Controller + details (usb) + USB კონტროლერი + + + Device Filters + details (usb) + მოწყობილობის ფილტრები + + + %1 (%2 active) + details (usb) + %1 (%2 აქტიურია) + + + Disabled + details (usb) + გამორთული + + + USB Controller Inaccessible + details (usb) + USB კონტროლერი მიუწვდომელია + + + Shared Folders + details (shared folders) + გაზიარებული საქაღალდეები + + + None + details (shared folders) + არცერთი + + + Menu-bar + details (user interface) + მენიუს ზოლი + + + Enabled + details (user interface/menu-bar) + ჩართულია + + + Disabled + details (user interface/menu-bar) + გამორთული + + + Status-bar + details (user interface) + სტატუსის ზოლი + + + Enabled + details (user interface/status-bar) + ჩართულია + + + Disabled + details (user interface/status-bar) + გამორთული + + + Mini-toolbar Position + details (user interface) + მინი ზოლი + + + Top + details (user interface/mini-toolbar position) + თავში + + + Bottom + details (user interface/mini-toolbar position) + ბოლოში + + + Mini-toolbar + details (user interface) + მინი ზოლი + + + Disabled + details (user interface/mini-toolbar) + გამორთული + + + None + details (description) + არცერთი + + + Recording File + details (display/recording) + ჩანაწერის ფაილი + + + Recording Attributes + details (display/recording) + ჩანაწერის ატრიბუტები + + + Recording + details (display/recording) + ჩაწერა + + + Disabled + details (display/recording) + გამორთული + + + Graphics Controller + details (display) + გრაფიკული კონტროლერი + + + USB 1.1 (OHCI) Controller + details (usb) + USB 1.1 (OHCI) კონტროლერი + + + USB 2.0 (OHCI + EHCI) Controller + details (usb) + USB 2.0 (OHCI + EHCI) კონტროლერი + + + USB 3.0 (xHCI) Controller + details (usb) + USB 3.0 (xHCI) კონტროლერი + + + %1 MB + %1 მბ + + + + UIDetailsElement + + %1 details + like 'General details' or 'Storage details' + %1-ის დეტალები + + + + UIDetailsSet + + Contains the details of virtual machine '%1' + შეიცავს ვმ %1-ის დეტალებს + + + + UIDetailsView + + Contains a list of Virtual Machine details + შეიცავს ვირტუალური მანქანის დეტალების სიას + + + + UIDnDHandler + + Dropping data ... + მონაცემების გადაყრა... + + + Retrieving data ... + მონაცემების მიღება ... + + + + UIDownloader + + Looking for %1... + %1-ის ძებნა... + + + Downloading %1... + %1-ის გადმოწერა... + + + Verifying %1... + %1-ის შემოწმება... + + + + UIDownloaderAdditions + + VirtualBox Guest Additions + VirtualBox-ის სტუმრის დამატებები + + + Select folder to save Guest Additions image to + აირჩიეთ სტუმრის დამატებების ჩასაწერი საქაღალდე + + + + UIDownloaderExtensionPack + + VirtualBox Extension Pack + VirtualBox-ის გაფართოების პაკეტი + + + Select folder to save %1 to + აირჩიეთ %1-ს ჩასაწერი საქაღალდე + + + + UIDownloaderGuestAdditions + + VirtualBox Guest Additions + VirtualBox-ის სტუმრის დამატებები + + + Select folder to save Guest Additions image to + აირჩიეთ სტუმრის დამატებების ჩასაწერი საქაღალდე + + + + UIDownloaderUserManual + + VirtualBox User Manual + VirtualBox_ის მომხმარებლის სახელმძღვანელო + + + Select folder to save User Manual to + აირჩიეთ მომხმარებლის სახელმძღვანელოს ჩასაწერი საქაღალდე + + + + UIEmptyFilePathSelector + + Choose... + არჩევა... + + + + UIErrorString + + Result&nbsp;Code: + error info + შედეგის&nbsp;კოდი: + + + Component: + error info + კომპონენტი: + + + Interface: + error info + ინტერფეისი: + + + Callee: + error info + მრეკავი: + + + Callee&nbsp;RC: + error info + მრეკავის&nbsp;RC: + + + + UIExtensionPackageItem + + %1, %2: %3, %4 + col.2 text, col.3 name: col.3 text, col.1 name + %1, %2: %3, %4 + + + %1, %2: %3 + col.2 text, col.3 name: col.3 text + %1, %2: %3 + + + + UIFDCreationDialog + + File Path: + ფაილის ბილიკი: + + + Size: + ზომა: + + + Format disk as FAT12 + დისკის FAT12-ად დაფორმატება + + + 1.44M + 1.44მ + + + 1.2M + 1.2მ + + + 720K + 720კ + + + 360K + 360კ + + + Floppy Disk Creator + დისკეტის გამოსახულების შექმნა + + + + UIFileManager + + %1 - File Manager + %1 - ფაილების მმართველი + + + Close + დახურვა + + + Clear + გასუფთავება + + + Cancel + გაუქმება + + + Not yet started + არ დაწყებულა + + + Working + მუშაობს + + + Paused + შეჩერებული + + + Canceled + გაუქმებულია + + + Succeded + წარმატებული + + + Failed + წარუმატებელი + + + Invalid + არასწორი + + + Remove Selected + მონიშნულის წაშლა + + + Remove Finished + დასრულებულის წაშლა + + + Remove All + ყველას წაშლა + + + List directories on top + საქაღალდეების სია თავში + + + List directories before files + საქაღალდეების სიის თავში ჩვენება + + + Ask before delete + კითხვა წაშლამდე + + + Show a confirmation dialog before deleting files and directories + ფაილებისა და საქაღალდეების წაშლისას დადასტურების ფანჯრის ჩვენება + + + Human readable sizes + ადამიანური ზომები + + + Show file/directory sizes in human readable format rather than in bytes + ფაილებისა და საქაღალდეების ბაიტების ნაცვლად ადამიანისთვის გასაგებ ფორმატში ჩვენება + + + Password + პაროლი + + + Show Password + პაროლის ჩვენება + + + User name to authenticate session creation + სესიის შექმნისთვის საჭირო ავთენტიკაციის მომხმარებლის სახელი + + + User Name + მომხმარებლის სახელი + + + Password to authenticate session creation + სესიის შექმნისთვის საჭირო ავთენტიკაციის პაროლი + + + Create Session + სესიის შექნა + + + Close Session + სესიის დახურვა + + + Total Size + ჯამური ზომა + + + bytes + ბაიტი + + + File Count + ფაილების რაოდენობა + + + Delete the selected file(s) and/or folder(s) + მონიშნული ფაილებისა და საქაღალდეების წაშლა + + + Ask for this confirmation next time + შემდეგ ჯერზე დადასტურების მოთხოვნა + + + Delete confirmation can be disabled/enabled also from the Options panel. + + + + Unknown + უცნობი + + + File + ფაილი + + + Directory + საქაღალდე + + + Symbolic Link + სიმბმული + + + <b>Size:</b> %1 bytes + <b>ზომა:</b> %1 ბაიტი + + + <b>Allocated:</b> %1 bytes + <b>გამოყოფილია:</b> %1 ბაიტი + + + directory + საქაღალდე + + + file + ფაილი + + + symbolic link + სიმბმული + + + character device + სიმბოლური მოწყობილობა + + + block device + ბლოკური მოწყობილობა + + + fifo + fifo + + + socket + სოკეტი + + + whiteout + სიცარიელე + + + unknown + უცნობი + + + illegal-value + არასწორი-მნიშვნელობა + + + <b>Type:</b> %1<br/> + <b>ტიპი:</b> %1<br/> + + + <b>INode:</b> %1<br/> + <b>INode:</b> %1<br/> + + + <b>Device:</b> %1<br/> + <b>მოწყობილობები:</b> %1<br/> + + + <b>Hardlinks:</b> %1<br/> + <b>მკაცრიბმები:</b> %1<br/> + + + <b>Mode:</b> %1<br/> + <b>რეჟიმი:</b> %1<br/> + + + <b>Attributes:</b> %1<br/> + <b>ატრიბუტები:</b> %1<br/> + + + <b>Device ID:</b> %1<br/> + <b>მოწყობილობის ID:</b> %1<br/> + + + <b>Owner:</b> %1 (%2)<br/> + <b>მფლობელი:</b> %1 (%2)<br/> + + + <b>Group:</b> %1 (%2)<br/> + <b>ჯგუფი:</b> %1 (%2)<br/> + + + <b>Birth:</b> %1<br/> + <b>დაბადების თარიღი:</b> %1<br/> + + + <b>Change:</b> %1<br/> + <b>შეიცვალა:</b> %1<br/> + + + <b>Modified:</b> %1<br/> + <b>ჩასწორდა:</b> %1<br/> + + + <b>Access:</b> %1<br/> + <b>წვდომა:</b> %1<br/> + + + <b>Selected:</b> %1 files and %2 directories<br/> + <b>მონიშნულია:</b> %1 ფაილი და%2 საქაღლდე<br/> + + + <b>Size (non-recursive):</b> %1 bytes + <b>ზომა (არა-რეკურსიული):</b> %1 ბაიტი + + + Properties + თვისებები + + + <b>Name:</b> %1<br/> + <b>სახელი:</b> %1<br/> + + + <b>Created:</b> %1<br/> + <b>შექმნილია:</b> %1<br/> + + + <b>Owner:</b> %1 + <b>Owner:</b> %1 + + + Show hidden objects + Show hidden objects + + + Show hidden files/directories + დამალული ფაილების/საქაღალდეების ჩვენება + + + Guest File System + სტუმრის ფაილური სისტემა + + + Host File System + ჰოსტის ფაილური სისტემა + + + No Guest Session found!<br>Please use the Session Panel to start a new guest session + + + + Close dialog without saving + დახურვა შენახვის გარეშე + + + Reset Changes (%1) + ცვლილებების დაბრუნება (%1) + + + + UIFilePathSelector + + &Copy + &კოპირება + + + Other... + სხვა... + + + Reset + თავიდან ჩართვა + + + Displays a window to select a different folder. + + + + Resets the folder path to the default value. + + + + Displays a window to select a different file. + + + + Resets the file path to the default value. + + + + <reset to default> + <reset to default> + + + The actual default path value will be displayed after accepting the changes and opening this window again. + + + + <not selected> + <not selected> + + + Please use the <b>Other...</b> item from the drop-down list to select a path. + + + + Holds the folder path. + შეიცავს საქაღალდის ბილიკს. + + + Holds the file path. + შეიცავს ფაილის ბილიკს. + + + + UIFormEditorWidget + + Edit... + ჩასწორება... + + + Name + სახელი + + + Value + მნიშვნელობა + + + Assign value ... + მიანიჭეთ მნიშვნელობა... + + + + UIGlobalSettingsDisplay + + Maximum Guest Screen &Size: + სტუმრის ეკრანის მაქსიმალური &ზომა: + + + &Width: + &სიგანე: + + + &Height: + &სიმაღლე: + + + Machine Windows: + მანქანების ფანჯრები: + + + &Raise Window Under Mouse + &ფანჯრის ამოწევა თაგუნას ქვეშ + + + Holds the maximum width which we would like the guest to use. + + + + Holds the maximum height which we would like the guest to use. + + + + When checked, machine windows will be raised when the mouse pointer moves over them. + + + + Scale Factor: + გადიდების ფაქტორი: + + + Controls the guest screen scale factor. + სტუმრის ეკრანის გადიდების კოეფიციენტი. + + + Automatic + Maximum Guest Screen Size + ავტომატური + + + Suggest a reasonable maximum screen size to the guest. The guest will only see this suggestion when guest additions are installed. + + + + None + Maximum Guest Screen Size + არცერთი + + + Do not attempt to limit the size of the guest screen. + + + + Hint + Maximum Guest Screen Size + მინიშნება + + + Suggest a maximum screen size to the guest. The guest will only see this suggestion when guest additions are installed. + + + + + UIGlobalSettingsExtension + + Lists all installed packages. + ყველა დაყენებული პაკეტის სია. + + + Active + აქტიური + + + Name + სახელი + + + Version + ვერსია + + + &Extension Packages + &გაფართოების პაკეტები + + + Extensions + გაფართოებები + + + Add Package + პაკეტის დამატება + + + Remove Package + პაკეტის წაშლა + + + Adds new package. + ახალი პაკეტის დამატება. + + + Removes selected package. + მონიშნული პაკეტის წაშლა. + + + Select an extension package file + აირჩიეთ გაფართოების პაკეტის ფაილი + + + Extension package files (%1) + გაფართოების პაკეტის ფაილები (%1) + + + + UIGlobalSettingsGeneral + + Holds the path to the default virtual machine folder. This folder is used, if not explicitly specified otherwise, when creating new virtual machines. + + + + Holds the path to the library that provides authentication for Remote Display (VRDP) clients. + + + + Default &Machine Folder: + მანქანების &ნაგულისხმები საქაღალდე: + + + V&RDP Authentication Library: + V&RDP-ის ავთენტიკაციის ბიბლიოთეკა: + + + When checked, the host screensaver will be disabled whenever a virtual machine is running. + + + + Host Screensaver: + ჰოსტის ეკრანის დამცველი: + + + &Disable When Running Virtual Machines + &გამორთვა, როცა ვირტუალური მანქანები გაშვებულია + + + + UIGlobalSettingsInput + + 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. + + + + &Auto Capture Keyboard + &კლავიატურის ავტომატური გადაჭერა + + + Host Key Combination + ჰოსტის კლავიშების მიმდევრობა + + + Some items have the same shortcuts assigned. + ზოგიერთ ჩანაწერს იგივე მალსახმობები აქვს მინიჭებული. + + + &VirtualBox Manager + &VirtualBox-ის მმართველი + + + Virtual &Machine + ვირტუალური &მანქანა + + + Lists all available shortcuts which can be configured. + ყველა კონფიგურირებადი მალსახმობის სია. + + + Holds a sequence to filter the shortcut list. + + + + + UIGlobalSettingsLanguage + + 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. + + + + Name + სახელი + + + Id + ID + + + Language + ენა + + + Author + ავტორი + + + &Interface Languages + &მომხმარებლის ინტერფეისის ენები + + + Language: + ენა: + + + Author(s): + ავტორები: + + + + UIGlobalSettingsNetwork + + &NAT Networks + &NAT ქსელები + + + Lists all available NAT networks. + ხელმისაწვდომი NAT ქსელების სია. + + + The name <b>%1</b> is being used for several NAT networks. + სახელი<b>%1</b> რამდენიმე NAT ქსელის მიერ გამოიყენება. + + + Active + NAT network + აქტიური + + + Name + სახელი + + + Add NAT Network + NAT ქსელის დამატება + + + Remove NAT Network + NAT ქსელის წაშლა + + + Edit NAT Network + NAT ქსელის ჩასწორება + + + Adds new NAT network. + ახალი NAT ქსელის დამატება. + + + Removes selected NAT network. + მონიშნული NAT ქსელის წაშლა. + + + Edits selected NAT network. + მონიშნული NAT ქსელის ჩასწორება. + + + + UIGlobalSettingsNetworkDetailsNAT + + NAT Network Details + NAT ქსელის დეტალები + + + &Enable Network + &ქსელის ჩართვა + + + Network &Name: + &ქსელის სახელი: + + + Holds the name for this network. + შეიცავს ამ ქსელის სახელს. + + + Network &CIDR: + &ქსელის CIDR: + + + Holds the CIDR for this network. + შეიცავს ამ ქსელის CIDR-ს. + + + Network Options: + ქსელის პარამეტრები: + + + Supports &DHCP + &DHCP-ის მხრდაჭერა + + + Supports &IPv6 + &IPv6-ის მხარდაჭერა + + + Advertise Default IPv6 &Route + IPv6-ის ნაგულისხმები რაუტის გამოცხადება + + + &Port Forwarding + &პორტის გადამისამართება + + + When checked, this network will be enabled. + თუ ჩართულია, ეს ქსელი ჩართულია. + + + When checked, this network will support DHCP. + თუ ჩართულია, ამ ქსელს DHCP-ის მხარდაჭერა ექნება. + + + When checked, this network will support IPv6. + თუ ჩართულია, ამ ქსელს IPv6-ის მხარდაჭერა ექნება. + + + When checked, this network will be advertised as the default IPv6 route. + როცა ჩართულია, ეს ქსელი გამოცხადებული იქნება, როგორც IPv6-ის ნაგულისხმები რაუტი. + + + Displays a window to configure port forwarding rules. + პორტის გადამისამართების მორგების ფანჯრის ჩვენება. + + + + UIGlobalSettingsPortForwardingDlg + + Port Forwarding Rules + პორტის გადამისამართების წესები + + + IPv4 + IPv4 + + + IPv6 + IPv6 + + + + UIGlobalSettingsProxy + + When chosen, VirtualBox will try to auto-detect host proxy settings for tasks like downloading Guest Additions from the network or checking for updates. + + + + &Auto-detect Host Proxy Settings + ჰოსტის &პროქსის პარამეტრების ავტომატური გამოცნობა + + + When chosen, VirtualBox will use direct Internet connection for tasks like downloading Guest Additions from the network or checking for updates. + + + + &Direct Connection to the Internet + &პირდაპირი კავშირი ინტერნეტთან + + + When chosen, VirtualBox will use the proxy settings supplied for tasks like downloading Guest Additions from the network or checking for updates. + + + + &Manual Proxy Configuration + &პროქსის პარამეტრების ხელით შეყვანა + + + &URL: + &URL: + + + No proxy URL is currently specified. + პროქსის ბმული მითითებული არაა. + + + Invalid proxy URL is currently specified. + მითითებულია პროქსის არასწორი ბმული. + + + You have provided a proxy password. Please be aware that the password will be saved in plain text. You may wish to configure a system-wide proxy instead and not store application-specific settings. + თქვენ გჭირდებათ პროქსის პაროლის შეყვანა. პაროლი უბრალო ტექსტურ ფაილში ინახება. შეიძლება უკეთესი იყოს, რომ პროქსის პაროლი სისტემის პარამეტრებში ჩაწეროთ და აქედან გამოიყენოთ ის. + + + Holds the proxy URL. The format is: <table cellspacing=0 style='white-space:pre'><tr><td>[{type}://][{userid}[:{password}]@]{server}[:{port}]</td></tr><tr><td>http://username:password@proxy.host.com:port</td></tr></table> + + + + + UIGlobalSettingsUpdate + + When checked, the application will periodically connect to the VirtualBox website and check whether a new VirtualBox version is available. + + + + &Check for Updates + განახ&ლების შემოწმება + + + &Once per: + &შემოწმების პერიოდი: + + + Next Check: + შემდეგი შემოწმება: + + + Check for: + შემოწმება: + + + <p>Choose this if you only wish to be notified about stable updates to VirtualBox.</p> + + + + &Stable Release Versions + &სტაბილური რელიზები + + + <p>Choose this if you wish to be notified about all new VirtualBox releases.</p> + + + + &All New Releases + &ყველა რელიზი + + + <p>Choose this to be notified about all new VirtualBox releases and pre-release versions of VirtualBox.</p> + + + + All New Releases and &Pre-Releases + ყველა ახალი რელიზი და &პრე-რელიზი + + + Selects 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. + + + + + UIGraphicsControllerEditor + + &Graphics Controller: + &გრაფიკული კონტროლერი: + + + + UIGraphicsTextPane + + %1: %2 + 'key: value', like 'Name: MyVM' + %1: %2 + + + + UIGuestControlTreeWidget + + Terminate Process + პროცესის დასრულება + + + Expand All + ყველას ამოკეცვა + + + Collapse All + ყველას ჩაკეცვა + + + Terminate Session + სესიის დასრულება + + + Remove All Terminated Sessions/Processes + ყველა დასრულებული სესიის/პროცესის წაშლა + + + Properties + თვისებები + + + + UIGuestProcessControlDialog + + %1 - Guest Control + %1 - სტუმრის კონტროლი + + + Close + დახურვა + + + + UIGuestProcessControlWidget + + Session/Process ID + სესიის/პროცესის ID + + + Session Name/Process Command + სესიის სახელი/პროცესის ბრძანება + + + Session/Process Status + სესია/პროცესის სტატუსი + + + + UIGuestProcessTreeItem + + Process Name + პროცესის სახელი + + + Process Id + პროცესის ID + + + Process Status + პროცესის სტატუსი + + + Executable Path + გამშვები ფაილის ბილიკი + + + Arguments + არგუმენტები + + + + UIGuestSessionTreeItem + + Session Name + სესიის სახელი + + + Session Id + სესიის ID + + + Session Status + სესიის სტატუსი + + + + UIHelpButton + + &Help + &დახმარება + + + + UIHostComboEditor + + Left %1 + მარცხნივ %1 + + + Right %1 + მარჯვნივ %1 + + + <key_%1> + <ღილაკი_%1> + + + Left Shift + მარცხენა Shift + + + Right Shift + მარჯვენა Shift + + + Left Ctrl + მარცხენა Ctrl + + + Right Ctrl + მარჯვენა Ctrl + + + Left Alt + მარცხენა Alt + + + Right Alt + მარჯვენა Alt + + + Left WinKey + მარცხენა Winkey + + + Right WinKey + მარკვენა Winkey + + + Menu key + მენიუს ღილაკი + + + Alt Gr + Alt Gr + + + Caps Lock + Caps Lock + + + Scroll Lock + Scroll Lock + + + Host+ + Host+ + + + None + არცერთი + + + + UIHostNetworkDetailsWidget + + &Adapter + &ქსელის ბარათი + + + &DHCP Server + &DHCP სერვერი + + + Configure Adapter &Automatically + &ადაპტერის ავტომატური მორგება + + + Configure Adapter &Manually + ა&დაპტერის ხელით მორგება + + + &IPv4 Address: + &IPv4 მისამართი: + + + Holds the host IPv4 address for this adapter. + შეიცავს ქსელის ამ ბარათის IPv4 მისამართს. + + + IPv4 Network &Mask: + IPv4 ქსელის ნიღბის მისამართი: + + + Holds the host IPv4 network mask for this adapter. + შეიცავს ქსელის ამ ბარათის IPv4 ნიღაბს. + + + I&Pv6 Address: + IPv6 მისამართი: + + + Holds the host IPv6 address for this adapter if IPv6 is supported. + + + + IPv6 Prefix &Length: + IPv6 პრეფიქსის სიგრძე: + + + Holds the host IPv6 prefix length for this adapter if IPv6 is supported. + + + + Reset + + + + Apply + გადატარება + + + Reset changes in current interface details + ქსელის მიმდინარე ინტერფეისის დეტალების საწყის მნიშვნელობებზე დაბრუნება + + + Apply changes in current interface details + ქსელის მიმდინარე ინტერფეისის დეტალების ცვლილებების გადატარება + + + Reset Changes (%1) + ცვლილებების დაბრუნება (%1) + + + Apply Changes (%1) + ცვლილებების გადატარება (%1) + + + &Enable Server + &სერვერის ჩართვა + + + When checked, the DHCP Server will be enabled for this network on machine start-up. + + + + Server Add&ress: + სერვერის &მისამართი: + + + Holds the address of the DHCP server servicing the network associated with this host-only adapter. + + + + Server &Mask: + სერვერის &ნიღაბი: + + + Holds the network mask of the DHCP server servicing the network associated with this host-only adapter. + + + + &Lower Address Bound: + მისამართების &ქვედა ზღვარი: + + + Holds the lower address bound offered by the DHCP server servicing the network associated with this host-only adapter. + + + + &Upper Address Bound: + მისამართების &ზედა ზღვარი: + + + Holds the upper address bound offered by the DHCP server servicing the network associated with this host-only adapter. + + + + Reset changes in current DHCP server details + მიმდინარე DHCP სერვერის დეტალების ცვლილებების საწყის მნიშვნელობებზე დაბრუნება + + + Apply changes in current DHCP server details + მიმდინარე DHCP სერვერის დეტალების ცვლილებების გადატარება + + + Host interface <nobr><b>%1</b></nobr> is set to obtain the address automatically but the corresponding DHCP server is not enabled. + ჰოსტის ინტერფეისი <nobr><b>%1</b></nobr> დაყენებულია მისამართის ავტომატურად ასაღებად, მაგრამ შესაბამისი DHCP სერვერი ჩართული არაა. + + + Host interface <nobr><b>%1</b></nobr> does not currently have a valid IPv4 address. + ჰოსტის ინტერფეისს <nobr><b>%1</b></nobr> ამჟამად სწორი IPv4 მისამართი არ აქვს მინიჭებული. + + + Host interface <nobr><b>%1</b></nobr> does not currently have a valid IPv4 network mask. + ჰოსტის ინტერფეისს <nobr><b>%1</b></nobr> ამჟამად სწორი IPv4 ქსელის ნიღაბი მინიჭებული არ აქვს. + + + Host interface <nobr><b>%1</b></nobr> does not currently have a valid IPv6 address. + ჰოსტის ინტერფეისს <nobr><b>%1</b></nobr> ამჟამად არ გააჩნია სწორი IPv6 მისამართი. + + + Host interface <nobr><b>%1</b></nobr> does not currently have a valid IPv6 prefix length. + ჰოსტის ინტერფეისს <nobr><b>%1</b></nobr> ამჟამად IPv6 პრეფიქსის სიგრძე მინიჭებული არ აქვს. + + + Host interface <nobr><b>%1</b></nobr> does not currently have a valid DHCP server address. + ჰოსტის ინტერფეისს <nobr><b>%1</b></nobr> ამჟამად DHCP სერვერის სწორი მისამართი არ გააჩნია. + + + Host interface <nobr><b>%1</b></nobr> does not currently have a valid DHCP server mask. + ჰოსტის ინტერფეისს <nobr><b>%1</b></nobr> ამჟამად DHCP სერვერის ნიღაბი არ გააჩნია. + + + Host interface <nobr><b>%1</b></nobr> does not currently have a valid DHCP server lower address bound. + ჰოსტის ინტერფეისს <nobr><b>%1</b></nobr> DHCP სერვერის ქვედა ზღვარი მინიჭებული არ აქვს. + + + Host interface <nobr><b>%1</b></nobr> does not currently have a valid DHCP server upper address bound. + ჰოსტის ინტერფეისს <nobr><b>%1</b></nobr> DHCP სერვერის ზედა ზღვარი მინიჭებული არ აქვს. + + + + UIHostNetworkManager + + Name + სახელი + + + IPv4 Address/Mask + IPv4 მისამართი/ნიღაბი + + + IPv6 Address/Mask + IPv6 მისამართი/ნიღაბი + + + DHCP Server + DHCP სერვერი + + + Adding network ... + ქსელის დამატება... + + + Removing network ... + ქსელის წაშლა... + + + Host Network Manager + ჰოსტის ქსელების მმართველი + + + Reset + + + + Apply + გადატარება + + + Close + დახურვა + + + Reset changes in current host network details + ქსელის მიმდინარე ქსელის დეტალების საწყის მნიშვნელობებზე დაბრუნება + + + Apply changes in current host network details + ქსელის მიმდინარე ქსელის დეტალების ცვლილებების გადატარება + + + Close dialog without saving + დახურვა შენახვის გარეშე + + + Reset Changes (%1) + ცვლილებების დაბრუნება (%1) + + + Apply Changes (%1) + ცვლილებების გადატარება (%1) + + + Close Window (%1) + ფანჯრის დახურვა (%1) + + + + UIHotKeyEditor + + Unset shortcut + მალსახმობის წაშლა + + + Reset shortcut to default + მალსახმობების საწყის მნიშვნელობებზე დაბრუნება + + + + UIHotKeyTableModel + + Name + სახელი + + + Shortcut + მალსახმობი + + + %1: %2 + scope: description + %1: %2 + + + + UIImportLicenseViewer + + <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. + <b>ვირტუალური სისტემა %1 მოითხოვს, რომ დაეთანხმოთ ლიცენზიის პირობებს.</b><br /><br />დააწკაპუნეთ<b>"ვეთანხმები"</b> გასაგრძელებლად ან დააწკაპუნეთ<b>"არ ვეთანხმები"</b> შემოტანის გასაუქმებლად. + + + Software License Agreement + სალიცენზიო შეთანხმება + + + &Disagree + &არ ვეთანხმები + + + &Agree + &ვეთანხმები + + + &Print... + &ამობეჭდვა... + + + &Save... + &შენახვა... + + + Text (*.txt) + ტექსტური ფაილები (*.txt) + + + Save license to file... + ლიცენზიის ფაილში ჩაწერა... + + + + UIIndicatorsPool + + Adapter %1 (%2) + Network tooltip + ადაპტერი %1 (%2) + + + IP + Network tooltip + IP + + + Cable + Network tooltip + კაბელი + + + Connected + cable (Network tooltip) + დაკავშირებულია + + + Disconnected + cable (Network tooltip) + განკავშირებულია + + + No USB devices attached + USB tooltip + USB მოწყობილობები მიერთებული არაა + + + No shared folders + Shared folders tooltip + გაზიარებული საქაღალდეების გარეშე + + + Video memory + Display tooltip + ვიდეო მეხსიერება + + + Screens + Display tooltip + ეკრანები + + + 3D acceleration + Display tooltip + 3D აჩქარება + + + Recording disabled + Recording tooltip + ჩაწერა გამორთულია + + + Video/audio recording file + Recording tooltip + ვიდეო/აუდიო ჩანაწერის ფაილი + + + Audio recording file + Recording tooltip + აუდიო ჩანაწერის ფაილი + + + Video recording file + Recording tooltip + ვიდეო ჩანაწერის ფაილი + + + Indicates whether the host mouse pointer is captured by the guest OS:%1 + Mouse tooltip + აჩვენებს, ჩაჭერილია თუ არა თაგუნას კურსორი სტუმარი ოს-ის მიერ: %1 + + + pointer is not captured + Mouse tooltip + კურსორი არ იწერება + + + pointer is captured + Mouse tooltip + კურსორი იწერება + + + mouse integration (MI) is On + Mouse tooltip + თაგუნას ინტეგრაცია ჩართულია + + + MI is Off, pointer is captured + Mouse tooltip + თაგუნას ინტეგრაცია გამორთულია, კურსორი იწერება + + + MI is Off, pointer is not captured + Mouse tooltip + თაგუნას ინტეგრაცია ჩართულია, კურსორი არ იწერება + + + Note that the mouse integration feature requires Guest Additions to be installed in the guest OS. + Mouse tooltip + + + + Indicates whether the host keyboard is captured by the guest OS:%1 + Keyboard tooltip + + + + keyboard is not captured + Keyboard tooltip + კლავიატურა გადაჭერილი არაა + + + keyboard is captured + Keyboard tooltip + კლავიატურა გადაჭერილია + + + + UIItemHostNetwork + + Enable + DHCP Server + ჩართვა + + + Adapter + ადაპტერი + + + Automatically configured + interface + ავტომატურად მორგებული + + + Manually configured + interface + ხელით მორგებული + + + IPv4 Address + IPv4 მისამართი + + + Not set + address + დაყენებული არაა + + + IPv4 Network Mask + IPv4 ქსელის ნიღბის მისამართი + + + Not set + mask + დაყენებული არაა + + + IPv6 Address + IPv6 მისამართი + + + IPv6 Prefix Length + IPv6 პრექფიქსის სიგრძე + + + Not set + length + დაყენებული არაა + + + DHCP Server + DHCP სერვერი + + + Enabled + server + ჩართულია + + + Disabled + server + გამორთულია + + + Address + მისამართი + + + Network Mask + ქსელის ნიღაბი + + + Lower Bound + ქვედა ზღვარი + + + Not set + bound + დაყენებული არაა + + + Upper Bound + ზედა ზღვარი + + + + UIItemNetworkNAT + + %1, %2 + col.2 text, col.1 name + %1, %2 + + + %1 + col.2 text + %1% + + + Network Name + ქსელის სახელი + + + [empty] + [ცარიელი] + + + %1 (renamed from %2) + %1 (გადარქმებული %2-დან) + + + Old Network Name + ქსელის ძველი სახელი + + + New Network Name + ქსელის ახალი სახელი + + + Network CIDR + ქსელის CIDR + + + Supports DHCP + DHCP-ის მხრდაჭერა + + + yes + დიახ + + + no + არა + + + Supports IPv6 + IPv6-ის მხარდაჭერა + + + Default IPv6 route + IPv6-ის ნაგულისხმები რაუტი + + + No new name specified for the NAT network previously called <b>%1</b>. + + + + No CIDR specified for the NAT network <b>%1</b>. + + + + No CIDR specified for the NAT network previously called <b>%1</b>. + + + + Invalid CIDR specified (<i>%1</i>) for the NAT network <b>%2</b>. + + + + Invalid CIDR specified (<i>%1</i>) for the NAT network previously called <b>%2</b>. + + + + + UILanguageItem + + (built-in) + Language + (ჩაშენებული) + + + <unavailable> + Language + <unavailable> + + + <unknown> + Author(s) + <უცნობი> + + + Default + Language + ნაგულისხმევი + + + + UILineTextEdit + + &Edit + რ&ედაქტირება + + + + UIMachineLogic + + Select a filename for the screenshot ... + + + + + UIMachinePreview + + No preview + გადახედვის გარეშე + + + Update disabled + განახლების გამორთვა + + + Every 0.5 s + ყოველ 0.5 წმ + + + Every 1 s + ყოველ 1 წმ + + + Every 2 s + ყოველ 2 წმ + + + Every 5 s + ყოველ 5 წმ + + + Every 10 s + ყოველ 10 წმ + + + + UIMachineSettingsAudio + + When checked, a virtual PCI audio card will be plugged into the virtual machine and will communicate with the host audio system using the specified driver. + + + + Enable &Audio + აუდიოს ჩართვა + + + Host Audio &Driver: + ჰოსტის აუდიო &დრაივერი: + + + Audio &Controller: + აუდიო &კონტროლერი: + + + Selects the type of the virtual sound card. Depending on this value, VirtualBox will provide different audio hardware to the virtual machine. + + + + Selects the audio output driver. The <b>Null Audio Driver</b> makes the guest see an audio card, however every access to it will be ignored. + + + + Extended Features: + გაფართოებული თვისებები: + + + When checked, output to the virtual audio device will reach the host. Otherwise the guest is muted. + + + + Enable Audio &Output + აუდიო &გამოტანის ჩართვა + + + When checked, the guest will be able to capture audio input from the host. Otherwise the guest will capture only silence. + + + + Enable Audio &Input + აუდიო შეტანის &ჩართვა + + + + UIMachineSettingsDisplay + + Video &Memory: + ვიდეო &მეხსიერება: + + + Controls the amount of video memory provided to the virtual machine. + + + + Extended Features: + გაფართოებული თვისებები: + + + When checked, the virtual machine will be given access to the 3D graphics capabilities available on the host. + + + + Enable &3D Acceleration + &3D აჩქარების ჩართვა + + + &Remote Display + &დაშორებული ეკრანი + + + 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. + + + + &Enable Server + &სერვერის ჩართვა + + + Server &Port: + სერვერის &პორტი: + + + Authentication &Method: + ავთენტიკაციის &მეთოდი: + + + Authentication &Timeout: + ავთენტიკაციის &ვადა: + + + When checked, the virtual machine will be given access to the Video Acceleration capabilities available on the host. + + + + Enable &2D Video Acceleration + &2D ვიდეო აჩქარების ჩართვა + + + Mo&nitor Count: + &ეკრანების რაოდენობა: + + + Controls the amount of virtual monitors provided to the virtual machine. + + + + &Allow Multiple Connections + ბევრი &კავშირის დაშვება + + + When checked, VirtualBox will record the virtual machine session as a video file. + + + + File &Path: + ფაილის &ბილიკი: + + + Frame &Size: + კადრის &ზომა: + + + &Frame Rate: + &კადრების სიხშირე: + + + &Screens: + &ეკრანები: + + + &Screen + &ეკრანი + + + Scale Factor: + გადიდების ფაქტორი: + + + Controls the guest screen scale factor. + სტუმრის ეკრანის გადიდების კოეფიციენტი. + + + Acceleration: + აპარატურული აჩქარება: + + + Holds the VRDP Server port number. You may specify <tt>0</tt> (zero), to select port 3389, the standard port for RDP. + + + + Selects the VRDP authentication method. + აირჩევს VRDP-ის ავთენტიკაციის მეთოდს. + + + Holds the timeout for guest authentication, in milliseconds. + + + + When checked, multiple simultaneous connections to the VM are permitted. + + + + Holds the filename VirtualBox uses to save the recorded content. + + + + Selects the resolution (frame size) of the recorded video. + + + + Holds the <b>horizontal</b> resolution (frame width) of the recorded video. + + + + Holds the <b>vertical</b> resolution (frame height) of the recorded video. + + + + Controls 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. + + + + Controls the <b>quality</b>. Increasing this value will make the video look better at the cost of an increased file size. + + + + Holds 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. + + + + &Audio Quality: + &აუდიოს ხარისხი: + + + 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. + + + + The virtual machine is currently assigned less than <b>%1</b> of video memory which is the minimum amount required to switch to full-screen or seamless mode. + + + + 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. + + + + 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>. + + + + The virtual machine is set up to use Video Stream Acceleration. As this feature only works with Windows guest systems it will be disabled. + + + + Remote Display is currently enabled for this virtual machine. However, this requires the <i>%1</i> to be installed. Please install the Extension Pack from the VirtualBox download site as otherwise your VM will be started with Remote Display disabled. + + + + The VRDE server port value is not currently specified. + VRDE სერვერის პორტის მნიშვნელობა ამჟამად მითითებული არაა. + + + The VRDE authentication timeout value is not currently specified. + VRDE-ის ავთენტიკაციის ვადის მნიშვნელობა ამჟამად მითითებული არაა. + + + fps + კადრი/წმ + + + kbps + კბ/წმ + + + User Defined + მომხმარებლის მიერ განსაზღვრული + + + %1 fps + %1 კადრი/წმ + + + low + quality + დაბალი + + + medium + quality + საშუალო + + + high + quality + მაღალი + + + <i>About %1MB per 5 minute video</i> + <i>დაახლოებით %1მბ ვიდეოს ყოველ 5 წუთში</i> + + + Screen %1 + %1-ე ეკრანი + + + When checked, enables video recording for screen %1. + თუ ჩართულია, ჩართავს %1-ე ეკრანის ვიდეოს ჩაწერას. + + + &Graphics Controller: + &გრაფიკული კონტროლერი: + + + Selects the graphics adapter type the virtual machine will use. + აირჩიეთ ვირტუალური მანქანის გრაფიკული ადაპტერის ტიპი. + + + Re&cording + &ჩაწერა + + + &Enable Recording + &ჩაწერის ჩართვა + + + Recording &Mode: + &ჩაწერის რეჟიმი: + + + Selects the recording mode. + ჩაწერის რეჟიმის არჩევა. + + + &Video Quality: + &ვიდეოს ხარისხი: + + + Controls the <b>quality</b>. Increasing this value will make the audio sound better at the cost of an increased file size. + + + + The virtual machine is configured to use 3D acceleration. This will work only if you pick a different graphics controller (%1). Either disable 3D acceleration or switch to required graphics controller type. The latter will be done automatically if you confirm your changes. + + + + The virtual machine is configured to use a graphics controller other than the recommended one (%1). Please consider switching unless you have a reason to keep the currently selected graphics controller. + + + + + UIMachineSettingsGeneral + + Basi&c + &ძირითადი + + + A&dvanced + &დამატებითი + + + &Shared Clipboard: + &გაზიარებული ბუფერი: + + + 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. + + + + S&napshot Folder: + &სწრაფი ასლის საქაღალდე: + + + D&escription + &აღწერა + + + Holds the description of the virtual machine. The description field is useful for commenting on configuration details of the installed guest OS. + + + + D&rag'n'Drop: + წაღება და დაგდება: + + + 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. + + + + E&nter New Password: + &შეყვანეთ ახალი პაროლი: + + + C&onfirm New Password: + &დაადასტურეთ ახალი პაროლი: + + + Selects the cipher to be used for encrypting the virtual machine disks. + + + + Disk Enc&ryption + &დისკის დაშიფვრა + + + When checked, disks attached to this virtual machine will be encrypted. + + + + En&able Disk Encryption + &დისკის დაშიფვრის ჩართვა + + + Disk Encryption C&ipher: + &დისკის დაშიფვრის მექანიზმი: + + + Holds the encryption password for disks attached to this virtual machine. + + + + Confirms the disk encryption password. + დაადასტურეთ დისკის დაშიფვრის პაროლი. + + + No name specified for the virtual machine. + ვირტუალური მანქანის სახელი მითითებული არაა. + + + 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. + + + + You are trying to enable disk encryption for this virtual machine. However, this requires the <i>%1</i> to be installed. Please install the Extension Pack from the VirtualBox download site. + + + + Disk encryption cipher type not specified. + დისკის შიფრაციის მექანიზმი მითითებული არაა. + + + Disk encryption password empty. + დისკის დაშიფვრის პაროლი ცარიელია. + + + Disk encryption passwords do not match. + დისკის დაშიფვრის პაროლები არ ემთხვევა. + + + Holds the path where snapshots of this virtual machine will be stored. Be aware that snapshots can take quite a lot of storage space. + + + + Leave Unchanged + cipher type + შეუცვლელად დატოვება + + + + UIMachineSettingsInterface + + Allows to modify VM menu-bar contents. + ვმ-ის მენიუს ზოლის ჩასწორების ნების დართვა. + + + Mini ToolBar: + მინი ზოლი: + + + Show at &Top of Screen + &ეკრანის თავზე ჩვენება + + + Allows to modify VM status-bar contents. + ვმ-ის სტატუსის ზოლის ჩასწორების ნების დართვა. + + + When checked, show the Mini ToolBar in full-screen and seamless modes. + + + + Show in &Full-screen/Seamless + &მთელ ეკრანზე/გამჭვირვალე რეჟიმში ჩვენება + + + When checked, show the Mini ToolBar at the top of the screen, rather than in its default position at the bottom of the screen. + + + + + UIMachineSettingsNetwork + + When checked, plugs this virtual network adapter into the virtual machine. + + + + &Enable Network Adapter + &ქსელის ადაპტერის ჩართვა + + + Selects the type of the virtual network adapter. Depending on this value, VirtualBox will provide different network hardware to the virtual machine. + + + + &Attached to: + &რაზეა მიბმული: + + + Adapter &Type: + ადაპტერი და ტიპი: + + + &Name: + &სახელი: + + + A&dvanced + &დამატებითი + + + 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. + + + + Generates a new random MAC address. + ახალი MAC მისამართის გენერაცია. + + + &Cable Connected + &კაბელი მიერთებულია + + + &Port Forwarding + &პორტის გადამისამართება + + + &Promiscuous Mode: + + + + Selects the promiscuous mode policy of the network adapter when attached to an internal network, host only network or a bridge. + + + + Generic Properties: + ზოგადი პარამეტრები: + + + &MAC Address: + &MAC მისამართი: + + + Selects how this virtual adapter is attached to the real network of the Host OS. + + + + Shows additional network adapter options. + ქსელის ბარათის დამატებითი პარამეტრების ჩვენება. + + + Holds the configuration settings for the network attachment driver. The settings should be of the form <b>name=value</b> and will depend on the driver. Use <b>shift-enter</b> to add a new entry. + + + + When checked, the virtual network cable is plugged in. + როცა ჩართულია, ვირტუალური ქსელის კაბელი შეერთებულია. + + + Displays a window to configure port forwarding rules. + პორტის გადამისამართების მორგების ფანჯრის ჩვენება. + + + No bridged network adapter is currently selected. + ხიდის ტიპის ქსელის ბარათები ამჟამად მონიშნული არაა. + + + No internal network name is currently specified. + შიდა ქსელის სახელი ამჟამად მონიშნული არაა. + + + No host-only network adapter is currently selected. + მხოლოდ-ჰოსტის ტიპის ქსელის ბარათი ამჟამად მონიშნული არაა. + + + No generic driver is currently selected. + ზოგადი დრაივერი ამჟამად მონიშნული არაა. + + + No NAT network name is currently specified. + NAT ქსელის სახელი ამჟამად მითითებული არაა. + + + The MAC address must be 12 hexadecimal digits long. + MAC მისამართი 12 თექვსმეტობითი რიცხვის სიგრძის შეიძლება იყოს. + + + The second digit in the MAC address may not be odd as only unicast addresses are allowed. + + + + No cloud network name is currently specified. + ღრუბლოვანი ქსელის სახელი ამჟამად მითითებული არაა. + + + + UIMachineSettingsPortForwardingDlg + + Port Forwarding Rules + პორტის გადამისამართების წესები + + + + UIMachineSettingsSF + + 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. + + + + Name + სახელი + + + Path + ბილიკი + + + Access + წვდომა + + + Shared &Folders + გაზიარებული &საქაღალდე + + + Auto Mount + ავტომატური მიმაგრება + + + At + წერტილი + + + Add Shared Folder + გაზიარებული საქაღალდის დამატება + + + Edit Shared Folder + გაზიარებული საქაღალდის ჩასწორება + + + Remove Shared Folder + გაზიარებული საქაღალდის წაშლა + + + Adds new shared folder. + ახალი გაზიარებული საქაღალდის დამატება. + + + Edits selected shared folder. + გაზიარებული საქაღალდის ჩასწორება. + + + Removes selected shared folder. + მონიშნული გაზიარებული საქაღალდის წაშლა. + + + Machine Folders + მანქანის საქაღალდეები + + + Transient Folders + დროებითი საქაღალდეები + + + + UIMachineSettingsSFDetails + + Folder Path: + საქაღალდის ბილიკი: + + + Folder Name: + საქაღალდის სახელი: + + + Holds the name of the shared folder (as it will be seen by the guest OS). + + + + When checked, the guest OS will not be able to write to the specified shared folder. + + + + &Read-only + მხოლოდ წაკითხვა + + + &Make Permanent + &მუდმივად გარდაქმნა + + + When checked, the guest OS will try to automatically mount the shared folder on startup. + + + + &Auto-mount + &ავტომატური მიმაგრება + + + When checked, this shared folder will be permanent. + + + + Mount point: + &მიმაგრების წერტილი: + + + Where to automatically mount the folder in the guest. A drive letter (e.g. 'G:') for Windows and OS/2 guests, path for the others. If left empty the guest will pick something fitting. + + + + Add Share + გაზიარების დამატება + + + Edit Share + გაზიარების ჩასწორება + + + + UIMachineSettingsSerial + + When checked, enables the given serial port of the virtual machine. + თუ ჩართულია, ვირტუალურ მანქანაში შესაბამისისერიული პორტი ჩაირთვება. + + + &Enable Serial Port + &სერიული პორტის ჩართვა + + + Port &Number: + პორტის &ნომერი: + + + 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. + აირჩიეთ პორტის ნომერი. შეგიძლიათ აირჩიეთ ერთ-ერთი სტანდარტული სერიული პორტი ან აირჩიოთ <b>ხელით მითითებული</b> და ხელით შეიყვანოთ მნიშვნელობები. + + + &IRQ: + &IRQ: + + + I/O Po&rt: + I/O პო&რტი: + + + Port &Mode: + პორტის რ&ეჟიმი: + + + 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. + + + + 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>. + + + + &Connect to existing pipe/socket + &არსებულ ფაიფთან/სოკეტთან დაკავშირება + + + &Path/Address: + &ბილიკი/მისამართი: + + + <p>In <b>Host Pipe</b> mode: Holds the path to the serial port's pipe on the host. Examples: "\\.\pipe\myvbox" or "/tmp/myvbox", for Windows and UNIX-like systems respectively.</p><p>In <b>Host Device</b> mode: Holds the host serial device name. Examples: "COM1" or "/dev/ttyS0".</p><p>In <b>Raw File</b> mode: Holds the file-path on the host system, where the serial output will be dumped.</p><p>In <b>TCP</b> mode: Holds the TCP "port" when in server mode, or "hostname:port" when in client mode. + + + + Selects 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. + + + + When checked, the virtual machine will assume that the pipe or socket specified in the <b>Path/Address</b> field exists and try to use it. Otherwise, the pipe or socket will be created by the virtual machine when it starts. + + + + Port %1 + serial ports + პორტი %1 + + + No IRQ is currently specified. + IRQ ამჟამად მითითებული არაა. + + + No I/O port is currently specified. + I/O პორტი ამჟამად მითითებული არაა. + + + Two or more ports have the same settings. + ერთს ან მეტ პორტს ერთი და იგივე პარამეტრები აქვს. + + + No port path is currently specified. + ამჟამად პორტის ბილიკი მითითებული არა. + + + There are currently duplicate port paths specified. + ამჟამად მითითებულია რამდენიმე დუბლირებული პორტის ბილიკი. + + + + UIMachineSettingsStorage + + Information + ინფორმაცია + + + The Storage Tree can contain several controllers of different types. This machine currently has no controllers. + + + + Attributes + ატრიბუტები + + + &Name: + &სახელი: + + + &Type: + &ტიპი: + + + Selects the sub-type of the storage controller currently selected in the Storage Tree. + + + + Selects the slot on the storage controller used by this attachment. The available slots depend on the type of the controller and other attachments on it. + + + + When checked, allows the guest to send ATAPI commands directly to the host-drive which makes it possible to use CD/DVD writers connected to the host inside the VM. Note that writing audio CD inside the VM is not yet supported. + + + + &Passthrough + &გამჭოლი + + + Virtual Size: + ვირტუალური ზომა: + + + Actual Size: + რეალური ზომა: + + + Size: + ზომა: + + + Location: + მდებარეობა: + + + Type (Format): + ტიპი (ფორმატი) + + + Attached to: + მიბმულია: + + + Use Host I/O Cache + ჰოსტის I/O ქეშის გამოყენება + + + Type: + ტიპი: + + + &Live CD/DVD + ცოცხალი &CD/DVD + + + &Solid-state Drive + &SSD + + + Details: + დეტალები: + + + &Port Count: + &პორტების რიცხვი: + + + Selects the port count of the SATA storage controller currently selected in the Storage Tree. This must be at least one more than the highest port number you need to use. + + + + Controller: %1 + კონტროლერი: %1 + + + &Hot-pluggable + &ცხლად-შეერთებადი + + + Encrypted with key: + დაშიფვრის გასაღები: + + + Holds the name of the storage controller currently selected in the Storage Tree. + + + + When checked, allows to use host I/O caching capabilities. + + + + When checked, the virtual disk will not be removed when the guest system ejects it. + + + + When checked, the guest system will see the virtual disk as a solid-state device. + + + + When checked, the guest system will see the virtual disk as a hot-pluggable device. + + + + &Storage Devices + &საცავი მოწყობილობები + + + Remove disk from virtual drive + დისკის ვირტუალური მატარებლიდან გამოღება + + + <nobr><b>%1</b></nobr><br><nobr>Bus:&nbsp;&nbsp;%2</nobr><br><nobr>Type:&nbsp;&nbsp;%3</nobr> + <nobr><b>%1</b></nobr><br><nobr>მატარებელი:&nbsp;&nbsp;%2</nobr><br><nobr>ტიპი:&nbsp;&nbsp;%3</nobr> + + + Host Drive + ჰოსტის დისკი + + + Image + storage image + გამოსახულება + + + <nobr>Expands/Collapses&nbsp;item.</nobr> + <nobr>ჩანაწერის&nbsp;ჩაკეცვა/ამოკეცვა.</nobr> + + + <nobr>Adds&nbsp;hard&nbsp;disk.</nobr> + <nobr>მყარი&nbsp;დისკის&nbsp;დამატება.</nobr> + + + <nobr>Adds&nbsp;optical&nbsp;drive.</nobr> + <nobr>ოპტიკური&nbsp;დისკის&nbsp;დამატება.</nobr> + + + <nobr>Adds&nbsp;floppy&nbsp;drive.</nobr> + <nobr>დისკეტის&nbsp;დამატება&nbsp;.</nobr> + + + No name is currently specified for the controller at position <b>%1</b>. + + + + The controller at position <b>%1</b> has the same name as the controller at position <b>%2</b>. + + + + No hard disk is selected for <i>%1</i>. + + + + <i>%1</i> is using a disk that is already attached to <i>%2</i>. + + + + at most one supported + controller + მხარდაჭერილია ერთი მაინც + + + up to %1 supported + controllers + მხარდაჭერილია %1-მდე ერთეული + + + 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 + + + + Lists all storage controllers for this machine and the virtual images and host drives attached to them. + + + + Add Controller + კონტროლერის დაატება + + + Remove Controller + კონტროლერის წაშლა + + + Add Attachment + მიმაგრების დამატება + + + Remove Attachment + მიმაგრების მოხსნა + + + Adds new storage controller. + საცავის ახალი კონტროლერის დამატება. + + + Removes selected storage controller. + საცავის მონიშნული კონტროლერის წაშლა. + + + Adds new storage attachment. + ახალი საცავის მიბმა. + + + Removes selected storage attachment. + მონიშნული მიბმული საცავის მოხსნა. + + + Hard &Disk: + მყარი &დისკი: + + + 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. + + + + Optical &Drive: + ოპტიკური &დისკი: + + + Choose a virtual optical 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. + + + + Floppy &Drive: + &დისკეტა: + + + 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. + + + + Remove Disk from Virtual Drive + დისკის ვირტუალური მატარებლიდან გამოღება + + + PIIX3 (IDE) + PIIX3 (IDE) + + + PIIX4 (Default IDE) + PIIX4 (ნაგულისხმები IDE) + + + ICH6 (IDE) + ღრუბლოვანი მანქანის შექმნა... + + + AHCI (SATA) + ღრუბლოვანი მანქანის შექმნა... + + + LsiLogic (Default SCSI) + LsiLogic (ნაგულისხმები SCSI) + + + BusLogic (SCSI) + BusLogic (SCSI) + + + LsiLogic SAS (SAS) + LsiLogic SAS (SAS) + + + I82078 (Floppy) + I82078 (დისკეტა) + + + USB + USB + + + NVMe (PCIe) + NVMe (PCIe) + + + virtio-scsi + virtio-scsi + + + Hard Disk + მყარი დისკი + + + Optical Drive + ოპტიკური დისკი + + + Floppy Drive + დისკეტა + + + Choose/Create a Virtual Hard Disk... + აირჩიეთ/შექმენით ვირტუალური მყარი დისკი... + + + Choose a disk file... + აირციეთ დისკის ფაილი... + + + Choose/Create a Virtual Optical Disk... + აირჩეთ/შექმენით ვირტუალური ოპტიკური დისკი... + + + Choose/Create a Virtual Floppy Disk... + აირჩიეთ/შექმენით ვირტუალური დისკეტა... + + + Choose/Create a disk image... + აირჩიეთ/შექმენით დისკის გამოსახულება... + + + + UIMachineSettingsSystem + + &Motherboard + &მთავარი დაფა + + + Base &Memory: + &საბაზისო მეხსიერება: + + + Controls the amount of memory provided to the virtual machine. If you assign too much, the machine might not start. + აკონტროლებს ვირტუალური მანქანისთვის მინიშებულ მეხსიერებას. თუ მიანიჭებთ მეტისმეტად ბევრს, მანქანა შეიძლება არ ჩაირთოს. + + + &Boot Order: + &ჩატვირთვის მიმდევრობა: + + + 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. + + + + Extended Features: + გაფართოებული თვისებები: + + + 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! + თუ ჩართულია, ვირტუალურ მანქანას შეტანა გამოტანს კონტროლერის (I/O APIC) მხარდაჭერა ექნება. ამან შეიძლება წარმადობა ოდნავ დააგდოს<b>დაიმახსოვრეთ:</b> არ გამორთოთ ეს პარამეტრი, თუ სტუმარი ოს-ი Windows-ია და უკვე დააყენეთ! + + + Enable &I/O APIC + &I/O APIC-ის ჩართვა + + + &Processor + &პროცესორი + + + &Processor(s): + &პროცესორ(ებ)-ი: + + + When checked, the Physical Address Extension (PAE) feature of the host CPU will be exposed to the virtual machine. + თუ ჩართულია, ვირტუალური მანქანა დაინახავს CPU-ის ფიზიკური მისამართის გაფართოების (PAE) თვისებას. + + + Enable PA&E/NX + PA&E/NX-ის ჩართვა + + + Acce&leration + ა&პარატურული აჩქარება + + + Hardware Virtualization: + აპარატურული ვირტუალიზაცია: + + + 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. + + + + Enable &VT-x/AMD-V + &VT-x/AMD-V-ის ჩართვა + + + When checked, the virtual machine will try to make use of the nested paging extension of Intel VT-x and AMD-V. + + + + Enable Nested Pa&ging + მეხსიერების გვერდების ერთმანეთში ჩალაგების მხარდაჭერა + + + 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. + + + + Enable &EFI (special OSes only) + &EFI-ის ჩართვა (მხოლოდ სპეციალური ოს-ებისთვის) + + + Hardware Clock in &UTC Time + აპარატურული საათი &UTC-ში + + + 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. + + + + &Chipset: + &ჩიპსეტი: + + + Selects the chipset to be emulated in this virtual machine. Note that the ICH9 chipset emulation is experimental and not recommended except for guest systems (such as Mac OS X) which require it. + + + + &Execution Cap: + &შესრულების პიკი: + + + 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. + + + + &Pointing Device: + &მისათითებელი მოწყობილობა: + + + Determines whether the emulated pointing device is a standard PS/2 mouse, a USB tablet or a USB multi-touch tablet. + + + + &Paravirtualization Interface: + &პარავირტუალიზაციის ინტერფეისი: + + + Selects the paravirtualization guest interface provider to be used by this virtual machine. + + + + When 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. + + + + % + % + + + 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. + + + + 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. + + + + The I/O APIC feature is not currently enabled in the Motherboard section of the System page. This is needed to support a chipset of type ICH9. It will be enabled automatically if you confirm your changes. + + + + The USB controller emulation is not currently enabled on the USB page. This is needed to support an emulated USB pointing device. It will be enabled automatically if you confirm your changes. + + + + 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. + + + + 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. + + + + The I/O APIC feature is not currently enabled in the Motherboard section of the System page. This is needed to support more than one virtual processor. It will be enabled automatically if you confirm your changes. + + + + The hardware virtualization is not currently enabled in the Acceleration section of the System page. This is needed to support more than one virtual processor. It will be enabled automatically if you confirm your changes. + + + + The processor execution cap is set to a low value. This may make the machine feel slow to respond. + + + + Please consider lowering the number of CPUs assigned to the virtual machine rather than setting the processor execution cap. + + + + Lowering the processor execution cap may result in a decline in performance. + + + + %1 CPU + %1 is 1 for now + %1 CPU + + + %1 CPUs + %1 is host cpu count * 2 for now + %1 CPU + + + %1% + %1% + + + When checked, the nested hardware virtualization CPU feature will be exposed to the virtual machine. + + + + Enable Nested &VT-x/AMD-V + ჩალაგებული &VT-x/AMD-V-ის ჩართვა + + + The hardware virtualization is not currently enabled in the Acceleration section of the System page. This is needed to support nested hardware virtualization. It will be enabled automatically if you confirm your changes. + + + + The nested paging is not currently enabled in the Acceleration section of the System page. This is needed to support nested hardware virtualization. It will be enabled automatically if you confirm your changes. + + + + The hardware virtualization is not currently enabled in the Acceleration section of the System page. This is needed for nested paging support. It will be enabled automatically if you confirm your changes. + + + + + UIMachineSettingsUSB + + When checked, enables the virtual USB controller of this machine. + თუ ჩართულია, ამ მანქანაზე ვირტუალური USB კონტროლერი ჩაირთვება. + + + Enable &USB Controller + &USB კონტროლერის ჩართვა + + + USB Device &Filters + &USB მოწყობილობების ფილტრი + + + 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. + + + + [filter] + [ფილტრი] + + + USB &1.1 (OHCI) Controller + USB &1.1 (OHCI) კონტროლერი + + + USB &3.0 (xHCI) Controller + USB &3.0 (xHCI) კონტროლერი + + + When chosen, enables the virtual USB OHCI controller of this machine. The USB OHCI controller provides USB 1.0 support. + + + + When chosen, enables the virtual USB xHCI controller of this machine. The USB xHCI controller provides USB 3.0 support. + + + + USB 2.0/3.0 is currently enabled for this virtual machine. However, this requires the <i>%1</i> to be installed. Please install the Extension Pack from the VirtualBox download site or disable USB 2.0/3.0 to be able to start the machine. + + + + Add Empty Filter + ცარიელი ფილტრის დაატება + + + Add Filter From Device + ფილტრის მოწყობილობიდან დამატება + + + Edit Filter + ფილტრის ჩასწორება + + + Remove Filter + ფილტრის წაშლა + + + Move Filter Up + მონიშნული ფილტრის მაღლა აწევა + + + Move Filter Down + მონიშნული ფილტრის დაბლა დაწევა + + + Adds new USB filter with all fields initially set to empty strings. Note that such a filter will match any attached USB device. + + + + Adds new USB filter with all fields set to the values of the selected USB device attached to the host PC. + + + + Edits selected USB filter. + მონიშნული USB ფილტრის ჩასწორება. + + + Removes selected USB filter. + მონიშნული USB ფილტრის წაშლა. + + + Moves selected USB filter up. + მონიშნული USB ფილტრის მაღლა აწევა. + + + Moves selected USB filter down. + მონიშნული USB ფილტრის დაბლა დაწევა. + + + New Filter %1 + usb + ახალი ფილტრი %1 + + + When chosen, enables the virtual USB OHCI and EHCI controllers of this machine. Together they provide USB 2.0 support. + + + + USB &2.0 (OHCI + EHCI) Controller + USB &2.0 (OHCI + EHCI) კონტროლერი + + + + UIMachineSettingsUSBFilterDetails + + &Name: + &სახელი: + + + Holds the filter name. + შეიცავს ფილტრის სახელს. + + + &Vendor ID: + &მომწოდებლის ID: + + + &Product ID: + &პროდუქტის ID: + + + &Revision: + &რევიზია: + + + &Manufacturer: + &მწარმოებელი: + + + Pro&duct: + &პროდუქტი: + + + &Serial No.: + &სერიული ნომერი: + + + Por&t: + &პორტი: + + + R&emote: + &დაშორებული: + + + USB Filter Details + USB ფილტრის დეტალები + + + Holds 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. + შეიცავს მომწოდებლის ID-ის ფილტრს. სტრიქონის <i>ზუსტი დამთხვევის</i>რაოდენობაა <tt> XXXX</tt>სადაც <tt>X</tt>თექვსმეტობით ციფრს წარმოადგენს. ცარიელი სტრიქონი ნებისმიერ მნიშვნელობას დაემთხვევა. + + + Holds 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. + შეიცავს პროდუქტის ID-ის ფილტრს. სტრიქონის <i>ზუსტი დამთხვევის</i>რაოდენობაა <tt> XXXX</tt>სადაც <tt>X</tt>თექვსმეტობით ციფრს წარმოადგენს. ცარიელი სტრიქონი ნებისმიერ მნიშვნელობას დაემთხვევა. + + + Holds 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. + + + + Holds the manufacturer filter as an <i>exact match</i> string. An empty string will match any value. + + + + Holds the product name filter as an <i>exact match</i> string. An empty string will match any value. + + + + Holds the serial number filter as an <i>exact match</i> string. An empty string will match any value. + + + + Holds the host USB port filter as an <i>exact match</i> string. An empty string will match any value. + + + + Holds 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>). + + + + Any + remote + ნებისმიერი + + + Yes + remote + დიახ + + + No + remote + არა + + + + UIMachineWindow + + EXPERIMENTAL build %1r%2 - %3 + ექსპერიმენტალური ბილდი %1r%2 - %3 + + + + UIMachineWindowNormal + + 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. + + + + + UIMediumDetailsWidget + + &Attributes + &ატრიბუტები + + + &Information + &ინფორმაცია + + + &Type: + &ტიპი: + + + &Location: + &მდებარეობა: + + + &Description: + &აღწერა: + + + &Size: + &ზომა: + + + Holds the type of this medium. + შეიცავს ამ დისკის ტიპს. + + + Holds the location of this medium. + შეიცავს ამ დისკის მდებარეობას. + + + Holds the description of this medium. + შეიცავს ამ დისკის აღწერას. + + + Holds the size of this medium. + შეიცავს ამ დისკის ზომას. + + + Reset + თავიდან ჩართვა + + + Apply + გადატარება + + + Reset changes in current medium details + მიმდინარე დისკის დეტალების ცვლილებების გაუქმება + + + Apply changes in current medium details + მიმდინარე დისკის დეტალების ცვლილებების გადატარება + + + Reset Changes (%1) + ცვლილებების დაბრუნება (%1) + + + Apply Changes (%1) + ცვლილებების გადატარება (%1) + + + Cannot change medium size from <b>%1</b> to <b>%2</b> as storage shrinking is currently not implemented. + + + + Choose Medium Location + აირჩიეთ დისკის მდებარეობა + + + Location can not be empty. + მდებარეობა ცარიელი ვერ იქნება. + + + This type of medium is attached directly or indirectly, preserved when taking snapshots. + + + + This type of medium is attached indirectly, changes are wiped out the next time the virtual machine is started. + + + + This type of medium is attached directly, ignored when taking snapshots. + + + + This type of medium is attached directly, allowed to be used concurrently by several machines. + + + + This type of medium is attached directly, and can be used by several machines. + + + + This type of medium is attached indirectly, so that one base medium can be used for several VMs which have their own differencing medium to store their modifications. + + + + + UIMediumItem + + Current extension (*.%1) + მიმდინარე გაფართოება *.%1) + + + Choose the location of this medium + აირჩიეთ ამ დისკის მდებარეობა + + + %1, %2: %3, %4: %5 + col.1 text, col.2 name: col.2 text, col.3 name: col.3 text + %1, %2: %3, %4: %5 + + + Format: + ფორმატი: + + + Storage details: + საცავის დეტალები: + + + Attached to: + მიბმულია: + + + Encrypted with key: + დაშიფვრის გასაღები: + + + UUID: + UUID: + + + <i>Not&nbsp;Attached</i> + <i>მიბმული&nbsp;არაა</i> + + + <i>Not&nbsp;Encrypted</i> + <i>დაშიფრული&nbsp;არაა</i> + + + -- + no info + -- + + + Moving medium ... + დისკის გადატანა.... + + + Removing medium ... + დისკის წაშლა... + + + + UIMediumManager + + &Optical disks + &ოპტიკური დისკები + + + &Floppy disks + &დისკეტები + + + &Hard disks + &მყარი დისკები + + + Name + სახელი + + + Virtual Size + ვირტუალური ზომა + + + Actual Size + რეალური ზომა + + + Size + ზომა + + + Checking accessibility + წვდომის შემოწმება + + + Virtual Media Manager + ვირტუალური მედიის მმართველი + + + Reset + თავიდან ჩართვა + + + Apply + გადატარება + + + Close + დახურვა + + + Reset changes in current medium details + მიმდინარე დისკის დეტალების ცვლილებების გაუქმება + + + Apply changes in current medium details + მიმდინარე დისკის დეტალების ცვლილებების გადატარება + + + Close dialog without saving + დახურვა შენახვის გარეშე + + + Reset Changes (%1) + ცვლილებების დაბრუნება (%1) + + + Apply Changes (%1) + ცვლილებების გადატარება (%1) + + + Close Window (%1) + ფანჯრის დახურვა (%1) + + + Current extension (*.%1) + მიმდინარე გაფართოება *.%1) + + + Choose the location of this medium + აირჩიეთ ამ დისკის მდებარეობა + + + Moving medium ... + დისკის გადატანა.... + + + Resizing medium ... + ზომის შეცვლა ... + + + + UIMediumSearchWidget + + Search By Name + სახელით ძებნა + + + Search By UUID + UUID-ით ძებნა + + + Select the search type + ძებნის ტიპით ძებნა + + + + UIMediumSelector + + &Add... + &დამატება.. + + + Add Disk Image + დისკის გამოსახულების დამატება + + + Add existing disk image file + დისკის არსებული გამოსახულების დამატება + + + &Create... + &შექმნა... + + + Create Disk Image + დისკის ახალი გამოსახულების შექმნა + + + Create new disk image file + დისკის ახალი გამოსახულების ფაილის შექმნა + + + &Refresh + &განახლება + + + Refresh Disk Image Files (%1) + დისკის გამოსახულების ფაილების სიის განახლება (%1) + + + Refresh the list of disk image files + დისკის გამოსახულების ფაილების სიის განახლება + + + Choose + აირჩიეთ + + + Name + სახელი + + + Virtual Size + ვირტუალური ზომა + + + Actual Size + რეალური ზომა + + + Medium + საშუალო + + + Expand All + ყველას ამოკეცვა + + + Collapse All + ყველას ჩაკეცვა + + + Cancel + გაუქმება + + + Leave Empty + ცარიელი დატოვება + + + Optical Disk Selector + ოპტიკური დისკის არჩევა + + + Floppy Disk Selector + დისკეტის არჩევა + + + Hard Disk Selector + მყარი დისკის არჩევა + + + Virtual Medium Selector + ვირტუალური დისკის არჩევა + + + + UIMediumSizeEditor + + Holds the size of this medium. + შეიცავს დისკის ზომას. + + + <nobr>%1 (%2 B)</nobr> + <nobr>%1 (%2 B)</nobr> + + + + UIMenuBarEditorWidget + + Toggle menu %1 + მენიუს ჩართ/გამორთ: %1 + + + Popup menu %1 + მხტუნავი მენიუ %1 + + + Close + დახურვა + + + Enable Menu Bar + მენიუს ზოლის ჩართვა + + + Virtual Screen Resize + ვირტუალური ეკრანის ზომის შეცვლა + + + Virtual Screen Remap + ვირტუალური ეკრანის თავიდან გადაბმა + + + Virtual Screen Rescale + ვირტუალური ეკრანის გადიდების შეცვლა + + + Switch + გადართვა + + + + UIMessageCenter + + VirtualBox - Information + msg box title + VirtualBox - ინფორმაცია + + + VirtualBox - Question + msg box title + VirtualBox - კითხვა + + + VirtualBox - Warning + msg box title + VirtualBox - გაფრთხილება + + + VirtualBox - Error + msg box title + VirtualBox - შეცდომა + + + VirtualBox - Critical Error + msg box title + VirtualBox - კრიტიკული შეცდომა + + + Unknown option <b>%1</b>. + უცნობი პარამეტრი <b>%1</b>. + + + <b>%1</b> is an option for the VirtualBox VM runner (VirtualBoxVM) application, not the VirtualBox Manager. + <b>%1</b> პარამეტრია VirtualBox-ის ვმ-ის გამშვებისთვის (VirtualBoxVM) და არა VirtualBox Manager-სთვის. + + + 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. + + + + <p>Cannot start the VirtualBox Manager due to local restrictions.</p><p>The application will now terminate.</p> + + + + <p>You must specify a machine to start, using the command line.</p><p>%1</p> + There will be a usage text passed as argument. + <p>უნდა მიუთითოთ გასაშვები მანაქანის სახელი.</p><p>%1</p> + + + <tr><td>Usage: VirtualBoxVM --startvm &lt;name|UUID&gt;</td></tr><tr><td>Starts the VirtualBox virtual machine with the given name or unique identifier (UUID).</td></tr> + <tr><td>გამოყენება: VirtualBoxVM --startvm &lt;სახელი|UUID&gt;</td></tr><tr><td>VirtualBox-ის მითითებული სახელის ან UUID-ის მქონე ვირტუალური მანქანის გაშვება.</td></tr> + + + You are running a prerelease version of VirtualBox. This version is not suitable for production use. + + + + You are running an EXPERIMENTAL build of VirtualBox. This version is not suitable for production use. + + + + <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> + + + + <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> + + + + <p>Failed to create the VirtualBoxClient COM object.</p><p>The application will now terminate.</p> + + + + <p>Failed to acquire the VirtualBox COM object.</p><p>The application will now terminate.</p> + + + + <p>The reason for this error are most likely wrong permissions of the IPC daemon socket due to an installation problem. Please check the permissions of <font color=blue>'/tmp'</font> and <font color=blue>'/tmp/.vbox-*-ipc/'</font></p> + + + + <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> + + + + <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> + + + + There is no virtual machine named <b>%1</b>. + + + + There is no virtual machine with the identifier <b>%1</b>. + + + + Failed to create a new session. + ახალი სესიის შექმნა შეუძლებელია. + + + Failed to open a session for the virtual machine <b>%1</b>. + ვირტუალური მანქანის სესიის გახსნის შეცდომა: <b>%1</b>. + + + Failed to access the disk image file <nobr><b>%1</b></nobr>. + დისკის გამოსახულების ფაილთან წვდომის შეცდომა: <nobr><b>%1</b></nobr>. + + + Failed to open <tt>%1</tt>. Make sure your desktop environment can properly handle URLs of this type. + + + + Failed to set the global VirtualBox extra data for key <i>%1</i> to value <i>{%2}</i>. + + + + Failed to set the extra data for key <i>%1</i> of machine <i>%2</i> to value <i>{%3}</i>. + + + + Encryption password for <nobr>ID = '%1'</nobr> is invalid. + + + + Failed to open virtual machine located in %1. + <b>%1</b>-ში მდებარე ვირტუალური მანქანის გახსნის შეცდომა. + + + Failed to add virtual machine <b>%1</b> located in <i>%2</i> because its already present. + + + + <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> + + + + <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> + + + + Rename + სახელის გადარქმევა + + + Failed to set groups of the virtual machine <b>%1</b>. + ვირტუალური მანქანის ჯგუფების დაყენების შეცდომა <b>%1</b>. + + + <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> + + + + Remove + წაშლა + + + <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> + + + + <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> + + + + <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> + + + + Delete all files + ყველა ფაილის წაშლა + + + Remove only + მხოლოდ წაშლა + + + Failed to remove the virtual machine <b>%1</b>. + ვირტუალურ მანქანის წაშლის შეცდომა <b>%1</b>. + + + <p>One or more 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> + + + + Check + inaccessible media message box + შემოწმება + + + Ignore + იგნორი + + + <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> + + + + Discard + saved state + მოცილება + + + <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> + + + + Reset + machine + თავიდან ჩართვა + + + <p>Do you really want to send an ACPI shutdown signal to the following virtual machines?</p><p><b>%1</b></p> + + + + ACPI Shutdown + machine + ACPI-ით გამორთვა + + + <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> + + + + Power Off + machine + გამორთვა + + + Failed to pause the execution of the virtual machine <b>%1</b>. + ვირტუალური მანქანის შეჩერების შეცდომა: <b>%1</b>. + + + Failed to resume the execution of the virtual machine <b>%1</b>. + ვირტუალური მანქანის მუშაობის გაგრძელების შეცდომა: <b>%1</b>. + + + Failed to discard the saved state of the virtual machine <b>%1</b>. + ვირტუალური მანქანის შენახული მდგომარეობის მოცილების შეცდომა: <b>%1</b>. + + + Failed to save the state of the virtual machine <b>%1</b>. + + + + Failed to send the ACPI Power Button press event to the virtual machine <b>%1</b>. + ვირტუალური მანქანისთვის ACPI ღილაკის დაჭერის გაგზავნის შეცდომა: <b>%1</b>. + + + Failed to stop the virtual machine <b>%1</b>. + ვირტუალური მანქანის გაჩერების შეცდომა: <b>%1</b>. + + + <p>You are about to start all of the following virtual machines:</p><p><b>%1</b></p><p>This could take some time and consume a lot of host system resources. Do you wish to proceed?</p> + + + + Failed to move the virtual machine <b>%1</b>. + ვირტუალური მანქანის გადატანის შეცდომა: <b>%1</b>. + + + <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> + + + + Create a snapshot of the current machine state + ვირტუალური მანქანის მიმდინარე მდგომარეობის სწრაფი ასლის აღება + + + Restore + აღდგენა + + + Cancel + გაუქმება + + + <p>Are you sure you want to restore snapshot <nobr><b>%1</b></nobr>?</p> + + + + <p>Deleting the snapshot will cause the state information saved in it to be lost, and storage 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> + + + + Delete + წაშლა + + + <p>Deleting the snapshot %1 will temporarily need more storage 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 storage 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> + + + + Failed to create a snapshot of the virtual machine <b>%1</b>. + + + + Failed to restore the snapshot <b>%1</b> of the virtual machine <b>%2</b>. + + + + Failed to delete the snapshot <b>%1</b> of the virtual machine <b>%2</b>. + + + + Failed to change the snapshot <b>%1</b> of the virtual machine <b>%2</b>. + + + + Can't find snapshot named <b>%1</b>. + + + + Can't find snapshot with ID=<b>%1</b>. + + + + Can't acquire snapshot attributes. + სწრაფი ასლის ატრიბუტების მიღების შეცდომა. + + + Failed to save the settings. + პარამეტრების შენახვის შეცდომა. + + + <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> + + + + Failed to set global VirtualBox properties. + VirtualBox-ის გლობალური თვისებების დაყენების შეცდომა. + + + Failed to access the USB subsystem. + USB ქვესისტემასთან წვდოის შეცდომა. + + + 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. + + + + <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> + + + + Reload settings + პარამეტრების თავიდან ჩატვირთვა + + + Keep changes + ცვლილებების დატოვება + + + <p>Are you sure you want to delete the optical drive?</p><p>You will not be able to insert any optical disks or ISO images or install the Guest Additions without it!</p> + + + + &Remove + medium + &წაშლა + + + Failed to attach the hard disk (<nobr><b>%1</b></nobr>) to the slot <i>%2</i> of the machine <b>%3</b>. + + + + Failed to attach the optical drive (<nobr><b>%1</b></nobr>) to the slot <i>%2</i> of the machine <b>%3</b>. + + + + Failed to attach the floppy drive (<nobr><b>%1</b></nobr>) to the slot <i>%2</i> of the machine <b>%3</b>. + + + + The current port forwarding rules are not valid. None of the host or guest port values may be set to zero. + + + + The current port forwarding rules are not valid. All of the host or guest address values should be correct or empty. + + + + The current port forwarding rules are not valid. None of the guest address values may be empty. + + + + The current port forwarding rules are not valid. Rule names should be unique. + + + + The current port forwarding rules are not valid. Few rules have same host ports and conflicting IP addresses. + + + + <p>There are unsaved changes in the port forwarding configuration.</p><p>If you proceed your changes will be discarded.</p> + + + + Failed to save the settings of the virtual machine <b>%1</b> to <b><nobr>%2</nobr></b>. + + + + <p>Error changing disk image mode from <b>%1</b> to <b>%2</b>.</p> + + + + Failed to move the storage unit of the disk image <b>%1</b> to <b>%2</b>. + + + + <p>Error changing the description of the disk image <b>%1</b>.</p> + + + + <p>Are you sure you want to release the disk image file <nobr><b>%1</b></nobr>?</p><p>This will detach it from the following virtual machine(s): <b>%2</b>.</p> + + + + Release + detach medium + რელიზი + + + <p>The changes you requested require this disk to be released from the machines it is attached to.</p><p>Are you sure you want to release the disk image file <nobr><b>%1</b></nobr>?</p><p>This will detach it from the following virtual machine(s): <b>%2</b>.</p> + + + + <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> + + + + <p>As this hard disk is inaccessible its image file can not be deleted.</p> + + + + <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> + + + + <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> + + + + <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> + + + + Remove + medium + წაშლა + + + <p>Do you want to delete the storage unit of the virtual 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 possible to add this hard disk to the list later again.</p> + + + + Delete + hard disk storage + წაშლა + + + Keep + hard disk storage + დატოვება + + + Failed to delete the storage unit of the hard disk <b>%1</b>. + + + + Failed to resize the storage unit of the hard disk <b>%1</b> from <b>%2</b> to <b>%3</b>. + + + + Failed to detach the hard disk (<nobr><b>%1</b></nobr>) from the slot <i>%2</i> of the machine <b>%3</b>. + + + + Failed to detach the optical drive (<nobr><b>%1</b></nobr>) from the slot <i>%2</i> of the machine <b>%3</b>. + + + + Failed to detach the floppy drive (<nobr><b>%1</b></nobr>) from the slot <i>%2</i> of the machine <b>%3</b>. + + + + <p>Unable to insert the virtual optical disk <nobr><b>%1</b></nobr> into the machine <b>%2</b>.</p> + + + + <p>Would you like to try to force insertion of this disk?</p> + <p>გნებავთ ეს დისკი ძალით შეაერთოთ?</p> + + + <p>Unable to eject the virtual optical disk <nobr><b>%1</b></nobr> from the machine <b>%2</b>.</p> + + + + <p>Would you like to try to force ejection of this disk?</p> + + + + <p>Unable to insert the virtual floppy disk <nobr><b>%1</b></nobr> into the machine <b>%2</b>.</p> + + + + <p>Unable to eject the virtual floppy disk <nobr><b>%1</b></nobr> from the machine <b>%2</b>.</p> + + + + Force Unmount + ნაძალადევი მოხსნა + + + Failed to open the disk image file <nobr><b>%1</b></nobr>. + + + + Failed to close the disk image file <nobr><b>%1</b></nobr>. + + + + <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 interface name or a different adapter attachment type.</p> + + + + Failed to acquire host network interfaces. + + + + Unable to find the host network interface <b>%1</b>. + + + + Failed to create a host network interface. + ჰოსტის ქსელის ინტერფეისის შექმნის შეცდომა. + + + Failed to remove the host network interface <b>%1</b>. + ჰოსტის ქსელის ინტერფეისის წაშლის შეცდომა: <b>%1</b>. + + + Failed to acquire host network interface parameter. + ჰოსტის ქსელის ინტერფესისის პარამეტრის მიღების შეცდომა. + + + Failed to save host network interface parameter. + ჰოსტის ქსელის ინტერფესის არამეტრის შენახვის შეცდომა. + + + Failed to create a DHCP server for the network interface <b>%1</b>. + მითითებული ქსელის ინტერფეისისთვის DHCP სერვერის შექმნის შეცდომა: <b>%1</b>. + + + Failed to remove the DHCP server for the network interface <b>%1</b>. + მითითებული ქსელის ინტერფეისისთვის DHCP სერვერის წაშლის შეცდომა: <b>%1</b>. + + + Failed to acquire DHCP server parameter. + DHCP სერვერის პარამეტრის მიღების შეცდომა. + + + Failed to save DHCP server parameter. + DHCP სერვერის პარამეტრის შენახვის შეცდომა. + + + Failed to acquire cloud provider manager. + ღრუბლოვანი მომწოდებლის მმართველის მიღების შეცდომა. + + + Failed to acquire cloud provider manager parameter. + ღრუბლოვანი მომწოდებლის მმართველის პარამეტრის მიღების შეცდომა. + + + Failed to find cloud provider with following uuid: <b>%1</b>. + ღრუბლოვანი მომწოდებლის პოვნა შემდეგი ID-ით <b>%1</b> შეუძლებელია. + + + Failed to acquire cloud provider parameter. + ღრუბლოვანი მომწოდებლის პარამეტრის მიღების შეცდომა. + + + Failed to find cloud profile with following name: <b>%1</b>. + ღრუბლოვანი მომწოდებლის პოვნა შემდეგი სახელით: <b>%1</b> შეუძლებელია. + + + Failed to create cloud profile. + ღრუბლოვანი პროფილების შექმნის შეცდომა. + + + Failed to save cloud profiles. + ღრუბლოვანი პროფილების შენახვის შეცდომა. + + + Failed to import cloud profiles. + ღრუბლოვანი პროფილების შემოტანის შეცდომა. + + + Failed to acquire cloud profile parameter. + ღრუბლოვანი პროფილის პარამეტრის წაკითხვის შეცდომა. + + + Failed to assign cloud profile parameter. + ღრუბლოვანი პროფილის პარამეტრის მნიშვნელობის მინიჭების შეცდომა. + + + Failed to create cloud client. + ღრუბლოვანი კლიენტის შექმნის შეცდომა. + + + Failed to acquire cloud client parameter. + ღრუბლოვანი კლიენტის პარამეტრის მიღების შეცდომა. + + + <p>Do you want to remove the cloud profile <nobr><b>%1</b>?</nobr></p> + <p>გნებავთ ამ ღრუბლოვანი პროფილის წაშლა?: <nobr><b>%1</b>?</nobr></p> + + + <p>Do you want to import cloud profiles from external files?</p><p>VirtualBox cloud profiles will be overwritten and their data will be lost.</p> + + + + Import + შემოტანა + + + You are about to create a new virtual machine without a hard disk. 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. + + + + Continue + no hard disk attached + გაგრძელება + + + Go Back + no hard disk attached + უკან გადასვლა + + + Failed to create a new virtual machine. + ახალი ვირტუალური მანქანის შექმნის შეცდომა. + + + Failed to register the virtual machine <b>%1</b>. + ვირტუალურ მანქანის რეგისტრაციის შეცდომა <b>%1</b>. + + + Failed to clone the virtual machine <b>%1</b>. + ვირტუალურ მანქანის კლონირების შეცდომა <b>%1</b>. + + + <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> + + + + Failed to create the hard disk storage <nobr><b>%1</b>.</nobr> + მყარი დისკის საცავის შექმნის შეცდომა: <nobr><b>%1</b>.</nobr> + + + Failed to create the hard disk storage <nobr><b>%1</b>.</nobr> FAT file systems have 4GB file size limit. + + + + Failed to create the virtual disk image storage <nobr><b>%1</b>.</nobr> + ვირტუალური მყარი დისკის საცავის შექმნის შეცდომა: <nobr><b>%1</b>.</nobr> + + + <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> + + + + <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> + + + + <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> + + + + Failed to open/interpret appliance <b>%1</b>. + ვირტუალური არქივის გახსნის შეცდომა: <b>%1</b>. + + + Failed to import appliance <b>%1</b>. + ვირტუალური არქივის სემოტანის შეცდომა: <b>%1</b>. + + + Failed to check files. + ფაილების შემოწმების შემოწმების შეცდომა. + + + Failed to remove file. + ფაილის წაშლის შეცდომა. + + + <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> + 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). + + + + + + + Continue + გაგრძელება + + + Failed to prepare the export of the appliance <b>%1</b>. + + + + Failed to export appliance <b>%1</b>. + + + + Bad password or authentication failure. + არასწორი პაროლი ან ავთენტიკაციის შეცდომა. + + + <nobr>Fatal Error</nobr> + runtime error info + <nobr>ფატალურ შეცდომა</nobr> + + + <nobr>Non-Fatal Error</nobr> + runtime error info + <nobr>არა-ფატალური შეცდომა</nobr> + + + <nobr>Warning</nobr> + runtime error info + <nobr>გაფრთხილება</nobr> + + + <nobr>Error ID: </nobr> + runtime error info + <nobr>შეცდომის ID: </nobr> + + + Severity: + runtime error info + სიმკაცრე: + + + <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> + + + + <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> + + + + <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=https://www.virtualbox.org>https://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> directory, as well as a description of what you were doing when this error happened. Note that you can also access the above files by selecting <b>Show Log</b> from the <b>Machine</b> menu of the main VirtualBox window.</p><p>Press <b>OK</b> if you want to power off the machine or press <b>Ignore</b> if you want to leave it as is for debugging. Please note that debugging requires special knowledge and tools, so it is recommended to press <b>OK</b> now.</p> + + + + <p>A critical error has occurred while running the virtual machine and the machine execution should be stopped.</p><p>For help, please see the Community section on <a href=https://www.virtualbox.org>https://www.virtualbox.org</a> or your support contract. Please provide the contents of the log file <tt>VBox.log</tt>, which you can find in the virtual machine log directory, as well as a description of what you were doing when this error happened. Note that you can also access the above file by selecting <b>Show Log</b> from the <b>Machine</b> menu of the main VirtualBox window.</p><p>Press <b>OK</b> to power off the machine.</p> + + + + <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> + + + + Close VM + ვმ-ის დახურვა + + + <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. + + + + <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> + + + + <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> + + + + <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> + + + + Change Network Settings + ქსელის პარამეტრების შეცვლა + + + Failed to start the virtual machine <b>%1</b>. + ვირტუალური მანქანის გაშვების შეცდომა: <b>%1</b>. + + + <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 any time to <b>uncapture</b> the keyboard and mouse (if it is captured) and return them to normal operation. The currently assigned host key is shown on the status bar at the bottom of the Virtual Machine window, next to the&nbsp;<img src=:/hostkey_16px.png/>&nbsp;icon. This icon, together with the mouse icon placed nearby, indicate the current keyboard and mouse capture state.</p> + + + + <p>The host key is currently defined as <b>%1</b>.</p> + additional message box paragraph + + + + Capture + do input capture + ჩაჭერა + + + <p>The virtual machine window will be now switched to <b>full-screen</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 full-screen mode. You can access it by pressing <b>Host+Home</b>.</p> + + + + Switch + გადართვა + + + <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> + + + + <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> + + + + <p>Could not switch the guest display to full-screen 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 full-screen mode anyway or press <b>Cancel</b> to cancel the operation.</p> + + + + <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> + + + + <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> + + + + <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> + + + + Do you wish to cancel all current network operations? + + + + <p>A new version of VirtualBox has been released! Version <b>%1</b> is available at <a href="https://www.virtualbox.org/">virtualbox.org</a>.</p><p>You can download this version using the link:</p><p><a href=%2>%3</a></p> + + + + You are already running the most recent version of VirtualBox. + + + + <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> + + + + <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> + + + + Download + გადმოწერა + + + <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> + + + + <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> + + + + <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 optical drive?</p> + + + + Insert + additions + ჩასმა + + + <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>but the SHA-256 checksum verification failed.</p><p>Please do the download, installation and verification manually.</p> + + + + Failed to update Guest Additions. The Guest Additions disk image file will be inserted for user installation. + + + + <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> + + + + <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> + + + + <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> + + + + <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> + + + + <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> + + + + <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> + + + + <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> + + + + <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> + + + + Install + extension pack + დაყენება + + + <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>but the SHA-256 checksum verification failed.</p><p>Please do the download, installation and verification manually.</p> + + + + Do you want to delete the downloaded file <nobr><b>%1</b></nobr>? + + + + Delete + extension pack + წაშლა + + + Do you want to delete following list of files <nobr><b>%1</b></nobr>? + + + + <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=5><tr><td><b>Name:&nbsp;&nbsp;</b></td><td>%1</td></tr><tr><td><b>Version:&nbsp;&nbsp;</b></td><td>%2</td></tr><tr><td><b>Description:&nbsp;&nbsp;</b></td><td>%3</td></tr></table></p> + + + + 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>An older version of the extension pack is already installed, would you like to upgrade? <p>%1</p><p><table cellpadding=0 cellspacing=5><tr><td><b>Name:&nbsp;&nbsp;</b></td><td>%2</td></tr><tr><td><b>New Version:&nbsp;&nbsp;</b></td><td>%3</td></tr><tr><td><b>Current Version:&nbsp;&nbsp;</b></td><td>%4</td></tr><tr><td><b>Description:&nbsp;&nbsp;</b></td><td>%5</td></tr></table></p> + + + + &Upgrade + &გაუმჯობესება + + + <p>An newer version of the extension pack is already installed, would you like to downgrade? <p>%1</p><p><table cellpadding=0 cellspacing=5><tr><td><b>Name:&nbsp;&nbsp;</b></td><td>%2</td></tr><tr><td><b>New Version:&nbsp;&nbsp;</b></td><td>%3</td></tr><tr><td><b>Current Version:&nbsp;&nbsp;</b></td><td>%4</td></tr><tr><td><b>Description:&nbsp;&nbsp;</b></td><td>%5</td></tr></table></p> + + + + &Downgrade + &ვერსიის ჩამოწევა + + + <p>The extension pack is already installed with the same version, would you like reinstall it? <p>%1</p><p><table cellpadding=0 cellspacing=5><tr><td><b>Name:&nbsp;&nbsp;</b></td><td>%2</td></tr><tr><td><b>Version:&nbsp;&nbsp;</b></td><td>%3</td></tr><tr><td><b>Description:&nbsp;&nbsp;</b></td><td>%4</td></tr></table></p> + + + + &Reinstall + &თავიდან დაყენება + + + <p>You are about to remove the VirtualBox extension pack <b>%1</b>.</p><p>Are you sure you want to proceed?</p> + + + + &Remove + &წაშლა + + + Failed to open the Extension Pack <b>%1</b>. + + + + Failed to install the Extension Pack <b>%1</b>. + + + + Failed to uninstall the Extension Pack <b>%1</b>. + + + + The extension pack <br><nobr><b>%1</b><nobr><br> was installed successfully. + + + + Drag and drop operation from host to guest failed. + + + + Unable to cancel host to guest drag and drop operation. + + + + Drag and drop operation from guest to host failed. + + + + Failed to open the license file <nobr><b>%1</b></nobr>. Check file permissions. + + + + A file named <b>%1</b> already exists. Are you sure you want to replace it?<br /><br />Replacing it will overwrite its contents. + + + + The following files already exist:<br /><br />%1<br /><br />Are you sure you want to replace them? Replacing them will overwrite their contents. + + + + Could not load the Host USB Proxy Service (VERR_FILE_NOT_FOUND). The service might not be installed on the host computer + + + + 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 + + + + 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 + + + + The USB Proxy Service has not yet been ported to this host + + + + Could not load the Host USB Proxy service + + + + Do not show this message again + msg box flag + მეტჯერ აღარ აჩვენო ეს გაფრთხილება + + + Close + დახურვა + + + Ok + დიახ + + + You are trying to shut down the guest with the ACPI power button. This is currently not possible because the guest does not support software shutdown. + + + + <p>You have the <b>Auto capture keyboard</b> option turned on. This will cause the Virtual Machine to automatically <b>capture</b> the keyboard every time the VM window is activated and make it unavailable to other applications running on your host machine: when the keyboard is captured, all keystrokes (including system ones like Alt-Tab) will be directed to the VM.</p><p>You can press the <b>host key</b> at any time to <b>uncapture</b> the keyboard and mouse (if it is captured) and return them to normal operation. The currently assigned host key is shown on the status bar at the bottom of the Virtual Machine window, next to the&nbsp;<img src=:/hostkey_16px.png/>&nbsp;icon. This icon, together with the mouse icon placed nearby, indicate the current keyboard and mouse capture state.</p> + + + + <p>The Virtual Machine reports that the guest OS supports <b>mouse pointer integration</b>. This means that you do not need to <i>capture</i> the mouse pointer to be able to use it in your guest OS -- all mouse actions you perform when the mouse pointer is over the Virtual Machine's display are directly sent to the guest OS. If the mouse is currently captured, it will be automatically uncaptured.</p><p>The mouse icon on the status bar will look like&nbsp;<img src=:/mouse_seamless_16px.png/>&nbsp;to inform you that mouse pointer integration is supported by the guest OS and is currently turned on.</p><p><b>Note</b>: Some applications may behave incorrectly in mouse pointer integration mode. You can always disable it for the current session (and enable it again) by selecting the corresponding action from the menu bar.</p> + + + + <p>The Virtual Machine reports that the guest OS does not support <b>mouse pointer integration</b> in the current video mode. You need to capture the mouse (by clicking over the VM display or pressing the host key) in order to use the mouse inside the guest OS.</p> + + + + <p>The Virtual Machine is currently in the <b>Paused</b> state and not able to see any keyboard or mouse input. If you want to continue to work inside the VM, you need to resume it by selecting the corresponding action from the menu bar.</p> + + + + <p>The virtual screen is currently set to a <b>%1&nbsp;bit</b> color mode. For better performance please change this to <b>%2&nbsp;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> + + + + Failed to attach the USB device <b>%1</b> to the virtual machine <b>%2</b>. + + + + Failed to detach the USB device <b>%1</b> from the virtual machine <b>%2</b>. + + + + Failed to attach the webcam <b>%1</b> to the virtual machine <b>%2</b>. + + + + Failed to detach the webcam <b>%1</b> from the virtual machine <b>%2</b>. + + + + Failed to enable recording for the virtual machine <b>%1</b>. + + + + Failed to disable recording for the virtual machine <b>%1</b>. + + + + Failed to enable the remote desktop server for the virtual machine <b>%1</b>. + + + + Failed to disable the remote desktop server for the virtual machine <b>%1</b>. + + + + Failed to connect the network adapter cable of the virtual machine <b>%1</b>. + + + + Failed to disconnect the network adapter cable of the virtual machine <b>%1</b>. + + + + <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 started then shared folders will be available once it is.</p> + + + + Failed to enable the audio adapter output for the virtual machine <b>%1</b>. + + + + Failed to disable the audio adapter output for the virtual machine <b>%1</b>. + + + + Failed to enable the audio adapter input for the virtual machine <b>%1</b>. + + + + Failed to disable the audio adapter input for the virtual machine <b>%1</b>. + + + + <p>Could not insert the <b>%1</b> disk image file into the virtual machine <b>%2</b>, as the machine has no optical drives. Please add a drive using the storage page of the virtual machine settings window.</p> + + + + Do not show this message again + მეტჯერ აღარ აჩვენო ეს გაფრთხილება + + + Failed to acquire machine parameter. + მანქანის პარამეტრის მიღების შეცდომა. + + + <p>This controller has optical devices attached. You have requested storage bus change to type which doesn't support optical devices.</p><p>If you proceed optical devices will be removed.</p> + + + + <p>This controller has devices attached. You have requested storage bus change to type which supports smaller amount of attached devices.</p><p>If you proceed excessive devices will be removed.</p> + + + + Failed to change the attribute of the virtual machine <b>%1</b>. + + + + Failed to change graphics adapter attribute. + გრაფიკული ადაპტერის პარამეტრის შეცვლის შეცდომა. + + + Failed to change audio adapter attribute. + აუდიო ადაპტერის ატრიბუტის შეცვლის შეცდომა. + + + Failed to change network adapter attribute. + ქსელის ადაპტერის ატრიბუტის შეცვლის შეცდომა. + + + Failed to open the medium with following ID: <nobr><b>%1</b></nobr>. + მითითებული ID-ს მქონე დისკის გახსნა შეუძლებელია: <nobr><b>%1</b></nobr>. + + + Failed to acquire attachment parameter. + მიმაგრების პარამეტრის მიღების შეცდომა. + + + Failed to acquire medium attribute. + დისკის ატრიბუტის მიღების შეცდომა. + + + Failed to create cloud machine. + ღრუბლოვანი ვირტუალური მანქანის შექმნის შეცდომა. + + + Failed to assign form value. + ფორმის მნიშვნელობის მინიჭების შეცდომა. + + + <p>Cannot create a virtual appliance.</p> + <p>ვირტუალური არქივის შექმნა შეუძლებელია.</p> + + + <p>Cannot create a virtual system description.</p> + <p>ვირტუალური სისტემის აღწერის შექმნა შეუძლებელია.</p> + + + <p>Cannot add a virtual system description value.</p> + <p>ვირტუალური სისტემის აღწერის დამატების შეცდომა.</p> + + + <p>Cannot acquire a virtual system description property.</p> + <p>ვირტუალური სისტემის აღწერის თვისების მიღების შეცდომა.</p> + + + <p>The virtual machine execution ran into a non-fatal problem as described below. We suggest that you take appropriate action to prevent the problem from recurring.</p> + <p>ვირტუალური მანქანის დაფიქსირდა პრობლემა, რომელიც ქვემოთაა აღწერილი. მიიღეთ ზომები, რომ პრობლემა აღარ განმეორდეს.</p> + + + + UIMiniToolBar + + Always show the toolbar + ხელსაწყოთა ზოლის ყოველთვის ჩვენება + + + Minimize Window + ფანჯრის ჩაკეცვა + + + Exit Full Screen or Seamless Mode + მთელი/გამჭვირვალე რეჟიმიდან გამოსვლა + + + Close VM + ვმ-ის დახურვა + + + + UIMultiScreenLayout + + Virtual Screen %1 + ვირტუალური ეკრანი %1 + + + Use Host Screen %1 + ჰოსტის %1-ე ეკრანის გამოყენება + + + + UINameAndSystemEditor + + &Type: + &ტიპი: + + + &Version: + &ვერსია: + + + Name: + სახელი: + + + Machine Folder: + მანქანის საქაღალდე: + + + Selects the operating system family that you plan to install into this virtual machine. + + + + Selects the operating system type that you plan to install into this virtual machine (called a guest operating system). + + + + + UINetworkAttachmentEditor + + &Attached to: + &რაზეა მიბმული: + + + &Name: + &სახელი: + + + Not selected + network adapter name + მონიშნული არაა + + + Selects the network adapter on the host system that traffic to and from this network card will go through. + + + + Holds the name of the internal network that this network card will be connected to. You can create a new internal network by choosing a name which is not used by any other network cards in this virtual machine or others. + + + + Selects the virtual network adapter on the host system that traffic to and from this network card will go through. You can create and remove adapters using the global network settings in the virtual machine manager window. + + + + Selects the driver to be used with this network card. + + + + 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. + + + + (experimental) Holds the name of the cloud network that this network card will be connected to. You can add and remove cloud networks using the global network settings in the virtual machine manager window. + + + + + UINetworkDetailsWidget + + &Adapter + &ქსელის ბარათი + + + &DHCP Server + &DHCP სერვერი + + + Configure Adapter &Automatically + &ადაპტერის ავტომატური მორგება + + + Configure Adapter &Manually + ა&დაპტერის ხელით მორგება + + + &IPv4 Address: + &IPv4 მისამართი: + + + Holds the host IPv4 address for this adapter. + შეიცავს ქსელის ამ ბარათის IPv4 მისამართს. + + + IPv4 Network &Mask: + IPv4 ქსელის ნიღბის მისამართი: + + + Holds the host IPv4 network mask for this adapter. + შეიცავს ქსელის ამ ბარათის IPv4 ნიღაბს. + + + I&Pv6 Address: + IPv6 მისამართი: + + + IPv6 Prefix &Length: + IPv6 პრეფიქსის სიგრძე: + + + Reset + თავიდან ჩართვა + + + Apply + გადატარება + + + Reset changes in current interface details + ქსელის მიმდინარე ინტერფეისის დეტალების საწყის მნიშვნელობებზე დაბრუნება + + + Apply changes in current interface details + ქსელის მიმდინარე ინტერფეისის დეტალების ცვლილებების გადატარება + + + Reset Changes (%1) + ცვლილებების დაბრუნება (%1) + + + Apply Changes (%1) + ცვლილებების გადატარება (%1) + + + &Enable Server + &სერვერის ჩართვა + + + Server Add&ress: + სერვერის &მისამართი: + + + Server &Mask: + სერვერის &ნიღაბი: + + + &Lower Address Bound: + მისამართების &ქვედა ზღვარი: + + + &Upper Address Bound: + მისამართების &ზედა ზღვარი: + + + Reset changes in current DHCP server details + მიმდინარე DHCP სერვერის დეტალების ცვლილებების საწყის მნიშვნელობებზე დაბრუნება + + + Apply changes in current DHCP server details + მიმდინარე DHCP სერვერის დეტალების ცვლილებების გადატარება + + + Host interface <nobr><b>%1</b></nobr> is set to obtain the address automatically but the corresponding DHCP server is not enabled. + ჰოსტის ინტერფეისი <nobr><b>%1</b></nobr> დაყენებულია მისამართის ავტომატურად ასაღებად, მაგრამ შესაბამისი DHCP სერვერი ჩართული არაა. + + + Host interface <nobr><b>%1</b></nobr> does not currently have a valid IPv4 address. + ჰოსტის ინტერფეისს <nobr><b>%1</b></nobr> ამჟამად სწორი IPv4 მისამართი არ აქვს მინიჭებული. + + + Host interface <nobr><b>%1</b></nobr> does not currently have a valid IPv4 network mask. + ჰოსტის ინტერფეისს <nobr><b>%1</b></nobr> ამჟამად სწორი IPv4 ქსელის ნიღაბი მინიჭებული არ აქვს. + + + Host interface <nobr><b>%1</b></nobr> does not currently have a valid IPv6 address. + ჰოსტის ინტერფეისს <nobr><b>%1</b></nobr> ამჟამად არ გააჩნია სწორი IPv6 მისამართი. + + + Host interface <nobr><b>%1</b></nobr> does not currently have a valid IPv6 prefix length. + ჰოსტის ინტერფეისს <nobr><b>%1</b></nobr> ამჟამად IPv6 პრეფიქსის სიგრძე მინიჭებული არ აქვს. + + + Host interface <nobr><b>%1</b></nobr> does not currently have a valid DHCP server address. + ჰოსტის ინტერფეისს <nobr><b>%1</b></nobr> ამჟამად DHCP სერვერის სწორი მისამართი არ გააჩნია. + + + Host interface <nobr><b>%1</b></nobr> does not currently have a valid DHCP server mask. + ჰოსტის ინტერფეისს <nobr><b>%1</b></nobr> ამჟამად DHCP სერვერის ნიღაბი არ გააჩნია. + + + Host interface <nobr><b>%1</b></nobr> does not currently have a valid DHCP server lower address bound. + ჰოსტის ინტერფეისს <nobr><b>%1</b></nobr> DHCP სერვერის ქვედა ზღვარი მინიჭებული არ აქვს. + + + Host interface <nobr><b>%1</b></nobr> does not currently have a valid DHCP server upper address bound. + ჰოსტის ინტერფეისს <nobr><b>%1</b></nobr> DHCP სერვერის ზედა ზღვარი მინიჭებული არ აქვს. + + + + UINetworkManager + + DHCP Server + DHCP სერვერი + + + Name + სახელი + + + IPv4 Address/Mask + IPv4 მისამართი/ნიღაბი + + + IPv6 Address/Mask + IPv6 მისამართი/ნიღაბი + + + Host Network Manager + ჰოსტის ქსელების მმართველი + + + Reset + განულება + + + Apply + გადატარება + + + Close + დახურვა + + + Reset changes in current host network details + ქსელის მიმდინარე ქსელის დეტალების საწყის მნიშვნელობებზე დაბრუნება + + + Apply changes in current host network details + ქსელის მიმდინარე ქსელის დეტალების ცვლილებების გადატარება + + + Close dialog without saving + დახურვა შენახვის გარეშე + + + Reset Changes (%1) + ცვლილებების დაბრუნება (%1) + + + Apply Changes (%1) + ცვლილებების გადატარება (%1) + + + Close Window (%1) + ფანჯრის დახურვა (%1) + + + Adding network ... + ქსელის დამატება... + + + Removing network ... + ქსელის წაშლა... + + + + UINetworkManagerDialog + + Network Operations Manager + ქსელური ოპერაციების მმართველი + + + There are no active network operations. + ქსელის აქტიური ოპერაცია არ არსებობს. + + + &Cancel All + &ყველას გაუქმება + + + Cancel all active network operations + ქსელის ყველა ოპერაციის გაუქმება + + + Network Operation + ქსელური ოპერაცია + + + Restart network operation + ქსელური ოპერაციების რესტარტი + + + Cancel network operation + ქსელური ოპერაციის გაუქმება + + + The network operation failed with the following error: %1. + + + + + UINetworkManagerIndicator + + Current network operations: + ქსელის მიმდინარე ოპერაციები: + + + failed + network operation + შეცდომა + + + (%1 of %2) + (%1 %2-დან) + + + Double-click for more information. + მეტი ინფორმაციისთვის ორჯერ დააწკაპუნეთ. + + + + UINetworkReplyPrivate + + %1: %2 + Context description: Error description + %1: %2 + + + Unable to initialize HTTP library + HTTP ბიბლიოთეკის ინიციალიზაციის შეცდომა + + + Url not found on the server + სერვერზე URL არ არსებობს + + + Host not found + ჰოსტი ნაპოვნი არაა + + + Content access denied + შიგთავსთან წვდომა აკრძალულია + + + Protocol failure + პროტოკოლის შეცდომა + + + Connection refused + დაკავშირება უარყოფილია + + + SSL authentication failed + SSL ავთენტიკაციის შეცდომა + + + Wrong SSL certificate format + SSL სერტიფიკატის არასწორი ფორმატი + + + Content moved + შიგთავსი გადატანილია + + + Proxy not found + პროქსი სერვერი ნაპოვნი არაა + + + Unknown reason + უცნობი მიზეზი + + + + UINetworkReplyPrivateThread + + During proxy configuration + პროქსის კონფიგურაციის შეცდომა + + + During certificate downloading + შეცდომა სერტიფიკატის გადმოწერისას + + + During network request + ქსელის მოთხოვნისას + + + + UINetworkRequestManagerIndicator + + Current network operations: + ქსელის მიმდინარე ოპერაციები: + + + failed + network operation + შეცდომა + + + (%1 of %2) + (%1 %2-დან) + + + Double-click for more information. + მეტი ინფორმაციისთვის ორჯერ დააწკაპუნეთ. + + + + UINetworkRequestManagerWindow + + Network Operations Manager + ქსელური ოპერაციების მმართველი + + + There are no active network operations. + ქსელის აქტიური ოპერაცია არ არსებობს. + + + &Cancel All + &ყველას გაუქმება + + + Cancel all active network operations + ქსელის ყველა ოპერაციის გაუქმება + + + Network Operation + ქსელური ოპერაცია + + + Restart network operation + ქსელური ოპერაციების რესტარტი + + + Cancel network operation + ქსელური ოპერაციის გაუქმება + + + + UIPopupCenter + + Click for full details + დაწკაპეთ სრული დეტალებისთვის + + + + UIPopupPane + + <p><b>Details:</b> + <p><b>დეტალები:</b> + + + <p><b>Details:</b> (%1 of %2) + <p><b>დეტალები:</b> (%1 of %2) + + + + UIPortForwardingTable + + Name + სახელი + + + Protocol + პროტოკოლი + + + Host IP + ჰოსტის იპ + + + Host Port + ჰოსტის პორტი + + + Guest IP + სტუმრის IP + + + Guest Port + სტუმრის პორტი + + + Contains a list of port forwarding rules. + შეცავს პორტის გადამისამართების წესებს. + + + Add New Rule + ახალი წესის დამატება + + + Copy Selected Rule + მონიშნული წესის კოპირება + + + Remove Selected Rule + მონიშნული წესის წაშლა + + + Adds new port forwarding rule. + პორტის გადამისამართების ახალი წესის დამატება. + + + Copies selected port forwarding rule. + პორტის გადამისამართების წესის კოპირება. + + + Removes selected port forwarding rule. + პორტის გადამისამართების წესის წაშლა. + + + + UIProgressDialog + + &Cancel + &გაუქმება + + + Cancel the current operation + მიმდინარე ოპერაციის გაუქმება + + + Canceling... + გაუქმება... + + + %1, %2 remaining + You may wish to translate this more like "Time remaining: %1, %2" + დარჩენილია %1, %2 + + + %1 remaining + You may wish to translate this more like "Time remaining: %1" + დარჩენილია %1 + + + A few seconds remaining + რამდენიმე წამი + + + + UIScaleFactorEditor + + Max + მაქს + + + Min + მინ + + + All Monitors + ყველა მონიტორი + + + Monitor %1 + %1-ე მონიტორი + + + Controls the guest screen scale factor. + სტუმრის ეკრანის გადიდების კოეფიციენტი. + + + + UIScreenshotViewer + + Screenshot of %1 (%2) + ეკრანის %1-ე ანაბეჭდი (%2) + + + Click to view non-scaled screenshot. + ეკრანის გაუდიდებელი სურათის ნახვა. + + + Click to view scaled screenshot. + ეკრანის გადიდებული სურათის ნახვა. + + + + UISession + + Updating Guest Additions + სტუმრის დამატებების განახლება + + + + UISessionStateStatusBarIndicator + + %1 status-bar indicator + like 'hard-disk status-bar indicator' + + + + + UISettingsDialog + + <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> + + + + Invalid settings detected + + + + <b>%1</b> page: + <b>%1</b> გვერდი: + + + <b>%1: %2</b> page: + <b>%1: %2</b> გვერდი: + + + + UISettingsDialogGlobal + + Allows to navigate through Global Property categories + + + + General + ზოგადი + + + Input + შეყვანა + + + Update + განახლება + + + Language + ენა + + + Display + ეკრანი + + + Network + ქსელი + + + Extensions + გაფართოებები + + + Proxy + პროქსი + + + Preferences + პარამეტრები + + + VirtualBox - %1 + VirtualBox - %1 + + + + UISettingsDialogMachine + + Allows to navigate through VM Settings categories + + + + General + ზოგადი + + + System + სისტემა + + + Display + ეკრანი + + + Storage + საცავი + + + Audio + აუდიო + + + Network + ქსელი + + + Ports + პორტები + + + Serial Ports + სერიული პორტები + + + USB + USB + + + Shared Folders + გაზიარებული საქაღალდეები + + + User Interface + მომხმარებლის ინტერფეისი + + + Settings + მორგება + + + %1 - %2 + %1 - %2 + + + + UISettingsSerializerProgress + + Loading Settings... + პარამეტრების ჩატვირთვა... + + + Saving Settings... + პარამეტრების შენახვა... + + + + UISnapshotDetailsWidget + + &Attributes + &ატრიბუტები + + + &Information + &ინფორმაცია + + + &Name: + &სახელი: + + + &Description: + &აღწერა: + + + Holds the snapshot name. + + + + Holds the snapshot description. + + + + Apply + გადატარება + + + Reset + თავიდან ჩართვა + + + Apply changes in current snapshot details + მიმდინარე სწრაფი ასლის დეტალების ცვლილებების გადატარება + + + Reset changes in current snapshot details + მიმდინარე სწრაფი ასლის დეტალების ცვლილებების დაბრუნება + + + Apply Changes (%1) + ცვლილებების გადატარება (%1) + + + Reset Changes (%1) + ცვლილებების დაბრუნება (%1) + + + Click to enlarge the screenshot. + ეკრანის ანაბეჭდის გასადიდებლად დაწკაპეთ. + + + Snapshot name is empty + სწრაფი ასლის სახელი ცარიელია + + + Enter a name for the new snapshot... + შეიყვანეთ ახალი სწრაფი ასლის სახელი... + + + Enter a name for this snapshot... + შეიყვანეთ ამ სწრაფი ასლის სახელი... + + + Take + აღება + + + Take snapshot on the basis of current machine state + ვირტუალური მანქანის მიმდინარე მდგომარეობის სწრაფი ასლის აღება + + + Take Snapshot (%1) + სწრაფი ასლის აღება(%1) + + + + UISnapshotItem + + Current State (changed) + Current State (Modified) + მიმდინარე მდგომარეობა (შეცვლილია) + + + Current State + Current State (Unmodified) + მიმდინარე მდგომარეობა + + + The current state differs from the state stored in the current snapshot + მიმდინარე მდგომარეობა განსხვავდება სწრაფ ასლში შენახულისაგან + + + The current state is identical to the state stored in the current snapshot + მიმდინარე მდგომარეობა ემთხვევა სწრაფ ასლსში შენახულს + + + %1 (%2 ago) + date time (how long ago) + %1 (%2-ის წინ) + + + %1 since %2 + Current State (time or date + time) + %1 %2-დან + + + current + snapshot + მიმდინარე + + + online + snapshot + ონლაინ + + + offline + snapshot + გათიშული + + + Taken at %1 + Snapshot (time) + აღების დრო %1 + + + Taken on %1 + Snapshot (date + time) + აღების დროა %1 + + + + UISnapshotPane + + Contains the snapshot tree of the current virtual machine + ვირტუალური მანქანის მიმდინარე მდგომარეობის სწრაფი ასლის აღება + + + Name + snapshot + სახელი + + + Taken + snapshot + აღებულია + + + Snapshot %1 + სწრაფი ასლი %1 + + + + UISoftKeyboard + + Layout Editor + განლაგების ჩასწორება + + + Return Back to Layout List + განლაგებების სიაზე დაბრუნება + + + Back to Layout List + განლაგების სიაზე გადასვლა + + + Physical Layout + ფიზიკური განლაგება + + + English Name + ინგლისური სახელი + + + Name of the Layout in English + განლაგების სახელი ინგლისურად + + + Native Language Name + თქვენი ენის სახელი + + + Name of the Layout in the native Language + განლაგების სახელი თქვენს ენაში + + + Scan Code + სკანირების კოდი + + + The scan code the key produces. Not editable + გასაღების მიერ მოწოდებული სკანირების კოდი. ჩასწორებადი არაა + + + Position + მდებარეობა + + + The physical position of the key. Not editable + გასაღების ფიზიკური მდგომარეობა. ჩასწორებადი არაა + + + Base + საბაზისო + + + Shift + Shift + + + AltGr + AltGr + + + ShiftAltGr + ShiftAltGr + + + Captions + მინაწერი + + + Selected Key + არჩეული გასაღები + + + Use the selected layout + მონიშნული განლაგების გამოყენება + + + Edit the selected layout + მონიშნული განლაგების ჩასწორება + + + Delete the selected layout + მონიშნული განლაგების წაშლა + + + Copy the selected layout + მონიშნული განლაგების კოპირება + + + Save the selected layout into File + მონიშნული განლაგების ფაილში შენახვა + + + Layout List + განლაგების სია + + + Close the layout list + განლაგების სიის დახურვა + + + Web browser go back + ვებ ბრაუზერში უკან გადასვლა + + + Web browser go the home page + ვებ ბრაუზერში საწყისი გვერდი + + + Web browser go forward + ვებ ბრაუზერში წინ გადასვლა + + + Web browser reload the current page + ვებ ბრაუზერის გვერდის გადატვირთვა + + + Web browser stop loading the page + ვებ ბრაუზერში გვერდის ჩატვირთვის შეჩერება + + + Web browser search + ძებნა ვებ ბრაუზერში + + + Jump back to previous media track + წინა ტრეკზე გადასვლა + + + Jump to next media track + შემდეგ ტრეკზე გადასვლა + + + Stop playing + დაკვრის შეჩერება + + + Play or pause playing + მედიის დაკვრა/გაჩერების გადართვა + + + Start email application + ელფოსტის აპლიკაციის გაშვება + + + Start calculator + კალკულატორის გაშვება + + + Show 'My Computer' + "My Computer'-ის ჩვენება + + + Show Media folder + მედიის საქაღალდის ჩვენება + + + Mute + დადუმება + + + Volume up + ხმის აწევა + + + Volume down + ხმის დაწევა + + + Error! Could not create folder under + + + + Provide a file name + შეიყვანეთ ფაილის სახელი + + + is an invalid file name + ფაილის არასწორი სახელია + + + is saved + შენახულია + + + Copy + კოპირება + + + This will delete the keyboard layout file as well. Proceed? + + + + The file + ფაილი + + + has been deleted + წაშლილია + + + Deleting the file + ფაილის წაშლა + + + has failed + შეცდომა + + + Settings + მორგება + + + Reset the keyboard and release all keys + + + + Click to change the color. + ფერის შესაცვლელად დააწკაპუნეთ. + + + This color theme is not editable. + ფერების ამ თემის ჩასწორება შეუძლებელია. + + + Keyboard Settings + კლავიატურის მორგება + + + Hide NumPad + Numbpad-ის დამალვა + + + Hide OS/Menu Keys + ოს-ის/მენიუს ღილაკების დამალვა + + + Hide Multimedia Keys + მულტიმედია ღილაკების დამალვა + + + Color Themes + ფერადი თემები + + + Button Background Color + ღილაკის ფონის ფერი + + + Button Font Color + ღილაკის ფონტის ფერი + + + Button Hover Color + ღილაკზე გადატარების ფერი + + + Button Edit Color + ღილაკის ჩასწორების ფერი + + + Pressed Button Font Color + დაწოლილი ღილაკის ფონტის ფერი + + + Soft Keyboard + პროგრამული კლავიატურა + + + <p>Following layouts are edited/copied but not saved:</p>%1<p>Closing this dialog will cause loosing the changes. Proceed?</p> + + + + Layout + განლაგება + + + The file will be saved under:<br> + + + + + UIStatusBarEditorWidget + + <nobr><b>Click</b> to toggle indicator presence.</nobr><br><nobr><b>Drag&Drop</b> to change indicator position.</nobr> + + + + Close + დახურვა + + + Enable Status Bar + სტატუსის ზოლის ჩართვა + + + + UITakeSnapshotDialog + + Snapshot %1 + სწრაფი ასლი %1 + + + Take Snapshot of Virtual Machine + ვირტუალური მანქანის სწრაფი ასლის აღება + + + Snapshot &Name + სწრაფი ასლის &სახელი + + + Snapshot &Description + სწრაფი ასლის &აღწერა + + + Warning: You are taking a snapshot of a running machine which has %n immutable image(s) attached to it. As long as you are working from this snapshot the immutable image(s) will not be reset to avoid loss of data. + + + + + + + + UITextEditor + + Edit text + ტექსტის ჩასწორება + + + &Replace... + &ჩანაცვლება... + + + Replaces the current text with the content of a file. + + + + Text (*.txt);;All (*.*) + ტექსტური ფაილები (*.txt);;ყველა (*.*) + + + Select a file to open... + აირჩიეთ გასახნელი ფაილი... + + + + UIToolsModel + + Welcome + კეთილი იყოს თქვენი მობრძანება + + + Media + მედია + + + Network + ქსელი + + + Cloud + ღრუბელი + + + Details + დეტალები + + + Snapshots + სწრაფი ასლები + + + Logs + ჟურნალი + + + + UIToolsView + + Contains a list of VirtualBox tools + შეიცავს VirtualBox-ის ხელსაწყოების სიას + + + + UIUSBFilterItem + + %1, Active + col.1 text, col.1 state + %1 აქტიურია + + + %1 + col.1 text + %1% + + + <nobr>Vendor ID: %1</nobr> + USB filter tooltip + <nobr>მომწოდებლის ID: %1</nobr> + + + <nobr>Product ID: %2</nobr> + USB filter tooltip + <nobr>პროდუქტის ID: %2</nobr> + + + <nobr>Revision: %3</nobr> + USB filter tooltip + <nobr>რევიზია: %3</nobr> + + + <nobr>Product: %4</nobr> + USB filter tooltip + <nobr>პროდუქტი: %4</nobr> + + + <nobr>Manufacturer: %5</nobr> + USB filter tooltip + <nobr>მწარმოებელი: %5</nobr> + + + <nobr>Serial No.: %1</nobr> + USB filter tooltip + <nobr>სერიული #.: %1</nobr> + + + <nobr>Port: %1</nobr> + USB filter tooltip + <nobr>პორტი: %1</nobr> + + + <nobr>State: %1</nobr> + USB filter tooltip + <nobr>მდგომარეობა: %1</nobr> + + + + UIUpdateManager + + 1 day + 1 დღე + + + 2 days + 2 დღე + + + 3 days + 3 დღე + + + 4 days + 4 დღე + + + 5 days + 5 დღე + + + 6 days + 6 დღე + + + 1 week + 1 კვირა + + + 2 weeks + 2 კვირა + + + 3 weeks + 3 კვირა + + + 1 month + 1 თვე + + + Never + არასოდეს + + + + UIUpdateStepVirtualBox + + Checking for a new VirtualBox version... + VirtualBox-ის ახალი ვერსიის შემოწმება... + + + + UIVMCloseDialog + + Close Virtual Machine + ვირტუალური მანქანის დახურვა + + + You want to: + გნებავთ: + + + &Continue running in the background + &გაშვების ფონურად გაგრძელება + + + <p>Close the virtual machine windows but keep the virtual machine running.</p><p>You can use the VirtualBox Manager to return to running the virtual machine in a window.</p> + + + + &Save the machine state + მანქანის მდგომარეობის შენახვა + + + <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 the virtual machine.</p> + + + + S&end the shutdown signal + &გამორთვის სიგნალის გაშვება + + + <p>Sends the ACPI Power Button press event to the virtual machine.</p><p>Normally, the guest operating system running inside the virtual machine will detect this event and perform a clean shutdown procedure. This is a recommended way to turn off the virtual machine because all applications running inside it will get a chance to save their data and state.</p><p>If the machine doesn't respond to this action then the guest operating system may be misconfigured or doesn't understand ACPI Power Button events at all. In this case you should select the <b>Power off the machine</b> action to stop virtual machine execution.</p> + + + + &Power off the machine + &მანქანის გამორთვა + + + <p>Turns off the virtual machine.</p><p>Note that this action will stop machine execution immediately so that the guest operating system running inside it will not be able to perform a clean shutdown procedure which may result in <i>data loss</i> inside the virtual machine. Selecting this action is recommended only if the virtual machine does not respond to the <b>Send the shutdown signal</b> action.</p> + + + + &Restore current snapshot '%1' + მიმდინარე სწრაფი ასლის(%1) აღდგენა + + + Restore the machine state stored in the current snapshot + + + + <p>When checked, the machine will be returned to the state stored in the current snapshot after it is turned off. This is useful if you are sure that you want to discard the results of your last sessions and start again at that snapshot.</p> + + + + + UIVMInformationDialog + + %1 - Session Information + %1 - სესიის ინფორმაცია + + + Configuration &Details + &კონფიგურაციის დეტალები + + + &Runtime Information + &გაშვებული ასლის ატრიბუტები + + + General + ზოგადი + + + System + სისტემა + + + Display + ეკრანი + + + Storage + საცავი + + + Audio + აუდიო + + + Network + ქსელი + + + Serial Ports + სერიული პორტები + + + USB + USB + + + Shared Folders + გაზიარებული საქაღალდეები + + + Performance &Monitor + &წარმადობის მონიტორი + + + No guest additions! This metric requires guest additions to work properly. + + + + Reset + განულება + + + Show Pie Chart + Pie გრაფიკის ჩვენება + + + Draw Area Chart + ფართობის გრაფიკის დახატვა + + + Seconds + წამი + + + CPU Load + CPU-ის დატვირთვა + + + Guest Load + სტუმრის დატვირთვა + + + VMM Load + VMM-ის დატვირთვა + + + RAM Usage + RAM-ს გამოყენება + + + Total + ჯამში + + + Free + თავისუფალი + + + Used + გამოყენებული + + + Network Rate + ქსელის სიჩქარე + + + Receive Rate + მიღების სიჩქარე + + + Transmit Rate + გადაცემის სიჩქარე + + + Total Received + სულ მიღებული + + + Total Transmitted + სულ გადაცემული + + + Disk IO Rate + დისკის IO სიჩქარე + + + Write Rate + ჩაწერის სიჩქარე + + + Read Rate + კითხვის სიჩქარე + + + Total Written + სულ ჩაწერილი + + + Total Read + სულ წაკითხული + + + VM Exits + ვმ-ი იხურება + + + Current + მიმდინარე + + + Runtime Attributes + გაშვებული ასლის ატრიბუტები + + + Screen Resolution + ეკრანის გარჩევადობა + + + VM Uptime + ვმ-ის ჩართულობის დრო + + + Clipboard Mode + ბუფერის რეჟიმი + + + Drag and Drop Mode + გადათრევა/დაგდების რეჟიმი + + + VM Execution Engine + ვმ-ის შესრულების რეჟიმი + + + Nested Paging + მეხსიერების გვერდების ერთმანეთში ჩალაგების მხარდაჭერა + + + Unrestricted Execution + შეუზღუდავი შესრულება + + + Paravirtualization Interface + პარავირტუალიზაციის ინტერფეისი + + + Guest Additions + სტუმრის დამატებები + + + Guest OS Type + სტუმრის ოს-ის ტიპი + + + Remote Desktop Server Port + დაშორებული სამუშაო მაგიდის სერვერის პორტი + + + &Guest Control + &სტუმრის კონტროლი + + + turned off + Screen + გამორთულია + + + Active + Nested Paging + აქტიური + + + Inactive + Nested Paging + არააქტიური + + + Active + Unrestricted Execution + აქტიური + + + Inactive + Unrestricted Execution + არააქტიური + + + Not Available + VRDE Port + მიუწვდომელია + + + not set + Execution Engine + დაყენებული არაა + + + Not Detected + Guest OS Type + ნაპოვნი არაა + + + Not Detected + Guest Additions Version + ნაპოვნი არაა + + + + UIVMListView + + Inaccessible + მიუწვდომელი + + + + UIVMLogViewerDialog + + %1 - Log Viewer + %1 - ჟურნალის მნახველი + + + + UIVMLogViewerWidget + + Delete the current bookmark + მიმდინარე სანიშნის წაშლა + + + Delete all bookmarks + ყველა სანიშნის წაშლა + + + Log Viewer + ჟურნალის ნახვა + + + Close + დახურვა + + + Select or enter a term which will be used in filtering the log text + + + + Add the filter term to the set of filter terms + + + + Showing %1/%2 + %1/%2-ის ჩვენება + + + The filter terms list, select one to remove or click the button on the right side to remove them all + + + + The type of boolean operator for filter operation + + + + Show Line Numbers + ხაზის ნომრების ჩვენება + + + When checked, show line numbers + თუ ჩართულია, გამოჩნდება ხაზის ნომრები + + + Wrap Lines + სიტყვების გადატანა + + + When checked, wrap lines + თუ ჩართულია, მოხდება სიტყვების გადატანა + + + Font Size + ფონტის ზომა + + + Log viewer font size + ჟურნალის ფანჯრის ფონტის ზომა + + + Open a font dialog to select font face for the logviewer + ჟურნალის ფანჯრის ფონტის არჩევა + + + Reset options to application defaults + პარამეტრების საწყის მნიშვნელობებზე დაბრუნება + + + Enter a search string here + შეიყვანეთ საძებნი სტრიქონი + + + Search for the next occurrence of the string (F3) + სტრიქონის შემდეგ გამოჩენაზე გადასვლა (F3) + + + Search for the previous occurrence of the string (Shift+F3) + სტრიქონის წინა გამოჩენაზე გადასვლა (Shift+F3) + + + C&ase Sensitive + &დიდი და პატარა სიმბოლოები + + + When checked, perform case sensitive search + დიდი და პატარა ასოების განსხვავება + + + Ma&tch Whole Word + &მხოლოდ მთლიანი სიტყვები + + + When checked, search matches only complete words + როცა ჩართულია, მოიძებნება მხოლოდ მთლიანი სიტყვები + + + &Highlight All + &ყველას გამოკვეთა + + + When checked, all occurence of the search text are highlighted + როცა ჩართულია, საძებნელი ტექსტი გამოიკვეთება + + + Filtered + გაფილტრული + + + Bookmark + სანიშნი + + + Save VirtualBox Log As + VirtualBox-ის ჟურნალის შენახვა, როგორც + + + <p><b>No machine</b> is currently selected or the selected machine is not valid. Please select a Virtual Machine to see its logs + <p><b>მანქანა</b> არჩეული არაა ან არჩეული მანქანა გაფუჭებულია. ჟურნალის სანახავად სწორი მანქანა აირჩიეთ + + + <p>No log files found. Press the <b>Refresh</b> button to rescan the log folder <nobr><b>%1</b></nobr>.</p> + <p>ჟურნალის ფაილები არ არსებობს. გასაახლებლად დააწექით <b>განახლების</b> ღილაკს<nobr><b>%1</b></nobr>.</p> + + + Go to the next bookmark + შემდეგ სანიშნზე გადასვლა + + + Go to the previous bookmark + წინა სანიშნზე გადასვლა + + + Go to selected bookmark + არჩეულ სანიშნზე გადასვლა + + + + UIVideoMemoryEditor + + Video &Memory: + ვიდეო &მეხსიერება: + + + %1 MB + %1 მბ + + + MB + მბ + + + + UIVirtualBoxManager + + Manager + Note: main window title which is prepended by the product name. + მმართველი + + + Select a virtual machine file + აირჩიეთ ვირტუალური მანქანის ფაილი + + + Virtual machine files (%1) + ვირტუალური მანქანის ფაილები (%1) + + + Select a destination folder to move the selected virtual machine + აირჩიეთ საქაღალდე, სადაც ვირტუალური მანქანის გადატანა მოხდება + + + Show Toolbar Text + ხელსაწყოთა ზოლის ტექსტის ჩვენება + + + + UIVirtualMachineItem + + Inaccessible + მიუწვდომელი + + + <nobr>%1<br></nobr><nobr>%2 since %3</nobr><br><nobr>Session %4</nobr> + VM tooltip (name, last state change, session state) + <nobr>%1<br></nobr><nobr>%2 %3-ის შემდეგ</nobr><br><nobr>სესია %4</nobr> + + + <nobr><b>%1</b><br></nobr><nobr>Inaccessible since %2</nobr> + Inaccessible VM tooltip (name, last state change) + <nobr><b>%1</b><br></nobr><nobr>მიუწვდომელია %2-დან</nobr> + + + + UIVirtualMachineItemCloud + + Loading ... + + + + Up-To-Date + + + + <nobr><b>%1</b></nobr><br><nobr>Inaccessible</nobr> + Inaccessible VM tooltip (name) + + + + Inaccessible + მიუწვდომელი + + + + UIVirtualMachineItemLocal + + <nobr>%1<br></nobr><nobr>%2 since %3</nobr><br><nobr>Session %4</nobr> + VM tooltip (name, last state change, session state) + <nobr>%1<br></nobr><nobr>%2 %3-ის შემდეგ</nobr><br><nobr>სესია %4</nobr> + + + <nobr><b>%1</b><br></nobr><nobr>Inaccessible since %2</nobr> + Inaccessible VM tooltip (name, last state change) + <nobr><b>%1</b><br></nobr><nobr>მიუწვდომელია %2-დან</nobr> + + + Inaccessible + მიუწვდომელი + + + + UIVisoCreator + + Remove selected file objects from VISO + მონიშნული ფაილის ობიექტების VISO-დან წაშლა + + + Name + სახელი + + + Size + ზომა + + + Change Time + დროის შეცვლა + + + Owner + მფლობელი + + + Permissions + წვდომები + + + Local Path + ლოკალური ბილიკი + + + ISO Path + ISO ბილიკი + + + &Options... + &პარამეტრები... + + + Show Hidden Objects + დამალული ფაილების ჩვენება + + + Create a new directory under the current location + მიმდინარე ადგილას ახალი საქაღალდის შექმნა + + + Rename the selected object + მონიშნული ობიექტის სახელის გადარქმევა + + + &Configuration... + &კონფიგურაცია... + + + VISO Configuration + VISO-ის კონფიგურაცია + + + Manage VISO Configuration + VISO-ის კონფიგურაციის მართვა + + + Dialog Options + ფანჯრის მორგება + + + Manage Dialog Options + ფანჯრის პარამეტრების მართვა + + + VISO Name: + VISO-ის სახელი: + + + Custom VISO options: + VISO-ის ხელით მითითებული პარამეტრები: + + + Close the pane + პანელის დახურვა + + + Remove + წაშლა + + + New Directory + ახალი საქაღალდე + + + Reset + თავიდან ჩართვა + + + VISO Creator + VISO-ის შემქმნელი + + + VISO + VISO + + + Remove current option. + მიმდინარე პარამეტრის წაშლა. + + + Add + დამატება + + + Click to show/hide the tree view + დააწკაპუნეთ ხის ხედის ჩასართ/გამოსართავად + + + Add selected file objects to VISO + მონიშნული ფაილის ობიექტების VISO-ში დამატება + + + Reset VISO content. + VISO-ის შემცველობის საწყის მნიშვნელობაზე დაბრუნება. + + + + UIWelcomePane + + <h3>Welcome to VirtualBox!</h3><p>The left part of application window contains global tools and lists all virtual machines and virtual machine groups on your computer. You can import, add and create new VMs using corresponding toolbar buttons. You can popup a tools of currently selected element using corresponding element button.</p><p>You can press the <b>%1</b> key to get instant help, or visit <a href=https://www.virtualbox.org>www.virtualbox.org</a> for more information and latest news.</p> + + + + + UIWizard + + &Expert Mode + &ექსპერტის რეჟიმი + + + Switch to <nobr><b>Expert Mode</b></nobr>, a one-page dialog for experienced users. + + + + &Guided Mode + &გამყოლის რეჟიმი + + + Switch to <nobr><b>Guided Mode</b></nobr>, a step-by-step dialog with detailed explanations. + + + + + UIWizardCloneVD + + Copy + კოპირება + + + &Dynamically allocated + &დინამიკურად გამოყოფილი + + + &Fixed size + &ფიქსირებული ზომა + + + &Split into files of less than 2GB + 2გბ-იანი ფაილებად დახლეჩა + + + Storage on physical hard disk + საცავი ფიზიკურ მყარ დისკზე + + + Copy Virtual Disk Image + ვირტუალური დისკის გამოსახულების კოპირება + + + Disk image file type + დისკის გამოსახულების ფაილის ტიპი + + + Please choose the type of file that you would like to use for the new virtual disk image. If you do not need to use it with other virtualization software you can leave this setting unchanged. + + + + Please choose whether the new virtual disk image file should grow as it is used (dynamically allocated) or if it should be created at its maximum size (fixed size). + + + + <p>A <b>dynamically allocated</b> disk image file will only use space on your physical hard disk 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> + + + + <p>A <b>fixed size</b> disk image file may take longer to create on some systems but is often faster to use.</p> + + + + <p>You can also choose to <b>split</b> the disk image 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. + + + + Please choose a location for new virtual disk image file + აირჩიეთ ვირტუალური დისკის ახალი ფაილის მდებარეობა + + + New disk image to create + დისკის ახალი გამოსახულების შექმნა + + + Please type the name of the new virtual disk image file into the box below or click on the folder icon to select a different folder to create the file in. + + + + Choose a location for new virtual disk image file... + აირჩიეთ ვირტუალური დისკის ახალი ფაილის მდებარეობა... + + + %1_copy + copied virtual disk image name + %1_copy + + + &New disk image to create + &დისკის ახალი გამოსახულების შექმნა + + + Disk image file &type + დისკის გამოსახულების ფაილის &ტიპი + + + + UIWizardCloneVM + + Linked Base for %1 and %2 + %1-ის და %2-ის მიბმა + + + Clone Virtual Machine + ვირტუალური მანქანის კლონირება + + + Clone + კლონირება + + + %1 Clone + %1-ის კლონირება + + + Clone type + კლონის ტიპი + + + <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> + + + + &Full clone + &სრული კლონი + + + &Linked clone + &მიბმული კლონი + + + Snapshots + სწრაფი ასლები + + + <p>Please choose which parts of the snapshot tree should be cloned with the machine.</p> + + + + <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> + + + + <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> + + + + <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> + + + + Current &machine state + მანქანის &მიმდინარე მდგომარეობა + + + Current &snapshot tree branch + + + + &Everything + &ყველაფერი + + + &Full Clone + &სრული კლონი + + + &Linked Clone + &მიბმული კლონი + + + <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 disk 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 disk files will be tied to the virtual hard disk files of original machine and you will not be able to move the new virtual machine to a different computer without moving the original as well.</p> + + + + <p>Please choose a name and optionally a folder for the new virtual machine. The new machine will be a clone of the machine <b>%1</b>.</p> + + + + Name: + სახელი: + + + Path: + ბილიკი: + + + MAC Address &Policy: + MAC მისამართების &წესები: + + + Include all network adapter MAC addresses + ყველა ქსელის ბარათის MAC მისამართის დამატება + + + Include only NAT network adapter MAC addresses + მხოლოდ NAT ქსელის MAC მისამართების ჩასმა + + + Generate new MAC addresses for all network adapters + ყველა ქსელის ბარათისთვის ახალი MAC მისამართის გენერაცია + + + Include only NAT network adapter MAC addresses during cloning. + კლონირებისას მხოლოდ NAT ქსელის MAC მისამართების ჩასმა. + + + Generate new MAC addresses for all network adapters during cloning. + კლონირებისას ყველა ქსელის ბარათისთვის ახალი MAC მისამართის გენერაცია. + + + Additional Options: + დამატებითი პარამეტრები: + + + Don't change the disk names during cloning. + კლონირებისას არ შეცვალო დისკის სახელები. + + + Keep &Disk Names + &დისკის სახელების დამახსოვრება + + + Don't change hardware UUIDs during cloning. + კლონირებისას არ შეცვალო აპარატურის UUID-ები. + + + Keep &Hardware UUIDs + აპარატურის UUID_ების დატოვება + + + New machine &name and path + ახალი ვირტუალური მანქანის &სახელი და ბილიკი + + + New machine name and path + ახალი მანქანის სახელი და ბილიკი + + + Include all network adapter MAC addresses during cloning. + კლონირებისას ადაპტერის MAC მისამართების ზუსტად გადატანა. + + + Additional options + დამატებითი პარამეტრები + + + + UIWizardExportApp + + Checking files ... + ფაილების შემოწმება ... + + + Removing files ... + ფაილების წაშლა ... + + + Exporting Appliance ... + შეკუმშული მანქანის გატანა ... + + + Export Virtual Appliance + შეკუმშული მანქანის გატანა + + + Restore Defaults + &ნაგულისხმევი პარამეტრების აღდგენა + + + Export + გატანა + + + Virtual machines to export + გასატანი ვირტუალური მანქანები + + + <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> + + + + Appliance settings + შეკუმშული მანქანის მორგება + + + Appliance + შეკუმშული მანქანა + + + &File: + &ფაილი: + + + Open Virtualization Format Archive (%1) + ღია ვირტუალიზაციის არქივის ფორმატი (%1) + + + Open Virtualization Format (%1) + ღია ვირტუალიზაციის ფორმატი (%1) + + + Write in legacy OVF 0.9 format for compatibility with other virtualization products. + + + + Create a Manifest file for automatic data integrity checks on import. + + + + This is the descriptive information which will be added to the virtual appliance. You can change it by double clicking on individual lines. + + + + Virtual &machines to export + &გასატანი ვირტუალური მანქანები + + + Please choose a file to export the virtual appliance to + + + + F&ormat: + &ფორმატი: + + + Write in standard OVF 1.0 format. + სტანდარტული 1.0 ფორმატში ჩაწერა. + + + Open Virtualization Format 0.9 + ღია ვირტუალიზაციის ფორმატი 0.9 + + + Open Virtualization Format 1.0 + ღია ვირტუალიზაციის ფორმატი 1.0 + + + Open Virtualization Format 2.0 + ღია ვირტუალიზაციის ფორმატი 2.0 + + + Write in new OVF 2.0 format. + ახალ OVF 2.0 ფორმატში ჩაწერა. + + + <p>Please choose a format to export the virtual appliance to.</p><p>The <b>Open Virtualization Format</b> supports only <b>ovf</b> or <b>ova</b> extensions. If you use the <b>ovf</b> extension, several files will be written separately. If you use the <b>ova</b> extension, all the files will be combined into one Open Virtualization Format archive.</p><p>The <b>Oracle Cloud Infrastructure</b> format supports exporting to remote cloud servers only. Main virtual disk of each selected machine will be uploaded to remote server.</p> + + + + Choose a file to export the virtual appliance to... + + + + Export to cloud service provider. + ღრუბლოვან მომწოდებელში გატანა. + + + MAC Address &Policy: + MAC მისამართების &წესები: + + + Include all network adapter MAC addresses + ყველა ქსელის ბარათის MAC მისამართის დამატება + + + Include only NAT network adapter MAC addresses + მხოლოდ NAT ქსელის MAC მისამართების ჩასმა + + + Strip all network adapter MAC addresses + + + + Include all network adapter MAC addresses in exported appliance archive. + + + + Include only NAT network adapter MAC addresses in exported appliance archive. + + + + Strip all network adapter MAC addresses from exported appliance archive. + + + + Additionally: + დამატებით: + + + &Write Manifest file + &მანისფესტის ფაილის ჩაწერა + + + Include ISO image files in exported VM archive. + ვმ-ის გატანილ არქივში ISO ფაილების ჩამატება. + + + &Include ISO image files + &ISO ფაილის ჩათვლით + + + &Account: + &ანგარიში: + + + <p>Please choose a filename to export the virtual appliance to. Besides that you can specify a certain amount of options which affects the size and content of resulting archive.</p> + + + + Virtual system settings + ვირტუალური სისტემის მორგება + + + Virtual &system settings + ვირტუალური &სისტემის მორგება + + + Include ISO image files into exported VM archive. + + + + <p>Please choose one of cloud service accounts you have registered to export virtual machines to. Make sure profile settings reflected in the underlying table are valid. They will be used to establish network connection required to upload your virtual machine files to a remote cloud facility.</p> + + + + Machine Creation: + მანქანის შექმნა: + + + Ask me about it &after exporting disk as custom image + + + + Ask me about it &before exporting disk as custom image + + + + Do &not ask me about it, leave custom image for future usage + + + + This is the descriptive information which will be used to determine settings for a cloud storage your VM being exported to. You can change it by double clicking on individual lines. + + + + Acquire export form ... + გატანის ფორმის მიღება ... + + + + UIWizardFirstRun + + Select start-up disk + აირჩიეთ გასაშვები დისკი + + + Start + დაწყება + + + <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 using the Devices menu.</p> + + + + <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> + + + + Choose a virtual optical disk file... + + + + + UIWizardImportApp + + Restore Defaults + &ნაგულისხმევი პარამეტრების აღდგენა + + + Import + შემოტანა + + + Appliance to import + შეკუმშული მანქანის შემოტანა + + + Open Virtualization Format (%1) + ღია ვირტუალიზაციის ფორმატი (%1) + + + Appliance settings + შეკუმშული მანქანის მორგება + + + 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. + + + + Import Virtual Appliance + შეკუმშული მანქანის შემოტანა + + + Choose a virtual appliance file to import... + აირჩიეთ შემოსატანი შეკუმშული ვირტუალური მანქანის ფაილები... + + + Please choose a virtual appliance file to import + აირჩიეთ შემოსატანი შეკუმშული ვირტუალური მანქანის ფაილები + + + Appliance is not signed + არქივი ხელმოწერილი არაა + + + Appliance signed by %1 (trusted) + არქივი ხელმოწერილია %1-ის მიერ (სანდოა) + + + Appliance signed by %1 (expired!) + არქივი ხელმოწერილია %1-ის მიერ (ვადაგასულია) + + + Unverified signature by %1! + შეუმოწმებელი ხელმოწერა %1-სგან! + + + Self signed by %1 (trusted) + თვითხელმოწერილია %1-ის მიერ (სანდოა) + + + Self signed by %1 (expired!) + თვითხელმოწერილია %1-ის მიერ (ვადაგასულია) + + + Unverified self signed signature by %1! + შეუმოწმებელი თვითხელმოწერილი ხელმოწერა %1-სგან! + + + Importing Appliance ... + შეკუმშული მანქანის შემოტანა... + + + Local File System + ლოკალური ფაილური სისტემა + + + Import from local file system. + ლოკალური ფაილური სისტემიდან შემოტანა. + + + Import from cloud service provider. + ღრუბლოვანი მომწოდებლიდან შემოტანა. + + + &File: + &ფაილი: + + + &Account: + &ანგარიში: + + + &Machines: + &მანქანები: + + + <p>Please choose one of cloud service accounts you have registered to import virtual machine from. Corresponding machines list will be updated. To continue, select one of machines to import below.</p> + + + + <p>Please choose a file to import the virtual appliance from. VirtualBox currently supports importing appliances saved in the Open Virtualization Format (OVF). To continue, select the file to import below.</p> + + + + These are the the suggested settings of the cloud VM import procedure, they are influencing the resulting local VM instance. You can change many of the properties shown by double-clicking on the items and disable others using the check boxes below. + + + + Source + წყარო + + + Settings + მორგება + + + Acquire cloud instances ... + ღრუბლოვანი გაშებულ ასლების მიღება ... + + + Read appliance ... + შეკუმშული მანქანის წაკითხვა ... + + + Acquire import form ... + შემოტანის მიღების ფორმა ... + + + Please choose the source to import appliance from. This can be a local file system to import OVF archive or one of known cloud service providers to import cloud VM from. + + + + &Source: + &წყარო: + + + + UIWizardNewCloudVM + + Create Cloud Machine ... + ღრუბლოვანი მანქანის შექმნა... + + + Create Cloud Virtual Machine + ღრუბლოვანი ვირტუალური მანქანის შექმნა + + + Create + შექმნა + + + Destination to create + + + + Please choose the destination to create cloud virtual machine in. This can be one of known cloud service providers below. + + + + Create VM for cloud service provider. + აირჩიეთ ღრუბლოვანი მომწოდებლის ვმ-ი. + + + <p>Please choose one of cloud service accounts you have registered to create virtual machine for. Existing custom images list will be updated. To continue, select one of custom images to create virtual machine on the basis of it.</p> + + + + &Account: + &ანგარიში: + + + &Images: + &გამოსახულებები: + + + Cloud Virtual Machine settings + ღრუბლოვანი ვირტუალური მანქანის მორგება + + + These are the the suggested settings of the cloud VM creation procedure, they are influencing the resulting cloud VM instance. You can change many of the properties shown by double-clicking on the items and disable others using the check boxes below. + + + + Destination + დანიშნულება + + + Settings + მორგება + + + Acquire launch form ... + გამშვების მიღების წყარო ... + + + Acquire cloud images ... + ღრუბლოვანი გამოსახულების მიღება... + + + &Destination: + &დანიშნულება: + + + + UIWizardNewVD + + Create Virtual Hard Disk + ვირტუალური მყარი დისკის შექმნა + + + Create + შექმნა + + + Hard disk file type + მყარი დისკის ფაილის ტიპი + + + Please choose the type of file that you would like to use for the new virtual hard disk. If you do not need to use it with other virtualization software you can leave this setting unchanged. + + + + Storage on physical hard disk + საცავი ფიზიკურ მყარ დისკზე + + + Please choose whether the new virtual hard disk file should grow as it is used (dynamically allocated) or if it should be created at its maximum size (fixed size). + + + + <p>A <b>dynamically allocated</b> hard disk file will only use space on your physical hard disk 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> + + + + <p>A <b>fixed size</b> hard disk file may take longer to create on some systems but is often faster to use.</p> + + + + <p>You can also choose to <b>split</b> the hard disk 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. + + + + &Dynamically allocated + &დინამიკურად გამოყოფილი + + + &Fixed size + &ფიქსირებული ზომა + + + &Split into files of less than 2GB + 2გბ-იანი ფაილებად დახლეჩა + + + File location and size + ფაილის მდებარეობა და ზომა + + + Please type the name of the new virtual hard disk file into the box below or click on the folder icon to select a different folder to create the file in. + + + + Choose a location for new virtual hard disk file... + აირჩიეთ დისკის ახალი ფაილის მდებარეობა... + + + Select the size of the virtual hard disk 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 disk. + + + + File &location + &ფაილის მდებარეობა + + + File &size + ფაილის &ზომა + + + Hard disk file &type + მყარი დისკის ფაილის &ტიპი + + + + UIWizardNewVM + + Create Virtual Machine + ვირტუალური მანქანის შექმნა + + + Create + შექმნა + + + Name and operating system + სახელი და ოპერაციული სისტემა + + + Memory size + მეხსიერების ზომა + + + <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> + + + + &Memory size + &მეხსიერების ზომა + + + Hard disk + მყარი დისკი + + + <p>If you wish you can add a virtual hard disk to the new machine. You can either create a new hard disk 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 disk is <b>%1</b>.</p> + + + + &Do not add a virtual hard disk + &არ დაამატო ვირტუალური მყარი დისკი + + + &Create a virtual hard disk now + &ვირტუალური მყარი დისკის ახლა დამატება + + + &Use an existing virtual hard disk file + &არსებული ვირტუალური მყარი დისკის გამოყენება + + + Choose a virtual hard disk file... + აირჩიეტ ვირტუალური მყარი დისკის ფაილი... + + + Please choose a descriptive name and destination folder 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. + + + + + VBoxAboutDlg + + VirtualBox - About + VirtualBox-ის შესახებ + + + VirtualBox Graphical User Interface + VirtualBox-ის მომხმარებლის გრაფიკული ინტერფეისი + + + Version %1 + ვერსია %1 + + + + VBoxLicenseViewer + + VirtualBox License + VirtualBox-ის ლიცენზია + + + I &Agree + &ვეთანხმები + + + I &Disagree + &არ ვეთანხმები + + + + VBoxUSBMenu + + <no devices available> + USB devices + <no devices available> + + + No supported devices connected to the host PC + USB device tooltip + ჰოსტზე მხარდაჭერილი მოწყობილობები მიერთებული არაა + + + diff -Nru virtualbox-hwe-6.1.34-dfsg/src/VBox/Frontends/VirtualBox/nls/VirtualBox_km_KH.ts virtualbox-hwe-6.1.38-dfsg/src/VBox/Frontends/VirtualBox/nls/VirtualBox_km_KH.ts --- virtualbox-hwe-6.1.34-dfsg/src/VBox/Frontends/VirtualBox/nls/VirtualBox_km_KH.ts 2022-03-22 23:44:34.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/src/VBox/Frontends/VirtualBox/nls/VirtualBox_km_KH.ts 2022-09-01 13:27:59.000000000 +0000 @@ -2158,6 +2158,10 @@ Primary Group + + Storage Controller (VirtioSCSI) + + UIApplianceImportEditorWidget @@ -3329,7 +3333,7 @@ Starting GuestSessionStatus - ចាប់ផ្ដើម + ចាប់ផ្ដើម Starting @@ -3523,8 +3527,8 @@ NAT - Bridget Adapter - + Bridged Adapter + អាដាប់​​ទ័រ​​ប្រ៊ីដ្យ​​ Internal Network @@ -4085,6 +4089,50 @@ NetworkAttachmentType + + Undefined + GuestSessionStatus + + + + Started + GuestSessionStatus + + + + Terminating + GuestSessionStatus + + + + Terminated + GuestSessionStatus + + + + Timed Out (Killed) + GuestSessionStatus + + + + Timed Out (Abnormally) + GuestSessionStatus + + + + Down + GuestSessionStatus + + + + Error + GuestSessionStatus + + + + Cloud Network + + UICustomFileSystemModel @@ -5625,6 +5673,14 @@ No Guest Session found!<br>Please use the Session Panel to start a new guest session + + Close dialog without saving + + + + Reset Changes (%1) + + UIFilePathSelector @@ -10307,10 +10363,6 @@ - The hardware virtualization is enabled in the Acceleration section of the System page although it is not supported by the host system. It should be disabled in order to start the virtual system. - - - %1 CPU %1 is 1 for now @@ -12897,18 +12949,6 @@ - Failed to open the medium with following ID: <nobr><b>%1</b></nobr>. - - - - Failed to acquire attachment parameter. - - - - Failed to acquire medium attribute. - - - Failed to create cloud machine. diff -Nru virtualbox-hwe-6.1.34-dfsg/src/VBox/Frontends/VirtualBox/nls/VirtualBox_ko.ts virtualbox-hwe-6.1.38-dfsg/src/VBox/Frontends/VirtualBox/nls/VirtualBox_ko.ts --- virtualbox-hwe-6.1.34-dfsg/src/VBox/Frontends/VirtualBox/nls/VirtualBox_ko.ts 2022-03-22 23:44:34.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/src/VBox/Frontends/VirtualBox/nls/VirtualBox_ko.ts 2022-09-01 13:27:59.000000000 +0000 @@ -1865,6 +1865,10 @@ Primary Group 주 그룹 + + Storage Controller (VirtioSCSI) + + UIApplianceImportEditorWidget @@ -3220,7 +3224,7 @@ NAT - Bridget Adapter + Bridged Adapter 브리지 어댑터 @@ -3782,6 +3786,55 @@ NetworkAttachmentType + + Undefined + GuestSessionStatus + + + + Starting + GuestSessionStatus + 시작하는 중 + + + Started + GuestSessionStatus + + + + Terminating + GuestSessionStatus + + + + Terminated + GuestSessionStatus + + + + Timed Out (Killed) + GuestSessionStatus + + + + Timed Out (Abnormally) + GuestSessionStatus + + + + Down + GuestSessionStatus + + + + Error + GuestSessionStatus + + + + Cloud Network + 클라우드 네트워크 + UICustomFileSystemModel @@ -4682,6 +4735,14 @@ No Guest Session found!<br>Please use the Session Panel to start a new guest session 게스트 세션을 찾을 수 없습니다!<br>세션 패널에서 새 게스트 세션을 시작하십시오 + + Close dialog without saving + 저장하지 않고 대화 상자 닫기 + + + Reset Changes (%1) + 변경 사항 초기화(%1) + UIFilePathSelector @@ -7331,7 +7392,7 @@ The hardware virtualization is enabled in the Acceleration section of the System page although it is not supported by the host system. It should be disabled in order to start the virtual system. - 호스트 시스템에서 하드웨어 가상화를 지원하지 않지만, 시스템 페이지의 가속 부분에서 활성화되어 있습니다. 가상 시스템을 시작하려면 해당 설정을 비활성화해야 합니다. + 호스트 시스템에서 하드웨어 가상화를 지원하지 않지만, 시스템 페이지의 가속 부분에서 활성화되어 있습니다. 가상 시스템을 시작하려면 해당 설정을 비활성화해야 합니다. When checked, the nested hardware virtualization CPU feature will be exposed to the virtual machine. @@ -9145,15 +9206,15 @@ Failed to open the medium with following ID: <nobr><b>%1</b></nobr>. - 다음 ID를 사용하는 미디어를 열 수 없습니다: <nobr><b>%1</b></nobr>. + 다음 ID를 사용하는 미디어를 열 수 없습니다: <nobr><b>%1</b></nobr>. Failed to acquire attachment parameter. - 연결 인자를 가져올 수 없습니다. + 연결 인자를 가져올 수 없습니다. Failed to acquire medium attribute. - 미디어 속성을 가져올 수 없습니다. + 미디어 속성을 가져올 수 없습니다. Failed to create cloud machine. diff -Nru virtualbox-hwe-6.1.34-dfsg/src/VBox/Frontends/VirtualBox/nls/VirtualBox_lt.ts virtualbox-hwe-6.1.38-dfsg/src/VBox/Frontends/VirtualBox/nls/VirtualBox_lt.ts --- virtualbox-hwe-6.1.34-dfsg/src/VBox/Frontends/VirtualBox/nls/VirtualBox_lt.ts 2022-03-22 23:44:34.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/src/VBox/Frontends/VirtualBox/nls/VirtualBox_lt.ts 2022-09-01 13:27:59.000000000 +0000 @@ -2464,6 +2464,10 @@ Primary Group + + Storage Controller (VirtioSCSI) + + UIApplianceImportEditorWidget @@ -3787,7 +3791,7 @@ Starting GuestSessionStatus - Paleidžiama + Paleidžiama Starting @@ -3981,8 +3985,8 @@ NAT - Bridget Adapter - + Bridged Adapter + Tinklų tiltas Internal Network @@ -4555,6 +4559,50 @@ NetworkAttachmentType + + Undefined + GuestSessionStatus + + + + Started + GuestSessionStatus + + + + Terminating + GuestSessionStatus + + + + Terminated + GuestSessionStatus + + + + Timed Out (Killed) + GuestSessionStatus + + + + Timed Out (Abnormally) + GuestSessionStatus + + + + Down + GuestSessionStatus + + + + Error + GuestSessionStatus + + + + Cloud Network + + UICustomFileSystemModel @@ -6223,6 +6271,14 @@ No Guest Session found!<br>Please use the Session Panel to start a new guest session + + Close dialog without saving + Užverti neįrašant + + + Reset Changes (%1) + Atmesti pakeitimus (%1) + UIFilePathSelector @@ -12015,10 +12071,6 @@ - The hardware virtualization is enabled in the Acceleration section of the System page although it is not supported by the host system. It should be disabled in order to start the virtual system. - - - When checked, the nested hardware virtualization CPU feature will be exposed to the virtual machine. @@ -14991,18 +15043,6 @@ - Failed to open the medium with following ID: <nobr><b>%1</b></nobr>. - - - - Failed to acquire attachment parameter. - - - - Failed to acquire medium attribute. - - - Failed to create cloud machine. diff -Nru virtualbox-hwe-6.1.34-dfsg/src/VBox/Frontends/VirtualBox/nls/VirtualBox_nl.ts virtualbox-hwe-6.1.38-dfsg/src/VBox/Frontends/VirtualBox/nls/VirtualBox_nl.ts --- virtualbox-hwe-6.1.34-dfsg/src/VBox/Frontends/VirtualBox/nls/VirtualBox_nl.ts 2022-03-22 23:44:34.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/src/VBox/Frontends/VirtualBox/nls/VirtualBox_nl.ts 2022-09-01 13:27:59.000000000 +0000 @@ -2099,6 +2099,10 @@ Primary Group Primaire groep + + Storage Controller (VirtioSCSI) + + UIApplianceImportEditorWidget @@ -3306,7 +3310,7 @@ Starting GuestSessionStatus - Starten + Starten Starting @@ -3500,7 +3504,7 @@ NAT - Bridget Adapter + Bridged Adapter Bridged adapter @@ -4068,6 +4072,50 @@ NetworkAttachmentType + + Undefined + GuestSessionStatus + + + + Started + GuestSessionStatus + + + + Terminating + GuestSessionStatus + + + + Terminated + GuestSessionStatus + + + + Timed Out (Killed) + GuestSessionStatus + + + + Timed Out (Abnormally) + GuestSessionStatus + + + + Down + GuestSessionStatus + + + + Error + GuestSessionStatus + + + + Cloud Network + Cloudnetwerk + UICustomFileSystemModel @@ -5014,6 +5062,14 @@ No Guest Session found!<br>Please use the Session Panel to start a new guest session Geen gastsessie gevonden!<br> Gebruik het venster Sessie om een nieuwe gastsessie te starten + + Close dialog without saving + Sluit dialoog af zonder opslaan + + + Reset Changes (%1) + Reset veranderingen (%1) + UIFilePathSelector @@ -9597,7 +9653,7 @@ The hardware virtualization is enabled in the Acceleration section of the System page although it is not supported by the host system. It should be disabled in order to start the virtual system. - De hardware-virtualisatie is in de sectie Acceleratie op pagina Systeem ingeschakeld hoewel het hostsysteem dit niet ondersteunt. Dit moet worden uitgeschakeld wil de virtuele machine starten. + De hardware-virtualisatie is in de sectie Acceleratie op pagina Systeem ingeschakeld hoewel het hostsysteem dit niet ondersteunt. Dit moet worden uitgeschakeld wil de virtuele machine starten. When checked, the nested hardware virtualization CPU feature will be exposed to the virtual machine. @@ -11815,15 +11871,15 @@ Failed to open the medium with following ID: <nobr><b>%1</b></nobr>. - Het is niet gelukt medium met ID <nobr><b>%1</b></nobr> te openen. + Het is niet gelukt medium met ID <nobr><b>%1</b></nobr> te openen. Failed to acquire attachment parameter. - Het is niet gelukt aansluitingsparameter te verkrijgen (attachment parameter). + Het is niet gelukt aansluitingsparameter te verkrijgen (attachment parameter). Failed to acquire medium attribute. - Het is niet gelukt mediumparameter te verkrijgen. + Het is niet gelukt mediumparameter te verkrijgen. Failed to create cloud machine. diff -Nru virtualbox-hwe-6.1.34-dfsg/src/VBox/Frontends/VirtualBox/nls/VirtualBox_pl.ts virtualbox-hwe-6.1.38-dfsg/src/VBox/Frontends/VirtualBox/nls/VirtualBox_pl.ts --- virtualbox-hwe-6.1.34-dfsg/src/VBox/Frontends/VirtualBox/nls/VirtualBox_pl.ts 2022-03-22 23:44:34.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/src/VBox/Frontends/VirtualBox/nls/VirtualBox_pl.ts 2022-09-01 13:27:59.000000000 +0000 @@ -16,17 +16,17 @@ Oracle Corporation Comma-separated list of translators - Dawid Wrobel, Adrian Lubik, Wiktor Wandachowicz, Bartosz + Dawid Wrobel, Adrian Lubik, Wiktor Wandachowicz, Bartosz, Michal L -- Native language country name (empty if this language is for all countries) - -- + -- -- Language country name, in English (empty if native country name is empty) - -- + -- @@ -157,11 +157,11 @@ The VirtualBox Linux kernel driver is either not loaded or not set up correctly. Please try setting it up again by executing<br/><br/> <font color=blue>'/sbin/vboxconfig'</font><br/><br/>as root.<br/><br/>If your system has EFI Secure Boot enabled you may also need to sign the kernel modules (vboxdrv, vboxnetflt, vboxnetadp, vboxpci) before you can load them. Please see your Linux system's documentation for more information. - + Sterownik Linuksowego jądra VirtualBox nie jest załadowany lub nie jest poprawnie skonfigurowany. Spróbuj ustawić go ponownie poprzez wykonanie<br/><br/> <font color=blue>'/sbin/vboxconfig'</font><br/><br/>jako root.<br/><br/>W przypadku, gdy system ma włączony bezpieczyny rozruch (EFI Secure Boot) musisz również podpisać moduły jądra (vboxdrv, vboxnetflt, vboxnetadp, vboxpci) przed ich załadowaniem. Aby uzyskać więcej informacji, zobacz dokumentację swojej dystrybucji systemu Linux. 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>'/sbin/vboxconfig'</font><br/><br/>may correct this. Make sure that you are not mixing builds of VirtualBox from different sources. - + Moduły jądra systemu nie odpowiadają tej wersji VirtualBox. Prawdopodobnie nie powiodła się instalacja programu VirtualBox. Wywołanie<br/><br/> <font color=blue>'/sbin/vboxconfig'</font><br/><br/>może pomóc rozwiązać ten problem. Proszę także pamiętać, aby nie mieszać ze sobą wersji programu VirtualBox z różnych źródeł. @@ -227,7 +227,7 @@ QIInputDialog Name: - + Nazwa: @@ -351,19 +351,19 @@ %1, %2: %3, %4: %5, %6: %7, %8: %9 col.1 text, col.2 name: col.2 text, col.3 name: col.3 text, col.4 name: col.4 text, col.5 name: col.5 text - + %1, %2: %3, %4: %5, %6: %7, %8: %9 Full - Pełny + Pełny Read-only - Tylko do odczytu + Tylko do odczytu Yes - Tak + Tak @@ -679,7 +679,7 @@ &Network Operations Manager... - &Menedźer operacji sieciowych... + &Menedżer operacji sieciowych... Check for a new VirtualBox version @@ -839,7 +839,7 @@ Gro&up - Gru&pa + Gru&puj Shared &Clipboard @@ -1144,7 +1144,7 @@ Resize to %1x%2 Virtual Screen - Przeskaluj o %1x%2 + Przeskaluj do %1x%2 Preview Monitor %1 @@ -1336,11 +1336,11 @@ &VirtualBox Bug Tracker... - &Łapacz błędów programu VirtualBox... + &Narzędzie śledzenia błędów (Bug Tracker) programu VirtualBox... Open the browser and go to the VirtualBox product bug tracker - Otwiera przeglądarkę i przechodzi do strony internetowej łapacza błędów VirtualBoxa + Otwiera przeglądarkę i przechodzi do strony internetowej narzędzia śledzenia błędów (Bugtracker) VirtualBoxa &VirtualBox Forums... @@ -1372,91 +1372,91 @@ &Details - &Szczegóły + &Szczegóły &Log - + &Log &Find - &Szukaj + &Szukaj Log Viewer - Przeglądarka logów + Przeglądarka logów Open pane with searching options - + Otwórz panel z opcjami wyszukiwania &Filter - + &Filtr Open pane with filtering options - + Otwórz panel z opcjami filtrowania &Bookmark - + &Zakładka Open pane with bookmarking options - + Otwórz panel z opcjami zakładek &Options - + &Opcje Open pane with log viewer options - + Otwórz panel z opcjami przeglądarki logów &Refresh - &Odśwież + &Odśwież Refresh selected virtual machine log - + Odśwież log wybranej maszyny wirtualnej &Save... - Zapi&sz... + Zapi&sz... Save selected virtual machine log - + Zapisz wybrany log maszyny wirtualnej File Manager - + Menedżer plików Host - + Gospodarz Guest - Gość + Gość Copy to guest - + Skopiuj do gościa Copy the selected object(s) from host to guest - + Skopiuj wybrany obiekt(y) z maszyny gospodarza do gościa Copy to host - + Skopiuj do gospodarza Copy the selected object(s) from guest to host - + Skopiuj wybrany obiekt(y) z maszyny gościa do gospodarza Settings @@ -1464,31 +1464,31 @@ Log - Log + Log Session - + Sesja Go one level up to parent folder - + Przejdź jeden poziom w górę do folderu nadrzędnego Go Home - + Przejdź do folderu domowego Go to home folder - + Przejdź do folderu domowego Go to Home Folder - + Przejdź do folderu domowego Delete - + Usuń Delete selected file object(s) @@ -1496,19 +1496,19 @@ Refresh - Odśwież + Odśwież Rename - Zmień nazwę + Zmień nazwę Create New Directory - + Stwórz nowy folder Copy - Kopiuj + Kopiuj Copy selected file object(s) @@ -1516,7 +1516,7 @@ Cut - + Wytnij Cut selected file object(s) @@ -1524,7 +1524,7 @@ Paste - + Wklej Paste copied/cut file object(s) @@ -1532,7 +1532,7 @@ Select All - + Zaznacz wszystko Select all files objects @@ -1540,15 +1540,15 @@ Invert Selection - + Odwróć zaznaczenie Invert the current selection - + Odwróć bieżące zaznaczenie Show Properties - + Pokaż właściwości Show the properties of currently selected file object(s) @@ -1556,147 +1556,147 @@ &Host Network Manager... - + &Menedżer sieci hosta... Display the Host Network Manager window - + Wyświetla okno Menedżer sieci hosta &Cloud Profile Manager... - + Menedżer profilu &chmury... Display the Cloud Profile Manager window - + Wyświetla okno Menedżera profilu chmury Import - Importuj + Importuj Export - Eksportuj + Eksportuj &Move... - + &Przenieś... Move selected virtual machine - + Przenieś wybrane maszyny wirtualne Open the machine details pane - + Otwórz panel szczegółów maszyny &Snapshots - + &Migawki Open the machine snapshots pane - + Otwórz panel migawek maszyny &Logs - + &Logi Open the machine logs pane - + Otwórz panel logów maszyny &Global Tools Menu - + Menu narzędzi &globalnych &Virtual Media Manager - + Menedżer nośników &wirtualnych Open the Virtual Media Manager - + Otwórz Menedżer nośników wirtualnych &Host Network Manager - + &Menedżer sieci hosta Open the Host Network Manager - + Otwórz Menedżer sieci hosta &Cloud Profile Manager - + &Menedżer profilu chmury Open the Cloud Profile Manager - + Otwórz Menedżera profili chmury &Snapshot - + &Migawka &Take... - + &Zrób... Snapshot Pane - + Panel zrzutów ekranu Take a snapshot of the current virtual machine state - Zrób migawkę aktualnego stanu maszyny wirtualnej + Zrób migawkę aktualnego stanu maszyny wirtualnej &Delete... - + &Usuń... Delete selected snapshot of the virtual machine - Usuń wybraną migawkę maszyny wirtualnej + Usuń wybraną migawkę maszyny wirtualnej &Restore... - + &Przywróć... Restore selected snapshot of the virtual machine - Przywróć wybraną migawkę maszyny wirtualnej + Przywróć wybraną migawkę maszyny wirtualnej &Properties - + &Właściwości Open pane with the selected snapshot properties - + Otwórz panel właściwości wybranych zrzutów ekranu &Clone... - &Sklonuj... + &Sklonuj... &Medium - + &Nośnik Media Manager - + Menedżer nośników &Copy... - &Kopiuj... + &Kopiuj... Re&lease... - + Wy&suń... Re&fresh... - + Odś&wież... Refresh the list of disk image files @@ -1704,210 +1704,210 @@ &Create... - + &Stwórz... Network Manager - + Menedżer sieci Create new host-only network - + Stwórz nową sieć izolowaną Remove selected host-only network - + Usuń wybraną sieć izolowaną Open pane with selected host-only network properties - + Otwórz panel właściwości wybranej sieci izolowanej Refresh the list of host-only networks - + Odśwież listę sieci izolowanych &Cloud - + &Chmura Add - Dodaj + Dodaj &Add Profile... - + &Dodaj profil... Cloud Profile Manager - + Menedżer profilu chmury Add new cloud profile - + Dodaj nowy profil chmury &Import Profiles... - + &Importuj profile... Import the list of cloud profiles from external files - + Importuj listę profili chmury z zewnętrznych plików Remove - Usuń + Usuń &Remove Profile... - + &Usuń profil... Remove selected cloud profile - + Usuń wybrane profile chmury Properties - + Właściwości Profile &Properties - + Właściwości &profilu Open pane with selected cloud profile properties - + Otwórz okienko z właściwościami wybranego profilu chmury Help - Pomoc + Pomoc &Show Help... - + &Pokaż pomoc... Show cloud profile help - + Pokaż pomoc profilu w chmurze File Manager... - + Menedżer plików... &Recording - + &Nagrywanie &Recording Settings... - + &Ustawienia nagrywania... Display virtual machine settings window to configure video/audio recording - + Wyświetla ustawienia wirtualnej maszyny, by skonfigurować przechwytywanie obrazu/dźwięku Enable guest video/audio recording - + Włącza nagrywanie dźwięku/obrazu maszyny gościa &Audio - + &Dźwięk Audio Output - + Wyjście dźwięku Enable audio output - + Włącz wyjście dźwięku Audio Input - + Wejście dźwięku Enable audio input - + Włącz wejście dźwięku Scale to %1% scale-factor - + Przeskaluj o %1% Scale to %1% (unscaled output) scale-factor - + Przeskaluj o %1% (wyjście nieskalowane) Scale to %1% (autoscaled output) scale-factor - + Przeskaluj o %1% (autoskalowanie) Options - + Opcje Open panel with file manager options - + Otwórz panel z opcjami menedżera plików Open panel with file manager log - + Otwórz panel z logami menedżera plików Operations - + Operacje Open panel with file manager operations - + Otwórz panel z operacjami medżera plików Open panel with file manager session - + Otwórz panel z sesjami menedżera plików Go Up - + Do góry Display the virtual machine file manager window - + Wyświetla okno menedżera plików maszyny wirtualnej Tools - + Narzędzia E&xport to OCI... - + E&ksportuj do OCI... Export selected virtual machine to OCI - + Wyeksportuj wybrane maszyny wirtualne do OCI Try - + Wypróbuj &Try Oracle Cloud for Free... - + &Wypróbuj Oracle Cloud za darmo... Try Oracle cloud for free - + Wypróbuj Oracle Cloud za darmo Try Oracle Cloud for Free - + Wypróbuj Oracle Cloud za darmo Display Global Preferences - + Wyświetla ustawienia globalne Open Find Pane @@ -1915,55 +1915,55 @@ Open Filter Pane - + Otwórz panel filtrowania Open Bookmark Pane - + Otwórz panel zakładek Open Options Pane - + Otwórz panel opcji Refresh Virtual Machine Log - + Odśwież log maszyny wirtualnej Save Virtual Machine Log - + Zapisz log maszyny wirtualnej Copy from Host to Guest - + Skopiuj od gospodarza do gościa Copy from Guest to Host - + Skopiuj od gościa do gospodarza Open Log Pane - + Otwórz panel logów Open Operations Pane - + Otwórz panel operacji Open Session Pane - + Otwórz panel sesji Go One Level Up - + Przejdź jeden poziom w górę Delete Selected Object(s) - + Usuń wybrany/e obiekt(y) Refresh Contents - + Odśwież zawartość Rename selected file object @@ -1971,200 +1971,200 @@ Rename Selected Object - + Zmień nazwę wybranego obiektu Copy Selected Object(s) - + Skopiuj wybrany/e obiekt(y) Cut Selected Object(s) - + Wytnij wybrany/e obiekt(y) Paste Copied/Cut Object(s) - + Wklej wybrany/e obiekt(y) Select All Objects - + Wybierz wszystkie obiekty Invert Current Selection - + Odwróć obecne zaznaczenie Show Properties of Current Object(s) - + Pokaż właściwości obecnego obiektu(ów) &New Cloud VM... - + &Nowa maszyna wirtualna w chmurze... Create new cloud virtual machine - + Stwórz nową maszynę wirtualną w chmurze E&xport Locally... - + Wy&eksportuj lokalnie... Export selected virtual machine locally - + Wyeksportuj wybrane maszyny wirtualne lokalnie S&earch - + Sz&ukaj Search virtual machines with respect to a search term - + Wyszukaj maszyny wirtualne w odniesieniu do wyszukiwanego terminu Take Snapshot - Zrób migawkę + Zrób migawkę Delete Snapshot - + Usuń migawkę Restore Snapshot - + Przywróć migawkę Open Snapshot Properties - + Otwórz właściwości migawki Clone Virtual Machine - Sklonuj maszynę wirtualną + Sklonuj maszynę wirtualną Add a disk image - + Dodaj obraz dysku Add Disk Image - + Dodaj obraz dysku Create a new disk image - + Stwórz nowy obraz dysku Create Disk Image - + Stwórz obraz dysku Copy selected disk image - + Skopiuj wybrany obraz dysku Copy Disk Image - + Skopiuj obraz dysku Move selected disk image - + Przenieś wybrany obraz dysku Move Disk Image - + Przenieś obraz dysku Remove selected disk image - + Usuń wybrany obraz dysku Remove Disk Image - + Usuń obraz dysku Release selected disk image - + Wysuń wybrany obraz dysku Release Disk Image - + Wysuń obraz dysku Open pane with selected disk image properties - + Otwórz panel właściwości wybranych obrazów dysku Open Disk Image Properties - + Otwórz właściwości obrazu dysku &Search - + &Szukaj Open the disk image search pane - + Otwórz panel wyszukania obrazów dysków Open Disk Image Search Pane - + Otwórz panel wyszukania obrazów dysków Refresh the list of disk images - + Odśwież listę obrazów dysków Refresh Disk Images - + Odśwież obrazy dysków Create Host-only Network - + Utwórz sieć izolowaną Remove Host-only Network - Usuń sieć izolowaną + Usuń sieć izolowaną Open Host-only Network Properties - + Otwórz właściwości sieci izolowanej Refresh Host-only Networks - + Odśwież sieci izolowane Add Cloud Profile - + Dodaj profil chmury Import Cloud Profiles - + Importuj profil chmury Remove Cloud Profile - + Usuń profil chmury Open Cloud Profile Properties - + Otwórz właściwości profilu chmury Show Cloud Profile Help - + Pokaż pomoc profilu chmury &Soft Keyboard... - + &Klawiatura ekranowa... Display soft keyboard - + Wyświetla klawiaturę ekranową Guest Control Terminal... debug action - + Konsola sterowania gościa... @@ -2183,22 +2183,22 @@ <nobr>Used by the following %n hard disk(s):</nobr><br>%1 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 hard drives are in the tool-tip and doesn't need to be told). - <nobr>Używany przez następujący twardy dysk:</nobr><br>%1 - <nobr>Używany przez następujące twarde dyski:</nobr><br>%1 - + <nobr>Używany przez %n następujący twardy dysk:</nobr><br>%1 + <nobr>Używany przez %n następujące twarde dyski:</nobr><br>%1 + <nobr>Używany przez %n następujących twardych dysków:</nobr><br>%1 %1 - Disk Encryption - Szyfrowanie dysku %1 - + %1 - Szyfrowanie dysku This virtual machine is password protected. Please enter the %n encryption password(s) below. 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 passwords are in the list and doesn't need to be told). - Ta wirtualna maszyna jest chroniona hasłem. Proszę wprowadzić hasło szyfrowania poniżej. - Ta wirtualna maszyna jest chroniona hasłem. Proszę wprowadzić hasła szyfrowania poniżej. - + Ta wirtualna maszyna jest chroniona hasłem. Proszę wprowadzić %n hasło szyfrowania poniżej. + Ta wirtualna maszyna jest chroniona hasłem. Proszę wprowadzić %n hasła szyfrowania poniżej. + Ta wirtualna maszyna jest chroniona hasłem. Proszę wprowadzić %n haseł szyfrowania poniżej. @@ -2348,18 +2348,22 @@ Detailed list of all components of all virtual machines of the current appliance - + Szczegółowa lista wszystkich komponetów wszystkich maszyn wirtualnych obecnego urządzenia Settings File - + Plik ustawień Base Folder - + Folder podstawowy Primary Group + Grupa główna + + + Storage Controller (VirtioSCSI) @@ -2375,47 +2379,47 @@ &Import hard drives as VDI - + &Zaimportuj dyski twarde jako VDI MAC Address &Policy: - + &Polityka adresów MAC: Include all network adapter MAC addresses - + Uwzględnij wszystkie adresy MAC kart sieciowych Include only NAT network adapter MAC addresses - + Uwzględnij tylko adresy MAC kart sieciowych NAT Generate new MAC addresses for all network adapters - + Wygeneruj nowe adresy MAC dla wszystkich kart sieciowych Additional Options: - + Opcje dodatkowe: When checked, all the hard drives that belong to this appliance will be imported in VDI format. - + Po zaznaczeniu, wszystkie dyski twarde należące do tego urządzenia zostaną zaimportowane w formacie VDI. &Machine Base Folder: - + Folder podstawowy &maszyny: Include all network adapter MAC addresses during importing. - + Uwzględnij wszystkie adresy MAC kart sieciowych podczas importu. Include only NAT network adapter MAC addresses during importing. - + Uwzględnij tylko adresy MAC kart sieciowych NAT podczas importu. Generate new MAC addresses for all network adapters during importing. - + Wygeneruj nowe adresy MAC dla wszystkich kart sieciowych podczas importu. @@ -2423,12 +2427,12 @@ %1 col.1 text - %1 + %1 %1: %2 col.1 text: col.2 text - %1: %2 + %1: %2 @@ -2548,51 +2552,51 @@ UIAudioControllerEditor Audio &Controller: - Kontroler &audio: + Kontroler &audio: UIAudioHostDriverEditor Host Audio &Driver: - &Sterownik dźwięku gospodarza: + &Sterownik dźwięku gospodarza: UIBaseMemoryEditor Base &Memory: - R&AM: + R&AM: %1 MB - %1 MB + %1 MB MB - MB + MB UIBootOrderEditor &Boot Order: - &Kolejność bootowania: + &Kolejność bootowania: Move Up - + Przesuń w górę Move Down - + Przesuń w dół UIChooserAbstractModel New group - Nowa grupa + Nowa grupa @@ -2608,12 +2612,12 @@ <b>%1</b> Group item tool-tip / Group name - <b>%1</b> + <b>%1</b> %n group(s) Group item tool-tip / Group info - + %n grupa %n grup %n grupy @@ -2622,12 +2626,12 @@ <nobr>%1</nobr> Group item tool-tip / Group info wrapper - <nobr>%1</nobr> + <nobr>%1</nobr> %n machine(s) Group item tool-tip / Machine info - + %n maszyna %n maszyn %n maszyny @@ -2636,7 +2640,7 @@ (%n running) Group item tool-tip / Running machine info - + (%n uruchomiona) (%n uruchomione) (%n uruchomionych) @@ -2645,20 +2649,20 @@ <nobr>%1</nobr> Group item tool-tip / Machine info wrapper - <nobr>%1</nobr> + <nobr>%1</nobr> <nobr>%1 %2</nobr> Group item tool-tip / Machine info wrapper, including running - <nobr>%1</nobr> {1 %2<?} + <nobr>%1 %2</nobr> Collapse group - Zwiń grupę + Zwiń grupę Expand group - Rozwiń grupę + Rozwiń grupę @@ -2672,153 +2676,153 @@ UIChooserNodeGlobal Tools - + Narzędzia UIChooserNodeGroup Virtual Machine group - + Grupa maszyny wirtualnej UIChooserNodeMachine Virtual Machine - + Maszyna wirtualna UIChooserSearchWidget Navigate to the next item among the search results - + Przejdź do następnej pozycji wśród wyników wyszukiwania Navigate to the previous item among the search results - + Przejdź do poprzedniej pozycji wśród wyników wyszukiwania Enter a search term to be used during virtual machine search - + Wprowadź szukany termin, który będzie używany podczas wyszukania maszyny wirtualnej Close the search widget - + Zamknij widżet wyszukiwania UIChooserView Contains a tree of Virtual Machines and their groups - + Zawiera drzewo maszyn wirtualnych i ich grup UICloudProfileDetailsWidget Name: - + Nazwa: Properties: - + Właściwości: Contains cloud profile settings - + Zawiera ustawienia profilu chmury Enter a name for the new profile... - + Wprowadź nazwę dla nowego profilu... Enter a name for this profile... - + Wprowadź nazwę dla tego profilu... Reset - Zresetuj + Zresetuj Reset changes in current profile details - + Zresetuj zmiany w obecnych szczegółach profilu Reset Changes (%1) - + Zresetuj zmiany (%1) Add - Dodaj + Dodaj Add a new profile with following name - + Dodaj nowy profil z następującą nazwą Add Profile (%1) - + Dodaj profil (%1) Apply - + Zastosuj Apply changes in current profile details - + Zastosuj zmiany w obecnych szczegółach profilu Apply Changes (%1) - + Zastosuj zmiany (%1) UICloudProfileManager Cloud Profile Manager - + Menedżer profili chmury Reset - Zresetuj + Zresetuj Apply - + Zastosuj Close - Zamknij + Zamknij Reset changes in current cloud profile details - + Zresetuj zmiany w aktualnych szczegółach profilu chmury Apply changes in current cloud profile details - + Zastosuj zmiany w aktualnych szczegółach profilu chmury Close dialog without saving - + Zamknij okno bez zapisania Reset Changes (%1) - + Zresetuj zmiany (%1) Apply Changes (%1) - + Zastosuj zmiany (%1) Close Window (%1) - + Zamknij okno (%1) Add Profile - + Dodaj profil @@ -2826,115 +2830,115 @@ MB size suffix MBytes=1024 KBytes - MB + MB <nobr>%1 MB</nobr> details report - <nobr>%1 MB</nobr> + <nobr>%1 MB</nobr> Enabled details report (3D Acceleration) - + Włączone Disabled details report (3D Acceleration) - + Wyłączone not set details report (execution engine) - + nie ustawione Active details report (Nested Paging) - + Aktywne Inactive details report (Nested Paging) - Nieaktywne + Nieaktywne Active details report (Unrestricted Execution) - + Aktywne Inactive details report (Unrestricted Execution) - Nieaktywne + Nieaktywne Execution engine details report - + Silnik wykonawczy Nested Paging - Zagnieżdżone stronicowanie + Zagnieżdżone stronicowanie Unrestricted Execution - Nieograniczone wykorzystanie + Nieograniczone wykorzystanie Execution Cap details report - Wykorzystanie procesora + Wykorzystanie procesora Paravirtualization Interface details report - Interfejs parawirtualizacji + Interfejs parawirtualizacji Processors details report - Procesory + Procesory Powered Off MachineState - Wyłączona + Wyłączona Saved MachineState - Zapisana + Zapisana Aborted MachineState - Anulowana + Anulowana Teleported MachineState - Teleportowana + Teleportowana Running MachineState - Uruchomiona + Uruchomiona Paused MachineState - Wstrzymana + Wstrzymana Guru Meditation MachineState - Medytacja guru + Medytacja guru Teleporting MachineState - Teleportowanie + Teleportowanie Taking Snapshot @@ -2949,77 +2953,77 @@ Taking Live Snapshot MachineState - Tworzenie migawki w trakcie działania + Tworzenie migawki w trakcie działania Starting MachineState - Uruchamianie + Uruchamianie Stopping MachineState - Zatrzymywanie + Zatrzymywanie Saving MachineState - Zapisywanie + Zapisywanie Restoring MachineState - Przywracanie + Przywracanie Teleporting Paused VM MachineState - Teleportowanie wstrzymanej maszyny + Teleportowanie wstrzymanej maszyny Deleting Snapshot MachineState - Usuwanie migawki + Usuwanie migawki Restoring Snapshot MachineState - Przywracanie migawki + Przywracanie migawki Setting Up MachineState - Przygotowywanie + Przygotowywanie Unlocked SessionState - Odblokowana + Odblokowana Locked SessionState - Zablokowana + Zablokowana Spawning SessionState - Zapisywanie + Zapisywanie Unlocking SessionState - Odblokowywanie + Odblokowywanie None ParavirtProvider - Brak + Brak Default ParavirtProvider - Domyślny + Domyślny Legacy @@ -3034,147 +3038,147 @@ Hyper-V ParavirtProvider - Hyper-V + Hyper-V KVM ParavirtProvider - KVM + KVM None DeviceType - Brak + Brak Floppy DeviceType - + Dyskietka Optical DeviceType - Napęd optyczny + Napęd optyczny Hard Disk DeviceType - Dysk twardy + Dysk twardy Network DeviceType - + Sieć USB DeviceType - USB + USB Shared Folder DeviceType - Udostępniany folder + Udostępniany folder Disabled ClipboardType - + Wyłączony Host To Guest ClipboardType - Gospodarz do gościa + Gospodarz do gościa Guest To Host ClipboardType - Gość do gospodarza + Gość do gospodarza Bidirectional ClipboardType - + Dwukierunkowy Disabled DragAndDropType - + Wyłączone Host To Guest DragAndDropType - Gospodarz do gościa + Gospodarz do gościa Guest To Host DragAndDropType - Gość do gospodarza + Gość do gospodarza Bidirectional DragAndDropType - + Dwukierunkowy PS/2 Mouse PointingHIDType - Mysz PS/2 + Mysz PS/2 USB Mouse PointingHIDType - Mysz USB + Mysz USB USB Tablet PointingHIDType - Tablet USB + Tablet USB PS/2 and USB Mouse PointingHIDType - Mysz PS/2 i USB + Mysz PS/2 i USB USB Multi-Touch Tablet PointingHIDType - Wielodotykowy tablet USB + Wielodotykowy tablet USB None GraphicsControllerType - Brak + Brak VBoxVGA GraphicsControllerType - + VBoxVGA VMSVGA GraphicsControllerType - + VMSVGA VBoxSVGA GraphicsControllerType - + VBoxSVGA Normal MediumType - Normalny + Normalny Immutable MediumType - + Stały Writethrough MediumType - Bezpośredniego zapisu + Bezpośredniego zapisu Shareable @@ -3184,222 +3188,222 @@ Readonly MediumType - Tylko do odczytu + Tylko do odczytu Multi-attach MediumType - Wielo-podłączalny + Wielo-podłączalny Dynamically allocated storage MediumVariant - Pamięć dynamicznie przydzielana + Pamięć dynamicznie przydzielana New dynamically allocated storage MediumVariant - Nowa pamięć dynamicznie przydzielana + Nowa pamięć dynamicznie przydzielana Dynamically allocated differencing storage MediumVariant - Różnicowa pamięć dynamicznie przydzielana + Różnicowa pamięć dynamicznie przydzielana Fixed size storage MediumVariant - Pamięć o stałym rozmiarze + Pamięć o stałym rozmiarze Dynamically allocated storage split into files of less than 2GB MediumVariant - Dynamicznie przydzielana pamięć podzielona na pliki mniejsze niż 2 GB + Dynamicznie przydzielana pamięć podzielona na pliki mniejsze niż 2 GB Dynamically allocated differencing storage split into files of less than 2GB MediumVariant - Różnicowa pamięć dynamicznie przydzielana podzielona na pliki mniejsze niż 2 GB + Różnicowa pamięć dynamicznie przydzielana podzielona na pliki mniejsze niż 2 GB Fixed size storage split into files of less than 2GB MediumVariant - Pamięć o stałym rozmiarze podzielona na pliki mniejsze niż 2 GB + Pamięć o stałym rozmiarze podzielona na pliki mniejsze niż 2 GB Dynamically allocated compressed storage MediumVariant - Skompresowana pamięć dynamicznie przydzielana + Skompresowana pamięć dynamicznie przydzielana Dynamically allocated differencing compressed storage MediumVariant - Skompresowana różnicowa pamięć dynamicznie przydzielana + Skompresowana różnicowa pamięć dynamicznie przydzielana Fixed size ESX storage MediumVariant - Pamięć ESX o stałym rozmiarze + Pamięć ESX o stałym rozmiarze Fixed size storage on raw disk MediumVariant - Pamięć o stałym rozmiarze na dysku raw + Pamięć o stałym rozmiarze na dysku raw Not attached NetworkAttachmentType - Niepodłączona + Niepodłączona NAT NetworkAttachmentType - NAT + NAT Bridged Adapter NetworkAttachmentType - Mostkowana karta sieciowa (bridged) + Mostkowana karta sieciowa (bridged) Internal Network NetworkAttachmentType - Sieć wewnętrzna + Sieć wewnętrzna Host-only Adapter NetworkAttachmentType - Karta sieci izolowanej (host-only) + Karta sieci izolowanej (host-only) Generic Driver NetworkAttachmentType - Rodzajowy sterownik + Rodzajowy sterownik NAT Network NetworkAttachmentType - Sieć NAT + Sieć NAT PCnet-PCI II (Am79C970A) NetworkAdapterType - PCnet-PCI II (Am79C970A) + PCnet-PCI II (Am79C970A) PCnet-FAST III (Am79C973) NetworkAdapterType - PCnet-FAST III (Am79C973) + PCnet-FAST III (Am79C973) Intel PRO/1000 MT Desktop (82540EM) NetworkAdapterType - Intel PRO/1000 MT Desktop (82540EM) + Intel PRO/1000 MT Desktop (82540EM) Intel PRO/1000 T Server (82543GC) NetworkAdapterType - Intel PRO/1000 T Server (82543GC) + Intel PRO/1000 T Server (82543GC) Intel PRO/1000 MT Server (82545EM) NetworkAdapterType - Intel PRO/1000 MT Server (82545EM) + Intel PRO/1000 MT Server (82545EM) Paravirtualized Network (virtio-net) NetworkAdapterType - Sieć parawirtualizowana (virtio-net) + Sieć parawirtualizowana (virtio-net) Deny NetworkAdapterPromiscModePolicy - Odmawiaj + Odmawiaj Allow VMs NetworkAdapterPromiscModePolicy - Pozwalaj maszynom wirtualnym + Pozwalaj maszynom wirtualnym Allow All NetworkAdapterPromiscModePolicy - Pozwalaj wszystkim + Pozwalaj wszystkim Disconnected PortMode - Odłączony + Odłączony Host Pipe PortMode - Łącze komunikacyjne gospodarza + Łącze komunikacyjne gospodarza Host Device PortMode - Urządzenie gospodarza + Urządzenie gospodarza Raw File PortMode - Plik Raw + Plik Raw TCP PortMode - TCP + TCP OHCI USBControllerType - OHCI + OHCI EHCI USBControllerType - EHCI + EHCI xHCI USBControllerType - xHCI + xHCI Not supported USBDeviceState - Nieobsługiwane + Nieobsługiwane Unavailable USBDeviceState - Niedostępne + Niedostępne Busy USBDeviceState - Zajęte + Zajęte Available USBDeviceState - Dostępne + Dostępne Held USBDeviceState - Przytrzymane + Przytrzymane Captured USBDeviceState - Przechwycone + Przechwycone Ignore USBDeviceFilterAction - Ignoruj + Ignoruj Hold @@ -3414,187 +3418,187 @@ Windows Multimedia AudioDriverType - Windows Multimedia + Windows Multimedia OSS Audio Driver AudioDriverType - Sterownik dźwięku OSS + Sterownik dźwięku OSS ALSA Audio Driver AudioDriverType - Sterownik dźwięku ALSA + Sterownik dźwięku ALSA Windows DirectSound AudioDriverType - Windows DirectSound + Windows DirectSound CoreAudio AudioDriverType - CoreAudio + CoreAudio PulseAudio AudioDriverType - PulseAudio + PulseAudio Solaris Audio AudioDriverType - Solaris Audio + Solaris Audio ICH AC97 AudioControllerType - ICH AC97 + ICH AC97 SoundBlaster 16 AudioControllerType - SoundBlaster 16 + SoundBlaster 16 Intel HD Audio AudioControllerType - Intel HD Audio + Intel HD Audio Null AuthType - Brak + Brak External AuthType - Zewnętrzna + Zewnętrzna Guest AuthType - Gość + Gość IDE StorageBus - IDE + IDE SATA StorageBus - SATA + SATA SCSI StorageBus - SCSI + SCSI Floppy StorageBus - + Dyskietka SAS StorageBus - SAS + SAS USB StorageBus - USB + USB PCIe StorageBus - PCIe + PCIe virtio-scsi StorageBus - + virtio-scsi LsiLogic StorageControllerType - + LsiLogic BusLogic StorageControllerType - BusLogic + BusLogic AHCI StorageControllerType - AHCI + AHCI PIIX3 StorageControllerType - PIIX3 + PIIX3 PIIX4 StorageControllerType - PIIX4 + PIIX4 ICH6 StorageControllerType - ICH6 + ICH6 I82078 StorageControllerType - I82078 + I82078 LsiLogic SAS StorageControllerType - LsiLogic SAS + LsiLogic SAS USB StorageControllerType - USB + USB NVMe StorageControllerType - NVMe + NVMe virtio-scsi StorageControllerType - + virtio-scsi PIIX3 ChipsetType - PIIX3 + PIIX3 ICH9 ChipsetType - ICH9 + ICH9 UDP NATProtocol - UDP + UDP TCP NATProtocol - TCP + TCP Starting GuestSessionStatus - Uruchamianie + Uruchamianie Starting @@ -3609,102 +3613,82 @@ B size suffix Bytes - B + B KB size suffix KBytes=1024 Bytes - KB + KB GB size suffix GBytes=1024 MBytes - GB + GB TB size suffix TBytes=1024 GBytes - TB + TB PB size suffix PBytes=1024 TBytes - PB - - - IDE Primary Device 0 - StorageSlot - - - - IDE Primary Device 1 - StorageSlot - - - - IDE Secondary Device 0 - StorageSlot - - - - IDE Secondary Device 1 - StorageSlot - + PB SATA Port %1 StorageSlot - Port SATA %1 + Port SATA %1 SCSI Port %1 StorageSlot - Port SCSI %1 + Port SCSI %1 SAS Port %1 StorageSlot - Port SAS %1 + Port SAS %1 Floppy Device %1 StorageSlot - Dyskietka %1 + Dyskietka %1 USB Port %1 StorageSlot - Port USB %1 + Port USB %1 NVMe Port %1 StorageSlot - Port NVMe %1 + Port NVMe %1 virtio-scsi Port %1 StorageSlot - + Port virtio-scs %1 Name - Nazwa + Nazwa OS - + System operacyjny Location - Ścieżka + Ścieżka Groups - Grupy + Grupy RAM - Pamięć + Pamięć CPU Count @@ -3716,377 +3700,373 @@ Boot Order - + Kolejność bootowania Chipset Type - + Typ chipsetu Firmware - + Firmware Acceleration - Akceleracja + Akceleracja VRAM - + VRAM Screen Count - + Liczba ekranów Scale Factor - + Współczynnik skali Graphics Controller - + Kontroler grafiki VRDE - + VRDE Recording - + Nagrywanie Hard Disks - Dyski twarde + Dyski twarde Optical Devices - + Napędy optyczne Floppy Devices - + Dyskietki Driver - + Sterownik Controller - + Kontroler Input/Output - + Wejście/wyjście Not Attached network adapter - Niepodłączone + Niepodłączone NAT - NAT - - - Bridget Adapter - + NAT Internal Network - Sieć wewnętrzna + Sieć wewnętrzna Host Only Adapter - + Karta sieci izolowanej (host-only) Generic Driver - Rodzajowy sterownik + Rodzajowy sterownik NAT Network - Sieć NAT + Sieć NAT Disconnected serial port - Odłączony + Odłączony Host Pipe - Łącze komunikacyjne gospodarza + Łącze komunikacyjne gospodarza Host Device - Urządzenie gospodarza + Urządzenie gospodarza Raw File - Plik Raw + Plik Raw TCP - TCP + TCP Device Filters - Filtry urządzeń + Filtry urządzeń Menu Bar - + Pasek menu Status Bar - + Pasek stanu Mini Toolbar - + Mini pasek narzędziowy General DetailsElementType - Ogólne + Ogólne Preview DetailsElementType - Podgląd + Podgląd System DetailsElementType - System + System Display DetailsElementType - Ekran + Ekran Storage DetailsElementType - Pamięć + Pamięć Audio DetailsElementType - Dźwięk + Dźwięk Network DetailsElementType - + Sieć Serial ports DetailsElementType - Porty szeregowe + Porty szeregowe USB DetailsElementType - USB + USB Shared folders DetailsElementType - Udostępniane foldery + Udostępniane foldery User interface DetailsElementType - Interfejs użytkownika + Interfejs użytkownika Description DetailsElementType - Opis + Opis Hard Disks IndicatorType - Dyski twarde + Dyski twarde Optical Disks IndicatorType - + Dyski optyczne Floppy Disks IndicatorType - + Dyskietki Audio IndicatorType - Dźwięk + Dźwięk Network IndicatorType - + Sieć USB IndicatorType - USB + USB Shared Folders IndicatorType - + Współdzielone foldery Display IndicatorType - Ekran + Ekran Recording IndicatorType - + Nagrywanie Features IndicatorType - + Funkcje Mouse IndicatorType - + Mysz Keyboard IndicatorType - + Klawiatura General InformationElementType - Ogólne + Ogólne Preview InformationElementType - Podgląd + Podgląd System InformationElementType - System + System Display InformationElementType - Ekran + Ekran Storage InformationElementType - Pamięć + Pamięć Audio InformationElementType - Dźwięk + Dźwięk Network InformationElementType - + Sieć Serial ports InformationElementType - Porty szeregowe + Porty szeregowe USB InformationElementType - USB + USB Shared folders InformationElementType - Udostępniane foldery + Udostępniane foldery User interface InformationElementType - Interfejs użytkownika + Interfejs użytkownika Description InformationElementType - Opis + Opis Runtime attributes InformationElementType - Parametry maszyny + Parametry maszyny Storage statistics InformationElementType - Statystyki pamięci + Statystyki pamięci Network statistics InformationElementType - Statystyki sieci + Statystyki sieci VDI (VirtualBox Disk Image) UIMediumFormat - VDI (VirtualBox Disk Image) + VDI (VirtualBox Disk Image) VMDK (Virtual Machine Disk) UIMediumFormat - VMDK (Virtual Machine Disk) + VMDK (Virtual Machine Disk) VHD (Virtual Hard Disk) UIMediumFormat - VHD (Virtual Hard Disk) + VHD (Virtual Hard Disk) HDD (Parallels Hard Disk) UIMediumFormat - HDD (równoległy dysk twardy) + HDD (równoległy dysk twardy) QED (QEMU enhanced disk) UIMediumFormat - QED (QEMU enhanced disk) + QED (QEMU enhanced disk) QCOW (QEMU Copy-On-Write) UIMediumFormat - QCOW (QEMU Copy-On-Write) + QCOW (QEMU Copy-On-Write) Video/Audio UISettingsDefs::RecordingMode - + Obraz/dźwięk Video Only UISettingsDefs::RecordingMode - + Tylko obraz Audio Only UISettingsDefs::RecordingMode - + Tylko dźwięk %n year(s) - + %n rok %n lata %n lat @@ -4094,7 +4074,7 @@ %n month(s) - + %n miesiąc %n miesiące %n miesięcy @@ -4102,7 +4082,7 @@ %n day(s) - + %n dzień %n dni %n dni @@ -4110,7 +4090,7 @@ %n hour(s) - + %n godzina %n godziny %n godzin @@ -4118,7 +4098,7 @@ %n minute(s) - + %n minuta %n minuty %n minut @@ -4126,7 +4106,7 @@ %n second(s) - + %n sekunda %n sekundy %n sekund @@ -4134,212 +4114,212 @@ Please choose a virtual hard disk file - Wybierz plik wirtualnego dysku twardego + Wybierz plik wirtualnego dysku twardego All virtual hard disk files (%1) - Wszystkie pliki wirtualnego dysku twardego (%1) + Wszystkie pliki wirtualnego dysku twardego (%1) Please choose a virtual optical disk file - Proszę wybrać plik wirtualnego dysku optycznego + Proszę wybrać plik wirtualnego dysku optycznego All virtual optical disk files (%1) - Wszystkie pliki wirtualnego dysku optycznego (%1) + Wszystkie pliki wirtualnego dysku optycznego (%1) Please choose a virtual floppy disk file - Proszę wybrać plik wirtualnej dyskietki + Proszę wybrać plik wirtualnej dyskietki All virtual floppy disk files (%1) - Wszystkie pliki wirtualnej dyskietki (%1) + Wszystkie pliki wirtualnej dyskietki (%1) All files (*) - Wszystkie pliki (*) + Wszystkie pliki (*) Unknown device USB device details - Nieznane urządzenie + Nieznane urządzenie Unknown device %1:%2 USB device details - Nieznane urządzenie %1:%2 + Nieznane urządzenie %1:%2 <nobr>Vendor ID: %1</nobr><br><nobr>Product ID: %2</nobr><br><nobr>Revision: %3</nobr> USB device tooltip - <nobr>ID dostawcy (Vendor ID): %1</nobr><br><nobr>ID produktu (Product ID): %2</nobr><br><nobr>Wersja (Revision): %3</nobr> + <nobr>ID dostawcy (Vendor ID): %1</nobr><br><nobr>ID produktu (Product ID): %2</nobr><br><nobr>Wersja (Revision): %3</nobr> <br><nobr>Serial No. %1</nobr> USB device tooltip - <br><nobr>Nr seryjny: %1</nobr> + <br><nobr>Nr seryjny: %1</nobr> <br><nobr>State: %1</nobr> USB device tooltip - <br><nobr>Stan: %1</nobr> + <br><nobr>Stan: %1</nobr> <nobr>Vendor ID: %1</nobr> USB filter tooltip - + <nobr>ID dostawcy: %1</nobr> <nobr>Product ID: %2</nobr> USB filter tooltip - + <nobr>ID produktu: %2</nobr> <nobr>Revision: %3</nobr> USB filter tooltip - + <nobr>Wersja: %3</nobr> <nobr>Product: %4</nobr> USB filter tooltip - <nobr>Produkt: %4</nobr> + <nobr>Produkt: %4</nobr> <nobr>Manufacturer: %5</nobr> USB filter tooltip - + <nobr>Producent: %5</nobr> <nobr>Serial No.: %1</nobr> USB filter tooltip - <nobr>Nr seryjny: %1</nobr> + <nobr>Nr seryjny: %1</nobr> <nobr>Port: %1</nobr> USB filter tooltip - <nobr>Port: %1</nobr> + <nobr>Port: %1</nobr> <nobr>State: %1</nobr> USB filter tooltip - <nobr>Stan: %1</nobr> + <nobr>Stan: %1</nobr> User-defined serial port - Użytkownika + Użytkownika Inaccessible medium - + Niedostępny Empty medium - Brak + Brak Host Drive '%1' medium - Napęd gospodarza '%1' + Napęd gospodarza '%1' Host Drive %1 (%2) medium - Napęd gospodarza %1 (%2) + Napęd gospodarza %1 (%2) <p style=white-space:pre>Type (Format): %1 (%2)</p> medium - <p style=white-space:pre>Typ (Format): %1 (%2)</p> + <p style=white-space:pre>Typ (Format): %1 (%2)</p> <p>Attached to: %1</p> image - <p>Podłączone do: %1</p> + <p>Podłączone do: %1</p> <i>Not Attached</i> image - <i>Niepodłączone</i> + <i>Niepodłączone</i> <i>Checking accessibility...</i> medium - <i>Sprawdzanie dostępności...</i> + <i>Sprawdzanie dostępności...</i> Failed to check accessibility of disk image files. medium - Błąd sprawdzania dostępności nośnika. + Błąd sprawdzania dostępności nośnika. <b>No disk image file selected</b> medium - <b>Nie wybrano nośnika</b> + <b>Nie wybrano nośnika</b> You can also change this while the machine is running. - Można to zmienić również w trakcie działania maszyny wirtualnej. + Można to zmienić również w trakcie działania maszyny wirtualnej. <b>No disk image files available</b> medium - <b>Brak dostępnych nośników</b> + <b>Brak dostępnych nośników</b> You can create or add disk image files in the virtual machine settings. - Możesz utworzyć lub dodać pliki obrazu dysku w ustawieniach wirtualnej maszyny. + Możesz utworzyć lub dodać pliki obrazu dysku w ustawieniach wirtualnej maszyny. Attaching this hard disk will be performed indirectly using a newly created differencing hard disk. medium - Podłączenie tego dysku twardego zostanie wykonane pośrednio, z użyciem nowo utworzonego różnicowego dysku twardego. + Podłączenie tego dysku twardego zostanie wykonane pośrednio, z użyciem nowo utworzonego różnicowego dysku twardego. Encrypted medium - Zaszyfrowany + Zaszyfrowany Checking... medium - Sprawdzanie... + Sprawdzanie... Some of the files in this hard disk chain are inaccessible. Please use the Virtual Medium Manager to inspect these files. medium - Niektóre pliki na łańcuchu dysku twardego są niedostępne. Proszę skorzystać z menedżera nośników wirtualnych, by przejrzeć pliki. + Niektóre pliki na łańcuchu dysku twardego są niedostępne. Proszę skorzystać z menedżera nośników wirtualnych, by przejrzeć pliki. This base hard disk is indirectly attached using the following differencing hard disk: medium - Ten bazowy dysk twardy jest podłączony pośrednio, z użyciem następujących różnicowych dysków twardych: + Ten bazowy dysk twardy jest podłączony pośrednio, z użyciem następujących różnicowych dysków twardych: Differencing MediumType - Różnicowy + Różnicowy Adapter %1 - Karta %1 + Karta %1 Please choose a location for new virtual hard disk file - + Wybierz lokalizację dla pliku nowego wirtualnego dysku twardego Paravirtualized Network (virtio-net 1.0) NetworkAdapterType - + Sieć parawirtualizowana (virtio-net 1.0) PCnet-ISA (Am79C960) NetworkAdapterType - + PCnet-ISA (Am79C960) Acquire cloud instances ... @@ -4351,51 +4331,119 @@ Pause instance ... - + Wstrzymaj instancję... Start instance ... - + Uruchom instancję... Cloud Network [EXPERIMENTAL] NetworkAttachmentType + + Undefined + GuestSessionStatus + + + + Started + GuestSessionStatus + + + + Terminating + GuestSessionStatus + + + + Terminated + GuestSessionStatus + + + + Timed Out (Killed) + GuestSessionStatus + + + + Timed Out (Abnormally) + GuestSessionStatus + + + + Down + GuestSessionStatus + + + + Error + GuestSessionStatus + + + + IDE Primary Device 0 + StorageSlot + + + + IDE Primary Device 1 + StorageSlot + + + + IDE Secondary Device 0 + StorageSlot + + + + IDE Secondary Device 1 + StorageSlot + + + + Bridged Adapter + Mostkowana karta sieciowa (bridged) + + + Cloud Network + + UICustomFileSystemModel Name - Nazwa + Nazwa Size - Rozmiar + Rozmiar Change Time - + Czas ostatniej zmiany Owner - + Właściciel Permissions - + Uprawnienia Path - Ścieżka + Ścieżka New Directory - + Nowy folder Local Path - + Ścieżka lokalna @@ -4418,157 +4466,157 @@ Name details (general) - Nazwa + Nazwa Operating System details (general) - System operacyjny + System operacyjny Settings File Location details (general) - + Lokalizacja pliku ustawień Groups details (general) - Grupy + Grupy Information Inaccessible details - Informacje niedostępne + Informacje niedostępne Base Memory details (system) - RAM + RAM %1 MB details - %1 MB + %1 MB Processors details (system) - Procesory + Procesory Execution Cap details (system) - Wykorzystanie procesora + Wykorzystanie procesora %1% details - %1% + %1% Boot Order details (system) - + Kolejność bootowania Chipset Type details (system) - + Rodzaj chipsetu EFI details (system) - + EFI Enabled details (system/EFI) - + Włączone Disabled details (system/EFI) - + Wyłączone VT-x/AMD-V details (system) - VT-x/AMD-V + VT-x/AMD-V Nested Paging details (system) - Zagnieżdżone stronicowanie + Zagnieżdżone stronicowanie PAE/NX details (system) - PAE/NX + PAE/NX Minimal Paravirtualization details (system) - Minimalna parawirtualizacja + Minimalna parawirtualizacja Hyper-V Paravirtualization details (system) - Parawirtualizacja Hyper-V + Parawirtualizacja Hyper-V KVM Paravirtualization details (system) - Parawirtualizacja KVM + Parawirtualizacja KVM Acceleration details (system) - Akceleracja + Akceleracja Video Memory details (display) - Pamięć wideo + Pamięć wideo Screens details (display) - Ekrany + Ekrany Scale-factor details (display) - Współczynnik skali + Współczynnik skali 2D Video details (display) - Obraz 2D + Obraz 2D 3D details (display) - 3D + 3D Acceleration details (display) - Akceleracja + Akceleracja Remote Desktop Server Port details (display/vrde) - + Port serwera pulpitu zdalnego Remote Desktop Server details (display/vrde) - Serwer pulpitu zdalnego + Serwer pulpitu zdalnego Disabled details (display/vrde/VRDE server) - + Wyłączony Video Capture File @@ -4582,7 +4630,7 @@ Frame Size: %1x%2, Frame Rate: %3fps, Bit Rate: %4kbps - Wymiary klatki: %1x%2, Częstotliwość wyświetlania klatek: %3fps, Bit Rate: %4kbps + Wymiary klatki: %1x%2, Częstotliwość wyświetlania klatek: %3fps, Bit Rate: %4kbps Video Capture @@ -4592,246 +4640,246 @@ [Optical Drive] details (storage) - [Napęd optyczny] + [Napęd optyczny] Not Attached details (storage) - Niepodłączone + Niepodłączone Host Driver details (audio) - Sterownik gospodarza + Sterownik gospodarza Controller details (audio) - + Kontroler Audio Output details (audio) - + Wyjście audio Enabled details (audio/output) - + Włączone Disabled details (audio/output) - + Wyłączone Audio Input details (audio) - + Wejście audio Enabled details (audio/input) - + Włączone Disabled details (audio/input) - + Wyłączone Disabled details (audio) - + Wyłączone Bridged Adapter, %1 details (network) - Mostkowana karta sieciowa, %1 + Mostkowana karta sieciowa, %1 Internal Network, '%1' details (network) - Sieć wewnętrzna, '%1' + Sieć wewnętrzna, '%1' Host-only Adapter, '%1' details (network) - Karta sieci izolowanej, '%1' + Karta sieci izolowanej, '%1' Generic Driver, '%1' details (network) - Rodzajowy sterownik, '%1' + Rodzajowy sterownik, '%1' Generic Driver, '%1' { %2 } details (network) - Rodzajowy sterownik, '%1' { %2 } + Rodzajowy sterownik, '%1' { %2 } NAT Network, '%1' details (network) - Sieć NAT, '%1' + Sieć NAT, '%1' Adapter %1 details (network) - Karta %1 + Karta %1 Disabled details (network/adapter) - + Wyłączone Port %1 details (serial) - Port %1 + Port %1 Disabled details (serial) - + Wyłączone USB Controller details (usb) - Kontroler USB + Kontroler USB Device Filters details (usb) - Filtry urządzeń + Filtry urządzeń %1 (%2 active) details (usb) - %1 (aktywne: %2) + %1 (aktywne: %2) Disabled details (usb) - + Wyłączone USB Controller Inaccessible details (usb) - Kontroler USB niedostępny + Kontroler USB niedostępny Shared Folders details (shared folders) - + Udostępniane foldery None details (shared folders) - Brak + Brak Menu-bar details (user interface) - Pasek menu + Pasek menu Enabled details (user interface/menu-bar) - + Włączone Disabled details (user interface/menu-bar) - + Wyłączone Status-bar details (user interface) - Pasek stanu + Pasek stanu Enabled details (user interface/status-bar) - + Włączone Disabled details (user interface/status-bar) - + Wyłączone Mini-toolbar Position details (user interface) - Pozycja mini paska narzędziowego + Pozycja mini paska narzędziowego Top details (user interface/mini-toolbar position) - Góra + Góra Bottom details (user interface/mini-toolbar position) - Dół + Dół Mini-toolbar details (user interface) - Mini pasek narzędziowy + Mini pasek narzędziowy Disabled details (user interface/mini-toolbar) - + Wyłączone None details (description) - Brak + Brak Recording File details (display/recording) - + Plik nagrania Recording Attributes details (display/recording) - + Atrybuty nagrywania Recording details (display/recording) - + Nagrywanie Disabled details (display/recording) - + Wyłączone Graphics Controller details (display) - + Kontroler grafiki USB 1.1 (OHCI) Controller details (usb) - + Kontroler USB 1.1 (OHCI) USB 2.0 (OHCI + EHCI) Controller details (usb) - + Kontroler USB 2.0 (OHCI + EHCI) USB 3.0 (xHCI) Controller details (usb) - + Kontroler USB 3.0 (xHCI) %1 MB - %1 MB + %1 MB @@ -4986,7 +5034,7 @@ %1 details like 'General details' or 'Storage details' - + %1 szczegóły @@ -5204,14 +5252,14 @@ UIDetailsSet Contains the details of virtual machine '%1' - + Zawiera szczegóły maszyny wirtualnej '%1' UIDetailsView Contains a list of Virtual Machine details - + Zawiera listę szczegółów maszyny wirtualnej @@ -5330,7 +5378,7 @@ UIDownloaderUserManual Select folder to save User Manual to - Wybierz folder, w którym zostanie zapisana Instrukcja Użytkownika + Wybierz folder, w którym zostanie zapisana Instrukcja obsługi VirtualBox User Manual @@ -5356,27 +5404,27 @@ Result&nbsp;Code: error info - Kod&nbsp;wyniku&nbsp;(RC): + Kod&nbsp;wyniku&nbsp;(RC): Component: error info - Komponent: + Komponent: Interface: error info - Interfejs: + Interfejs: Callee: error info - Wywołana funkcja: + Wywołana funkcja: Callee&nbsp;RC: error info - Kod&nbsp;wyniku&nbsp;(RC)&nbsp;wywołanej&nbsp;funkcji: + Kod&nbsp;wyniku&nbsp;(RC)&nbsp;wywołanej&nbsp;funkcji: @@ -5703,182 +5751,182 @@ %1, %2: %3, %4 col.2 text, col.3 name: col.3 text, col.1 name - + %1, %2: %3, %4 %1, %2: %3 col.2 text, col.3 name: col.3 text - + %1, %2: %3 UIFDCreationDialog File Path: - + Ścieżka do pliku: Size: - Rozmiar: + Rozmiar: Format disk as FAT12 - + Sformatuj dyskietkę jako FAT12 1.44M - 1.44M + 1.44M 1.2M - 1.2M + 1.2M 720K - 720K + 720K 360K - 360K + 360K Floppy Disk Creator - + Kreator dyskietki UIFileManager %1 - File Manager - + %1 - Menedżer plików Close - Zamknij + Zamknij Clear - + Wyczyść Cancel - Anuluj + Anuluj Not yet started - + Jeszcze nie uruchomiona Working - + Działa Paused - Wstrzymana + Wstrzymana Canceled - + Anulowane Succeded - + Zakończone sukcesem Failed - + Niepowodzenie Invalid - + Remove Selected - + Usuń zaznaczone Remove Finished - + Usuń ukończone Remove All - + Usuń wszystko List directories on top - + Foldery na górze List directories before files - + Pokazuj foldery przed plikami Ask before delete - + Zapytaj przed usunięciem Show a confirmation dialog before deleting files and directories - + Pokaż okno potwierdzenia przed usunięciem pilków lub folderów Human readable sizes - + Rozmiary czytelne dla człowieka Show file/directory sizes in human readable format rather than in bytes - + Pokaż rozmiary plików/folderów w formacie czytelnym dla człowieka, a nie w bajtach Password - Hasło + Hasło Show Password - + Pokaż hasło User name to authenticate session creation - + Nazwa użytkownika do uwierzytelnienia sesji User Name - + Nazwa użytkownika Password to authenticate session creation - + Hasło do uwierzytelnienia sesji Create Session - + Stwórz sesję Close Session - + Zamknij sesję Total Size - + Rozmiar całkowity bytes - + bajtów File Count - + Liczba plików Delete the selected file(s) and/or folder(s) - + Usuń wybrany plik(i) i/lub folder(y) Ask for this confirmation next time - + Zapytaj o tę potwierdzenie następnym razem Delete confirmation can be disabled/enabled also from the Options panel. - + Potwierdzenie usunięcia można wyłączyć/włączyć również z panelu Opcje. Name @@ -5890,23 +5938,23 @@ Unknown - + Nieznany File - + Plik Directory - + Folder Symbolic Link - + Łącze symboliczne <b>Size:</b> %1 bytes - + <b>Rozmiar:</b> %1 bajtów <b>Allocated:</b> %1 bytes @@ -5914,15 +5962,15 @@ directory - + folder file - + plik symbolic link - + łącze symboliczne character device @@ -5954,7 +6002,7 @@ <b>Type:</b> %1<br/> - + <b>Typ:</b> %1<br/> <b>INode:</b> %1<br/> @@ -5962,7 +6010,7 @@ <b>Device:</b> %1<br/> - + <b>Urządzenie:</b> %1<br/> <b>Hardlinks:</b> %1<br/> @@ -5974,19 +6022,19 @@ <b>Attributes:</b> %1<br/> - + <b>Atrybuty:</b> %1<br/> <b>Device ID:</b> %1<br/> - + <b>ID urządzenia:</b> %1<br/> <b>Owner:</b> %1 (%2)<br/> - + <b>Właściciel:</b> %1 (%2)<br/> <b>Group:</b> %1 (%2)<br/> - + <b>Grupa:</b> %1 (%2)<br/> <b>Birth:</b> %1<br/> @@ -5998,54 +6046,62 @@ <b>Modified:</b> %1<br/> - + <b>zmodyfikowano:</b> %1<br/> <b>Access:</b> %1<br/> - + <b>Dostęp:</b> %1<br/> <b>Selected:</b> %1 files and %2 directories<br/> - + <b>Wybrano:</b> %1 plików i %2 folderów<br/> <b>Size (non-recursive):</b> %1 bytes - + <b>Rozmiar (nierekurencyjnie):</b> %1 bajtów Properties - + Właściwości <b>Name:</b> %1<br/> - + <b>Nazwa:</b> %1<br/> <b>Created:</b> %1<br/> - + <b>Utworzony:</b> %1<br/> <b>Owner:</b> %1 - + <b>Właściciel:</b> %1 Show hidden objects - + Pokaż ukryte obiekty Show hidden files/directories - + Pokaż ukryte pliki/foldery Guest File System - + System plików maszyny gościa Host File System - + System plików gospodarza No Guest Session found!<br>Please use the Session Panel to start a new guest session + Nie znaleziono sesji maszyny gościa!<br>Użyj panelu sesji do rozpoczęcia nowej sesji gościa + + + Close dialog without saving + + + + Reset Changes (%1) @@ -6093,7 +6149,7 @@ Please use the <b>Other...</b> item from the drop-down list to select a path. - Proszę użyć opcji <b>Inny...</b> z listy rozwijanej aby wybrać żądaną ścieżkę. + Proszę użyć opcji <b>Inny...</b> z listy rozwijanej, aby wybrać żądaną ścieżkę. Holds the folder path. @@ -6339,19 +6395,19 @@ UIFormEditorWidget Edit... - + Edytuj... Name - Nazwa + Nazwa Value - + Wartość Assign value ... - + Przypisz wartość... @@ -7026,11 +7082,11 @@ Scale Factor: - Współczynnik skali: + Współczynnik skali: Controls the guest screen scale factor. - Kontroluje współczynnik skali ekranu gościa. + Kontroluje współczynnik skali ekranu gościa. @@ -7136,7 +7192,7 @@ When checked, the host screensaver will be disabled whenever a virtual machine is running. - Gdy zaznaczono, wygaszacz ekranu gospodarza zostanie wyłączony, gdy maszyna wirtualna jest uruchomiona. + Po zaznaczeniu tej opcji, wygaszacz ekranu gospodarza zostanie wyłączony, gdy maszyna wirtualna jest uruchomiona. Host Screensaver: @@ -7179,7 +7235,7 @@ &VirtualBox Manager - &Menedźer VirtualBox + &Menedżer VirtualBox Virtual &Machine @@ -7899,23 +7955,23 @@ &URL: - + Adres &URL: No proxy URL is currently specified. - + Brak aktualnie określonego adresu URL proxy. Invalid proxy URL is currently specified. - + Określony adres URL proxy jest nieprawidłowy. You have provided a proxy password. Please be aware that the password will be saved in plain text. You may wish to configure a system-wide proxy instead and not store application-specific settings. - + Podałeś hasło proxy. Należy pamiętać, że hasło zostanie zapisane w postaci zwykłego tekstu. Zamiast tego możesz skonfigurować serwer proxy dla całego systemu i nie przechowywać ustawień specyficznych dla aplikacji. Holds the proxy URL. The format is: <table cellspacing=0 style='white-space:pre'><tr><td>[{type}://][{userid}[:{password}]@]{server}[:{port}]</td></tr><tr><td>http://username:password@proxy.host.com:port</td></tr></table> - + Zawiera adres URL proxy. Format to: <table cellspacing=0 style='white-space:pre'><tr><td>[{type}://][{userid}[:{haslo}]@]{serwer}[:{port}]</td></tr><tr><td>http://username:haslo@proxy.host.com:port</td></tr></table> @@ -7977,7 +8033,7 @@ UIGraphicsControllerEditor &Graphics Controller: - + &Kontroler grafiki: @@ -7985,7 +8041,7 @@ %1: %2 'key: value', like 'Name: MyVM' - %1: %2 + %1: %2 @@ -8019,38 +8075,38 @@ UIGuestControlTreeWidget Terminate Process - + Zakończ proces Expand All - + Rozwiń wszystko Collapse All - + Zwiń wszystko Terminate Session - + Zakończ sesję Remove All Terminated Sessions/Processes - + Usuń wszystkie zakończone sesje/procesy Properties - + Właściwości UIGuestProcessControlDialog %1 - Guest Control - + %1 - Sterowanie gościem Close - Zamknij + Zamknij @@ -8061,53 +8117,53 @@ Session/Process ID - + ID sesji/procesu Session Name/Process Command - + Nazwa sesji/Polecenie procesu Session/Process Status - + Stan sesji/procesu UIGuestProcessTreeItem Process Name - + Nazwa procesu Process Id - + Identyfikator procesu Process Status - + Stan procesu Executable Path - + Ścieżka wykonywania Arguments - + Argumenty UIGuestSessionTreeItem Session Name - + Nazwa sesji Session Id - + Identyfikator sesji Session Status - + Stan sesji @@ -8121,7 +8177,7 @@ UIHostComboEditor <key_%1> - <klawisz_%1> + <key_%1> Left @@ -8181,7 +8237,7 @@ Host+ - Host+ + Klawisz Hosta+ None @@ -8189,170 +8245,170 @@ Left %1 - + Lewy %1 Right %1 - + Prawy %1 UIHostNetworkDetailsWidget &Adapter - &Karta + &Karta &DHCP Server - Serwer &DHCP + Serwer &DHCP Configure Adapter &Automatically - + Skonfiguruj kartę &automatycznie Configure Adapter &Manually - + Skonfiguruj kartę &ręcznie &IPv4 Address: - Adres &IPv4: + Adres &IPv4: Holds the host IPv4 address for this adapter. - Przechowuje adres IPv4 gospodarza dla tej karty. + Przechowuje adres IPv4 gospodarza dla tej karty. IPv4 Network &Mask: - &Maska sieci IPv4: + &Maska sieci IPv4: Holds the host IPv4 network mask for this adapter. - Przechowuje maskę sieci IPv4 gospodarza dla tej karty. + Przechowuje maskę sieci IPv4 gospodarza dla tej karty. I&Pv6 Address: - Adres I&Pv6: + Adres I&Pv6: Holds the host IPv6 address for this adapter if IPv6 is supported. - Przechowuje adres IPv6 gospodarza dla tej karty, jeśli IPv6 jest dostępne. + Przechowuje adres IPv6 gospodarza dla tej karty, jeśli IPv6 jest dostępne. IPv6 Prefix &Length: - Dł&ugość maski sieci IPv6: + Dł&ugość prefiksu IPv6: Holds the host IPv6 prefix length for this adapter if IPv6 is supported. - + Przechowuje długość prefiksu IPv6 gospodarza dla tej karty, jeśli IPv6 jest dostępne. Reset - Zresetuj + Zresetuj Apply - + Zastosuj Reset changes in current interface details - + Zresetuj zmiany szczegółów obecnej karty Apply changes in current interface details - + Zastosuj zmiany szczegółów obecnej karty Reset Changes (%1) - + Zresetuj zmiany (%1) Apply Changes (%1) - + Zastosuj zmiany (%1) &Enable Server - &Włącz serwer + &Włącz serwer When checked, the DHCP Server will be enabled for this network on machine start-up. - Po zaznaczeniu tej opcji, serwer DHCP zostanie aktywowany dla tej sieci przy starcie maszyny. + Po zaznaczeniu tej opcji, serwer DHCP zostanie aktywowany dla tej sieci przy starcie maszyny. Server Add&ress: - Ad&res serwera: + Ad&res serwera: Holds the address of the DHCP server servicing the network associated with this host-only adapter. - Przechowuje adres serwera DHCP obsługującego sieć powiązaną z tą kartą sieci izolowanej. + Przechowuje adres serwera DHCP obsługującego sieć powiązaną z tą kartą sieci izolowanej. Server &Mask: - &Maska serwera: + &Maska serwera: Holds the network mask of the DHCP server servicing the network associated with this host-only adapter. - Przechowuje maskę sieci serwera DHCP obsługującego sieć powiązaną z tą kartą sieci izolowanej. + Przechowuje maskę sieci serwera DHCP obsługującego sieć powiązaną z tą kartą sieci izolowanej. &Lower Address Bound: - D&olna granica adresów: + D&olna granica adresów: Holds the lower address bound offered by the DHCP server servicing the network associated with this host-only adapter. - + Określa dolną granicę zakresu adresów oferowanych przez sewer DHCP obsługujący sieć powiązaną z tą kartą sieci izolowanej. &Upper Address Bound: - &Górna granica adresów: + &Górna granica adresów: Holds the upper address bound offered by the DHCP server servicing the network associated with this host-only adapter. - Określa górną granicę zakresu adresów oferowanych przez sewer DHCP obsługujący sieć powiązaną z tą kartą sieci izolowanej. + Określa górną granicę zakresu adresów oferowanych przez sewer DHCP obsługujący sieć powiązaną z tą kartą sieci izolowanej. Reset changes in current DHCP server details - + Zresetuj zmiany szczegółów obecnego serwera DHCP Apply changes in current DHCP server details - + Zastosuj zmiany szczegółów obecnego serwera DHCP Host interface <nobr><b>%1</b></nobr> is set to obtain the address automatically but the corresponding DHCP server is not enabled. - + Interfejs gospodarza <nobr><b>%1</b></nobr> jest ustawiony, aby otrzymywać adres automatycznie, ale odpowiedni serwer DHCP nie jest włączony. Host interface <nobr><b>%1</b></nobr> does not currently have a valid IPv4 address. - + Interfejs gospodarza <nobr><b>%1</b></nobr> nie posiada obecnie prawidłowego adresu IPv4. Host interface <nobr><b>%1</b></nobr> does not currently have a valid IPv4 network mask. - + Interfejs gospodarza <nobr><b>%1</b></nobr> nie posiada obecnie prawidłowej maski sieciowej adresu IPv4. Host interface <nobr><b>%1</b></nobr> does not currently have a valid IPv6 address. - + Interfejs gospodarza <nobr><b>%1</b></nobr> nie posiada obecnie prawidłowego adresu IPv6. Host interface <nobr><b>%1</b></nobr> does not currently have a valid IPv6 prefix length. - + Interfejs gospodarza <nobr><b>%1</b></nobr> nie posiada obecnie prawidłowej długości prefiksu adresu IPv6. Host interface <nobr><b>%1</b></nobr> does not currently have a valid DHCP server address. - + Interfejs gospodarza <nobr><b>%1</b></nobr> nie posiada obecnie prawidłowego adresu serwera DHCP. Host interface <nobr><b>%1</b></nobr> does not currently have a valid DHCP server mask. - + Interfejs gospodarza <nobr><b>%1</b></nobr> nie posiada obecnie prawidłowej maski serwera DHCP. Host interface <nobr><b>%1</b></nobr> does not currently have a valid DHCP server lower address bound. - + Interfejs gospodarza <nobr><b>%1</b></nobr> nie posiada obecnie poprawnej dolnej granicy adresów serwera DHCP. Host interface <nobr><b>%1</b></nobr> does not currently have a valid DHCP server upper address bound. - + Interfejs gospodarza <nobr><b>%1</b></nobr> nie posiada obecnie poprawnej górnej granicy adresów serwera DHCP. @@ -8394,7 +8450,7 @@ DHCP Server - Serwer DHCP + Serwer DHCP Address @@ -8426,63 +8482,63 @@ Name - Nazwa + Nazwa IPv4 Address/Mask - + Adres IPv4/Maska IPv6 Address/Mask - + Adres IPv6/Maska Host Network Manager - + Menedżer sieci hosta Reset - Zresetuj + Zresetuj Apply - + Zastosuj Close - Zamknij + Zamknij Reset changes in current host network details - + Zresetuj zmiany w obecnych szczegółach sieci hosta Apply changes in current host network details - + Zastosuj zmiany w obecnych szczegółach sieci hosta Close dialog without saving - + Zamknij okno dialogowe bez zapisania Reset Changes (%1) - + Zresetuj zmiany (%1) Apply Changes (%1) - + Zastosuj zmiany (%1) Close Window (%1) - + Zamknij okno (%1) Adding network ... - + Dodawanie sieci... Removing network ... - + Usuwanie sieci... @@ -8696,7 +8752,7 @@ %1: %2 scope: description - %1: %2 + %1: %2 @@ -8963,122 +9019,122 @@ Cable Network tooltip - Kabel + Kabel Connected cable (Network tooltip) - Podłączony + Podłączony Disconnected cable (Network tooltip) - Odłączony + Odłączony Screens Display tooltip - Ekrany + Ekrany Adapter %1 (%2) Network tooltip - + Karta %1 (%2) IP Network tooltip - + IP No USB devices attached USB tooltip - + Brak podłączonych urządzeń USB No shared folders Shared folders tooltip - + Brak współdzielonych folderów Video memory Display tooltip - + Pamięć wideo 3D acceleration Display tooltip - + Akceleracja 3D Recording disabled Recording tooltip - + Nagrywanie wyłączone Video/audio recording file Recording tooltip - + Plik nagrania wideo/audio Audio recording file Recording tooltip - + Plik nagrania audio Video recording file Recording tooltip - + Plik nagrania wideo Indicates whether the host mouse pointer is captured by the guest OS:%1 Mouse tooltip - + Wskazuje, czy mysz gospodarza jest przechwytywana przez goszczony system operacyjny:%1 pointer is not captured Mouse tooltip - + wskaźnik nie jest przechwytywany pointer is captured Mouse tooltip - + wskaźnik jest przechwytywany mouse integration (MI) is On Mouse tooltip - + Integracja myszy jest włączona MI is Off, pointer is captured Mouse tooltip - + Integracja myszy jest wył., wskaźnik jest przechwytywany MI is Off, pointer is not captured Mouse tooltip - + Integracja myszy jest wył., wskaźnik nie jest przechwytywany Note that the mouse integration feature requires Guest Additions to be installed in the guest OS. Mouse tooltip - + Funkcja integracji myszy wymaga zainstalowanych Dodatków Gościa w goszczonym systemie operacyjnym. Indicates whether the host keyboard is captured by the guest OS:%1 Keyboard tooltip - + Wskazuje, czy klawiatura gospodarza jest przechwytywana przez goszczony system operacyjny:%1 keyboard is not captured Keyboard tooltip - + klawiatura nie jest przechwytywana keyboard is captured Keyboard tooltip - + klawiatura jest przechwytywana @@ -9519,87 +9575,87 @@ Enable DHCP Server - Włącz + Włącz Adapter - Karta + Karta Automatically configured interface - Konfiguracja automatyczna + Konfiguracja automatyczna Manually configured interface - Konfiguracja ręczna + Konfiguracja ręczna IPv4 Address - Adres IPv4 + Adres IPv4 Not set address - + nie ustawiony IPv4 Network Mask - Maska sieci IPv4 + Maska sieci IPv4 Not set mask - + nie ustawiona IPv6 Address - Adres IPv6 + Adres IPv6 IPv6 Prefix Length - Długość maski sieci IPv6 + Długość maski sieci IPv6 Not set length - + nie ustawiona DHCP Server - Serwer DHCP + Serwer DHCP Enabled server - + Włączony Disabled server - + Wyłączony Address - Adres + Adres Network Mask - Maska sieci + Maska sieci Lower Bound - Dolny zakres + Dolny zakres Not set bound - + nie ustawiony Upper Bound - Górny zakres + Górny zakres @@ -9607,76 +9663,76 @@ %1, %2 col.2 text, col.1 name - %1: %2 {1,?} + %1, %2 %1 col.2 text - %1 + %1 Network Name - Nazwa sieci + Nazwa sieci [empty] - [pusta] + [pusta] %1 (renamed from %2) - %1 (zmieniono nazwę z %2) + %1 (zmieniono nazwę z %2) Old Network Name - Stara nazwa sieci + Stara nazwa sieci New Network Name - Nowa nazwa sieci + Nowa nazwa sieci Network CIDR - Adres CIDR sieci + Adres CIDR sieci Supports DHCP - Obsługuje DHCP + Obsługuje DHCP yes - tak + tak no - nie + nie Supports IPv6 - Obsługuje IPv6 + Obsługuje IPv6 Default IPv6 route - Domyślna trasa IPv6 + Domyślna trasa IPv6 No new name specified for the NAT network previously called <b>%1</b>. - Brak określonej nowej nazwy dla wcześniej przywołanej sieci NAT<b>%1</b>. + Brak określonej nowej nazwy dla wcześniej przywołanej sieci NAT<b>%1</b>. No CIDR specified for the NAT network <b>%1</b>. - Brak określonej metody CIDR dla sieci NAT <b>%1</b>. + Brak określonej metody CIDR dla sieci NAT <b>%1</b>. No CIDR specified for the NAT network previously called <b>%1</b>. - Brak określonej metody CIDR dla sieci NAT przywołanej poprzednio <b>%1</b>. + Brak określonej metody CIDR dla sieci NAT przywołanej poprzednio <b>%1</b>. Invalid CIDR specified (<i>%1</i>) for the NAT network <b>%2</b>. - Określono nieprawidłową metodę CIDR (<i>%1</i>) dla sieci NAT <b>%2</b>. + Określono nieprawidłową metodę CIDR (<i>%1</i>) dla sieci NAT <b>%2</b>. Invalid CIDR specified (<i>%1</i>) for the NAT network previously called <b>%2</b>. - Określono nieprawidłową metodę CIDR (<i>%1</i>) dla sieci NAT przywołanej poprzednio <b>%2</b>. + Określono nieprawidłową metodę CIDR (<i>%1</i>) dla sieci NAT przywołanej poprzednio <b>%2</b>. @@ -9684,22 +9740,22 @@ (built-in) Language - (wbudowany) + (wbudowany) <unavailable> Language - <niedostępny> + <niedostępny> <unknown> Author(s) - <nieznany> + <nieznany> Default Language - Domyślny + Domyślny @@ -9772,31 +9828,31 @@ UIMachinePreview No preview - Brak podglądu + Brak podglądu Update disabled - Aktualizacje wyłączone + Aktualizacje wyłączone Every 0.5 s - Co 0,5 s + Co 0,5 s Every 1 s - Co 1 s + Co 1 s Every 2 s - Co 2 s + Co 2 s Every 5 s - Co 5 s + Co 5 s Every 10 s - Co 10 s + Co 10 s @@ -9827,27 +9883,27 @@ Selects the audio output driver. The <b>Null Audio Driver</b> makes the guest see an audio card, however every access to it will be ignored. - Pozwala wybrać sterownik wyjścia audio. <b>Zerowy sterownik audio</b> sprawia, że gość widzi kartę dzwiękową, jednakże każdy dostęp do niej będzie ignorowany. + Pozwala wybrać sterownik wyjścia audio. <b>Zerowy sterownik audio</b> sprawia, że gość widzi kartę dźwiękową, jednakże każdy dostęp do niej będzie ignorowany. Extended Features: - Rozszerzone właściwości: + Rozszerzone właściwości: When checked, output to the virtual audio device will reach the host. Otherwise the guest is muted. - + Po zaznaczeniu, wyjście do wirtualnego urządzenia audio dotrze do hosta. W przeciwnym razie, gość zostanie wyciszony. Enable Audio &Output - + Włącz wyjście &dźwięku When checked, the guest will be able to capture audio input from the host. Otherwise the guest will capture only silence. - + Po zaznaczeniu, gość będzie mógł przechwytywać wejście audio z hosta. W przeciwnym razie, gość przechwyci tylko ciszę. Enable Audio &Input - + Włącz wejście &dźwięku @@ -10153,47 +10209,47 @@ &Audio Quality: - + &Jakość dźwięku: &Graphics Controller: - + &Kontroler grafiki: Selects the graphics adapter type the virtual machine will use. - + Wybiera typ adaptera grafiki używany przez maszynę wirtualną. Re&cording - + Na&grywanie &Enable Recording - + &Włącz nagrywanie Recording &Mode: - + Tryb &nagrywania: Selects the recording mode. - + Wybiera tryb nagrywania. &Video Quality: - + &Jakość obrazu: Controls the <b>quality</b>. Increasing this value will make the audio sound better at the cost of an increased file size. - + Kontroluje <b>jakość</b>. Zwiększenie tej wartości poprawi jakość dźwięku kosztem większego rozmiaru pliku. The virtual machine is configured to use 3D acceleration. This will work only if you pick a different graphics controller (%1). Either disable 3D acceleration or switch to required graphics controller type. The latter will be done automatically if you confirm your changes. - + Ta maszyna wirtualna jest skonfigurowana do używania akceleracji 3D. Ta funkcja zadziała tylko, jeśli wybierzesz inny kontroler grafiki (%1). Wyłącz akcelerację 3D lub przełącz na wymagany typ kontrolera graficznego. To ostatnie nastąpi automatycznie, jeśli potwierdzisz zmiany. The virtual machine is configured to use a graphics controller other than the recommended one (%1). Please consider switching unless you have a reason to keep the currently selected graphics controller. - + Ta maszyna wirtualna jest skonfigurowana do używania kontrolera grafiki innego niż zalecany (%1).Rozważ zmianę, chyba że masz powód, aby zachować aktualnie wybrany kontroler graficzny. @@ -10521,43 +10577,43 @@ Disk Enc&ryption - + Szyf&rowanie dysku When checked, disks attached to this virtual machine will be encrypted. - + Po zaznaczeniu, dyski podłączone do tej maszyny wirtualnej zostaną zaszyfrowane. En&able Disk Encryption - + Włą&cz szyfrowanie dysku Disk Encryption C&ipher: - + Sz&yfr: Holds the encryption password for disks attached to this virtual machine. - + Przechowuje hasło szyfrowania dla dysków podłączony do tej maszyny wirtualnej. Confirms the disk encryption password. - + Potwierdza hasło do zaszyfrowania dysku. You are trying to enable disk encryption for this virtual machine. However, this requires the <i>%1</i> to be installed. Please install the Extension Pack from the VirtualBox download site. - + Próbujesz włączyć szyfrowanie dysku dla tej maszyny wirtualnej. Jednakże, to wymaga zainstalowania <i>%1</i> . Zainstaluj pakiet rozszerzeń ze strony pobierania VirtualBox. Disk encryption cipher type not specified. - + Nie określono typu szyfu. Disk encryption password empty. - + Hasło szyfowania dysku jest puste. Disk encryption passwords do not match. - + Hasła szyfowania dysku nie są zgodne. @@ -10631,7 +10687,7 @@ Generates a new random MAC address. - Generuje nowy, przypadkowy adres MAC. + Generuje nowy, losowy adres MAC. &Generate @@ -10851,7 +10907,7 @@ No cloud network name is currently specified. - + Brak wybranej nazwy dla sieci w chmurze. @@ -11074,11 +11130,11 @@ Machine Folders - Foldery maszyny + Foldery maszyny Transient Folders - Foldery tymczasowe + Foldery tymczasowe Full @@ -11158,15 +11214,15 @@ Shared &Folders - W&spółdzielone foldery + W&spółdzielone foldery Auto Mount - + Automatyczne montowanie At - + Na @@ -11221,11 +11277,11 @@ Mount point: - + Punkt montowania: Where to automatically mount the folder in the guest. A drive letter (e.g. 'G:') for Windows and OS/2 guests, path for the others. If left empty the guest will pick something fitting. - + Gdzie automatycznie zamontować folder w maszynie gościa. Litera dysku (np. 'G:') dla maszyn gościa z systemem Windows i OS/2, ścieżka dla innych. Jeśli pole pozostanie puste, gość wybierze coś odpowiedniego. @@ -11317,7 +11373,7 @@ &Path/Address: - &Scieżka/adres: + &Ścieżka/adres: <p>In <b>Host Pipe</b> mode: Holds the path to the serial port's pipe on the host. Examples: "\\.\pipe\myvbox" or "/tmp/myvbox", for Windows and UNIX-like systems respectively.</p><p>In <b>Host Device</b> mode: Holds the host serial device name. Examples: "COM1" or "/dev/ttyS0".</p><p>In <b>Raw File</b> mode: Holds the file-path on the host system, where the serial output will be dumped.</p><p>In <b>TCP</b> mode: Holds the TCP "port" when in server mode, or "hostname:port" when in client mode. @@ -11852,83 +11908,83 @@ &Storage Devices - + &Urządzenia pamięci masowej PIIX3 (IDE) - + PIIX3 (IDE) PIIX4 (Default IDE) - + PIIX4 (Domyślnie IDE) ICH6 (IDE) - + ICH6 (IDE) AHCI (SATA) - + AHCI (SATA) LsiLogic (Default SCSI) - + LsiLogic (Domyślnie SCSI) BusLogic (SCSI) - + BusLogic (SCSI) LsiLogic SAS (SAS) - + LsiLogic SAS (SAS) I82078 (Floppy) - + I82078 (Floppy) USB - USB + USB NVMe (PCIe) - + NVMe (PCIe) virtio-scsi - + virtio-scsi Hard Disk - Dysk twardy + Dysk twardy Optical Drive - + Napęd optyczny Floppy Drive - + Stacja dyskietek Choose/Create a Virtual Hard Disk... - + Wybierz/Stwórz wirtualny dysk twardy... Choose a disk file... - + Wybierz plik dysku... Choose/Create a Virtual Optical Disk... - + Wybierz/Stwórz wirtualny dysk optyczny... Choose/Create a Virtual Floppy Disk... - + Wybierz/Stwórz wirtualną dyskietkę... Choose/Create a disk image... - + Wybierz/Stwórz obraz dysku... @@ -12113,7 +12169,7 @@ 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. - Ogranicza to ilość czasu, w którym każdy wirtualny procesor może pracować. Każdy wirtualny procesor będzie mógł używać procent czasu przetwarzania dostępnego na jednym procesorze fizycznym. Wykorzystanie procesora może zostać wyłączone poprzez ustawienie go na 100%. Ustawienie wykorzystania na zbyt nisko, moze sprawić, że maszyna będzie wolno reagowała. + Ogranicza to ilość czasu, w którym każdy wirtualny procesor może pracować. Każdy wirtualny procesor będzie mógł używać procent czasu przetwarzania dostępnego na jednym procesorze fizycznym. Wykorzystanie procesora może zostać wyłączone poprzez ustawienie go na 100%. Ustawienie wykorzystania na zbyt nisko, może sprawić, że maszyna będzie wolno reagowała. you have enabled a USB HID (Human Interface Device). This will not work unless USB emulation is also enabled. This will be done automatically when you accept the VM Settings by pressing the OK button. @@ -12191,7 +12247,7 @@ %1 CPUs %1 is host cpu count * 2 for now - %1 CPUs + %1 CPU %1% @@ -12199,51 +12255,51 @@ The I/O APIC feature is not currently enabled in the Motherboard section of the System page. This is needed to support a chipset of type ICH9. It will be enabled automatically if you confirm your changes. - + Tryb wejścia/wyjścia APIC nie jest obecnie włączony w sekcji płyty głównej strony system. Ta funkcja jest konieczna, by wspierać chipsety typu ICH9. Zostanie ona włączona automatycznie, jeśli potwierdzisz zmiany. The USB controller emulation is not currently enabled on the USB page. This is needed to support an emulated USB pointing device. It will be enabled automatically if you confirm your changes. - + Emulacja kontrola USB nie jest obecnie włączona na stronie ustawień USB. Ta funkcja jest konieczna, by wspierać emulowane urządzenie wskazujące USB. Zostanie ona włączona automatycznie, jeśli potwierdzisz zmiany. The I/O APIC feature is not currently enabled in the Motherboard section of the System page. This is needed to support more than one virtual processor. It will be enabled automatically if you confirm your changes. - + Tryb wejścia/wyjścia APIC nie jest obecnie włączony w sekcji płyty głównej strony system. Ta funkcja jest potrzebna do obsługi więcej niż jednego procesora wirtualnego. Zostanie ona włączona automatycznie, jeśli potwierdzisz zmiany. The hardware virtualization is not currently enabled in the Acceleration section of the System page. This is needed to support more than one virtual processor. It will be enabled automatically if you confirm your changes. - + Wirtualizacja sprzętowa nie jest obecnie włączoną w sekcji akceleracji strony system. Ta funkcja jest potrzebna do obsługi więcej niż jednego procesora wirtualnego. Zostanie ona włączona automatycznie, jeśli potwierdzisz zmiany. Please consider lowering the number of CPUs assigned to the virtual machine rather than setting the processor execution cap. - + Proszę rozważyć zmniejszenie liczby procesorów przypisanych do tej maszyny wirtualnej, zamiast ustawiania limitu wykorzystania procesora. Lowering the processor execution cap may result in a decline in performance. - + Zmniejszenie limitu wykorzystania procesora może spowodować spadek wydajności. The hardware virtualization is enabled in the Acceleration section of the System page although it is not supported by the host system. It should be disabled in order to start the virtual system. - + Wirtualizacja sprzętowa jest włączoną w sekcji akceleracji strony system, pomimo że nie jest obsługiwana przez system gospodarza. Ta opcja powinna zostać wyłączona, aby uruchomić system wirtualny. When checked, the nested hardware virtualization CPU feature will be exposed to the virtual machine. - + Udostępnia maszynie wirtualnej funkcję zagnieżdżonej wirtualizacji sprzętu. Enable Nested &VT-x/AMD-V - + Włącz zagnieżdżone &VT-x/AMD-V The hardware virtualization is not currently enabled in the Acceleration section of the System page. This is needed to support nested hardware virtualization. It will be enabled automatically if you confirm your changes. - + Wirtualizacja sprzętowa nie jest obecnie włączoną w sekcji akceleracji strony system. Ta funkcja jest potrzebna do obsługi zagnieżdzonej wirtualizacji sprzętowej. Zostanie ona włączona automatycznie, jeśli potwierdzisz zmiany. The nested paging is not currently enabled in the Acceleration section of the System page. This is needed to support nested hardware virtualization. It will be enabled automatically if you confirm your changes. - + Zagnieżdżone stronicowanie nie jest obecnie włączone w sekcji akceleracji strony system. Ta funkcja jest potrzebna do obsługi sprzętowego zagnieżdzenia stronicowego. Zostanie ona włączona automatycznie, jeśli potwierdzisz zmiany. The hardware virtualization is not currently enabled in the Acceleration section of the System page. This is needed for nested paging support. It will be enabled automatically if you confirm your changes. - + Wirtualizacja sprzętowa nie jest obecnie włączoną w sekcji akceleracji strony system. Ta funkcja jest potrzebna do obsługi zagniezdzenia stronicowego. Zostanie ona włączona automatycznie, jeśli potwierdzisz zmiany. @@ -12447,11 +12503,11 @@ When chosen, enables the virtual USB OHCI and EHCI controllers of this machine. Together they provide USB 2.0 support. - + Po wybraniu tej opcji, wirtualne kontrolery USB OHCI i EHCI tej maszyny będą włączone. Te kontrolery razem oferują wsparcie USB 2.0. USB &2.0 (OHCI + EHCI) Controller - + Kontroler USB &2.0 (OHCI + EHCI) @@ -12592,7 +12648,7 @@ UIMachineWindow EXPERIMENTAL build %1r%2 - %3 - Build eksperymentalny %1r%2 - %3 + Build eksperymentalny %1r%2 - %3 @@ -12606,152 +12662,152 @@ UIMediumDetailsWidget &Attributes - + &Atrybuty &Information - + &Informacje &Type: - &Typ: + &Typ: &Location: - + &Lokalizacja: &Description: - &Opis: + &Opis: &Size: - + &Rozmiar: Holds the type of this medium. - + Zawiera typ tego nośnika. Holds the location of this medium. - + Zawiera lokalizację tego nośnika. Holds the description of this medium. - + Zawiera opis tego nośnika. Holds the size of this medium. - + Zawiera rozmiar tego nośnika. Reset - Zresetuj + Zresetuj Apply - + Zastosuj Reset changes in current medium details - + Zresetuj zmiany w obecnych szczegółach nośnika Apply changes in current medium details - + Zastosuj zmiany w obecnych szczegółach nośnika Reset Changes (%1) - + Zresetuj zmiany (%1) Apply Changes (%1) - + Zastosuj zmiany (%1) Cannot change medium size from <b>%1</b> to <b>%2</b> as storage shrinking is currently not implemented. - + Nie można zmienić rozmiaru nośnika z <b>%1</b> do <b>%2</b> ponieważ zmniejszanie pamięci jest obecnie nie zaimplementowane. Choose Medium Location - + Wybierz lokalizację nośnika Location can not be empty. - + Lokalizacja nie może być pusta. This type of medium is attached directly or indirectly, preserved when taking snapshots. - Ten typ nośnika jest podłączony bezpośrednio lub pośrednio, używany podczas robienia migawek. + Ten typ nośnika jest podłączony bezpośrednio lub pośrednio, używany podczas robienia migawek. This type of medium is attached indirectly, changes are wiped out the next time the virtual machine is started. - Ten typ nośnika jest podłączony pośrednio, zmiany są kasowane kiedy wirtualna maszyna startuje kolejnym razem. + Ten typ nośnika jest podłączony pośrednio, zmiany są kasowane kiedy wirtualna maszyna startuje kolejnym razem. This type of medium is attached directly, ignored when taking snapshots. - Ten typ nośnika jest podłączony bezpośrednio, ignorowany podczas robienia migawek. + Ten typ nośnika jest podłączony bezpośrednio, ignorowany podczas robienia migawek. This type of medium is attached directly, allowed to be used concurrently by several machines. - Ten typ nośnika jest podłączony bezpośrednio, może być używany równocześnie przez kilka maszyn. + Ten typ nośnika jest podłączony bezpośrednio, może być używany równocześnie przez kilka maszyn. This type of medium is attached directly, and can be used by several machines. - Ten typ nośnika jest podłączony bezpośrednio i może być używany przez kilka maszyn. + Ten typ nośnika jest podłączony bezpośrednio i może być używany przez kilka maszyn. This type of medium is attached indirectly, so that one base medium can be used for several VMs which have their own differencing medium to store their modifications. - Ten typ nośnika jest podłączony pośrednio, więc jeden nośnik może być używany przez kilka maszyn, które posiadają swoje własne zróżnicowane nośniki, by przechowywać swoje modyfikacje. + Ten typ nośnika jest podłączony pośrednio, więc jeden nośnik może być używany przez kilka maszyn, które posiadają swoje własne zróżnicowane nośniki, by przechowywać swoje modyfikacje. UIMediumItem Current extension (*.%1) - + Obecne rozszerzenie (*.%1) Choose the location of this medium - + Wybierz lokalizację tego nośnika %1, %2: %3, %4: %5 col.1 text, col.2 name: col.2 text, col.3 name: col.3 text - + %1, %2: %3, %4: %5 Format: - Format: + Format: Storage details: - Szczegóły pamięci: + Szczegóły pamięci: Attached to: - + Podłączone do: Encrypted with key: - + Zaszyfrowano kluczem: UUID: - UUID: + UUID: <i>Not&nbsp;Attached</i> - <i>Niepodłączony</i> + <i>Niepodłączony</i> <i>Not&nbsp;Encrypted</i> - <i>Nie&nbsp;zaszyfrowane</i> + <i>Nie&nbsp;zaszyfrowane</i> -- no info - -- + -- Removing medium... @@ -12759,11 +12815,11 @@ Moving medium ... - + Przenoszenie nośnika ... Removing medium ... - + Usuwanie nośnika ... @@ -12831,71 +12887,71 @@ Name - Nazwa + Nazwa Virtual Size - Rozmiar wirtualny + Rozmiar wirtualny Actual Size - Rozmiar aktualny + Rozmiar aktualny Size - Rozmiar + Rozmiar Checking accessibility - Sprawdzanie dostępności + Sprawdzanie dostępności Virtual Media Manager - Menedżer nośników wirtualnych + Menedżer nośników wirtualnych Reset - Zresetuj + Zresetuj Apply - + Zastosuj Close - Zamknij + Zamknij Reset changes in current medium details - + Zresetuj zmiany w obecnych szczegółach nośnika Apply changes in current medium details - + Zastosuj zmiany w obecnych szczegółach nośnika Close dialog without saving - + Zamknij okno bez zapisania Reset Changes (%1) - + Zresetuj zmiany (%1) Apply Changes (%1) - + Zastosuj zmiany (%1) Close Window (%1) - + Zamknij okno (%1) Current extension (*.%1) - + Obecne rozszerzenie (*.%1) Choose the location of this medium - + Wybierz lokalizację tego nośnika Size: @@ -12923,128 +12979,128 @@ Moving medium ... - + Przenoszenie nośnika... Resizing medium ... - + Zmiana rozmiaru nośnika... UIMediumSearchWidget Search By Name - + Szukaj po nazwie Search By UUID - + Szukaj po UUID Select the search type - + Wybierz typ wyszukania UIMediumSelector &Add... - &Dodaj... + &Dodaj... Add Disk Image - + Dodaj obraz dysku Add existing disk image file - + Dodaj istniejący plik obrazu dysku &Create... - + &Stwórz... Create Disk Image - + Stwórz obraz dysku Create new disk image file - + Stwórz nowy plik obrazu dysku &Refresh - &Odśwież + &Odśwież Refresh Disk Image Files (%1) - + Odśwież pliki obrazów dysku (%1) Refresh the list of disk image files - Odświeża listę nośników + Odświeża listę nośników Choose - + Wybierz Name - Nazwa + Nazwa Virtual Size - Rozmiar wirtualny + Rozmiar wirtualny Actual Size - Rozmiar aktualny + Rozmiar aktualny Medium - + Nośnik Expand All - + Rozwiń wszystkie Collapse All - + Zwiń wszystkie Cancel - Anuluj + Anuluj Leave Empty - + Pozostaw pusty Optical Disk Selector - + Wybór dysku optycznego Floppy Disk Selector - + Wybór dyskietki Hard Disk Selector - + Wybór dysku twardego Virtual Medium Selector - + Wybór wirtualnego nośnika UIMediumSizeEditor <nobr>%1 (%2 B)</nobr> - <nobr>%1 (%2 B)</nobr> + <nobr>%1 (%2 B)</nobr> Holds the size of this medium. - + Zawiera rozmiar tego nośnika. @@ -13110,19 +13166,19 @@ Toggle menu %1 - + Przełącz menu %1 Popup menu %1 - + Wyskakujące menu %1 Virtual Screen Remap - + Mapowanie wirtualnego ekranu Virtual Screen Rescale - + Reskalowanie wirtualnego ekranu @@ -14914,27 +14970,27 @@ <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>but the SHA-256 checksum verification failed.</p><p>Please do the download, installation and verification manually.</p> - <p><b><nobr>%1</nobr></b> został pomyślnie pobrany z <nobr><a href="%1">%1</a></nobr> i zapisany lokalnie jako <nobr><b>%2</b>, </nobr>ale nie powiodła się weryfikacja sum kontrolnych SHA-256.</p><p>Proszę ręcznie pobrać, zainstalować i zweryfikować.</p> + <p><b><nobr>%1</nobr></b> został pomyślnie pobrany z <nobr><a href="%2">%2</a></nobr> i zapisany lokalnie jako <nobr><b>%3</b>, </nobr>ale nie powiodła się weryfikacja sum kontrolnych SHA-256.</p><p>Proszę ręcznie pobrać, zainstalować i zweryfikować.</p> <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=5><tr><td><b>Name:&nbsp;&nbsp;</b></td><td>%1</td></tr><tr><td><b>Version:&nbsp;&nbsp;</b></td><td>%2</td></tr><tr><td><b>Description:&nbsp;&nbsp;</b></td><td>%3</td></tr></table></p> - <p>Zamierzasz zainstalować pakiet rozszerzeń VirtualBox. Pakiety rozszerzeń uzupełniają funkcjonalność VirtualBoxa, ale mogą zawierać oprogramowanie, które może być potencjalnie szkodliwe dla twojego systemu.Prosimy o zapoznanie się z opisem poniżej i kontynuować, tylko jeśli otrzymało się pakiet z zaufanego źródła. </p><p><table cellpadding=0 cellspacing=5><tr><td><b>Nazwa:&nbsp;&nbsp;</b></td><td>%1</td></tr><tr><td><b>Wersja:&nbsp;&nbsp;</b></td><td>%2</td></tr><tr><td><b>Opis:&nbsp;&nbsp;</b></td><td>%3</td></tr></table></p> + <p>Zamierzasz zainstalować pakiet rozszerzeń VirtualBox. Pakiety rozszerzeń uzupełniają funkcjonalność VirtualBoxa, ale mogą zawierać oprogramowanie, które może być potencjalnie szkodliwe dla twojego systemu.Prosimy o zapoznanie się z opisem poniżej i kontynuować, tylko jeśli otrzymało się pakiet z zaufanego źródła. </p><p><table cellpadding=0 cellspacing=5><tr><td><b>Nazwa:&nbsp;&nbsp;</b></td><td>%1</td></tr><tr><td><b>Wersja:&nbsp;&nbsp;</b></td><td>%2</td></tr><tr><td><b>Opis:&nbsp;&nbsp;</b></td><td>%3</td></tr></table></p> <p>An older version of the extension pack is already installed, would you like to upgrade? <p>%1</p><p><table cellpadding=0 cellspacing=5><tr><td><b>Name:&nbsp;&nbsp;</b></td><td>%2</td></tr><tr><td><b>New Version:&nbsp;&nbsp;</b></td><td>%3</td></tr><tr><td><b>Current Version:&nbsp;&nbsp;</b></td><td>%4</td></tr><tr><td><b>Description:&nbsp;&nbsp;</b></td><td>%5</td></tr></table></p> - <p>Starsza wersja pakietu rozszerzeń jest już zainstalowana, czy chcesz zaktualizować? <p>%1</p><p><table cellpadding=0 cellspacing=5><tr><td><b>Nazwa:&nbsp;&nbsp;</b></td><td>%2</td></tr><tr><td><b>Nowa wersja:&nbsp;&nbsp;</b></td><td>%3</td></tr><tr><td><b>Aktualna wersja:&nbsp;&nbsp;</b></td><td>%4</td></tr><tr><td><b>Opis:&nbsp;&nbsp;</b></td><td>%5</td></tr></table></p> + <p>Starsza wersja pakietu rozszerzeń jest już zainstalowana, czy chcesz zaktualizować? <p>%1</p><p><table cellpadding=0 cellspacing=5><tr><td><b>Nazwa:&nbsp;&nbsp;</b></td><td>%2</td></tr><tr><td><b>Nowa wersja:&nbsp;&nbsp;</b></td><td>%3</td></tr><tr><td><b>Aktualna wersja:&nbsp;&nbsp;</b></td><td>%4</td></tr><tr><td><b>Opis:&nbsp;&nbsp;</b></td><td>%5</td></tr></table></p> <p>An newer version of the extension pack is already installed, would you like to downgrade? <p>%1</p><p><table cellpadding=0 cellspacing=5><tr><td><b>Name:&nbsp;&nbsp;</b></td><td>%2</td></tr><tr><td><b>New Version:&nbsp;&nbsp;</b></td><td>%3</td></tr><tr><td><b>Current Version:&nbsp;&nbsp;</b></td><td>%4</td></tr><tr><td><b>Description:&nbsp;&nbsp;</b></td><td>%5</td></tr></table></p> - <p>Nowsza wersja pakietu rozszerzeń jest już zainstalowana, czy chcesz zdezaktualizować? <p>%1</p><p><table cellpadding=0 cellspacing=5><tr><td><b>Nazwa:&nbsp;&nbsp;</b></td><td>%2</td></tr><tr><td><b>Nowa wersja:&nbsp;&nbsp;</b></td><td>%3</td></tr><tr><td><b>Aktualna wersja:&nbsp;&nbsp;</b></td><td>%4</td></tr><tr><td><b>Opis:&nbsp;&nbsp;</b></td><td>%5</td></tr></table></p> + <p>Nowsza wersja pakietu rozszerzeń jest już zainstalowana, czy chcesz zdezaktualizować? <p>%1</p><p><table cellpadding=0 cellspacing=5><tr><td><b>Nazwa:&nbsp;&nbsp;</b></td><td>%2</td></tr><tr><td><b>Nowa wersja:&nbsp;&nbsp;</b></td><td>%3</td></tr><tr><td><b>Aktualna wersja:&nbsp;&nbsp;</b></td><td>%4</td></tr><tr><td><b>Opis:&nbsp;&nbsp;</b></td><td>%5</td></tr></table></p> <p>The extension pack is already installed with the same version, would you like reinstall it? <p>%1</p><p><table cellpadding=0 cellspacing=5><tr><td><b>Name:&nbsp;&nbsp;</b></td><td>%2</td></tr><tr><td><b>Version:&nbsp;&nbsp;</b></td><td>%3</td></tr><tr><td><b>Description:&nbsp;&nbsp;</b></td><td>%4</td></tr></table></p> - <p>Pakiet rozszerzeń jest już zainstalowany w tej samej wersji, czy chcesz go przeinstalować? <p>%1</p><p><table cellpadding=0 cellspacing=5><tr><td><b>Nazwa:&nbsp;&nbsp;</b></td><td>%2</td></tr><tr><td><b>Wersja:&nbsp;&nbsp;</b></td><td>%3</td></tr><tr><td><b>Opis:&nbsp;&nbsp;</b></td><td>%4</td></tr></table></p> + <p>Pakiet rozszerzeń jest już zainstalowany w tej samej wersji, czy chcesz go przeinstalować? <p>%1</p><p><table cellpadding=0 cellspacing=5><tr><td><b>Nazwa:&nbsp;&nbsp;</b></td><td>%2</td></tr><tr><td><b>Wersja:&nbsp;&nbsp;</b></td><td>%3</td></tr><tr><td><b>Opis:&nbsp;&nbsp;</b></td><td>%4</td></tr></table></p> Unknown option <b>%1</b>. - + Nieznana opcja <b>%1</b>. <b>%1</b> is an option for the VirtualBox VM runner (VirtualBoxVM) application, not the VirtualBox Manager. @@ -14943,31 +14999,31 @@ <p>You must specify a machine to start, using the command line.</p><p>%1</p> There will be a usage text passed as argument. - + <p>Musisz określić maszynę do uruchomienia, używając wiersza poleceń.</p><p>%1</p> <tr><td>Usage: VirtualBoxVM --startvm &lt;name|UUID&gt;</td></tr><tr><td>Starts the VirtualBox virtual machine with the given name or unique identifier (UUID).</td></tr> - + <tr><td>Użycie: VirtualBoxVM --startvm &lt;nazwa|UUID&gt;</td></tr><tr><td>Uruchamia maszynę wirtualną o podanej nazwie lub unikalnym identyfikatorze (UUID).</td></tr> <p>You are about to start all of the following virtual machines:</p><p><b>%1</b></p><p>This could take some time and consume a lot of host system resources. Do you wish to proceed?</p> - + <p>Zamierzasz uruchomić wszystkie z następujących maszyn wirtualnych:</p><p><b>%1</b></p><p>Może to zająć trochę czasu i pochłonąć dużo zasobów systemu gospodarza. Czy chcesz kontynuować?</p> Failed to move the virtual machine <b>%1</b>. - + Nie udało się przenieść maszyny wirtualnej <b>%1</b>. Failed to change the snapshot <b>%1</b> of the virtual machine <b>%2</b>. - + Nie udało się zmienić migawki <b>%1</b> maszyny wirtualnej <b>%2</b>. Can't find snapshot with ID=<b>%1</b>. - + Nie można odnaleźć migawki z ID=<b>%1</b>. Can't acquire snapshot attributes. - + Nie można uzyskać atrybutów migawki. Failed to move the storage unit of the disk image <b>%1</b> to <b>%2</b>. @@ -14975,7 +15031,7 @@ <p>Error changing the description of the disk image <b>%1</b>.</p> - + <p>Wystąpił błąd podczas zmiany opisu obrazu dysku <b>%1</b>.</p> <p>The changes you requested require this disk to be released from the machines it is attached to.</p><p>Are you sure you want to release the disk image file <nobr><b>%1</b></nobr>?</p><p>This will detach it from the following virtual machine(s): <b>%2</b>.</p> @@ -15015,11 +15071,11 @@ Failed to acquire DHCP server parameter. - + Nie udało się uzyskać parametrów serwera DHCP. Failed to save DHCP server parameter. - + Nie udało się zapisać parametrów serwera DHCP. Failed to acquire cloud provider manager. @@ -15031,7 +15087,7 @@ Failed to find cloud provider with following uuid: <b>%1</b>. - + Nie udało się odnaleźć dostawcy usług chmurowych o następującym UUID: <b>%1</b>. Failed to acquire cloud provider parameter. @@ -15039,23 +15095,23 @@ Failed to find cloud profile with following name: <b>%1</b>. - + Nie udało się znaleźć profilu chmury o następujacej nazwie: <b>%1</b>. Failed to create cloud profile. - + Nie udało się utworzyć profilu chmury. Failed to save cloud profiles. - + Nie udało się zapisać profilu chmury. Failed to import cloud profiles. - + Nie udało się zaimportować profili chmury. Failed to acquire cloud profile parameter. - + Nie udało się uzyskać parametru profilu klienta. Failed to assign cloud profile parameter. @@ -15063,55 +15119,55 @@ Failed to create cloud client. - + Nie udało się utworzyć klienta chmury. Failed to acquire cloud client parameter. - + Nie udało się uzyskać parametru klienta chmury. <p>Do you want to remove the cloud profile <nobr><b>%1</b>?</nobr></p> - + <p>Czy chcesz usunąć profil chmury <nobr><b>%1</b>?</nobr></p> <p>Do you want to import cloud profiles from external files?</p><p>VirtualBox cloud profiles will be overwritten and their data will be lost.</p> - + <p>Czy chcesz zaimportować profile chmur ze zewnętrznych plików?</p><p>Profile chmur VirtualBox'a zostaną nadpisane i ich dane zostaną utracone.</p> Import - Importuj + Importuj Failed to create the hard disk storage <nobr><b>%1</b>.</nobr> FAT file systems have 4GB file size limit. - + Nie udało się utworzyć pamięci dysku twardego <nobr><b>%1</b>.</nobr> Limit rozmiaru pliku dla systemów plików FAT to 4GB. Failed to create the virtual disk image storage <nobr><b>%1</b>.</nobr> - + Nie udało się utworzyć pamięci wirtualnego obrazu dysku <nobr><b>%1</b>.</nobr> Failed to enable recording for the virtual machine <b>%1</b>. - + Nie udało się włączyć nagrywania dla maszyny wirtualnej <b>%1</b>. Failed to disable recording for the virtual machine <b>%1</b>. - + Nie udało się wyłączyć nagrywania dla maszyny wirtualnej <b>%1</b>. Failed to enable the audio adapter output for the virtual machine <b>%1</b>. - + Nie udało się włączyć wyjścia karty dźwiękowej dla maszyny wirtualnej <b>%1</b>. Failed to disable the audio adapter output for the virtual machine <b>%1</b>. - + Nie udało się wyłączyć wyjścia karty dźwiękowej dla maszyny wirtualnej <b>%1</b>. Failed to enable the audio adapter input for the virtual machine <b>%1</b>. - + Nie udało się włączyć wejścia karty dźwiękowej dla maszyny wirtualnej <b>%1</b>. Failed to disable the audio adapter input for the virtual machine <b>%1</b>. - + Nie udało się wyłączyć wejścia karty dźwiękowej dla maszyny wirtualnej <b>%1</b>. <p>Could not insert the <b>%1</b> disk image file into the virtual machine <b>%2</b>, as the machine has no optical drives. Please add a drive using the storage page of the virtual machine settings window.</p> @@ -15119,71 +15175,71 @@ Failed to acquire machine parameter. - + Nie udało się uzyskać parametru maszyny. <p>This controller has optical devices attached. You have requested storage bus change to type which doesn't support optical devices.</p><p>If you proceed optical devices will be removed.</p> - + <p>Do tego kontrolera są podłączone urządzenia optyczne. Zażądałeś zmiany magistrali pamięci na typ, który nie obsługuje urządzeń optycznych.</p><p>Jeśli będziesz kontynuować, urządzenia optyczne zostaną usunięte.</p> <p>This controller has devices attached. You have requested storage bus change to type which supports smaller amount of attached devices.</p><p>If you proceed excessive devices will be removed.</p> - + <p>Do tego kontrolera są podłączone urządzenia. Zażądałeś zmiany magistrali pamięci na typ, który obsługuje mniejszą liczbę podłączonych urządzeń.</p><p>Jeśli będziesz kontynuować, nadmierna ilość urządzeń zostanie usunięta.</p> Failed to change the attribute of the virtual machine <b>%1</b>. - + Nie udało się zmienić atrybutu maszyny wirtualnej <b>%1</b>. Failed to change graphics adapter attribute. - + Nie udało się zmienić atrybutu adaptera graficznego. Failed to change audio adapter attribute. - + Nie udało się zmienić atrybutu karty dźwiękowej. Failed to change network adapter attribute. - + Nie udało się zmienić atrybutu karty sieciowej. Failed to open the medium with following ID: <nobr><b>%1</b></nobr>. - + Nie udało się otworzyć nośnika z następującym ID: <nobr><b>%1</b></nobr>. Failed to acquire attachment parameter. - + Nie udało się uzyskać parametru załącznika. Failed to acquire medium attribute. - + Nie udało się uzyskać parametrów nośnika. Failed to create cloud machine. - + Nie udało się utworzyć maszyny wirtualnej. Failed to assign form value. - + Nie udało się przypisać wartości formularza. <p>Cannot create a virtual appliance.</p> - + <p>Nie można utworzyć urządzenia wirtualnego.</p> <p>Cannot create a virtual system description.</p> - + <p>Nie można utworzyć opisu systemu wirtualnego.</p> <p>Cannot add a virtual system description value.</p> - + <p>Nie można dodać wartości opisu systemu wirtualnego.</p> <p>Cannot acquire a virtual system description property.</p> - + <p>Nie można uzyskać opisu właściwości systemu wirtualnego.</p> <p>The virtual machine execution ran into a non-fatal problem as described below. We suggest that you take appropriate action to prevent the problem from recurring.</p> - + <p>Maszyna wirtualna napotkała problem opisany poniżej. sugerujemy podjęcie akcji, aby zapobiec powrotu problemu w przyszłości.</p> @@ -15297,58 +15353,58 @@ Name: - + Nazwa: Machine Folder: - + Folder maszyny: UINetworkAttachmentEditor &Attached to: - &Podłączona do: + &Podłączona do: &Name: - &Nazwa: + &Nazwa: Not selected network adapter name - Nie wybrano + Nie wybrano Selects the network adapter on the host system that traffic to and from this network card will go through. - Pozwala wybrać kartę sieciową systemu gospodarza, która przekierowuje ruch. + Pozwala wybrać kartę sieciową systemu gospodarza, która przekierowuje ruch. Holds the name of the internal network that this network card will be connected to. You can create a new internal network by choosing a name which is not used by any other network cards in this virtual machine or others. - Przechowuje nazwę wewnętrznej sieci, do której zostanie karta podłączona. Możesz utworzyć nową wewnętrzną sieć, wybierając nazwę, która nie jest używana przez inną kartę sieciową w tej lub innej wirtualnej maszynie. + Przechowuje nazwę wewnętrznej sieci, do której zostanie karta podłączona. Możesz utworzyć nową wewnętrzną sieć, wybierając nazwę, która nie jest używana przez inną kartę sieciową w tej lub innej wirtualnej maszynie. Selects the virtual network adapter on the host system that traffic to and from this network card will go through. You can create and remove adapters using the global network settings in the virtual machine manager window. - Pozwala wybrać kartę sieciową systemu gospodarza, która przekierowuje ruch. Możesz utworzyć lub usunąć kartę, używając globalnych ustawień sieci w oknie menedźera wirtualnej maszyny. + Pozwala wybrać kartę sieciową systemu gospodarza, która przekierowuje ruch. Możesz utworzyć lub usunąć kartę, używając globalnych ustawień sieci w oknie menedźera wirtualnej maszyny. Selects the driver to be used with this network card. - Pozwala wybrać sterownik karty sieciowej. + Pozwala wybrać sterownik karty sieciowej. 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. - Przechowuje nazwę sieci NAT, do której karta jest podłączona. Możesz utworzyć i usunąć sieci, używając globalnych ustawień sieci w okno menedżera wirtualnej maszyny. + Przechowuje nazwę sieci NAT, do której karta jest podłączona. Możesz utworzyć i usunąć sieci, używając globalnych ustawień sieci w okno menedżera wirtualnej maszyny. (experimental) Holds the name of the cloud network that this network card will be connected to. You can add and remove cloud networks using the global network settings in the virtual machine manager window. - + (opcja eksperymentalna)Przechowuje nazwę sieci w chmurze, do której karta jest podłączona. Możesz utworzyć i usunąć sieci, używając globalnych ustawień sieci w okno menedżera wirtualnej maszyny. UINetworkManagerDialog Network Operations Manager - Menedźer operacji sieciowych + Menedżer operacji sieciowych There are no active network operations. @@ -16194,11 +16250,11 @@ UIPopupPane <p><b>Details:</b> - + <p><b>Szczegóły:</b> <p><b>Details:</b> (%1 of %2) - + <p><b>Szczegóły:</b> (%1 z %2) @@ -16296,38 +16352,38 @@ UIScaleFactorEditor Max - + Max Min - + Min All Monitors - + Wszystkie monitory Monitor %1 - + Monitor %1 Controls the guest screen scale factor. - Kontroluje współczynnik skali ekranu gościa. + Kontroluje współczynnik skali ekranu gościa. UIScreenshotViewer Screenshot of %1 (%2) - Zrzut ekranu %1 (%2) + Zrzut ekranu %1 (%2) Click to view non-scaled screenshot. - Kliknij aby wyświetlić nieskalowany zrzut ekranu. + Kliknij, aby wyświetlić nieskalowany zrzut ekranu. Click to view scaled screenshot. - Kliknij aby wyświetlić skalowany zrzut ekranu. + Kliknij, aby wyświetlić skalowany zrzut ekranu. @@ -16370,7 +16426,7 @@ %1 status-bar indicator like 'hard-disk status-bar indicator' - + %1 wskaźnik paska stanu @@ -16452,7 +16508,7 @@ Allows to navigate through Global Property categories - + Pozwala na nawigację przez kategorie ustawień globalnych @@ -16527,7 +16583,7 @@ Allows to navigate through VM Settings categories - + Pozwala na nawigację przez kategorie ustawień maszyny wirtualnej @@ -16545,79 +16601,79 @@ UISnapshotDetailsWidget &Attributes - + &Atrybuty &Information - + &Informacje &Name: - &Nazwa: + &Nazwa: &Description: - &Opis: + &Opis: Holds the snapshot name. - + Zawiera nazwę migawki. Holds the snapshot description. - + Zawiera opis migawki. Apply - + Zastosuj Reset - Zresetuj + Zresetuj Apply changes in current snapshot details - + Zastosuj zmiany szczegółów migawki Reset changes in current snapshot details - + Zresetuj zmiany szczegółów migawki Apply Changes (%1) - + Zastosuj zmiany (%1) Reset Changes (%1) - + Zresetuj zmiany (%1) Click to enlarge the screenshot. - Kliknij aby powiększyć zrzut ekranu. + Kliknij, aby powiększyć zrzut ekranu. Snapshot name is empty - + Nazwa migawki jest pusta Enter a name for the new snapshot... - + Wprowadź nazwę dla nowej migawki... Enter a name for this snapshot... - + Wprowadź nazwę dla tej migawki... Take - + Zrób Take snapshot on the basis of current machine state - + Zrób migawkę na podstawie aktualnego stanu maszyny Take Snapshot (%1) - + Zrób migawkę (%1) @@ -16625,55 +16681,55 @@ Current State (changed) Current State (Modified) - Aktualny stan (zmieniony) + Aktualny stan (zmieniony) Current State Current State (Unmodified) - Aktualny stan + Aktualny stan The current state differs from the state stored in the current snapshot - Aktualny stan różni się od stanu zapisanego w aktualnej migawce + Aktualny stan różni się od stanu zapisanego w aktualnej migawce The current state is identical to the state stored in the current snapshot - Aktualny stan jest identyczny ze stanem zapisanym w aktualnej migawce + Aktualny stan jest identyczny ze stanem zapisanym w aktualnej migawce %1 (%2 ago) date time (how long ago) - + %1 (%2 temu) %1 since %2 Current State (time or date + time) - %1 od %2 + %1 od %2 current snapshot - + obecna online snapshot - + online offline snapshot - + offline Taken at %1 Snapshot (time) - Zrobiona o %1 + Zrobiona o %1 Taken on %1 Snapshot (date + time) - Zrobiona %1 + Zrobiona %1 @@ -16713,7 +16769,7 @@ Contains the snapshot tree of the current virtual machine - + Zawiera drzewo migawek bieżącej maszyny wirtualnej &Delete @@ -16738,51 +16794,51 @@ Name snapshot - Nazwa + Nazwa Taken snapshot - + Utworzona Snapshot %1 - Migawka %1 + Migawka %1 UISoftKeyboard Layout Editor - + Edytor układu Return Back to Layout List - + Powróć do listy układów Back to Layout List - + Wróć do listy układów Physical Layout - + Układ fizyczny English Name - + Nazwa angielska Name of the Layout in English - + Nazwa układu w języku angielskim Native Language Name - + Ojczysta nazwa języka Name of the Layout in the native Language - + Nazwa układu w języku ojczystym Scan Code @@ -16790,15 +16846,15 @@ The scan code the key produces. Not editable - + Para sygnałów "scan code" generowana przez klawisz. Nieedytowalne Position - + Pozycja The physical position of the key. Not editable - + Fizyczna pozycja klawisza. Nieedytowalna Base @@ -16806,15 +16862,15 @@ Shift - + Shift AltGr - + AltGr ShiftAltGr - + ShiftAltGr Captions @@ -16822,222 +16878,222 @@ Selected Key - + Wybrany klawisz Use the selected layout - + Użyj wybranego układu Edit the selected layout - + Edytuj wybrany układ Delete the selected layout - + Usuń wybrany układ Copy the selected layout - + Skopiuj wybrany układ Save the selected layout into File - + Zapisz wybrany układ do pliku Layout List - + Lista układów Close the layout list - + Zamknij listę układów Web browser go back - + Przeglądarka internetowa - Idź wstecz Web browser go the home page - + Przeglądarka internetowa - Idź do strony domowej Web browser go forward - + Przeglądarka internetowa - Idź naprzód Web browser reload the current page - + Przeglądarka internetowa - przeładuj stronę Web browser stop loading the page - + Przeglądarka internetowa - zatrzymaj przeładowanie strony Web browser search - + Przeglądarka internetowa - wyszukaj Jump back to previous media track - + Wróć do poprzedniego utworu Jump to next media track - + Zmień na następny utwór Stop playing - + Zatrzymaj odtwarzanie Play or pause playing - + Odtwórz lub wstrzymaj odtwarzanie Start email application - + Uruchom aplikację email Start calculator - + Uruchom kalkulator Show 'My Computer' - + Pokaż 'Mój Komputer' Show Media folder - + Pokaż folder mediów Mute - + Wycisz Volume up - + Głośniej Volume down - + Ciszej Error! Could not create folder under - + Błąd! Nie można utworzyć folderu pod Provide a file name - + Podaj nazwę pliku is an invalid file name - + jest nieprawidłową nazwą pliku is saved - + jest zapisany Copy - Kopiuj + Kopia This will delete the keyboard layout file as well. Proceed? - + Spowoduje to również usunięcie pliku układu klawiatury. Kontyunować? The file - + Plik has been deleted - + został usunięty Deleting the file - + Usuwanie pliku has failed - + nie powiodło się Settings - Ustawienia + Ustawienia Reset the keyboard and release all keys - + Zresetuj klawiaturę i zwolnij wszystkie klawisze Click to change the color. - + Kliknij, aby zmienić kolor. This color theme is not editable. - + Ten motyw kolorów nie jest do edycji. Keyboard Settings - + Ustawienia klawiatury Hide NumPad - + Ukryj klawiaturę numeryczną Hide OS/Menu Keys - + Ukryj klawisze OS/Menu Hide Multimedia Keys - + Ukryj klawisze multimedialne Color Themes - + Motywy kolorów Button Background Color - + Kolor tła klawiszy Button Font Color - + Kolor czcionki klawiszy Button Hover Color - + Kolor przycisku po najechaniu kursorem Button Edit Color - + Kolor przycisku podczas edycji Pressed Button Font Color - + Kolor czcionki przycisku podczas naciśnięcia Soft Keyboard - + Klawiatura ekranowa <p>Following layouts are edited/copied but not saved:</p>%1<p>Closing this dialog will cause loosing the changes. Proceed?</p> - + <p>Następujące układy zostały edytowane/skopiowane, ale niezostały zapisane:</p>%1<p>Zamknięcie tego okna dialogowego spowoduje utratę zmian. Kontynuować?</p> Layout - + Układ The file will be saved under:<br> - + Plik zostanie zapisany w:<br> UIStatusBarEditorWidget <nobr><b>Click</b> to toggle indicator presence.</nobr><br><nobr><b>Drag&Drop</b> to change indicator position.</nobr> - <nobr><b>Kliknij</b>, by przełączyć obecność wskaźnika.</nobr><br><nobr><b>Przeciągnij i upuść</b> , by zmienić pozycję wskaźnika.</nobr> + <nobr><b>Kliknij</b>, by przełączyć obecność wskaźnika.</nobr><br><nobr><b>Przeciągnij i &upuść</b> , by zmienić pozycję wskaźnika.</nobr> Close @@ -17052,19 +17108,19 @@ UITakeSnapshotDialog Take Snapshot of Virtual Machine - Tworzenie migawki maszyny wirtualnej + Tworzenie migawki maszyny wirtualnej Snapshot &Name - &Nazwa migawki + &Nazwa migawki Snapshot &Description - Opis &migawki + Opis &migawki Warning: You are taking a snapshot of a running machine which has %n immutable image(s) attached to it. As long as you are working from this snapshot the immutable image(s) will not be reset to avoid loss of data. - + Ostrzeżenie: robiona jest migawka działającej maszyny wirtualnej, która ma dołączony %n niezmienny obraz. Podczas pracy z tą migawką ten niezmienny obraz nie zostanie zresetowany aby zapobiec utracie danych. Ostrzeżenie: robiona jest migawka działającej maszyny wirtualnej, która ma dołączone %n niezmienne obrazy. Podczas pracy z tą migawką te niezmienne obrazy nie zostaną zresetowane aby zapobiec utracie danych. Ostrzeżenie: robiona jest migawka działającej maszyny wirtualnej, która ma dołączonych %n niezmiennych obrazów. Podczas pracy z tą migawką te niezmienne obrazy nie zostaną zresetowane aby zapobiec utracie danych. @@ -17072,7 +17128,7 @@ Snapshot %1 - Migawka %1 + Migawka %1 @@ -17102,38 +17158,38 @@ UIToolsModel Welcome - + Powitanie Media - + Nośniki Network - + Sieć Cloud - + Chmura Details - + Szczegóły Snapshots - Migawki + Migawki Logs - + Logi UIToolsView Contains a list of VirtualBox tools - + Zawiera listę narzędzi VirtualBox @@ -17141,52 +17197,52 @@ %1 col.1 text - %1 + %1 %1, Active col.1 text, col.1 state - + %1, Aktywne <nobr>Vendor ID: %1</nobr> USB filter tooltip - + <nobr>ID dostawcy: %1</nobr> <nobr>Product ID: %2</nobr> USB filter tooltip - + <nobr>ID produktu: %2</nobr> <nobr>Revision: %3</nobr> USB filter tooltip - + <nobr>Wersja: %3</nobr> <nobr>Product: %4</nobr> USB filter tooltip - <nobr>Produkt: %4</nobr> + <nobr>Produkt: %4</nobr> <nobr>Manufacturer: %5</nobr> USB filter tooltip - + <nobr>Producent: %5</nobr> <nobr>Serial No.: %1</nobr> USB filter tooltip - <nobr>Nr seryjny: %1</nobr> + <nobr>Nr seryjny: %1</nobr> <nobr>Port: %1</nobr> USB filter tooltip - <nobr>Port: %1</nobr> + <nobr>Port: %1</nobr> <nobr>State: %1</nobr> USB filter tooltip - <nobr>Stan: %1</nobr> + <nobr>Stan: %1</nobr> @@ -17467,131 +17523,131 @@ General - Ogólne + Ogólne System - System + System Display - Ekran + Ekran Storage - Pamięć + Pamięć Audio - Dźwięk + Dźwięk Network - + Sieć Serial Ports - Porty szeregowe + Porty szeregowe USB - USB + USB Shared Folders - + Współdzielone foldery Performance &Monitor - + Monitor &wydajności No guest additions! This metric requires guest additions to work properly. - + Brak dodatków gościa! Ta metryka wymaga dodatków gościa, aby działać poprawnie. Reset - Zresetuj + Zresetuj Show Pie Chart - + Pokaż wykres kołowy Draw Area Chart - + Rysuj wykres warstwowy Seconds - + Sekund CPU Load - + Użycie CPU Guest Load - + Użycie przez gościa VMM Load - + Użycie przez VMM RAM Usage - + Użycie RAM Total - + Całkowite Free - + Wolne Used - + Używane Network Rate - + Użycie sieci Receive Rate - + Szybkość odbierania Transmit Rate - + Szybkośc wysyłania Total Received - + Otrzymano łącznie Total Transmitted - + Wysłano łącznie Disk IO Rate - + Użycie dysku Write Rate - + Szybkość zapisu Read Rate - + Szybkość odczytu Total Written - + Zapis całkowity Total Read - + Odczyt całkowity VM Exits @@ -17599,43 +17655,43 @@ Current - + Obecnie Runtime Attributes - Parametry maszyny + Parametry maszyny Screen Resolution - Rozdzielczość ekranu + Rozdzielczość ekranu VM Uptime - Czas pracy wirtualnej maszyny + Czas pracy wirtualnej maszyny Clipboard Mode - Tryb schowka + Tryb schowka Drag and Drop Mode - Tryb przeciągnij i upuść + Tryb przeciągnij i upuść VM Execution Engine - + Silnik wykonawczy VM Nested Paging - Zagnieżdżone stronicowanie + Zagnieżdżone stronicowanie Unrestricted Execution - Nieograniczone wykorzystanie + Nieograniczone wykorzystanie Paravirtualization Interface - Interfejs parawirtualizacji + Interfejs parawirtualizacji Inactive @@ -17643,71 +17699,71 @@ Guest Additions - + Dodatki gościa(Guest Additions) Guest OS Type - Typ goszczonego systemu operacyjnego + Typ goszczonego systemu operacyjnego Remote Desktop Server Port - + Port serwera pulpitu zdalnego &Guest Control - + &Sterowanie gościem turned off Screen - + Wyłączony Active Nested Paging - + Aktywne Inactive Nested Paging - Nieaktywne + Nieaktywne Active Unrestricted Execution - + Aktywne Inactive Unrestricted Execution - Nieaktywne + Nieaktywne Not Available VRDE Port - + Niedostępny not set Execution Engine - + nie ustawiony Not Detected Guest OS Type - + Nie wykryty Not Detected Guest Additions Version - + Nie wykryto UIVMListView Inaccessible - + Niedostępna @@ -17793,42 +17849,42 @@ UIVMLogViewerDialog %1 - Log Viewer - + %1 - Przeglądarka logów UIVMLogViewerWidget Delete the current bookmark - + Usuń bieżącą zakładkę Delete all bookmarks - + Usuń wszystkie zakładki Log Viewer - Przeglądarka logów + Przeglądarka logów Close - Zamknij + Zamknij Select or enter a term which will be used in filtering the log text - + Wybierz lub wprowadź termin, który będzie używany podczas filtrowania tekstu logu Add the filter term to the set of filter terms - + Dodaj termin filtru do zestawu terminów filtru Showing %1/%2 - + Pokazuję %1/%2 The filter terms list, select one to remove or click the button on the right side to remove them all - + Lista terminów filtrowania, wybierz któryś do usunięcia lub kliknij przycisk po prawej stronie, aby usunąć wszystkie The type of boolean operator for filter operation @@ -17836,71 +17892,71 @@ Show Line Numbers - + Pokaż numery wierszy When checked, show line numbers - + Po zaznaczeniu, pokazuje numery wierszy Wrap Lines - + Zawijanie wierszy When checked, wrap lines - + Po zaznaczeniu, zawija wiersze Font Size - + Rozmiar czcionki Log viewer font size - + Rozmiar czcionki przeglądarki logów Open a font dialog to select font face for the logviewer - + Otwórz okno dialogowe czcionek, aby wybrać krój czcionki dla przeglądarki logów Reset options to application defaults - + Przywraca opcje aplikacji do domyślnych Enter a search string here - + Wprowadź tutaj szukany ciąg Search for the next occurrence of the string (F3) - + Szuka następnego wystąpienia danego tekstu (F3) Search for the previous occurrence of the string (Shift+F3) - + Szuka poprzedniego wystąpienia danego tekstu (Shift+F3) C&ase Sensitive - + &Rozróżniaj wielkość liter When checked, perform case sensitive search - + Jeśli zaznaczone, szuka z uwzględnieniem wielkości liter Ma&tch Whole Word - + Do&pasuj całe słowo When checked, search matches only complete words - + Jeśli zaznaczone, wyszukiwanie obejmuje tylko całe słowa &Highlight All - + &Podświetl wszystkie When checked, all occurence of the search text are highlighted - + Jeśli zaznaczone, wszystkie wystąpienia wyszukiwanego tekstu zostaną podświetlone String not found @@ -17912,46 +17968,46 @@ Bookmark - + Zakładka Save VirtualBox Log As - Zapisz log VirtualBox jako + Zapisz log VirtualBox jako <p><b>No machine</b> is currently selected or the selected machine is not valid. Please select a Virtual Machine to see its logs - + <p><b>Żadna maszyna</b>nie jest obecnie wybrana lub wybrana maszyna nie jest prawidłowa. Proszę wybrać maszynę wirtualna, aby zobaczyć jej logi <p>No log files found. Press the <b>Refresh</b> button to rescan the log folder <nobr><b>%1</b></nobr>.</p> - <p>Nie znaleziono plików z logami. Proszę wcisnąć przycisk <b>Odśwież</b> aby ponownie przeszukać folder z logami <nobr><b>%1</b></nobr>.</p> + <p>Nie znaleziono plików z logami. Proszę wcisnąć przycisk <b>Odśwież</b> aby ponownie przeszukać folder z logami <nobr><b>%1</b></nobr>.</p> Go to the next bookmark - + Przejdź do następnej zakładki Go to the previous bookmark - + Przejdź do poprzedniej zakładki Go to selected bookmark - + Przejdź do wybranej zakładki UIVideoMemoryEditor Video &Memory: - &Pamięć wideo: + &Pamięć wideo: %1 MB - %1 MB + %1 MB MB - MB + MB @@ -17959,23 +18015,23 @@ Manager Note: main window title which is prepended by the product name. - Menedżer + Menedżer Select a virtual machine file - Wybierz plik wirtualnej maszyny + Wybierz plik wirtualnej maszyny Virtual machine files (%1) - Pliki z wirtualną maszyną (%1) + Pliki z wirtualną maszyną (%1) Select a destination folder to move the selected virtual machine - + Wybierz folder docelowy, by przenieść wybraną maszynę wirtualną Show Toolbar Text - + Pokaż tekst paska narzędzi @@ -18031,20 +18087,20 @@ UIVirtualMachineItemCloud Loading ... - + Ładowanie ... Up-To-Date - + Aktualna <nobr><b>%1</b></nobr><br><nobr>Inaccessible</nobr> Inaccessible VM tooltip (name) - + <nobr><b>%1</b></nobr><br><nobr>Niedostępna</nobr> Inaccessible - + Niedostępna @@ -18052,146 +18108,146 @@ <nobr>%1<br></nobr><nobr>%2 since %3</nobr><br><nobr>Session %4</nobr> VM tooltip (name, last state change, session state) - <nobr>%1<br></nobr><nobr>%2 od %3</nobr><br><nobr>Sesja %4</nobr> + <nobr>%1<br></nobr><nobr>%2 od %3</nobr><br><nobr>Sesja %4</nobr> <nobr><b>%1</b><br></nobr><nobr>Inaccessible since %2</nobr> Inaccessible VM tooltip (name, last state change) - <nobr><b>%1</b><br></nobr><nobr>Niedostępna od %2</nobr> + <nobr><b>%1</b><br></nobr><nobr>Niedostępna od %2</nobr> Inaccessible - + Niedostępna UIVisoCreator Remove selected file objects from VISO - + Usuń wybrane obiekty z VISO Name - Nazwa + Nazwa Size - Rozmiar + Rozmiar Change Time - + Czas ostatniej zmiany Owner - + Właściciel Permissions - + Uprawnienia Local Path - + Ścieżka lokalna ISO Path - + Ścieżka ISO &Options... - + &Opcje... Show Hidden Objects - + Pokaż ukryte obiekty Create a new directory under the current location - + Stwórz nowy folder w obecnej lokalizacji Rename the selected object - + Zmień nazwę dla wybranych elementów &Configuration... - + &Konfiguracja... VISO Configuration - + Konfiguracja VISO Manage VISO Configuration - + Zarządzaj konfiguracją VISO Dialog Options - + Opcje okna dialogowego Manage Dialog Options - + Zarządzaj opcjami okna dialogowego VISO Name: - + Nazwa VISO: Custom VISO options: - + Niestandardowe opcje VISO: Close the pane - + Zamknij ten panel Remove - Usuń + Usuń New Directory - + Nowy katalog Reset - Zresetuj + Zresetuj VISO Creator - + Kreator VISO VISO - + VISO Remove current option. - + Usuń bieżącą opcję. Add - Dodaj + Dodaj Click to show/hide the tree view - + Kliknij, aby pokazać/ukryć widok drzewa Add selected file objects to VISO - + Dodaj wybrane elementy do VISO Reset VISO content. - + Zresetuj zawartość VISO. UIWelcomePane <h3>Welcome to VirtualBox!</h3><p>The left part of application window contains global tools and lists all virtual machines and virtual machine groups on your computer. You can import, add and create new VMs using corresponding toolbar buttons. You can popup a tools of currently selected element using corresponding element button.</p><p>You can press the <b>%1</b> key to get instant help, or visit <a href=https://www.virtualbox.org>www.virtualbox.org</a> for more information and latest news.</p> - + <h3>Witamy w VirtualBox!</h3><p>W lewej części okna aplikacji znajdują się narzędzia główne i lista wszystkich maszyn wirtualnych oraz grup maszyn wirtualnych na tym komputerze. Za pomocą odpowiednich przycisków na pasku narzędzi możesz importować, dodawać i tworzyć nowe maszyny wirtualne. Możesz wyświetlić wyskakujące okienko narzędzi wybranego elementu za pomocą odpowiedniego przycisku.</p><p>W celu uzyskania natychmiastowej pomocy, naciśnij klawisz <b>%1</b> lub odwiedź <a href=https://www.virtualbox.org>www.virtualbox.org</a>, aby uzyskać więcej informacji i najnowszych wiadomości.</p> @@ -18310,60 +18366,60 @@ Copy Virtual Disk Image - + Skopiuj wirtualny obraz dysku Disk image file type - + Typ pliku obrazu dysku Please choose the type of file that you would like to use for the new virtual disk image. If you do not need to use it with other virtualization software you can leave this setting unchanged. - + Wybierz typ pliku, którego chciałbyś użyć z nowym wirtualnym obrazem dysku. Jeśli nie potrzebujesz użyć go z innym oprogramowaniem wirtualizacyjnym, możesz pozostawić te ustawienie niezmienione. Please choose whether the new virtual disk image file should grow as it is used (dynamically allocated) or if it should be created at its maximum size (fixed size). - + Wybierz, czy plik nowego wirtualnego obrazu dysku powinien rosnąć wraz z użyciem (dynamicznie przydzielany) czy powinien zostać utworzony z maksymalnym rozmiarem (stały rozmiar). <p>A <b>dynamically allocated</b> disk image file will only use space on your physical hard disk 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> - + <p> <b>Dynamicznie przydzielany</b> plik obrazu dysku będzie używał jedynie miejsca na twoim fizycznym twardym dysku, jeśli się zapełni (do maksymalnego <b>stałego rozmiaru</b>), chociaż nie skurczy się automatycznie, gdy zostanie zwolnione miejsce.</p> <p>A <b>fixed size</b> disk image file may take longer to create on some systems but is often faster to use.</p> - + <p>Tworzenie <b>stałego rozmiaru</b> pliku obrazu dysku może trwać dłużej na niektórych systemach, ale często jest szybszy w użyciu.</p> <p>You can also choose to <b>split</b> the disk image 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. - + <p>Możesz również <b>podzielić</b> plik dysku twardego na kilka plików do 2 GB każdy.Jest to przede wszystkim przydatne, jeśli chcesz przechowywać maszynę wirtualną na wymiennych urządzeniach USB lub starych systemach, z których niektóre nie obsługują bardzo dużych plików. Please choose a location for new virtual disk image file - + Wybierz lokalizację dla pliku nowego wirtualnego dysku twardego New disk image to create - + Nowy obraz dysku do utworzenia Please type the name of the new virtual disk image file into the box below or click on the folder icon to select a different folder to create the file in. - + Wpisz nazwę dla pliku nowego wirtualnego dysku twardego w polu poniżej lub kliknij na ikonę folderu, by wybrać inny, aby utworzyć w nim plik. Choose a location for new virtual disk image file... - + Wybierz lokalizację dla pliku nowego wirtualnego dysku... %1_copy copied virtual disk image name - %1_kopia + %1_kopia &New disk image to create - + &Nowy obraz dysku do utworzenia Disk image file &type - + &Typ pliku obrazu dysku @@ -18466,75 +18522,75 @@ <p>Please choose a name and optionally a folder for the new virtual machine. The new machine will be a clone of the machine <b>%1</b>.</p> - + <p>Wybierz nazwę i opcjonalnie folder dla nowej wirtualnej maszyny. Nowa maszyna będzie klonem maszyny <b>%1</b>.</p> Name: - + Nazwa: Path: - + Ścieżka: MAC Address &Policy: - + &Polityka adresów MAC: Include all network adapter MAC addresses - + Uwzględnij wszystkie adresy MAC kart sieciowych Include only NAT network adapter MAC addresses - + Uwzględnij tylko adresy MAC kart sieciowych NAT Generate new MAC addresses for all network adapters - + Wygeneruj nowe adresy MAC dla wszystkich kart sieciowych Include only NAT network adapter MAC addresses during cloning. - + Uwzględnij tylko adresy MAC kart sieciowych NAT podczas klonowania. Generate new MAC addresses for all network adapters during cloning. - + Wygeneruj nowe adresy MAC dla wszystkich kart sieciowych podczas klonowania. Additional Options: - + Opcje dodatkowe: Don't change the disk names during cloning. - + Nie zmieniaj nazw dysków podczas klonowania. Keep &Disk Names - + Zachowaj nazwy &dysków Don't change hardware UUIDs during cloning. - + Nie zmieniaj identyfikatorów sprzętu UUID podczas klonowania. Keep &Hardware UUIDs - + Zachowaj identyfikatory &sprzętu UUID New machine &name and path - + &Nazwa i ścieżka nowej maszyny New machine name and path - + Nazwa i ścieżka nowej maszyny Include all network adapter MAC addresses during cloning. - + Uwzględnij wszystkie adresy MAC kart sieciowych podczas klonowania. Additional options - + Opcje dodatkowe @@ -18569,7 +18625,7 @@ <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> - <p>Wybeirz wirtualną maszynę, która powinna zostać dodana do urządzenia. Możesz wybrać więcej niż jedną. Jednakże maszyny te należy wyłączyć, by móc je wyeksportować. </p> + <p>Wybierz wirtualną maszynę, która powinna zostać dodana do urządzenia. Możesz wybrać więcej niż jedną. Jednakże maszyny te należy wyłączyć, by móc je wyeksportować. </p> Appliance settings @@ -18701,79 +18757,79 @@ Open Virtualization Format 0.9 - + Open Virtualization Format 0.9 Open Virtualization Format 1.0 - + Open Virtualization Format 1.0 Open Virtualization Format 2.0 - + Open Virtualization Format 2.0 Write in new OVF 2.0 format. - + Utwórz w nowym formacie OVF 2.0. <p>Please choose a format to export the virtual appliance to.</p><p>The <b>Open Virtualization Format</b> supports only <b>ovf</b> or <b>ova</b> extensions. If you use the <b>ovf</b> extension, several files will be written separately. If you use the <b>ova</b> extension, all the files will be combined into one Open Virtualization Format archive.</p><p>The <b>Oracle Cloud Infrastructure</b> format supports exporting to remote cloud servers only. Main virtual disk of each selected machine will be uploaded to remote server.</p> - + <p>Proszę wybrać format, do którego ma zostać wyekportowane urządzenie wirtualne.</p><p>Format<b>Open Virtualization Format</b> obsługuje tylko rozszerzenia <b>ovf</b> lub <b>ova</b>. Jeśli użyjesz rozszerzenia <b>ovf</b> , pliki zostaną zapisane oddzielnie. Jeśli użyjesz rozszerzenia <b>ova</b> , wszystkie pliki zostaną spakowane do jednego archiwum Open Virtualization Format.</p><p>Format <b>Oracle Cloud Infrastructure</b> obsługuje tylko eksport do zdalnych serwerów chmury. Główny dysk wirtualny każdej wybranej maszyny zostanie przesłany na zdalny serwer.</p> Choose a file to export the virtual appliance to... - + Wybierz plik do wyeksportowania wirtualnego urządzenia... Export to cloud service provider. - + Wyeksportuj do dostawcy usług w chmurze. MAC Address &Policy: - + &Polityka adresów MAC: Include all network adapter MAC addresses - + Uwzględnij wszystkie adresy MAC kart sieciowych Include only NAT network adapter MAC addresses - + Uwzględnij tylko adresy MAC kart sieciowych NAT Strip all network adapter MAC addresses - + Usuń wszystkie adresy MAC kart sieciowych Include all network adapter MAC addresses in exported appliance archive. - + Uwzględnij wszystkie adresy MAC kart sieciowych w eksportowanym archiwum urządzenia. Include only NAT network adapter MAC addresses in exported appliance archive. - + Uwzględnij tylko adres MAC karty sieciowej NAT w eksportowanym archiwum urządzenia. Strip all network adapter MAC addresses from exported appliance archive. - + Usuń wszystkie adresy MAC kart sieciowych z eksportowanego archiwum urządzenia. Additionally: - + Dodatkowo: &Write Manifest file - + &Zapisz plik Mainfest Include ISO image files in exported VM archive. - + Dołącza pliki obrazów ISO w eksportowanym archiwum maszyny wirtualnej. &Include ISO image files - + &Dołącz pliki obrazów ISO &Account: - + &Konto: <p>Please choose a filename to export the virtual appliance to. Besides that you can specify a certain amount of options which affects the size and content of resulting archive.</p> @@ -18781,15 +18837,15 @@ Virtual system settings - + Ustawienia systemu wirtualnego Virtual &system settings - + Ustawienia &systemu wirtualnego Include ISO image files into exported VM archive. - + Dołącz pliki obrazów ISO do eksportowanego archiwum maszyny wirtualnej. <p>Please choose one of cloud service accounts you have registered to export virtual machines to. Make sure profile settings reflected in the underlying table are valid. They will be used to establish network connection required to upload your virtual machine files to a remote cloud facility.</p> @@ -18797,19 +18853,19 @@ Machine Creation: - + Tworzenie maszyny: Ask me about it &after exporting disk as custom image - + Zapytaj mnie o to &po wyeksportowaniu dysku jako niestandardowego obrazu Ask me about it &before exporting disk as custom image - + Zapytaj mnie o to &przed wyeksportowaniem dysku jako niestandardowego obrazu Do &not ask me about it, leave custom image for future usage - + &Nie pytaj mnie o to, pozostaw niestandardowy obraz do użycia w przyszłości This is the descriptive information which will be used to determine settings for a cloud storage your VM being exported to. You can change it by double clicking on individual lines. @@ -18949,27 +19005,27 @@ Local File System - + Lokalny system plików Import from local file system. - + Importuj z lokalnego systemu plików. Import from cloud service provider. - + Importuj od dostawcy usług w chmurze. &File: - &Plik: + &Plik: &Account: - + &Konto: &Machines: - + &Maszyny: <p>Please choose one of cloud service accounts you have registered to import virtual machine from. Corresponding machines list will be updated. To continue, select one of machines to import below.</p> @@ -18977,7 +19033,7 @@ <p>Please choose a file to import the virtual appliance from. VirtualBox currently supports importing appliances saved in the Open Virtualization Format (OVF). To continue, select the file to import below.</p> - + <p>Proszę wybrać plik, z którego chcesz zaimportować urządzenie wirtualne. Program VirtualBox obsługuje obecnie importowanie urządzeń zapisanych w formacie Open Virtualization Format (OVF). Aby kontynuować, wybierz poniżej plik do zaimportowania.</p> These are the the suggested settings of the cloud VM import procedure, they are influencing the resulting local VM instance. You can change many of the properties shown by double-clicking on the items and disable others using the check boxes below. @@ -18985,11 +19041,11 @@ Source - Źródło + Źródło Settings - Ustawienia + Ustawienia Acquire cloud instances ... @@ -19005,34 +19061,34 @@ Please choose the source to import appliance from. This can be a local file system to import OVF archive or one of known cloud service providers to import cloud VM from. - + Proszę wybrać źródło, z którego zamierzasz zaimportować urządzenie. To może być lokalny system plików do importu archiwum OVF lub jeden ze znanych dostawców usług chmurowych, od którego można importować maszyny wirtualne w chmurze. &Source: - + Ź&ródło: UIWizardNewCloudVM Create Cloud Machine ... - + Stwórz maszynę w chmurze... Create Cloud Virtual Machine - + Stwórz wirtualną maszynę w chmurze Create - Utwórz + Utwórz Destination to create - + Miejsce docelowe do stworzenia Please choose the destination to create cloud virtual machine in. This can be one of known cloud service providers below. - + Proszę wybrać lokalizację, w której chcesz utworzyć maszynę wirtualną w chmurze. To może być jeden ze znanych poniżej dostawców usług chmurowych. Create VM for cloud service provider. @@ -19044,15 +19100,15 @@ &Account: - + &Konto: &Images: - + &Obrazy: Cloud Virtual Machine settings - + Ustawienia wirtualnej maszyny w chmurze These are the the suggested settings of the cloud VM creation procedure, they are influencing the resulting cloud VM instance. You can change many of the properties shown by double-clicking on the items and disable others using the check boxes below. @@ -19060,11 +19116,11 @@ Destination - + Lokalizacja Settings - Ustawienia + Ustawienia Acquire launch form ... @@ -19076,7 +19132,7 @@ &Destination: - + &Lokalizacja: @@ -19143,7 +19199,7 @@ <p>You can also choose to <b>split</b> the hard disk 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. - <p>Mozesz również <b>podzielić</b> plik dysku twardego na kilka plików do 2 GB każdy.Jest to przede wszystkim przydatne, jeśli chcesz przechowywać maszynę wirtualną na wymiennych urządzeniach USB lub starych systemach, z których niektóre nie obsługują bardzo dużych plików. + <p>Możesz również <b>podzielić</b> plik dysku twardego na kilka plików do 2 GB każdy.Jest to przede wszystkim przydatne, jeśli chcesz przechowywać maszynę wirtualną na wymiennych urządzeniach USB lub starych systemach, z których niektóre nie obsługują bardzo dużych plików. Please type the name of the new virtual hard disk file into the box below or click on the folder icon to select a different folder to create the file in. @@ -19246,7 +19302,7 @@ Please choose a descriptive name and destination folder 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. - + Wybierz opisową nazwę i folder docelowy dla nowej maszyny wirtualnej oraz wybierz typ systemu operacyjnego, który zamierzasz zainstalować na niej. Nazwa, którą wybierzesz zostanie wykorzystana przez VirtualBox, by zidentyfikować maszynę. diff -Nru virtualbox-hwe-6.1.34-dfsg/src/VBox/Frontends/VirtualBox/nls/VirtualBox_pt_BR.ts virtualbox-hwe-6.1.38-dfsg/src/VBox/Frontends/VirtualBox/nls/VirtualBox_pt_BR.ts --- virtualbox-hwe-6.1.34-dfsg/src/VBox/Frontends/VirtualBox/nls/VirtualBox_pt_BR.ts 2022-03-22 23:44:34.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/src/VBox/Frontends/VirtualBox/nls/VirtualBox_pt_BR.ts 2022-09-01 13:27:59.000000000 +0000 @@ -2990,6 +2990,10 @@ Primary Group Grupo Primário + + Storage Controller (VirtioSCSI) + + UIApplianceImportEditorWidget @@ -4348,27 +4352,27 @@ Undefined GuestSessionStatus - Não Definido + Não Definido Starting GuestSessionStatus - Iniciando + Iniciando Started GuestSessionStatus - Iniciado + Iniciado Terminating GuestSessionStatus - Terminando + Terminando Terminated GuestSessionStatus - Terminado + Terminado TimedOutKilled @@ -4383,12 +4387,12 @@ Down GuestSessionStatus - Inativo + Inativo Error GuestSessionStatus - Erro + Erro Undefined @@ -4478,22 +4482,22 @@ IDE Primary Device 0 StorageSlot - IDE Primário Master + Dispositivo IDE Primário 0 IDE Primary Device 1 StorageSlot - IDE Primário Slave + Dispositivo IDE Primário 1 IDE Secondary Device 0 StorageSlot - IDE Secundário Master + Dispositivo IDE Secundário 0 IDE Secondary Device 1 StorageSlot - IDE Secundário Slave + Dispositivo IDE Secundário 1 SATA Port %1 @@ -4633,7 +4637,7 @@ Bridget Adapter - Placa em modo Bridge + Placa em modo Bridge Internal Network @@ -5198,8 +5202,26 @@ Cloud Network [EXPERIMENTAL] NetworkAttachmentType + Rede Cloud [EXPERIMENTAL] + + + Timed Out (Killed) + GuestSessionStatus + + + + Timed Out (Abnormally) + GuestSessionStatus + + Bridged Adapter + Placa em modo Bridge + + + Cloud Network + Rede em Nuvem + UICustomFileSystemModel @@ -7159,6 +7181,14 @@ No Guest Session found!<br>Please use the Session Panel to start a new guest session Nenhuma Sessão com Convidados encontrada<br>Utilize o Painel de Sessão para iniciar uma sessão com um convidado + + Close dialog without saving + Fecha o diálogo sem salvar + + + Reset Changes (%1) + + UIFilePathSelector @@ -14369,7 +14399,7 @@ The hardware virtualization is enabled in the Acceleration section of the System page although it is not supported by the host system. It should be disabled in order to start the virtual system. - A virtualização de hardware está habilitada na seção Aceleração na página Sistema, mesmo não sendo suportada pelo sistema hospedeiro. Esta opção deve ser desabilitada para poder iniciar o sistema virtual. + A virtualização de hardware está habilitada na seção Aceleração na página Sistema, mesmo não sendo suportada pelo sistema hospedeiro. Esta opção deve ser desabilitada para poder iniciar o sistema virtual. When checked, the nested hardware virtualization CPU feature will be exposed to the virtual machine. @@ -17663,15 +17693,15 @@ Failed to open the medium with following ID: <nobr><b>%1</b></nobr>. - Falha ao abrir a mídia com o seguinte ID: <nobr><b>%1</b></nobr>. + Falha ao abrir a mídia com o seguinte ID: <nobr><b>%1</b></nobr>. Failed to acquire attachment parameter. - Falha ao obter o parâmetro de conexão física. + Falha ao obter o parâmetro de conexão física. Failed to acquire medium attribute. - Falha ao obter o atributo de mídia. + Falha ao obter o atributo de mídia. Failed to create cloud machine. @@ -21852,7 +21882,7 @@ Keep &Disk Names - Manter Nomes dos &Discos + Manger Nomes dos &Discos Don't change hardware UUIDs during cloning. @@ -21860,7 +21890,7 @@ Keep &Hardware UUIDs - Manter UUIDs do &Hardware + Manger UUIDs do &Hardware New machine &name and path diff -Nru virtualbox-hwe-6.1.34-dfsg/src/VBox/Frontends/VirtualBox/nls/VirtualBox_pt.ts virtualbox-hwe-6.1.38-dfsg/src/VBox/Frontends/VirtualBox/nls/VirtualBox_pt.ts --- virtualbox-hwe-6.1.34-dfsg/src/VBox/Frontends/VirtualBox/nls/VirtualBox_pt.ts 2022-03-22 23:44:34.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/src/VBox/Frontends/VirtualBox/nls/VirtualBox_pt.ts 2022-09-01 13:27:59.000000000 +0000 @@ -11,7 +11,7 @@ English Language name, in English - Português (Portugal) + Portuguese (Portugal) Oracle Corporation @@ -21,12 +21,12 @@ -- Native language country name (empty if this language is for all countries) - -- + -- -- Language country name, in English (empty if native country name is empty) - -- + -- @@ -101,11 +101,11 @@ <html><b>%1 (rc=%2)</b><br/><br/> - <html><b>%1 (rc=%2)</b><br/><br/> + <html><b>%1 (rc=%2)</b><br/><br/> Please try reinstalling VirtualBox. - Por favor, tente reinstalar o VirtualBox. + Por favor, tente reinstalar o VirtualBox. 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>'/sbin/rcvboxdrv setup'</font><br/><br/>as root. Users of Ubuntu, Fedora or Mandriva should install the DKMS package first. This package keeps track of Linux kernel changes and recompiles the vboxdrv kernel module if necessary. @@ -125,7 +125,7 @@ Unknown error %2 during initialization of the Runtime - Erro desconhecido %2 durante a instalação do ambiente de execução (Runtime) + Erro desconhecido %2 durante a inicialização do ambiente de execução (Runtime) Kernel driver not accessible @@ -133,7 +133,7 @@ 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. - Os módulos kernel do VirtualBox não correspondem a esta versão do VirtualBox. A instalação do VirtualBox aparentemente falhou. Por favor tente desinstalar completamente e reinstalar o VirtualBox. + Os módulos kernel do VirtualBox não correspondem a esta versão do VirtualBox. A instalação do VirtualBox aparentemente falhou. Por favor, tente desinstalar completamente e reinstalar o VirtualBox. 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>'/sbin/rcvboxdrv setup'</font><br/><br/>may correct this. Make sure that you do not mix the OSE version and the PUEL version of VirtualBox. @@ -141,26 +141,26 @@ This error means that the kernel driver was either not able to allocate enough memory or that some mapping operation failed. - Este erro significa que o controlador kernel não conseguiu alocar memória suficiente ou que falhou alfuma operação de mapeação. + Este erro significa que o controlador kernel não conseguiu alocar memória suficiente ou que falhou alguma operação de mapeação. The VirtualBox Linux kernel driver is either not loaded or not set up correctly. Please try setting it up again by executing<br/><br/> <font color=blue>'/sbin/vboxconfig'</font><br/><br/>as root.<br/><br/>If your system has EFI Secure Boot enabled you may also need to sign the kernel modules (vboxdrv, vboxnetflt, vboxnetadp, vboxpci) before you can load them. Please see your Linux system's documentation for more information. - + O controlador kernel Linux do VirtualBox não está carregado ou não foi configurado corretamente. Por favor, tente reconfigurá-lo novamente executando<br/><br/> <font color=blue>'/sbin/vboxconfig'</font><br/><br/>as root.<br/><br/>Se o seu sistema tem "EFI Secure Boot" ativado poderá ter que assinar os módulos kernel (vboxdrv, vboxnetflt, vboxnetadp, vboxpci) antes de os pdoer carregar. Por favor, consulte a documentação do seu sistema Linux para mais informação. 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>'/sbin/vboxconfig'</font><br/><br/>may correct this. Make sure that you are not mixing builds of VirtualBox from different sources. - + Os módulos kernel do VirtualBox não correspondem a esta versão do VirtualBox. A instalação do VirtualBox aparentemente falhou. Executando <br/><br/> <font color=blue>'/sbin/vboxconfig'</font><br/><br/>may correct this. Certifique-se que não mistura as compilações do VirtualBox de fontes diferentes. QIArrowButtonPress &Back - &Anterior + &Anterior &Next - &Próximo + &Seguinte @@ -175,11 +175,11 @@ &Details - &Detalhes + &Detalhes &Details (%1 of %2) - &Detalhes (%1 of %2) + &Detalhes (%1 de %2) @@ -215,7 +215,7 @@ QIInputDialog Name: - + Nome: @@ -264,11 +264,11 @@ Copy all errors to the clipboard - + Copiar todos os erros para a área de transferência Copy - + Copiar @@ -339,19 +339,19 @@ %1, %2: %3, %4: %5, %6: %7, %8: %9 col.1 text, col.2 name: col.2 text, col.3 name: col.3 text, col.4 name: col.4 text, col.5 name: col.5 text - + %1, %2: %3, %4: %5, %6: %7, %8: %9 Full - Completo + Completo Read-only - Leitura apenas + Apenas leitura Yes - Sim + Sim @@ -370,7 +370,7 @@ Seam&less Mode - Modo 'Seam&less' + Modo &Integrado Switch to seamless desktop integration mode @@ -378,7 +378,7 @@ Auto-resize &Guest Display - Auto-redimensionar Ecrã &Convidado + Auto redimensionar Ecrã &Convidado Automatically resize the guest display when the window is resized (requires Guest Additions) @@ -390,7 +390,7 @@ Adjust window size and position to best fit the guest display - Ajusta o tamanho e posição da janela para melhor caber no ecrã do sistema convidado + Ajusta o tamanho e posição da janela para enquadrar melhor no ecrã de convidado Disable &Mouse Integration @@ -458,11 +458,11 @@ &Reset - &Restaurar + &Reiniciar Reset the virtual machine - Restaura a máquina virtual + Reiniciar a máquina virtual ACPI Sh&utdown @@ -482,11 +482,11 @@ Close the virtual machine - Fecha a máquina virtual + Fechar a máquina virtual &View - &ver + &Ver &Devices @@ -526,7 +526,7 @@ &Insert Guest Additions CD image... - &Instalar Adições de Convidado... + Insert the Guest Additions disk file into the virtual drive @@ -552,11 +552,11 @@ Dock Icon - Icon da Barra de Tarefas + Ícone da Barra de Tarefas Show Monitor Preview - Mostrar Previsão do Monitor + Mostrar Pré-visualização do Monitor Show Application Icon @@ -585,7 +585,7 @@ Switch between normal and seamless desktop integration mode - Mudar entre modo normal e modo integrado de ecrã transparente + Mudar entre modo de integração de ecrã transparente e normal Switch to &Scaled Mode @@ -593,7 +593,7 @@ Switch between normal and scaled mode - Mudar entre modo normal e modo escala + Mudar entre o modo normal e o modo de escala Session I&nformation @@ -605,7 +605,7 @@ &Settings... - Definiçõe&s... + Definiçõe&s... Show the log files of the selected virtual machine @@ -613,15 +613,15 @@ &Contents... - &Conteúdos... + &Conteúdos... Check for a new VirtualBox version - Procura por uma versão do VirtualBox mais recente + Procurar por uma nova versão do VirtualBox &About VirtualBox... - &Acerca do VirtualBox... + &Sobre o VirtualBox... Show a window with product information @@ -630,36 +630,36 @@ &File Mac OS X version - &Ficheiro + &Ficheiro &File Non Mac OS X version - &Ficheiro + &Ficheiro &Virtual Media Manager... - Gestor de Discos &Virtuais... + Gestor de Discos &Virtuais... Display the Virtual Media Manager window - Apresenta o diálogo do Gestor de Discos Virtuais + Exibe a janela do Gestor de Discos Virtuais &Import Appliance... - &importar Aplicação... + &Importar Aplicação... Import an appliance into VirtualBox - Importar uma aplicaão para o VirtualBox + Importa uma aplicaão para o VirtualBox &Export Appliance... - &Exportar Aplicação... + &Exportar Aplicação... Export one or more VirtualBox virtual machines as an appliance - Exporta uma ou mais máquinas virtuais VirtualBox como aplicação + Exporta uma ou mais máquinas virtuais do VirtualBox como uma aplicação &Preferences... @@ -672,11 +672,11 @@ E&xit - &Sair + &Sair Close application - Fechar aplicação + Fechar a aplicação Create a new virtual machine @@ -688,7 +688,7 @@ S&tart - &Iniciar + &Iniciar Start the selected virtual machine @@ -696,7 +696,7 @@ S&how - &Mostrar + &Mostrar Switch to the window of the selected virtual machine @@ -732,11 +732,11 @@ &New... - &Novo... + &Nova... &Add... - &Adicionar... + &Adicionar... Remove the selected virtual machine @@ -744,7 +744,7 @@ Discard - Descartar + Ignorar Discard the saved state of the selected virtual machine @@ -768,11 +768,11 @@ Show &Log... - Mostrar &Registo... + Mostrar &Registo... C&heck for Updates... - P&rocurar por Actualizações... + P&rocurar por Atualizações... &Insert Guest Additions CD image... @@ -790,25 +790,26 @@ &File - &Ficheiro + &Ficheiro &Preferences... global preferences window - &Preferências... + &Preferências... &Keyboard - &Teclado + &Teclado &Hard Disks - Discos &Rígidos + Discos &Rígidos Show &Log... debug action - Mostrar &Registo... + ação de depuração + Mostrar &Registo... %1% @@ -818,39 +819,39 @@ Enable Virtual Screen - Activar + Ativar No supported devices connected to the host PC - Nenhum dispositivo suportado está conectado ao PC hospedeiro + Nenhum dispositivo suportado está ligado ao PC anfitrião &Details - &Detalhes + &Detalhes &Snapshots - &Capturas + &Capturas Preview Monitor %1 - + Pré-visualizar Monitor %1 &Connect Network Adapter - + &Ligar Adaptador de Rede Connect Network Adapter &%1 - + Ligar Adaptador de Rede &%1 No USB Devices Connected - + Sem Dispositivos USB Ligados No Webcams Connected - + Sem Câmaras da Web Ligadas No supported webcams connected to the host PC @@ -858,35 +859,35 @@ &VirtualBox - + &VirtualBox &Window - + &Janela &Minimize - + &Minimizar Minimize active window - + Minimizar janela ativa Show help contents - + Mostrar conteúdos da ajuda &VirtualBox Web Site... - + Site da Web do &VirtualBox... Open the browser and go to the VirtualBox product web site - + Abrir o navegador e ir para o site da Web do produto VirtualBox &VirtualBox Bug Tracker... - + Rastreador de Erros do &VirtualBox... Open the browser and go to the VirtualBox product bug tracker @@ -894,7 +895,7 @@ &VirtualBox Forums... - + Fóruns do &VirtualBox... Open the browser and go to the VirtualBox product forums @@ -902,7 +903,7 @@ &Oracle Web Site... - + Site da Web da &Oracle... Open the browser and go to the Oracle web site @@ -910,7 +911,7 @@ &Reset All Warnings - + &Reiniciar Todos os Avisos Go back to showing all suppressed warnings and messages @@ -918,39 +919,39 @@ &Network Operations Manager... - + Gestor de Operações de &Rede... Display the Network Operations Manager window - + Exibe a janela do Gestor de Discos de Rede Display a window with product information - + Exibe a janela com a informação do produto Display the global preferences window - + Exibe a janela das preferências globais &Log - + &Registos &Find - &Procurar + &Encontrar Log Viewer - Visualizador de Registos + Visualizador de Registos Open pane with searching options - + Abrir o painel com as opções de procura &Filter - + &Filtro Open pane with filtering options @@ -958,7 +959,7 @@ &Bookmark - + &Marcador Open pane with bookmarking options @@ -966,7 +967,7 @@ &Options - + &Opções Open pane with log viewer options @@ -974,7 +975,7 @@ &Refresh - Actualiza&r + Atualiza&r Refresh selected virtual machine log @@ -982,27 +983,27 @@ &Save... - &Gravar... + &Guardar... Save selected virtual machine log - + Guardar registo da máquina virtual selecionada File Manager - + Gestor de Ficheiros Host - + Anfitrião Guest - Convidado + Convidado Copy to guest - + Copiar para convidado Copy the selected object(s) from host to guest @@ -1010,7 +1011,7 @@ Copy to host - + Copiar para anfitrião Copy the selected object(s) from guest to host @@ -1018,11 +1019,11 @@ Log - Registo + Registo Session - + Sessão Go one level up to parent folder @@ -1030,7 +1031,7 @@ Go Home - + Ir para Início Go to home folder @@ -1042,7 +1043,7 @@ Delete - Apagar + Eliminar Delete selected file object(s) @@ -1050,19 +1051,19 @@ Refresh - Actualizar + Atualizar Rename - + Renomear Create New Directory - + Criar Nova Diretoria Copy - + Copiar Copy selected file object(s) @@ -1070,7 +1071,7 @@ Cut - + Cortar Cut selected file object(s) @@ -1078,7 +1079,7 @@ Paste - + Colar Paste copied/cut file object(s) @@ -1086,7 +1087,7 @@ Select All - + Selecionar Tudo Select all files objects @@ -1094,7 +1095,7 @@ Invert Selection - + Inverter Seleção Invert the current selection @@ -1102,7 +1103,7 @@ Show Properties - + Mostrar Propriedades Show the properties of currently selected file object(s) @@ -1110,7 +1111,7 @@ &Host Network Manager... - + Gestor de Redes &Anfitriãs... Display the Host Network Manager window @@ -1118,7 +1119,7 @@ &Cloud Profile Manager... - + Gestor de Perfis da &Nuvem... Display the Cloud Profile Manager window @@ -1126,15 +1127,15 @@ Import - + Importar Export - + Exportar E&xtra Data Manager... - + Gestor de Dados E&xtra... Display the Extra Data Manager window @@ -1146,43 +1147,43 @@ &New Machine... - + &Nova Máquina... Create new virtual machine - + Criar nova máquina virtual &Add Machine... - + &Adicionar Máquina... Add existing virtual machine - + Adicionar uma máquina virtual existente Rena&me Group... - + Reno&mear Grupo... Rename selected virtual machine group - + Renomear o grupo da máquina virtual selecionada &Ungroup - + Desa&grupar Ungroup items of selected virtual machine group - + Desagrupar os itens do grupo da máquina virtual selecionada &Sort - + &Ordenar Sort items of selected virtual machine group alphabetically - + Oredenar alfabeticamente os itens do grupo da máquina virtual selecionada Gro&up @@ -1190,7 +1191,7 @@ Add new group based on selected virtual machines - + Adicionar novo grupo com base nas máquinas virtuais selecionadas Display the virtual machine settings window @@ -1198,15 +1199,15 @@ Cl&one... - + Cl&onar... Clone selected virtual machine - + Clonar máquina virtual selecionada &Move... - + &Mover... Move selected virtual machine @@ -1214,7 +1215,7 @@ &Remove... - + &Remover... Remove selected virtual machines @@ -1230,7 +1231,7 @@ Switch to the windows of selected virtual machines - + Mudar para as janelas das máquinas virtuais selecionadas &Normal Start @@ -1258,11 +1259,11 @@ Reset selected virtual machines - + Reiniciar as máquinas virtuais selecionadas D&iscard Saved State... - + &Ignorar Estado Guardado... Discard saved state of selected virtual machines @@ -1274,15 +1275,15 @@ Re&fresh - + Atuali&zar Refresh accessibility state of selected virtual machines - + Atualizar o estado de acessibilidade das máquinas virtuais seleccionadas S&how in Finder - + &Mostrar no Finder Show the VirtualBox Machine Definition files in Finder @@ -1290,7 +1291,7 @@ S&how in Explorer - + Mostrar no &Explorador Show the VirtualBox Machine Definition files in Explorer @@ -1298,7 +1299,7 @@ S&how in File Manager - + M&ostrar no Gestor de Ficheiros Show the VirtualBox Machine Definition files in the File Manager @@ -1322,7 +1323,7 @@ &Close - + &Fechar &Detach GUI @@ -1334,7 +1335,7 @@ &Save State - + &Guardar Estado Save state of selected virtual machines @@ -1346,7 +1347,7 @@ Po&wer Off - + &Desligar Power off selected virtual machines @@ -1362,7 +1363,7 @@ &Logs - + &Registos Open the machine logs pane @@ -1370,107 +1371,107 @@ &Global Tools Menu - + Menu de Ferramentas &Global &Virtual Media Manager - + Gestor de Discos &Virtuais Open the Virtual Media Manager - + Abre o Gestor de Discos Virtuais &Host Network Manager - + Gestor de Redes &Anfitriãs Open the Host Network Manager - + Abre o Gestor de Redes Anfitriãs &Cloud Profile Manager - + Gestor de Perfis da &Nuvem Open the Cloud Profile Manager - + Abre o Gestor de Perfis da Nuvem &Snapshot - + &Captura &Take... - + &Capturar... Snapshot Pane - + Painel de Capturas Take a snapshot of the current virtual machine state - Cria uma captura do estado actual da máquina virtual actual + Cria uma captura do estado da máquina virtual atual &Delete... - + &Eliminar... Delete selected snapshot of the virtual machine - + Eliminar a captura selecionada da máquina virtual &Restore... - + &Restaurar... Restore selected snapshot of the virtual machine - + Restaurar a captura selecionada da máquina virtual &Properties - + &Propriedades Open pane with the selected snapshot properties - + Abrir o painel com as propriedades da captura selecionada &Clone... - + &Clonar... &Medium - + &Disco Media Manager - + Gestor de Discos &Copy... - + &Copiar... Re&lease... - + &Lançar... Re&fresh... - + Atuali&zar... &Network - + &Rede &Create... - + &Criar... Network Manager - + Gestor de Redes Create new host-only network @@ -1490,27 +1491,27 @@ &Cloud - + &Nuvem Add - + Adicionar &Add Profile... - + &Adicionar Perfil... Cloud Profile Manager - + Gestor de Perfis da Nuvem Add new cloud profile - + Adicionar novo perfil da nuvem &Import Profiles... - + &Importar Perfis... Import the list of cloud profiles from external files @@ -1518,11 +1519,11 @@ Remove - Remover + Remover &Remove Profile... - + &Remover Perfil... Remove selected cloud profile @@ -1530,35 +1531,35 @@ Properties - + Propriedades Profile &Properties - + &Propriedades do Perfil Open pane with selected cloud profile properties - + Abrir o painel com as propriedades do perfil da nuvem selecionado Help - Ajuda + Ajuda &Show Help... - + Mostrar &Ajuda... Show cloud profile help - + Mostrar a ajuda do perfil da nuvem Take Sn&apshot... - + C&apturar... Session I&nformation... - + I&nformação da Sessão... Display the virtual machine session information window @@ -1566,7 +1567,7 @@ File Manager... - + Gestor de Ficheiros... Save the state of the virtual machine @@ -1582,7 +1583,7 @@ &Full-screen Mode - + Modo de &ecrã completo Switch between normal and full-screen mode @@ -1590,11 +1591,11 @@ S&caled Mode - + Modo Es&calado &Minimize Window - + &Minimizar Janela Automatically resize the guest display when the window is resized @@ -1602,7 +1603,7 @@ Take Screensh&ot... - + Cap&turar... Take guest display screenshot @@ -1610,11 +1611,11 @@ &Recording - + &Gravação &Recording Settings... - + Definições da G&ravação... Display virtual machine settings window to configure video/audio recording @@ -1626,39 +1627,39 @@ R&emote Display - + Monitor R&emoto Allow remote desktop (RDP) connections to this machine - + Permitir ligações da área de trabalho remota (RDP) para esta máquina &Menu Bar - + Barra do &Menu &Menu Bar Settings... - + Definições da Barra do &Menu... Display window to configure menu-bar - + Exibir a janela para configurar a barra do menu Show Menu &Bar - + Mostrar &Barra do Menu Enable menu-bar - + Ativar barra do menu &Status Bar - + Barra de E&stado &Status Bar Settings... - + Definições da Barra de E&stado... Display window to configure status-bar @@ -1666,19 +1667,19 @@ Show Status &Bar - + Mostrar &Barra de Estado Enable status-bar - + Ativar barra de estado &Input - + &Entrada &Keyboard Settings... - + Definições do &Teclado... Display global preferences window to configure keyboard shortcuts @@ -1687,7 +1688,7 @@ &Insert %1 that means send the %1 key sequence to the virtual machine - + &Inserir %1 Send the %1 sequence to the virtual machine @@ -1695,11 +1696,11 @@ &Mouse - + &Rato &Mouse Integration - + Integração do &Rato Enable host mouse pointer integration @@ -1715,35 +1716,35 @@ &Optical Drives - + Unidades Ó&ticas &Floppy Drives - + &Disquetes &Audio - + Áu&dio Audio Output - + Saída de Áudio Enable audio output - + Ativar saída de áudio Audio Input - + Entrada de Áudio Enable audio input - + Ativar entrada de áudio &Network Settings... - + Defi&nições de Rede... Display virtual machine settings window to configure network adapters @@ -1751,11 +1752,11 @@ &USB - + &USB &USB Settings... - + Definições de &USB... Display virtual machine settings window to configure USB devices @@ -1763,23 +1764,23 @@ &Webcams - + Câmaras da &Web Shared &Clipboard - + Área de &Transferência Partilhada &Drag and Drop - + &Arrastar e Largar &Shared Folders - + Pastas Par&tilhadas &Shared Folders Settings... - + Definições das Pa&stas Partilhadas... Display virtual machine settings window to configure shared folders @@ -1816,15 +1817,15 @@ Resize to %1x%2 Virtual Screen - + Redimensionar para %1x%2 Popup Menu - + Menu da Janela Options - + Opções Open panel with file manager options @@ -1836,7 +1837,7 @@ Operations - + Operações Open panel with file manager operations @@ -1848,7 +1849,7 @@ Go Up - + Ir para Cima Display the virtual machine file manager window @@ -1856,11 +1857,11 @@ Tools - + Ferramentas E&xport to OCI... - + E&xportar para OCI... Export selected virtual machine to OCI @@ -1868,39 +1869,39 @@ Try - + Testar &Try Oracle Cloud for Free... - + &Testar Oracle Cloud Gratuitamente... Try Oracle cloud for free - + Teste Oracle Cloud gratuitamente Try Oracle Cloud for Free - + Testar Oracle Cloud Gratuitamente Display Global Preferences - + Exibir Preferências Globais Open Find Pane - + Abrir Painel de Encontrar Open Filter Pane - + Abrir Painel do Filtro Open Bookmark Pane - + Abrir Painel de Marcadores Open Options Pane - + Abrir Painel das Opções Refresh Virtual Machine Log @@ -1912,11 +1913,11 @@ Copy from Host to Guest - + Copiar de Anfitrião para Convidado Copy from Guest to Host - + Copiar de Convidado para Anfitrião Open Log Pane @@ -1940,15 +1941,15 @@ Refresh Contents - + Atualizar Conteúdos Rename selected file object - + Renomear o objeto do ficheiro selecionado Rename Selected Object - + Renomear Objeto Selecionado Copy Selected Object(s) @@ -1964,7 +1965,7 @@ Select All Objects - + Selecionar Todos os Objetos Invert Current Selection @@ -1976,15 +1977,15 @@ &New Cloud VM... - + &Nova VM da Nuvem... Create new cloud virtual machine - + Criar nova máquina virtual da nuvem E&xport Locally... - + E&xportar Localmente... Export selected virtual machine locally @@ -1992,91 +1993,91 @@ S&earch - + Pro&curar Search virtual machines with respect to a search term - + Procurar máquina virtuais com respeito a um termo de procura Take Snapshot - Criar Captura + Criar Captura Delete Snapshot - + Eliminar Captura Restore Snapshot - + Restaurar Captura Open Snapshot Properties - + Abrir Propriedades da Captura Clone Virtual Machine - + Clonar Máquina Virtual Add a disk image - + Adicionar uma imagem de disco Add Disk Image - + Adicionar Imagem de Disco Create a new disk image - + Criar uma nova imagem de disco Create Disk Image - + Criar Imagem de Disco Copy selected disk image - + Copiar a imagem de disco selecionada Copy Disk Image - + Copiar Imagem de Disco Move selected disk image - + Mover a imagem de disco selecionada Move Disk Image - + Mover Imagem de Disco Remove selected disk image - + Remover a imagem de disco selecionada Remove Disk Image - + Remover Imagem de Disco Release selected disk image - + Lançar a imagem de disco selecionada Release Disk Image - + Lançar Imagem de Disco Open pane with selected disk image properties - + Abrir o painel com as propriedades da imagem de disco selecionada Open Disk Image Properties - + Abrir as Propriedades da Imagem de Disco &Search - + &Procurar Open the disk image search pane @@ -2092,7 +2093,7 @@ Refresh Disk Images - + Atualizar Imagens de Disco Create Host-only Network @@ -2100,7 +2101,7 @@ Remove Host-only Network - + Remover apenas Rede do Anfitrião Open Host-only Network Properties @@ -2112,23 +2113,23 @@ Add Cloud Profile - + Adicionar Perfil da Nuvem Import Cloud Profiles - + Importar Perfis da Nuvem Remove Cloud Profile - + Remover Perfil da Nuvem Open Cloud Profile Properties - + Abrir Propriedades do Perfil da Nuvem Show Cloud Profile Help - + Mostrar Ajuda do Perfil da Nuvem &Soft Keyboard... @@ -2141,7 +2142,7 @@ Guest Control Terminal... debug action - + Terminal de Controlo de Convidado... @@ -2149,30 +2150,32 @@ ID password table field - + campo da tabela da palavra-passe + Id. Password password table field - + campo da tabela da palavra-passe + Palavra-passe <nobr>Used by the following %n hard disk(s):</nobr><br>%1 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 hard drives are in the tool-tip and doesn't need to be told). - - + + <nobr>Utilizado pelo(s) seguinte(s) disco(s) rígido(s):</nobr><br>%1 %1 - Disk Encryption - + %1 - Encriptação de Disco This virtual machine is password protected. Please enter the %n encryption password(s) below. 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 passwords are in the list and doesn't need to be told). - - + + Esta máquina virtual virtual está protegida com palavra-passe. Por favor, inisira em baixo a palavra-passe de encriptação. @@ -2299,34 +2302,38 @@ Storage Controller (IDE) - + Controlador de Armazenamento (IDE) Storage Controller (SATA) - + Controlador de Armazenamento (SATA) Storage Controller (SCSI) - + Controlador de Armazenamento (SCSI) Storage Controller (SAS) - + Controlador de Armazenamento (SAS) Detailed list of all components of all virtual machines of the current appliance - + Lista detalhada de todos os componentes de todas as máquinas virtuais da aplicação atual Settings File - + Ficheiro das Definições Base Folder - + Pasta Base Primary Group + Grupo Primário + + + Storage Controller (VirtioSCSI) @@ -2334,27 +2341,27 @@ UIApplianceImportEditorWidget Importing Appliance ... - A importar aplicação... + A importar a "Aplicação"... Reading Appliance ... - A ler aplicação... + A ler a "Aplicação"... &Import hard drives as VDI - + &Importar discos rígidos como VDI MAC Address &Policy: - + &Política de endereço Mac: Include all network adapter MAC addresses - + Incluir todos os endereços MAC do adaptador de rede Include only NAT network adapter MAC addresses - + Incluir todos os endereços MAC do adaptador de rede NAT Generate new MAC addresses for all network adapters @@ -2362,15 +2369,15 @@ Additional Options: - + Opções adicionais: When checked, all the hard drives that belong to this appliance will be imported in VDI format. - + Quando seleccionado, todos os discos rígidos que pertencem a esta aplicação serão importados no formato VDI. &Machine Base Folder: - + Pasta base da &máquina: Include all network adapter MAC addresses during importing. @@ -2390,19 +2397,19 @@ %1 col.1 text - %1 + %1 %1: %2 col.1 text: col.2 text - + UIApplianceUnverifiedCertificateViewer Unverifiable Certificate! Continue? - + Certificado não verificável! Continuar? <b>The appliance is signed by an unverified self signed certificate issued by '%1'. We recommend to only proceed with the importing if you are sure you should trust this entity.</b> @@ -2414,11 +2421,11 @@ True - + Verdadeiro False - + Falso <tr><td>%1:</td><td>%2</td></tr> @@ -2427,11 +2434,11 @@ Issuer - + Emissor Subject - + Assunto Not Valid Before @@ -2443,7 +2450,7 @@ Serial Number - + Número de Série Self-Signed @@ -2451,7 +2458,7 @@ Authority (CA) - + Autoridade (CA) Public Algorithm @@ -2460,7 +2467,7 @@ %1 (%2) value (clarification) - + %1 (%2) Signature Algorithm @@ -2468,58 +2475,58 @@ X.509 Version Number - + X.509 Número da Versão UIAudioControllerEditor Audio &Controller: - &Controlador Áudio: + &Controlador de áudio: UIAudioHostDriverEditor Host Audio &Driver: - &Controlador Áudio do Hospedeiro: + &Controlador de áudio do anfitrião: UIBaseMemoryEditor Base &Memory: - &Memória Base: + &Memória base: %1 MB - + %1 MB MB - MB + MB UIBootOrderEditor &Boot Order: - &Ordem de Arranque: + &Ordem de arranque: Move Up - + Mover para Cima Move Down - + Mover para Baixo UIChooserAbstractModel New group - + Novo grupo @@ -2527,7 +2534,7 @@ <b>%1</b> Group item tool-tip / Group name - + <b>%1</b> %n group(s) @@ -2540,62 +2547,62 @@ <nobr>%1</nobr> Group item tool-tip / Group info wrapper - <nobr>%1</nobr> + <nobr>%1</nobr> %n machine(s) Group item tool-tip / Machine info - - + + %n máquina(s) (%n running) Group item tool-tip / Running machine info - - + + (%n em execução) <nobr>%1</nobr> Group item tool-tip / Machine info wrapper - <nobr>%1</nobr> + <nobr>%1</nobr> <nobr>%1 %2</nobr> Group item tool-tip / Machine info wrapper, including running - <nobr>%1</nobr> {1 %2<?} + <nobr>%1 %2</nobr> Collapse group - + Ocultar grupo Expand group - + Expandir grupo UIChooserNodeGlobal Tools - + Ferramentas UIChooserNodeGroup Virtual Machine group - + Grupo da Máquina Virtual UIChooserNodeMachine Virtual Machine - + Máquina Virtual @@ -2621,113 +2628,113 @@ UIChooserView Contains a tree of Virtual Machines and their groups - + Contém uma árvore de Máquinas Virtuais e os seus grupos UICloudProfileDetailsWidget Name: - + Nome: Properties: - + Propriedades: Contains cloud profile settings - + Contém as definições do perfil da nuvem Enter a name for the new profile... - + Insira um nome para o novo perfil... Enter a name for this profile... - + Insira um nome para este perfil... Reset - Restaurar + Reiniciar Reset changes in current profile details - + Reiniciar as alterações nos detalhes do perfil atual Reset Changes (%1) - + Reiniciar Alterações (%1) Add - + Adicionar Add a new profile with following name - + Adicionar um novo perfil com o seguinte nome Add Profile (%1) - + Adicionar Perfil (%1) Apply - + Aplicar Apply changes in current profile details - + Aplicar as alterações nos detalhes do perfil atual Apply Changes (%1) - + Aplicar Alterações (%1) UICloudProfileManager Cloud Profile Manager - + Gestor de Perfis da Nuvem Reset - Restaurar + Reiniciar Apply - + Aplicar Close - Fechar + Fechar Reset changes in current cloud profile details - + Reiniciar as alterações nos detalhes do perfil da nuvem atual Apply changes in current cloud profile details - + Aplicar as alterações nos detalhes do perfil da nuvem atual Close dialog without saving - + Fechar a janela sem guardar Reset Changes (%1) - + Reiniciar Alterações (%1) Apply Changes (%1) - + Aplicar Alterações (%1) Close Window (%1) - + Fechar Janela (%1) Add Profile - + Adicionar Perfil @@ -2735,56 +2742,57 @@ MB size suffix MBytes=1024 KBytes - MB + MB <nobr>%1 MB</nobr> details report - <nobr>%1 MB</nobr> + <nobr>%1 MB</nobr> Enabled details report (3D Acceleration) - Activado + Ativada Disabled details report (3D Acceleration) - Desactivado + Desativada not set details report (execution engine) - + relatório de detalhes (mecanismo de execução) + não definido Active details report (Nested Paging) - Activo + Ativa Inactive details report (Nested Paging) - + Inativa Active details report (Unrestricted Execution) - Activo + Ativa Inactive details report (Unrestricted Execution) - + Inativa Execution engine details report - + Mecanismo de execução Nested Paging - + Paginação Integrada Unrestricted Execution @@ -2803,22 +2811,22 @@ Processors details report - Processadores + Processadores Powered Off MachineState - Desligado + Desligada Saved MachineState - Gravado + Guardado Aborted MachineState - Cancelado + Abortado Teleported @@ -2828,12 +2836,12 @@ Running MachineState - Em execução + Em execução Paused MachineState - Pausado + Pausado Guru Meditation @@ -2863,22 +2871,22 @@ Starting MachineState - A inicirar + A iniciar Stopping MachineState - A parar + A parar Saving MachineState - A gravar + A guardar Restoring MachineState - A restaurar + A restaurar Teleporting Paused VM @@ -2898,17 +2906,17 @@ Setting Up MachineState - A preparar + A preparar Unlocked SessionState - Destrancado + Desbloqueado Locked SessionState - Trancado + Bloqueado Spawning @@ -2918,22 +2926,22 @@ Unlocking SessionState - A destrancar + A desbloquear None ParavirtProvider - Nenhum + Nenhum Default ParavirtProvider - Predefinido + Predefinição Legacy ParavirtProvider - + Legado Minimal @@ -2943,107 +2951,108 @@ Hyper-V ParavirtProvider - + Hyper-V KVM ParavirtProvider - + KVM None DeviceType - Nenhum + Nenhum Floppy DeviceType - Disquete + Disquete Optical DeviceType - + Ótico Hard Disk DeviceType - Disco Rígido + Disco Rígido Network DeviceType - Rede + Rede USB DeviceType - USB + USB Shared Folder DeviceType - Pasta Partilhada + Pasta Partilhada Disabled ClipboardType - Desactivado + Desativado Host To Guest ClipboardType - Hospedeiro para Convidado + Anfitrião para Convidado Guest To Host ClipboardType - Convidado para Hospedeiro + Convidado para Anfitrião Bidirectional ClipboardType - Bi-direccional + Bidirecional Disabled DragAndDropType - Desactivado + Desativado Host To Guest DragAndDropType - Hospedeiro para Convidado + Anfitrião para Convidado Guest To Host DragAndDropType - Convidado para Hospedeiro + Convidado para Anfitrião Bidirectional DragAndDropType - Bi-direccional + Tipo Arrastar e Largar + Bidirecional PS/2 Mouse PointingHIDType - + Rato PS/2 USB Mouse PointingHIDType - + Rato USB USB Tablet PointingHIDType - + Tablet USB PS/2 and USB Mouse PointingHIDType - + Rato PS/2 e USB USB Multi-Touch Tablet @@ -3053,27 +3062,28 @@ None GraphicsControllerType - Nenhum + Tipo Controlador de Gráficos + Nenhum VBoxVGA GraphicsControllerType - + VBoxVGA VMSVGA GraphicsControllerType - + VMSVGA VBoxSVGA GraphicsControllerType - + VBoxSVGA Normal MediumType - Normal + Normal Immutable @@ -3088,12 +3098,12 @@ Shareable MediumType - Partilhável + Partilhável Readonly MediumType - Leitura-apenas + Apenas leitura Multi-attach @@ -3158,12 +3168,12 @@ Not attached NetworkAttachmentType - Não conectado + Não ligado NAT NetworkAttachmentType - NAT + NAT Bridged Adapter @@ -3173,47 +3183,47 @@ Internal Network NetworkAttachmentType - Rede Interna + Rede Interna Host-only Adapter NetworkAttachmentType - Adaptador Apenas do Hospedeiro + Apenas Adaptador do Hospedeiro Generic Driver NetworkAttachmentType - + Controlador Genérico NAT Network NetworkAttachmentType - + Rede NAT PCnet-PCI II (Am79C970A) NetworkAdapterType - PCnet-PCI II (Am79C970A) + PCnet-PCI II (Am79C970A) PCnet-FAST III (Am79C973) NetworkAdapterType - PCnet-FAST III (Am79C973) + PCnet-FAST III (Am79C973) Intel PRO/1000 MT Desktop (82540EM) NetworkAdapterType - Intel PRO/1000 MT Desktop (82540EM) + Intel PRO/1000 MT Desktop (82540EM) Intel PRO/1000 T Server (82543GC) NetworkAdapterType - Intel PRO/1000 T Server (82543GC) + Intel PRO/1000 T Server (82543GC) Intel PRO/1000 MT Server (82545EM) NetworkAdapterType - Servidor PRO/1000 MT Intel (82545EM) + Servidor PRO/1000 MT Intel (82545EM) Paravirtualized Network (virtio-net) @@ -3223,22 +3233,22 @@ Deny NetworkAdapterPromiscModePolicy - + Negar Allow VMs NetworkAdapterPromiscModePolicy - + Permitir VMs Allow All NetworkAdapterPromiscModePolicy - + Permitir Tudo Disconnected PortMode - Desconectado + Desligada Host Pipe @@ -3248,7 +3258,7 @@ Host Device PortMode - Dispositivo no Hospedeiro + Dispositivo Anfitrião Raw File @@ -3258,252 +3268,252 @@ TCP PortMode - TCP + TCP OHCI USBControllerType - + OHCI EHCI USBControllerType - + EHCI xHCI USBControllerType - + xHCI Not supported USBDeviceState - Não suportado + Não suportado Unavailable USBDeviceState - Não disponível + Indisponível Busy USBDeviceState - Ocupado + Ocupado Available USBDeviceState - Disponível + Disponível Held USBDeviceState - Reservado + Reservado Captured USBDeviceState - Capturado + Capturado Ignore USBDeviceFilterAction - Ignorar + Ignorar Hold USBDeviceFilterAction - Reservar + Reservar Null Audio Driver AudioDriverType - Controlador de Áudio Nulo + Controlador de Áudio Nulo Windows Multimedia AudioDriverType - Multimédia do Windows + Multimédia do Windows OSS Audio Driver AudioDriverType - Controlador de Áudio OSS + Controlador de Áudio OSS ALSA Audio Driver AudioDriverType - Controlador de Áudio ALSA + Controlador de Áudio ALSA Windows DirectSound AudioDriverType - Windows DirectSound + Windows DirectSound CoreAudio AudioDriverType - CoreAudio + CoreAudio PulseAudio AudioDriverType - PulseAudio + PulseAudio Solaris Audio AudioDriverType - Áudio Solaris + Áudio Solaris ICH AC97 AudioControllerType - ICH AC97 + ICH AC97 SoundBlaster 16 AudioControllerType - SoundBlaster 16 + SoundBlaster 16 Intel HD Audio AudioControllerType - Áudo HD Intel + Intel HD Audio Null AuthType - + Nulo External AuthType - Externo + Externo Guest AuthType - Convidado + Convidado IDE StorageBus - IDE + IDE SATA StorageBus - SATA + SATA SCSI StorageBus - SCSI + SCSI Floppy StorageBus - Disquete + Disquete SAS StorageBus - SAS + SAS USB StorageBus - USB + USB PCIe StorageBus - + PCIe virtio-scsi StorageBus - + virtio-scsi LsiLogic StorageControllerType - + LsiLogic BusLogic StorageControllerType - BusLogic + BusLogic AHCI StorageControllerType - AHCI + AHCI PIIX3 StorageControllerType - PIIX3 + PIIX3 PIIX4 StorageControllerType - PIIX4 + PIIX4 ICH6 StorageControllerType - ICH6 + ICH6 I82078 StorageControllerType - I82078 + I82078 LsiLogic SAS StorageControllerType - SAS LsiLogic + SAS LsiLogic USB StorageControllerType - USB + USB NVMe StorageControllerType - + NVMe virtio-scsi StorageControllerType - + virtio-scsi PIIX3 ChipsetType - PIIX3 + PIIX3 ICH9 ChipsetType - ICH9 + ICH9 UDP NATProtocol - UDP + UDP TCP NATProtocol - TCP + TCP Starting GuestSessionStatus - A inicirar + A inicirar Starting @@ -3518,102 +3528,102 @@ B size suffix Bytes - B + B KB size suffix KBytes=1024 Bytes - KB + KB GB size suffix GBytes=1024 MBytes - GB + GB TB size suffix TBytes=1024 GBytes - TB + TB PB size suffix PBytes=1024 TBytes - PB + PB - IDE Primary Device 0 + IDE Primary Master StorageSlot - IDE 'Master' Principal + IDE Master Principal - IDE Primary Device 1 + IDE Primary Slave StorageSlot - IDE 'Slave' Principal + IDE Slave Principal - IDE Secondary Device 0 + IDE Secondary Master StorageSlot - IDE 'Master' Secundário + IDE Master Secundário - IDE Secondary Device 1 + IDE Secondary Slave StorageSlot - IDE 'Slave' Secundário + IDE Slave Secundário SATA Port %1 StorageSlot - Porta SATA %1 + Porta SATA %1 SCSI Port %1 StorageSlot - Porta SCSI %1 + Porta SCSI %1 SAS Port %1 StorageSlot - Porta SAS %1 + Porta SAS %1 Floppy Device %1 StorageSlot - Dispositivo de Disquete %1 + Dispositivo de Disquete %1 USB Port %1 StorageSlot - + Porta USB %1 NVMe Port %1 StorageSlot - + Porta NVMe %1 virtio-scsi Port %1 StorageSlot - + Porta virtio-scsi %1 Name - Nome + Nome OS - + SO Location - Localização + Localização Groups - + Grupos RAM - RAM + RAM CPU Count @@ -3625,23 +3635,23 @@ Boot Order - Ordem de Arranque + Ordem de Arranque Chipset Type - + Tipo de Chipset Firmware - + Firmware Acceleration - Aceleração + Aceleração VRAM - + VRAM Screen Count @@ -3649,60 +3659,56 @@ Scale Factor - + Fator de Escala Graphics Controller - + Controlador de Gráficos VRDE - + VRDE Recording - + Gravação Hard Disks - Discos Rígidos + Discos Rígidos Optical Devices - + Dispositivos Óticos Floppy Devices - + Dispositivos de Disquete Driver - + Controlador Controller - Controlador + Controlador Input/Output - + Entrada / Saída Not Attached network adapter - + Não Ligado NAT - NAT - - - Bridget Adapter - + NAT Internal Network - Rede Interna + Rede Interna Host Only Adapter @@ -3710,16 +3716,16 @@ Generic Driver - + Controlador Genérico NAT Network - + Rede NAT Disconnected serial port - Desconectado + Desligado Host Pipe @@ -3727,7 +3733,7 @@ Host Device - Dispositivo no Hospedeiro + Dispositivo Anfitrião Raw File @@ -3735,7 +3741,7 @@ TCP - TCP + TCP Device Filters @@ -3743,30 +3749,30 @@ Menu Bar - + Barra do Menu Status Bar - + Barra de Estado Mini Toolbar - + Barra de Ferramentas Mini General DetailsElementType - Geral + Geral Preview DetailsElementType - Prever + Pré-visualizar System DetailsElementType - Sistema + Sistema Display @@ -3776,77 +3782,77 @@ Storage DetailsElementType - Armazenamento + Armazenamento Audio DetailsElementType - Áudio + Áudio Network DetailsElementType - Rede + Rede Serial ports DetailsElementType - + Portas série USB DetailsElementType - USB + USB Shared folders DetailsElementType - + Pastas partilhadas User interface DetailsElementType - + Interface do utilizador Description DetailsElementType - Descrição + Descrição Hard Disks IndicatorType - Discos Rígidos + Discos Rígidos Optical Disks IndicatorType - + Discos Óticos Floppy Disks IndicatorType - + Disquetes Audio IndicatorType - Áudio + Áudio Network IndicatorType - Rede + Rede USB IndicatorType - USB + USB Shared Folders IndicatorType - Pastas Partilhadas + Pastas Partilhadas Display @@ -3856,37 +3862,38 @@ Recording IndicatorType - + Gravação Features IndicatorType - + Tipo Indicador + Funcionalidades Mouse IndicatorType - + Rato Keyboard IndicatorType - + Teclado General InformationElementType - Geral + Geral Preview InformationElementType - Prever + Pré-visualizar System InformationElementType - Sistema + Sistema Display @@ -3896,42 +3903,42 @@ Storage InformationElementType - Armazenamento + Armazenamento Audio InformationElementType - Áudio + Áudio Network InformationElementType - Rede + Rede Serial ports InformationElementType - + Portas série USB InformationElementType - USB + USB Shared folders InformationElementType - + Pastas partilhadas User interface InformationElementType - + Interface do utilizador Description InformationElementType - Descrição + Descrição Runtime attributes @@ -3995,49 +4002,49 @@ %n year(s) - + %n ano(s) %n month(s) - - %n mês(es) + + %n mês(meses) %n day(s) - + %n dia(s) %n hour(s) - + %n hora(s) %n minute(s) - + %n minuto(s) %n second(s) - + %n segundo(s) Please choose a virtual hard disk file - + Por favor, escolha um ficheiro de disco rígido virtual All virtual hard disk files (%1) @@ -4061,136 +4068,136 @@ All files (*) - Todos os ficheiros (*) + Todos os Ficheiros (*) Unknown device USB device details - Dispositivo desconhecido + Dispositivo desconhecido Unknown device %1:%2 USB device details - Dispositivo desconhecido %1:%2 + Dispositivo desconhecido %1:%2 <nobr>Vendor ID: %1</nobr><br><nobr>Product ID: %2</nobr><br><nobr>Revision: %3</nobr> USB device tooltip - <nobr>ID do Fabricante: %1</nobr><br><nobr>ID do Produto: %2</nobr><br><nobr>Revisão: %3</nobr> + <nobr>Id. do fabricante: %1</nobr><br><nobr>Id. do produto: %2</nobr><br><nobr>Revisão: %3</nobr> <br><nobr>Serial No. %1</nobr> USB device tooltip - <br><nobr>Número de Série %1</nobr> + <br><nobr>Número de Série %1</nobr> <br><nobr>State: %1</nobr> USB device tooltip - <br><nobr>Estado: %1</nobr> + <br><nobr>Estado: %1</nobr> <nobr>Vendor ID: %1</nobr> USB filter tooltip - <nobr>ID do Fabricante: %1</nobr> + <nobr>Id. do fabricante: %1</nobr> <nobr>Product ID: %2</nobr> USB filter tooltip - <nobr>ID do Produto: %2</nobr> + <nobr>Id. do produto: %2</nobr> <nobr>Revision: %3</nobr> USB filter tooltip - <nobr>Revisão: %3</nobr> + <nobr>Revisão: %3</nobr> <nobr>Product: %4</nobr> USB filter tooltip - <nobr>Produto: %4</nobr> + <nobr>Produto: %4</nobr> <nobr>Manufacturer: %5</nobr> USB filter tooltip - <nobr>Fabricante: %5</nobr> + <nobr>Fabricante: %5</nobr> <nobr>Serial No.: %1</nobr> USB filter tooltip - + <nobr>Número de série: %1</nobr> <nobr>Port: %1</nobr> USB filter tooltip - <nobr>Porta: %1</nobr> + <nobr>Porta: %1</nobr> <nobr>State: %1</nobr> USB filter tooltip - <nobr>Estado: %1</nobr> + <nobr>Estado: %1</nobr> User-defined serial port - Definido pelo Utilizador + Definido pelo utilizador Inaccessible medium - Inacessível + Inacessível Empty medium - Vazio + Vazio Host Drive '%1' medium - Unidade do Hospedeiro '%1' + Unidade Anfitriã '%1' Host Drive %1 (%2) medium - Unidade do Hospedeiro %1 (%2) + Unidade Anfitriã %1 (%2) <p style=white-space:pre>Type (Format): %1 (%2)</p> medium - <p style=white-space:pre>Tipo (Formato): %1 (%2)</p> + <p style=white-space:pre>Tipo (Formato): %1 (%2)</p> <p>Attached to: %1</p> image - <p>Ligado a: %1</p> + <p>Ligado a: %1</p> <i>Not Attached</i> image - <i>Não Ligado</i> + <i>Não Ligado</i> <i>Checking accessibility...</i> medium - <i>A verificar acessibilidade...</i> + <i>A verificar acessibilidade...</i> Failed to check accessibility of disk image files. medium - Falha ao verificar a acessibilidade da média. + Não foi possível verificar a acessibilidade dos ficheiros da imagem de disco. <b>No disk image file selected</b> medium - <b>Nenhuma média seleccionada</b> + <b>Nenhum ficheiro de imagem de disco selecionado</b> You can also change this while the machine is running. - Pode também mudar isto enquanto a máquina está a correr. + Também pode alterar isto enquanto a máquina está em execução. <b>No disk image files available</b> medium - <b>Nenhuma média disponível</b> + <b>Sem ficheiros de imagem de disco disponível</b> You can create or add disk image files in the virtual machine settings. @@ -4204,12 +4211,12 @@ Encrypted medium - + Encriptado Checking... medium - A verificar... + A verificar... Some of the files in this hard disk chain are inaccessible. Please use the Virtual Medium Manager to inspect these files. @@ -4228,7 +4235,7 @@ Adapter %1 - Adaptador %1 + Adaptador %1 Please choose a location for new virtual hard disk file @@ -4265,40 +4272,108 @@ NetworkAttachmentType + + Undefined + GuestSessionStatus + + + + Started + GuestSessionStatus + + + + Terminating + GuestSessionStatus + + + + Terminated + GuestSessionStatus + + + + Timed Out (Killed) + GuestSessionStatus + + + + Timed Out (Abnormally) + GuestSessionStatus + + + + Down + GuestSessionStatus + + + + Error + GuestSessionStatus + + + + IDE Primary Device 0 + StorageSlot + + + + IDE Primary Device 1 + StorageSlot + + + + IDE Secondary Device 0 + StorageSlot + + + + IDE Secondary Device 1 + StorageSlot + + + + Bridged Adapter + Adaptador 'Bridged' + + + Cloud Network + + UICustomFileSystemModel Name - Nome + Nome Size - Tamanho + Tamanho Change Time - + Alterar Hora Owner - + Proprietário Permissions - + Permissões Path - Localização + Caminho New Directory - + Nova Diretoria Local Path - + Caminho Local @@ -4321,42 +4396,42 @@ Name details (general) - Nome + Nome Operating System details (general) - + Sistema Operativo Settings File Location details (general) - + Localização do Ficheiro das Definições Groups details (general) - + Grupos Information Inaccessible details - + Informação Inacessível Base Memory details (system) - + Memória Base %1 MB details - + %1 MB Processors details (system) - Processadores + Processadores Execution Cap @@ -4366,37 +4441,37 @@ %1% details - %1% + %1% Boot Order details (system) - Ordem de Arranque + Ordem de Arranque Chipset Type details (system) - + Tipo de Chipset EFI details (system) - + EFI Enabled details (system/EFI) - Activado + Ativado Disabled details (system/EFI) - Desactivado + Desativado VT-x/AMD-V details (system) - VT-x/AMD-V + VT-x/AMD-V Nested Paging @@ -4406,7 +4481,7 @@ PAE/NX details (system) - PAE/NX + PAE/NX Minimal Paravirtualization @@ -4426,52 +4501,52 @@ Acceleration details (system) - Aceleração + Aceleração Video Memory details (display) - Memória Gráfica + Memória de Vídeo Screens details (display) - Ecrãs + Ecrãs Scale-factor details (display) - + Fator de escala 2D Video details (display) - Vídeo 2D + Vídeo 2D 3D details (display) - 3D + 3D Acceleration details (display) - Aceleração + Aceleração Remote Desktop Server Port details (display/vrde) - Porta do Servidor de Ecrã Remoto + Porta do Servidor do Ecrã Remoto Remote Desktop Server details (display/vrde) - Servidor de Ecrã Remoto + Servidor do Ecrã Remoto Disabled details (display/vrde/VRDE server) - Desactivado + Desativado Frame Size: %1x%2, Frame Rate: %3fps, Bit Rate: %4kbps @@ -4485,57 +4560,57 @@ [Optical Drive] details (storage) - + [Unidade Ótica] Not Attached details (storage) - + Não Ligado Host Driver details (audio) - + Controlador Anfitrião Controller details (audio) - Controlador + Controlador Audio Output details (audio) - + Saída de Áudio Enabled details (audio/output) - Activado + Ativado Disabled details (audio/output) - Desactivado + Desativado Audio Input details (audio) - + Entrada de Áudio Enabled details (audio/input) - Activado + Ativado Disabled details (audio/input) - Desactivado + Desativado Disabled details (audio) - Desactivado + Desativado Bridged Adapter, %1 @@ -4545,67 +4620,67 @@ Internal Network, '%1' details (network) - + Rede Interna, '%1' Host-only Adapter, '%1' details (network) - + Adaptador apenas do Anfitrião, '%1' Generic Driver, '%1' details (network) - + Controlador Genérico, '%1' Generic Driver, '%1' { %2 } details (network) - + Controlador Genérico, '%1' { %2 } NAT Network, '%1' details (network) - + Rede NAT, '%1' Adapter %1 details (network) - Adaptador %1 + Adaptador %1 Disabled details (network/adapter) - Desactivado + Desativada Port %1 details (serial) - Porta %1 + Porta %1 Disabled details (serial) - Desactivado + Desativado USB Controller details (usb) - Controladora USB + Controlador USB Device Filters details (usb) - + Filtros de Dispositivo %1 (%2 active) details (usb) - %1 (%2 activos) + %1 (%2 ativos) Disabled details (usb) - Desactivado + Desativado USB Controller Inaccessible @@ -4615,97 +4690,97 @@ Shared Folders details (shared folders) - Pastas Partilhadas + Pastas Partilhadas None details (shared folders) - Nenhum + Nenhuma Menu-bar details (user interface) - + Barra do menu Enabled details (user interface/menu-bar) - Activado + Ativada Disabled details (user interface/menu-bar) - Desactivado + Desativada Status-bar details (user interface) - + Barra de estado Enabled details (user interface/status-bar) - Activado + Ativada Disabled details (user interface/status-bar) - Desactivado + Desativada Mini-toolbar Position details (user interface) - + Posição da barra de ferramentas mini Top details (user interface/mini-toolbar position) - + Topo Bottom details (user interface/mini-toolbar position) - + Base Mini-toolbar details (user interface) - + Barra de ferramentas mini Disabled details (user interface/mini-toolbar) - Desactivado + Desativada None details (description) - Nenhum + Nenhuma Recording File details (display/recording) - + Ficheiro de Gravação Recording Attributes details (display/recording) - + Atributos da Gravação Recording details (display/recording) - + Gravação Disabled details (display/recording) - Desactivado + Desativada Graphics Controller details (display) - + Controlador de Gráficos USB 1.1 (OHCI) Controller @@ -4724,7 +4799,7 @@ %1 MB - + %1 MB @@ -4894,7 +4969,7 @@ %1 details like 'General details' or 'Storage details' - + Detalhes %1 @@ -5177,14 +5252,14 @@ UIDetailsSet Contains the details of virtual machine '%1' - + Contém os detalhes da máquina virtual '%1' UIDetailsView Contains a list of Virtual Machine details - + Contém uma lista dos detalhes da Máquina Virtual @@ -5250,15 +5325,15 @@ Looking for %1... - + A procurar por %1... Downloading %1... - + A transferir %1... Verifying %1... - + A verificar %1... @@ -5285,18 +5360,18 @@ VirtualBox Guest Additions - + Adições de Convidado do VirtualBox UIDownloaderExtensionPack VirtualBox Extension Pack - + Pacote de Extensão do VirtualBox Select folder to save %1 to - + Selecione a pasta para guardar %1 @@ -5307,14 +5382,14 @@ VirtualBox User Manual - + Manual do Utilizador do VirtualBox UIEmptyFilePathSelector Choose... - + Escolher... @@ -5329,17 +5404,17 @@ Result&nbsp;Code: error info - Código&nbsp;do&nbsp;Resultado: + Código&nbsp;do&nbsp;resultado: Component: error info - Componente: + Componente: Interface: error info - Interface: + Interface: Callee: @@ -5508,70 +5583,70 @@ %1, %2: %3, %4 col.2 text, col.3 name: col.3 text, col.1 name - + %1, %2: %3, %4 %1, %2: %3 col.2 text, col.3 name: col.3 text - + %1, %2: %3 UIFDCreationDialog File Path: - + Caminho do ficheiro: Size: - Tamanho: + Tamanho: Format disk as FAT12 - + Formatar disco como FAT12 1.44M - 1.44M + 1.44M 1.2M - 1.2M + 1.2M 720K - 720K + 720K 360K - 360K + 360K Floppy Disk Creator - + Criador de Disquete UIFileManager %1 - File Manager - + %1 - Gestor de Ficheiros Close - Fechar + Fechar Clear - + Limpar Cancel - Cancelar + Cancelar Not yet started - + Ainda não iniciado Working @@ -5579,11 +5654,11 @@ Paused - Pausado + Pausado Canceled - + Cancelado Succeded @@ -5591,23 +5666,23 @@ Failed - + Falhou Invalid - + Inválido Remove Selected - + Remover Selecionado Remove Finished - + Remover Terminado Remove All - + Remover Tudo List directories on top @@ -5619,7 +5694,7 @@ Ask before delete - + Perguntar antes de eliminar Show a confirmation dialog before deleting files and directories @@ -5635,11 +5710,11 @@ Password - + Palavra-passe Show Password - + Mostrar Palavra-passe User name to authenticate session creation @@ -5647,31 +5722,31 @@ User Name - + Nome de Utilizador Password to authenticate session creation - + Palavra-passe para autenticar a criação da sessão Create Session - + Criar Sessão Close Session - + Fechar Sessão Total Size - + Tamanho Total bytes - + bytes File Count - + Contagem de Ficheiros Delete the selected file(s) and/or folder(s) @@ -5679,7 +5754,7 @@ Ask for this confirmation next time - + Da próxima vez, perguntar por esta confirmação Delete confirmation can be disabled/enabled also from the Options panel. @@ -5695,39 +5770,39 @@ Unknown - + Desconhecido File - + Ficheiro Directory - + Diretoria Symbolic Link - + Hiperligação Simbólica <b>Size:</b> %1 bytes - + <b>Tamanho:</b> %1 bytes <b>Allocated:</b> %1 bytes - + <b>Alocado:</b> %1 bytes directory - + diretoria file - + ficheiro symbolic link - + hiperligação simbólica character device @@ -5739,7 +5814,7 @@ fifo - + fifo socket @@ -5751,15 +5826,15 @@ unknown - + desconhecido illegal-value - + valor-ilegal <b>Type:</b> %1<br/> - + <b>Tipo:</b> %1<br/> <b>INode:</b> %1<br/> @@ -5767,7 +5842,7 @@ <b>Device:</b> %1<br/> - + <b>Dispositivo:</b> %1<br/> <b>Hardlinks:</b> %1<br/> @@ -5775,19 +5850,19 @@ <b>Mode:</b> %1<br/> - + <b>Modo:</b> %1<br/> <b>Attributes:</b> %1<br/> - + <b>Atributos:</b> %1<br/> <b>Device ID:</b> %1<br/> - + <b>Id. do dispositivo:</b> %1<br/> <b>Owner:</b> %1 (%2)<br/> - + <b>Proprietário:</b> %1 (%2)<br/> <b>Group:</b> %1 (%2)<br/> @@ -5799,15 +5874,15 @@ <b>Change:</b> %1<br/> - + <b>Alterado:</b> %1<br/> <b>Modified:</b> %1<br/> - + <b>Modificado:</b> %1<br/> <b>Access:</b> %1<br/> - + <b>Acesso:</b> %1<br/> <b>Selected:</b> %1 files and %2 directories<br/> @@ -5819,27 +5894,27 @@ Properties - + Propriedades <b>Name:</b> %1<br/> - + <b>Nome:</b> %1<br/> <b>Created:</b> %1<br/> - + <b>Criado:</b> %1<br/> <b>Owner:</b> %1 - + <b>Proprietário:</b> %1 Show hidden objects - + Mostrar objetos ocultados Show hidden files/directories - + Mostrar ficheiros/diretorias ocultados Guest File System @@ -5853,60 +5928,68 @@ No Guest Session found!<br>Please use the Session Panel to start a new guest session + + Close dialog without saving + + + + Reset Changes (%1) + Reiniciar Alterações (%1) + UIFilePathSelector &Copy - &Copiar + &Copiar Other... - Outro... + Outro... Reset - Restaurar + Restaurar Resets the folder path to the default value. - Restaura o caminho da pasta para o valor predefinido. + Restaura o caminho da pasta para o valor predefinido. Resets the file path to the default value. - Reinicializa a localização do ficheiro para o valor por defeito. + Restaura o caminho do ficheiro para o valor predefinido. <reset to default> - <restaurar para predefinido> + <restaurar para predefinido> The actual default path value will be displayed after accepting the changes and opening this window again. - O caminho predefinido actual será apresentado após aceitar as alterações e abrir este diálogo novamente. + O caminho predefinido atual será exibido depois de aceitar as alterações e abrir novamente esta janela. <not selected> - <não seleccionado> + <não selecionado> Please use the <b>Other...</b> item from the drop-down list to select a path. - Por favor use <b>Outro...</b> item da lista para seleccionar um caminho. + Por favor, utilize <b>Outro...</b> item da lista suspensa para selecionar um caminho. Displays a window to select a different folder. - + Exibe uma janela para selecionar uma pasta diferente. Displays a window to select a different file. - + Exibe uma janela para selecionar um ficheiro diferente. Holds the folder path. - + Mostra o caminho da pasta. Holds the file path. - + Mostra o caminho do ficheiro. @@ -6117,19 +6200,19 @@ UIFormEditorWidget Edit... - + Editar... Name - Nome + Nome Value - + Valor Assign value ... - + Atribuir valor... @@ -6586,28 +6669,28 @@ UIGlobalSettingsDisplay Maximum Guest Screen &Size: - + &Tamanho máximo do ecrã convidado: &Width: - + &Largura: &Height: - + &Altura: None Maximum Guest Screen Size - Nenhum + Nenhum Machine Windows: - + Janelas da máquina: &Raise Window Under Mouse - + Most&rar janela debaixo do rato Holds the maximum width which we would like the guest to use. @@ -6623,16 +6706,17 @@ Scale Factor: - + Fator de escala: Controls the guest screen scale factor. - + Controla o fator de escala do ecrã do convidado. Automatic Maximum Guest Screen Size - + Tamanho Máximo do Ecrã do Convidado + Automático Suggest a reasonable maximum screen size to the guest. The guest will only see this suggestion when guest additions are installed. @@ -6640,12 +6724,12 @@ Do not attempt to limit the size of the guest screen. - + Não tentar limitar o tamanho do ecrã convidado. Hint Maximum Guest Screen Size - + Personalizado Suggest a maximum screen size to the guest. The guest will only see this suggestion when guest additions are installed. @@ -6664,7 +6748,7 @@ Active - Activo + Ativo Name @@ -6684,7 +6768,7 @@ Select an extension package file - Seleccione um ficheiro de pacote de extensão + Selecione um ficheiro de pacote de extensão Extension package files (%1) @@ -6696,23 +6780,23 @@ &Extension Packages - + Pacotes de &Extensão Add Package - + Adicionar Pacote Remove Package - + Remover Pacote Adds new package. - + Adiciona novo pacote. Removes selected package. - + Remove o pacote selecionado. @@ -6723,11 +6807,11 @@ Holds the path to the default virtual machine folder. This folder is used, if not explicitly specified otherwise, when creating new virtual machines. - Mostra a localização predefinida da pasta de máquinas virtuais. Esta pasta é usada ao criar novas máquinas virtuais, a não ser que seja especificamente definida outra pasta, durante o processo de criação. + Mostra o caminho para a pasta predefinida das máquinas virtuais. Esta pasta é utilizada quando criar novas máquinas virtuais, a não ser que seja especificamente especificado. Holds the path to the library that provides authentication for Remote Display (VRDP) clients. - Mostra a localização para a biblioteca de autenticação de clientes com Ecrã Remoto (VRDP). + Mostra o caminho para a biblioteca que fornece a autenticação para os clientes de Monitor Remoto (VRDP). Default &Hard Disk Folder: @@ -6735,7 +6819,7 @@ Default &Machine Folder: - Pasta prédefinida das &Máquinas: + Pasta Predefinida da &Máquina: V&RDP Authentication Library: @@ -6767,15 +6851,15 @@ When checked, the host screensaver will be disabled whenever a virtual machine is running. - + Quando selecionado, o protetor de ecrã do anfitrião será desativado quando uma máquina virtual estiver em execução. Host Screensaver: - + Protetor de ecrã do anfitrião: &Disable When Running Virtual Machines - + &Desativar quando executar máquinas virtuais @@ -6790,7 +6874,7 @@ 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. - Quando seleccionada, o teclado é capturado automaticamente sempre que a janela do VM é activada. Quando o teclado é capturado, todas os toques nas teclas (incluindo como as do sistema Alt-Tab) são direccionados para o VM. + Quando seleccionada, o teclado é capturado automaticamente sempre que a janela do VM é ativada. Quando o teclado é capturado, todas os toques nas teclas (incluindo os do sistema, tal como Alt-Tab) são direcionados para a VM. &Auto Capture Keyboard @@ -6814,15 +6898,15 @@ &VirtualBox Manager - + Gestor do &VirtualBox Virtual &Machine - + &Máquina Virtual Lists all available shortcuts which can be configured. - + Lista todos os atalhos disponíveis que podem ser configurados. Holds a sequence to filter the shortcut list. @@ -6861,7 +6945,7 @@ 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. - Apresenta todas as linguagens de interface disponíveis. A língua em utilização está a <b>negrito</b>. Seleccione <i>Predefinido</i> para reinicializar a língua por defeito do sistema. + Lista todos os idiomas da interface disponíveis. O idioma em utilização está a <b>negrito</b>. Selecione <i>Predefinido</i> para reiniciar o idioma predefinido do sistema. Name @@ -6869,7 +6953,7 @@ Id - Identificador + Id Language @@ -6885,7 +6969,7 @@ &Interface Languages - + Idiomas da &Interface @@ -7028,44 +7112,44 @@ &NAT Networks - + Redes &NAT Lists all available NAT networks. - + Lista todas as redes NAT. Active NAT network - Activo + Ativa The name <b>%1</b> is being used for several NAT networks. - + O nome <b>%1</b> está a ser utilizado por várias redes NAT. Add NAT Network - + Adicionar Rede NAT Remove NAT Network - + Remover Rede NAT Edit NAT Network - + Editar Rede NAT Adds new NAT network. - + Adiciona nova rede NAT. Removes selected NAT network. - + Remove a rede NAT selecionada. Edits selected NAT network. - + Edita a rede NAT selecionada. @@ -7258,43 +7342,43 @@ UIGlobalSettingsNetworkDetailsNAT NAT Network Details - + Detalhes da Rede NAT &Enable Network - + &Ativar Rede Network &Name: - + &Nome da rede: Holds the name for this network. - + Mostra o nome para esta rede. Network &CIDR: - + &CIDR da rede: Holds the CIDR for this network. - + Mostra o CIDR para esta rede. Network Options: - + Opções da rede: Supports &DHCP - + Suporta &DHCP Supports &IPv6 - + Suporta &IPv6 Advertise Default IPv6 &Route - + Comunicar &Rota de IPv6 Predefinida Opens a window to manage port forwarding rules. @@ -7302,7 +7386,7 @@ &Port Forwarding - &Encaminhamento de &Porta + Encaminhamento de &Porta When checked, this network will be enabled. @@ -7322,65 +7406,65 @@ Displays a window to configure port forwarding rules. - + Exibe uma janela para configurar as regras de encaminhaento de porta. UIGlobalSettingsPortForwardingDlg Port Forwarding Rules - Regras de Encaminhamento de Portas + Regras de Encaminhamento de Porta IPv4 - + IPv4 IPv6 - + IPv6 UIGlobalSettingsProxy When chosen, VirtualBox will try to auto-detect host proxy settings for tasks like downloading Guest Additions from the network or checking for updates. - + Quando selecionado, o VirtualBox irá tentar detetar automaticamente as definições de "proxy" do anfitrião para as tarefas, tal como transferir "Adicições de Convidado" da rede ou procurar por atualizações. &Auto-detect Host Proxy Settings - + Detetar &automaticamente as «Definições do Proxy Anfitrião» When chosen, VirtualBox will use direct Internet connection for tasks like downloading Guest Additions from the network or checking for updates. - + Quando selecionado, o VirtualBox irá utilizar a ligação direta à Internet para as tarefas, tal como transferir "Adicições de Convidado" da rede ou procurar por atualizações. &Direct Connection to the Internet - + Ligação &Direta à Internet When chosen, VirtualBox will use the proxy settings supplied for tasks like downloading Guest Additions from the network or checking for updates. - + Quando selecionado, o VirtualBox irá utilizar as definições de "proxy" para as tarefas, tal como transferir "Adicições de Convidado" da rede ou procurar por atualizações. &Manual Proxy Configuration - + Configurar Proxy &Manualmente &URL: - + &URL: No proxy URL is currently specified. - + Atualmente não está especificado nenhum URL de "proxy". Invalid proxy URL is currently specified. - + Atualmente está especificado um URL de "proxy" inválido. You have provided a proxy password. Please be aware that the password will be saved in plain text. You may wish to configure a system-wide proxy instead and not store application-specific settings. - + Forneceu uma palavra-passe de proxy. Por favor, note que esta será guardada em texto simples. Pode desejar configurar um "proxy" por todo o sistema em vez disso e não guardar as definições específicas da aplicação. Holds the proxy URL. The format is: <table cellspacing=0 style='white-space:pre'><tr><td>[{type}://][{userid}[:{password}]@]{server}[:{port}]</td></tr><tr><td>http://username:password@proxy.host.com:port</td></tr></table> @@ -7391,11 +7475,11 @@ UIGlobalSettingsUpdate When checked, the application will periodically connect to the VirtualBox website and check whether a new VirtualBox version is available. - Quando seleccionado, a aplicação ligar-se-á periódicamente ao sítio web do VirtualBox para verificar se existe uma nova versão disponível. + Quando selecionado, a aplicação irá ligar periodicamente ao site da Web do VirtualBox para verificar se está disponível uma nova versão do VirtualBox. &Check for Updates - &Procurar por actualizações + &Procurar por atualizações &Once per: @@ -7411,19 +7495,19 @@ Check for: - Verificar: + Procurar por: <p>Choose this if you only wish to be notified about stable updates to VirtualBox.</p> - <p>Escolha esta se deseja apenas ser notificado acerca de actualizações estáveis para o VirtualBox.</p> + <p>Escolha esta se só deseja ser notificado sobre as atualizações estáveis para o VirtualBox.</p> &Stable Release Versions - &Lançamento de versões estáveis + Versões de &lançamento estáveis <p>Choose this if you wish to be notified about all new VirtualBox releases.</p> - <p>Escolha esta se deseja apenas ser notificado acerca de todos os lançamentos novos do VirtualBox.</p> + <p>Escolha esta se só deseja ser notificado sobre todos os lançamentos novos do VirtualBox.</p> &All New Releases @@ -7431,7 +7515,7 @@ <p>Choose this to be notified about all new VirtualBox releases and pre-release versions of VirtualBox.</p> - <p>Escolha esta se deseja apenas ser notificado acerca de todos os lançamentos novos e versões de pré-lançamento do VirtualBox.</p> + <p>Escolha esta se só deseja ser notificado sobre todos os lançamentos novos e versões de pré-lançamento do VirtualBox.</p> All New Releases and &Pre-Releases @@ -7439,14 +7523,14 @@ Selects 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. - + Seleciona com que freqüência é que a verificação de nova versão deverá ser realizada. Note que se deseja desativar completamente esta seleção, basta desselecionar a caixa de seleção acima. UIGraphicsControllerEditor &Graphics Controller: - + Controlador de &gráficos: @@ -7454,7 +7538,7 @@ %1: %2 'key: value', like 'Name: MyVM' - + %1: %2 @@ -7484,38 +7568,38 @@ UIGuestControlTreeWidget Terminate Process - + Terminar Processo Expand All - + Expandir Tudo Collapse All - + Ocultar Tudo Terminate Session - + Terminar Sessão Remove All Terminated Sessions/Processes - + Remover Todas Sessões/Processos Terminados Properties - + Propriedades UIGuestProcessControlDialog %1 - Guest Control - + %1 - Controlo de Convidado Close - Fechar + Fechar @@ -7526,53 +7610,53 @@ Session/Process ID - + Id. da Sessão / Processo Session Name/Process Command - + Nome da Sessão / Comando do Processo Session/Process Status - + Estado de Sessão / Processo UIGuestProcessTreeItem Process Name - + Nome do Processo Process Id - + Id. do Processo Process Status - + Estado do Processo Executable Path - + Caminho do Executável Arguments - + Argumentos UIGuestSessionTreeItem Session Name - + Nome da Sessão Session Id - + Id. da Sessão Session Status - + Estado da Sessão @@ -7586,7 +7670,7 @@ UIHostComboEditor <key_%1> - <key_%1> + <key_%1> Left @@ -7598,146 +7682,146 @@ Left Shift - Shift Esquerdo + Shift Esquerdo Right Shift - Shift Direito + Shift Direito Left Ctrl - Ctrl Esquerdo + Ctrl Esquerdo Right Ctrl - Ctrl Direito + Ctrl Direito Left Alt - Alt Esquerdo + Alt Esquerdo Right Alt - Alt Direito + Alt Direito Left WinKey - Tecla Windows Esquerda + Tecla Windows Esquerda Right WinKey - Tecla Windows Direita + Tecla Windows Direita Menu key - Tecla Menu + Tecla Menu Alt Gr - Alt Gr + Alt Gr Caps Lock - Caps Lock + Caps Lock Scroll Lock - Scroll Lock + Scroll Lock None - Nenhum + Nenhum Left %1 - + %1 Esquerda Right %1 - + %1 Direita Host+ - + Host+ UIHostNetworkDetailsWidget &Adapter - &Adaptador + &Adaptador &DHCP Server - Servidor &DHCP + Servidor de &DHCP Configure Adapter &Automatically - + Configurar Adaptador &Automaticamente Configure Adapter &Manually - + Configurar Adaptador &Manualmente &IPv4 Address: - Endereço &IPv4: + Endereço de &IPv4: Holds the host IPv4 address for this adapter. - Mostra o endereço IPv4 do hospedeiro para este adaptador. + Mostra o endereço de IPv4 do anfitrião para este adaptador. IPv4 Network &Mask: - &Máscara de Rede IPv4: + &Máscara de Rede de IPv4: Holds the host IPv4 network mask for this adapter. - Mostra a máscara de rede IPv4 do hospedeiro para este adaptador. + Mostra a máscara de rede de IPv4 do anfitrião para este adaptador. I&Pv6 Address: - Endereço I&Pv6: + Endereço de I&Pv6: Holds the host IPv6 address for this adapter if IPv6 is supported. - Mostra o endereço IPv6 do hospedeiro para este adaptador se o IPv6 for suportado. + Mostra o endereço de IPv6 do anfitrião para este adaptador se o IPv6 for suportado. IPv6 Prefix &Length: - &Comprimento da Máscara de Rede IPv6: + &Comprimento do Prefixo de IPv6: Holds the host IPv6 prefix length for this adapter if IPv6 is supported. - Mostra o comprimento da máscara de rede IPv6 do hospedeiro para este adaptador se o IPv6 for suportado. + Mostra o comprimento do prefixo da rede de IPv6 do anfitrião para este adaptador se o IPv6 for suportado. Reset - Restaurar + Reiniciar Apply - + Aplicar Reset changes in current interface details - + Restaura as alterações nos detalhes da interface atual Apply changes in current interface details - + Aplica as alterações nos detalhes da interface atual Reset Changes (%1) - + Reiniciar Alterações (%1) Apply Changes (%1) - + Aplicar Alterações (%1) &Enable Server - + &Ativar Servidor When checked, the DHCP Server will be enabled for this network on machine start-up. @@ -7745,7 +7829,7 @@ Server Add&ress: - Ende&reço do Servidor: + Ende&reço do servidor: Holds the address of the DHCP server servicing the network associated with this host-only adapter. @@ -7753,7 +7837,7 @@ Server &Mask: - &Máscara do Servidor: + &Máscara do servidor: Holds the network mask of the DHCP server servicing the network associated with this host-only adapter. @@ -7777,11 +7861,11 @@ Reset changes in current DHCP server details - + Reinicia as alterações nos detalhes do servidor de DHCP atual Apply changes in current DHCP server details - + Aplica as alterações nos detalhes do servidor de DHCP atual Host interface <nobr><b>%1</b></nobr> is set to obtain the address automatically but the corresponding DHCP server is not enabled. @@ -7874,7 +7958,7 @@ DHCP Server - Servidor DHCP + Servidor DHCP Enabled @@ -7913,31 +7997,31 @@ Name - Nome + Nome IPv4 Address/Mask - + Máscara/Endereço de IPv4 IPv6 Address/Mask - + Máscara/Endereço de IPv6 Host Network Manager - + Gestor de Redes Anfitriãs Reset - Restaurar + Reiniciar Apply - + Aplicar Close - Fechar + Fechar Reset changes in current host network details @@ -7953,23 +8037,23 @@ Reset Changes (%1) - + Reiniciar Alterações (%1) Apply Changes (%1) - + Aplicar Alterações (%1) Close Window (%1) - + Fechar Janela (%1) Adding network ... - + A adicionar a rede... Removing network ... - + A remover a rede... @@ -8174,16 +8258,16 @@ UIHotKeyTableModel Name - Nome + Nome Shortcut - + Atalho %1: %2 scope: description - + %1: %2 @@ -8329,57 +8413,57 @@ Disconnected cable (Network tooltip) - Desconectado + Desligado Screens Display tooltip - Ecrãs + Ecrãs Adapter %1 (%2) Network tooltip - + Adaptador %1 (%2) IP Network tooltip - + IP Cable Network tooltip - + Cabo Connected cable (Network tooltip) - + Ligado No USB devices attached USB tooltip - + Nenhum dispositivo USB ligado No shared folders Shared folders tooltip - + Nenhuma pasta partilhada Video memory Display tooltip - + Memória de vídeo 3D acceleration Display tooltip - + Aceleração 3D Recording disabled Recording tooltip - + Gravação desativada Video/audio recording file @@ -8439,12 +8523,12 @@ keyboard is not captured Keyboard tooltip - + teclado não é capturado keyboard is captured Keyboard tooltip - + teclado é capturado @@ -8779,43 +8863,43 @@ Enable DHCP Server - Activar + Ativar Adapter - Adaptador + Adaptador Automatically configured interface - Configurado automaticamente + Configurado automaticamente Manually configured interface - Configurado manualmente + Configurado manualmente IPv4 Address - Endereço IPv4 + Endereço de IPv4 Not set address - Não definido + Não definido IPv4 Network Mask - Máscara de Rede IPv4 + Máscara de Rede de IPv4 Not set mask - Não definido + Não definido IPv6 Address - Endereço IPv6 + Endereço de IPv6 IPv6 Prefix Length @@ -8824,29 +8908,29 @@ Not set length - Não definido + Não definido DHCP Server - Servidor DHCP + Servidor DHCP Enabled server - Activado + Ativado Disabled server - Desactivado + Desativado Address - Endereço + Endereço Network Mask - Máscara de Rede + Máscara de Rede Lower Bound @@ -8855,7 +8939,7 @@ Not set bound - Não definido + Não definido Upper Bound @@ -8872,7 +8956,7 @@ %1, %2 col.2 text, col.1 name - + %1: %2 {1,?} Network Name @@ -8944,22 +9028,22 @@ (built-in) Language - (embutido) + (integrado) <unavailable> Language - <indisponível> + <indisponível> <unknown> Author(s) - <desconhecido> + <desconhecido> Default Language - Predefinido + Predefinição @@ -8985,38 +9069,38 @@ Select a filename for the screenshot ... - + Selecione um nome de ficheiro para a captura... UIMachinePreview No preview - + Não pré-visualizar Update disabled - + Atualização desativada Every 0.5 s - A todos os 0.5 s + A cada 0.5 s Every 1 s - A todos os 1 s + A cada 1 s Every 2 s - A todos os 2 s + A cada 2 s Every 5 s - A todos os 5 s + A cada 5 s Every 10 s - A todos os 10 s + A cada 10 s @@ -9027,11 +9111,11 @@ Enable &Audio - Activar &Audio + &Ativar Áudio Host Audio &Driver: - &Controlador Áudio do Hospedeiro: + &Controlador de áudio do anfitrião: Controls the audio output driver. The <b>Null Audio Driver</b> makes the guest see an audio card, however every access to it will be ignored. @@ -9039,7 +9123,7 @@ Audio &Controller: - &Controlador Áudio: + &Controlador de áudio: Selects the type of the virtual sound card. Depending on this value, VirtualBox will provide different audio hardware to the virtual machine. @@ -9051,7 +9135,7 @@ Extended Features: - Caraterísticas Extendidas: + Funcionalidades estendidas: When checked, output to the virtual audio device will reach the host. Otherwise the guest is muted. @@ -9059,7 +9143,7 @@ Enable Audio &Output - + Ativar &Saída de Áudio When checked, the guest will be able to capture audio input from the host. Otherwise the guest will capture only silence. @@ -9067,7 +9151,7 @@ Enable Audio &Input - + Ativar &Entrada de Áudio @@ -9086,7 +9170,7 @@ Video &Memory: - &Memória Gráfica: + &Memória gráfica: Controls the amount of video memory provided to the virtual machine. @@ -9098,7 +9182,7 @@ Extended Features: - Caraterísticas Extendidas: + Funcionalidades extendidas: When checked, the virtual machine will be given access to the 3D graphics capabilities available on the host. @@ -9106,11 +9190,11 @@ Enable &3D Acceleration - Activar Aceleração &3D + Ativar Aceleração &3D &Remote Display - Ecrã &Remoto + Monitor &Remoto 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. @@ -9118,15 +9202,15 @@ &Enable Server - Activar S&ervidor + Ativar S&ervidor Server &Port: - Porta do &Servidor: + &Porta do servidor: Authentication &Method: - &Método de Autenticação: + &Método de autenticação: Defines the VRDP authentication method. @@ -9150,7 +9234,7 @@ Enable &2D Video Acceleration - Activar Aceleração Gráfica &2D + Ativar Aceleração de Vídeo &2D The VRDP Server port number. You may specify <tt>0</tt> (zero), to select port 3389, the standard port for RDP. @@ -9158,7 +9242,7 @@ Mo&nitor Count: - Número de Mo&nitores: + Número de mo&nitores: Controls the amount of virtual monitors provided to the virtual machine. @@ -9174,7 +9258,7 @@ &Allow Multiple Connections - &Permitir Várias Conexões + &Permitir Várias Ligações You have 3D Acceleration enabled for a operation system which uses the WDDM video driver. For maximal performance set the guest VRAM to at least <b>%1</b>. @@ -9190,7 +9274,7 @@ File &Path: - + &Caminho do ficheiro: Frame &Size: @@ -9202,15 +9286,15 @@ &Screens: - + Ecrã&s: &Screen - + &Ecrã Scale Factor: - + Fator de escala: Controls the guest screen scale factor. @@ -9218,7 +9302,7 @@ Acceleration: - + Aceleração: Holds the VRDP Server port number. You may specify <tt>0</tt> (zero), to select port 3389, the standard port for RDP. @@ -9270,7 +9354,7 @@ &Audio Quality: - + Qu&alidade do áudio: 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. @@ -9306,19 +9390,19 @@ fps - + fps kbps - + kbps User Defined - + Definido pelo Utilizador %1 fps - + %1 fps low @@ -9337,11 +9421,11 @@ <i>About %1MB per 5 minute video</i> - + <i>Cerca de %1MB por 5 minutos de víideo</i> Screen %1 - + Ecrã %1 When checked, enables video recording for screen %1. @@ -9349,7 +9433,7 @@ &Graphics Controller: - + Controlador de &gráficos: Selects the graphics adapter type the virtual machine will use. @@ -9373,7 +9457,7 @@ &Video Quality: - + Qualidade do &vídeo: Controls the <b>quality</b>. Increasing this value will make the audio sound better at the cost of an increased file size. @@ -9516,7 +9600,7 @@ &Shared Clipboard: - Área de Tran&sferência Partilhada: + Área de tran&sferência partilhada: 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. @@ -9532,7 +9616,7 @@ S&napshot Folder: - Pasta de &Capturas: + Pasta de &capturas: &Description @@ -9540,7 +9624,7 @@ Holds the description of the virtual machine. The description field is useful for commenting on configuration details of the installed guest OS. - Mostra a descrição da máquina virtual. O campo de descrição é útil para comentar detalhes de configuração do sistema operativo convidado instalado. + Mostra a descrição da máquina virtual. O campo de descrição é útil para comentar nos detalhes da configuração do SO convidado instalado. &Other @@ -9620,11 +9704,11 @@ D&rag'n'Drop: - + A&rrastar e largar: D&escription - D&escrição + D&escrição Selects the cipher to be used for encrypting the virtual machine disks. @@ -9632,15 +9716,15 @@ E&nter New Password: - + I&nserir nova palavra-passe: C&onfirm New Password: - + C&onfirmar nova palavra-passe: Disk Enc&ryption - + Enc&riptação de Disco When checked, disks attached to this virtual machine will be encrypted. @@ -9648,7 +9732,7 @@ En&able Disk Encryption - + &Ativar Encriptação de Disco Disk Encryption C&ipher: @@ -9771,11 +9855,11 @@ &MAC Address: - Endereço &MAC: + Endereço &MAC: 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. - Mostra o endereço MAC deste dispositivo. Contém exactamente 12 caracteres de {0-9,A-F}. Note que o segundo caracter tem de ser um dígito ímpar. + Mostra o endereço MAC deste adaptador. Este contém exatamente 12 carateres escolhidos de {0-9,A-F}. Note que o segundo caráter deve ser um dígito ímpar. Generates a new random MAC address. @@ -9841,7 +9925,7 @@ Adapter &Type: - &Tipo de Adaptador: + &Tipo de adaptador: no bridged network adapter is selected @@ -9882,7 +9966,7 @@ &Cable Connected - &Cabo conectado + &Cabo Ligado Opens a window to manage port forwarding rules. @@ -9894,7 +9978,7 @@ &Promiscuous Mode: - + &Modo promíscuo: Selects the promiscuous mode policy of the network adapter when attached to an internal network, host only network or a bridge. @@ -9902,7 +9986,7 @@ Generic Properties: - + Propriedades genéricas: Selects how this virtual adapter is attached to the real network of the Host OS. @@ -9922,7 +10006,7 @@ Displays a window to configure port forwarding rules. - + Exibe uma janela para configurar as regras de encaminhaento de porta. No bridged network adapter is currently selected. @@ -10173,11 +10257,11 @@ Shared &Folders - &Pastas Partilhadas + &Pastas Partilhadas Auto Mount - + Montar Autom. At @@ -10185,27 +10269,27 @@ Add Shared Folder - + Adicionar Pasta Partilhada Edit Shared Folder - + Editar Pasta Partilhada Remove Shared Folder - + Remover Pasta Partilhada Adds new shared folder. - + Adiciona nova pasta partilhada. Edits selected shared folder. - + Edita a pasta partilhada selecionada. Removes selected shared folder. - + Remove a pasta partilhada selecionada. @@ -10224,19 +10308,19 @@ Folder Path: - Localização da Pasta: + Caminho da pasta: Folder Name: - Nome da Pasta: + Nome da pasta: Holds the name of the shared folder (as it will be seen by the guest OS). - Mostra o nome de uma pasta partilhada (como será visto pelo SO convidado). + Mostra o nome da pasta partilhada (como será visto pelo SO convidado). When checked, the guest OS will not be able to write to the specified shared folder. - Quando seleccionado, o SO convidado não poderá escrever na pasta especificada. + Quando selecionado, o SO convidado não poderá gravar na pasta partilhada especificada. &Read-only @@ -10248,11 +10332,11 @@ When checked, the guest OS will try to automatically mount the shared folder on startup. - Quando seleccionado, o SO convidado tentará automaticamente montar a pasta partilhada no arranque. + Quando selecionado, o SO convidado tentará montar automaticamente a pasta partilhada no arranque. &Auto-mount - &Auto-montar + Montar &Automaticamente If checked, this shared folder will be permanent. @@ -10264,7 +10348,7 @@ Mount point: - + Ponto de montar: Where to automatically mount the folder in the guest. A drive letter (e.g. 'G:') for Windows and OS/2 guests, path for the others. If left empty the guest will pick something fitting. @@ -10284,11 +10368,11 @@ &Enable Serial Port - Activar Porta Séri&e + Ativar Porta Séri&e Port &Number: - &Número da Porta: + &Número da porta: 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. @@ -10312,7 +10396,7 @@ Port &Mode: - &Modo da Porta + &Modo da porta: 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. @@ -10360,7 +10444,7 @@ &Path/Address: - + &Caminho/endereço: <p>In <b>Host Pipe</b> mode: Holds the path to the serial port's pipe on the host. Examples: "\\.\pipe\myvbox" or "/tmp/myvbox", for Windows and UNIX-like systems respectively.</p><p>In <b>Host Device</b> mode: Holds the host serial device name. Examples: "COM1" or "/dev/ttyS0".</p><p>In <b>Raw File</b> mode: Holds the file-path on the host system, where the serial output will be dumped.</p><p>In <b>TCP</b> mode: Holds the TCP "port" when in server mode, or "hostname:port" when in client mode. @@ -10454,7 +10538,7 @@ <nobr><b>%1</b></nobr><br><nobr>Bus:&nbsp;&nbsp;%2</nobr><br><nobr>Type:&nbsp;&nbsp;%3</nobr> - <nobr><b>%1</b></nobr><br><nobr>Janela:&nbsp;&nbsp;%2</nobr><br><nobr>Tipo:&nbsp;&nbsp;%3</nobr> + <nobr><b>%1</b></nobr><br><nobr>Bus:&nbsp;&nbsp;%2</nobr><br><nobr>Tipo:&nbsp;&nbsp;%3</nobr> <nobr>Expand/Collapse&nbsp;Item</nobr> @@ -10550,7 +10634,7 @@ Hard &Disk: - &Disco Rígido: + &Disco rígido: &Storage Tree @@ -10566,7 +10650,7 @@ The Storage Tree can contain several controllers of different types. This machine currently has no controllers. - A Árvore de Armazenamento pode conter vários controladores de diferentes tipos. Esta máquina actualmente não tem controladores. + A «Árvore de Armazenamento» pode conter vários controladores de diferentes tipos. Esta máquina atualmente não tem controladores. Attributes @@ -10586,7 +10670,7 @@ Selects the sub-type of the storage controller currently selected in the Storage Tree. - Selecciona o sub-tipo de controlador de armazenamento seleccionado actualmente na Árvore de Armazenamento. + Seleciona o sub-tipo de controlador de armazenamento selecionado atualmente na «Árvore de Armazenamento». Selects the slot on the storage controller used by this attachment. The available slots depend on the type of the controller and other attachments on it. @@ -10602,11 +10686,11 @@ Virtual Size: - Tamanho Virtual: + Tamanho virtual: Actual Size: - Tamanho Actual: + Tamanho atual: Size: @@ -10670,11 +10754,11 @@ Floppy &Drive: - Unidade &Disquete: + Unidade de &disquete: 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. - Escolha uma disquete virtual ou uma unidade física para usar com o dispositivo virtual. A máquina virtual procurará um disco inserido no dispositivo com dados no ficheiro ou um disco na unidade física assim como os seus conteúdos. + Escolha uma disquete virtual ou uma unidade física para utilizar com a unidade virtual. A máquina virtual irá procurar um disco inserido na unidade com dados no ficheiro ou no disco na unidade física, assim como os seus conteúdos. Set up the virtual floppy drive @@ -10694,7 +10778,7 @@ Remove disk from virtual drive - Remover disco de dispositivo virtual + Remover disco da unidade virtual Choose a virtual floppy disk file... @@ -10702,15 +10786,15 @@ &Live CD/DVD - + CD/DVD &Live &Solid-state Drive - + Unidade de Estado &Sólido Details: - + Detalhes: at most one supported @@ -10736,7 +10820,7 @@ Controller: %1 - + Controlador: %1 Holds the name of the storage controller currently selected in the Storage Tree. @@ -10764,24 +10848,24 @@ Encrypted with key: - + Encriptado com chave: Image storage image - Imagem + Imagem &Storage Devices - + Di&spositivos de Armazenamento <nobr>Expands/Collapses&nbsp;item.</nobr> - + <nobr>Expanda/Oculta&nbsp;item.</nobr> <nobr>Adds&nbsp;hard&nbsp;disk.</nobr> - + <nobr>Adiciona&nbsp;disco&nbsp;rígido.</nobr> <nobr>Adds&nbsp;optical&nbsp;drive.</nobr> @@ -10833,7 +10917,7 @@ Optical &Drive: - + Uni&dade ótica: Choose a virtual optical 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. @@ -10841,83 +10925,83 @@ Remove Disk from Virtual Drive - + Remover Disco da Unidade Virtual PIIX3 (IDE) - + PIIX3 (IDE) PIIX4 (Default IDE) - + PIIX4 (Predefinição IDE) ICH6 (IDE) - + ICH6 (IDE) AHCI (SATA) - + AHCI (SATA) LsiLogic (Default SCSI) - + LsiLogic (Predefinição SCSI) BusLogic (SCSI) - + BusLogic (SCSI) LsiLogic SAS (SAS) - + LsiLogic SAS (SAS) I82078 (Floppy) - + I82078 (Disquete) USB - USB + USB NVMe (PCIe) - + NVMe (PCIe) virtio-scsi - + virtio-scsi Hard Disk - Disco Rígido + Disco Rígido Optical Drive - + Unidade Ótica Floppy Drive - + Unidade de Disquete Choose/Create a Virtual Hard Disk... - + Escolher/Criar um Disco Rígido Virtual... Choose a disk file... - + Escolha um ficheiro de disco... Choose/Create a Virtual Optical Disk... - + Escolher/Criar um Disco Ótico Virtual... Choose/Create a Virtual Floppy Disk... - + Escolher/Criar um Disco de Disquete Virtual... Choose/Create a disk image... - + Escolher/Criar uma imagem de disco... @@ -10937,7 +11021,7 @@ Base &Memory: - &Memória Base: + &Memória base: Controls the amount of memory provided to the virtual machine. If you assign too much, the machine might not start. @@ -11001,15 +11085,15 @@ Enable PA&E/NX - Activar PA&E/NX + Ativar PA&E/NX Acce&leration - Ace&laração + Ace&leração Hardware Virtualization: - Virtualização de Material: + Virtualização de hardware: 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. @@ -11017,7 +11101,7 @@ Enable &VT-x/AMD-V - Activar &VT-x/AMD-V + Ativar &VT-x/AMD-V When checked, the virtual machine will try to make use of the nested paging extension of Intel VT-x and AMD-V. @@ -11077,7 +11161,7 @@ % - + % &Paravirtualization Interface: @@ -11089,7 +11173,7 @@ %1% - %1% + %1% 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. @@ -11136,18 +11220,14 @@ - The hardware virtualization is enabled in the Acceleration section of the System page although it is not supported by the host system. It should be disabled in order to start the virtual system. - - - %1 CPU %1 is 1 for now - + %1 CPU %1 CPUs %1 is host cpu count * 2 for now - + %1 CPUs When checked, the nested hardware virtualization CPU feature will be exposed to the virtual machine. @@ -11401,11 +11481,11 @@ &Vendor ID: - &ID do Fabricante: + &Id. do fabricante: &Product ID: - ID do &Produto: + Id do &produto: &Revision: @@ -11421,7 +11501,7 @@ &Serial No.: - Número de &Série: + Número de &série: Por&t: @@ -11437,7 +11517,7 @@ USB Filter Details - Detalhes do filtro USB + Detalhes do Filtro de USB Holds 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. @@ -11476,7 +11556,7 @@ UIMachineWindow EXPERIMENTAL build %1r%2 - %3 - + Compilação EXPERIMENTAL %1r%2 - %3 @@ -11490,27 +11570,27 @@ UIMediumDetailsWidget &Attributes - + &Atributos &Information - + &Informação &Type: - &Tipo: + &Tipo: &Location: - + Localização: &Description: - &Descrição: + &Descrição: &Size: - + &Tamanho: Holds the type of this medium. @@ -11530,11 +11610,11 @@ Reset - Restaurar + Reiniciar Apply - + Aplicar Reset changes in current medium details @@ -11546,11 +11626,11 @@ Reset Changes (%1) - + Reiniciar Alterações (%1) Apply Changes (%1) - + Aplicar Alterações (%1) Cannot change medium size from <b>%1</b> to <b>%2</b> as storage shrinking is currently not implemented. @@ -11593,68 +11673,68 @@ UIMediumItem Current extension (*.%1) - + Extensão atual (*.%1) Choose the location of this medium - + Escolha a localização deste disco %1, %2: %3, %4: %5 col.1 text, col.2 name: col.2 text, col.3 name: col.3 text - + %1, %2: %3, %4: %5 Format: - + Formato: Storage details: - + Detalhes de armazenamento: Attached to: - Ligado a: + Ligado a: Encrypted with key: - + Encriptado com chave: UUID: - + UUID: <i>Not&nbsp;Attached</i> - + <i>Não&nbsp;Ligado</i> <i>Not&nbsp;Encrypted</i> - + <i>Não&nbsp;Encriptado</i> -- no info - -- + -- Moving medium ... - + A mover disco... Removing medium ... - + A remover disco... UIMediumManager &Optical disks - + Disc&os óticos &Floppy disks - + &Disquetes &Select @@ -11662,7 +11742,7 @@ &Hard disks - + Discos &rígidos Attached to: @@ -11675,39 +11755,39 @@ Name - Nome + Nome Virtual Size - Tamanho Virtual + Tamanho Virtual Actual Size - Tamanho Actual + Tamanho Atual Size - Tamanho + Tamanho Checking accessibility - A verificar acessibilidade + A verificar acessibilidade Virtual Media Manager - Gestor de Discos Virtuais + Gestor de Discos Virtuais Reset - Restaurar + Reiniciar Apply - + Aplicar Close - Fechar + Fechar Reset changes in current medium details @@ -11719,27 +11799,27 @@ Close dialog without saving - + Fechar janela sem guardar Reset Changes (%1) - + Reiniciar Alterações (%1) Apply Changes (%1) - + Aplicar Alterações (%1) Close Window (%1) - + Fechar Janela (%1) Current extension (*.%1) - + Extensão atual (*.%1) Choose the location of this medium - + Escolha a localização deste disco Size: @@ -11767,37 +11847,37 @@ Moving medium ... - + A mover disco... Resizing medium ... - + A redimensionar disco... UIMediumSearchWidget Search By Name - + Procurar por Nome Search By UUID - + Procurar por UUID Select the search type - + Selecione o tipo de procura UIMediumSelector &Add... - &Adicionar... + &Adicionar... Add Disk Image - + Adicionar Imagem de Disco Add existing disk image file @@ -11805,11 +11885,11 @@ &Create... - + &Criar... Create Disk Image - + Criar Imagem de Disco Create new disk image file @@ -11817,7 +11897,7 @@ &Refresh - Actualiza&r + Atualiza&r Refresh Disk Image Files (%1) @@ -11829,62 +11909,62 @@ Choose - + Escolher Name - Nome + Nome Virtual Size - Tamanho Virtual + Tamanho Virtual Actual Size - Tamanho Actual + Tamanho Atual Medium - + Disco Expand All - + Expandir Tudo Collapse All - + Ocultar Tudo Cancel - Cancelar + Cancelar Leave Empty - + Deixar em Branco Optical Disk Selector - + Seletor de Disco Ótico Floppy Disk Selector - + Seletor de Disquete Hard Disk Selector - + Seletor de Disco Rígido Virtual Medium Selector - + Seletor de Disco Virtual UIMediumSizeEditor <nobr>%1 (%2 B)</nobr> - <nobr>%1 (%2 B)</nobr> + <nobr>%1 (%2 B)</nobr> Holds the size of this medium. @@ -11895,15 +11975,15 @@ UIMenuBarEditorWidget Switch - Mudar + Mudar Close - Fechar + Fechar Toggle menu %1 - + Alternar menu %1 Popup menu %1 @@ -11911,7 +11991,7 @@ Enable Menu Bar - + Ativar Barra de Menu Virtual Screen Resize @@ -11956,15 +12036,15 @@ Do not show this message again msg box flag - Não mostrar esta mensagem novamente + Não voltar a mostrar esta mensagem Failed to open <tt>%1</tt>. Make sure your desktop environment can properly handle URLs of this type. - Falha ao abrir <tt>%1</tt>. Certifique-se de que o seu ambiente de trabalho consegue abrir URLs deste tipo. + Não foi possível abrir <tt>%1</tt>. Certifique-se que o seu ambiente de trabalho consegue abrir URLs deste tipo. <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> - <p>Falha ao inicializar COM ou encontrar o servidor COM VirtualBox. Provavelmente, o servidor VirtualBox não está a correr falhou ao iniciar.</p><p>A aplicação será agora terminada.</p> + <p>Não foi possível inicializar COM ou encontrar o servidor COM do VirtualBox. Provavelmente, o servidor do VirtualBox não está em execução ou não iniciou.</p><p>A aplicação será agora terminada.</p> <p>Failed to create the VirtualBox COM object.</p><p>The application will now terminate.</p> @@ -11980,15 +12060,15 @@ Failed to set global VirtualBox properties. - Falha ao definir as propriedades globais VirtualBox. + Não foi possível definir as propriedades globais do VirtualBox. Failed to access the USB subsystem. - Falha ao aceder ao sub-sistema USB. + Não foi possível aceder ao sub-sistema de USB. Failed to create a new virtual machine. - Falha ao criar uma nova máquina virtual. + Não foi possível criar uma nova máquina virtual. Failed to create a new virtual machine <b>%1</b>. @@ -12008,35 +12088,35 @@ Failed to start the virtual machine <b>%1</b>. - Falha ao iniciar a máquina virtual <b>%1</b>. + Não foi possível iniciar a máquina virtual <b>%1</b>. Failed to pause the execution of the virtual machine <b>%1</b>. - Falha ao pausar a execução da máquina virtual <b>%1</b>. + Não foi possível pausar a execução da máquina virtual <b>%1</b>. Failed to resume the execution of the virtual machine <b>%1</b>. - Falha ao resumir a execução da máquina virtual <b>%1</b>. + Não foi possível resumir a execução da máquina virtual <b>%1</b>. Failed to save the state of the virtual machine <b>%1</b>. - Falha ao gravar o estado da máquina virtual <b>%1</b>. + Não foi possível guardar o estado da máquina virtual <b>%1</b>. Failed to create a snapshot of the virtual machine <b>%1</b>. - Falha ao criar uma captura da máquina virtual <b>%1</b>. + Não foi possível criar uma captura da máquina virtual <b>%1</b>. Failed to stop the virtual machine <b>%1</b>. - Falha ao parar a máquina virtual <b>%1</b>. + Não foi possível parar a máquina virtual <b>%1</b>. Failed to remove the virtual machine <b>%1</b>. - Falha ao remover a máquina virtual <b>%1</b>. + Não foi possível remover a máquina virtual <b>%1</b>. Failed to discard the saved state of the virtual machine <b>%1</b>. - Falha ao descartar o estado gravado da máquina virtual <b>%1</b>. + Não foi possível rejeitar o estado guardado da máquina virtual <b>%1</b>. Failed to discard the snapshot <b>%1</b> of the virtual machine <b>%2</b>. @@ -12120,7 +12200,7 @@ Failed to create a new session. - Falha ao criar uma nova sessão. + Não foi possível criar uma nova sessão. Failed to open a session for a virtual machine with UUID <b>%1</b>. @@ -12128,7 +12208,7 @@ Failed to open a session for the virtual machine <b>%1</b>. - Falha ao abrir uma sessão para a máquina virtual <b>%1</b>. + Não foi possível abrir uma sessão para a máquina virtual <b>%1</b>. Failed to determine the accessibility state of the media <nobr><b>%1</b></nobr>. Some of the registered media may become inaccessible. @@ -12140,15 +12220,15 @@ Failed to remove the host network interface <b>%1</b>. - Falha ao remover o interface de rede do hospedeiro <b>%1</b>. + Não foi possível remover a interface de rede do anfitrião <b>%1</b>. Failed to attach the USB device <b>%1</b> to the virtual machine <b>%2</b>. - Falha ao ligar o dispositivo USB <b>%1</b> à máquina virtual <b>%2</b>. + Não foi possível ligar o dispositivo USB <b>%1</b> à máquina virtual <b>%2</b>. Failed to detach the USB device <b>%1</b> from the virtual machine <b>%2</b>. - Falha ao desligar o dispositivo USB <b>%1</b> da máquina virtual <b>%2</b>. + Não foi possível desligar o dispositivo USB <b>%1</b> da máquina virtual <b>%2</b>. Failed to create the shared folder <b>%1</b> (pointing to <nobr><b>%2</b></nobr>) for the virtual machine <b>%3</b>. @@ -12365,7 +12445,7 @@ Discard saved state - Descartar + Ignorar Continue @@ -12411,12 +12491,12 @@ Insert additions - Montar + Inserir <p>The host key is currently defined as <b>%1</b>.</p> additional message box paragraph - <p>A chave da m+aquina está actualmente definida como <b>%1</b>.</p> + <p>A chave do anfitrião está atualmente definida como <b>%1</b>.</p> Capture @@ -12430,7 +12510,7 @@ Check inaccessible media message box - Seleccionar + Selecionar <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>Backup</b> to create backup copies of the settings files in the old format before saving them in the new format;</li><li><b>Cancel</b> to not save the auto-converted settings files now.<li></ul><p>Note that if you select <b>Cancel</b>, the auto-converted settings files will be implicitly saved in the new format anyway once you change a setting or start a virtual machine, but <b>no</b> backup copies will be created in this case.</p> @@ -12478,7 +12558,7 @@ Go Back no hard disk attached - Voltar + Anterior Failed to copy file <b><nobr>%1</nobr></b> to <b><nobr>%2</nobr></b> (%3). @@ -12500,11 +12580,11 @@ You are already running the most recent version of VirtualBox. - Já está a correr a versão mais recente do VirtualBox. + Já está a executar a versão mais recente do VirtualBox. <p>The Virtual Machine reports that the guest OS supports <b>mouse pointer integration</b>. This means that you do not need to <i>capture</i> the mouse pointer to be able to use it in your guest OS -- all mouse actions you perform when the mouse pointer is over the Virtual Machine's display are directly sent to the guest OS. If the mouse is currently captured, it will be automatically uncaptured.</p><p>The mouse icon on the status bar will look like&nbsp;<img src=:/mouse_seamless_16px.png/>&nbsp;to inform you that mouse pointer integration is supported by the guest OS and is currently turned on.</p><p><b>Note</b>: Some applications may behave incorrectly in mouse pointer integration mode. You can always disable it for the current session (and enable it again) by selecting the corresponding action from the menu bar.</p> - <p>A Máquina Virtual informa que o sistema operativo convidado suporta o recurso de <b>integração de ponteiro do rato</b>. Isto significa que não precisa de <i>capturar</i> o ponteiro do rato para o poder usar no sistema operativo convidado -- todas as acções do rato que executar quando o ponteiro estiver em cima da janela da Máquina Virtual serão enviadas diretamente para o sistema operativo convidado. Se o rato estiver capturado, será automaticamente libertado.</p><p>O ícone do rato na barra de estado irá ficar assim:&nbsp;<img src=:/mouse_seamless_16px.png/>&nbsp;para o informar que a integração de ponteiro de rato é suportada pelo sistema operativo convidado e que este recurso está activo.</p><p><b>Nota</b>: Algumas aplicações poderão comportar-se de forma estranha no modo de integração do ponteiro do rato. Se necessário, pode desactivar o recurso para a sessão actual (e activá-lo novamente) seleccionando a acção correspondente na barra de menu.</p> + <p>A Máquina Virtual informa que o SO convidado suporta a <b>integração de ponteiro do rato</b>. Isto significa que não precisa de <i>capturar</i> o ponteiro do rato para o poder utilizar no SO convidado -- todas as ações do rato que executar quando o ponteiro estiver por cima da janela da Máquina Virtual são enviadas diretamente para o SO convidado. Se o rato estiver capturado, este será libertado automaticamente.</p><p>O ícone do rato na barra de estado irá parecer-se como&nbsp;<img src=:/mouse_seamless_16px.png/>&nbsp;para o informar que a integração do ponteiro de rato é suportada pelo SO convidado e que está atualmente activado.</p><p><b>Nota</b>: algumas aplicações podem comportar-se de forma estranha no modo de integração do ponteiro do rato. Se necessário, pode desativá-lo para a sessão atual (e ativá-lo novamente) selecionando a ação correspondente na barra de menu.</p> <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>%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> @@ -12603,7 +12683,7 @@ Delete hard disk storage - Apagar + Eliminar Keep @@ -12694,7 +12774,7 @@ Delete - Apagar + Eliminar &Create @@ -12752,7 +12832,7 @@ Delete all files - Apagar todos os ficheiros + Eliminar todos os ficheiros Remove only @@ -12797,7 +12877,7 @@ &Upgrade - &Actualizar + &Atualizar &Reinstall @@ -12815,7 +12895,8 @@ Install extension pack - Instalar + pacote de extensão + Instalar Close Virtual Machine @@ -12823,7 +12904,7 @@ Ignore - Ignorar + Ignorar Create &new disk @@ -12843,19 +12924,19 @@ Switch - Mudar + Mudar Download - Transferir + Transferir Close - Fechar + Fechar Do not show this message again - Não mostrar esta mensagem novamente + Não voltar a mostrar esta mensagem Insert @@ -12865,15 +12946,15 @@ Delete extension pack - Apagar + Eliminar Unknown option <b>%1</b>. - + Opção desconhecida <b>%1</b>. <b>%1</b> is an option for the VirtualBox VM runner (VirtualBoxVM) application, not the VirtualBox Manager. - + <b>%1</b> é uma opção para a aplicação em execução de VM VirtualBox (VirtualBoxVM), não o «Gestor do VirtualBox». 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. @@ -12958,7 +13039,7 @@ Rename - + Renomear Failed to set groups of the virtual machine <b>%1</b>. @@ -12999,7 +13080,7 @@ ACPI Shutdown machine - + Desligar ACPI <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> @@ -13008,7 +13089,7 @@ Power Off machine - + Desligar <p>You are about to start all of the following virtual machines:</p><p><b>%1</b></p><p>This could take some time and consume a lot of host system resources. Do you wish to proceed?</p> @@ -13064,11 +13145,11 @@ Failed to save the settings. - + Não foi possível guardar as definições. <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> - + <p>Deseja remover a rede NAT <nobr><b>%1</b>?</nobr></p><p>Se esta rede estiver a ser utilizada por uma ou mais adaptadores de rede de máquina virtual, estes adaptadores não poderão ser mais utilizados ​​até que corrija as suas definições, escolhendo um nome de rede diferente ou um tipo de ligação de adaptador diferente.</p> 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. @@ -13080,11 +13161,11 @@ Reload settings - + Recarregar definições Keep changes - + Manter alterações <p>Are you sure you want to delete the optical drive?</p><p>You will not be able to insert any optical disks or ISO images or install the Guest Additions without it!</p> @@ -13308,7 +13389,7 @@ <p>Do you want to remove the cloud profile <nobr><b>%1</b>?</nobr></p> - + <p>Deseja remover o perfil da nuvem <nobr><b>%1</b>?</nobr></p> <p>Do you want to import cloud profiles from external files?</p><p>VirtualBox cloud profiles will be overwritten and their data will be lost.</p> @@ -13316,7 +13397,7 @@ Import - + Importar You are about to create a new virtual machine without a hard disk. 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. @@ -13360,11 +13441,11 @@ Failed to check files. - + Não foi possível verificar os ficheiros. Failed to remove file. - + Não foi possível remover os ficheiros. <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> @@ -13384,7 +13465,7 @@ Bad password or authentication failure. - + Palavra-passe errada ou falha de autenticação. <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=https://www.virtualbox.org>https://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> directory, as well as a description of what you were doing when this error happened. Note that you can also access the above files by selecting <b>Show Log</b> from the <b>Machine</b> menu of the main VirtualBox window.</p><p>Press <b>OK</b> if you want to power off the machine or press <b>Ignore</b> if you want to leave it as is for debugging. Please note that debugging requires special knowledge and tools, so it is recommended to press <b>OK</b> now.</p> @@ -13416,7 +13497,7 @@ Change Network Settings - + Alterar Definições de Rede <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 any time to <b>uncapture</b> the keyboard and mouse (if it is captured) and return them to normal operation. The currently assigned host key is shown on the status bar at the bottom of the Virtual Machine window, next to the&nbsp;<img src=:/hostkey_16px.png/>&nbsp;icon. This icon, together with the mouse icon placed nearby, indicate the current keyboard and mouse capture state.</p> @@ -13452,7 +13533,7 @@ Do you wish to cancel all current network operations? - + Deseja cancelar todas as operações de rede atuais? <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> @@ -13544,15 +13625,15 @@ &Downgrade - + &Versão Anterior <p>The extension pack is already installed with the same version, would you like reinstall it? <p>%1</p><p><table cellpadding=0 cellspacing=5><tr><td><b>Name:&nbsp;&nbsp;</b></td><td>%2</td></tr><tr><td><b>Version:&nbsp;&nbsp;</b></td><td>%3</td></tr><tr><td><b>Description:&nbsp;&nbsp;</b></td><td>%4</td></tr></table></p> - + <p>O pacote de extensão já está instalado com a mesma versão, deseja reinstallá-lo? <p>%1</p><p><table cellpadding=0 cellspacing=5><tr><td><b>Nome:&nbsp;&nbsp;</b></td><td>%2</td></tr><tr><td><b>Versião:&nbsp;&nbsp;</b></td><td>%3</td></tr><tr><td><b>Descrição:&nbsp;&nbsp;</b></td><td>%4</td></tr></table></p> <p>You are about to remove the VirtualBox extension pack <b>%1</b>.</p><p>Are you sure you want to proceed?</p> - + <p>Está prestes a remover o pacote de extensão do VirtualBox <b>%1</b>.</p><p>Tem a certeza que deseja prosseguir?</p> Failed to open the Extension Pack <b>%1</b>. @@ -13612,7 +13693,7 @@ Ok - + Ok You are trying to shut down the guest with the ACPI power button. This is currently not possible because the guest does not support software shutdown. @@ -13711,18 +13792,6 @@ - Failed to open the medium with following ID: <nobr><b>%1</b></nobr>. - - - - Failed to acquire attachment parameter. - - - - Failed to acquire medium attribute. - - - Failed to create cloud machine. @@ -13796,19 +13865,19 @@ UIMiniToolBar Always show the toolbar - Mostrar sempre na barra de ferramentas + Mostrar sempre a barra de ferramentas Minimize Window - Minimizar Janela + Minimizar Janela Exit Full Screen or Seamless Mode - Sair do Ecrã Completo ou do Modo Integrado + Sair do «Ecrã Completo» ou do «Modo Integrado» Close VM - Fechar VM + Fechar o VM @@ -13819,7 +13888,7 @@ Use Host Screen %1 - Usar Ecrã Hospedeiro %1 + Utilizar Ecrã do Anfitrião %1 @@ -13834,27 +13903,27 @@ &Type: - &Tipo: + &Tipo: Selects the operating system family that you plan to install into this virtual machine. - Apresenta a família do sistema operativo que tenciona instalar nesta máquina virtual. + Seleciona a família do sistema operativo que tenciona instalar nesta máquina virtual. &Version: - &Versão: + &Versão: Selects the operating system type that you plan to install into this virtual machine (called a guest operating system). - Mostra o tipo de sistema operativo que planeia instalar nesta máquina virtual (chamado de sistema operativo convidado). + Seleciona o tipo de sistema operativo que planeia instalar nesta máquina virtual (chamado de sistema operativo convidado). Name: - + Nome: Machine Folder: - + Pasta da máquina: @@ -13865,12 +13934,12 @@ &Name: - &Nome: + &Nome: Not selected network adapter name - Não seleccionado + Não selecionado Selects the network adapter on the host system that traffic to and from this network card will go through. @@ -13901,55 +13970,55 @@ UINetworkManagerDialog Network Operations Manager - + Gestor de Operações de Rede There are no active network operations. - + Não existem operações de rede ativas. &Cancel All - + &Cancelar Tudo Cancel all active network operations - + Cancelar todas as operações de rede ativas Network Operation - + Operação de Rede Restart network operation - + Reiniciar operação de rede Cancel network operation - + Cancelar operação de rede The network operation failed with the following error: %1. - + A operação de rede falhou com o seguinte erro: %1. UINetworkManagerIndicator Current network operations: - + Operações de rede atuais: failed network operation - + falhou (%1 of %2) - + (%1 de %2) Double-click for more information. - + Duplo clique para mais informação. @@ -13957,7 +14026,7 @@ %1: %2 Context description: Error description - + %1: %2 Unable to initialize HTTP library @@ -13969,7 +14038,7 @@ Host not found - + Anfitrião não encontrado Content access denied @@ -14705,27 +14774,27 @@ UIPortForwardingTable Name - Nome + Nome Protocol - Protocolo + Protocolo Host IP - IP do Hospedeiro + IP do Anfitrião Host Port - Porta do Hospedeiro + Porta do Anfitrião Guest IP - IP do Convidado + IP do Convidado Guest Port - Porta do Convidado + Porta do Convidado Contains a list of port forwarding rules. @@ -14733,15 +14802,15 @@ Add New Rule - + Adicionar Nova Regra Copy Selected Rule - + Copiar Regra Seleccionada Remove Selected Rule - + Remover Regra Selecionada Adds new port forwarding rule. @@ -14753,7 +14822,7 @@ Removes selected port forwarding rule. - + Remove a regra de encaminhamento de porta selecionada. @@ -14789,30 +14858,30 @@ UIScaleFactorEditor Max - + Máx. Min - + Mín. All Monitors - + Todos os Ecrãs Monitor %1 - + Ecrã %1 Controls the guest screen scale factor. - + Controla o fator da escala do ecrã do convidado. UIScreenshotViewer Screenshot of %1 (%2) - Protector de Ecrã de %1 (%2) + Protector de Ecrã de %1 (%2) Click to view non-scaled screenshot. @@ -14859,7 +14928,7 @@ Updating Guest Additions - + Atualização das Adições de Convidado @@ -14867,14 +14936,14 @@ %1 status-bar indicator like 'hard-disk status-bar indicator' - + Indicador da barra de estado de %1 UISettingsDialog <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> - <i>Seleccione uma categoria de definições da lista do lado esquerdo e mova o rato sobre um item de definições para obter mais informação.</i> + <i>Selecione uma categoria das definições da lista no lado esquerdo e mova o rato sobre um item das definições para obter mais informação.</i> On the <b>%1</b> page, %2 @@ -14882,7 +14951,7 @@ Invalid settings detected - Definições inválidas detectadas + Detetadas definições inválidas Non-optimal settings detected @@ -14894,11 +14963,11 @@ <b>%1</b> page: - + Página <b>%1</b>: <b>%1: %2</b> page: - + Página <b>%1: %2</b>: @@ -14913,11 +14982,11 @@ Update - Actualizar + Atualizar Language - Língua + Idioma USB @@ -14937,19 +15006,19 @@ Allows to navigate through Global Property categories - + Permite navegar nas categorias de 'Propriedade Global' Display - + Monitor Proxy - + Proxy Preferences - + Preferências @@ -15028,45 +15097,45 @@ Allows to navigate through VM Settings categories - + Permite navegar nas categorias das 'Definições' da VM User Interface - + Interface do Utilizador Settings - + Definições UISettingsSerializerProgress Loading Settings... - + A carregar as definições... Saving Settings... - + A guardar as definições... UISnapshotDetailsWidget &Attributes - + &Atributos &Information - + &Informação &Name: - &Nome: + &Nome: &Description: - &Descrição: + &Descrição: Holds the snapshot name. @@ -15078,15 +15147,15 @@ Apply - + Aplicar Reset - Restaurar + Reiniciar Apply changes in current snapshot details - + Aplicar as alterações nos detalhes da captura atual Reset changes in current snapshot details @@ -15094,15 +15163,15 @@ Apply Changes (%1) - + Aplicar Alterações (%1) Reset Changes (%1) - + Reiniciar Alterações (%1) Click to enlarge the screenshot. - Clique para alargar a captura. + Clique para alargar a captura. Snapshot name is empty @@ -15118,7 +15187,7 @@ Take - + Capturar Take snapshot on the basis of current machine state @@ -15126,7 +15195,7 @@ Take Snapshot (%1) - + Criar Captura (%1) @@ -15435,7 +15504,7 @@ Copy - + Copiar This will delete the keyboard layout file as well. Proceed? @@ -15459,7 +15528,7 @@ Settings - + Definições Reset the keyboard and release all keys @@ -15523,7 +15592,7 @@ Layout - + Disposição The file will be saved under:<br> @@ -15598,38 +15667,38 @@ UIToolsModel Welcome - + Bem-vindo Media - + Discos Network - Rede + Rede Cloud - + Nuvem Details - + Detalhes Snapshots - + Capturas Logs - + Registos UIToolsView Contains a list of VirtualBox tools - + Contém uma lista de ferramentas do VirtualBox @@ -15637,7 +15706,7 @@ %1 col.1 text - %1 + %1 %1, Active @@ -15677,12 +15746,12 @@ <nobr>Port: %1</nobr> USB filter tooltip - <nobr>Porta: %1</nobr> + <nobr>Porta: %1</nobr> <nobr>State: %1</nobr> USB filter tooltip - <nobr>Estado: %1</nobr> + <nobr>Estado: %1</nobr> @@ -15776,7 +15845,7 @@ UIUpdateStepVirtualBox Checking for a new VirtualBox version... - + A procurar por uma nova versão do VirtualBox... @@ -15791,11 +15860,11 @@ <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 the virtual machine.</p> - <p>Grava o estado de execução actual da máquina virtual para o disco rígido físico do PC hospedeiro. </p><p>Na próxima vez que a máquina virtual for executada, será restaurada a partir do estado gravado e continuará a execução do mesmo sítio em que foi gravada, o que permitirá continuar o seu trabalho imediatamente.</p><p>Note que gravar o estado da máquina poderá demorar algum tempo, dependente do tipo do sistema operativo convidado e da quantidade de memória disponibilizada à máquina virtual.</p> + <p>Guarda o estado de execução atual da máquina virtual no disco rígido físico do PC anfitrião. </p><p>Na próxima vez que a máquina virtual for executada, esta será restaurada a partir do estado guardado e continuará a execução do mesmo local em que foi guardada, o que permitirá continuar o seu trabalho imediatamente.</p><p>Note que guardar o estado da máquina poderá demorar algum tempo, dependendo do tipo do sistema operativo convidado e da quantidade de memória disponibilizada para a máquina virtual.</p> &Save the machine state - Gravar o e&stado da máquina + Guardar o e&stado da máquina <p>Sends the ACPI Power Button press event to the virtual machine.</p><p>Normally, the guest operating system running inside the virtual machine will detect this event and perform a clean shutdown procedure. This is a recommended way to turn off the virtual machine because all applications running inside it will get a chance to save their data and state.</p><p>If the machine doesn't respond to this action then the guest operating system may be misconfigured or doesn't understand ACPI Power Button events at all. In this case you should select the <b>Power off the machine</b> action to stop virtual machine execution.</p> @@ -15823,11 +15892,11 @@ &Restore current snapshot '%1' - &Restaurar captura actual '%1' + &Restaurar captura atual '%1' &Continue running in the background - + &Continuar a execução em segundo plano <p>Close the virtual machine windows but keep the virtual machine running.</p><p>You can use the VirtualBox Manager to return to running the virtual machine in a window.</p> @@ -15917,55 +15986,55 @@ UIVMInformationDialog %1 - Session Information - %1 - Informação de Sessão + %1 - Informação da Sessão Configuration &Details - + &Detalhes da Configuração &Runtime Information - + Informação da E&xecução General - Geral + Geral System - Sistema + Sistema Display - + Monitor Storage - Armazenamento + Armazenamento Audio - Áudio + Áudio Network - Rede + Rede Serial Ports - Portas Série + Portas Série USB - USB + USB Shared Folders - Pastas Partilhadas + Pastas Partilhadas Performance &Monitor - + &Monitor de Desempenho No guest additions! This metric requires guest additions to work properly. @@ -15973,7 +16042,7 @@ Reset - Restaurar + Reiniciar Show Pie Chart @@ -15985,75 +16054,75 @@ Seconds - + Segundos CPU Load - + Carga CPU Guest Load - + Carga Convidado VMM Load - + Carga VMM RAM Usage - + Utilização RAM Total - + Total Free - + Livre Used - + Utilizado Network Rate - + Taxa de Rede Receive Rate - + Taxa de Receber Transmit Rate - + Taxa de Transmissão Total Received - + Total Recebido Total Transmitted - + Total Transmitido Disk IO Rate - + Taxa IO do Disco Write Rate - + Taxa de Gravação Read Rate - + Taxa de Leitura Total Written - + Total Gravado Total Read - + Total Leitura VM Exits @@ -16061,15 +16130,15 @@ Current - + Atual Runtime Attributes - Atributos de Execução + Atributos de Execução Screen Resolution - Resolução de Ecrã + Resolução do Ecrã VM Uptime @@ -16077,15 +16146,15 @@ Clipboard Mode - + Modo Área de Transferência Drag and Drop Mode - + Modo Arrastar e Largar VM Execution Engine - + Mecanismo de Execução da VM Nested Paging @@ -16109,71 +16178,71 @@ Guest Additions - Adições de Convidado + Adições de Convidado Guest OS Type - Tipo de SO Convidado + Tipo de SO Convidado Remote Desktop Server Port - Porta do Servidor de Ecrã Remoto + Porta do Servidor da Área de Trabalho Remota &Guest Control - + &Controlo de Convidado turned off Screen - + desligado Active Nested Paging - Activo + Ativa Inactive Nested Paging - + Inativa Active Unrestricted Execution - Activo + Ativa Inactive Unrestricted Execution - + Inativa Not Available VRDE Port - Não Disponível + Não Disponível not set Execution Engine - + não definido Not Detected Guest OS Type - + Não Detetado Not Detected Guest Additions Version - + Não Detetada UIVMListView Inaccessible - Inacessível + Inacessível @@ -16247,7 +16316,7 @@ UIVMLogViewerDialog %1 - Log Viewer - + %1 - Visualizador de Registo @@ -16266,7 +16335,7 @@ Close - Fechar + Fechar Select or enter a term which will be used in filtering the log text @@ -16278,7 +16347,7 @@ Showing %1/%2 - + A mostrar %1/%2 The filter terms list, select one to remove or click the button on the right side to remove them all @@ -16322,7 +16391,7 @@ Enter a search string here - Indique o termo para procurar aqui + Insira aqui um termo para procurar Search for the next occurrence of the string (F3) @@ -16334,7 +16403,7 @@ C&ase Sensitive - Distinguir &Maiúsculas + Sensível &Maiúsculas/Minúsculas When checked, perform case sensitive search @@ -16366,11 +16435,11 @@ Bookmark - + Marcador Save VirtualBox Log As - Gravar Registo VirtualBox Como + Guardar Registo do VirtualBox Como <p><b>No machine</b> is currently selected or the selected machine is not valid. Please select a Virtual Machine to see its logs @@ -16382,15 +16451,15 @@ Go to the next bookmark - + Ir para o marcador seguinte Go to the previous bookmark - + Ir para o marcador anterior Go to selected bookmark - + Ir para o marcador selecionado @@ -16428,15 +16497,15 @@ UIVideoMemoryEditor Video &Memory: - &Memória Gráfica: + &Memória de vídeo: %1 MB - + %1 MB MB - MB + MB @@ -16444,23 +16513,23 @@ Manager Note: main window title which is prepended by the product name. - Gestor + Gestor Select a virtual machine file - Seleccione um ficheiro de muina virtual + Selecione um ficheiro de máquina virtual Virtual machine files (%1) - Ficheiros de máquina virtual (%1) + Ficheiros de máquina virtual (%1) Select a destination folder to move the selected virtual machine - + Selecione uma pasta de destino para mover a máquina virtual selecionada Show Toolbar Text - + Mostrar Texto da Barra de Ferramentas @@ -16516,20 +16585,20 @@ UIVirtualMachineItemCloud Loading ... - + A carregar... Up-To-Date - + Atualizado <nobr><b>%1</b></nobr><br><nobr>Inaccessible</nobr> Inaccessible VM tooltip (name) - + <nobr><b>%1</b></nobr><br><nobr>Inacessível</nobr> Inaccessible - Inacessível + Inacessível @@ -16537,91 +16606,91 @@ <nobr>%1<br></nobr><nobr>%2 since %3</nobr><br><nobr>Session %4</nobr> VM tooltip (name, last state change, session state) - <nobr>%1<br></nobr><nobr>%2 desde %3</nobr><br><nobr>Sessão %4</nobr> + <nobr>%1<br></nobr><nobr>%2 desde %3</nobr><br><nobr>Sessão %4</nobr> <nobr><b>%1</b><br></nobr><nobr>Inaccessible since %2</nobr> Inaccessible VM tooltip (name, last state change) - <nobr><b>%1</b><br></nobr><nobr>Inacessível desde %2</nobr> + <nobr><b>%1</b><br></nobr><nobr>Inacessível desde %2</nobr> Inaccessible - Inacessível + Inacessível UIVisoCreator Remove selected file objects from VISO - + Remover os objetos de ficheiro selecionados de VISO Name - Nome + Nome Size - Tamanho + Tamanho Change Time - + Alterar Hora Owner - + Proprietário Permissions - + Permissões Local Path - + Caminho Local ISO Path - + Caminho de ISO &Options... - + &Opções... Show Hidden Objects - + Mostrar Objetos Ocultados Create a new directory under the current location - + Criar uma nova diretoria na localização atual Rename the selected object - + Renomear o objeto selecionado &Configuration... - + &Configuração... VISO Configuration - + Configuração de VISO Manage VISO Configuration - + Gerir Configuração de VISO Dialog Options - + Opções de Janela Manage Dialog Options - + Gerir Opções de Janela VISO Name: - + Nome de VISO: Custom VISO options: @@ -16629,35 +16698,35 @@ Close the pane - + Fechar o painel Remove - Remover + Remover New Directory - + Nova Diretoria Reset - Restaurar + Restaurar VISO Creator - + Criador de VISO VISO - + VISO Remove current option. - + Remover a opção atual. Add - + Adicionar Click to show/hide the tree view @@ -16676,41 +16745,41 @@ UIWelcomePane <h3>Welcome to VirtualBox!</h3><p>The left part of application window contains global tools and lists all virtual machines and virtual machine groups on your computer. You can import, add and create new VMs using corresponding toolbar buttons. You can popup a tools of currently selected element using corresponding element button.</p><p>You can press the <b>%1</b> key to get instant help, or visit <a href=https://www.virtualbox.org>www.virtualbox.org</a> for more information and latest news.</p> - + <h3>Bem-vindo ao VirtualBox!</h3><p>A parte esquerda da janela da aplicação contém ferramentas globais e lista todas as máquinas virtuais e os grupos de máquina virtual no seu computador. Pode importar, adicionar e criar novas VMs utilizando os botões correspondentes na barra de ferramentas. Pode abrir uma janela das ferramentas do elemento atual selecionado utilizando o botão correspondente do elemento.</p><p>Pode pressionar a tecla <b>%1</b> para obter ajuda instantânea, ou visite <a href=https://www.virtualbox.org>www.virtualbox.org</a> para mais informação e notícias mais recentes.</p> UIWizard &Expert Mode - + Modo &Avançado Switch to <nobr><b>Expert Mode</b></nobr>, a one-page dialog for experienced users. - + Mudar para o <nobr><b>«Modo Avançado»</b></nobr>, uma janela de uma página para os utilizadores experientes. &Guided Mode - + Modo &Assistido Switch to <nobr><b>Guided Mode</b></nobr>, a step-by-step dialog with detailed explanations. - + Mudar para o <nobr><b>«Modo Assistido»</b></nobr>, uma janela com explicações detalhadas de passo a passo. UIWizardCloneVD Copy - + Copiar &Dynamically allocated - + Alocado &dinamicamente &Fixed size - + Tamanho &fixo &Split into files of less than 2GB @@ -16718,15 +16787,15 @@ Storage on physical hard disk - + Armazenamento no disco rígido físico Copy Virtual Disk Image - + Copiar Imagem do Disco Virtual Disk image file type - + Tipo de ficheiro da imagem de disco Please choose the type of file that you would like to use for the new virtual disk image. If you do not need to use it with other virtualization software you can leave this setting unchanged. @@ -16754,7 +16823,7 @@ New disk image to create - + Nova imagem de disco para criar Please type the name of the new virtual disk image file into the box below or click on the folder icon to select a different folder to create the file in. @@ -16771,26 +16840,26 @@ &New disk image to create - + &Nova imagem de disco para criar Disk image file &type - + &Tipo de ficheiro da imagem de disco UIWizardCloneVM Linked Base for %1 and %2 - + Base Associada para %1 e %2 Clone Virtual Machine - + Clonar Máquina Virtual Clone - + Clonar %1 Clone @@ -16798,7 +16867,7 @@ Clone type - + Tipo de clone <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> @@ -16806,15 +16875,15 @@ &Full clone - + Clone &completo &Linked clone - + Clone &associado Snapshots - + Capturas <p>Please choose which parts of the snapshot tree should be cloned with the machine.</p> @@ -16862,7 +16931,7 @@ Name: - + Nome: Path: @@ -16874,11 +16943,11 @@ Include all network adapter MAC addresses - + Incluir todos os endereços MAC do adaptador de rede Include only NAT network adapter MAC addresses - + Incluir todos os endereços MAC do adaptador de rede NAT Generate new MAC addresses for all network adapters @@ -16894,7 +16963,7 @@ Additional Options: - + Opções adicionais: Don't change the disk names during cloning. @@ -16933,31 +17002,31 @@ UIWizardExportApp Checking files ... - A verificar ficheiros... + A verificar os ficheiros... Removing files ... - A remover ficheiros... + A remover os ficheiros... Exporting Appliance ... - A exportar aplicação... + A exportar a aplicação... Export Virtual Appliance - + Exportar Aplicação Virtual Restore Defaults - Restaurar Predefinições + Restaurar Predefinições Export - + Exportar Virtual machines to export - + Máquinas virtuais a exportar <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> @@ -16965,7 +17034,7 @@ Appliance settings - + Definições da aplicação Sun &Cloud @@ -16977,7 +17046,7 @@ Appliance - Aplicação + Aplicação &Username: @@ -16997,19 +17066,19 @@ &File: - &Ficheiro: + &Ficheiro: Open Virtualization Format Archive (%1) - Arquivo de Formato de Virtualização Aberto (%1) + Arquivo do Formato de Virtualização Aberto (%1) Open Virtualization Format (%1) - + Formato de Virtualização Aberto (%1) Write in legacy OVF 0.9 format for compatibility with other virtualization products. - Escrever no formato legado OVF para compatibilidade com outros produtos de virtualização. + Escrever no formato legado OVF 0.9 para compatibilidade com outros produtos de virtualização. &Write legacy OVF 0.9 @@ -17069,23 +17138,23 @@ Choose a file to export the virtual appliance to... - + Escolha um ficheiro para exportar a aplicação virtual para... Export to cloud service provider. - + Exportar para o fornecedor de serviço na nuvem. MAC Address &Policy: - + &Política de Endereço Mac: Include all network adapter MAC addresses - + Incluir todos os endereços MAC do adaptador de rede Include only NAT network adapter MAC addresses - + Incluir todos os endereços MAC do adaptador de rede NAT Strip all network adapter MAC addresses @@ -17105,7 +17174,7 @@ Additionally: - + Adicionalmente: &Write Manifest file @@ -17121,7 +17190,7 @@ &Account: - + Cont&a: <p>Please choose a filename to export the virtual appliance to. Besides that you can specify a certain amount of options which affects the size and content of resulting archive.</p> @@ -17129,11 +17198,11 @@ Virtual system settings - + Definições do sistema virtual Virtual &system settings - + Definições do &sistema virtual Include ISO image files into exported VM archive. @@ -17145,7 +17214,7 @@ Machine Creation: - + Criação de máquina: Ask me about it &after exporting disk as custom image @@ -17210,11 +17279,11 @@ Import - + Importar Appliance to import - + Aplicação a importar Select an appliance to import @@ -17222,11 +17291,11 @@ Open Virtualization Format (%1) - + Formato de Virtualização Aberto (%1) Appliance settings - + Definições da aplicação 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. @@ -17234,7 +17303,7 @@ Import Virtual Appliance - + Importar Aplicação Virtual Choose a virtual appliance file to import... @@ -17274,31 +17343,31 @@ Importing Appliance ... - A importar aplicação... + A importar a aplicação... Local File System - + Sistema de Ficheiros Local Import from local file system. - + Importar do sistema de ficheiros local. Import from cloud service provider. - + Importar do fornecedor de serviço na nuvem. &File: - &Ficheiro: + &Ficheiro: &Account: - + Cont&a: &Machines: - + &Máquinas: <p>Please choose one of cloud service accounts you have registered to import virtual machine from. Corresponding machines list will be updated. To continue, select one of machines to import below.</p> @@ -17314,11 +17383,11 @@ Source - Fonte + Fonte Settings - + Definições Acquire cloud instances ... @@ -17326,7 +17395,7 @@ Read appliance ... - + Ler aplicação... Acquire import form ... @@ -17338,26 +17407,26 @@ &Source: - + &Fonte: UIWizardNewCloudVM Create Cloud Machine ... - + Criar Máquina da Nuvem... Create Cloud Virtual Machine - + Criar Máquina Virtual da Nuvem Create - + Criar Destination to create - + Destino para criar Please choose the destination to create cloud virtual machine in. This can be one of known cloud service providers below. @@ -17373,15 +17442,15 @@ &Account: - + Cont&a: &Images: - + &Imagens: Cloud Virtual Machine settings - + Definições da Máquina Virtual da Nuvem These are the the suggested settings of the cloud VM creation procedure, they are influencing the resulting cloud VM instance. You can change many of the properties shown by double-clicking on the items and disable others using the check boxes below. @@ -17389,11 +17458,11 @@ Destination - + Destino Settings - + Definições Acquire launch form ... @@ -17405,7 +17474,7 @@ &Destination: - + &Destino: @@ -17416,11 +17485,11 @@ Create Virtual Hard Disk - + Criar Disco Rígido Virtual Create - + Criar Hard disk file type @@ -17432,7 +17501,7 @@ Storage on physical hard disk - + Armazenamento no disco rígido físico Please choose whether the new virtual hard disk file should grow as it is used (dynamically allocated) or if it should be created at its maximum size (fixed size). @@ -17452,11 +17521,11 @@ &Dynamically allocated - + Alocado &dinamicamente &Fixed size - + Tamanho &fixo &Split into files of less than 2GB @@ -17480,7 +17549,7 @@ File &location - + &Localização do ficheiro File &size @@ -17495,11 +17564,11 @@ UIWizardNewVM Create Virtual Machine - + Criar Máquina Virtual Create - + Criar IDE Controller @@ -17523,11 +17592,11 @@ Name and operating system - + Nome e sistema operativo Memory size - + Tamanho da memória <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> @@ -17535,11 +17604,11 @@ &Memory size - + Tamanho da &memória Hard disk - + Disco rígido <p>If you wish you can add a virtual hard disk to the new machine. You can either create a new hard disk 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 disk is <b>%1</b>.</p> @@ -17547,30 +17616,30 @@ &Do not add a virtual hard disk - + &Não adicionar um disco rígido virtual &Create a virtual hard disk now - + &Criar agora um disco rígido virtual &Use an existing virtual hard disk file - + &Utilizar um ficheiro existente de disco rígido virtual Choose a virtual hard disk file... - + Escolha um ficheiro de disco rígido virtual... Please choose a descriptive name and destination folder 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. - + Por favor, escolha um nome descritivo e uma pasta de destino para a nova máquina virtual e selecione o tipo de sistema operativo que pretende instalar na mesma. O nome que escolher será utilizado em todo o VirtualBox para identificar esta máquina. VBoxAboutDlg VirtualBox - About - VirtualBox - Acerca + VirtualBox - Sobre <qt>VirtualBox Graphical User Interface Version %1<br> @@ -17580,7 +17649,7 @@ VirtualBox Graphical User Interface - Interface Gráfico do VirtualBox + Interface Gráfica do Utilizador do VirtualBox Version %1 @@ -21027,11 +21096,11 @@ VBoxLicenseViewer I &Agree - &Concordo + Eu &Concordo I &Disagree - &Discordo + Eu &Discordo VirtualBox License @@ -22514,7 +22583,7 @@ No supported devices connected to the host PC USB device tooltip - Nenhum dispositivo suportado está conectado ao PC hospedeiro + Não está ligado nenhum dispositivo suportado ao PC anfitrião diff -Nru virtualbox-hwe-6.1.34-dfsg/src/VBox/Frontends/VirtualBox/nls/VirtualBox_ro.ts virtualbox-hwe-6.1.38-dfsg/src/VBox/Frontends/VirtualBox/nls/VirtualBox_ro.ts --- virtualbox-hwe-6.1.34-dfsg/src/VBox/Frontends/VirtualBox/nls/VirtualBox_ro.ts 2022-03-22 23:44:34.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/src/VBox/Frontends/VirtualBox/nls/VirtualBox_ro.ts 2022-09-01 13:27:59.000000000 +0000 @@ -2266,6 +2266,10 @@ Primary Group + + Storage Controller (VirtioSCSI) + + UIApplianceImportEditorWidget @@ -3443,7 +3447,7 @@ Starting GuestSessionStatus - Pornind + Pornind Starting @@ -3637,7 +3641,7 @@ NAT - Bridget Adapter + Bridged Adapter @@ -4211,6 +4215,50 @@ NetworkAttachmentType + + Undefined + GuestSessionStatus + + + + Started + GuestSessionStatus + + + + Terminating + GuestSessionStatus + + + + Terminated + GuestSessionStatus + + + + Timed Out (Killed) + GuestSessionStatus + + + + Timed Out (Abnormally) + GuestSessionStatus + + + + Down + GuestSessionStatus + + + + Error + GuestSessionStatus + + + + Cloud Network + + UICustomFileSystemModel @@ -5772,6 +5820,14 @@ No Guest Session found!<br>Please use the Session Panel to start a new guest session + + Close dialog without saving + + + + Reset Changes (%1) + + UIFilePathSelector @@ -10659,10 +10715,6 @@ - The hardware virtualization is enabled in the Acceleration section of the System page although it is not supported by the host system. It should be disabled in order to start the virtual system. - - - %1 CPU %1 is 1 for now @@ -13236,18 +13288,6 @@ - Failed to open the medium with following ID: <nobr><b>%1</b></nobr>. - - - - Failed to acquire attachment parameter. - - - - Failed to acquire medium attribute. - - - Failed to create cloud machine. diff -Nru virtualbox-hwe-6.1.34-dfsg/src/VBox/Frontends/VirtualBox/nls/VirtualBox_ru.ts virtualbox-hwe-6.1.38-dfsg/src/VBox/Frontends/VirtualBox/nls/VirtualBox_ru.ts --- virtualbox-hwe-6.1.34-dfsg/src/VBox/Frontends/VirtualBox/nls/VirtualBox_ru.ts 2022-03-22 23:44:34.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/src/VBox/Frontends/VirtualBox/nls/VirtualBox_ru.ts 2022-09-01 13:27:59.000000000 +0000 @@ -2843,6 +2843,10 @@ Primary Group Основная группа + + Storage Controller (VirtioSCSI) + Контроллер (VirtioSCSI) + UIApplianceImportEditorWidget @@ -4282,22 +4286,22 @@ IDE Primary Device 0 StorageSlot - Первичный мастер IDE + Первичное устройство IDE 0 IDE Primary Device 1 StorageSlot - Первичный слэйв IDE + Первичное устройство IDE 1 IDE Secondary Device 0 StorageSlot - Вторичный мастер IDE + Вторичное устройство IDE 0 IDE Secondary Device 1 StorageSlot - Вторичный слэйв IDE + Вторичное устройство IDE 1 SATA Port %1 @@ -4436,7 +4440,7 @@ - Bridget Adapter + Bridged Adapter Сетевой мост @@ -4991,24 +4995,73 @@ Acquire cloud instances ... - Получение облачных экземпляров машин ... + Получение облачных экземпляров машин ... Acquire cloud instance info ... - + Получение информации облачных экземпляров машин ... Pause instance ... - + Приостановить машину ... Start instance ... - + Запустить машину ... Cloud Network [EXPERIMENTAL] NetworkAttachmentType - + Облачная сеть [ЭКСПЕРИМЕНТАЛЬНО] + + + Undefined + GuestSessionStatus + Не определена + + + Starting + GuestSessionStatus + Запускается + + + Started + GuestSessionStatus + Запущена + + + Terminating + GuestSessionStatus + Завершение + + + Terminated + GuestSessionStatus + Завершена + + + Timed Out (Killed) + GuestSessionStatus + Нет ответа (Убита) + + + Timed Out (Abnormally) + GuestSessionStatus + Нет ответа (Ошибка) + + + Down + GuestSessionStatus + Завершена + + + Error + GuestSessionStatus + Ошибка + + + Cloud Network + Облачная сеть @@ -6901,6 +6954,14 @@ No Guest Session found!<br>Please use the Session Panel to start a new guest session Гостевая сессия не обнаружена!<br>Пожалуйста используйте панель сессий для запуска новой + + Close dialog without saving + Закрыть диалог без сохранения + + + Reset Changes (%1) + Сбросить изменения (%1) + UIFilePathSelector @@ -13739,7 +13800,7 @@ The hardware virtualization is enabled in the Acceleration section of the System page although it is not supported by the host system. It should be disabled in order to start the virtual system. - Функция аппаратной виртуализации включена для данной машины, но не поддерживаются Вашим хостом. Для обеспечения работоспособности машины она должна быть выключена. + Функция аппаратной виртуализации включена для данной машины, но не поддерживаются Вашим хостом. Для обеспечения работоспособности машины она должна быть выключена. %1% @@ -16835,15 +16896,15 @@ Failed to open the medium with following ID: <nobr><b>%1</b></nobr>. - Не удалось открыть носитель со следующим ИД: <nobr><b>%1</b></nobr>. + Не удалось открыть носитель со следующим ИД: <nobr><b>%1</b></nobr>. Failed to acquire attachment parameter. - Не удалось запросить параметр подключения. + Не удалось запросить параметр подключения. Failed to acquire medium attribute. - Не удалось запросить параметр носителя. + Не удалось запросить параметр носителя. Failed to create cloud machine. @@ -19627,7 +19688,7 @@ UIVMListView Inaccessible - + Недоступна @@ -20009,20 +20070,20 @@ UIVirtualMachineItemCloud Loading ... - + Загрузка ... Up-To-Date - + Обновлена <nobr><b>%1</b></nobr><br><nobr>Inaccessible</nobr> Inaccessible VM tooltip (name) - + <nobr><b>%1</b><br></nobr><nobr>Недоступна</nobr> Inaccessible - + Недоступна @@ -20030,16 +20091,16 @@ <nobr>%1<br></nobr><nobr>%2 since %3</nobr><br><nobr>Session %4</nobr> VM tooltip (name, last state change, session state) - <nobr>%1<br></nobr><nobr>%2 с %3</nobr><br><nobr>Сессия %4</nobr> + <nobr>%1<br></nobr><nobr>%2 с %3</nobr><br><nobr>Сессия %4</nobr> <nobr><b>%1</b><br></nobr><nobr>Inaccessible since %2</nobr> Inaccessible VM tooltip (name, last state change) - <nobr><b>%1</b><br></nobr><nobr>Недоступна с %2</nobr> + <nobr><b>%1</b><br></nobr><nobr>Недоступна с %2</nobr> Inaccessible - + Недоступна @@ -24448,7 +24509,7 @@ Не подключен - Bridget Adapter + Bridged Adapter Сетевой мост diff -Nru virtualbox-hwe-6.1.34-dfsg/src/VBox/Frontends/VirtualBox/nls/VirtualBox_sk.ts virtualbox-hwe-6.1.38-dfsg/src/VBox/Frontends/VirtualBox/nls/VirtualBox_sk.ts --- virtualbox-hwe-6.1.34-dfsg/src/VBox/Frontends/VirtualBox/nls/VirtualBox_sk.ts 2022-03-22 23:44:34.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/src/VBox/Frontends/VirtualBox/nls/VirtualBox_sk.ts 2022-09-01 13:27:59.000000000 +0000 @@ -21,12 +21,12 @@ -- Native language country name (empty if this language is for all countries) - -- + -- Language country name, in English (empty if native country name is empty) - -- + @@ -145,22 +145,22 @@ The VirtualBox Linux kernel driver is either not loaded or not set up correctly. Please try setting it up again by executing<br/><br/> <font color=blue>'/sbin/vboxconfig'</font><br/><br/>as root.<br/><br/>If your system has EFI Secure Boot enabled you may also need to sign the kernel modules (vboxdrv, vboxnetflt, vboxnetadp, vboxpci) before you can load them. Please see your Linux system's documentation for more information. - + Ovládač jadra pre Virtualbox nie je načítaný alebo nie správne nastavený. Skúste, ho prosím, znovu nastaviť spustením<br/><br/> <font color=blue>'/sbin/vboxconfig'</font><br/><br/> ako root.<br/><br/>Ak používate systém so zapnutým EFI Secure Boot, budete zrejme musieť jaderné moduly (vboxdrv, vboxnetflt, vboxnetadp, vboxpci) podpísať, pred ich načítaním. Viac informácií nájdete v dokumentácií k vášmu Linuxovému systému. 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>'/sbin/vboxconfig'</font><br/><br/>may correct this. Make sure that you are not mixing builds of VirtualBox from different sources. - + Moduly jadra VirtualBoxu nekorešpondujú s touto verziou VirtualBoxu. Inštalácia VirtualBoxu pravdepodobne nebola úspešná. Spustenie<br/><br/> <font color=blue>'/sbin/vboxconfig'</font><br/><br/>by to malo napraviť. Uistite sa, že nemiešate verzie VirtualBoxu z rôznych zdrojov. QIArrowButtonPress &Back - &Späť + &Späť &Next - + Ď&alší @@ -175,11 +175,11 @@ &Details - &Podrobnosti + &Podrobnosti &Details (%1 of %2) - P&odrobnosti (%1 z %2) + P&odrobnosti (%1 z %2) @@ -215,7 +215,7 @@ QIInputDialog Name: - + Názov: @@ -339,26 +339,26 @@ %1, %2: %3, %4: %5, %6: %7, %8: %9 col.1 text, col.2 name: col.2 text, col.3 name: col.3 text, col.4 name: col.4 text, col.5 name: col.5 text - + %1, %2: %3, %4: %5, %6: %7, %8: %9 Full - Plný + Plný Read-only - Iba na čítanie + Iba na čítanie Yes - Áno + Áno UIActionPool &Machine - &Stroj + S&troj &Fullscreen Mode @@ -370,7 +370,7 @@ Seam&less Mode - Režim &plynulého prechodu + &Bezošvý režim Switch to seamless desktop integration mode @@ -514,7 +514,7 @@ &Insert Guest Additions CD image... - &Nainštalovať Hosťovské doplnky... + V&ložiť CD obraz s Hosťovskými doplnkami... Insert the Guest Additions disk file into the virtual drive @@ -598,37 +598,37 @@ &Contents... - &Obsah... + &Obsah... Open the browser and go to the VirtualBox product web site - Otvorí webový prehliadač a prejde na stránku produktu VirtualBox + Otvorí webový prehliadač a prejde na stránku produktu VirtualBox Check for a new VirtualBox version - Vykoná kontrolu novej verzie VirtualBoxu + Vykoná kontrolu novej verzie VirtualBoxu &About VirtualBox... - &O aplikácii VirtualBox... + &O programe VirtualBox... &File Mac OS X version - &Súbor + &Súbor &File Non Mac OS X version - &Súbor + &Súbor &Virtual Media Manager... - &Manažér virtuálnych médii... + &Manažér virtuálnych médii... Display the Virtual Media Manager window - Zobraziť dialógové okno Manažéra virtuálnych médii + Zobraziť dialógové okno Manažéra virtuálnych médii &Preferences... @@ -641,11 +641,11 @@ E&xit - &Ukončiť + &Ukončiť Close application - Ukončiť aplikáciu + Ukončiť program Create a new virtual machine @@ -653,7 +653,7 @@ S&tart - S&pustiť + S&pustiť Start the selected virtual machine @@ -661,7 +661,7 @@ S&how - &Zobraziť + &Zobraziť Switch to the window of the selected virtual machine @@ -673,15 +673,15 @@ &New... - &Nový... + &Nový... &Add... - &Pridať... + &Pridať... Discard - Zahodiť + Zahodiť Discard the saved state of the selected virtual machine @@ -689,15 +689,15 @@ &Close - &Zatvoriť + &Zatvoriť Show &Log... - Zobraziť &záznam... + Zobraziť &záznam... C&heck for Updates... - &Skontrolovať aktualizácie... + &Skontrolovať aktualizácie... &Insert Guest Additions CD image... @@ -715,25 +715,25 @@ &File - &Súbor + &Súbor &Preferences... global preferences window - &Nastavenia... + &Nastavenia... &Keyboard - &Klávesnica + &Klávesnica &Hard Disks - &Pevné disky + &Pevné disky Show &Log... debug action - Zobraziť &záznam... + Zobraziť &záznam... %1% @@ -743,203 +743,203 @@ Enable Virtual Screen - Zapnúť + Zapnúť No supported devices connected to the host PC - Nie sú dostupné žiadne zariadenia pripojené k hostiteľskému PC + Žiadne podporované zariadenia pripojené k hostiteľskému PC Re&fresh - O&bnoviť + O&bnoviť &Details - &Podrobnosti + &Podrobnosti &Snapshots - &Snímky + &Snímky Preview Monitor %1 - + Náhľad monitora %1 &Connect Network Adapter - + &Pripojiť sieťový adaptér Connect Network Adapter &%1 - + Pripojiť sieťový adaptér &%1 No USB Devices Connected - + Nie je pripojené žiadne USB zariadenie No Webcams Connected - + Nie je pripojená žiadna webkamera No supported webcams connected to the host PC - + Žiadne podporované webkamery pripojené k hostiteľskému PC &VirtualBox - + &VirtualBox &Window - + &Okno &Minimize - + &Minimalizovať Minimize active window - + Minimalizovať aktívne okno Show help contents - + Zobraziť obsah pomocníka &VirtualBox Web Site... - + Webová stránka &VirtualBoxu... &VirtualBox Bug Tracker... - + Hlásenie chýb &VirtualBoxu... Open the browser and go to the VirtualBox product bug tracker - + Otvorí prehliadač a prejde na stránku s hlásením chýb VirtualBoxu &VirtualBox Forums... - + &Diskusné skupiny VirtualBoxu... Open the browser and go to the VirtualBox product forums - + Otvorí webový prehliadač a prejde na stránku s diskusnými fórami VirtualBoxu &Oracle Web Site... - + Webová stránka &Oracle... Open the browser and go to the Oracle web site - + Otvorí webový prehliadač a prejde na stránku Oracle &Reset All Warnings - + &Zabudnúť všetky varovania Go back to showing all suppressed warnings and messages - + Spôsobí, že všetky potlačené upozornenia a správy sa budú znova zobrazovať &Network Operations Manager... - + Správca &sieťových operácií... Display the Network Operations Manager window - + Zobrazí okno Správcu sieťových operácií Display a window with product information - + Zobrazí dialógové okno s informáciami o produkte Display the global preferences window - + Zobrazí okno globálnych nastavení &Log - + &Záznam &Find - &Nájsť + &Nájsť Log Viewer - Zobrazovač záznamov + Prehliadac záznamov Open pane with searching options - + Otvoriť podokno s voľbami pre hľadanie &Filter - + &Filter Open pane with filtering options - + Otvoriť podokno s voľbami pre filtrovanie &Bookmark - + &Záložka Open pane with bookmarking options - + Otvoriť podokno s voľbami pre záložky &Options - + &Možnosti Open pane with log viewer options - + Otvoriť podokno s voľbami pre prehliadač záznamov &Refresh - &Obnoviť + &Obnoviť Refresh selected virtual machine log - + Obnoviť záznamy vybratého virtuálneho stroja &Save... - &Uložiť... + &Uložiť... Save selected virtual machine log - + Uložiť záznamy vybratého virtuálneho stroja File Manager - + Správca súborov Host - + Hostiteľ Guest - + Hosť Copy to guest - + Kopírovať -> hosť Copy the selected object(s) from host to guest - + Kopírovať vybratý objekt(y) z hostiteľa na hosťa Copy to host - + Kopírovať na hostiteľa Copy the selected object(s) from guest to host - + Kopírovať vybratý objekt(y) z hosť na hostiteľa Settings @@ -947,239 +947,239 @@ Log - Záznam + Záznam Session - + Sedenie Go one level up to parent folder - + Prejsť o úroveň vyššie do nadradeného priečinka Go Home - + Prejsť domov Go to home folder - + Prejsť do domovského priečinka Go to Home Folder - + Prejsť do domovského priečinka Delete - Vymazať + Odstrániť Delete selected file object(s) - + Odstrániť vybratý súborový objekt(y) Refresh - Obnoviť + Obnoviť Rename - + Premenovať Create New Directory - + Vytvoriť nový adresár Copy - Skopírovať + Kopírovať Copy selected file object(s) - + Kopírovať vybratý súborový objekt(y) Cut - + Vystrihnúť Cut selected file object(s) - + Vystrihnúť vybratý súborový objekt(y) Paste - + Prilepiť Paste copied/cut file object(s) - + Prilepiť skopírovaný/vystrihnutý súborový objekt(y) Select All - + Vybrať všetko Select all files objects - + Vybrať všetky súborové objekty Invert Selection - + Invertovať výber Invert the current selection - + Invertovať aktuálny výber Show Properties - + Zobraziť vlastnosti Show the properties of currently selected file object(s) - + Zobraziť vlastnosti aktuálne vybratého súborového objektu(ov) &Host Network Manager... - + Správca &hostiteľskej siete... Display the Host Network Manager window - + Zobrazí dialógové okno Správcu hostiteľskej siete &Cloud Profile Manager... - + Správca &cloudového profilu... Display the Cloud Profile Manager window - + Zobrazí dialógové okno Správcu cloudového profilu Import - Importovať + Importovať &Import Appliance... - + &Importovať appliance... Import an appliance into VirtualBox - + Importovať appliance do VirtualBoxu Export - Exportovať + Exportovať &Export Appliance... - + &Exportovať appliance... Export one or more VirtualBox virtual machines as an appliance - + Exportovať jeden alebo viacero virtuálnych strojov VirtualBoxu ako appliance E&xtra Data Manager... - + Správca &dodatočných údajov... Display the Extra Data Manager window - + Zobrazí dialógové okno Správcu dodatočných údajov &Group - + &Skupina &New Machine... - + &Nový stroj... Create new virtual machine - + Vytvorí nový virtuálny stroj &Add Machine... - + &Pridať stroj... Add existing virtual machine - + Pridať existujúci virtuálny stroj Rena&me Group... - + P&remenovať skupinu... Rename selected virtual machine group - + Premenovať vybratú skupinu virtuálnych strojov &Ungroup - + &Zrušiť skupinu Ungroup items of selected virtual machine group - + Zrušiť zoskupenie vybratých virtuálnych strojov &Sort - + &Triediť Sort items of selected virtual machine group alphabetically - + Zoradiť položky skupiny virtuálnych strojov podľa abecedy Gro&up - + &Zoskupiť Add new group based on selected virtual machines - + Vytvoriť novú skupinu z vybratých virtuálnych strojov Display the virtual machine settings window - + Zobrazí dialógové okno s nastaveniami virtuálneho stroja Cl&one... - + Kl&onovať... Clone selected virtual machine - + Klonovať vybratý virtuálny stroj &Move... - + &Presunúť... Move selected virtual machine - + Presunie vybratý virtuálny stroj &Remove... - + &Odstrániť... Remove selected virtual machines - + Odstráni vybraté virtuálne stroje Sort group of first selected virtual machine alphabetically - + Zoradí skupinu prvého virtuálneho stroja podľa abecedy Start selected virtual machines - + Spustí vybraté virtuálne stroje Switch to the windows of selected virtual machines - + Prepnúť do okien vybratých virtuálnych strojov &Normal Start - + &Bežné spustenie &Headless Start @@ -1187,7 +1187,7 @@ Start selected virtual machines in the background - + Spustí vybraté virtuálne stroje na pozadí &Detachable Start @@ -1271,31 +1271,31 @@ &Save State - + &Uložiť stav Save state of selected virtual machines - + Uložiť stav vybratých virtuálnych strojov ACPI Sh&utdown - + &ACPI vypnutie Send ACPI Shutdown signal to selected virtual machines - + Pošle ACPI signál na vypnutie vybratým virtuálnym strojom Po&wer Off - + &Vypnúť Power off selected virtual machines - + Vypne vybraté virtuálne stroje Open the machine details pane - + Otvorí podokno s podrobnosťami o stroji Open the machine snapshots pane @@ -1303,31 +1303,31 @@ &Logs - + &Záznamy Open the machine logs pane - + Otvorí podokno so záznamami stroja &Global Tools Menu - + &Globálna ponuka s nástrojmi &Virtual Media Manager - + Správca &virtuálnych médií Open the Virtual Media Manager - + Otvorí okno Správcu virtuálnych médií &Host Network Manager - + Sp&rávca hostiteľskej siete Open the Host Network Manager - + Otvorí okno Správcu hostiteľskej siete &Cloud Profile Manager @@ -1407,7 +1407,7 @@ &Create... - + &Vytvoriť... Network Manager @@ -1443,15 +1443,15 @@ Cloud Profile Manager - + Správca cloudových profilov Add new cloud profile - + Pridať nový cloudový režim &Import Profiles... - + &Importovať profily... Import the list of cloud profiles from external files @@ -1483,11 +1483,11 @@ Help - Pomocník + Pomocník &Show Help... - + &Zobraziť pomocníka... Show cloud profile help @@ -1523,43 +1523,43 @@ &View - + &Zobrazenie &Full-screen Mode - + &Režim na celú obrazovku Switch between normal and full-screen mode - + Prepína medzi normálnym režimom a režimom na celú obrazovku S&caled Mode - + Rež&im škálovania &Minimize Window - + &Minimalizovať okno Automatically resize the guest display when the window is resized - + Automaticky zmeniť veľkosť hosťovskej obrazovky pri zmene veľkosti okna Take Screensh&ot... - + Urobiť &snímku... Take guest display screenshot - + Urobiť snímku obrazovky hosťa &Recording - + &Nahrávanie &Recording Settings... - + Na&stavenia nahrávania... Display virtual machine settings window to configure video/audio recording @@ -1619,11 +1619,11 @@ &Input - + &Vstup &Keyboard Settings... - + Nastavenia &klávesnice... Display global preferences window to configure keyboard shortcuts @@ -1644,7 +1644,7 @@ &Mouse Integration - + &Integrácia myši Enable host mouse pointer integration @@ -1652,7 +1652,7 @@ &Hard Disk Settings... - + Nastavenia &pevného disku... Display virtual machine settings window to configure hard disks @@ -1660,35 +1660,35 @@ &Optical Drives - + &Optické mechaniky &Floppy Drives - + &Disketové mechaniky &Audio - + &Zvuk Audio Output - + Zvukový výstup Enable audio output - + Povoliť zvukový výstup Audio Input - + Zvukový vstup Enable audio input - + Povoliť zvukový vstup &Network Settings... - + Nastavenia &siete... Display virtual machine settings window to configure network adapters @@ -1696,11 +1696,11 @@ &USB - + &USB &USB Settings... - + Nastavenia &USB... Display virtual machine settings window to configure USB devices @@ -1708,23 +1708,23 @@ &Webcams - + &Webkamery Shared &Clipboard - + Zdieľaná &schránka &Drag and Drop - + O&perácia ťahania a pustenia &Shared Folders - + &Zdieľané priečinky &Shared Folders Settings... - + Nasta&venie zdieľaných priečinkov... Display virtual machine settings window to configure shared folders @@ -1781,7 +1781,7 @@ Options - + Možnosti Open panel with file manager options @@ -1813,19 +1813,19 @@ Tools - + Nástroje E&xport to OCI... - + E&xportovať do OCI... Export selected virtual machine to OCI - + Exportovať vybratý virtuálny stroj do OCI Try - + Vyskúšať &Try Oracle Cloud for Free... @@ -1845,7 +1845,7 @@ Open Find Pane - + Otvoriť podokno s vyhľadávaním Open Filter Pane @@ -1949,7 +1949,7 @@ S&earch - + &Hľadať Search virtual machines with respect to a search term @@ -1989,7 +1989,7 @@ Create Disk Image - + Vytvoriť obraz disku Copy selected disk image @@ -2033,7 +2033,7 @@ &Search - + &Hľadať Open the disk image search pane @@ -2106,12 +2106,12 @@ ID password table field - + ID Password password table field - + Heslo <nobr>Used by the following %n hard disk(s):</nobr><br>%1 @@ -2124,7 +2124,7 @@ %1 - Disk Encryption - + %1 - Šifrovanie disku This virtual machine is password protected. Please enter the %n encryption password(s) below. @@ -2266,34 +2266,38 @@ Storage Controller (IDE) - + Radič úložiska (IDE) Storage Controller (SATA) - + Radič úložiska (SATA) Storage Controller (SCSI) - + Radič úložiska (SCSI) Storage Controller (SAS) - + Radič úložiska (SAS) Detailed list of all components of all virtual machines of the current appliance - + Podrobný zoznam všetkých komponentov všetkých virtuálnych strojov súčasnej appliance Settings File - + Súbor s nastaveniami Base Folder - + Základný priečinok Primary Group + Primárna skupina + + + Storage Controller (VirtioSCSI) @@ -2309,11 +2313,11 @@ &Import hard drives as VDI - + &Importovať pevné disky ako VDI MAC Address &Policy: - + Politika pre &MAC adresy: Include all network adapter MAC addresses @@ -2362,7 +2366,7 @@ %1: %2 col.1 text: col.2 text - + %1: %2 @@ -2456,37 +2460,37 @@ UIBaseMemoryEditor Base &Memory: - &Základná pamäť: + &Základná pamäť: %1 MB - + %1 MB MB - MB + MB UIBootOrderEditor &Boot Order: - Po&radie bootovania: + Po&radie bootovania: Move Up - + Presunúť vyššie Move Down - + Presunúť nižšie UIChooserAbstractModel New group - + Nová skupina @@ -2494,64 +2498,64 @@ <b>%1</b> Group item tool-tip / Group name - + <b>%1</b> %n group(s) Group item tool-tip / Group info - - - - + + %n skupina + %n skupiny + %n skupín <nobr>%1</nobr> Group item tool-tip / Group info wrapper - <nobr>%1</nobr> + <nobr>%1</nobr> %n machine(s) Group item tool-tip / Machine info - - - - + + %n stroj + %n stroje + %n strojov (%n running) Group item tool-tip / Running machine info - - - - + + (%n beží) + (%n bežia) + (%n beží) <nobr>%1</nobr> Group item tool-tip / Machine info wrapper - <nobr>%1</nobr> + <nobr>%1</nobr> <nobr>%1 %2</nobr> Group item tool-tip / Machine info wrapper, including running - <nobr>%1</nobr> {1 %2<?} + <nobr>%1</nobr> {1 %2<?} Collapse group - + Zbaliť skupinu Expand group - + Rozbaliť skupinu UIChooserNodeGlobal Tools - + Nástroje @@ -2565,7 +2569,7 @@ UIChooserNodeMachine Virtual Machine - + Virtuálny stroj @@ -2690,11 +2694,11 @@ UICloudProfileDetailsWidget Name: - + Názov: Properties: - + Vlastnosti: Contains cloud profile settings @@ -2706,35 +2710,35 @@ Enter a name for this profile... - + Zadajte názov tohto profilu... Reset - Reštartovať + Obnoviť Reset changes in current profile details - + Obnoviť zmeny v podrobnostiach aktuálneho profilu Reset Changes (%1) - + Obnoviť zmeny (%1) Add - Pridať + Pridať Add a new profile with following name - + Pridať nový profil s nasledujúcim názvom Add Profile (%1) - + Pridať profil (%1) Apply - + Použiť Apply changes in current profile details @@ -2749,19 +2753,19 @@ UICloudProfileManager Cloud Profile Manager - + Správca cloudových profilov Reset - Reštartovať + Obnoviť Apply - + Použiť Close - Zatvoriť + Zatvoriť Reset changes in current cloud profile details @@ -2777,7 +2781,7 @@ Reset Changes (%1) - + Obnoviť zmeny (%1) Apply Changes (%1) @@ -2797,47 +2801,47 @@ MB size suffix MBytes=1024 KBytes - MB + MB <nobr>%1 MB</nobr> details report - <nobr>%1 MB</nobr> + <nobr>%1 MB</nobr> Enabled details report (3D Acceleration) - + Zapnutá Disabled details report (3D Acceleration) - + Vypnutá not set details report (execution engine) - + nenastavený Active details report (Nested Paging) - Aktívne + Aktívne Inactive details report (Nested Paging) - + Neaktívne Active details report (Unrestricted Execution) - Aktívne + Aktívne Inactive details report (Unrestricted Execution) - + Neaktívne Execution engine @@ -3220,12 +3224,12 @@ Not attached NetworkAttachmentType - Nepripojená + Nepripojený NAT NetworkAttachmentType - NAT + NAT Bridged Adapter @@ -3250,7 +3254,7 @@ NAT Network NetworkAttachmentType - + Sieť NAT PCnet-PCI II (Am79C970A) @@ -3565,7 +3569,7 @@ Starting GuestSessionStatus - Spúšťa sa + Spúšťa sa Starting @@ -3603,24 +3607,24 @@ - IDE Primary Device 0 + IDE Primary Master StorageSlot - IDE Primary Device 0 + IDE Primary Master - IDE Primary Device 1 + IDE Primary Slave StorageSlot - IDE Primary Device 1 + IDE Primary Slave - IDE Secondary Device 0 + IDE Secondary Master StorageSlot - IDE Secondary Device 0 + IDE Secondary Master - IDE Secondary Device 1 + IDE Secondary Slave StorageSlot - IDE Secondary Device 1 + IDE Secondary Slave SATA Port %1 @@ -3671,7 +3675,7 @@ Groups - + Skupiny RAM @@ -3691,7 +3695,7 @@ Chipset Type - + Typ čipovej sady Firmware @@ -3723,15 +3727,15 @@ Recording - + Nahrávanie Hard Disks - Pevné disky + Pevné disky Optical Devices - + Optické zariadenia Floppy Devices @@ -3739,36 +3743,32 @@ Driver - + Ovládač Controller - Radič + Radič Input/Output - + Vstup/Výstup Not Attached network adapter - + Nepripojený NAT - NAT - - - Bridget Adapter - + NAT Internal Network - Vnútorná sieť + Vnútorná sieť Host Only Adapter - + Adaptér len pre hostiteľa Generic Driver @@ -3776,32 +3776,32 @@ NAT Network - + Sieť NAT Disconnected serial port - Odpojený + Odpojený Host Pipe - Rúra hostiteľa + Rúra hostiteľa Host Device - Zariadenie hostiteľa + Zariadenie hostiteľa Raw File - Surový (raw) súbor + Surový (raw) súbor TCP - TCP + TCP Device Filters - Filtre zariadení + Filtre zariadení Menu Bar @@ -3818,67 +3818,67 @@ General DetailsElementType - Všeobecné + Všeobecné Preview DetailsElementType - Náhľad + Náhľad System DetailsElementType - Systém + Systém Display DetailsElementType - Displej + Displej Storage DetailsElementType - Úložisko + Úložisko Audio DetailsElementType - Audio + Audio Network DetailsElementType - Sieť + Sieť Serial ports DetailsElementType - + Sériové porty USB DetailsElementType - USB + USB Shared folders DetailsElementType - + Zdieľané priečinky User interface DetailsElementType - + Používateľské rozhranie Description DetailsElementType - Popis + Popis Hard Disks IndicatorType - Pevné disky + Pevné disky Optical Disks @@ -3893,107 +3893,107 @@ Audio IndicatorType - Audio + Audio Network IndicatorType - Sieť + Sieť USB IndicatorType - USB + USB Shared Folders IndicatorType - Zdieľané priečinky + Zdieľané priečinky Display IndicatorType - Displej + Zobrazenie Recording IndicatorType - + Nahrávanie Features IndicatorType - + Vlastnosti Mouse IndicatorType - + Myš Keyboard IndicatorType - + Klávesnica General InformationElementType - Všeobecné + Všeobecné Preview InformationElementType - Náhľad + Náhľad System InformationElementType - Systém + Systém Display InformationElementType - Displej + Displej Storage InformationElementType - Úložisko + Úložisko Audio InformationElementType - Audio + Audio Network InformationElementType - Sieť + Sieť Serial ports InformationElementType - + Sériové porty USB InformationElementType - USB + USB Shared folders InformationElementType - + Zdieľané priečinky User interface InformationElementType - + Používateľské rozhranie Description InformationElementType - Popis + Popis Runtime attributes @@ -4043,21 +4043,21 @@ Video/Audio UISettingsDefs::RecordingMode - + Video/Audio Video Only UISettingsDefs::RecordingMode - + Iba video Audio Only UISettingsDefs::RecordingMode - + Iba audio %n year(s) - + %n rok %n roky %n rokov @@ -4065,7 +4065,7 @@ %n month(s) - + %n mesiac %n mesiace %n mesiacov @@ -4073,7 +4073,7 @@ %n day(s) - + %n deň %n dni %n dní @@ -4081,7 +4081,7 @@ %n hour(s) - + %n hodina %n hodiny %n hodín @@ -4089,7 +4089,7 @@ %n minute(s) - + %n minúta %n minúty %n minút @@ -4097,7 +4097,7 @@ %n second(s) - + %n sekunda %n sekundy %n sekúnd @@ -4105,7 +4105,7 @@ Please choose a virtual hard disk file - + Vyberte, prosím, súbor s virtuálnym diskom All virtual hard disk files (%1) @@ -4204,22 +4204,22 @@ Inaccessible medium - Nedostupné + Nedostupné Empty medium - Prázdne + Prázdne Host Drive '%1' medium - Mechanika hostiteľa '%1' + Mechanika hostiteľa '%1' Host Drive %1 (%2) medium - Mechanika hostiteľa '%1' (%2) + Mechanika hostiteľa %1 (%2) <p style=white-space:pre>Type (Format): %1 (%2)</p> @@ -4229,17 +4229,17 @@ <p>Attached to: %1</p> image - <p>Pripojený k: %1</p> + <p>Pripojený k: %1</p> <i>Not Attached</i> image - <i>Nepripojený</i> + <i>Nepripojený</i> <i>Checking accessibility...</i> medium - <i>Zisťujem dostupnosť...</i> + <i>Zisťujem dostupnosť...</i> Failed to check accessibility of disk image files. @@ -4333,6 +4333,74 @@ NetworkAttachmentType + + Undefined + GuestSessionStatus + + + + Started + GuestSessionStatus + + + + Terminating + GuestSessionStatus + + + + Terminated + GuestSessionStatus + + + + Timed Out (Killed) + GuestSessionStatus + + + + Timed Out (Abnormally) + GuestSessionStatus + + + + Down + GuestSessionStatus + + + + Error + GuestSessionStatus + + + + IDE Primary Device 0 + StorageSlot + + + + IDE Primary Device 1 + StorageSlot + + + + IDE Secondary Device 0 + StorageSlot + + + + IDE Secondary Device 1 + StorageSlot + + + + Bridged Adapter + Adaptér v moste (bridge) + + + Cloud Network + + UICustomFileSystemModel @@ -4389,12 +4457,12 @@ Name details (general) - Názov + Názov Operating System details (general) - + Operačný systém Settings File Location @@ -4404,27 +4472,27 @@ Groups details (general) - + Skupiny Information Inaccessible details - + Informácia nie je dostupná Base Memory details (system) - Základná pamäť + Základná pamäť %1 MB details - + %1 MB Processors details (system) - Procesory + Procesory Execution Cap @@ -4434,37 +4502,37 @@ %1% details - %1% + %1% Boot Order details (system) - Poradie bootovania + Poradie bootovania Chipset Type details (system) - + Typ čipovej sady EFI details (system) - + EFI Enabled details (system/EFI) - + Povolené Disabled details (system/EFI) - + Zakázané VT-x/AMD-V details (system) - VT-x/AMD-V + VT-x/AMD-V Nested Paging @@ -4474,37 +4542,37 @@ PAE/NX details (system) - PAE/NX + PAE/NX rozšírenie Minimal Paravirtualization details (system) - + Minimálna paravirtualizácia Hyper-V Paravirtualization details (system) - + Hyper-V paravirtualizácia KVM Paravirtualization details (system) - + KVM paravirtualizácia Acceleration details (system) - Akcelerácia + Akcelerácia Video Memory details (display) - Videopamäť + Videopamäť Screens details (display) - Obrazovky + Obrazovky Scale-factor @@ -4514,22 +4582,22 @@ 2D Video details (display) - 2D video + 2D video 3D details (display) - 3D + 3D Acceleration details (display) - Akcelerácia + Akcelerácia Remote Desktop Server Port details (display/vrde) - Port pre RDS (Remote Display Server) + Port pre RDS (Remote Display Server) Remote Desktop Server @@ -4539,7 +4607,7 @@ Disabled details (display/vrde/VRDE server) - + Zakázané Frame Size: %1x%2, Frame Rate: %3fps, Bit Rate: %4kbps @@ -4548,12 +4616,12 @@ [Optical Drive] details (storage) - + [Optická mechanika] Not Attached details (storage) - + Nie je pripojená Host Driver @@ -4563,42 +4631,42 @@ Controller details (audio) - Radič + Radič Audio Output details (audio) - + Zvukový výstup Enabled details (audio/output) - + Povolený Disabled details (audio/output) - + Zakázaný Audio Input details (audio) - + Zvukový vstup Enabled details (audio/input) - + Povolený Disabled details (audio/input) - + Zakázaný Disabled details (audio) - + Zakázaný Bridged Adapter, %1 @@ -4673,17 +4741,17 @@ USB Controller Inaccessible details (usb) - + Radič USB nie je dostupný Shared Folders details (shared folders) - Zdieľané priečinky + Zdieľané priečinky None details (shared folders) - Žiadne + Žiadne Menu-bar @@ -4758,7 +4826,7 @@ Recording details (display/recording) - + Nahrávanie Disabled @@ -4787,7 +4855,7 @@ %1 MB - + %1 MB @@ -5687,122 +5755,122 @@ %1, %2: %3, %4 col.2 text, col.3 name: col.3 text, col.1 name - + %1, %2: %3, %4 %1, %2: %3 col.2 text, col.3 name: col.3 text - + %1, %2: %3 UIFDCreationDialog File Path: - + Cesta k súboru: Size: - Veľkosť: + Veľkosť: Format disk as FAT12 - + Formátovať disk ako FAT12 1.44M - 1.44M + 1.44M 1.2M - 1.2M + 1.2M 720K - 720K + 720K 360K - 360K + 360K Floppy Disk Creator - + Vytvárač diskiet UIFileManager %1 - File Manager - + %1 - Správca súborov Close - Zatvoriť + Zatvoriť Clear - + Vyčistiť Cancel - Zrušiť + Zrušiť Not yet started - + Ešte nie je spustený Working - + Pracuje Paused - Pozastavený + Pozastavený Canceled - + Zrušený Succeded - + Úspešne skončilo Failed - + Zlyhalo Invalid - + Neplatný Remove Selected - + Odstrániť vybrané Remove Finished - + Odstrániť dokončené Remove All - + Odstrániť všetko List directories on top - + Adresáre zobraziť ako prvé List directories before files - + Zobrazovať adresáre pred súbormi Ask before delete - + Spýtať sa pred odstránením Show a confirmation dialog before deleting files and directories - + Zobraziť dialógové okno s potvrdením pred odstránením súborov a adresárov Human readable sizes @@ -5814,7 +5882,7 @@ Password - + Heslo Show Password @@ -5850,7 +5918,7 @@ File Count - + Počet súborov Delete the selected file(s) and/or folder(s) @@ -6006,15 +6074,15 @@ <b>Created:</b> %1<br/> - + <b>Vytvorený:</b> %1<br/> <b>Owner:</b> %1 - + <b>Vlastník:</b> %1 Show hidden objects - + Zobraziť skryté objekty Show hidden files/directories @@ -6032,6 +6100,14 @@ No Guest Session found!<br>Please use the Session Panel to start a new guest session + + Close dialog without saving + + + + Reset Changes (%1) + Obnoviť zmeny (%1) + UIFilePathSelector @@ -6041,11 +6117,11 @@ Other... - Iné... + Iné... Reset - Reštartovať + Obnoviť Resets the folder path to the default value. @@ -6057,7 +6133,7 @@ <reset to default> - <nastaviť na východzie> + <nastaviť na predvolené> The actual default path value will be displayed after accepting the changes and opening this window again. @@ -6065,7 +6141,7 @@ <not selected> - <nevybrané> + <nevybrané> Please use the <b>Other...</b> item from the drop-down list to select a path. @@ -6812,7 +6888,7 @@ Default &Machine Folder: - Výcho&dzí priečinok pre stroj: + Pred&volený priečinok pre stroj: V&RDP Authentication Library: @@ -6899,11 +6975,11 @@ &VirtualBox Manager - + Sprá&vca VirtualBoxu Virtual &Machine - + Virtuálne &stroje Lists all available shortcuts which can be configured. @@ -6970,7 +7046,7 @@ &Interface Languages - + &Jazyky prostredia @@ -7123,16 +7199,16 @@ &NAT Networks - + Siete &NAT Lists all available NAT networks. - + Zobrazí všetky dostupné siete NAT. Active NAT network - Aktívne + Aktívna The name <b>%1</b> is being used for several NAT networks. @@ -7140,27 +7216,27 @@ Add NAT Network - + Pridať sieť NAT Remove NAT Network - + Odstrániť sieť NAT Edit NAT Network - + Upraviť sieť NAT Adds new NAT network. - + Pridá novú sieť NAT. Removes selected NAT network. - + Odstráni vybratú sieť NAT. Edits selected NAT network. - + Upraví vybratú sieť NAT. @@ -7361,11 +7437,11 @@ &Enable Network - + &Povoliť sieť Network &Name: - + &Názov siete: Holds the name for this network. @@ -7597,7 +7673,7 @@ %1: %2 'key: value', like 'Name: MyVM' - + %1: %2 @@ -7631,11 +7707,11 @@ Expand All - + Rozbaliť všetko Collapse All - + Zbaliť všetko Terminate Session @@ -7860,7 +7936,7 @@ Apply - + Použiť Reset changes in current interface details @@ -7872,7 +7948,7 @@ Reset Changes (%1) - + Obnoviť zmeny (%1) Apply Changes (%1) @@ -8066,7 +8142,7 @@ Apply - + Použiť Close @@ -8086,7 +8162,7 @@ Reset Changes (%1) - + Obnoviť zmeny (%1) Apply Changes (%1) @@ -8311,12 +8387,12 @@ Shortcut - + Skratka %1: %2 scope: description - + %1: %2 @@ -8496,72 +8572,72 @@ Disconnected cable (Network tooltip) - Odpojený + Odpojený Screens Display tooltip - Obrazovky + Obrazovky Adapter %1 (%2) Network tooltip - + Adaptér %1 (%2) IP Network tooltip - + IP Cable Network tooltip - + Kábel Connected cable (Network tooltip) - + Pripojený No USB devices attached USB tooltip - + Nie sú pripojené žiadne USB zariadenia No shared folders Shared folders tooltip - + Žiadne zdieľané priečinky Video memory Display tooltip - + Videopamäť 3D acceleration Display tooltip - + 3D akcelerácia Recording disabled Recording tooltip - + Nahrávanie vypnuté Video/audio recording file Recording tooltip - + Súbor pre nahrávanie videa/zvuku Audio recording file Recording tooltip - + Súbor pre nahrávanie zvuku Video recording file Recording tooltip - + Súbor pre nahrávanie videa Indicates whether the host mouse pointer is captured by the guest OS:%1 @@ -8984,7 +9060,7 @@ %1, %2 col.2 text, col.1 name - + %1: %2 {1,?} Network Name @@ -9056,22 +9132,22 @@ (built-in) Language - (vstavaný) + (vstavaný) <unavailable> Language - <nedostupný> + <nedostupný> <unknown> Author(s) - <neznámy> + <neznámy> Default Language - + Predvolený @@ -9322,7 +9398,7 @@ File &Path: - + C&esta k súboru: Frame &Size: @@ -9334,11 +9410,11 @@ &Screens: - + &Obrazovky: &Screen - + &Obrazovka Scale Factor: @@ -9350,7 +9426,7 @@ Acceleration: - + Akcelerácia: Holds the VRDP Server port number. You may specify <tt>0</tt> (zero), to select port 3389, the standard port for RDP. @@ -9450,30 +9526,30 @@ %1 fps - + %1 fps low quality - + nízka medium quality - + stredná high quality - + vysoká <i>About %1MB per 5 minute video</i> - + <i>Približne %1 MB na každých 5 minút videa</i> Screen %1 - + Monitor %1 When checked, enables video recording for screen %1. @@ -9489,23 +9565,23 @@ Re&cording - + Na&hrávanie &Enable Recording - + &Zapnúť nahrávanie Recording &Mode: - + R&ežim nahrávania: Selects the recording mode. - + Vyberie režim nahrávania. &Video Quality: - + &Kvalita videa: Controls the <b>quality</b>. Increasing this value will make the audio sound better at the cost of an increased file size. @@ -9664,19 +9740,19 @@ Basi&c - + &Základné A&dvanced - &Pokročilé + &Pokročilé D&rag'n'Drop: - + Operácia ť&ahania a pustenia: D&escription - &Popis + &Popis Selects the cipher to be used for encrypting the virtual machine disks. @@ -9764,7 +9840,7 @@ Show in &Full-screen/Seamless - + Zobraziť v rež&ime celej obrazovky/plynulého prechodu When checked, show the Mini ToolBar at the top of the screen, rather than in its default position at the bottom of the screen. @@ -9772,7 +9848,7 @@ Show at &Top of Screen - Z&obraziť na vrchu obrazovky + Z&obraziť na vrchu obrazovky Allows to modify VM status-bar contents. @@ -10121,31 +10197,31 @@ Shared &Folders - Zdieľané &priečinky + Zdieľané &priečinky Auto Mount - + Automatické pripojenie At - + Na Add Shared Folder - + Pridať zdieľaný priečinok Edit Shared Folder - + Upraviť zdieľaný priečinok Remove Shared Folder - + Odstrániť zdieľaný priečinok Adds new shared folder. - + Pridá nový zdieľaný priečinok. Edits selected shared folder. @@ -10729,35 +10805,35 @@ Hard Disk - Pevný disk + Pevný disk Optical Drive - + Optická mechanika Floppy Drive - + Disketová mechanika Choose/Create a Virtual Hard Disk... - + Vybrať/Vytvoriť virtuálny pevný disk... Choose a disk file... - + Vybrať súbor s obrazom disku... Choose/Create a Virtual Optical Disk... - + Vybrať/Vytvoriť virtuálny optický disk... Choose/Create a Virtual Floppy Disk... - + Vybrať/Vytvoriť virtuálnu disketovú mechaniku... Choose/Create a disk image... - + Vybrať/Vytvoriť súbor s obrazom disku... @@ -10877,11 +10953,11 @@ Enable &EFI (special OSes only) - + Povoliť &EFI (iba špeciálne operačné systémy) Hardware Clock in &UTC Time - + Hardvérové hodiny používajú &UTC čas 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. @@ -10889,7 +10965,7 @@ &Chipset: - + Či&pová sada: Selects the chipset to be emulated in this virtual machine. Note that the ICH9 chipset emulation is experimental and not recommended except for guest systems (such as Mac OS X) which require it. @@ -10976,10 +11052,6 @@ - The hardware virtualization is enabled in the Acceleration section of the System page although it is not supported by the host system. It should be disabled in order to start the virtual system. - - - %1 CPU %1 is 1 for now @@ -11306,11 +11378,11 @@ UIMediumDetailsWidget &Attributes - + &Atribúty &Information - + &Informácie &Type: @@ -11350,7 +11422,7 @@ Apply - + Použiť Reset changes in current medium details @@ -11362,7 +11434,7 @@ Reset Changes (%1) - + Obnoviť zmeny (%1) Apply Changes (%1) @@ -11539,7 +11611,7 @@ Apply - + Použiť Close @@ -11559,7 +11631,7 @@ Reset Changes (%1) - + Obnoviť zmeny (%1) Apply Changes (%1) @@ -11641,11 +11713,11 @@ &Create... - + &Vytvoriť... Create Disk Image - + Vytvoriť obraz disku Create new disk image file @@ -11653,7 +11725,7 @@ &Refresh - &Obnoviť + &Obnoviť Refresh Disk Image Files (%1) @@ -11665,35 +11737,35 @@ Choose - + Vybrať Name - Názov + Názov Virtual Size - Virtuálna veľkosť + Virtuálna veľkosť Actual Size - Skutočná veľkosť + Skutočná veľkosť Medium - + Médium Expand All - + Rozbaliť všetko Collapse All - + Zbaliť všetko Cancel - Zrušiť + Zrušiť Leave Empty @@ -12519,7 +12591,7 @@ Rename - + Premenovať Failed to set groups of the virtual machine <b>%1</b>. @@ -12568,7 +12640,7 @@ ACPI Shutdown machine - + ACPI vypnutie <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> @@ -13318,18 +13390,6 @@ - Failed to open the medium with following ID: <nobr><b>%1</b></nobr>. - - - - Failed to acquire attachment parameter. - - - - Failed to acquire medium attribute. - - - Failed to create cloud machine. @@ -13446,27 +13506,27 @@ Name: - + Názov: Machine Folder: - + Priečinok stroja: UINetworkAttachmentEditor &Attached to: - P&ripojený k: + P&ripojený k: &Name: - &Názov: + &Názov: Not selected network adapter name - Nevybraný + Nevybratý Selects the network adapter on the host system that traffic to and from this network card will go through. @@ -13553,7 +13613,7 @@ %1: %2 Context description: Error description - + %1: %2 Unable to initialize HTTP library @@ -14608,45 +14668,45 @@ Settings - Nastavenia + Nastavenia Allows to navigate through VM Settings categories - + Umožňuje pohyb medzi kategóriami nastavení VS User Interface - + Používateľské rozhranie UISettingsSerializerProgress Loading Settings... - + Načítavam nastavenia... Saving Settings... - + Ukladám nastavenia... UISnapshotDetailsWidget &Attributes - + &Atribúty &Information - + &Informácie &Name: - &Názov: + &Názov: &Description: - &Popis: + &Popis: Holds the snapshot name. @@ -14658,11 +14718,11 @@ Apply - + Použiť Reset - Reštartovať + Obnoviť Apply changes in current snapshot details @@ -14678,7 +14738,7 @@ Reset Changes (%1) - + Obnoviť zmeny (%1) Click to enlarge the screenshot. @@ -15494,55 +15554,55 @@ General - Všeobecné + Všeobecné System - Systém + Systém Display - Displej + Displej Storage - Úložisko + Úložisko Audio - Audio + Zvuk Network - Sieť + Sieť Serial Ports - Sériové porty + Sériové porty USB - USB + USB Shared Folders - Zdieľané priečinky + Zdieľané priečinky Performance &Monitor - + &Sledovanie výkonu No guest additions! This metric requires guest additions to work properly. - + Chýbajú hosťovské doplnky! Táto metrika pre správne fungovanie vyžaduje ich nainštalovanie. Reset - Reštartovať + Vynulovať Show Pie Chart - + Zobraziť koláčový graf Draw Area Chart @@ -15550,39 +15610,39 @@ Seconds - + sekundy CPU Load - + Zaťaženie CPU (load) Guest Load - + Zaťaženie hosťa VMM Load - + Zaťaženie VMM RAM Usage - + Využitie pamäte Total - + Celkom Free - + Voľná Used - + Použitá Network Rate - + Rýchlosť siete Receive Rate @@ -15701,7 +15761,7 @@ Inactive Nested Paging - + Neaktívne Active @@ -15711,7 +15771,7 @@ Inactive Unrestricted Execution - + Neaktívne Not Available @@ -15721,7 +15781,7 @@ not set Execution Engine - + nenastavený Not Detected @@ -15738,7 +15798,49 @@ UIVMListView Inaccessible - Nedostupné + Nedostupný + + + <nobr>%1<br></nobr><nobr>%2 since %3</nobr><br><nobr>Session %4</nobr> + VM tooltip (name, last state change, session state) + <nobr>%1<br></nobr><nobr>%2 od %3</nobr><br><nobr>Relácia %4</nobr> + + + <nobr><b>%1</b><br></nobr><nobr>Inaccessible since %2</nobr> + Inaccessible VM tooltip (name, last state change) + <nobr><b>%1</b><br></nobr><nobr>Nedostupné od %2</nobr> + + + S&how + &Zobraziť + + + Switch to the window of the selected virtual machine + Prepnúť do okna vybraného virtuálneho stroja + + + S&tart + S&pustiť + + + Start the selected virtual machine + Spustiť vybraný virtuálny stroj + + + R&esume + P&okračovať + + + Resume the execution of the virtual machine + Pokračovať v spúšťaní virtuálneho stroja + + + &Pause + &Pozastaviť + + + Suspend the execution of the virtual machine + Pozastaví spúšťanie virtuálneho stroja @@ -15993,7 +16095,7 @@ %1 MB - + %1 MB MB @@ -16025,55 +16127,6 @@ - UIVirtualMachineItem - - Inaccessible - Nedostupné - - - <nobr>%1<br></nobr><nobr>%2 since %3</nobr><br><nobr>Session %4</nobr> - VM tooltip (name, last state change, session state) - <nobr>%1<br></nobr><nobr>%2 od %3</nobr><br><nobr>Relácia %4</nobr> - - - <nobr><b>%1</b><br></nobr><nobr>Inaccessible since %2</nobr> - Inaccessible VM tooltip (name, last state change) - <nobr><b>%1</b><br></nobr><nobr>Nedostupné od %2</nobr> - - - S&how - &Zobraziť - - - Switch to the window of the selected virtual machine - Prepnúť do okna vybraného virtuálneho stroja - - - S&tart - S&pustiť - - - Start the selected virtual machine - Spustiť vybraný virtuálny stroj - - - R&esume - P&okračovať - - - Resume the execution of the virtual machine - Pokračovať v spúšťaní virtuálneho stroja - - - &Pause - &Pozastaviť - - - Suspend the execution of the virtual machine - Pozastaví spúšťanie virtuálneho stroja - - - UIVirtualMachineItemCloud Loading ... @@ -16090,7 +16143,7 @@ Inaccessible - Nedostupné + @@ -16107,7 +16160,7 @@ Inaccessible - Nedostupné + @@ -16351,11 +16404,11 @@ Clone - Klonovať + Klonovať %1 Clone - %1 klonovať + %1 klonovať When checked a new unique MAC address will be assigned to all configured network cards. @@ -16367,7 +16420,7 @@ Clone type - + Typ klonu <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> @@ -16431,15 +16484,15 @@ Name: - + Názov: Path: - + Cesta: MAC Address &Policy: - + Politika pre &MAC adresy: Include all network adapter MAC addresses @@ -16638,7 +16691,7 @@ MAC Address &Policy: - + Politika pre &MAC adresy: Include all network adapter MAC addresses @@ -16682,7 +16735,7 @@ &Account: - + Úč&et: <p>Please choose a filename to export the virtual appliance to. Besides that you can specify a certain amount of options which affects the size and content of resulting archive.</p> @@ -16855,7 +16908,7 @@ &Account: - + Úč&et: &Machines: @@ -16934,7 +16987,7 @@ &Account: - + Úč&et: &Images: @@ -17080,11 +17133,11 @@ Name and operating system - + Názov a operačný systém Memory size - + Veľkosť pamäte <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> @@ -17092,11 +17145,11 @@ &Memory size - + &Veľkost pamäte Hard disk - + Pevný disk <p>If you wish you can add a virtual hard disk to the new machine. You can either create a new hard disk 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 disk is <b>%1</b>.</p> @@ -17104,19 +17157,19 @@ &Do not add a virtual hard disk - + &Nepridávať virtuálny pevný disk &Create a virtual hard disk now - + Vytvoriť &pevný disk teraz &Use an existing virtual hard disk file - + Po&užiť súbor s existujúcim virtuálnym pevným diskom Choose a virtual hard disk file... - + Vybrať súbor s virtuálnym pevným diskom... Please choose a descriptive name and destination folder 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. diff -Nru virtualbox-hwe-6.1.34-dfsg/src/VBox/Frontends/VirtualBox/nls/VirtualBox_sl.ts virtualbox-hwe-6.1.38-dfsg/src/VBox/Frontends/VirtualBox/nls/VirtualBox_sl.ts --- virtualbox-hwe-6.1.34-dfsg/src/VBox/Frontends/VirtualBox/nls/VirtualBox_sl.ts 2022-03-22 23:44:34.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/src/VBox/Frontends/VirtualBox/nls/VirtualBox_sl.ts 2022-09-01 13:27:59.000000000 +0000 @@ -37,7 +37,7 @@ QApplication - + Executable <b>%1</b> requires Qt %2.x, found Qt %3. Izvedljiva datoteka <b>%1</b> zahteva Qt %2.x, najden Qt %3. @@ -57,7 +57,7 @@ <html><b>%1 (rc=%2)</b><br/><br/> - + Please try reinstalling VirtualBox. Poizkusite ponovno namestiti VirtualBox. @@ -77,7 +77,7 @@ - + VirtualBox - Runtime Error VirtualBox - napaka izvajanja @@ -97,7 +97,7 @@ Gonilnik jedra ni dostopen - + 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. Moduli jedra VirtualBox se ne ujemajo s to različico VirtualBoxa.Namestitev VirtualBoxa očitno ni bila uspešna. Poizkusite ga popolnoma odstraniti in ponovno namestiti. @@ -184,7 +184,7 @@ QIMessageBox - + OK V redu @@ -1557,7 +1557,7 @@ Predogled zaslona %1 - + &Connect Network Adapter &Poveži omrežni vmesnik @@ -2513,12 +2513,12 @@ - + Description Opis - + License Dovoljenje @@ -2538,7 +2538,12 @@ RAM - + + Storage Controller (VirtioSCSI) + + + + DVD DVD @@ -2593,12 +2598,12 @@ <b>Izvirna vrednost:</b> %1 - + Configuration Nastavitve - + Detailed list of all components of all virtual machines of the current appliance Podorben seznam sestavnih delov vseh navideznih računalnikov trenutne namenske naprave @@ -2616,7 +2621,7 @@ &Ponovno vpelji naslov MAC vseh omrežnih kartic - + Storage Controller (IDE) Krmilnik pomnilniških naprav (IDE) @@ -2631,7 +2636,7 @@ Krmilnik pomnilniških naprav (SCSI) - + Storage Controller (SAS) Krmilnik pomnilniških naprav (SAS) @@ -2707,7 +2712,7 @@ UIApplianceModelItem - + %1 col.1 text %1 @@ -3158,8 +3163,8 @@ UICommon - - + + @@ -3259,7 +3264,7 @@ Procesorji - + Powered Off MachineState Izklopljen @@ -4158,9 +4163,67 @@ TCP + + + Undefined + GuestSessionStatus + + + + + Starting GuestSessionStatus - Zaganjanje + Zaganjanje + + + + + Started + GuestSessionStatus + + + + + + Terminating + GuestSessionStatus + + + + + + Terminated + GuestSessionStatus + + + + + + Timed Out (Killed) + GuestSessionStatus + + + + + + Timed Out (Abnormally) + GuestSessionStatus + + + + + + Down + GuestSessionStatus + + + + + + Error + GuestSessionStatus + Starting @@ -4412,12 +4475,12 @@ - + Controller Krmilnik - + Input/Output @@ -4434,8 +4497,8 @@ - Bridget Adapter - + Bridged Adapter + Povezan vmesnik @@ -4458,7 +4521,12 @@ Omrežje NAT - + + Cloud Network + + + + Disconnected serial port @@ -4914,7 +4982,7 @@ Vse datoteke (*) - + Unknown device USB device details Neznana naprava @@ -4992,7 +5060,7 @@ <nobr>Stanje: %1</nobr> - + User-defined serial port Uporabniško določeno @@ -5805,7 +5873,7 @@ UIDetailsSet - + Contains the details of virtual machine '%1' Vsebuje podatke navideznega računalnika '%1' @@ -5907,7 +5975,7 @@ UIErrorString - + Result&nbsp;Code: error info Koda&nbsp;rezultata: @@ -6004,11 +6072,21 @@ - + Close Zapri + + Close dialog without saving + Zapri pogovorno okno brez shranjevanja + + + + Reset Changes (%1) + Ponastavi spremembe (%1) + + Clear @@ -6210,12 +6288,12 @@ - + Guest File System - + <b>Size:</b> %1 bytes @@ -7149,7 +7227,7 @@ Datoteke paketa razširitev (%1) - + Extensions Razširitve @@ -9664,7 +9742,7 @@ UIMachineLogic - + Select a filename for the screenshot ... Izberite ime datoteke za zaslonsko sliko … @@ -11124,7 +11202,7 @@ - + Choose/Create a disk image... @@ -11147,7 +11225,7 @@ - + Remove disk from virtual drive Odstrani disk iz navideznega pogona @@ -11589,12 +11667,7 @@ - - The hardware virtualization is enabled in the Acceleration section of the System page although it is not supported by the host system. It should be disabled in order to start the virtual system. - - - - + The hardware virtualization is not currently enabled in the Acceleration section of the System page. This is needed for nested paging support. It will be enabled automatically if you confirm your changes. @@ -12166,7 +12239,7 @@ -- - + Removing medium ... @@ -12459,12 +12532,12 @@ UIMediumSelector - + Medium - + &Add... &Dodaj … @@ -12510,24 +12583,24 @@ - + Cancel Prekliči - - + + Leave Empty - - + + Choose - + Name Ime @@ -12542,7 +12615,7 @@ Dejanska velikost - + Expand All @@ -12679,36 +12752,36 @@ UIMessageCenter - - + + VirtualBox - Information msg box title VirtualBox - podatki - - + + VirtualBox - Question msg box title VirtualBox - vprašanje - - + + VirtualBox - Warning msg box title VirtualBox - opozorilo - - + + VirtualBox - Error msg box title VirtualBox - napaka - - + + VirtualBox - Critical Error msg box title VirtualBox - kritična napaka @@ -12720,7 +12793,7 @@ Tega sporočila ne prikazuj več - + Failed to open <tt>%1</tt>. Make sure your desktop environment can properly handle URLs of this type. Odpiranje <tt>%1</tt> je spodeltelo. Prepričajte se, da lahko vaše namizno okolje pravilno obvlada URL te vrste. @@ -12740,7 +12813,7 @@ Dostop do podsistema USB je spodletel. - + Failed to create a new virtual machine. Ustvarjanje novega navideznega računalnika je spodletelo. @@ -12751,7 +12824,7 @@ Zagon navideznega računalnika <b>%1</b> je spodletel. - + Failed to pause the execution of the virtual machine <b>%1</b>. Premor izvajanja navideznega računalnika <b>%1</b> je spodeltel. @@ -12806,7 +12879,7 @@ Odpiranje nove seje za navidezni računalnik <b>%1</b> je spodletelo. - + Failed to remove the host network interface <b>%1</b>. Odstranjevanje vmesnika gostiteljskega omrežja <b>%1</b> je spodletelo. @@ -12933,7 +13006,7 @@ Odpiranje datoteke z dovoljenjem <nobr><b>%1</b></nobr> je spodletelo. Preverite dovoljenja datoteke. - + Failed to send the ACPI Power Button press event to the virtual machine <b>%1</b>. Pošiljanje pritiska gumba za izklop ACPI v navidezni računalnik <b>%1</b> je spodletelo. @@ -12958,7 +13031,7 @@ Zavrzi - + <p>The host key is currently defined as <b>%1</b>.</p> additional message box paragraph @@ -12971,7 +13044,7 @@ Zajemi - + Check inaccessible media message box Preveri @@ -12983,7 +13056,7 @@ Ponovno zaženi - + Continue no hard disk attached Nadaljuj @@ -13020,7 +13093,7 @@ <p>Navidezni računalnik sporoča, da gostujoči OS podpira <b>vključitev kazalca miške</b>. To pomeni, da vam ni treba <b>zajeti</b> kazalca miške, da ga lahko uporabite v gostujočem OS-u -- vsa dejanja miške, ki jih opravite, ko je kazalec miške v zaslonu navideznega računalnika, se bodo neposredno poslala v gostujoči OS. Če je miška trenutno zajeta, bo samodejno sproščena.</p><p>Ikona miške v vrstici stanja bo videti kot&nbsp;<img src=:/hostkey_16px.png/>&nbsp;, da vas obvesti, da gostujoči OS podpira vključitev kazalca miške in je trenutno vklopljena.</p><p><b>Opomba</b>: nekateri programi so bodo morda vedeli nepravilno v načinu vključtve kazalca miške. Vedno jo lahko izklopite za trenutno sejo (in jo ponovno omogočite) z izbiro ustreznega dejanja iz menijske vrstice.</p> - + Release detach medium @@ -13033,12 +13106,12 @@ Odstrani - + <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> <p>Enota pomnilniške naprave trdega diska na mestu <b>%1</b> že obstaja. Novega trdega diska, ki uporablja to mesto, ne morete ustvariti, ker ga že lahko uporablja drug navidezni trdi disk.</p><p>Navedite drugo mesto.</p> - + Delete hard disk storage Izbriši @@ -13056,24 +13129,24 @@ Brisanje enote pomnilniške naprave trdega diska <b>%1</b> je spodletelo. - + Failed to create the hard disk storage <nobr><b>%1</b>.</nobr> Ustvarjanje pomnilniške naprave trdega diska <b>%1</b> je spodletelo.</nobr> - + Failed to access the disk image file <nobr><b>%1</b></nobr>. Dostop do datoteke odtisa diska <b>%1</b> je spodletel</nobr>. - + The following files already exist:<br /><br />%1<br /><br />Are you sure you want to replace them? Replacing them will overwrite their contents. Naslednje datoteke že obstajajo:<br /><br />%1.<br /><br />Ali jih res želite nadomestiti? Njihova nadomestitev bo prepisala njihovo vsebino. - + You are running a prerelease version of VirtualBox. This version is not suitable for production use. Izvajajte predizdajno različico VirtualBoxa. Ta različica ni primerna za proizvodno uporabo. @@ -13083,7 +13156,7 @@ Gosta poizkušate izklopiti z gumbom za izklop ACPI. To trenutno ni mogoče, ker gost ne podpira zaustavtve programske opreme. - + <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> <p>Strojno pospeševanje VT-x/AMD-V je bilo omogočeno, vendar ne deluje. Vaš 64-bitni gost ne bo zaznal 64-bitnega CPE-ja in se ne bo mogel zagnati.</p><p>Prepričajte se, da ste pravilno omogočili VT-x/AMD-V v BIOS-u svojega gostiteljskega računalnika.</p> @@ -13106,14 +13179,14 @@ Nadaljuj - + Cancel Prekliči - + Failed to open/interpret appliance <b>%1</b>. Odpiranje/prepoznavanje namenske naprave <b>%1</b> je spodletelo. @@ -13162,7 +13235,7 @@ Odstranjevanje datoteke je spodletelo. - + 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. Videti je, da imate na /sys/bus/usb/drivers priklopljen datotečni sistem USBFS. Zelo priporočamo, da to spremenite, ker je to resna napačna nastavitev vašega sistema, ki lahko povzroči, da naprave USB spodletijo na nepričakovane načine. @@ -13207,7 +13280,7 @@ &Odstrani - + <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. <p>Strojno pospeševanje VT-x/AMD-V ni na voljo na vašem sistemu. Vaš 64-bitni gost ne bo zaznal 64-bitnega CPE-ja in se ne bo zagnal. @@ -13227,7 +13300,7 @@ <p>Zaslona gosta ni bilo mogoče spremeniti v zaslon gostitelja zaradi nezadostnega grafičnega pomnilnika gosta.</p><p>Grafični pomnilnik navideznega računalnika morate nastaviti na najmanj <b>%1</b>.</p><p>Pritisnite <b>Prezri</b>, da vseeno preklopite na zaslon ali <b>Prekliči</b>, da prekličete opravilo.</p> - + Failed to open virtual machine located in %1. Odpiranje navideznega računalnika na %1 je spodletelo. @@ -13250,7 +13323,7 @@ - + Remove Odstrani @@ -13264,12 +13337,12 @@ <p>Ste pred dodajanjem novega disketnega pogona h krmilniku <b>%1</b>.</p><p>Ali želite izbrati navidezno disketo za vstavitev v pogon ali ga za zdaj pustiti praznega?</p> - + Failed to detach the hard disk (<nobr><b>%1</b></nobr>) from the slot <i>%2</i> of the machine <b>%3</b>. Odklop trdega diska (<nobr><b>%1</b></nobr>) z mesta <i>%2</i> računalnika <b>%3</b>.je spodletel. - + Failed to update Guest Additions. The Guest Additions disk image file will be inserted for user installation. Posodobitev programa Guest Additions je spodletela. Datoteka odtisa diska Guest Additions bo vstavljena za uporabniško namestitev. @@ -13311,7 +13384,7 @@ &Odstrani - + The current port forwarding rules are not valid. None of the host or guest port values may be set to zero. Trenutna pravila posredovanja vrat niso veljavna. Nobena vrednost vrat gostitelja ali gosta ne sme biti nastavljena na nič. @@ -13332,7 +13405,7 @@ <p>Upoštevajte za enota pomnilniške naprave tega nosilca ne bo izbrisana in jo bo mogoče kasneje spet uporabiti.</p> - + <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> <p>Okno navideznega računalnika bo sedaj preklopljeno na <b>tekoči</b> način. S pritiskom na <b>%1</b> se lahko kadarkoli vrnete na okenski način.</p><p>Upoštevajte, da je <i>gostiteljska</i> tipka trenutno določena kot <b>%2</b>.</p><p>Upoštevajte, da je v tekočem načinu glavna menijska vrstica skrita . Do nje lahko dostopate s pritiskom na <b>gostiteljsko tipko+Home</b>.</p> @@ -13414,7 +13487,7 @@ Registracija navideznega računalnika <b>%1</b> je spodeltela. - + <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> <p>Nastavitve računalnika so se med vašim urejanjem spremenile. Trenutno imate neshranjenne spremembe.</p><p>Ali želite ponovno naložiti spremenjene nastavitve ali obdržati svoje?</p> @@ -13434,13 +13507,13 @@ Navidezni računalnik, ki ga spreminjate, se je zagnal. Med izvajanjem računalnika lahko spremenite samo določene nastavitve. Vse druge spremembe bodo izgubljene, če zdaj zaprete to okno. - + Failed to clone the virtual machine <b>%1</b>. Kloniranje navideznega računlanika <b>%1</b> je spodletelo. - + Create a snapshot of the current machine state Ustvari posnetek trenutnega stanja računalnika @@ -13450,7 +13523,7 @@ <p>Napaka pri spreminjanju odtisa diska iz <b>%1</b> v <b>%2</b>.</p> - + Could not load the Host USB Proxy Service (VERR_FILE_NOT_FOUND). The service might not be installed on the host computer Storitve posredniškega strežnika USB gostitelja ni bilo mogoče naložiti (VERR_FILE_NOT_FOUND. Storitev morda ni nameščena na gostiteljskem računalniku. @@ -13475,12 +13548,12 @@ Storitve posredniškega strežnika USB gostitelja ni bilo mogoče naložiti. - + Can't find snapshot named <b>%1</b>. Posnetka stanja z imenom <b>%1</b> ni bilo mogoče najti. - + <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> <p>Nameščeno imate staro različico (%1) <b><nobr>%2</nobr></b>.</p><p>Ali želite z interneta prejeti najnovejšo?</p> @@ -13512,7 +13585,7 @@ <p>Nameščeno imate različico %1 <b><nobr>%2</nobr></b>.</p><p>Prejmite in namestite različico %3 tega paketa razširitev od Oracla!</p> - + <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> <p>Začenjanje COM-a je spodletelo, ker mapa splošnih nastavitev VirtualBoxa <b><nobr>%1</nobr></b> ni na voljo. Preverite dovoljenja te in njene nadrejene mape.</p><p>Program se bo sedaj končal.</p> @@ -13537,12 +13610,12 @@ <p>Ste pred odstranitvijo naslednjih navideznih računalnikov s seznama računalnikov: <b>%1</b>.</p><p>Ali želite iz trdega diska izbrisati tudi datoteke, ki vsebujejo navidezni računalnik?</p> - + Do you wish to cancel all current network operations? Ali želite preklicati vsa trenutna omrežna opravila? - + ACPI Shutdown machine Zaustavitev ACPI @@ -13554,7 +13627,7 @@ Izklopi - + <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> <p>Mape računalnika <nobr><b>%1</b> ni mogoče odstraniti.</nobr></p><p>Preverite, ali ta mapa res obstaja in da imate dovoljenja za njeno odstranitev.</p> @@ -13564,7 +13637,7 @@ <p>Mape računalnika <nobr><b>%1</b> v nadrejeni mapi <nobr><b>%2</b> ni mogoče ustvaritii.</nobr></p><p>Mapa že obstaja in verjetno pripada drugemu računalniku.</p> - + <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> <p>Ali res želite zavreči shranjeno stanje naslednjih navideznih računalnikov?</p><p><b>%1</b></p><p>To opravilo je enakrovredno ponovnemu zagonu ali izklopu računalnika brez primerne zaustavitve gostujočega OS-a.</p> @@ -13614,7 +13687,7 @@ Nastavljanje skupin navideznega računalnika <b>%1</b> je spodeltelo. - + <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> <p>Računalnika <b>%1</b> ni bilo mogoče zagnati, ker naslednjih fizičnih omrežnih vmesnikov ni bilo najdenih:</p><p><b>%2</b></p><p>Lahko spremenite omrežne nastavitve računalnika ali ga ustavite.</p> @@ -13624,7 +13697,7 @@ Spremeni omrežne nastavitve - + <p>Cannot start the VirtualBox Manager due to local restrictions.</p><p>The application will now terminate.</p> <p>Upravljalnika VirtualBoxa ni mogoče zagnati zaradi krajevnih omejitev.</p><p>Program se bo sedaj zaprl.</p> @@ -13650,7 +13723,7 @@ - + Ignore @@ -13693,7 +13766,7 @@ I&zberi disk - + Failed to move the storage unit of the disk image <b>%1</b> to <b>%2</b>. Premikanje pomnilniške enote odtisa diska <b>%1</b> to <b>%2</b> je spodletelo. @@ -13767,22 +13840,7 @@ <p>Navidezne diskete <b>%1</b> iz računalnika <b>%2</b>ni mogoče izvreči.</p> - - Failed to open the medium with following ID: <nobr><b>%1</b></nobr>. - - - - - Failed to acquire attachment parameter. - - - - - Failed to acquire medium attribute. - - - - + Failed to acquire host network interfaces. Pridobivanje vmesnikov gostiteljskga omrežja je spodletelo. @@ -14054,7 +14112,7 @@ Tega sporočila ne prikazuj več - + <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> <p>Ali želite odstraniti omrežje NAT <nobr><b>%1</b>?</nobr></p><p>Če to omrežje uporablja en ali več omrežnih vmesnikov navideznega računalnika, ti ne bodo več uporabni, dokler ne popravite njihove nastavitve z izbiro drugega imena omrežja ali druge vrste priklopa vmesnika.</p> @@ -14084,7 +14142,7 @@ <p>Videti je, da program VirtualBox Guest Additions na tem navideznem računalniku ni na voljo in brez njega deljenih map ni mogoče uporabljati. Da jih uporabite v navideznem računalniku, namestite program Guest Additions, če še ni nameščen, ali ga z izbiro <b>Vstavi odtis CD Guest Additions</b> iz menija <b>Naprave</b> ponovno namestite, če ne delujejo pravilno. Če je program Guest Additions nameščen, vendar se računalnik še ni popolnoma zagnal, bo na voljo, ko se popolnoma zažene.</p> - + Insert additions Vstavi @@ -14095,7 +14153,7 @@ <p>Navidezni zaslon je trenutno nastavljen na <b>%1-bitni</b> barvni način. Za boljšo zmogljivost ga spremenite na <b>%2-bitnega</b>. To običajno lahko storite iz odseka<b>Zaslon</b> Nadzorne plošče gostujočega operacijskega sistema ali sistemskih nastavitev.</p> - + The current port forwarding rules are not valid. Rule names should be unique. Trenutna pravila posredovanja vrat niso veljavna. Imena pravil morajo biti edinstvena. @@ -14235,7 +14293,7 @@ <p>Datoteke odtisa diska<b>VirtualBox Guest Additions</b> ni bilo mogoče vstaviti v računalnik <b>%1</b>, ker nima optičnih pogonov. Dodajte pogon z uporabo strani pomnilnških naprav okna nastavitev navideznega računalnika.</p> - + <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 optical drive?</p> <p>Datoteka odtisa diska <b>VirtualBox Guest Additions</b> je bila uspešno prejeta iz <nobr><a href="%1">%1</a></nobr>in krajevno shranjena kot <nobr><b>%2</b>.</nobr></p><p>Ali želite registrirati to datoteko odtisa diska in jo vstaviti v navidezni optični pogon?</p> @@ -14288,7 +14346,7 @@ Odklop kabla omrežnega vmesnika navideznega računalnika <b>%1</b> je spodletela. - + <p>One or more 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> <p>Ena ali več datotek odtisa diska trenutno ni na voljo. Posledično ne boste mogli upravljati z navideznimi računalniki, ki uporabljajo te datoteke, dokler spet ne postanejo dostopne.</p><p>Pritisnite <b>Preveri</b>, da odprete Upravljalnika navideznih nosilcev in si ogledate, katere datoteke niso dostopne ali <b>Prezri</b>, da prezrete to sporočilo.</p> @@ -14349,7 +14407,7 @@ Odpiranje datoteke odtisa diska <nobr><b>%1</b></nobr> je spodletelo. - + Failed to close the disk image file <nobr><b>%1</b></nobr>. Zapiranje datoteke odtisa diska <nobr><b>%1</b></nobr> je spodletelo. @@ -14369,7 +14427,7 @@ <p>Zaslona gosta ni bilo mogoče preklopiti na celozaslonski način zaradi nezadostnega grafičnega pomnilnika gosta.</p><p>Grafični pomnilnik navideznega računalnika morate nastaviti na najmanj <b>%1</b>.</p><p>Pritisnite <b>Prezri</b>, da vseeno preklopite na celozaslonski način ali <b>Prekliči</b>, da prekličete opravilo.</p> - + Encryption password for <nobr>ID = '%1'</nobr> is invalid. Šifrirno geslo za <nobr>ID = '%1'</nobr> je neveljavno. @@ -16776,7 +16834,7 @@ Shrani dnevnik VirtualBoxa kot - + <p><b>No machine</b> is currently selected or the selected machine is not valid. Please select a Virtual Machine to see its logs @@ -17066,7 +17124,7 @@ UIWelcomePane - + <h3>Welcome to VirtualBox!</h3><p>The left part of application window contains global tools and lists all virtual machines and virtual machine groups on your computer. You can import, add and create new VMs using corresponding toolbar buttons. You can popup a tools of currently selected element using corresponding element button.</p><p>You can press the <b>%1</b> key to get instant help, or visit <a href=https://www.virtualbox.org>www.virtualbox.org</a> for more information and latest news.</p> @@ -17928,7 +17986,7 @@ Zaženi - + <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 using the Devices menu.</p> <p>Izberite navidezni optični disk ali fizični pogon z diskom, iz katerega boste zagnali nov navidezni računalnik.</p><p>Disk mora biti primeren za zagon računalnika in mora vsebovati operacijski sistem, ki ga želite namestiti na navidezni računalnik, če želite to storiti zdaj. Disk bo samodejno izvržen on naslednjem izklopu navideznega računalnika, vendar to lahko po potrebi storite tudi sami z uporabo menija Naprave.</p> @@ -17971,7 +18029,7 @@ - + Open Virtualization Format (%1) Odprta oblika navideznosti (%1) @@ -18325,7 +18383,7 @@ Ustvari - + Name and operating system Ime in operacijski sistem diff -Nru virtualbox-hwe-6.1.34-dfsg/src/VBox/Frontends/VirtualBox/nls/VirtualBox_sr.ts virtualbox-hwe-6.1.38-dfsg/src/VBox/Frontends/VirtualBox/nls/VirtualBox_sr.ts --- virtualbox-hwe-6.1.34-dfsg/src/VBox/Frontends/VirtualBox/nls/VirtualBox_sr.ts 2022-03-22 23:44:34.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/src/VBox/Frontends/VirtualBox/nls/VirtualBox_sr.ts 2022-09-01 13:27:59.000000000 +0000 @@ -2303,6 +2303,10 @@ Primary Group + + Storage Controller (VirtioSCSI) + + UIApplianceImportEditorWidget @@ -3612,7 +3616,7 @@ Starting GuestSessionStatus - Покретање + Покретање Starting @@ -3806,8 +3810,8 @@ NAT - Bridget Adapter - + Bridged Adapter + Мост адаптер Internal Network @@ -4380,6 +4384,50 @@ NetworkAttachmentType + + Undefined + GuestSessionStatus + + + + Started + GuestSessionStatus + + + + Terminating + GuestSessionStatus + + + + Terminated + GuestSessionStatus + + + + Timed Out (Killed) + GuestSessionStatus + + + + Timed Out (Abnormally) + GuestSessionStatus + + + + Down + GuestSessionStatus + + + + Error + GuestSessionStatus + + + + Cloud Network + + UICustomFileSystemModel @@ -6143,6 +6191,14 @@ No Guest Session found!<br>Please use the Session Panel to start a new guest session + + Close dialog without saving + + + + Reset Changes (%1) + + UIFilePathSelector @@ -11646,10 +11702,6 @@ - The hardware virtualization is enabled in the Acceleration section of the System page although it is not supported by the host system. It should be disabled in order to start the virtual system. - - - %1 CPU %1 is 1 for now @@ -14442,18 +14494,6 @@ - Failed to open the medium with following ID: <nobr><b>%1</b></nobr>. - - - - Failed to acquire attachment parameter. - - - - Failed to acquire medium attribute. - - - Failed to create cloud machine. diff -Nru virtualbox-hwe-6.1.34-dfsg/src/VBox/Frontends/VirtualBox/nls/VirtualBox_sv.ts virtualbox-hwe-6.1.38-dfsg/src/VBox/Frontends/VirtualBox/nls/VirtualBox_sv.ts --- virtualbox-hwe-6.1.34-dfsg/src/VBox/Frontends/VirtualBox/nls/VirtualBox_sv.ts 2022-03-22 23:44:34.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/src/VBox/Frontends/VirtualBox/nls/VirtualBox_sv.ts 2022-09-01 13:27:59.000000000 +0000 @@ -2532,6 +2532,10 @@ Primary Group + + Storage Controller (VirtioSCSI) + + UIApplianceImportEditorWidget @@ -3853,7 +3857,7 @@ Starting GuestSessionStatus - Startar + Startar Starting @@ -4047,8 +4051,8 @@ NAT - Bridget Adapter - + Bridged Adapter + Bryggat nätkort Internal Network @@ -4615,6 +4619,50 @@ NetworkAttachmentType + + Undefined + GuestSessionStatus + + + + Started + GuestSessionStatus + + + + Terminating + GuestSessionStatus + + + + Terminated + GuestSessionStatus + + + + Timed Out (Killed) + GuestSessionStatus + + + + Timed Out (Abnormally) + GuestSessionStatus + + + + Down + GuestSessionStatus + + + + Error + GuestSessionStatus + + + + Cloud Network + + UICustomFileSystemModel @@ -6490,6 +6538,14 @@ No Guest Session found!<br>Please use the Session Panel to start a new guest session + + Close dialog without saving + + + + Reset Changes (%1) + + UIFilePathSelector @@ -12865,10 +12921,6 @@ - The hardware virtualization is enabled in the Acceleration section of the System page although it is not supported by the host system. It should be disabled in order to start the virtual system. - - - %1 CPU %1 is 1 for now @@ -15906,18 +15958,6 @@ - Failed to open the medium with following ID: <nobr><b>%1</b></nobr>. - - - - Failed to acquire attachment parameter. - - - - Failed to acquire medium attribute. - - - Failed to create cloud machine. diff -Nru virtualbox-hwe-6.1.34-dfsg/src/VBox/Frontends/VirtualBox/nls/VirtualBox_th.ts virtualbox-hwe-6.1.38-dfsg/src/VBox/Frontends/VirtualBox/nls/VirtualBox_th.ts --- virtualbox-hwe-6.1.34-dfsg/src/VBox/Frontends/VirtualBox/nls/VirtualBox_th.ts 2022-03-22 23:44:35.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/src/VBox/Frontends/VirtualBox/nls/VirtualBox_th.ts 2022-09-01 13:27:59.000000000 +0000 @@ -1953,6 +1953,10 @@ Primary Group + + Storage Controller (VirtioSCSI) + + UIApplianceImportEditorWidget @@ -3139,7 +3143,7 @@ Starting GuestSessionStatus - กำลังเริ่ม + กำลังเริ่ม Starting @@ -3333,8 +3337,8 @@ NAT - Bridget Adapter - + Bridged Adapter + แผงวงจรแบบบริดจ์ Internal Network @@ -3895,6 +3899,50 @@ NetworkAttachmentType + + Undefined + GuestSessionStatus + + + + Started + GuestSessionStatus + + + + Terminating + GuestSessionStatus + + + + Terminated + GuestSessionStatus + + + + Timed Out (Killed) + GuestSessionStatus + + + + Timed Out (Abnormally) + GuestSessionStatus + + + + Down + GuestSessionStatus + + + + Error + GuestSessionStatus + + + + Cloud Network + + UICustomFileSystemModel @@ -4837,6 +4885,14 @@ No Guest Session found!<br>Please use the Session Panel to start a new guest session + + Close dialog without saving + + + + Reset Changes (%1) + + UIFilePathSelector @@ -9212,10 +9268,6 @@ - The hardware virtualization is enabled in the Acceleration section of the System page although it is not supported by the host system. It should be disabled in order to start the virtual system. - - - When checked, the nested hardware virtualization CPU feature will be exposed to the virtual machine. @@ -11315,18 +11367,6 @@ - Failed to open the medium with following ID: <nobr><b>%1</b></nobr>. - - - - Failed to acquire attachment parameter. - - - - Failed to acquire medium attribute. - - - Failed to create cloud machine. diff -Nru virtualbox-hwe-6.1.34-dfsg/src/VBox/Frontends/VirtualBox/nls/VirtualBox_tr.ts virtualbox-hwe-6.1.38-dfsg/src/VBox/Frontends/VirtualBox/nls/VirtualBox_tr.ts --- virtualbox-hwe-6.1.34-dfsg/src/VBox/Frontends/VirtualBox/nls/VirtualBox_tr.ts 2022-03-22 23:44:35.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/src/VBox/Frontends/VirtualBox/nls/VirtualBox_tr.ts 2022-09-01 13:27:59.000000000 +0000 @@ -2906,6 +2906,10 @@ Primary Group Birincil Grup + + Storage Controller (VirtioSCSI) + + UIApplianceImportEditorWidget @@ -4182,27 +4186,27 @@ Undefined GuestSessionStatus - Tanımsız + Tanımsız Starting GuestSessionStatus - Başlatılıyor + Başlatılıyor Started GuestSessionStatus - Başlatıldı + Başlatıldı Terminating GuestSessionStatus - Sonlandırılıyor + Sonlandırılıyor Terminated GuestSessionStatus - Sonlandırıldı + Sonlandırıldı TimedOutKilled @@ -4217,12 +4221,12 @@ Down GuestSessionStatus - Kapandı + Kapandı Error GuestSessionStatus - Hata + Hata Undefined @@ -4466,7 +4470,7 @@ NAT - Bridget Adapter + Bridged Adapter Köprü Bağdaştırıcısı @@ -5028,6 +5032,20 @@ NetworkAttachmentType + + Timed Out (Killed) + GuestSessionStatus + + + + Timed Out (Abnormally) + GuestSessionStatus + + + + Cloud Network + Bulut Ağı + UICustomFileSystemModel @@ -6567,6 +6585,14 @@ No Guest Session found!<br>Please use the Session Panel to start a new guest session Bulunan Misafir Oturumu yok!<br>Yeni bir misafir oturumu başlatmak için lütfen Oturum Panelini kullanın + + Close dialog without saving + İleti penceresini kaydetmeden kapat + + + Reset Changes (%1) + Değişiklikleri Sıfırla (%1) + UIFileManagerLogViewer @@ -13508,7 +13534,7 @@ The hardware virtualization is enabled in the Acceleration section of the System page although it is not supported by the host system. It should be disabled in order to start the virtual system. - Donanım sanallaştırma, anamakine sistemi tarafından desteklenmemesine rağmen Sistem sayfasının Hızlandırma bölümünde etkinleştirildi. Sanal sistemi başlatmak için etkisizleştirilmelidir. + Donanım sanallaştırma, anamakine sistemi tarafından desteklenmemesine rağmen Sistem sayfasının Hızlandırma bölümünde etkinleştirildi. Sanal sistemi başlatmak için etkisizleştirilmelidir. When checked, the nested hardware virtualization CPU feature will be exposed to the virtual machine. @@ -16596,15 +16622,15 @@ Failed to open the medium with following ID: <nobr><b>%1</b></nobr>. - Şurada belirtilen kimliğe sahip ortamı açma başarısız: <nobr><b>%1</b></nobr>. + Şurada belirtilen kimliğe sahip ortamı açma başarısız: <nobr><b>%1</b></nobr>. Failed to acquire attachment parameter. - Ek parametresini alma başarısız. + Ek parametresini alma başarısız. Failed to acquire medium attribute. - Ortam parametresini alma başarısız. + Ortam parametresini alma başarısız. Failed to create cloud machine. @@ -24356,7 +24382,7 @@ NAT - Bridget Adapter + Bridged Adapter Köprü Bağdaştırıcısı diff -Nru virtualbox-hwe-6.1.34-dfsg/src/VBox/Frontends/VirtualBox/nls/VirtualBox_uk.ts virtualbox-hwe-6.1.38-dfsg/src/VBox/Frontends/VirtualBox/nls/VirtualBox_uk.ts --- virtualbox-hwe-6.1.34-dfsg/src/VBox/Frontends/VirtualBox/nls/VirtualBox_uk.ts 2022-03-22 23:44:35.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/src/VBox/Frontends/VirtualBox/nls/VirtualBox_uk.ts 2022-09-01 13:27:59.000000000 +0000 @@ -2497,6 +2497,10 @@ Primary Group + + Storage Controller (VirtioSCSI) + + UIApplianceImportEditorWidget @@ -3821,7 +3825,7 @@ Starting GuestSessionStatus - Запускається + Запускається Starting @@ -4015,8 +4019,8 @@ NAT - Bridget Adapter - + Bridged Adapter + Проміжний адаптер Internal Network @@ -4589,6 +4593,50 @@ NetworkAttachmentType + + Undefined + GuestSessionStatus + + + + Started + GuestSessionStatus + + + + Terminating + GuestSessionStatus + + + + Terminated + GuestSessionStatus + + + + Timed Out (Killed) + GuestSessionStatus + + + + Timed Out (Abnormally) + GuestSessionStatus + + + + Down + GuestSessionStatus + + + + Error + GuestSessionStatus + + + + Cloud Network + + UICustomFileSystemModel @@ -6432,6 +6480,14 @@ No Guest Session found!<br>Please use the Session Panel to start a new guest session + + Close dialog without saving + + + + Reset Changes (%1) + + UIFilePathSelector @@ -12485,10 +12541,6 @@ - The hardware virtualization is enabled in the Acceleration section of the System page although it is not supported by the host system. It should be disabled in order to start the virtual system. - - - When checked, the nested hardware virtualization CPU feature will be exposed to the virtual machine. @@ -15407,18 +15459,6 @@ - Failed to open the medium with following ID: <nobr><b>%1</b></nobr>. - - - - Failed to acquire attachment parameter. - - - - Failed to acquire medium attribute. - - - Failed to create cloud machine. diff -Nru virtualbox-hwe-6.1.34-dfsg/src/VBox/Frontends/VirtualBox/nls/VirtualBox_xx_YY.ts virtualbox-hwe-6.1.38-dfsg/src/VBox/Frontends/VirtualBox/nls/VirtualBox_xx_YY.ts --- virtualbox-hwe-6.1.34-dfsg/src/VBox/Frontends/VirtualBox/nls/VirtualBox_xx_YY.ts 2022-03-22 23:44:35.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/src/VBox/Frontends/VirtualBox/nls/VirtualBox_xx_YY.ts 2022-09-01 13:27:59.000000000 +0000 @@ -1865,6 +1865,10 @@ Primary Group + + Storage Controller (VirtioSCSI) + + UIApplianceImportEditorWidget @@ -3215,7 +3219,7 @@ - Bridget Adapter + Bridged Adapter @@ -3777,6 +3781,55 @@ NetworkAttachmentType + + Undefined + GuestSessionStatus + + + + Starting + GuestSessionStatus + + + + Started + GuestSessionStatus + + + + Terminating + GuestSessionStatus + + + + Terminated + GuestSessionStatus + + + + Timed Out (Killed) + GuestSessionStatus + + + + Timed Out (Abnormally) + GuestSessionStatus + + + + Down + GuestSessionStatus + + + + Error + GuestSessionStatus + + + + Cloud Network + + UICustomFileSystemModel @@ -4677,6 +4730,14 @@ No Guest Session found!<br>Please use the Session Panel to start a new guest session + + Close dialog without saving + + + + Reset Changes (%1) + + UIFilePathSelector @@ -7311,10 +7372,6 @@ - The hardware virtualization is enabled in the Acceleration section of the System page although it is not supported by the host system. It should be disabled in order to start the virtual system. - - - %1 CPU %1 is 1 for now @@ -9139,18 +9196,6 @@ - Failed to open the medium with following ID: <nobr><b>%1</b></nobr>. - - - - Failed to acquire attachment parameter. - - - - Failed to acquire medium attribute. - - - Failed to create cloud machine. diff -Nru virtualbox-hwe-6.1.34-dfsg/src/VBox/Frontends/VirtualBox/nls/VirtualBox_zh_CN.ts virtualbox-hwe-6.1.38-dfsg/src/VBox/Frontends/VirtualBox/nls/VirtualBox_zh_CN.ts --- virtualbox-hwe-6.1.34-dfsg/src/VBox/Frontends/VirtualBox/nls/VirtualBox_zh_CN.ts 2022-03-22 23:44:35.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/src/VBox/Frontends/VirtualBox/nls/VirtualBox_zh_CN.ts 2022-09-01 13:27:59.000000000 +0000 @@ -2727,6 +2727,10 @@ TODO 主要编组 + + Storage Controller (VirtioSCSI) + + UIApplianceImportEditorWidget @@ -4096,7 +4100,7 @@ Starting GuestSessionStatus - 正在启动 + 正在启动 Starting @@ -4136,22 +4140,22 @@ IDE Primary Device 0 StorageSlot - 第一IDE控制器主通道 + 第一IDE控制器主通道 IDE Primary Device 1 StorageSlot - 第一IDE控制器从通道 + 第一IDE控制器从通道 IDE Secondary Device 0 StorageSlot - 第二IDE控制器主通道 + 第二IDE控制器主通道 IDE Secondary Device 1 StorageSlot - 第二IDE控制器从通道 + 第二IDE控制器从通道 SATA Port %1 @@ -4291,7 +4295,7 @@ Bridget Adapter - 桥接网卡 + 桥接网卡 Internal Network @@ -4851,8 +4855,56 @@ Cloud Network [EXPERIMENTAL] NetworkAttachmentType + 云网络 [试验功能] + + + Undefined + GuestSessionStatus + + + + Started + GuestSessionStatus + + + + Terminating + GuestSessionStatus + + + + Terminated + GuestSessionStatus + + + + Timed Out (Killed) + GuestSessionStatus + + Timed Out (Abnormally) + GuestSessionStatus + + + + Down + GuestSessionStatus + + + + Error + GuestSessionStatus + + + + Bridged Adapter + 桥接网卡 + + + Cloud Network + 云网络 + UICustomFileSystemModel @@ -6547,6 +6599,14 @@ No Guest Session found!<br>Please use the Session Panel to start a new guest session 未找到虚拟机会话!<br>请用会话面板开启新会话 + + Close dialog without saving + 关闭对话框而不保存 + + + Reset Changes (%1) + 重置更改 (%1) + UIFilePathSelector @@ -12664,7 +12724,7 @@ The hardware virtualization is enabled in the Acceleration section of the System page although it is not supported by the host system. It should be disabled in order to start the virtual system. - 硬件加速配置页中已启用硬件虚拟化,但主机并不支持。 需要禁用硬件虚拟化才能启动虚拟机。 + 硬件加速配置页中已启用硬件虚拟化,但主机并不支持。 需要禁用硬件虚拟化才能启动虚拟机。 When checked, the nested hardware virtualization CPU feature will be exposed to the virtual machine. @@ -12681,7 +12741,7 @@ The nested paging is not currently enabled in the Acceleration section of the System page. This is needed to support nested hardware virtualization. It will be enabled automatically if you confirm your changes. - 尚未启用潜逃分页。支持嵌套虚拟化时需要启用。确认更改时此选项将被启用。 + 尚未启用嵌套分页。支持嵌套虚拟化时需要启用。确认更改时此选项将被启用。 The hardware virtualization is not currently enabled in the Acceleration section of the System page. This is needed for nested paging support. It will be enabled automatically if you confirm your changes. @@ -15518,15 +15578,15 @@ Failed to open the medium with following ID: <nobr><b>%1</b></nobr>. - 打开虚拟介质 <nobr><b>%1</b></nobr> (ID) 失败. + 打开虚拟介质 <nobr><b>%1</b></nobr> (ID) 失败. Failed to acquire attachment parameter. - 未能获取相关参数. + 未能获取相关参数. Failed to acquire medium attribute. - 未能获取介质属性。 + 未能获取介质属性。 Failed to create cloud machine. diff -Nru virtualbox-hwe-6.1.34-dfsg/src/VBox/Frontends/VirtualBox/nls/VirtualBox_zh_TW.ts virtualbox-hwe-6.1.38-dfsg/src/VBox/Frontends/VirtualBox/nls/VirtualBox_zh_TW.ts --- virtualbox-hwe-6.1.34-dfsg/src/VBox/Frontends/VirtualBox/nls/VirtualBox_zh_TW.ts 2022-03-22 23:44:35.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/src/VBox/Frontends/VirtualBox/nls/VirtualBox_zh_TW.ts 2022-09-01 13:27:59.000000000 +0000 @@ -1865,6 +1865,10 @@ Primary Group 主要群組 + + Storage Controller (VirtioSCSI) + + UIApplianceImportEditorWidget @@ -3220,7 +3224,7 @@ NAT - Bridget Adapter + Bridged Adapter 橋接介面卡 @@ -3782,6 +3786,55 @@ NetworkAttachmentType + + Undefined + GuestSessionStatus + + + + Starting + GuestSessionStatus + 正在開始 + + + Started + GuestSessionStatus + + + + Terminating + GuestSessionStatus + + + + Terminated + GuestSessionStatus + + + + Timed Out (Killed) + GuestSessionStatus + + + + Timed Out (Abnormally) + GuestSessionStatus + + + + Down + GuestSessionStatus + + + + Error + GuestSessionStatus + + + + Cloud Network + 雲端網路 + UICustomFileSystemModel @@ -4682,6 +4735,14 @@ No Guest Session found!<br>Please use the Session Panel to start a new guest session 找不到客體工作階段!<br>請使用「工作階段面板」開始新的客體工作階段 + + Close dialog without saving + 關閉對話方塊而不儲存 + + + Reset Changes (%1) + 重設變更 (%1) + UIFilePathSelector @@ -7317,7 +7378,7 @@ The hardware virtualization is enabled in the Acceleration section of the System page although it is not supported by the host system. It should be disabled in order to start the virtual system. - 在「系統」頁的「加速」部分中啟用硬體虛擬化,儘管主機系統不支援。 它應該停用,以便啟動虛擬系統。 + 在「系統」頁的「加速」部分中啟用硬體虛擬化,儘管主機系統不支援。 它應該停用,以便啟動虛擬系統。 %1 CPU @@ -9145,15 +9206,15 @@ Failed to open the medium with following ID: <nobr><b>%1</b></nobr>. - 無法開啟具有以下 ID 的媒體: <nobr><b>%1</b></nobr>。 + 無法開啟具有以下 ID 的媒體: <nobr><b>%1</b></nobr>。 Failed to acquire attachment parameter. - 無法獲取附件參數。 + 無法獲取附件參數。 Failed to acquire medium attribute. - 無法獲取媒體屬性。 + 無法獲取媒體屬性。 Failed to create cloud machine. diff -Nru virtualbox-hwe-6.1.34-dfsg/src/VBox/Frontends/VirtualBox/src/converter/UIConverterBackendGlobal.cpp virtualbox-hwe-6.1.38-dfsg/src/VBox/Frontends/VirtualBox/src/converter/UIConverterBackendGlobal.cpp --- virtualbox-hwe-6.1.34-dfsg/src/VBox/Frontends/VirtualBox/src/converter/UIConverterBackendGlobal.cpp 2022-03-22 23:44:37.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/src/VBox/Frontends/VirtualBox/src/converter/UIConverterBackendGlobal.cpp 2022-09-01 13:28:01.000000000 +0000 @@ -1192,11 +1192,14 @@ { case UIExtraDataMetaDefs::DetailsElementOptionTypeNetwork_NotAttached: strResult = QApplication::translate("UICommon", "Not Attached", "network adapter"); break; case UIExtraDataMetaDefs::DetailsElementOptionTypeNetwork_NAT: strResult = QApplication::translate("UICommon", "NAT"); break; - case UIExtraDataMetaDefs::DetailsElementOptionTypeNetwork_BridgetAdapter: strResult = QApplication::translate("UICommon", "Bridget Adapter"); break; + case UIExtraDataMetaDefs::DetailsElementOptionTypeNetwork_BridgedAdapter: strResult = QApplication::translate("UICommon", "Bridged Adapter"); break; case UIExtraDataMetaDefs::DetailsElementOptionTypeNetwork_InternalNetwork: strResult = QApplication::translate("UICommon", "Internal Network"); break; case UIExtraDataMetaDefs::DetailsElementOptionTypeNetwork_HostOnlyAdapter: strResult = QApplication::translate("UICommon", "Host Only Adapter"); break; case UIExtraDataMetaDefs::DetailsElementOptionTypeNetwork_GenericDriver: strResult = QApplication::translate("UICommon", "Generic Driver"); break; case UIExtraDataMetaDefs::DetailsElementOptionTypeNetwork_NATNetwork: strResult = QApplication::translate("UICommon", "NAT Network"); break; +#ifdef VBOX_WITH_CLOUD_NET + case UIExtraDataMetaDefs::DetailsElementOptionTypeNetwork_CloudNetwork: strResult = QApplication::translate("UICommon", "Cloud Network"); break; +#endif /* VBOX_WITH_CLOUD_NET */ default: { AssertMsgFailed(("No text for details element option type=%d", enmDetailsElementOptionTypeNetwork)); @@ -1214,7 +1217,7 @@ { case UIExtraDataMetaDefs::DetailsElementOptionTypeNetwork_NotAttached: strResult = "NotAttached"; break; case UIExtraDataMetaDefs::DetailsElementOptionTypeNetwork_NAT: strResult = "NAT"; break; - case UIExtraDataMetaDefs::DetailsElementOptionTypeNetwork_BridgetAdapter: strResult = "BridgetAdapter"; break; + case UIExtraDataMetaDefs::DetailsElementOptionTypeNetwork_BridgedAdapter: strResult = "BridgedAdapter"; break; case UIExtraDataMetaDefs::DetailsElementOptionTypeNetwork_InternalNetwork: strResult = "InternalNetwork"; break; case UIExtraDataMetaDefs::DetailsElementOptionTypeNetwork_HostOnlyAdapter: strResult = "HostOnlyAdapter"; break; case UIExtraDataMetaDefs::DetailsElementOptionTypeNetwork_GenericDriver: strResult = "GenericDriver"; break; @@ -1239,7 +1242,7 @@ QStringList keys; QList values; keys << "NotAttached"; values << UIExtraDataMetaDefs::DetailsElementOptionTypeNetwork_NotAttached; keys << "NAT"; values << UIExtraDataMetaDefs::DetailsElementOptionTypeNetwork_NAT; - keys << "BridgetAdapter"; values << UIExtraDataMetaDefs::DetailsElementOptionTypeNetwork_BridgetAdapter; + keys << "BridgedAdapter"; values << UIExtraDataMetaDefs::DetailsElementOptionTypeNetwork_BridgedAdapter; keys << "InternalNetwork"; values << UIExtraDataMetaDefs::DetailsElementOptionTypeNetwork_InternalNetwork; keys << "HostOnlyAdapter"; values << UIExtraDataMetaDefs::DetailsElementOptionTypeNetwork_HostOnlyAdapter; keys << "GenericDriver"; values << UIExtraDataMetaDefs::DetailsElementOptionTypeNetwork_GenericDriver; diff -Nru virtualbox-hwe-6.1.34-dfsg/src/VBox/Frontends/VirtualBox/src/extradata/UIExtraDataDefs.h virtualbox-hwe-6.1.38-dfsg/src/VBox/Frontends/VirtualBox/src/extradata/UIExtraDataDefs.h --- virtualbox-hwe-6.1.34-dfsg/src/VBox/Frontends/VirtualBox/src/extradata/UIExtraDataDefs.h 2022-03-22 23:44:38.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/src/VBox/Frontends/VirtualBox/src/extradata/UIExtraDataDefs.h 2022-09-01 13:28:02.000000000 +0000 @@ -723,7 +723,7 @@ DetailsElementOptionTypeNetwork_Invalid = 0, DetailsElementOptionTypeNetwork_NotAttached = RT_BIT(0), DetailsElementOptionTypeNetwork_NAT = RT_BIT(1), - DetailsElementOptionTypeNetwork_BridgetAdapter = RT_BIT(2), + DetailsElementOptionTypeNetwork_BridgedAdapter = RT_BIT(2), DetailsElementOptionTypeNetwork_InternalNetwork = RT_BIT(3), DetailsElementOptionTypeNetwork_HostOnlyAdapter = RT_BIT(4), DetailsElementOptionTypeNetwork_GenericDriver = RT_BIT(5), diff -Nru virtualbox-hwe-6.1.34-dfsg/src/VBox/Frontends/VirtualBox/src/globals/UIDetailsGenerator.cpp virtualbox-hwe-6.1.38-dfsg/src/VBox/Frontends/VirtualBox/src/globals/UIDetailsGenerator.cpp --- virtualbox-hwe-6.1.34-dfsg/src/VBox/Frontends/VirtualBox/src/globals/UIDetailsGenerator.cpp 2022-03-22 23:44:38.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/src/VBox/Frontends/VirtualBox/src/globals/UIDetailsGenerator.cpp 2022-09-01 13:28:03.000000000 +0000 @@ -591,7 +591,7 @@ } case KNetworkAttachmentType_Bridged: { - if (fOptions & UIExtraDataMetaDefs::DetailsElementOptionTypeNetwork_BridgetAdapter) + if (fOptions & UIExtraDataMetaDefs::DetailsElementOptionTypeNetwork_BridgedAdapter) { const QString strName = comAdapter.GetBridgedInterface(); strAttachmentType = strAttachmentTemplate diff -Nru virtualbox-hwe-6.1.34-dfsg/src/VBox/Frontends/VirtualBox/src/globals/UIIconPool.cpp virtualbox-hwe-6.1.38-dfsg/src/VBox/Frontends/VirtualBox/src/globals/UIIconPool.cpp --- virtualbox-hwe-6.1.34-dfsg/src/VBox/Frontends/VirtualBox/src/globals/UIIconPool.cpp 2022-03-22 23:44:38.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/src/VBox/Frontends/VirtualBox/src/globals/UIIconPool.cpp 2022-09-01 13:28:03.000000000 +0000 @@ -350,6 +350,8 @@ m_guestOSTypeIconNames.insert("NetBSD_64", ":/os_netbsd_64.png"); m_guestOSTypeIconNames.insert("Solaris", ":/os_solaris.png"); m_guestOSTypeIconNames.insert("Solaris_64", ":/os_solaris_64.png"); + m_guestOSTypeIconNames.insert("Solaris10U8_or_later", ":/os_solaris.png"); + m_guestOSTypeIconNames.insert("Solaris10U8_or_later_64", ":/os_solaris_64.png"); m_guestOSTypeIconNames.insert("OpenSolaris", ":/os_oraclesolaris.png"); m_guestOSTypeIconNames.insert("OpenSolaris_64", ":/os_oraclesolaris_64.png"); m_guestOSTypeIconNames.insert("Solaris11_64", ":/os_oraclesolaris_64.png"); diff -Nru virtualbox-hwe-6.1.34-dfsg/src/VBox/Frontends/VirtualBox/src/manager/UIWelcomePane.cpp virtualbox-hwe-6.1.38-dfsg/src/VBox/Frontends/VirtualBox/src/manager/UIWelcomePane.cpp --- virtualbox-hwe-6.1.34-dfsg/src/VBox/Frontends/VirtualBox/src/manager/UIWelcomePane.cpp 2022-03-22 23:44:40.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/src/VBox/Frontends/VirtualBox/src/manager/UIWelcomePane.cpp 2022-09-01 13:28:05.000000000 +0000 @@ -23,6 +23,7 @@ /* GUI includes */ #include "QIWithRetranslateUI.h" +#include "UICommon.h" #include "UIIconPool.h" #include "UIWelcomePane.h" @@ -162,6 +163,11 @@ .arg(QKeySequence(QKeySequence::HelpContents).toString(QKeySequence::NativeText))); } +void UIWelcomePane::sltHandleLinkActivated(const QString &strLink) +{ + uiCommon().openURL(strLink); +} + void UIWelcomePane::prepare() { /* Prepare default welcome icon: */ @@ -188,6 +194,7 @@ m_pLabelText->setMinimumWidth(160); /// @todo make dynamic m_pLabelText->setAlignment(Qt::AlignLeading | Qt::AlignTop); m_pLabelText->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::Minimum); + connect(m_pLabelText, &QLabel::linkActivated, this, &UIWelcomePane::sltHandleLinkActivated); /* Add into layout: */ pLayoutWelcome->addWidget(m_pLabelText); diff -Nru virtualbox-hwe-6.1.34-dfsg/src/VBox/Frontends/VirtualBox/src/manager/UIWelcomePane.h virtualbox-hwe-6.1.38-dfsg/src/VBox/Frontends/VirtualBox/src/manager/UIWelcomePane.h --- virtualbox-hwe-6.1.34-dfsg/src/VBox/Frontends/VirtualBox/src/manager/UIWelcomePane.h 2022-03-22 23:44:40.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/src/VBox/Frontends/VirtualBox/src/manager/UIWelcomePane.h 2022-09-01 13:28:05.000000000 +0000 @@ -49,6 +49,11 @@ /** Handles translation event. */ virtual void retranslateUi() /* override */; +private slots: + + /** Handles activated @a strLink. */ + void sltHandleLinkActivated(const QString &strLink); + private: /** Prepares all. */ diff -Nru virtualbox-hwe-6.1.34-dfsg/src/VBox/Frontends/VirtualBox/src/settings/machine/UIMachineSettingsStorage.cpp virtualbox-hwe-6.1.38-dfsg/src/VBox/Frontends/VirtualBox/src/settings/machine/UIMachineSettingsStorage.cpp --- virtualbox-hwe-6.1.34-dfsg/src/VBox/Frontends/VirtualBox/src/settings/machine/UIMachineSettingsStorage.cpp 2022-03-22 23:44:46.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/src/VBox/Frontends/VirtualBox/src/settings/machine/UIMachineSettingsStorage.cpp 2022-09-01 13:28:11.000000000 +0000 @@ -3757,7 +3757,7 @@ mCbNonRotational->setChecked(m_pModelStorage->data(index, StorageModel::R_AttIsNonRotational).toBool()); /* Fetch hot-pluggable state: */ - m_pCheckBoxHotPluggable->setVisible((slt.bus == KStorageBus_SATA) || (slt.bus == KStorageBus_USB)); + m_pCheckBoxHotPluggable->setVisible(slt.bus == KStorageBus_SATA); m_pCheckBoxHotPluggable->setChecked(fIsHotPluggable); /* Update optional widgets visibility: */ @@ -3958,7 +3958,7 @@ { const QString strMachineFolder(QFileInfo(m_strMachineSettingsFilePath).absolutePath()); - QUuid uMediumId = uiCommon().openMediumWithFileOpenDialog(m_pMediumIdHolder->type(), this, strMachineFolder); + QUuid uMediumId = uiCommon().openMediumWithFileOpenDialog(m_pMediumIdHolder->type(), QApplication::activeWindow(), strMachineFolder); if (uMediumId.isNull()) return; m_pMediumIdHolder->setId(uMediumId); @@ -5372,7 +5372,7 @@ } } - if (newControllerData.m_enmBus == KStorageBus_SATA || newControllerData.m_enmBus == KStorageBus_USB) + if (newControllerData.m_enmBus == KStorageBus_SATA) { /* Save whether this device is hot-pluggable: */ if (fSuccess && isMachineOffline()) @@ -5466,7 +5466,7 @@ } } - if (newControllerData.m_enmBus == KStorageBus_SATA || newControllerData.m_enmBus == KStorageBus_USB) + if (newControllerData.m_enmBus == KStorageBus_SATA) { /* Save whether this device is hot-pluggable: */ if (fSuccess && isMachineOffline()) diff -Nru virtualbox-hwe-6.1.34-dfsg/src/VBox/Frontends/VirtualBox/src/widgets/UIApplianceEditorWidget.cpp virtualbox-hwe-6.1.38-dfsg/src/VBox/Frontends/VirtualBox/src/widgets/UIApplianceEditorWidget.cpp --- virtualbox-hwe-6.1.34-dfsg/src/VBox/Frontends/VirtualBox/src/widgets/UIApplianceEditorWidget.cpp 2022-03-22 23:44:46.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/src/VBox/Frontends/VirtualBox/src/widgets/UIApplianceEditorWidget.cpp 2022-09-01 13:28:11.000000000 +0000 @@ -481,6 +481,7 @@ case KVirtualSystemDescriptionType_HardDiskControllerIDE: value = UIApplianceEditorWidget::tr("Storage Controller (IDE)"); break; case KVirtualSystemDescriptionType_HardDiskControllerSATA: value = UIApplianceEditorWidget::tr("Storage Controller (SATA)"); break; case KVirtualSystemDescriptionType_HardDiskControllerSCSI: value = UIApplianceEditorWidget::tr("Storage Controller (SCSI)"); break; + case KVirtualSystemDescriptionType_HardDiskControllerVirtioSCSI: value = UIApplianceEditorWidget::tr("Storage Controller (VirtioSCSI)"); break; case KVirtualSystemDescriptionType_HardDiskControllerSAS: value = UIApplianceEditorWidget::tr("Storage Controller (SAS)"); break; case KVirtualSystemDescriptionType_CDROM: value = UIApplianceEditorWidget::tr("DVD"); break; case KVirtualSystemDescriptionType_Floppy: value = UIApplianceEditorWidget::tr("Floppy"); break; @@ -655,6 +656,7 @@ case KVirtualSystemDescriptionType_HardDiskControllerIDE: value = UIIconPool::iconSet(":/ide_16px.png"); break; case KVirtualSystemDescriptionType_HardDiskControllerSATA: value = UIIconPool::iconSet(":/sata_16px.png"); break; case KVirtualSystemDescriptionType_HardDiskControllerSCSI: value = UIIconPool::iconSet(":/scsi_16px.png"); break; + case KVirtualSystemDescriptionType_HardDiskControllerVirtioSCSI: value = UIIconPool::iconSet(":/virtio_scsi_16px.png"); break; case KVirtualSystemDescriptionType_HardDiskControllerSAS: value = UIIconPool::iconSet(":/sas_16px.png"); break; case KVirtualSystemDescriptionType_HardDiskImage: value = UIIconPool::iconSet(":/hd_16px.png"); break; case KVirtualSystemDescriptionType_CDROM: value = UIIconPool::iconSet(":/cd_16px.png"); break; @@ -1340,6 +1342,7 @@ if (types[i] == KVirtualSystemDescriptionType_HardDiskControllerIDE || types[i] == KVirtualSystemDescriptionType_HardDiskControllerSATA || types[i] == KVirtualSystemDescriptionType_HardDiskControllerSCSI || + types[i] == KVirtualSystemDescriptionType_HardDiskControllerVirtioSCSI || types[i] == KVirtualSystemDescriptionType_HardDiskControllerSAS) controllerMap[i] = pHardwareItem; } @@ -1680,6 +1683,7 @@ KVirtualSystemDescriptionType_HardDiskControllerIDE, KVirtualSystemDescriptionType_HardDiskControllerSATA, KVirtualSystemDescriptionType_HardDiskControllerSCSI, + KVirtualSystemDescriptionType_HardDiskControllerVirtioSCSI, KVirtualSystemDescriptionType_HardDiskControllerSAS, /* OCI */ KVirtualSystemDescriptionType_CloudProfileName, diff -Nru virtualbox-hwe-6.1.34-dfsg/src/VBox/Frontends/VirtualBox/src/widgets/UIApplianceExportEditorWidget.cpp virtualbox-hwe-6.1.38-dfsg/src/VBox/Frontends/VirtualBox/src/widgets/UIApplianceExportEditorWidget.cpp --- virtualbox-hwe-6.1.34-dfsg/src/VBox/Frontends/VirtualBox/src/widgets/UIApplianceExportEditorWidget.cpp 2022-03-22 23:44:46.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/src/VBox/Frontends/VirtualBox/src/widgets/UIApplianceExportEditorWidget.cpp 2022-09-01 13:28:11.000000000 +0000 @@ -49,6 +49,7 @@ << KVirtualSystemDescriptionType_HardDiskControllerIDE << KVirtualSystemDescriptionType_HardDiskControllerSATA << KVirtualSystemDescriptionType_HardDiskControllerSCSI + << KVirtualSystemDescriptionType_HardDiskControllerVirtioSCSI << KVirtualSystemDescriptionType_HardDiskControllerSAS << KVirtualSystemDescriptionType_CloudProfileName; } diff -Nru virtualbox-hwe-6.1.34-dfsg/src/VBox/Frontends/VirtualBox/src/widgets/UINetworkAttachmentEditor.cpp virtualbox-hwe-6.1.38-dfsg/src/VBox/Frontends/VirtualBox/src/widgets/UINetworkAttachmentEditor.cpp --- virtualbox-hwe-6.1.34-dfsg/src/VBox/Frontends/VirtualBox/src/widgets/UINetworkAttachmentEditor.cpp 2022-03-22 23:44:47.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/src/VBox/Frontends/VirtualBox/src/widgets/UINetworkAttachmentEditor.cpp 2022-09-01 13:28:12.000000000 +0000 @@ -504,7 +504,7 @@ switch (comEnum) { case KNetworkAttachmentType_NAT: return UIExtraDataMetaDefs::DetailsElementOptionTypeNetwork_NAT; - case KNetworkAttachmentType_Bridged: return UIExtraDataMetaDefs::DetailsElementOptionTypeNetwork_BridgetAdapter; + case KNetworkAttachmentType_Bridged: return UIExtraDataMetaDefs::DetailsElementOptionTypeNetwork_BridgedAdapter; case KNetworkAttachmentType_Internal: return UIExtraDataMetaDefs::DetailsElementOptionTypeNetwork_InternalNetwork; case KNetworkAttachmentType_HostOnly: return UIExtraDataMetaDefs::DetailsElementOptionTypeNetwork_HostOnlyAdapter; case KNetworkAttachmentType_Generic: return UIExtraDataMetaDefs::DetailsElementOptionTypeNetwork_GenericDriver; diff -Nru virtualbox-hwe-6.1.34-dfsg/src/VBox/Frontends/VirtualBox/src/wizards/importappliance/UIWizardImportAppPageExpert.cpp virtualbox-hwe-6.1.38-dfsg/src/VBox/Frontends/VirtualBox/src/wizards/importappliance/UIWizardImportAppPageExpert.cpp --- virtualbox-hwe-6.1.34-dfsg/src/VBox/Frontends/VirtualBox/src/wizards/importappliance/UIWizardImportAppPageExpert.cpp 2022-03-22 23:44:49.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/src/VBox/Frontends/VirtualBox/src/wizards/importappliance/UIWizardImportAppPageExpert.cpp 2022-09-01 13:28:14.000000000 +0000 @@ -209,7 +209,6 @@ if (m_pApplianceWidget) { m_pApplianceWidget->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::MinimumExpanding); - m_pApplianceWidget->setFile(strFileName); /* Add into layout: */ pApplianceWidgetLayout->addWidget(m_pApplianceWidget); @@ -284,6 +283,9 @@ registerField("vsdForm", this, "vsdForm"); registerField("machineId", this, "machineId"); registerField("applianceWidget", this, "applianceWidget"); + + if (!strFileName.isEmpty() && m_pFileSelector) + m_pFileSelector->setPath(strFileName); } bool UIWizardImportAppPageExpert::event(QEvent *pEvent) diff -Nru virtualbox-hwe-6.1.34-dfsg/src/VBox/Frontends/VirtualBox/src/wizards/newvm/UIWizardNewVMPageBasic1.cpp virtualbox-hwe-6.1.38-dfsg/src/VBox/Frontends/VirtualBox/src/wizards/newvm/UIWizardNewVMPageBasic1.cpp --- virtualbox-hwe-6.1.34-dfsg/src/VBox/Frontends/VirtualBox/src/wizards/newvm/UIWizardNewVMPageBasic1.cpp 2022-03-22 23:44:49.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/src/VBox/Frontends/VirtualBox/src/wizards/newvm/UIWizardNewVMPageBasic1.cpp 2022-09-01 13:28:14.000000000 +0000 @@ -83,11 +83,17 @@ { QRegExp( "Reac.*", Qt::CaseInsensitive), "Windows2003" }, /* Solaris: */ - { QRegExp("Sol.*11", Qt::CaseInsensitive), "Solaris11_64" }, - { QRegExp("((Op.*Sol)|(os20[01][0-9])|(Sol.*10)|(India)|(Neva)).*64", Qt::CaseInsensitive), "OpenSolaris_64" }, - { QRegExp("((Op.*Sol)|(os20[01][0-9])|(Sol.*10)|(India)|(Neva)).*32", Qt::CaseInsensitive), "OpenSolaris" }, - { QRegExp("Sol.*64", Qt::CaseInsensitive), "Solaris_64" }, - { QRegExp("Sol.*32", Qt::CaseInsensitive), "Solaris" }, + { QRegExp("((Op.*Sol)|(os20[01][0-9])|(India)|(Illum)|(Neva)).*64", Qt::CaseInsensitive), "OpenSolaris_64" }, + { QRegExp("((Op.*Sol)|(os20[01][0-9])|(India)|(Illum)|(Neva)).*32", Qt::CaseInsensitive), "OpenSolaris" }, + { QRegExp("(Sol.*10.*(10/09)|(9/10)|(8/11)|(1/13)).*64", Qt::CaseInsensitive), "Solaris10U8_or_later_64" }, + { QRegExp("(Sol.*10.*(10/09)|(9/10)|(8/11)|(1/13)).*32", Qt::CaseInsensitive), "Solaris10U8_or_later" }, + { QRegExp("(Sol.*10.*(U[89])|(U1[01])).*64", Qt::CaseInsensitive), "Solaris10U8_or_later_64" }, + { QRegExp("(Sol.*10.*(U[89])|(U1[01])).*32", Qt::CaseInsensitive), "Solaris10U8_or_later" }, + { QRegExp("(Sol.*10.*(1/06)|(6/06)|(11/06)|(8/07)|(5/08)|(10/08)|(5/09)).*64", Qt::CaseInsensitive), "Solaris_64" }, // Solaris 10U7 (5/09) or earlier + { QRegExp("(Sol.*10.*(1/06)|(6/06)|(11/06)|(8/07)|(5/08)|(10/08)|(5/09)).*32", Qt::CaseInsensitive), "Solaris" }, // Solaris 10U7 (5/09) or earlier + { QRegExp("((Sol.*10.*U[1-7])|(Sol.*10)).*64", Qt::CaseInsensitive), "Solaris_64" }, // Solaris 10U7 (5/09) or earlier + { QRegExp("((Sol.*10.*U[1-7])|(Sol.*10)).*32", Qt::CaseInsensitive), "Solaris" }, // Solaris 10U7 (5/09) or earlier + { QRegExp("((Sol.*11)|(Sol.*)).*64", Qt::CaseInsensitive), "Solaris11_64" }, /* OS/2: */ { QRegExp("OS[/|!-]{,1}2.*W.*4.?5", Qt::CaseInsensitive), "OS2Warp45" }, @@ -150,8 +156,8 @@ { QRegExp("(Ub)|(Min).*32", Qt::CaseInsensitive), "Ubuntu" }, { QRegExp("Xa.*64", Qt::CaseInsensitive), "Xandros_64" }, { QRegExp("Xa.*32", Qt::CaseInsensitive), "Xandros" }, - { QRegExp("((Or)|(oel)|(ol)).*64", Qt::CaseInsensitive), "Oracle_64" }, - { QRegExp("((Or)|(oel)|(ol)).*32", Qt::CaseInsensitive), "Oracle" }, + { QRegExp("((Or)|(oel)|(^ol)).*64", Qt::CaseInsensitive), "Oracle_64" }, + { QRegExp("((Or)|(oel)|(^ol)).*32", Qt::CaseInsensitive), "Oracle" }, { QRegExp("Knoppix", Qt::CaseInsensitive), "Linux26" }, { QRegExp("Dsl", Qt::CaseInsensitive), "Linux24" }, { QRegExp("((Lin)|(lnx)).*2.?2", Qt::CaseInsensitive), "Linux22" }, diff -Nru virtualbox-hwe-6.1.34-dfsg/src/VBox/Frontends/VirtualBox/VBoxUI.pro virtualbox-hwe-6.1.38-dfsg/src/VBox/Frontends/VirtualBox/VBoxUI.pro --- virtualbox-hwe-6.1.34-dfsg/src/VBox/Frontends/VirtualBox/VBoxUI.pro 2022-03-22 23:44:15.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/src/VBox/Frontends/VirtualBox/VBoxUI.pro 2022-09-01 13:27:39.000000000 +0000 @@ -65,6 +65,7 @@ nls/VirtualBox_id.ts \ nls/VirtualBox_it.ts \ nls/VirtualBox_ja.ts \ + nls/VirtualBox_ka.ts \ nls/VirtualBox_km_KH.ts \ nls/VirtualBox_ko.ts \ nls/VirtualBox_lt.ts \ diff -Nru virtualbox-hwe-6.1.34-dfsg/src/VBox/GuestHost/DragAndDrop/DnDUtils.cpp virtualbox-hwe-6.1.38-dfsg/src/VBox/GuestHost/DragAndDrop/DnDUtils.cpp --- virtualbox-hwe-6.1.34-dfsg/src/VBox/GuestHost/DragAndDrop/DnDUtils.cpp 1970-01-01 00:00:00.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/src/VBox/GuestHost/DragAndDrop/DnDUtils.cpp 2022-09-01 13:28:15.000000000 +0000 @@ -0,0 +1,47 @@ +/* $Id: DnDUtils.cpp $ */ +/** @file + * DnD - Common utility functions. + */ + +/* + * Copyright (C) 2022 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 + +#include +#include + + +/** + * Converts a VBOXDNDACTION to a string. + * + * @returns Stringified version of VBOXDNDACTION + * @param uAction DnD action to convert. + */ +const char *DnDActionToStr(VBOXDNDACTION uAction) +{ + switch (uAction) + { + case VBOX_DND_ACTION_IGNORE: return "ignore"; + case VBOX_DND_ACTION_COPY: return "copy"; + case VBOX_DND_ACTION_MOVE: return "move"; + case VBOX_DND_ACTION_LINK: return "link"; + default: + break; + } + AssertMsgFailedReturn(("Unknown uAction=%d\n", uAction), "bad"); +} + diff -Nru virtualbox-hwe-6.1.34-dfsg/src/VBox/GuestHost/DragAndDrop/Makefile.kmk virtualbox-hwe-6.1.38-dfsg/src/VBox/GuestHost/DragAndDrop/Makefile.kmk --- virtualbox-hwe-6.1.34-dfsg/src/VBox/GuestHost/DragAndDrop/Makefile.kmk 2022-03-22 23:44:50.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/src/VBox/GuestHost/DragAndDrop/Makefile.kmk 2022-09-01 13:28:15.000000000 +0000 @@ -27,7 +27,8 @@ DnDMIME.cpp \ DnDPath.cpp \ DnDTransferObject.cpp \ - DnDTransferList.cpp + DnDTransferList.cpp \ + DnDUtils.cpp # # DnDGuestR3Lib - For tools on the guest side, @@ -60,4 +61,3 @@ $(VBOX_PATH_HOSTSERVICES_COMMON)/message.cpp include $(FILE_KBUILD_SUB_FOOTER) - diff -Nru virtualbox-hwe-6.1.34-dfsg/src/VBox/HostDrivers/linux/export_modules.sh virtualbox-hwe-6.1.38-dfsg/src/VBox/HostDrivers/linux/export_modules.sh --- virtualbox-hwe-6.1.34-dfsg/src/VBox/HostDrivers/linux/export_modules.sh 2022-03-22 23:44:56.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/src/VBox/HostDrivers/linux/export_modules.sh 2022-09-01 13:28:21.000000000 +0000 @@ -122,12 +122,12 @@ VBOX_VENDOR_SHORT=`sed -e 's/^ *VBOX_VENDOR_SHORT *= \+\(.\+\)/\1/;t;d' $PATH_ROOT/Config.kmk` VBOX_PRODUCT=`sed -e 's/^ *VBOX_PRODUCT *= \+\(.\+\)/\1/;t;d' $PATH_ROOT/Config.kmk` VBOX_C_YEAR=`date +%Y` -VBOX_WITH_PCI_PASSTHROUGH=`sed -e "s/^ *VBOX_WITH_PCI_PASSTHROUGH *= *\(1\?\)/\1/;t;d" $PATH_ROOT/Config.kmk` +VBOX_WITH_PCI_PASSTHROUGH=`sed -e '/^ *VBOX_WITH_PCI_PASSTHROUGH *[:]\?= */!d' -e 's/ *#.*$//' -e 's/^.*= *//' $PATH_ROOT/Config.kmk` . $PATH_VBOXDRV/linux/files_vboxdrv . $PATH_VBOXNET/linux/files_vboxnetflt . $PATH_VBOXADP/linux/files_vboxnetadp -if [ "$VBOX_WITH_PCI_PASSTHROUGH" -eq "1" ]; then +if [ "${VBOX_WITH_PCI_PASSTHROUGH}" = "1" ]; then . $PATH_VBOXPCI/linux/files_vboxpci fi @@ -212,7 +212,7 @@ fi # vboxpci (VirtualBox host PCI access kernel module) -if [ "$VBOX_WITH_PCI_PASSTHROUGH" -eq "1" ]; then +if [ "${VBOX_WITH_PCI_PASSTHROUGH}" = "1" ]; then mkdir $PATH_TMP/vboxpci || exit 1 for f in $VBOX_VBOXPCI_SOURCES; do install -D -m 0644 `echo $f|cut -d'=' -f1` "$PATH_TMP/vboxpci/`echo $f|cut -d'>' -f2`" diff -Nru virtualbox-hwe-6.1.34-dfsg/src/VBox/HostDrivers/Support/bldSUPSignedDummy.cpp virtualbox-hwe-6.1.38-dfsg/src/VBox/HostDrivers/Support/bldSUPSignedDummy.cpp --- virtualbox-hwe-6.1.34-dfsg/src/VBox/HostDrivers/Support/bldSUPSignedDummy.cpp 1970-01-01 00:00:00.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/src/VBox/HostDrivers/Support/bldSUPSignedDummy.cpp 2022-09-01 13:28:16.000000000 +0000 @@ -0,0 +1,32 @@ +/* $Id: bldSUPSignedDummy.cpp $ */ +/** @file + * VirtualBox Support Library - Dummy program for extracting signing certificate. + */ + +/* + * Copyright (C) 2006-2022 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. + */ + + +int main() +{ + return 0; +} + Binary files /tmp/tmpf0d0r25a/mI3UAcA4FD/virtualbox-hwe-6.1.34-dfsg/src/VBox/HostDrivers/Support/Certificates/Timestamp-VBoxLegacyWinCA.crt and /tmp/tmpf0d0r25a/pQ8IruulI3/virtualbox-hwe-6.1.38-dfsg/src/VBox/HostDrivers/Support/Certificates/Timestamp-VBoxLegacyWinCA.crt differ Binary files /tmp/tmpf0d0r25a/mI3UAcA4FD/virtualbox-hwe-6.1.34-dfsg/src/VBox/HostDrivers/Support/Certificates/Timestamp-VBoxLegacyWinCA.taf and /tmp/tmpf0d0r25a/pQ8IruulI3/virtualbox-hwe-6.1.38-dfsg/src/VBox/HostDrivers/Support/Certificates/Timestamp-VBoxLegacyWinCA.taf differ diff -Nru virtualbox-hwe-6.1.34-dfsg/src/VBox/HostDrivers/Support/darwin/SUPDrv-darwin.cpp virtualbox-hwe-6.1.38-dfsg/src/VBox/HostDrivers/Support/darwin/SUPDrv-darwin.cpp --- virtualbox-hwe-6.1.34-dfsg/src/VBox/HostDrivers/Support/darwin/SUPDrv-darwin.cpp 2022-03-22 23:44:51.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/src/VBox/HostDrivers/Support/darwin/SUPDrv-darwin.cpp 2022-09-01 13:28:16.000000000 +0000 @@ -2002,6 +2002,18 @@ } +SUPR0DECL(bool) SUPR0FpuBegin(bool fCtxHook) +{ + RT_NOREF(fCtxHook); + return false; +} + + +SUPR0DECL(void) SUPR0FpuEnd(bool fCtxHook) +{ + RT_NOREF(fCtxHook); +} + /* * * org_virtualbox_SupDrv diff -Nru virtualbox-hwe-6.1.34-dfsg/src/VBox/HostDrivers/Support/freebsd/SUPDrv-freebsd.c virtualbox-hwe-6.1.38-dfsg/src/VBox/HostDrivers/Support/freebsd/SUPDrv-freebsd.c --- virtualbox-hwe-6.1.34-dfsg/src/VBox/HostDrivers/Support/freebsd/SUPDrv-freebsd.c 2022-03-22 23:44:52.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/src/VBox/HostDrivers/Support/freebsd/SUPDrv-freebsd.c 2022-09-01 13:28:16.000000000 +0000 @@ -640,3 +640,16 @@ return 0; } + +SUPR0DECL(bool) SUPR0FpuBegin(bool fCtxHook) +{ + RT_NOREF(fCtxHook); + return false; +} + + +SUPR0DECL(void) SUPR0FpuEnd(bool fCtxHook) +{ + RT_NOREF(fCtxHook); +} + diff -Nru virtualbox-hwe-6.1.34-dfsg/src/VBox/HostDrivers/Support/linux/Makefile virtualbox-hwe-6.1.38-dfsg/src/VBox/HostDrivers/Support/linux/Makefile --- virtualbox-hwe-6.1.34-dfsg/src/VBox/HostDrivers/Support/linux/Makefile 2022-03-22 23:44:52.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/src/VBox/HostDrivers/Support/linux/Makefile 2022-09-01 13:28:17.000000000 +0000 @@ -119,7 +119,7 @@ generic/mppresent-generic.o \ generic/uuid-generic.o \ VBox/log-vbox.o -ifeq ($(BUILD_TARGET_ARCH),x86) +ifeq ($(VBOX_KBUILD_TARGET_ARCH),x86) VBOXMOD_OBJS += \ math/gcc/divdi3.o \ math/gcc/divmoddi4.o \ @@ -130,7 +130,7 @@ math/gcc/divdi3.o \ math/gcc/umoddi3.o endif -ifeq ($(BUILD_TARGET_ARCH),amd64) +ifeq ($(VBOX_KBUILD_TARGET_ARCH),amd64) VBOXMOD_OBJS += common/alloc/heapsimple.o endif ifdef VBOX_WITH_NATIVE_DTRACE diff -Nru virtualbox-hwe-6.1.34-dfsg/src/VBox/HostDrivers/Support/linux/SUPDrv-linux.c virtualbox-hwe-6.1.38-dfsg/src/VBox/HostDrivers/Support/linux/SUPDrv-linux.c --- virtualbox-hwe-6.1.34-dfsg/src/VBox/HostDrivers/Support/linux/SUPDrv-linux.c 2022-03-22 23:44:52.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/src/VBox/HostDrivers/Support/linux/SUPDrv-linux.c 2022-09-01 13:28:17.000000000 +0000 @@ -40,6 +40,7 @@ #include #include #include +#include #include #include #include @@ -1454,6 +1455,61 @@ } +SUPR0DECL(bool) SUPR0FpuBegin(bool fCtxHook) +{ + RT_NOREF(fCtxHook); +#if RTLNX_VER_MIN(4,19,0) /* Going back to 4.19.0 for better coverage, we + probably only need 5.17.7+ in the end. */ + /* + * HACK ALERT! + * + * We'd like to use the old __kernel_fpu_begin() API which was removed in + * early 2019, because we typically run with preemption enabled and have an + * preemption hook installed which will call kernel_fpu_end() in case we're + * scheduled out after getting in here. The preemption hook is almost + * useless if we run with preemption disabled. + * + * For the case where the kernel does not have preemption hooks, we get here + * with preemption already disabled and one more count doesn't make any + * difference. + * + * So, after the kernel_fpu_begin() call we undo the implicit preempt_disable() + * call it does, so the preemption hook can do its work and the VBox user has + * a more responsive system. + * + * See @bugref{10209#c12} and onwards for more details. + */ + Assert(fCtxHook || !RTThreadPreemptIsEnabled(NIL_RTTHREAD)); + kernel_fpu_begin(); +# if 0 /* Always do it for now for better test coverage. */ + if (fCtxHook) +# endif + preempt_enable(); + return false; /** @todo Not sure if we have license to use any extended state, or + * if we're limited to the SSE & x87 FPU. If it's the former, + * we should return @a true and the caller can skip + * saving+restoring the host state and save some time. */ +#else + return false; +#endif +} + + +SUPR0DECL(void) SUPR0FpuEnd(bool fCtxHook) +{ + RT_NOREF(fCtxHook); +#if RTLNX_VER_MIN(4,19,0) + /* HACK ALERT! See SUPR0FpuBegin for an explanation of this. */ + Assert(!RTThreadPreemptIsEnabled(NIL_RTTHREAD)); +# if 0 /* Always do it for now for better test coverage. */ + if (fCtxHook) +# endif + preempt_disable(); + kernel_fpu_end(); +#endif +} + + int VBOXCALL supdrvOSGetCurrentGdtRw(RTHCUINTPTR *pGdtRw) { #if RTLNX_VER_MIN(4,12,0) diff -Nru virtualbox-hwe-6.1.34-dfsg/src/VBox/HostDrivers/Support/Makefile.kmk virtualbox-hwe-6.1.38-dfsg/src/VBox/HostDrivers/Support/Makefile.kmk --- virtualbox-hwe-6.1.34-dfsg/src/VBox/HostDrivers/Support/Makefile.kmk 2022-03-22 23:44:51.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/src/VBox/HostDrivers/Support/Makefile.kmk 2022-09-01 13:28:15.000000000 +0000 @@ -100,6 +100,7 @@ SpcRootMicrosoft7=SpcRoot-MicrosoftTestingRootCertificateAuthority2010-8a334aa8052dd244a647306a76b8178fa215f344.taf \ NtRootMicrosoft8=NtRoot-MicrosoftCodeVerificationRoot-729404101f3e0ca347837fca175a8438.taf \ TimeRootMicrosoft0=Timestamp-CopyrightC1997MicrosoftCorp-01.taf \ + TimeRootOracle0=Timestamp-VBoxLegacyWinCA.taf \ TrustedCertVBox0=Trusted-OracleCorporationVirtualBox-05308b76ac2e15b29720fb4395f65f38.taf \ AppleRoot0=AppleRoot-2bd06947947609fef46b8d2e40a6f7474d7f085e.taf \ AppleRoot1=AppleRoot-G2-c499136c1803c27bc0a3a00d7f72807a1c77268d.taf @@ -123,12 +124,20 @@ '};' 'unsigned const g_cSUP$(1)TAs = RT_ELEMENTS(g_aSUP$(1)TAs);' '' '' endif +if ("$(KBUILD_TARGET)" == "win" && defined(VBOX_SIGNING_MODE)) \ + || ("$(KBUILD_TARGET)" == "darwin" && defined(VBOX_WITH_DARWIN_R0_DARWIN_IMAGE_VERIFICATION) && defined(VBOX_SIGNING_MODE)) + BLDPROGS += bldSUPSignedDummy + bldSUPSignedDummy_TEMPLATE = VBoxBldProg + bldSUPSignedDummy_SOURCES = bldSUPSignedDummy.cpp + bldSUPSignedDummy_ORDERDEPS.win = $(VBOX_SIGN_IMAGE_ORDERDEPS) + bldSUPSignedDummy_POST_CMDS.win = $(call VBOX_SIGN_IMAGE_FN,$(out),,2) + bldSUPSignedDummy_POST_CMDS.darwin = $(call VBOX_SIGN_MACHO_FN,$(out),org.virtualbox.org.bldtool.$(target)) +endif + $$(VBOX_SUP_WIN_CERTS_FILE): $(MAKEFILE_CURRENT) \ $(foreach cert,$(VBOX_SUP_WIN_CERTS),$(VBOX_PATH_SUPR3_CERTIFICATES)/$(lastword $(subst =,$(SPACE) ,$(cert)))) \ $(VBOX_BIN2C) \ - $(if-expr ("$(KBUILD_TARGET)" == "win" && defined(VBOX_WITH_HARDENING)) \ - || ("$(KBUILD_TARGET)" == "darwin" && defined(VBOX_WITH_DARWIN_R0_DARWIN_IMAGE_VERIFICATION) && defined(VBOX_SIGNING_MODE)) \ - ,$(VBOX_RTSIGNTOOL)) \ + $(if-expr defined(bldSUPSignedDummy_SOURCES),$(VBOX_RTSIGNTOOL) $$(bldSUPSignedDummy_1_TARGET),) \ | $$(dir $$@) $(QUIET)$(RM) -f -- $@ $@.cer $(QUIET)$(APPEND) -n "$@" \ @@ -140,9 +149,8 @@ "$(VBOX_PATH_SUPR3_CERTIFICATES)/$(lastword $(subst =,$(SP) ,$(cert)))" \ "$@") # The build certificate. -if ("$(KBUILD_TARGET)" == "win" && defined(VBOX_WITH_HARDENING) && defined(VBOX_SIGNING_MODE)) \ - || ("$(KBUILD_TARGET)" == "darwin" && defined(VBOX_WITH_DARWIN_R0_DARWIN_IMAGE_VERIFICATION) && defined(VBOX_SIGNING_MODE)) - $(VBOX_RTSIGNTOOL) extract-exe-signer-cert --exe $(VBOX_RTSIGNTOOL) --output "$@.cer" --der +ifdef bldSUPSignedDummy_SOURCES + $(VBOX_RTSIGNTOOL) extract-exe-signer-cert --exe "$(bldSUPSignedDummy_1_TARGET)" --output "$@.cer" --der $(VBOX_BIN2C) -ascii --append SUPBuildCert "$@.cer" $@ $(QUIET)$(RM) -f -- $@.cer endif @@ -325,6 +333,7 @@ $(VBOX_PATH_RUNTIME_SRC)/common/checksum/alt-sha1.cpp \ $(VBOX_PATH_RUNTIME_SRC)/common/checksum/alt-sha256.cpp \ $(VBOX_PATH_RUNTIME_SRC)/common/checksum/alt-sha512.cpp \ + $(VBOX_PATH_RUNTIME_SRC)/common/checksum/alt-sha3.cpp \ $(VBOX_PATH_RUNTIME_SRC)/common/checksum/md2str.cpp \ $(VBOX_PATH_RUNTIME_SRC)/common/checksum/md5str.cpp \ $(VBOX_PATH_RUNTIME_SRC)/common/checksum/sha1str.cpp \ diff -Nru virtualbox-hwe-6.1.34-dfsg/src/VBox/HostDrivers/Support/os2/SUPDrv-os2.cpp virtualbox-hwe-6.1.38-dfsg/src/VBox/HostDrivers/Support/os2/SUPDrv-os2.cpp --- virtualbox-hwe-6.1.34-dfsg/src/VBox/HostDrivers/Support/os2/SUPDrv-os2.cpp 2022-03-22 23:44:52.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/src/VBox/HostDrivers/Support/os2/SUPDrv-os2.cpp 2022-09-01 13:28:17.000000000 +0000 @@ -541,3 +541,16 @@ return 0; } + +SUPR0DECL(bool) SUPR0FpuBegin(bool fCtxHook) +{ + RT_NOREF(fCtxHook); + return false; +} + + +SUPR0DECL(void) SUPR0FpuEnd(bool fCtxHook) +{ + RT_NOREF(fCtxHook); +} + diff -Nru virtualbox-hwe-6.1.34-dfsg/src/VBox/HostDrivers/Support/solaris/SUPDrv-solaris.c virtualbox-hwe-6.1.38-dfsg/src/VBox/HostDrivers/Support/solaris/SUPDrv-solaris.c --- virtualbox-hwe-6.1.34-dfsg/src/VBox/HostDrivers/Support/solaris/SUPDrv-solaris.c 2022-03-22 23:44:52.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/src/VBox/HostDrivers/Support/solaris/SUPDrv-solaris.c 2022-09-01 13:28:17.000000000 +0000 @@ -1309,3 +1309,16 @@ return 0; } + +SUPR0DECL(bool) SUPR0FpuBegin(bool fCtxHook) +{ + RT_NOREF(fCtxHook); + return false; +} + + +SUPR0DECL(void) SUPR0FpuEnd(bool fCtxHook) +{ + RT_NOREF(fCtxHook); +} + diff -Nru virtualbox-hwe-6.1.34-dfsg/src/VBox/HostDrivers/Support/SUPDrv.cpp virtualbox-hwe-6.1.38-dfsg/src/VBox/HostDrivers/Support/SUPDrv.cpp --- virtualbox-hwe-6.1.34-dfsg/src/VBox/HostDrivers/Support/SUPDrv.cpp 2022-03-22 23:44:51.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/src/VBox/HostDrivers/Support/SUPDrv.cpp 2022-09-01 13:28:15.000000000 +0000 @@ -98,6 +98,18 @@ # endif #endif +#if defined(RT_OS_LINUX) && !defined(__NO_FORTIFY) && defined(__OPTIMIZE__) && defined(CONFIG_FORTIFY_SOURCE) +/* In Linux 5.18-rc1, memcpy became a wrapper which does fortify checks + * before triggering __underlying_memcpy() call. We do not pass these checks here, + * so bypass them for now. */ +# if RTLNX_VER_MIN(5,18,0) +# define SUPDRV_MEMCPY __underlying_memcpy +# else +# define SUPDRV_MEMCPY memcpy +# endif +#else +# define SUPDRV_MEMCPY memcpy +#endif /* * Logging assignments: @@ -266,6 +278,8 @@ SUPEXP_STK_BACK( 2, SUPR0ContFree), SUPEXP_STK_BACK( 2, SUPR0ChangeCR4), SUPEXP_STK_BACK( 1, SUPR0EnableVTx), + SUPEXP_STK_OKAY( 1, SUPR0FpuBegin), + SUPEXP_STK_OKAY( 1, SUPR0FpuEnd), SUPEXP_STK_BACK( 0, SUPR0SuspendVTxOnCpu), SUPEXP_STK_BACK( 1, SUPR0ResumeVTxOnCpu), SUPEXP_STK_OKAY( 1, SUPR0GetCurrentGdtRw), @@ -1742,7 +1756,7 @@ /* execute */ pReq->u.Out.cFunctions = RT_ELEMENTS(g_aFunctions); - memcpy(&pReq->u.Out.aFunctions[0], g_aFunctions, sizeof(g_aFunctions)); + SUPDRV_MEMCPY(&pReq->u.Out.aFunctions[0], g_aFunctions, sizeof(g_aFunctions)); pReq->Hdr.rc = VINF_SUCCESS; return 0; } diff -Nru virtualbox-hwe-6.1.34-dfsg/src/VBox/HostDrivers/Support/win/SUPDrv-win.cpp virtualbox-hwe-6.1.38-dfsg/src/VBox/HostDrivers/Support/win/SUPDrv-win.cpp --- virtualbox-hwe-6.1.34-dfsg/src/VBox/HostDrivers/Support/win/SUPDrv-win.cpp 2022-03-22 23:44:52.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/src/VBox/HostDrivers/Support/win/SUPDrv-win.cpp 2022-09-01 13:28:17.000000000 +0000 @@ -2704,6 +2704,19 @@ } +SUPR0DECL(bool) SUPR0FpuBegin(bool fCtxHook) +{ + RT_NOREF(fCtxHook); + return false; +} + + +SUPR0DECL(void) SUPR0FpuEnd(bool fCtxHook) +{ + RT_NOREF(fCtxHook); +} + + SUPR0DECL(int) SUPR0IoCtlSetupForHandle(PSUPDRVSESSION pSession, intptr_t hHandle, uint32_t fFlags, PSUPR0IOCTLCTX *ppCtx) { /* diff -Nru virtualbox-hwe-6.1.34-dfsg/src/VBox/HostDrivers/Support/win/SUPR3HardenedMain-win.cpp virtualbox-hwe-6.1.38-dfsg/src/VBox/HostDrivers/Support/win/SUPR3HardenedMain-win.cpp --- virtualbox-hwe-6.1.34-dfsg/src/VBox/HostDrivers/Support/win/SUPR3HardenedMain-win.cpp 2022-03-22 23:44:53.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/src/VBox/HostDrivers/Support/win/SUPR3HardenedMain-win.cpp 2022-09-01 13:28:18.000000000 +0000 @@ -5223,7 +5223,7 @@ supR3HardenedFatalMsg("supR3HardenedWinReSpawn", kSupInitOp_Misc, rc, "NtCreateFile(%ls) failed: VERR_SUPDRV_APIPORT_OPEN_ERROR\n" "\n" - "Error getting %s\\ApiPort in the driver from vboxdrv.\n" + "Error getting %s\\ApiPort in the driver from vboxsup.\n" "\n" "Could be due to security software is redirecting access to it, so please include full " "details of such software in a bug report. VBoxStartup.log may contain details important " @@ -5267,7 +5267,7 @@ supR3HardenedFatalMsg("supR3HardenedWinReSpawn", kSupInitOp_Driver, VERR_OPEN_FAILED, "NtCreateFile(%ls) failed: %#x%s (%u retries)\n" "\n" - "Driver is probably stuck stopping/starting. Try 'sc.exe query vboxdrv' to get more " + "Driver is probably stuck stopping/starting. Try 'sc.exe query vboxsup' to get more " "information about its state. Rebooting may actually help.%s" , s_wszName, rcNt, pszDefine, iTry, supR3HardenedWinReadErrorInfoDevice(szErrorInfo, sizeof(szErrorInfo), @@ -5276,7 +5276,7 @@ supR3HardenedFatalMsg("supR3HardenedWinReSpawn", kSupInitOp_Driver, VERR_OPEN_FAILED, "NtCreateFile(%ls) failed: %#x%s (%u retries)\n" "\n" - "Driver is does not appear to be loaded. Try 'sc.exe start vboxdrv', reinstall " + "Driver is does not appear to be loaded. Try 'sc.exe start vboxsup', reinstall " "VirtualBox or reboot.%s" , s_wszName, rcNt, pszDefine, iTry, supR3HardenedWinReadErrorInfoDevice(szErrorInfo, sizeof(szErrorInfo), @@ -5304,9 +5304,9 @@ /* * Before the 2nd respawn we set up a child protection deal with the * support driver via /Devices/VBoxDrvStub. (We tried to do this - * during the early init, but in case we had trouble accessing vboxdrv we - * retry it here where we have kernel32.dll and others to pull in for - * better diagnostics.) + * during the early init, but in case we had trouble accessing vboxdrv + * (renamed to vboxsup in 7.0 and 6.1.34) we retry it here where we + * have kernel32.dll and others to pull in for better diagnostics.) */ if (iWhich == 2) supR3HardenedWinOpenStubDevice(); @@ -6785,9 +6785,9 @@ * to opening the driver from SUPR3HardenedMain. It also avoids issues with so * call protection software that is in the habit of patching half of the ntdll * and kernel32 APIs in the process, making it almost indistinguishable from - * software that is up to no good. Once we've opened vboxdrv, the process - * should be locked down so thighly that only kernel software and csrss can mess - * with the process. + * software that is up to no good. Once we've opened vboxdrv (renamed to + * vboxsup in 7.0 and 6.1.34), the process should be locked down so tightly + * that only kernel software and csrss can mess with the process. */ DECLASM(uintptr_t) supR3HardenedEarlyProcessInit(void) { @@ -6928,13 +6928,13 @@ */ if (cArgs >= 1 && suplibHardenedStrCmp(papszArgs[0], SUPR3_RESPAWN_1_ARG0) == 0) { - SUP_DPRINTF(("supR3HardenedVmProcessInit: Opening vboxdrv stub...\n")); + SUP_DPRINTF(("supR3HardenedVmProcessInit: Opening vboxsup stub...\n")); supR3HardenedWinOpenStubDevice(); g_enmSupR3HardenedMainState = SUPR3HARDENEDMAINSTATE_WIN_EARLY_STUB_DEVICE_OPENED; } else if (cArgs >= 1 && suplibHardenedStrCmp(papszArgs[0], SUPR3_RESPAWN_2_ARG0) == 0) { - SUP_DPRINTF(("supR3HardenedVmProcessInit: Opening vboxdrv...\n")); + SUP_DPRINTF(("supR3HardenedVmProcessInit: Opening vboxsup...\n")); supR3HardenedMainOpenDevice(); g_enmSupR3HardenedMainState = SUPR3HARDENEDMAINSTATE_WIN_EARLY_REAL_DEVICE_OPENED; } diff -Nru virtualbox-hwe-6.1.34-dfsg/src/VBox/HostDrivers/VBoxNetAdp/linux/Makefile virtualbox-hwe-6.1.38-dfsg/src/VBox/HostDrivers/VBoxNetAdp/linux/Makefile --- virtualbox-hwe-6.1.34-dfsg/src/VBox/HostDrivers/VBoxNetAdp/linux/Makefile 2022-03-22 23:44:53.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/src/VBox/HostDrivers/VBoxNetAdp/linux/Makefile 2022-09-01 13:28:18.000000000 +0000 @@ -39,7 +39,7 @@ VBOXMOD_OBJS = \ linux/VBoxNetAdp-linux.o \ VBoxNetAdp.o -ifeq ($(BUILD_TARGET_ARCH),x86) +ifeq ($(VBOX_KBUILD_TARGET_ARCH),x86) VBOXMOD_OBJS += \ math/gcc/divdi3.o \ math/gcc/moddi3.o \ diff -Nru virtualbox-hwe-6.1.34-dfsg/src/VBox/HostDrivers/VBoxNetFlt/linux/Makefile virtualbox-hwe-6.1.38-dfsg/src/VBox/HostDrivers/VBoxNetFlt/linux/Makefile --- virtualbox-hwe-6.1.34-dfsg/src/VBox/HostDrivers/VBoxNetFlt/linux/Makefile 2022-03-22 23:44:54.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/src/VBox/HostDrivers/VBoxNetFlt/linux/Makefile 2022-09-01 13:28:18.000000000 +0000 @@ -42,7 +42,7 @@ SUPR0IdcClient.o \ SUPR0IdcClientComponent.o \ linux/SUPR0IdcClient-linux.o -ifeq ($(BUILD_TARGET_ARCH),x86) +ifeq ($(VBOX_KBUILD_TARGET_ARCH),x86) VBOXMOD_OBJS += \ math/gcc/divdi3.o \ math/gcc/moddi3.o \ diff -Nru virtualbox-hwe-6.1.34-dfsg/src/VBox/HostDrivers/VBoxNetFlt/linux/VBoxNetFlt-linux.c virtualbox-hwe-6.1.38-dfsg/src/VBox/HostDrivers/VBoxNetFlt/linux/VBoxNetFlt-linux.c --- virtualbox-hwe-6.1.34-dfsg/src/VBox/HostDrivers/VBoxNetFlt/linux/VBoxNetFlt-linux.c 2022-03-22 23:44:54.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/src/VBox/HostDrivers/VBoxNetFlt/linux/VBoxNetFlt-linux.c 2022-09-01 13:28:18.000000000 +0000 @@ -2311,7 +2311,13 @@ vboxNetFltDumpPacket(pSG, true, "host", (fDst & INTNETTRUNKDIR_WIRE) ? 0 : 1); Log6(("vboxNetFltPortOsXmit: pBuf->cb dump:\n%.*Rhxd\n", sizeof(pBuf->cb), pBuf->cb)); Log6(("vboxNetFltPortOsXmit: netif_rx_ni(%p)\n", pBuf)); +#if RTLNX_VER_MIN(5,18,0) + local_bh_disable(); + err = netif_rx(pBuf); + local_bh_enable(); +#else err = netif_rx_ni(pBuf); +#endif if (err) rc = RTErrConvertFromErrno(err); } diff -Nru virtualbox-hwe-6.1.34-dfsg/src/VBox/HostDrivers/VBoxPci/linux/Makefile virtualbox-hwe-6.1.38-dfsg/src/VBox/HostDrivers/VBoxPci/linux/Makefile --- virtualbox-hwe-6.1.34-dfsg/src/VBox/HostDrivers/VBoxPci/linux/Makefile 2022-03-22 23:44:54.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/src/VBox/HostDrivers/VBoxPci/linux/Makefile 2022-09-01 13:28:19.000000000 +0000 @@ -44,7 +44,7 @@ SUPR0IdcClient.o \ SUPR0IdcClientComponent.o \ linux/SUPR0IdcClient-linux.o -ifeq ($(BUILD_TARGET_ARCH),x86) +ifeq ($(VBOX_KBUILD_TARGET_ARCH),x86) VBOXMOD_OBJS += \ math/gcc/divdi3.o \ math/gcc/moddi3.o \ diff -Nru virtualbox-hwe-6.1.34-dfsg/src/VBox/HostServices/SharedFolders/VBoxSharedFoldersSvc.cpp virtualbox-hwe-6.1.38-dfsg/src/VBox/HostServices/SharedFolders/VBoxSharedFoldersSvc.cpp --- virtualbox-hwe-6.1.34-dfsg/src/VBox/HostServices/SharedFolders/VBoxSharedFoldersSvc.cpp 2022-03-22 23:44:57.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/src/VBox/HostServices/SharedFolders/VBoxSharedFoldersSvc.cpp 2022-09-01 13:28:22.000000000 +0000 @@ -178,10 +178,17 @@ static DECLCALLBACK(int) svcDisconnect (void *, uint32_t u32ClientID, void *pvClient) { RT_NOREF1(u32ClientID); - int rc = VINF_SUCCESS; SHFLCLIENTDATA *pClient = (SHFLCLIENTDATA *)pvClient; - Log(("SharedFolders host service: disconnected, u32ClientID = %u\n", u32ClientID)); + /* When a client disconnects, make sure that outstanding change waits are being canceled. + * + * Usually this will be done actively by VBoxService on the guest side when shutting down, + * but the VM could be reset without having VBoxService the chance of cancelling those waits. + * + * This in turn will eat up the call completion handle restrictions on the HGCM host side, throwing assertions. */ + int rc = vbsfMappingsCancelChangesWaits(pClient); + + Log(("SharedFolders host service: disconnected, u32ClientID = %u, rc = %Rrc\n", u32ClientID, rc)); vbsfDisconnect(pClient); return rc; diff -Nru virtualbox-hwe-6.1.34-dfsg/src/VBox/ImageMounter/vboximg-mount/vboximg-mount.cpp virtualbox-hwe-6.1.38-dfsg/src/VBox/ImageMounter/vboximg-mount/vboximg-mount.cpp --- virtualbox-hwe-6.1.34-dfsg/src/VBox/ImageMounter/vboximg-mount/vboximg-mount.cpp 2022-03-22 23:44:58.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/src/VBox/ImageMounter/vboximg-mount/vboximg-mount.cpp 2022-09-01 13:28:23.000000000 +0000 @@ -1273,7 +1273,7 @@ rc = VDOpen(pVDisk, pszFormat, CSTR(pCurMedium->pImagePath), - pCurMedium->fWriteable, + pCurMedium->fWriteable ? 0 : VD_OPEN_FLAGS_READONLY, g_pVdIfs); if (RT_FAILURE(rc)) diff -Nru virtualbox-hwe-6.1.34-dfsg/src/VBox/Installer/linux/distributions_deb virtualbox-hwe-6.1.38-dfsg/src/VBox/Installer/linux/distributions_deb --- virtualbox-hwe-6.1.34-dfsg/src/VBox/Installer/linux/distributions_deb 2022-03-22 23:44:59.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/src/VBox/Installer/linux/distributions_deb 2022-09-01 13:28:24.000000000 +0000 @@ -4,6 +4,7 @@ _Debian_jessie = DEBIAN_8_0 _Debian_wheezy = DEBIAN_7_0 _Debian_squeeze = DEBIAN_6_0 +_Ubuntu_jammy = UBUNTU_22_04 _Ubuntu_eoan = UBUNTU_19_10 _Ubuntu_bionic = UBUNTU_18_04 _Ubuntu_xenial = UBUNTU_16_04 diff -Nru virtualbox-hwe-6.1.34-dfsg/src/VBox/Installer/linux/distributions_rpm virtualbox-hwe-6.1.38-dfsg/src/VBox/Installer/linux/distributions_rpm --- virtualbox-hwe-6.1.34-dfsg/src/VBox/Installer/linux/distributions_rpm 2022-03-22 23:44:59.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/src/VBox/Installer/linux/distributions_rpm 2022-09-01 13:28:24.000000000 +0000 @@ -1,4 +1,5 @@ openSUSETW = OPENSUSE_TW +openSUSE153 = OPENSUSE_15_3 openSUSE150 = OPENSUSE_15_0 openSUSE132 = OPENSUSE_13_2 openSUSE131 = OPENSUSE_13_1 @@ -8,6 +9,8 @@ sles11.0 = SLES_11_0 sles10.1 = SLES_10_1 mdv2011.0 = MANDRIVA_2011_0 +fedora36 = FEDORA_36 +fedora35 = FEDORA_35 fedora33 = FEDORA_33 fedora32 = FEDORA_32 fedora31 = FEDORA_31 @@ -23,6 +26,7 @@ fedora17 = FEDORA_17 fedora16 = FEDORA_16 fedora15 = FEDORA_15 +el9 = EL_9 el8 = EL_8 el7 = EL_7 el6 = EL_6 diff -Nru virtualbox-hwe-6.1.34-dfsg/src/VBox/Installer/linux/install.sh virtualbox-hwe-6.1.38-dfsg/src/VBox/Installer/linux/install.sh --- virtualbox-hwe-6.1.34-dfsg/src/VBox/Installer/linux/install.sh 2022-03-22 23:44:59.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/src/VBox/Installer/linux/install.sh 2022-09-01 13:28:24.000000000 +0000 @@ -35,7 +35,7 @@ HARDENED="_HARDENED_" # The "BUILD_" prefixes prevent the variables from being overwritten when we # read the configuration from the previous installation. -BUILD_BUILDTYPE="_BUILDTYPE_" +BUILD_VBOX_KBUILD_TYPE="_BUILDTYPE_" BUILD_USERNAME="_USERNAME_" CONFIG_DIR="/etc/vbox" CONFIG="vbox.cfg" @@ -307,7 +307,7 @@ echo "INSTALL_VER='$VERSION'" >> $CONFIG_DIR/$CONFIG echo "INSTALL_REV='$SVNREV'" >> $CONFIG_DIR/$CONFIG echo "# Build type and user name for logging purposes" >> $CONFIG_DIR/$CONFIG - echo "BUILD_TYPE='$BUILD_BUILDTYPE'" >> $CONFIG_DIR/$CONFIG + echo "VBOX_KBUILD_TYPE='$BUILD_VBOX_KBUILD_TYPE'" >> $CONFIG_DIR/$CONFIG echo "USERNAME='$BUILD_USERNAME'" >> $CONFIG_DIR/$CONFIG # Create users group diff -Nru virtualbox-hwe-6.1.34-dfsg/src/VBox/Installer/linux/Makefile-footer.gmk virtualbox-hwe-6.1.38-dfsg/src/VBox/Installer/linux/Makefile-footer.gmk --- virtualbox-hwe-6.1.34-dfsg/src/VBox/Installer/linux/Makefile-footer.gmk 2022-03-22 23:44:59.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/src/VBox/Installer/linux/Makefile-footer.gmk 2022-09-01 13:28:24.000000000 +0000 @@ -26,13 +26,13 @@ # Compiler options # VBOXMOD_0_KFLAGS := -D__KERNEL__ -DMODULE -DRT_WITHOUT_PRAGMA_ONCE $(addprefix -D,$(VBOXMOD_DEFS)) -ifeq ($(BUILD_TARGET_ARCH),amd64) +ifeq ($(VBOX_KBUILD_TARGET_ARCH),amd64) VBOXMOD_0_KFLAGS += -DRT_ARCH_AMD64 else VBOXMOD_0_KFLAGS += -DRT_ARCH_X86 endif -ifeq ($(BUILD_TYPE),debug) +ifeq ($(VBOX_KBUILD_TYPE),debug) # The -Wno-array-bounds is because of a bug in gcc 4.something, see # https://sourceware.org/bugzilla/show_bug.cgi?id=10001 VBOXMOD_0_KFLAGS += -DDEBUG -DDEBUG_$(subst $(subst _, ,_),_,$(USERNAME)) -DDEBUG_USERNAME=$(subst $(subst _, ,_),_,$(USERNAME)) @@ -52,7 +52,7 @@ # VBOXMOD_EXT := o - ifeq ($(BUILD_TARGET_ARCH),amd64) + ifeq ($(VBOX_KBUILD_TARGET_ARCH),amd64) VBOXMOD_0_KFLAGS += -mcmodel=kernel endif ifeq ($(KERN_VERSION),24) diff -Nru virtualbox-hwe-6.1.34-dfsg/src/VBox/Installer/linux/Makefile-header.gmk virtualbox-hwe-6.1.38-dfsg/src/VBox/Installer/linux/Makefile-header.gmk --- virtualbox-hwe-6.1.34-dfsg/src/VBox/Installer/linux/Makefile-header.gmk 2022-03-22 23:44:59.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/src/VBox/Installer/linux/Makefile-header.gmk 2022-09-01 13:28:24.000000000 +0000 @@ -36,53 +36,100 @@ # VBOXMOD_CFLAGS = # include $(obj)/Makefile-footer.gmk # -# The kmk kBuild define KBUILD_TARGET_ARCH is available. +# To avoid potential confusion between kmk/kBuild and linux/kbuild, +# we use VBOX_KBUILD_TARGET_ARCH instead of KBUILD_TARGET_ARCH and +# VBOX_KBUILD_TYPE instead of KBUILD_TYPE. The VBOX_KBUILD_ variable +# variant takes percedence over the kmk/kBuild ones. # # # First, figure out which architecture we're targeting and the build type. # (We have to support basic cross building (ARCH=i386|x86_64).) -# While at it, warn about BUILD_* vars found to help with user problems. +# While at it, warn about *BUILD_* vars found to help with user problems. # + +# VBOX_KBUILD_TARGET_ARCH = amd64|x86 ifeq ($(filter-out x86_64 amd64 AMD64,$(shell uname -m)),) - BUILD_TARGET_ARCH_DEF := amd64 + VBOX_KBUILD_TARGET_ARCH_DEFAULT := amd64 else - BUILD_TARGET_ARCH_DEF := x86 + VBOX_KBUILD_TARGET_ARCH_DEFAULT := x86 endif -ifneq ($(filter-out amd64 x86,$(BUILD_TARGET_ARCH)),) - $(warning Ignoring unknown BUILD_TARGET_ARCH value '$(BUILD_TARGET_ARCH)'.) - BUILD_TARGET_ARCH := +ifdef VBOX_KBUILD_TARGET_ARCH + ifneq ($(filter-out amd64 x86,$(VBOX_KBUILD_TARGET_ARCH)),) + $(warning Ignoring unknown VBOX_KBUILD_TARGET_ARCH value '$(VBOX_KBUILD_TARGET_ARCH)'.) + VBOX_KBUILD_TARGET_ARCH := + endif +else + ifdef KBUILD_TARGET_ARCH + ifneq ($(filter-out amd64 x86,$(KBUILD_TARGET_ARCH)),) + $(warning Ignoring unknown KBUILD_TARGET_ARCH value '$(KBUILD_TARGET_ARCH)'.) + VBOX_KBUILD_TARGET_ARCH := + endif + else + ifdef BUILD_TARGET_ARCH + $(warning BUILD_TARGET_ARCH is deprecated, use VBOX_KBUILD_TARGET_ARCH instead.) + ifneq ($(filter-out amd64 x86,$(BUILD_TARGET_ARCH)),) + $(warning Ignoring unknown BUILD_TARGET_ARCH value '$(BUILD_TARGET_ARCH)'.) + VBOX_KBUILD_TARGET_ARCH := + endif + endif + endif endif -ifeq ($(BUILD_TARGET_ARCH),) +ifeq ($(VBOX_KBUILD_TARGET_ARCH),) ifeq ($(ARCH),x86_64) - BUILD_TARGET_ARCH := amd64 + VBOX_KBUILD_TARGET_ARCH := amd64 else ifeq ($(ARCH),i386) - BUILD_TARGET_ARCH := x86 + VBOX_KBUILD_TARGET_ARCH := x86 else - BUILD_TARGET_ARCH := $(BUILD_TARGET_ARCH_DEF) + VBOX_KBUILD_TARGET_ARCH := $(VBOX_KBUILD_TARGET_ARCH_DEFAULT) endif endif else - ifneq ($(BUILD_TARGET_ARCH),$(BUILD_TARGET_ARCH_DEF)) - $(warning Using BUILD_TARGET_ARCH='$(BUILD_TARGET_ARCH)' from the $(origin BUILD_TARGET_ARCH).) + ifneq ($(VBOX_KBUILD_TARGET_ARCH),$(VBOX_KBUILD_TARGET_ARCH_DEFAULT)) + $(warning Using VBOX_KBUILD_TARGET_ARCH='$(VBOX_KBUILD_TARGET_ARCH)' from the $(origin VBOX_KBUILD_TARGET_ARCH).) endif endif -ifneq ($(filter-out release profile debug strict,$(BUILD_TYPE)),) - $(warning Ignoring unknown BUILD_TYPE value '$(BUILD_TYPE)'.) - BUILD_TYPE := +# VBOX_KBUILD_TYPE = release|debug|profile|strict +ifdef VBOX_KBUILD_TYPE + VBOX_KBUILD_TYPE_VAR := VBOX_KBUILD_TYPE + ifneq ($(filter-out release profile debug strict,$(VBOX_KBUILD_TYPE)),) + $(warning Ignoring unknown VBOX_KBUILD_TYPE value '$(VBOX_KBUILD_TYPE)'.) + VBOX_KBUILD_TYPE := + endif +else + ifdef KBUILD_TYPE + VBOX_KBUILD_TYPE_VAR := KBUILD_TYPE + VBOX_KBUILD_TYPE := $(KBUILD_TYPE) + ifneq ($(filter-out release profile debug strict,$(KBUILD_TYPE)),) + $(warning Ignoring unknown KBUILD_TYPE value '$(KBUILD_TYPE)'.) + VBOX_KBUILD_TYPE := + endif + else + ifdef BUILD_TYPE + $(warning BUILD_TYPE is deprecated, use VBOX_KBUILD_TYPE instead.) + VBOX_KBUILD_TYPE_VAR := BUILD_TYPE + VBOX_KBUILD_TYPE := $(BUILD_TYPE) + ifneq ($(filter-out release profile debug strict,$(BUILD_TYPE)),) + $(warning Ignoring unknown BUILD_TYPE value '$(BUILD_TYPE)'.) + VBOX_KBUILD_TYPE := + endif + endif + endif endif -ifeq ($(BUILD_TYPE),) - BUILD_TYPE := release +ifeq ($(VBOX_KBUILD_TYPE),) + VBOX_KBUILD_TYPE_VAR = VBOX_KBUILD_TYPE + VBOX_KBUILD_TYPE := release else - ifneq ($(BUILD_TYPE),release) + ifneq ($(VBOX_KBUILD_TYPE),release) ifndef VBOX_KERN_QUIET - $(warning Using BUILD_TYPE='$(BUILD_TYPE)' from the $(origin BUILD_TYPE).) + $(warning Using VBOX_KBUILD_TYPE='$(VBOX_KBUILD_TYPE)' from the $(origin $(VBOX_KBUILD_TYPE_VAR)) ($(VBOX_KBUILD_TYPE_VAR)).) endif endif endif + ifeq ($(USERNAME),) USERNAME := noname endif diff -Nru virtualbox-hwe-6.1.34-dfsg/src/VBox/Installer/linux/routines.sh virtualbox-hwe-6.1.38-dfsg/src/VBox/Installer/linux/routines.sh --- virtualbox-hwe-6.1.34-dfsg/src/VBox/Installer/linux/routines.sh 2022-03-22 23:44:59.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/src/VBox/Installer/linux/routines.sh 2022-09-01 13:28:24.000000000 +0000 @@ -176,9 +176,12 @@ EOF } +# Checks if systemd is the init system of choice use_systemd() { - test ! -f /sbin/init || test -L /sbin/init + # First condition is what halfway recent systemd uses itself, and the + # other two checks should cover everything back to v1. + test -e /run/systemd/system || test -e /sys/fs/cgroup/systemd || test -e /cgroup/systemd } ## Installs a file containing a shell script as an init script. Call diff -Nru virtualbox-hwe-6.1.34-dfsg/src/VBox/Installer/linux/rpm/rules virtualbox-hwe-6.1.38-dfsg/src/VBox/Installer/linux/rpm/rules --- virtualbox-hwe-6.1.34-dfsg/src/VBox/Installer/linux/rpm/rules 2022-03-22 23:44:59.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/src/VBox/Installer/linux/rpm/rules 2022-09-01 13:28:24.000000000 +0000 @@ -114,10 +114,10 @@ $(error Cannot detect package distribution (rpmrel=$(rpmrel))) endif - ifeq ($(filter-out el5 el6 el7 el8 fedora18 fedora19 fedora20 fedora21 fedora22 fedora24 fedora25 fedora26 fedora29 fedora31 fedora32 fedora33,$(rpmrel)),) + ifeq ($(filter-out el5 el6 el7 el8 el9 fedora18 fedora19 fedora20 fedora21 fedora22 fedora24 fedora25 fedora26 fedora29 fedora31 fedora32 fedora33 fedora35 fedora36,$(rpmrel)),) rpmspec := rpm_redhat endif - ifeq ($(filter-out openSUSE110 openSUSE111 openSUSE112 openSUSE113 openSUSE114 openSUSE123 openSUSE131 openSUSE132 openSUSE150 openSUSETW,$(rpmrel)),) + ifeq ($(filter-out openSUSE110 openSUSE111 openSUSE112 openSUSE113 openSUSE114 openSUSE123 openSUSE131 openSUSE132 openSUSE150 openSUSE153 openSUSETW,$(rpmrel)),) rpmspec := rpm_suse endif ifeq ($(rpmspec),) diff -Nru virtualbox-hwe-6.1.34-dfsg/src/VBox/Installer/linux/vboxdrv.sh virtualbox-hwe-6.1.38-dfsg/src/VBox/Installer/linux/vboxdrv.sh --- virtualbox-hwe-6.1.34-dfsg/src/VBox/Installer/linux/vboxdrv.sh 2022-03-22 23:44:59.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/src/VBox/Installer/linux/vboxdrv.sh 2022-09-01 13:28:24.000000000 +0000 @@ -57,7 +57,7 @@ } [ -f /etc/vbox/vbox.cfg ] && . /etc/vbox/vbox.cfg -export BUILD_TYPE +export VBOX_KBUILD_TYPE export USERNAME export USER=$USERNAME @@ -531,6 +531,17 @@ { begin_msg "Building VirtualBox kernel modules" console log "Building the main VirtualBox module." + + # Detect if kernel was built with clang. + unset LLVM + vbox_cc_is_clang=$(/lib/modules/"$KERN_VER"/build/scripts/config \ + --file /lib/modules/"$KERN_VER"/build/.config \ + --state CONFIG_CC_IS_CLANG 2>/dev/null) + if test "${vbox_cc_is_clang}" = "y"; then + log "Using clang compiler." + export LLVM=1 + fi + if ! myerr=`$BUILDINTMP \ --save-module-symvers /tmp/vboxdrv-Module.symvers \ --module-source "$MODULE_SRC/vboxdrv" \ diff -Nru virtualbox-hwe-6.1.34-dfsg/src/VBox/Installer/win/CommonProperties.wxi virtualbox-hwe-6.1.38-dfsg/src/VBox/Installer/win/CommonProperties.wxi --- virtualbox-hwe-6.1.34-dfsg/src/VBox/Installer/win/CommonProperties.wxi 2022-03-22 23:45:00.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/src/VBox/Installer/win/CommonProperties.wxi 2022-09-01 13:28:25.000000000 +0000 @@ -13,21 +13,8 @@ hope that it will be useful, but WITHOUT ANY WARRANTY of any kind. --> - - - - - - - - diff -Nru virtualbox-hwe-6.1.34-dfsg/src/VBox/Installer/win/Defines.wxi virtualbox-hwe-6.1.38-dfsg/src/VBox/Installer/win/Defines.wxi --- virtualbox-hwe-6.1.34-dfsg/src/VBox/Installer/win/Defines.wxi 2022-03-22 23:45:00.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/src/VBox/Installer/win/Defines.wxi 2022-09-01 13:28:25.000000000 +0000 @@ -13,7 +13,7 @@ hope that it will be useful, but WITHOUT ANY WARRANTY of any kind. --> - diff -Nru virtualbox-hwe-6.1.34-dfsg/src/VBox/Installer/win/InstallHelper/VBoxInstallHelper.cpp virtualbox-hwe-6.1.38-dfsg/src/VBox/Installer/win/InstallHelper/VBoxInstallHelper.cpp --- virtualbox-hwe-6.1.34-dfsg/src/VBox/Installer/win/InstallHelper/VBoxInstallHelper.cpp 2022-03-22 23:45:00.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/src/VBox/Installer/win/InstallHelper/VBoxInstallHelper.cpp 2022-09-01 13:28:25.000000000 +0000 @@ -186,6 +186,48 @@ return rc; } +/** + * Checks if the running OS is (at least) Windows 10 (e.g. >= build 10000). + * + * Called from the MSI installer as custom action. + * + * @returns Always ERROR_SUCCESS. + * Sets public property VBOX_IS_WINDOWS_10 to "" (empty / false) or "1" (success). + * + * @param hModule Windows installer module handle. + */ +UINT __stdcall IsWindows10(MSIHANDLE hModule) +{ + /* + * Note: We cannot use RtlGetVersion() / GetVersionExW() here, as the Windows Installer service + * all shims this, unfortunately. So we have to go another route by querying the major version + * number from the registry. + */ + HKEY hKeyCurVer = NULL; + LSTATUS dwErr = RegOpenKeyExW(HKEY_LOCAL_MACHINE, L"SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion", 0, KEY_READ, &hKeyCurVer); + if (dwErr == ERROR_SUCCESS) + { + DWORD dwVal = 0; + DWORD cbVal = sizeof(dwVal); + DWORD dwValueType = REG_DWORD; + dwErr = RegQueryValueExW(hKeyCurVer, L"CurrentMajorVersionNumber", NULL, &dwValueType, (LPBYTE)&dwVal, &cbVal); + if (dwErr == ERROR_SUCCESS) + { + logStringW(hModule, L"IsWindows10/CurrentMajorVersionNumber: %ld", dwVal); + + VBoxSetProperty(hModule, L"VBOX_IS_WINDOWS_10", dwVal >= 10 ? L"1" : L""); + } + else + logStringW(hModule, L"IsWindows10/RegOpenKeyExW: Error reading CurrentMajorVersionNumber (%ld)", dwErr); + + RegCloseKey(hKeyCurVer); + } + else + logStringW(hModule, L"IsWindows10/RegOpenKeyExW: Error opening CurrentVersion key (%ld)", dwErr); + + return ERROR_SUCCESS; /* Never return failure. */ +} + UINT __stdcall InstallPythonAPI(MSIHANDLE hModule) { logStringW(hModule, L"InstallPythonAPI: Checking for installed Python environment ..."); diff -Nru virtualbox-hwe-6.1.34-dfsg/src/VBox/Installer/win/InstallHelper/VBoxInstallHelper.def virtualbox-hwe-6.1.38-dfsg/src/VBox/Installer/win/InstallHelper/VBoxInstallHelper.def --- virtualbox-hwe-6.1.34-dfsg/src/VBox/Installer/win/InstallHelper/VBoxInstallHelper.def 2022-03-22 23:45:00.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/src/VBox/Installer/win/InstallHelper/VBoxInstallHelper.def 2022-09-01 13:28:25.000000000 +0000 @@ -19,13 +19,14 @@ EXPORTS IsSerialCheckNeeded CheckSerial + IsWindows10 InstallPythonAPI InstallBranding UninstallBranding InstallNetFlt UninstallNetFlt - UninstallNetAdp - InstallNetLwf + UninstallNetAdp + InstallNetLwf UninstallNetLwf UninstallTAPInstances UninstallVBoxDrv diff -Nru virtualbox-hwe-6.1.34-dfsg/src/VBox/Installer/win/Makefile.kmk virtualbox-hwe-6.1.38-dfsg/src/VBox/Installer/win/Makefile.kmk --- virtualbox-hwe-6.1.34-dfsg/src/VBox/Installer/win/Makefile.kmk 2022-03-22 23:45:00.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/src/VBox/Installer/win/Makefile.kmk 2022-09-01 13:28:25.000000000 +0000 @@ -40,6 +40,15 @@ # This leaves out most of the optional stuff to make compilation / linking much # faster for development cycles. Tweak to your likings if needed. # +# Note! Rather hacky approach -- this *only* works when 'packing' is executed +# directly in the VBox\Installer directory; otherwise with WILL break the +# build mostly likely, as we mess with dependencies between components. +# +# A better appraoch would be to define separate packing defines for dependencies +# to decouple the building process from the packing more in such a scenario. +# +# Use with care! +# ifdef VBOX_INSTALLER_QUICK VBOX_INSTALLER_LANGUAGES := en_US VBOX_WITH_ADDITIONS_PACKING := diff -Nru virtualbox-hwe-6.1.34-dfsg/src/VBox/Installer/win/Permissions.wxi virtualbox-hwe-6.1.38-dfsg/src/VBox/Installer/win/Permissions.wxi --- virtualbox-hwe-6.1.34-dfsg/src/VBox/Installer/win/Permissions.wxi 2022-03-22 23:45:00.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/src/VBox/Installer/win/Permissions.wxi 2022-09-01 13:28:25.000000000 +0000 @@ -12,7 +12,7 @@ hope that it will be useful, but WITHOUT ANY WARRANTY of any kind. --> - diff -Nru virtualbox-hwe-6.1.34-dfsg/src/VBox/Installer/win/PublicProperties.wxi virtualbox-hwe-6.1.38-dfsg/src/VBox/Installer/win/PublicProperties.wxi --- virtualbox-hwe-6.1.34-dfsg/src/VBox/Installer/win/PublicProperties.wxi 2022-03-22 23:45:00.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/src/VBox/Installer/win/PublicProperties.wxi 2022-09-01 13:28:25.000000000 +0000 @@ -13,7 +13,7 @@ hope that it will be useful, but WITHOUT ANY WARRANTY of any kind. --> - + + 1 @@ -607,6 +609,8 @@ !(loc.ExitDlg_ClickFinish) + + - - - - - - - - - - - - - + + + + diff -Nru virtualbox-hwe-6.1.34-dfsg/src/VBox/Main/idl/VirtualBox.xidl virtualbox-hwe-6.1.38-dfsg/src/VBox/Main/idl/VirtualBox.xidl --- virtualbox-hwe-6.1.34-dfsg/src/VBox/Main/idl/VirtualBox.xidl 2022-03-22 23:45:02.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/src/VBox/Main/idl/VirtualBox.xidl 2022-09-01 13:28:27.000000000 +0000 @@ -3956,7 +3956,7 @@ Used with to describe the type of a configuration value. @@ -4025,6 +4025,7 @@ + aStorageController, settings::StorageController &data); @@ -1552,6 +1553,7 @@ const settings::Hardware &hardware, const settings::Debugging *pDbg, const settings::Autostart *pAutostart, + const settings::RecordingSettings &recording, IN_GUID aSnapshotId, const Utf8Str &aStateFilePath); void uninit(); diff -Nru virtualbox-hwe-6.1.34-dfsg/src/VBox/Main/include/ovfreader.h virtualbox-hwe-6.1.38-dfsg/src/VBox/Main/include/ovfreader.h --- virtualbox-hwe-6.1.34-dfsg/src/VBox/Main/include/ovfreader.h 2022-03-22 23:45:04.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/src/VBox/Main/include/ovfreader.h 2022-09-01 13:28:30.000000000 +0000 @@ -534,8 +534,8 @@ { uint32_t idController; // instance ID (Item/InstanceId); this gets referenced from VirtualDisk - enum ControllerSystemType { IDE, SATA, SCSI }; - ControllerSystemType system; // one of IDE, SATA, SCSI + enum ControllerSystemType { IDE, SATA, SCSI, VIRTIOSCSI }; + ControllerSystemType system; // one of IDE, SATA, SCSI, VIRTIOSCSI RTCString strControllerType; // controller subtype (Item/ResourceSubType); e.g. "LsiLogic"; can be empty (esp. for IDE) diff -Nru virtualbox-hwe-6.1.34-dfsg/src/VBox/Main/include/RecordingScreenSettingsImpl.h virtualbox-hwe-6.1.38-dfsg/src/VBox/Main/include/RecordingScreenSettingsImpl.h --- virtualbox-hwe-6.1.34-dfsg/src/VBox/Main/include/RecordingScreenSettingsImpl.h 2022-03-22 23:45:04.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/src/VBox/Main/include/RecordingScreenSettingsImpl.h 2022-09-01 13:28:29.000000000 +0000 @@ -46,7 +46,22 @@ HRESULT init(RecordingSettings *aParent, uint32_t uScreenId, const settings::RecordingScreenSettings& aThat); HRESULT init(RecordingSettings *aParent, RecordingScreenSettings *aThat); HRESULT initCopy(RecordingSettings *aParent, RecordingScreenSettings *aThat); - void uninit(); + void uninit(void); + + // public methods only for internal purposes + HRESULT i_loadSettings(const settings::RecordingScreenSettings &data); + HRESULT i_saveSettings(settings::RecordingScreenSettings &data); + + void i_rollback(void); + void i_commit(void); + void i_copyFrom(RecordingScreenSettings *aThat); + void i_applyDefaults(void); + + settings::RecordingScreenSettings &i_getData(void); + + int32_t i_reference(void); + int32_t i_release(void); + int32_t i_getReferences(void); private: diff -Nru virtualbox-hwe-6.1.34-dfsg/src/VBox/Main/include/RecordingSettingsImpl.h virtualbox-hwe-6.1.38-dfsg/src/VBox/Main/include/RecordingSettingsImpl.h --- virtualbox-hwe-6.1.34-dfsg/src/VBox/Main/include/RecordingSettingsImpl.h 2022-03-22 23:45:04.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/src/VBox/Main/include/RecordingSettingsImpl.h 2022-09-01 13:28:29.000000000 +0000 @@ -51,25 +51,26 @@ HRESULT i_loadSettings(const settings::RecordingSettings &data); HRESULT i_saveSettings(settings::RecordingSettings &data); - void i_rollback(); - void i_commit(); - void i_copyFrom(RecordingSettings *aThat); - void i_applyDefaults(void); + void i_rollback(void); + void i_commit(void); + HRESULT i_copyFrom(RecordingSettings *aThat); + void i_applyDefaults(void); - int i_getDefaultFilename(Utf8Str &strFile, bool fWithFileExtension); + int i_getDefaultFilename(Utf8Str &strFile, uint32_t idScreen, bool fWithFileExtension); + int i_getFilename(Utf8Str &strFile, uint32_t idScreen, const Utf8Str &strTemplate); bool i_canChangeSettings(void); void i_onSettingsChanged(void); private: /** Map of screen settings objects. The key specifies the screen ID. */ - typedef std::map > RecordScreenSettingsMap; + typedef std::map > RecordingScreenSettingsObjMap; void i_reset(void); - int i_syncToMachineDisplays(uint32_t cMonitors); - int i_createScreenObj(RecordScreenSettingsMap &screenSettingsMap, uint32_t uScreenId, const settings::RecordingScreenSettings &data); - int i_destroyScreenObj(RecordScreenSettingsMap &screenSettingsMap, uint32_t uScreenId); - int i_destroyAllScreenObj(RecordScreenSettingsMap &screenSettingsMap); + int i_syncToMachineDisplays(uint32_t cDisplays); + int i_createScreenObj(RecordingScreenSettingsObjMap &screenSettingsMap, uint32_t idScreen, const settings::RecordingScreenSettings &data); + int i_destroyScreenObj(RecordingScreenSettingsObjMap &screenSettingsMap, uint32_t idScreen); + int i_destroyAllScreenObj(RecordingScreenSettingsObjMap &screenSettingsMap); private: diff -Nru virtualbox-hwe-6.1.34-dfsg/src/VBox/Main/include/WebMWriter.h virtualbox-hwe-6.1.38-dfsg/src/VBox/Main/include/WebMWriter.h --- virtualbox-hwe-6.1.34-dfsg/src/VBox/Main/include/WebMWriter.h 2022-03-22 23:45:04.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/src/VBox/Main/include/WebMWriter.h 2022-09-01 13:28:29.000000000 +0000 @@ -552,6 +552,13 @@ uint64_t GetAvailableSpace(void); + /** + * Returns the number of written WebM clusters. + * + * @returns Number of written WebM clusters; 0 when no clusters written (empty file). + */ + uint64_t GetClusters(void) const { return CurSeg.cClusters; } + protected: int init(void); diff -Nru virtualbox-hwe-6.1.34-dfsg/src/VBox/Main/Makefile.kmk virtualbox-hwe-6.1.38-dfsg/src/VBox/Main/Makefile.kmk --- virtualbox-hwe-6.1.34-dfsg/src/VBox/Main/Makefile.kmk 2022-03-22 23:45:01.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/src/VBox/Main/Makefile.kmk 2022-09-01 13:28:26.000000000 +0000 @@ -1045,7 +1045,8 @@ VBoxC_SOURCES += \ src-client/GuestDnDPrivate.cpp \ src-client/GuestDnDSourceImpl.cpp \ - src-client/GuestDnDTargetImpl.cpp + src-client/GuestDnDTargetImpl.cpp \ + $(PATH_ROOT)/src/VBox/GuestHost/DragAndDrop/DnDUtils.cpp endif ifdef VBOX_WITH_XPCOM VBoxC_SOURCES += \ diff -Nru virtualbox-hwe-6.1.34-dfsg/src/VBox/Main/src-all/Global.cpp virtualbox-hwe-6.1.38-dfsg/src/VBox/Main/src-all/Global.cpp --- virtualbox-hwe-6.1.34-dfsg/src/VBox/Main/src-all/Global.cpp 2022-03-22 23:45:05.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/src/VBox/Main/src-all/Global.cpp 2022-09-01 13:28:30.000000000 +0000 @@ -354,13 +354,13 @@ 1, 2048, 16, 32 * _1G64, GraphicsControllerType_VBoxVGA, NetworkAdapterType_I82540EM, 0, StorageControllerType_PIIX4, StorageBus_IDE, StorageControllerType_PIIX4, StorageBus_IDE, ChipsetType_PIIX3, AudioControllerType_AC97, AudioCodecType_STAC9700 }, - { "Solaris", "Solaris", "OpenSolaris", "Oracle Solaris 10 10/09 and later (32-bit)", - VBOXOSTYPE_OpenSolaris, VBOXOSHINT_USBTABLET, + { "Solaris", "Solaris", "Solaris10U8_or_later", "Oracle Solaris 10 10/09 and later (32-bit)", + VBOXOSTYPE_Solaris10U8_or_later, VBOXOSHINT_USBTABLET, 1, 1024, 16, 32 * _1G64, GraphicsControllerType_VBoxVGA, NetworkAdapterType_I82540EM, 0, StorageControllerType_IntelAhci, StorageBus_SATA, StorageControllerType_IntelAhci, StorageBus_SATA, ChipsetType_PIIX3, AudioControllerType_AC97, AudioCodecType_STAC9700 }, - { "Solaris", "Solaris", "OpenSolaris_64", "Oracle Solaris 10 10/09 and later (64-bit)", - VBOXOSTYPE_OpenSolaris_x64, VBOXOSHINT_64BIT | VBOXOSHINT_HWVIRTEX | VBOXOSHINT_IOAPIC | VBOXOSHINT_USBTABLET, + { "Solaris", "Solaris", "Solaris10U8_or_later_64", "Oracle Solaris 10 10/09 and later (64-bit)", + VBOXOSTYPE_Solaris10U8_or_later_x64, VBOXOSHINT_64BIT | VBOXOSHINT_HWVIRTEX | VBOXOSHINT_IOAPIC | VBOXOSHINT_USBTABLET, 1, 2048, 16, 32 * _1G64, GraphicsControllerType_VBoxVGA, NetworkAdapterType_I82540EM, 0, StorageControllerType_IntelAhci, StorageBus_SATA, StorageControllerType_IntelAhci, StorageBus_SATA, ChipsetType_PIIX3, AudioControllerType_AC97, AudioCodecType_STAC9700 }, @@ -369,6 +369,16 @@ 1, 4096, 16, 32 * _1G64, GraphicsControllerType_VMSVGA, NetworkAdapterType_I82540EM, 0, StorageControllerType_IntelAhci, StorageBus_SATA, StorageControllerType_IntelAhci, StorageBus_SATA, ChipsetType_PIIX3, AudioControllerType_AC97, AudioCodecType_STAC9700 }, + { "Solaris", "Solaris", "OpenSolaris", "OpenSolaris / Illumos / OpenIndiana (32-bit)", + VBOXOSTYPE_OpenSolaris, VBOXOSHINT_USBTABLET, + 1, 1024, 16, 32 * _1G64, GraphicsControllerType_VBoxVGA, NetworkAdapterType_I82540EM, 0, StorageControllerType_IntelAhci, StorageBus_SATA, + StorageControllerType_IntelAhci, StorageBus_SATA, ChipsetType_PIIX3, AudioControllerType_AC97, AudioCodecType_STAC9700 }, + + { "Solaris", "Solaris", "OpenSolaris_64", "OpenSolaris / Illumos / OpenIndiana (64-bit)", + VBOXOSTYPE_OpenSolaris_x64, VBOXOSHINT_64BIT | VBOXOSHINT_HWVIRTEX | VBOXOSHINT_IOAPIC | VBOXOSHINT_USBTABLET, + 1, 2048, 16, 32 * _1G64, GraphicsControllerType_VBoxVGA, NetworkAdapterType_I82540EM, 0, StorageControllerType_IntelAhci, StorageBus_SATA, + StorageControllerType_IntelAhci, StorageBus_SATA, ChipsetType_PIIX3, AudioControllerType_AC97, AudioCodecType_STAC9700 }, + { "BSD", "BSD", "FreeBSD", "FreeBSD (32-bit)", VBOXOSTYPE_FreeBSD, VBOXOSHINT_NONE, 1, 1024, 16, 2 * _1G64, GraphicsControllerType_VMSVGA, NetworkAdapterType_I82540EM, 0, StorageControllerType_PIIX4, StorageBus_IDE, diff -Nru virtualbox-hwe-6.1.34-dfsg/src/VBox/Main/src-all/SharedFolderImpl.cpp virtualbox-hwe-6.1.38-dfsg/src/VBox/Main/src-all/SharedFolderImpl.cpp --- virtualbox-hwe-6.1.34-dfsg/src/VBox/Main/src-all/SharedFolderImpl.cpp 2022-03-22 23:45:05.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/src/VBox/Main/src-all/SharedFolderImpl.cpp 2022-09-01 13:28:30.000000000 +0000 @@ -292,7 +292,7 @@ return setError(E_INVALIDARG, tr("Shared folder path '%s' is not absolute"), hostPath.c_str()); RTFSOBJINFO ObjInfo; - vrc = RTPathQueryInfo(hostPathFull, &ObjInfo, RTFSOBJATTRADD_NOTHING); + vrc = RTPathQueryInfoEx(hostPathFull, &ObjInfo, RTFSOBJATTRADD_NOTHING, RTPATH_F_FOLLOW_LINK); if (RT_FAILURE(vrc)) return setError(E_INVALIDARG, tr("RTPathQueryInfo failed on shared folder path '%s': %Rrc"), hostPathFull, vrc); diff -Nru virtualbox-hwe-6.1.34-dfsg/src/VBox/Main/src-client/ConsoleImpl.cpp virtualbox-hwe-6.1.38-dfsg/src/VBox/Main/src-client/ConsoleImpl.cpp --- virtualbox-hwe-6.1.34-dfsg/src/VBox/Main/src-client/ConsoleImpl.cpp 2022-03-22 23:45:05.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/src/VBox/Main/src-client/ConsoleImpl.cpp 2022-09-01 13:28:31.000000000 +0000 @@ -6977,11 +6977,11 @@ #endif /* VBOX_WITH_AUDIO_RECORDING */ #ifdef VBOX_WITH_RECORDING -int Console::i_recordingGetSettings(settings::RecordingSettings &Settings) +int Console::i_recordingGetSettings(settings::RecordingSettings &recording) { Assert(mMachine.isNotNull()); - Settings.applyDefaults(); + recording.applyDefaults(); ComPtr pRecordSettings; HRESULT hrc = mMachine->COMGETTER(RecordingSettings)(pRecordSettings.asOutParam()); @@ -6990,44 +6990,44 @@ BOOL fTemp; hrc = pRecordSettings->COMGETTER(Enabled)(&fTemp); AssertComRCReturn(hrc, VERR_INVALID_PARAMETER); - Settings.fEnabled = RT_BOOL(fTemp); + recording.common.fEnabled = RT_BOOL(fTemp); - SafeIfaceArray paRecordingScreens; - hrc = pRecordSettings->COMGETTER(Screens)(ComSafeArrayAsOutParam(paRecordingScreens)); + SafeIfaceArray paRecScreens; + hrc = pRecordSettings->COMGETTER(Screens)(ComSafeArrayAsOutParam(paRecScreens)); AssertComRCReturn(hrc, VERR_INVALID_PARAMETER); - for (unsigned long i = 0; i < (unsigned long)paRecordingScreens.size(); ++i) + for (unsigned long i = 0; i < (unsigned long)paRecScreens.size(); ++i) { - settings::RecordingScreenSettings RecordScreenSettings; - ComPtr pRecordScreenSettings = paRecordingScreens[i]; + settings::RecordingScreenSettings recScreenSettings; + ComPtr pRecScreenSettings = paRecScreens[i]; - hrc = pRecordScreenSettings->COMGETTER(Enabled)(&fTemp); + hrc = pRecScreenSettings->COMGETTER(Enabled)(&fTemp); AssertComRCReturn(hrc, VERR_INVALID_PARAMETER); - RecordScreenSettings.fEnabled = RT_BOOL(fTemp); - hrc = pRecordScreenSettings->COMGETTER(MaxTime)((ULONG *)&RecordScreenSettings.ulMaxTimeS); + recScreenSettings.fEnabled = RT_BOOL(fTemp); + hrc = pRecScreenSettings->COMGETTER(MaxTime)((ULONG *)&recScreenSettings.ulMaxTimeS); AssertComRCReturn(hrc, VERR_INVALID_PARAMETER); - hrc = pRecordScreenSettings->COMGETTER(MaxFileSize)((ULONG *)&RecordScreenSettings.File.ulMaxSizeMB); + hrc = pRecScreenSettings->COMGETTER(MaxFileSize)((ULONG *)&recScreenSettings.File.ulMaxSizeMB); AssertComRCReturn(hrc, VERR_INVALID_PARAMETER); Bstr bstrTemp; - hrc = pRecordScreenSettings->COMGETTER(Filename)(bstrTemp.asOutParam()); + hrc = pRecScreenSettings->COMGETTER(Filename)(bstrTemp.asOutParam()); AssertComRCReturn(hrc, VERR_INVALID_PARAMETER); - RecordScreenSettings.File.strName = bstrTemp; - hrc = pRecordScreenSettings->COMGETTER(Options)(bstrTemp.asOutParam()); + recScreenSettings.File.strName = bstrTemp; + hrc = pRecScreenSettings->COMGETTER(Options)(bstrTemp.asOutParam()); AssertComRCReturn(hrc, VERR_INVALID_PARAMETER); - RecordScreenSettings.strOptions = bstrTemp; - hrc = pRecordScreenSettings->COMGETTER(VideoWidth)((ULONG *)&RecordScreenSettings.Video.ulWidth); + recScreenSettings.strOptions = bstrTemp; + hrc = pRecScreenSettings->COMGETTER(VideoWidth)((ULONG *)&recScreenSettings.Video.ulWidth); AssertComRCReturn(hrc, VERR_INVALID_PARAMETER); - hrc = pRecordScreenSettings->COMGETTER(VideoHeight)((ULONG *)&RecordScreenSettings.Video.ulHeight); + hrc = pRecScreenSettings->COMGETTER(VideoHeight)((ULONG *)&recScreenSettings.Video.ulHeight); AssertComRCReturn(hrc, VERR_INVALID_PARAMETER); - hrc = pRecordScreenSettings->COMGETTER(VideoRate)((ULONG *)&RecordScreenSettings.Video.ulRate); + hrc = pRecScreenSettings->COMGETTER(VideoRate)((ULONG *)&recScreenSettings.Video.ulRate); AssertComRCReturn(hrc, VERR_INVALID_PARAMETER); - hrc = pRecordScreenSettings->COMGETTER(VideoFPS)((ULONG *)&RecordScreenSettings.Video.ulFPS); + hrc = pRecScreenSettings->COMGETTER(VideoFPS)((ULONG *)&recScreenSettings.Video.ulFPS); AssertComRCReturn(hrc, VERR_INVALID_PARAMETER); - Settings.mapScreens[i] = RecordScreenSettings; + recording.mapScreens[i] = recScreenSettings; } - Assert(Settings.mapScreens.size() == paRecordingScreens.size()); + Assert(recording.mapScreens.size() == paRecScreens.size()); return VINF_SUCCESS; } diff -Nru virtualbox-hwe-6.1.34-dfsg/src/VBox/Main/src-client/GuestCtrlPrivate.cpp virtualbox-hwe-6.1.38-dfsg/src/VBox/Main/src-client/GuestCtrlPrivate.cpp --- virtualbox-hwe-6.1.34-dfsg/src/VBox/Main/src-client/GuestCtrlPrivate.cpp 2022-03-22 23:45:06.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/src/VBox/Main/src-client/GuestCtrlPrivate.cpp 2022-09-01 13:28:31.000000000 +0000 @@ -668,64 +668,54 @@ { if ( !m_pbBuffer || !m_cbUsed) - { return VERR_NO_DATA; - } AssertReturn(m_offBuffer <= m_cbUsed, VERR_INVALID_PARAMETER); if (m_offBuffer == m_cbUsed) return VERR_NO_DATA; - int rc = VINF_SUCCESS; - - char *pszOff = (char*)&m_pbBuffer[m_offBuffer]; - char *pszStart = pszOff; - uint32_t uDistance; - while (*pszStart) + int rc = VINF_SUCCESS; + char * const pszOff = (char *)&m_pbBuffer[m_offBuffer]; + size_t cbLeft = m_offBuffer < m_cbUsed ? m_cbUsed - m_offBuffer : 0; + char *pszStart = pszOff; + while (cbLeft > 0 && *pszStart != '\0') { - size_t pairLen = strlen(pszStart); - uDistance = (pszStart - pszOff); - if (m_offBuffer + uDistance + pairLen + 1 >= m_cbUsed) + char * const pszPairEnd = RTStrEnd(pszStart, cbLeft); + if (!pszPairEnd) { rc = VERR_MORE_DATA; break; } + size_t const cchPair = (size_t)(pszPairEnd - pszStart); + char *pszSep = (char *)memchr(pszStart, '=', cchPair); + if (pszSep) + *pszSep = '\0'; /* Terminate the separator so that we can use pszStart as our key from now on. */ else { - char *pszSep = strchr(pszStart, '='); - char *pszVal = NULL; - if (pszSep) - pszVal = pszSep + 1; - if (!pszSep || !pszVal) - { - rc = VERR_MORE_DATA; - break; - } - - /* Terminate the separator so that we can - * use pszStart as our key from now on. */ - *pszSep = '\0'; - - rc = streamBlock.SetValue(pszStart, pszVal); - if (RT_FAILURE(rc)) - return rc; + rc = VERR_MORE_DATA; /** @todo r=bird: This is BOGUS because we'll be stuck here if the guest feeds us bad data! */ + break; } + char const * const pszVal = pszSep + 1; + + rc = streamBlock.SetValue(pszStart, pszVal); + if (RT_FAILURE(rc)) + return rc; /* Next pair. */ - pszStart += pairLen + 1; + pszStart = pszPairEnd + 1; + cbLeft -= cchPair + 1; } /* If we did not do any movement but we have stuff left * in our buffer just skip the current termination so that * we can try next time. */ - uDistance = (pszStart - pszOff); - if ( !uDistance + size_t cbDistance = (pszStart - pszOff); + if ( !cbDistance + && cbLeft > 0 && *pszStart == '\0' && m_offBuffer < m_cbUsed) - { - uDistance++; - } - m_offBuffer += uDistance; + cbDistance++; + m_offBuffer += cbDistance; return rc; } diff -Nru virtualbox-hwe-6.1.34-dfsg/src/VBox/Main/src-client/GuestDnDPrivate.cpp virtualbox-hwe-6.1.38-dfsg/src/VBox/Main/src-client/GuestDnDPrivate.cpp --- virtualbox-hwe-6.1.34-dfsg/src/VBox/Main/src-client/GuestDnDPrivate.cpp 2022-03-22 23:45:06.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/src/VBox/Main/src-client/GuestDnDPrivate.cpp 2022-09-01 13:28:31.000000000 +0000 @@ -571,6 +571,8 @@ AssertReturn(sizeof(DragAndDropSvc::VBOXDNDCBHGACKOPDATA) == cbParms, VERR_INVALID_PARAMETER); AssertReturn(DragAndDropSvc::CB_MAGIC_DND_HG_ACK_OP == pCBData->hdr.uMagic, VERR_INVALID_PARAMETER); + LogRel2(("DnD: Guest responded with action '%s' for host->guest drag event\n", DnDActionToStr(pCBData->uAction))); + setActionDefault(pCBData->uAction); rc = notifyAboutGuestResponse(); break; @@ -627,6 +629,9 @@ AssertReturn(sizeof(DragAndDropSvc::VBOXDNDCBGHACKPENDINGDATA) == cbParms, VERR_INVALID_PARAMETER); AssertReturn(DragAndDropSvc::CB_MAGIC_DND_GH_ACK_PENDING == pCBData->hdr.uMagic, VERR_INVALID_PARAMETER); + LogRel2(("DnD: Guest responded with pending action '%s' (%RU32 bytes format data) to guest->host drag event\n", + DnDActionToStr(pCBData->uDefAction), pCBData->cbFormat)); + if ( pCBData->cbFormat == 0 || pCBData->cbFormat > _64K /** @todo Make the maximum size configurable? */ || pCBData->pszFormat == NULL) diff -Nru virtualbox-hwe-6.1.34-dfsg/src/VBox/Main/src-client/Recording.cpp virtualbox-hwe-6.1.38-dfsg/src/VBox/Main/src-client/Recording.cpp --- virtualbox-hwe-6.1.34-dfsg/src/VBox/Main/src-client/Recording.cpp 2022-03-22 23:45:06.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/src/VBox/Main/src-client/Recording.cpp 2022-09-01 13:28:31.000000000 +0000 @@ -150,7 +150,7 @@ if (RT_FAILURE(rc)) return rc; - settings::RecordingScreenMap::const_iterator itScreen = a_Settings.mapScreens.begin(); + settings::RecordingScreenSettingsMap::const_iterator itScreen = a_Settings.mapScreens.begin(); while (itScreen != a_Settings.mapScreens.end()) { RecordingStream *pStream = NULL; @@ -201,21 +201,21 @@ Assert(this->enmState == RECORDINGSTS_CREATED); - int rc = RTThreadCreate(&this->Thread, RecordingContext::threadMain, (void *)this, 0, - RTTHREADTYPE_MAIN_WORKER, RTTHREADFLAGS_WAITABLE, "Record"); + int vrc = RTThreadCreate(&this->Thread, RecordingContext::threadMain, (void *)this, 0, + RTTHREADTYPE_MAIN_WORKER, RTTHREADFLAGS_WAITABLE, "Record"); - if (RT_SUCCESS(rc)) /* Wait for the thread to start. */ - rc = RTThreadUserWait(this->Thread, 30 * RT_MS_1SEC /* 30s timeout */); + if (RT_SUCCESS(vrc)) /* Wait for the thread to start. */ + vrc = RTThreadUserWait(this->Thread, RT_MS_30SEC /* 30s timeout */); - if (RT_SUCCESS(rc)) + if (RT_SUCCESS(vrc)) { LogRel(("Recording: Started\n")); this->enmState = RECORDINGSTS_STARTED; } else - Log(("Recording: Failed to start (%Rrc)\n", rc)); + Log(("Recording: Failed to start (%Rrc)\n", vrc)); - return rc; + return vrc; } /** @@ -234,24 +234,24 @@ ASMAtomicWriteBool(&this->fShutdown, true); /* Signal the thread and wait for it to shut down. */ - int rc = threadNotify(); - if (RT_SUCCESS(rc)) - rc = RTThreadWait(this->Thread, 30 * 1000 /* 10s timeout */, NULL); + int vrc = threadNotify(); + if (RT_SUCCESS(vrc)) + vrc = RTThreadWait(this->Thread, RT_MS_30SEC /* 30s timeout */, NULL); lock(); - if (RT_SUCCESS(rc)) + if (RT_SUCCESS(vrc)) { LogRel(("Recording: Stopped\n")); this->enmState = RECORDINGSTS_CREATED; } else - Log(("Recording: Failed to stop (%Rrc)\n", rc)); + Log(("Recording: Failed to stop (%Rrc)\n", vrc)); unlock(); - LogFlowThisFunc(("%Rrc\n", rc)); - return rc; + LogFlowThisFunc(("%Rrc\n", vrc)); + return vrc; } /** @@ -294,10 +294,7 @@ unlock(); if (RTCritSectIsInitialized(&this->CritSect)) - { - Assert(RTCritSectGetWaiters(&this->CritSect) == -1); RTCritSectDelete(&this->CritSect); - } this->enmState = RECORDINGSTS_UNINITIALIZED; } diff -Nru virtualbox-hwe-6.1.34-dfsg/src/VBox/Main/src-client/RecordingStream.cpp virtualbox-hwe-6.1.38-dfsg/src/VBox/Main/src-client/RecordingStream.cpp --- virtualbox-hwe-6.1.34-dfsg/src/VBox/Main/src-client/RecordingStream.cpp 2022-03-22 23:45:06.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/src/VBox/Main/src-client/RecordingStream.cpp 2022-09-01 13:28:31.000000000 +0000 @@ -63,6 +63,7 @@ : pCtx(a_pCtx) , enmState(RECORDINGSTREAMSTATE_UNINITIALIZED) , tsStartMs(0) + , ScreenSettings(UINT32_MAX) { File.pWEBM = NULL; File.hFile = NIL_RTFILE; @@ -71,6 +72,7 @@ RecordingStream::RecordingStream(RecordingContext *a_pCtx, uint32_t uScreen, const settings::RecordingScreenSettings &Settings) : enmState(RECORDINGSTREAMSTATE_UNINITIALIZED) , tsStartMs(0) + , ScreenSettings(uScreen) { File.pWEBM = NULL; File.hFile = NIL_RTFILE; @@ -89,76 +91,29 @@ /** * Opens a recording stream. * - * @returns IPRT status code. + * @returns VBox status code. + * @param screenSettings Recording settings to use. */ -int RecordingStream::open(const settings::RecordingScreenSettings &Settings) +int RecordingStream::open(const settings::RecordingScreenSettings &screenSettings) { /* Sanity. */ - Assert(Settings.enmDest != RecordingDestination_None); + Assert(screenSettings.enmDest != RecordingDestination_None); - int rc; + int vrc; - switch (Settings.enmDest) + switch (screenSettings.enmDest) { case RecordingDestination_File: { - Assert(Settings.File.strName.isNotEmpty()); - - char *pszAbsPath = RTPathAbsDup(Settings.File.strName.c_str()); - AssertPtrReturn(pszAbsPath, VERR_NO_MEMORY); - - RTPathStripSuffix(pszAbsPath); - - char *pszSuff = RTStrDup(".webm"); - if (!pszSuff) - { - RTStrFree(pszAbsPath); - rc = VERR_NO_MEMORY; - break; - } - - char *pszFile = NULL; + Assert(screenSettings.File.strName.isNotEmpty()); - if (this->uScreenID > 0) - rc = RTStrAPrintf(&pszFile, "%s-%u%s", pszAbsPath, this->uScreenID + 1, pszSuff); - else - rc = RTStrAPrintf(&pszFile, "%s%s", pszAbsPath, pszSuff); + const char *pszFile = screenSettings.File.strName.c_str(); - if (RT_SUCCESS(rc)) + RTFILE hFile = NIL_RTFILE; + vrc = RTFileOpen(&hFile, pszFile, RTFILE_O_CREATE_REPLACE | RTFILE_O_WRITE | RTFILE_O_DENY_WRITE); + if (RT_SUCCESS(vrc)) { - uint64_t fOpen = RTFILE_O_WRITE | RTFILE_O_DENY_WRITE; - - /* Play safe: the file must not exist, overwriting is potentially - * hazardous as nothing prevents the user from picking a file name of some - * other important file, causing unintentional data loss. */ - fOpen |= RTFILE_O_CREATE; - - RTFILE hFile; - rc = RTFileOpen(&hFile, pszFile, fOpen); - if (rc == VERR_ALREADY_EXISTS) - { - RTStrFree(pszFile); - pszFile = NULL; - - RTTIMESPEC ts; - RTTimeNow(&ts); - RTTIME time; - RTTimeExplode(&time, &ts); - - if (this->uScreenID > 0) - rc = RTStrAPrintf(&pszFile, "%s-%04d-%02u-%02uT%02u-%02u-%02u-%09uZ-%u%s", - pszAbsPath, time.i32Year, time.u8Month, time.u8MonthDay, - time.u8Hour, time.u8Minute, time.u8Second, time.u32Nanosecond, - this->uScreenID + 1, pszSuff); - else - rc = RTStrAPrintf(&pszFile, "%s-%04d-%02u-%02uT%02u-%02u-%02u-%09uZ%s", - pszAbsPath, time.i32Year, time.u8Month, time.u8MonthDay, - time.u8Hour, time.u8Minute, time.u8Second, time.u32Nanosecond, - pszSuff); - - if (RT_SUCCESS(rc)) - rc = RTFileOpen(&hFile, pszFile, fOpen); - } + LogRel2(("Recording: Opened file '%s'\n", pszFile)); try { @@ -167,36 +122,35 @@ } catch (std::bad_alloc &) { - rc = VERR_NO_MEMORY; + vrc = VERR_NO_MEMORY; } - if (RT_SUCCESS(rc)) + if (RT_SUCCESS(vrc)) { this->File.hFile = hFile; this->ScreenSettings.File.strName = pszFile; } } + else + LogRel(("Recording: Failed to open file '%s' for screen %RU32, vrc=%Rrc\n", + pszFile ? pszFile : "", uScreenID, vrc)); - RTStrFree(pszSuff); - RTStrFree(pszAbsPath); - - if (RT_FAILURE(rc)) + if (RT_FAILURE(vrc)) { - LogRel(("Recording: Failed to open file '%s' for screen %RU32, rc=%Rrc\n", - pszFile ? pszFile : "", this->uScreenID, rc)); + if (hFile != NIL_RTFILE) + RTFileClose(hFile); } - RTStrFree(pszFile); break; } default: - rc = VERR_NOT_IMPLEMENTED; + vrc = VERR_NOT_IMPLEMENTED; break; } - LogFlowFuncLeaveRC(rc); - return rc; + LogFlowFuncLeaveRC(vrc); + return vrc; } /** @@ -826,11 +780,11 @@ AssertPtr(File.pWEBM); rc = File.pWEBM->OpenEx(pszFile, &this->File.hFile, #ifdef VBOX_WITH_AUDIO_RECORDING - fAudioEnabled ? WebMWriter::AudioCodec_Opus : WebMWriter::AudioCodec_None, + fAudioEnabled ? WebMWriter::AudioCodec_Opus : WebMWriter::AudioCodec_None, #else - WebMWriter::AudioCodec_None, + WebMWriter::AudioCodec_None, #endif - fVideoEnabled ? WebMWriter::VideoCodec_VP8 : WebMWriter::VideoCodec_None); + fVideoEnabled ? WebMWriter::VideoCodec_VP8 : WebMWriter::VideoCodec_None); if (RT_FAILURE(rc)) { LogRel(("Recording: Failed to create output file '%s' (%Rrc)\n", pszFile, rc)); @@ -967,9 +921,21 @@ } } - if (this->File.pWEBM) + WebMWriter *pWebMWriter = this->File.pWEBM; + AssertPtr(pWebMWriter); + + if (pWebMWriter) { - delete this->File.pWEBM; + /* If no clusters (= data) was written, delete the file again. */ + if (pWebMWriter->GetClusters() == 0) + { + int vrc2 = RTFileDelete(this->ScreenSettings.File.strName.c_str()); + AssertRC(vrc2); /* Ignore rc on non-debug builds. */ + } + + delete pWebMWriter; + pWebMWriter = NULL; + this->File.pWEBM = NULL; } break; diff -Nru virtualbox-hwe-6.1.34-dfsg/src/VBox/Main/src-client/WebMWriter.cpp virtualbox-hwe-6.1.38-dfsg/src/VBox/Main/src-client/WebMWriter.cpp --- virtualbox-hwe-6.1.34-dfsg/src/VBox/Main/src-client/WebMWriter.cpp 2022-03-22 23:45:07.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/src/VBox/Main/src-client/WebMWriter.cpp 2022-09-01 13:28:32.000000000 +0000 @@ -150,14 +150,7 @@ close(); - int rc = VINF_SUCCESS; - - /* If no clusters (= data) was written, delete the file again. */ - if (!CurSeg.cClusters) - rc = RTFileDelete(strFileName.c_str()); - - LogFlowFuncLeaveRC(rc); - return rc; + return VINF_SUCCESS; } /** diff -Nru virtualbox-hwe-6.1.34-dfsg/src/VBox/Main/src-server/ApplianceImpl.cpp virtualbox-hwe-6.1.38-dfsg/src/VBox/Main/src-server/ApplianceImpl.cpp --- virtualbox-hwe-6.1.34-dfsg/src/VBox/Main/src-server/ApplianceImpl.cpp 2022-03-22 23:45:07.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/src/VBox/Main/src-server/ApplianceImpl.cpp 2022-09-01 13:28:32.000000000 +0000 @@ -97,6 +97,9 @@ { ovf::CIMOSType_CIMOS_NetWare, VBOXOSTYPE_Netware }, { ovf::CIMOSType_CIMOS_NovellOES, VBOXOSTYPE_Netware }, { ovf::CIMOSType_CIMOS_Solaris, VBOXOSTYPE_Solaris }, + { ovf::CIMOSType_CIMOS_Solaris_64, VBOXOSTYPE_Solaris_x64 }, + { ovf::CIMOSType_CIMOS_Solaris, VBOXOSTYPE_Solaris10U8_or_later }, + { ovf::CIMOSType_CIMOS_Solaris_64, VBOXOSTYPE_Solaris10U8_or_later_x64 }, { ovf::CIMOSType_CIMOS_SunOS, VBOXOSTYPE_Solaris }, { ovf::CIMOSType_CIMOS_FreeBSD, VBOXOSTYPE_FreeBSD }, { ovf::CIMOSType_CIMOS_NetBSD, VBOXOSTYPE_NetBSD }, @@ -130,7 +133,6 @@ // Linuxes { ovf::CIMOSType_CIMOS_RedHatEnterpriseLinux, VBOXOSTYPE_RedHat }, { ovf::CIMOSType_CIMOS_RedHatEnterpriseLinux_64, VBOXOSTYPE_RedHat_x64 }, - { ovf::CIMOSType_CIMOS_Solaris_64, VBOXOSTYPE_Solaris_x64 }, { ovf::CIMOSType_CIMOS_SUSE, VBOXOSTYPE_OpenSUSE }, { ovf::CIMOSType_CIMOS_SLES, VBOXOSTYPE_OpenSUSE }, { ovf::CIMOSType_CIMOS_NovellLinuxDesktop, VBOXOSTYPE_OpenSUSE }, @@ -1773,6 +1775,7 @@ case VirtualSystemDescriptionType_HardDiskControllerIDE: case VirtualSystemDescriptionType_HardDiskControllerSATA: case VirtualSystemDescriptionType_HardDiskControllerSCSI: + case VirtualSystemDescriptionType_HardDiskControllerVirtioSCSI: case VirtualSystemDescriptionType_HardDiskControllerSAS: if (d.strRef == strRef) return &d; diff -Nru virtualbox-hwe-6.1.34-dfsg/src/VBox/Main/src-server/ApplianceImplExport.cpp virtualbox-hwe-6.1.38-dfsg/src/VBox/Main/src-server/ApplianceImplExport.cpp --- virtualbox-hwe-6.1.34-dfsg/src/VBox/Main/src-server/ApplianceImplExport.cpp 2022-03-22 23:45:07.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/src/VBox/Main/src-server/ApplianceImplExport.cpp 2022-09-01 13:28:32.000000000 +0000 @@ -185,6 +185,7 @@ int32_t lIDEControllerSecondaryIndex = 0; int32_t lSATAControllerIndex = 0; int32_t lSCSIControllerIndex = 0; + int32_t lVirtioSCSIControllerIndex = 0; /* Fetch all available storage controllers */ com::SafeIfaceArray nwControllers; @@ -194,6 +195,7 @@ ComPtr pIDEController; ComPtr pSATAController; ComPtr pSCSIController; + ComPtr pVirtioSCSIController; ComPtr pSASController; for (size_t j = 0; j < nwControllers.size(); ++j) { @@ -212,6 +214,9 @@ else if ( eType == StorageBus_SAS && pSASController.isNull()) pSASController = nwControllers[j]; + else if ( eType == StorageBus_VirtioSCSI + && pVirtioSCSIController.isNull()) + pVirtioSCSIController = nwControllers[j]; } // @@ -292,6 +297,28 @@ strVBox); } + if (!pVirtioSCSIController.isNull()) + { + StorageControllerType_T ctlr; + rc = pVirtioSCSIController->COMGETTER(ControllerType)(&ctlr); + if (SUCCEEDED(rc)) + { + Utf8Str strVBox = "VirtioSCSI"; // the default in VBox + switch (ctlr) + { + case StorageControllerType_VirtioSCSI: strVBox = "VirtioSCSI"; break; + default: break; /* Shut up MSC. */ + } + lVirtioSCSIControllerIndex = (int32_t)pNewDesc->m->maDescriptions.size(); + pNewDesc->i_addEntry(VirtualSystemDescriptionType_HardDiskControllerVirtioSCSI, + Utf8StrFmt("%d", lVirtioSCSIControllerIndex), + strVBox, + strVBox); + } + else + throw rc; + } + // // // @@ -337,13 +364,16 @@ { Utf8Str strStBus; if ( storageBus == StorageBus_IDE) - strStBus = "IDE"; + strStBus = "IDE"; else if ( storageBus == StorageBus_SATA) - strStBus = "SATA"; + strStBus = "SATA"; else if ( storageBus == StorageBus_SCSI) - strStBus = "SCSI"; + strStBus = "SCSI"; else if ( storageBus == StorageBus_SAS) - strStBus = "SAS"; + strStBus = "SAS"; + else if ( storageBus == StorageBus_VirtioSCSI) + strStBus = "VirtioSCSI"; + LogRel(("Warning: skip the medium (bus: %s, slot: %d, port: %d). No storage device attached.\n", strStBus.c_str(), lDevice, lChannel)); continue; @@ -514,6 +544,11 @@ lControllerVsys = lSATAControllerIndex; break; + case StorageBus_VirtioSCSI: + lChannelVsys = lChannel; // should be between 0 and 255 + lControllerVsys = lVirtioSCSIControllerIndex; + break; + case StorageBus_SCSI: case StorageBus_SAS: lChannelVsys = lChannel; // should be between 0 and 15 @@ -894,8 +929,7 @@ LogRel(("profile name: %s\n", profileName.front()->strVBoxCurrent.c_str())); } - // we need to do that as otherwise Task won't be created successfully - /// @todo r=bird: What's 'that' here exactly? + // Create a progress object here otherwise Task won't be created successfully HRESULT hrc = aProgress.createObject(); if (SUCCEEDED(hrc)) { @@ -1477,6 +1511,8 @@ int32_t lSATAControllerIndex = 0; uint32_t idSCSIController = 0; int32_t lSCSIControllerIndex = 0; + uint32_t idVirtioSCSIController = 0; + int32_t lVirtioSCSIControllerIndex = 0; uint32_t ulInstanceID = 1; @@ -1689,6 +1725,31 @@ } break; + + case VirtualSystemDescriptionType_HardDiskControllerVirtioSCSI: + /* + VirtioSCSIController0 + VirtioSCSI Controller + 4 + 20 + 0 + 0 + + */ + if (uLoop == 1) + { + strDescription = "VirtioSCSI Controller"; + strCaption = "virtioSCSIController0"; + type = ovf::ResourceType_OtherStorageDevice; // 20 + lAddress = 0; + lBusNumber = 0; + strResourceSubType = "VirtioSCSI"; + // remember this ID + idVirtioSCSIController = ulInstanceID; + lVirtioSCSIControllerIndex = lIndexThis; + } + break; + case VirtualSystemDescriptionType_HardDiskImage: /* disk1 @@ -1725,6 +1786,8 @@ ulParent = idSCSIController; else if (lControllerIndex == lSATAControllerIndex) ulParent = idSATAController; + else if (lControllerIndex == lVirtioSCSIControllerIndex) + ulParent = idVirtioSCSIController; } if (pos2 != Utf8Str::npos) RTStrToInt32Ex(desc.strExtraConfigCurrent.c_str() + pos2 + 8, NULL, 0, &lAddressOnParent); diff -Nru virtualbox-hwe-6.1.34-dfsg/src/VBox/Main/src-server/ApplianceImplImport.cpp virtualbox-hwe-6.1.38-dfsg/src/VBox/Main/src-server/ApplianceImplImport.cpp --- virtualbox-hwe-6.1.34-dfsg/src/VBox/Main/src-server/ApplianceImplImport.cpp 2022-03-22 23:45:07.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/src/VBox/Main/src-server/ApplianceImplImport.cpp 2022-09-01 13:28:32.000000000 +0000 @@ -561,6 +561,8 @@ uint16_t cIDEused = 0; uint16_t cSATAused = 0; NOREF(cSATAused); uint16_t cSCSIused = 0; NOREF(cSCSIused); + uint16_t cVIRTIOSCSIused = 0; NOREF(cVIRTIOSCSIused); + ovf::ControllersMap::const_iterator hdcIt; /* Iterate through all storage controllers */ for (hdcIt = vsysThis.mapControllers.begin(); @@ -649,6 +651,28 @@ strControllerID.c_str()); ++cSCSIused; break; + + case ovf::HardDiskController::VIRTIOSCSI: + /* Check for the constrains */ + if (cVIRTIOSCSIused < 1) + { + pNewDesc->i_addEntry(VirtualSystemDescriptionType_HardDiskControllerVirtioSCSI, + strControllerID, + hdc.strControllerType, + "VirtioSCSI"); + } + else + { + /* Warn only once */ + if (cVIRTIOSCSIused == 1) + i_addWarning(tr("The virtual system \"%s\" requests support for more than one " + "VirtioSCSI controller, but VirtualBox has support for only one"), + vsysThis.strName.c_str()); + + } + ++cVIRTIOSCSIused; + break; + } } @@ -3516,6 +3540,12 @@ break; } + case ovf::HardDiskController::VIRTIOSCSI: + controllerName = "VirtioSCSI"; + lControllerPort = (long)ulAddressOnParent; + lDevice = (long)0; + break; + default: break; } @@ -4290,6 +4320,34 @@ if (FAILED(rc)) throw rc; } + + /* Storage controller VirtioSCSI */ + std::list vsdeHDCVirtioSCSI = + vsdescThis->i_findByType(VirtualSystemDescriptionType_HardDiskControllerVirtioSCSI); + if (vsdeHDCVirtioSCSI.size() > 1) + throw setError(VBOX_E_FILE_ERROR, + tr("Too many VirtioSCSI controllers in OVF; import facility only supports one")); + if (!vsdeHDCVirtioSCSI.empty()) + { + ComPtr pController; + Utf8Str strName("VirtioSCSI"); + const Utf8Str &hdcVBox = vsdeHDCVirtioSCSI.front()->strVBoxCurrent; + if (hdcVBox == "VirtioSCSI") + { + rc = pNewMachine->AddStorageController(Bstr(strName).raw(), + StorageBus_VirtioSCSI, + pController.asOutParam()); + if (FAILED(rc)) throw rc; + + rc = pController->COMSETTER(ControllerType)(StorageControllerType_VirtioSCSI); + if (FAILED(rc)) throw rc; + } + else + throw setError(VBOX_E_FILE_ERROR, + tr("Invalid VirtioSCSI controller type \"%s\""), + hdcVBox.c_str()); + } + /* Now its time to register the machine before we add any storage devices */ rc = mVirtualBox->RegisterMachine(pNewMachine); if (FAILED(rc)) throw rc; @@ -4806,6 +4864,7 @@ + */ #ifdef VBOX_WITH_USB diff -Nru virtualbox-hwe-6.1.34-dfsg/src/VBox/Main/src-server/MachineImpl.cpp virtualbox-hwe-6.1.38-dfsg/src/VBox/Main/src-server/MachineImpl.cpp --- virtualbox-hwe-6.1.34-dfsg/src/VBox/Main/src-server/MachineImpl.cpp 2022-03-22 23:45:08.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/src/VBox/Main/src-server/MachineImpl.cpp 2022-09-01 13:28:33.000000000 +0000 @@ -366,7 +366,7 @@ /* Apply BIOS defaults. */ mBIOSSettings->i_applyDefaults(aOsType); - /* Apply record defaults. */ + /* Apply recording defaults. */ mRecordingSettings->i_applyDefaults(); /* Apply network adapters defaults */ @@ -3479,16 +3479,20 @@ && strReconfig == "1") fSilent = true; - /* Check that the controller can do hotplugging if we detach the device while the VM is running. */ + /* Check that the controller can do hot-plugging if we attach the device while the VM is running. */ bool fHotplug = false; if (!fSilent && Global::IsOnlineOrTransient(mData->mMachineState)) fHotplug = true; if (fHotplug && !i_isControllerHotplugCapable(ctrlType)) return setError(VBOX_E_INVALID_VM_STATE, - tr("Controller '%s' does not support hotplugging"), + tr("Controller '%s' does not support hot-plugging"), aName.c_str()); + /* Attaching a USB device when a VM is powered off should default to being marked as hot-pluggable */ + if (!fHotplug && !Global::IsOnlineOrTransient(mData->mMachineState) && ctrlType == StorageControllerType_USB) + fHotplug = true; + // check that the port and device are not out of range rc = ctl->i_checkPortAndDeviceValid(aControllerPort, aDevice); if (FAILED(rc)) return rc; @@ -4057,14 +4061,14 @@ && strReconfig == "1") fSilent = true; - /* Check that the controller can do hotplugging if we detach the device while the VM is running. */ + /* Check that the controller can do hot-plugging if we detach the device while the VM is running. */ bool fHotplug = false; if (!fSilent && Global::IsOnlineOrTransient(mData->mMachineState)) fHotplug = true; if (fHotplug && !i_isControllerHotplugCapable(ctrlType)) return setError(VBOX_E_INVALID_VM_STATE, - tr("Controller '%s' does not support hotplugging"), + tr("Controller '%s' does not support hot-plugging"), aName.c_str()); MediumAttachment *pAttach = i_findAttachment(*mMediumAttachments.data(), @@ -4078,7 +4082,7 @@ if (fHotplug && !pAttach->i_getHotPluggable()) return setError(VBOX_E_NOT_SUPPORTED, - tr("The device slot %d on port %d of controller '%s' does not support hotplugging"), + tr("The device slot %d on port %d of controller '%s' does not support hot-plugging"), aDevice, aControllerPort, aName.c_str()); /* @@ -4143,14 +4147,14 @@ && strReconfig == "1") fSilent = true; - /* Check that the controller can do hotplugging if we detach the device while the VM is running. */ + /* Check that the controller can do hot-plugging if we detach the device while the VM is running. */ bool fHotplug = false; if (!fSilent && Global::IsOnlineOrTransient(mData->mMachineState)) fHotplug = true; if (fHotplug && !i_isControllerHotplugCapable(ctrlType)) return setError(VBOX_E_INVALID_VM_STATE, - tr("Controller '%s' does not support hotplugging which is required to change the passthrough setting while the VM is running"), + tr("Controller '%s' does not support hot-plugging which is required to change the passthrough setting while the VM is running"), aName.c_str()); MediumAttachment *pAttach = i_findAttachment(*mMediumAttachments.data(), @@ -4348,9 +4352,13 @@ aName.c_str()); if (!i_isControllerHotplugCapable(ctrlType)) - return setError(VBOX_E_NOT_SUPPORTED, - tr("Controller '%s' does not support changing the hot-pluggable device flag"), - aName.c_str()); + return setError(VBOX_E_NOT_SUPPORTED, + tr("Controller '%s' does not support changing the hot-pluggable device flag"), + aName.c_str()); + + /* silently ignore attempts to modify the hot-plug status of USB devices */ + if (ctrlType == StorageControllerType_USB) + return S_OK; i_setModified(IsModified_Storage); mMediumAttachments.backup(); @@ -8157,7 +8165,7 @@ unconst(mBIOSSettings).createObject(); mBIOSSettings->init(this); - /* create associated record settings object */ + /* create associated recording settings object */ unconst(mRecordingSettings).createObject(); mRecordingSettings->init(this); @@ -8582,7 +8590,8 @@ } // hardware data - rc = i_loadHardware(puuidRegistry, NULL, config.hardwareMachine, &config.debugging, &config.autostart); + rc = i_loadHardware(puuidRegistry, NULL, config.hardwareMachine, &config.debugging, &config.autostart, + config.recordingSettings); if (FAILED(rc)) return rc; /* @@ -8648,6 +8657,7 @@ data.hardware, &data.debugging, &data.autostart, + data.recordingSettings, data.uuid.ref(), strStateFile); if (FAILED(rc)) return rc; @@ -8699,13 +8709,15 @@ * @param puuidSnapshot Snapshot ID * @param data Reference to the hardware settings. * @param pDbg Pointer to the debugging settings. - * @param pAutostart Pointer to the autostart settings. + * @param pAutostart Pointer to the autostart settings + * @param recording Reference to recording settings. */ HRESULT Machine::i_loadHardware(const Guid *puuidRegistry, const Guid *puuidSnapshot, const settings::Hardware &data, const settings::Debugging *pDbg, - const settings::Autostart *pAutostart) + const settings::Autostart *pAutostart, + const settings::RecordingSettings &recording) { AssertReturn(!i_isSessionMachine(), E_FAIL); @@ -8809,8 +8821,8 @@ rc = mBIOSSettings->i_loadSettings(data.biosSettings); if (FAILED(rc)) return rc; - /* Recording settings */ - rc = mRecordingSettings->i_loadSettings(data.recordingSettings); + /* Recording */ + rc = mRecordingSettings->i_loadSettings(recording); if (FAILED(rc)) return rc; // Bandwidth control (must come before network adapters) @@ -9981,8 +9993,8 @@ config.fAborted = (mData->mMachineState == MachineState_Aborted); /// @todo Live Migration: config.fTeleported = (mData->mMachineState == MachineState_Teleported); - HRESULT rc = i_saveHardware(config.hardwareMachine, &config.debugging, &config.autostart); - if (FAILED(rc)) throw rc; + HRESULT hrc = i_saveHardware(config.hardwareMachine, &config.debugging, &config.autostart, config.recordingSettings); + if (FAILED(hrc)) throw hrc; // save machine's media registry if this is VirtualBox 4.0 or later if (config.canHaveOwnMediaRegistry()) @@ -9997,8 +10009,8 @@ } // save snapshots - rc = i_saveAllSnapshots(config); - if (FAILED(rc)) throw rc; + hrc = i_saveAllSnapshots(config); + if (FAILED(hrc)) throw hrc; } /** @@ -10054,9 +10066,10 @@ * which happens to live in mHWData. * @param pAutostart Pointer to the settings object for the autostart config * which happens to live in mHWData. + * @param recording Reference to reecording settings. */ HRESULT Machine::i_saveHardware(settings::Hardware &data, settings::Debugging *pDbg, - settings::Autostart *pAutostart) + settings::Autostart *pAutostart, settings::RecordingSettings &recording) { HRESULT rc = S_OK; @@ -10156,8 +10169,8 @@ rc = mBIOSSettings->i_saveSettings(data.biosSettings); if (FAILED(rc)) throw rc; - /* Recording settings (required) */ - rc = mRecordingSettings->i_saveSettings(data.recordingSettings); + /* Recording settings. */ + rc = mRecordingSettings->i_saveSettings(recording); if (FAILED(rc)) throw rc; /* GraphicsAdapter settings (required) */ diff -Nru virtualbox-hwe-6.1.34-dfsg/src/VBox/Main/src-server/RecordingScreenSettingsImpl.cpp virtualbox-hwe-6.1.38-dfsg/src/VBox/Main/src-server/RecordingScreenSettingsImpl.cpp --- virtualbox-hwe-6.1.34-dfsg/src/VBox/Main/src-server/RecordingScreenSettingsImpl.cpp 2022-03-22 23:45:08.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/src/VBox/Main/src-server/RecordingScreenSettingsImpl.cpp 2022-09-01 13:28:33.000000000 +0000 @@ -23,6 +23,7 @@ #include "RecordingSettingsImpl.h" #include "MachineImpl.h" +#include /* For ASMAtomicXXX. */ #include #include #include @@ -41,18 +42,22 @@ { Data() : pParent(NULL) + , cRefs(0) { } RecordingSettings * const pParent; const ComObjPtr pPeer; uint32_t uScreenId; + /** Internal reference count to track sharing of this screen settings object among + * other recording settings objects. */ + int32_t cRefs; // use the XML settings structure in the members for simplicity Backupable bd; }; // constructor / destructor -///////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////// DEFINE_EMPTY_CTOR_DTOR(RecordingScreenSettings) @@ -68,7 +73,7 @@ } // public initializer/uninitializer for internal purposes only -///////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////// /** * Initializes the recording screen settings object. @@ -78,7 +83,6 @@ HRESULT RecordingScreenSettings::init(RecordingSettings *aParent, uint32_t uScreenId, const settings::RecordingScreenSettings& aThat) { - LogFlowThisFuncEnter(); LogFlowThisFunc(("aParent: %p\n", aParent)); ComAssertRet(aParent, E_INVALIDARG); @@ -98,7 +102,7 @@ m->bd.allocate(); m->bd->operator=(aThat); - HRESULT rc = S_OK; + HRESULT hrc = S_OK; int vrc = i_initInternal(); if (RT_SUCCESS(vrc)) @@ -108,11 +112,11 @@ else { autoInitSpan.setFailed(); - rc = E_UNEXPECTED; + hrc = E_UNEXPECTED; } LogFlowThisFuncLeave(); - return rc; + return hrc; } /** @@ -121,11 +125,10 @@ * the object passed as an argument. * * @note This object must be destroyed before the original object - * it shares data with is destroyed. + * it shares data with is destroyed. */ HRESULT RecordingScreenSettings::init(RecordingSettings *aParent, RecordingScreenSettings *aThat) { - LogFlowThisFuncEnter(); LogFlowThisFunc(("aParent: %p, aThat: %p\n", aParent, aThat)); ComAssertRet(aParent && aThat, E_INVALIDARG); @@ -147,7 +150,7 @@ m->uScreenId = aThat->m->uScreenId; m->bd.share(aThat->m->bd); - HRESULT rc = S_OK; + HRESULT hrc = S_OK; int vrc = i_initInternal(); if (RT_SUCCESS(vrc)) @@ -157,11 +160,11 @@ else { autoInitSpan.setFailed(); - rc = E_UNEXPECTED; + hrc = E_UNEXPECTED; } LogFlowThisFuncLeave(); - return rc; + return hrc; } /** @@ -171,7 +174,6 @@ */ HRESULT RecordingScreenSettings::initCopy(RecordingSettings *aParent, RecordingScreenSettings *aThat) { - LogFlowThisFuncEnter(); LogFlowThisFunc(("aParent: %p, aThat: %p\n", aParent, aThat)); ComAssertRet(aParent && aThat, E_INVALIDARG); @@ -193,7 +195,7 @@ m->uScreenId = aThat->m->uScreenId; m->bd.attachCopy(aThat->m->bd); - HRESULT rc = S_OK; + HRESULT hrc = S_OK; int vrc = i_initInternal(); if (RT_SUCCESS(vrc)) @@ -203,11 +205,11 @@ else { autoInitSpan.setFailed(); - rc = E_UNEXPECTED; + hrc = E_UNEXPECTED; } LogFlowThisFuncLeave(); - return rc; + return hrc; } /** @@ -216,13 +218,16 @@ */ void RecordingScreenSettings::uninit() { - LogFlowThisFuncEnter(); + LogThisFunc(("%p\n", this)); /* Enclose the state transition Ready->InUninit->NotReady */ AutoUninitSpan autoUninitSpan(this); if (autoUninitSpan.uninitDone()) return; + /* Make sure nobody holds an internal reference to it anymore. */ + AssertReturnVoid(m->cRefs == 0); + m->bd.free(); unconst(m->pPeer) = NULL; @@ -330,6 +335,8 @@ AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS); m->bd.backup(); + + settings::RecordingFeatureMap featureMapOld = m->bd->featureMap; m->bd->featureMap.clear(); if (aFeatures & RecordingFeature_Audio) @@ -337,7 +344,12 @@ if (aFeatures & RecordingFeature_Video) m->bd->featureMap[RecordingFeature_Video] = true; - alock.release(); + if (m->bd->featureMap != featureMapOld) + { + alock.release(); + + m->pParent->i_onSettingsChanged(); + } return S_OK; } @@ -362,10 +374,18 @@ if (!m->pParent->i_canChangeSettings()) return setError(E_INVALIDARG, tr("Cannot change destination type while recording is enabled")); + if (aDestination != RecordingDestination_File) + return setError(E_INVALIDARG, tr("Destination type invalid / not supported")); + AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS); - m->bd.backup(); - m->bd->enmDest = aDestination; + if (m->bd->enmDest != aDestination) + { + m->bd.backup(); + m->bd->enmDest = aDestination; + + m->pParent->i_onSettingsChanged(); + } return S_OK; } @@ -381,12 +401,15 @@ if ( m->bd->File.strName.isEmpty() || m->bd->File.strName.equals(".")) { - int vrc = m->pParent->i_getDefaultFilename(m->bd->File.strName, true /* fWithFileExtension */); + int vrc = m->pParent->i_getDefaultFilename(aFilename, m->uScreenId, true /* fWithFileExtension */); if (RT_FAILURE(vrc)) - return setError(E_INVALIDARG, tr("Error retrieving default file name")); - } + return setErrorBoth(E_INVALIDARG, vrc, tr("Error retrieving default file name")); - aFilename = m->bd->File.strName; + /* Important: Don't assign the default file name to File.strName, as this woulnd't be considered + * as default settings anymore! */ + } + else /* Return custom file name. */ + aFilename = m->bd->File.strName; return S_OK; } @@ -399,14 +422,33 @@ if (!m->pParent->i_canChangeSettings()) return setError(E_INVALIDARG, tr("Cannot change file name while recording is enabled")); - Utf8Str strFile(aFilename); - if (!RTPathStartsWithRoot(strFile.c_str())) - return setError(E_INVALIDARG, tr("Recording file name '%s' is not absolute"), strFile.c_str()); + if (aFilename.isNotEmpty()) + { + if (!RTPathStartsWithRoot(aFilename.c_str())) + return setError(E_INVALIDARG, tr("Recording file name '%s' is not absolute"), aFilename.c_str()); + } + + /** @todo Add more sanity? */ AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS); - m->bd.backup(); - m->bd->File.strName = strFile; + /* Note: When setting an empty file name, this will return the screen's default file name when using ::getFileName(). */ + if (m->bd->File.strName != aFilename) + { + Utf8Str strName; + int vrc = m->pParent->i_getFilename(strName, m->uScreenId, aFilename); + if (RT_SUCCESS(vrc)) + { + m->bd.backup(); + m->bd->File.strName = strName; + + alock.release(); + + m->pParent->i_onSettingsChanged(); + } + else + return setErrorBoth(E_ACCESSDENIED, vrc, tr("Could not set file name for recording screen")); + } return S_OK; } @@ -433,8 +475,15 @@ AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS); - m->bd.backup(); - m->bd->ulMaxTimeS = aMaxTimeS; + if (m->bd->ulMaxTimeS != aMaxTimeS) + { + m->bd.backup(); + m->bd->ulMaxTimeS = aMaxTimeS; + + alock.release(); + + m->pParent->i_onSettingsChanged(); + } return S_OK; } @@ -461,8 +510,15 @@ AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS); - m->bd.backup(); - m->bd->File.ulMaxSizeMB = aMaxFileSize; + if (m->bd->File.ulMaxSizeMB != aMaxFileSize) + { + m->bd.backup(); + m->bd->File.ulMaxSizeMB = aMaxFileSize; + + alock.release(); + + m->pParent->i_onSettingsChanged(); + } return S_OK; } @@ -489,13 +545,17 @@ AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS); - m->bd.backup(); - m->bd->strOptions = aOptions; - int vrc = RecordingScreenSettings::i_parseOptionsString(aOptions, *m->bd.data()); if (RT_FAILURE(vrc)) return setError(E_INVALIDARG, tr("Invalid option specified")); + m->bd.backup(); + m->bd->strOptions = aOptions; + + alock.release(); + + m->pParent->i_onSettingsChanged(); + return S_OK; } @@ -519,10 +579,20 @@ if (!m->pParent->i_canChangeSettings()) return setError(E_INVALIDARG, tr("Cannot change audio codec while recording is enabled")); + if (aCodec != RecordingAudioCodec_Opus) + return setError(E_INVALIDARG, tr("Audio codec not supported")); + AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS); - m->bd.backup(); - m->bd->Audio.enmAudioCodec = aCodec; + if (m->bd->Audio.enmAudioCodec != aCodec) + { + m->bd.backup(); + m->bd->Audio.enmAudioCodec = aCodec; + + alock.release(); + + m->pParent->i_onSettingsChanged(); + } return S_OK; } @@ -549,8 +619,15 @@ AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS); - m->bd.backup(); - m->bd->Audio.uHz = (uint16_t)aHz; + if (m->bd->Audio.uHz != (uint16_t)aHz) + { + m->bd.backup(); + m->bd->Audio.uHz = (uint16_t)aHz; + + alock.release(); + + m->pParent->i_onSettingsChanged(); + } return S_OK; } @@ -577,8 +654,15 @@ AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS); - m->bd.backup(); - m->bd->Audio.cBits = (uint8_t)aBits; + if (m->bd->Audio.cBits != (uint8_t)aBits) + { + m->bd.backup(); + m->bd->Audio.cBits = (uint8_t)aBits; + + alock.release(); + + m->pParent->i_onSettingsChanged(); + } return S_OK; } @@ -605,8 +689,15 @@ AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS); - m->bd.backup(); - m->bd->Audio.cChannels = (uint8_t)aChannels; + if (m->bd->Audio.cChannels != (uint8_t)aChannels) + { + m->bd.backup(); + m->bd->Audio.cChannels = (uint8_t)aChannels; + + alock.release(); + + m->pParent->i_onSettingsChanged(); + } return S_OK; } @@ -631,10 +722,20 @@ if (!m->pParent->i_canChangeSettings()) return setError(E_INVALIDARG, tr("Cannot change video codec while recording is enabled")); + if (aCodec != RecordingVideoCodec_VP8) + return setError(E_INVALIDARG, tr("Video codec not supported")); + AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS); - m->bd.backup(); - m->bd->Video.enmCodec = aCodec; + if (m->bd->Video.enmCodec != aCodec) + { + m->bd.backup(); + m->bd->Video.enmCodec = aCodec; + + alock.release(); + + m->pParent->i_onSettingsChanged(); + } return S_OK; } @@ -661,8 +762,15 @@ AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS); - m->bd.backup(); - m->bd->Video.ulWidth = aVideoWidth; + if (m->bd->Video.ulWidth != aVideoWidth) + { + m->bd.backup(); + m->bd->Video.ulWidth = aVideoWidth; + + alock.release(); + + m->pParent->i_onSettingsChanged(); + } return S_OK; } @@ -689,8 +797,15 @@ AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS); - m->bd.backup(); - m->bd->Video.ulHeight = aVideoHeight; + if (m->bd->Video.ulHeight != aVideoHeight) + { + m->bd.backup(); + m->bd->Video.ulHeight = aVideoHeight; + + alock.release(); + + m->pParent->i_onSettingsChanged(); + } return S_OK; } @@ -717,8 +832,15 @@ AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS); - m->bd.backup(); - m->bd->Video.ulRate = aVideoRate; + if (m->bd->Video.ulRate != aVideoRate) + { + m->bd.backup(); + m->bd->Video.ulRate = aVideoRate; + + alock.release(); + + m->pParent->i_onSettingsChanged(); + } return S_OK; } @@ -773,8 +895,15 @@ AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS); - m->bd.backup(); - m->bd->Video.ulFPS = aVideoFPS; + if (m->bd->Video.ulFPS != aVideoFPS) + { + m->bd.backup(); + m->bd->Video.ulFPS = aVideoFPS; + + alock.release(); + + m->pParent->i_onSettingsChanged(); + } return S_OK; } @@ -810,22 +939,24 @@ /** * Initializes data, internal version. * - * @returns IPRT status code. + * @returns VBox status code. */ int RecordingScreenSettings::i_initInternal(void) { - Assert(m); + AssertPtrReturn(m, VERR_INVALID_POINTER); + + i_reference(); - int rc = i_parseOptionsString(m->bd->strOptions, *m->bd.data()); - if (RT_FAILURE(rc)) - return rc; + int vrc = i_parseOptionsString(m->bd->strOptions, *m->bd.data()); + if (RT_FAILURE(vrc)) + return vrc; switch (m->bd->enmDest) { case RecordingDestination_File: { - if (m->bd->File.strName.isEmpty()) - rc = m->pParent->i_getDefaultFilename(m->bd->File.strName, true /* fWithExtension */); + /* Note: Leave the file name empty here, which means using the default setting. + * Important when comparing with the default settings! */ break; } @@ -833,7 +964,175 @@ break; } - return rc; + return vrc; +} + + +// public methods only for internal purposes +//////////////////////////////////////////////////////////////////////////////// + +/** + * Loads settings from the given machine node. + * May be called once right after this object creation. + * + * @returns HRESULT + * @param data Configuration settings to load. + */ +HRESULT RecordingScreenSettings::i_loadSettings(const settings::RecordingScreenSettings &data) +{ + AutoCaller autoCaller(this); + AssertComRCReturnRC(autoCaller.rc()); + + AutoReadLock mlock(m->pParent COMMA_LOCKVAL_SRC_POS); + AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS); + + // simply copy + m->bd.assignCopy(&data); + return S_OK; +} + +/** + * Saves settings to the given machine node. + * + * @returns HRESULT + * @param data Configuration settings to save to. + */ +HRESULT RecordingScreenSettings::i_saveSettings(settings::RecordingScreenSettings &data) +{ + LogThisFunc(("%p: Screen %RU32\n", this, m ? m->uScreenId : UINT32_MAX)); + + /* sanity */ + AutoCaller autoCaller(this); + AssertComRCReturnRC(autoCaller.rc()); + + AutoReadLock alock(this COMMA_LOCKVAL_SRC_POS); + + data = *m->bd.data(); + + return S_OK; +} + +void RecordingScreenSettings::i_rollback(void) +{ + AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS); + m->bd.rollback(); +} + +void RecordingScreenSettings::i_commit(void) +{ + /* sanity */ + AutoCaller autoCaller(this); + AssertComRCReturnVoid(autoCaller.rc()); + + /* sanity too */ + AutoCaller peerCaller(m->pPeer); + AssertComRCReturnVoid(peerCaller.rc()); + + /* lock both for writing since we modify both (mPeer is "master" so locked + * first) */ + AutoMultiWriteLock2 alock(m->pPeer, this COMMA_LOCKVAL_SRC_POS); + + if (m->bd.isBackedUp()) + { + m->bd.commit(); + if (m->pPeer) + { + /* attach new data to the peer and reshare it */ + AutoWriteLock peerlock(m->pPeer COMMA_LOCKVAL_SRC_POS); + m->pPeer->m->bd.attach(m->bd); + } + } +} + +void RecordingScreenSettings::i_copyFrom(RecordingScreenSettings *aThat) +{ + AssertReturnVoid(aThat != NULL); + + /* sanity */ + AutoCaller autoCaller(this); + AssertComRCReturnVoid(autoCaller.rc()); + + /* sanity too */ + AutoCaller thatCaller(aThat); + AssertComRCReturnVoid(thatCaller.rc()); + + /* peer is not modified, lock it for reading (aThat is "master" so locked + * first) */ + AutoReadLock rl(aThat COMMA_LOCKVAL_SRC_POS); + AutoWriteLock wl(this COMMA_LOCKVAL_SRC_POS); + + /* this will back up current data */ + m->bd.assignCopy(aThat->m->bd); +} + +/** + * Applies default screen recording settings. + * + * @note Locks this object for writing. + */ +void RecordingScreenSettings::i_applyDefaults(void) +{ + /* sanity */ + AutoCaller autoCaller(this); + AssertComRCReturnVoid(autoCaller.rc()); + + AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS); + + m->bd->applyDefaults(); +} + +settings::RecordingScreenSettings &RecordingScreenSettings::i_getData(void) +{ + /* sanity */ + AutoCaller autoCaller(this); + AssertComRC(autoCaller.rc()); + + AssertPtr(m); + return *m->bd.data(); +} + +/** + * Increments the reference count. + * + * @returns New reference count. + * + * @note Internal reference count, to track object sharing across different recording settings objects + * which share the same screen recording data. + */ +int32_t RecordingScreenSettings::i_reference(void) +{ + int cNewRefs = ASMAtomicIncS32(&m->cRefs); RT_NOREF(cNewRefs); + LogThisFunc(("%p: cRefs -> %RI32\n", this, cNewRefs)); + return cNewRefs; +} + +/** + * Decrements the reference count. + * + * @returns New reference count. + * + * @note Internal reference count, to track object sharing across different recording settings objects + * which share the same screen recording data. + */ +int32_t RecordingScreenSettings::i_release(void) +{ + int32_t cNewRefs = ASMAtomicDecS32(&m->cRefs); RT_NOREF(cNewRefs); + LogThisFunc(("%p: cRefs -> %RI32\n", this, cNewRefs)); + AssertReturn(cNewRefs >= 0, 0); + return cNewRefs; +} + +/** + * Returns the current reference count. + * + * @returns Current reference count. + * + * @note Internal reference count, to track object sharing across different recording settings objects + * which share the same screen recording data. + */ +int32_t RecordingScreenSettings::i_getReferences(void) +{ + return ASMAtomicReadS32(&m->cRefs); } /** diff -Nru virtualbox-hwe-6.1.34-dfsg/src/VBox/Main/src-server/RecordingSettingsImpl.cpp virtualbox-hwe-6.1.38-dfsg/src/VBox/Main/src-server/RecordingSettingsImpl.cpp --- virtualbox-hwe-6.1.34-dfsg/src/VBox/Main/src-server/RecordingSettingsImpl.cpp 2022-03-22 23:45:08.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/src/VBox/Main/src-server/RecordingSettingsImpl.cpp 2022-09-01 13:28:33.000000000 +0000 @@ -42,12 +42,12 @@ : pMachine(NULL) { } - Machine * const pMachine; - const ComObjPtr pPeer; - RecordScreenSettingsMap mapScreenObj; + Machine * const pMachine; + const ComObjPtr pPeer; + RecordingScreenSettingsObjMap mapScreenObj; // use the XML settings structure in the members for simplicity - Backupable bd; + Backupable bd; }; DEFINE_EMPTY_CTOR_DTOR(RecordingSettings) @@ -86,6 +86,8 @@ m->bd.allocate(); + i_applyDefaults(); + autoInitSpan.setSucceeded(); LogFlowThisFuncLeave(); @@ -98,7 +100,7 @@ * the object passed as an argument. * * @note This object must be destroyed before the original object - * it shares data with is destroyed. + * it shares data with is destroyed. * * @note Locks @a aThat object for reading. */ @@ -124,6 +126,13 @@ AutoReadLock thatlock(aThat COMMA_LOCKVAL_SRC_POS); m->bd.share(aThat->m->bd); + + /* Make sure to add a reference when sharing the screen objects with aThat. */ + for (RecordingScreenSettingsObjMap::const_iterator itScreenThat = aThat->m->mapScreenObj.begin(); + itScreenThat != aThat->m->mapScreenObj.end(); + ++itScreenThat) + itScreenThat->second->i_reference(); + m->mapScreenObj = aThat->m->mapScreenObj; autoInitSpan.setSucceeded(); @@ -156,14 +165,34 @@ // mPeer is left null AutoReadLock thatlock(aThat COMMA_LOCKVAL_SRC_POS); - m->bd.attachCopy(aThat->m->bd); - m->mapScreenObj = aThat->m->mapScreenObj; - autoInitSpan.setSucceeded(); + HRESULT hrc = S_OK; + + for (RecordingScreenSettingsObjMap::const_iterator itScreenThat = aThat->m->mapScreenObj.begin(); + itScreenThat != aThat->m->mapScreenObj.end(); + ++itScreenThat) + { + ComObjPtr pSettings; + pSettings.createObject(); + hrc = pSettings->initCopy(this, itScreenThat->second); + if (FAILED(hrc)) return hrc; + + try + { + m->mapScreenObj[itScreenThat->first] = pSettings; + } + catch (...) + { + hrc = E_OUTOFMEMORY; + } + } + + if (SUCCEEDED(hrc)) + autoInitSpan.setSucceeded(); LogFlowThisFuncLeave(); - return S_OK; + return hrc; } /** @@ -179,8 +208,9 @@ if (autoUninitSpan.uninitDone()) return; - /* Note: Do *not* call i_reset() here, as the shared recording configuration - * otherwise gets destructed when this object goes out of scope or is destroyed. */ + /* Make sure to destroy screen objects attached to this object. + * Note: This also decrements the refcount of a screens object, in case it's shared among other recording settings. */ + i_destroyAllScreenObj(m->mapScreenObj); m->bd.free(); @@ -228,7 +258,7 @@ if (FAILED(rc)) { /* - * Normally we would do the actual change _after_ i_onCaptureChange() succeeded. + * Normally we would do the actual change _after_ i_onRecordingChange() succeeded. * We cannot do this because that function uses RecordSettings::GetEnabled to * determine if it should start or stop capturing. Therefore we need to manually * undo change. @@ -269,22 +299,34 @@ AutoReadLock alock(this COMMA_LOCKVAL_SRC_POS); - aRecordScreenSettings.clear(); - aRecordScreenSettings.resize(m->mapScreenObj.size()); + HRESULT hrc = S_OK; - RecordScreenSettingsMap::const_iterator itScreenSettings = m->mapScreenObj.begin(); + try + { + aRecordScreenSettings.clear(); + aRecordScreenSettings.resize(m->mapScreenObj.size()); + } + catch (...) + { + hrc = E_OUTOFMEMORY; + } + + if (FAILED(hrc)) + return hrc; + + RecordingScreenSettingsObjMap::const_iterator itScreenObj = m->mapScreenObj.begin(); size_t i = 0; - while (itScreenSettings != m->mapScreenObj.end()) + while (itScreenObj != m->mapScreenObj.end()) { - itScreenSettings->second.queryInterfaceTo(aRecordScreenSettings[i].asOutParam()); - Assert(aRecordScreenSettings[i].isNotNull()); + itScreenObj->second.queryInterfaceTo(aRecordScreenSettings[i].asOutParam()); + AssertBreakStmt(aRecordScreenSettings[i].isNotNull(), hrc = E_POINTER); ++i; - ++itScreenSettings; + ++itScreenObj; } Assert(aRecordScreenSettings.size() == m->mapScreenObj.size()); - return S_OK; + return hrc; } HRESULT RecordingSettings::getScreenSettings(ULONG uScreenId, ComPtr &aRecordScreenSettings) @@ -305,10 +347,10 @@ if (uScreenId + 1 > m->mapScreenObj.size()) return setError(E_INVALIDARG, tr("Invalid screen ID specified")); - RecordScreenSettingsMap::const_iterator itScreenSettings = m->mapScreenObj.find(uScreenId); - if (itScreenSettings != m->mapScreenObj.end()) + RecordingScreenSettingsObjMap::const_iterator itScreen = m->mapScreenObj.find(uScreenId); + if (itScreen != m->mapScreenObj.end()) { - itScreenSettings->second.queryInterfaceTo(aRecordScreenSettings.asOutParam()); + itScreen->second.queryInterfaceTo(aRecordScreenSettings.asOutParam()); return S_OK; } @@ -326,32 +368,26 @@ * * @returns IPRT status code. VERR_ALREADY_EXISTS if the object in question already exists. * @param screenSettingsMap Map to add screen settings to. - * @param uScreenId Screen ID to add settings for. + * @param idScreen Screen ID to add settings for. * @param data Recording screen settings to use for that screen. */ -int RecordingSettings::i_createScreenObj(RecordScreenSettingsMap &screenSettingsMap, - uint32_t uScreenId, const settings::RecordingScreenSettings &data) +int RecordingSettings::i_createScreenObj(RecordingScreenSettingsObjMap &screenSettingsMap, + uint32_t idScreen, const settings::RecordingScreenSettings &data) { - LogFlowThisFunc(("Screen %RU32\n", uScreenId)); - - if (screenSettingsMap.find(uScreenId) != screenSettingsMap.end()) - { - AssertFailed(); - return VERR_ALREADY_EXISTS; - } + AssertReturn(screenSettingsMap.find(idScreen) == screenSettingsMap.end(), VERR_ALREADY_EXISTS); int vrc = VINF_SUCCESS; ComObjPtr recordingScreenSettings; - HRESULT rc = recordingScreenSettings.createObject(); - if (SUCCEEDED(rc)) + HRESULT hrc = recordingScreenSettings.createObject(); + if (SUCCEEDED(hrc)) { - rc = recordingScreenSettings->init(this, uScreenId, data); - if (SUCCEEDED(rc)) + hrc = recordingScreenSettings->init(this, idScreen, data); + if (SUCCEEDED(hrc)) { try { - screenSettingsMap[uScreenId] = recordingScreenSettings; + screenSettingsMap[idScreen] = recordingScreenSettings; } catch (std::bad_alloc &) { @@ -360,28 +396,26 @@ } } + LogThisFunc(("%p: Screen %RU32 -> %Rrc\n", recordingScreenSettings.m_p, idScreen, vrc)); return vrc; } /** * Removes a screen settings object from a particular map. * - * @returns IPRT status code. VERR_NOT_FOUND if specified screen was not found. + * If the internal reference count hits 0, the screen settings object will be destroyed. + * This means that this screen settings object is not being used anymore by other recording settings (as shared data). + * + * @returns IPRT status code. + * @retval VERR_NOT_FOUND if specified screen was not found. * @param screenSettingsMap Map to remove screen settings from. - * @param uScreenId ID of screen to remove. + * @param idScreen ID of screen to remove. */ -int RecordingSettings::i_destroyScreenObj(RecordScreenSettingsMap &screenSettingsMap, uint32_t uScreenId) +int RecordingSettings::i_destroyScreenObj(RecordingScreenSettingsObjMap &screenSettingsMap, uint32_t idScreen) { - LogFlowThisFunc(("Screen %RU32\n", uScreenId)); + AssertReturn(screenSettingsMap.find(idScreen) != screenSettingsMap.end(), VERR_NOT_FOUND); - AssertReturn(uScreenId > 0, VERR_INVALID_PARAMETER); /* Removing screen 0 isn't a good idea. */ - - RecordScreenSettingsMap::iterator itScreen = screenSettingsMap.find(uScreenId); - if (itScreen == screenSettingsMap.end()) - { - AssertFailed(); - return VERR_NOT_FOUND; - } + RecordingScreenSettingsObjMap::iterator itScreen = screenSettingsMap.find(idScreen); /* Make sure to consume the pointer before the one of the * iterator gets released. */ @@ -389,7 +423,16 @@ screenSettingsMap.erase(itScreen); - pScreenSettings.setNull(); + LogThisFunc(("%p: Screen %RU32, cRefs=%RI32\n", pScreenSettings.m_p, idScreen, pScreenSettings->i_getReferences())); + + pScreenSettings->i_release(); + + /* Only destroy the object if nobody else keeps a reference to it anymore. */ + if (pScreenSettings->i_getReferences() == 0) + { + LogThisFunc(("%p: Screen %RU32 -> Null\n", pScreenSettings.m_p, idScreen)); + pScreenSettings.setNull(); + } return VINF_SUCCESS; } @@ -400,26 +443,24 @@ * @returns IPRT status code. * @param screenSettingsMap Map to destroy screen settings objects for. */ -int RecordingSettings::i_destroyAllScreenObj(RecordScreenSettingsMap &screenSettingsMap) +int RecordingSettings::i_destroyAllScreenObj(RecordingScreenSettingsObjMap &screenSettingsMap) { LogFlowThisFuncEnter(); - RecordScreenSettingsMap::iterator itScreen = screenSettingsMap.begin(); + int vrc = VINF_SUCCESS; + + RecordingScreenSettingsObjMap::iterator itScreen = screenSettingsMap.begin(); while (itScreen != screenSettingsMap.end()) { - /* Make sure to consume the pointer before the one of the - * iterator gets released. */ - ComObjPtr pScreenSettings = itScreen->second; - - screenSettingsMap.erase(itScreen); - - pScreenSettings.setNull(); + vrc = i_destroyScreenObj(screenSettingsMap, itScreen->first); + if (RT_FAILURE(vrc)) + break; itScreen = screenSettingsMap.begin(); } Assert(screenSettingsMap.size() == 0); - return VINF_SUCCESS; + return vrc; } /** @@ -439,37 +480,45 @@ AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS); - HRESULT rc = S_OK; - - i_reset(); + HRESULT hrc = S_OK; LogFlowThisFunc(("Data has %zu screens\n", data.mapScreens.size())); - settings::RecordingScreenMap::const_iterator itScreen = data.mapScreens.begin(); - while (itScreen != data.mapScreens.end()) + settings::RecordingScreenSettingsMap::const_iterator itScreenData = data.mapScreens.begin(); + while (itScreenData != data.mapScreens.end()) { - int vrc = i_createScreenObj(m->mapScreenObj, - itScreen->first /* uScreenId */, itScreen->second /* Settings */); - if (RT_FAILURE(vrc)) + RecordingScreenSettingsObjMap::iterator itScreen = m->mapScreenObj.find(itScreenData->first); + if (itScreen != m->mapScreenObj.end()) { - rc = E_OUTOFMEMORY; - break; + hrc = itScreen->second->i_loadSettings(itScreenData->second); + if (FAILED(hrc)) + break; + } + else + { + int vrc = i_createScreenObj(m->mapScreenObj, + itScreenData->first /* uScreenId */, itScreenData->second /* Settings */); + if (RT_FAILURE(vrc)) + { + hrc = E_OUTOFMEMORY; /* Most likely. */ + break; + } } - ++itScreen; + ++itScreenData; } - if (FAILED(rc)) - return rc; - - ComAssertComRC(rc); - Assert(m->mapScreenObj.size() == data.mapScreens.size()); + if (SUCCEEDED(hrc)) + { + ComAssertComRCRet(hrc, hrc); + AssertReturn(m->mapScreenObj.size() == data.mapScreens.size(), E_UNEXPECTED); - // simply copy - m->bd.assignCopy(&data); + // simply copy + m->bd.assignCopy(&data.common); + } - LogFlowThisFunc(("Returning %Rhrc\n", rc)); - return rc; + LogFlowThisFunc(("Returning %Rhrc\n", hrc)); + return hrc; } /** @@ -480,7 +529,6 @@ LogFlowThisFuncEnter(); i_destroyAllScreenObj(m->mapScreenObj); - m->bd->mapScreens.clear(); } /** @@ -509,32 +557,42 @@ AutoReadLock alock(this COMMA_LOCKVAL_SRC_POS); - data = *m->bd.data(); + data.common = *m->bd.data(); - settings::RecordingScreenMap::iterator itScreen = data.mapScreens.begin(); - while (itScreen != data.mapScreens.end()) + HRESULT hrc = S_OK; + + for (RecordingScreenSettingsObjMap::const_iterator itScreen = m->mapScreenObj.begin(); + itScreen != m->mapScreenObj.end(); + ++itScreen) { - /* Store relative path of capture file if possible. */ - m->pMachine->i_copyPathRelativeToMachine(itScreen->second.File.strName /* Source */, - itScreen->second.File.strName /* Target */); - ++itScreen; + hrc = itScreen->second->i_saveSettings(data.mapScreens[itScreen->first /* Screen ID */]); + if (FAILED(hrc)) + break; } LogFlowThisFuncLeave(); - return S_OK; + return hrc; } -void RecordingSettings::i_rollback() +void RecordingSettings::i_rollback(void) { /* sanity */ AutoCaller autoCaller(this); AssertComRCReturnVoid(autoCaller.rc()); AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS); + m->bd.rollback(); + + for (RecordingScreenSettingsObjMap::const_iterator itScreen = m->mapScreenObj.begin(); + itScreen != m->mapScreenObj.end(); + ++itScreen) + { + itScreen->second->i_rollback(); + } } -void RecordingSettings::i_commit() +void RecordingSettings::i_commit(void) { /* sanity */ AutoCaller autoCaller(this); @@ -556,20 +614,29 @@ /* attach new data to the peer and reshare it */ m->pPeer->m->bd.attach(m->bd); } + + for (RecordingScreenSettingsObjMap::const_iterator itScreenObj = m->mapScreenObj.begin(); + itScreenObj != m->mapScreenObj.end(); + ++itScreenObj) + { + itScreenObj->second->i_commit(); + if (m->pPeer) + m->pPeer->i_commit(); + } } } -void RecordingSettings::i_copyFrom(RecordingSettings *aThat) +HRESULT RecordingSettings::i_copyFrom(RecordingSettings *aThat) { - AssertReturnVoid(aThat != NULL); + AssertPtrReturn(aThat, E_INVALIDARG); /* sanity */ AutoCaller autoCaller(this); - AssertComRCReturnVoid(autoCaller.rc()); + AssertComRCReturn(autoCaller.rc(), VBOX_E_INVALID_OBJECT_STATE); /* sanity too */ AutoCaller thatCaller(aThat); - AssertComRCReturnVoid(thatCaller.rc()); + AssertComRCReturn(thatCaller.rc(), VBOX_E_INVALID_OBJECT_STATE); /* peer is not modified, lock it for reading (aThat is "master" so locked * first) */ @@ -578,6 +645,31 @@ /* this will back up current data */ m->bd.assignCopy(aThat->m->bd); + + HRESULT hrc = S_OK; + + for (RecordingScreenSettingsObjMap::const_iterator itScreenThat = aThat->m->mapScreenObj.begin(); + itScreenThat != aThat->m->mapScreenObj.end(); + ++itScreenThat) + { + RecordingScreenSettingsObjMap::iterator itScreen = m->mapScreenObj.find(itScreenThat->first); + if (itScreen != m->mapScreenObj.end()) + { + itScreen->second->i_copyFrom(itScreenThat->second); + } + else + { + int vrc = i_createScreenObj(m->mapScreenObj, + itScreenThat->first /* uScreenId */, itScreenThat->second->i_getData() /* Settings */); + if (RT_FAILURE(vrc)) + { + hrc = E_OUTOFMEMORY; /* Most likely. */ + break; + } + } + } + + return hrc; } void RecordingSettings::i_applyDefaults(void) @@ -605,16 +697,65 @@ } /** - * Returns the full path to the default video capture file. + * Returns the full path to the default recording file. + * + * @returns VBox status code. + * @param strFile Where to return the final file name on success. + * @param idScreen Screen ID the file is associated to. + * @param fWithFileExtension Whether to include the default file extension ('.webm') or not. */ -int RecordingSettings::i_getDefaultFilename(Utf8Str &strFile, bool fWithFileExtension) +int RecordingSettings::i_getDefaultFilename(Utf8Str &strFile, uint32_t idScreen, bool fWithFileExtension) { AutoReadLock alock(this COMMA_LOCKVAL_SRC_POS); strFile = m->pMachine->i_getSettingsFileFull(); // path/to/machinesfolder/vmname/vmname.vbox - strFile.stripSuffix(); // path/to/machinesfolder/vmname/vmname + strFile.stripSuffix(); + strFile.append(Utf8StrFmt("-screen%RU32", idScreen)); if (fWithFileExtension) - strFile.append(".webm"); // path/to/machinesfolder/vmname/vmname.webm + strFile.append(".webm"); + + return VINF_SUCCESS; +} + +/** + * Gets a standardized file name from a given template file name. + * + * @returns VBox status code. + * @param strFile Where to return the final file name on success. + * @param idScreen Screen ID the file is associated to. + * @param strTemplate Template file name to use. + * A default file name will be used when empty. + */ +int RecordingSettings::i_getFilename(Utf8Str &strFile, uint32_t idScreen, const Utf8Str &strTemplate) +{ + strFile = strTemplate; + + if (strFile.isEmpty()) + return i_getDefaultFilename(strFile, idScreen, true /* fWithFileExtension */); + + /* We force adding a .webm suffix to (hopefully) not let the user overwrite other important stuff. */ + strFile.stripSuffix(); + + Utf8Str strDotExt = ".webm"; + + /* We also force adding the screen id suffix, at least for the moment, as FE/Qt only offers settings a single file name + * for *all* enabled screens. */ + char szSuffScreen[] = "-screen"; + Utf8Str strSuff = Utf8StrFmt("%s%RU32", szSuffScreen, idScreen); + if (!strFile.endsWith(strSuff, Utf8Str::CaseInsensitive)) + { + /** @todo The following line checks whether there already is a screen suffix, as FE/Qt currently always works with + * screen 0 as the file name. Remove the following if block when FE/Qt supports this properly. */ + Utf8Str strSuffScreen0 = Utf8StrFmt("%s%RU32", szSuffScreen, 0); + if (strFile.endsWith(strSuffScreen0, Utf8Str::CaseInsensitive)) + strFile.truncate(strFile.length() - strSuffScreen0.length()); + + strFile += strSuff; /* Add the suffix with the correct screen ID. */ + } + + strFile += strDotExt; + + LogRel2(("Recording: File name '%s' -> '%s'\n", strTemplate.c_str(), strFile.c_str())); return VINF_SUCCESS; } @@ -660,46 +801,40 @@ /** * Synchronizes the screen settings (COM) objects and configuration data * to the number of the machine's configured displays. + * + * Note: This function ASSUMES that we always have configured VM displays + * as a consequtive sequence with no holes in between. */ -int RecordingSettings::i_syncToMachineDisplays(uint32_t cMonitors) +int RecordingSettings::i_syncToMachineDisplays(uint32_t cDisplays) { AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS); - LogFlowThisFunc(("cMonitors=%RU32\n", cMonitors)); - LogFlowThisFunc(("Data screen count = %zu, COM object count = %zu\n", m->bd->mapScreens.size(), m->mapScreenObj.size())); + LogThisFunc(("%p: cDisplays=%RU32 vs. %zu\n", this, cDisplays, m->mapScreenObj.size())); /* If counts match, take a shortcut. */ - if (cMonitors == m->mapScreenObj.size()) + if (cDisplays == m->mapScreenObj.size()) return VINF_SUCCESS; /* Create all new screen settings objects which are not there yet. */ - for (ULONG i = 0; i < cMonitors; i++) + for (ULONG i = 0; i < cDisplays; i++) { if (m->mapScreenObj.find(i) == m->mapScreenObj.end()) { - settings::RecordingScreenMap::const_iterator itScreen = m->bd->mapScreens.find(i); - if (itScreen == m->bd->mapScreens.end()) - { - settings::RecordingScreenSettings defaultScreenSettings; /* Apply default settings. */ - m->bd->mapScreens[i] = defaultScreenSettings; - } + settings::RecordingScreenSettings defaultScreenSettings(i /* Screen ID */); /* Apply default settings. */ - int vrc2 = i_createScreenObj(m->mapScreenObj, i /* Screen ID */, m->bd->mapScreens[i]); + int vrc2 = i_createScreenObj(m->mapScreenObj, i /* Screen ID */, defaultScreenSettings); AssertRC(vrc2); } } /* Remove all left over screen settings objects which are not needed anymore. */ - const ULONG cSettings = (ULONG)m->mapScreenObj.size(); - for (ULONG i = cMonitors; i < cSettings; i++) + for (ULONG i = cDisplays; i < (ULONG)m->mapScreenObj.size(); i++) { - m->bd->mapScreens.erase(i); int vrc2 = i_destroyScreenObj(m->mapScreenObj, i /* Screen ID */); AssertRC(vrc2); } - Assert(m->mapScreenObj.size() == cMonitors); - Assert(m->bd->mapScreens.size() == cMonitors); + Assert(m->mapScreenObj.size() == cDisplays); LogFlowThisFuncLeave(); return VINF_SUCCESS; diff -Nru virtualbox-hwe-6.1.34-dfsg/src/VBox/Main/src-server/SnapshotImpl.cpp virtualbox-hwe-6.1.38-dfsg/src/VBox/Main/src-server/SnapshotImpl.cpp --- virtualbox-hwe-6.1.34-dfsg/src/VBox/Main/src-server/SnapshotImpl.cpp 2022-03-22 23:45:08.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/src/VBox/Main/src-server/SnapshotImpl.cpp 2022-09-01 13:28:33.000000000 +0000 @@ -818,10 +818,7 @@ else data.strStateFile.setNull(); - HRESULT rc = m->pMachine->i_saveHardware(data.hardware, &data.debugging, &data.autostart); - if (FAILED(rc)) return rc; - - return S_OK; + return m->pMachine->i_saveHardware(data.hardware, &data.debugging, &data.autostart, data.recordingSettings); } /** @@ -1223,6 +1220,7 @@ * @param hardware hardware settings * @param pDbg debuging settings * @param pAutostart autostart settings + * @param recording recording settings * @param aSnapshotId snapshot ID of this snapshot machine * @param aStateFilePath file where the execution state is saved * (or NULL for the offline snapshot) @@ -1233,6 +1231,7 @@ const settings::Hardware &hardware, const settings::Debugging *pDbg, const settings::Autostart *pAutostart, + const settings::RecordingSettings &recording, IN_GUID aSnapshotId, const Utf8Str &aStateFilePath) { @@ -1316,7 +1315,7 @@ mBandwidthControl->init(this); /* load hardware and storage settings */ - HRESULT rc = i_loadHardware(NULL, &mSnapshotId, hardware, pDbg, pAutostart); + HRESULT rc = i_loadHardware(NULL, &mSnapshotId, hardware, pDbg, pAutostart, recording); if (SUCCEEDED(rc)) /* commit all changes made during the initialization */ diff -Nru virtualbox-hwe-6.1.34-dfsg/src/VBox/Main/testcase/tstGuestCtrlParseBuffer.cpp virtualbox-hwe-6.1.38-dfsg/src/VBox/Main/testcase/tstGuestCtrlParseBuffer.cpp --- virtualbox-hwe-6.1.34-dfsg/src/VBox/Main/testcase/tstGuestCtrlParseBuffer.cpp 2022-03-22 23:45:10.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/src/VBox/Main/testcase/tstGuestCtrlParseBuffer.cpp 2022-09-01 13:28:35.000000000 +0000 @@ -39,7 +39,7 @@ /********************************************************************************************************************************* * Defined Constants And Macros * *********************************************************************************************************************************/ -#define STR_SIZE(a_sz) a_sz, sizeof(a_sz) +#define STR_SIZE(a_sz) RT_STR_TUPLE(a_sz) /********************************************************************************************************************************* @@ -64,11 +64,11 @@ { const char *pbData; size_t cbData; - uint32_t uOffsetStart; - uint32_t uOffsetAfter; - uint32_t uMapElements; + uint32_t offStart; + uint32_t offAfter; + uint32_t cMapElements; int iResult; -} g_aTestBlock[] = +} g_aTestBlocks[] = { /* * Single object parsing. @@ -118,10 +118,10 @@ const char *pbData; size_t cbData; /** Number of data blocks retrieved. These are separated by "\0\0". */ - uint32_t uNumBlocks; + uint32_t cBlocks; /** Overall result when done parsing. */ int iResult; -} g_aTestStream[] = +} const g_aTestStream[] = { /* No blocks. */ { "\0\0\0\0", sizeof("\0\0\0\0"), 0, VERR_NO_DATA }, @@ -139,11 +139,11 @@ { const char *pbData; size_t cbData; - uint32_t uOffsetStart; - uint32_t uOffsetAfter; - uint32_t uMapElements; + uint32_t offStart; + uint32_t offAfter; + uint32_t cMapElements; int iResult; - } s_aTest[] = + } const s_aTest[] = { { "test5=test5\0t51=t51", sizeof("test5=test5\0t51=t51"), 0, sizeof("test5=test5\0") - 1, 1, VERR_MORE_DATA }, { "\0\0test5=test5\0t51=t51", sizeof("\0\0test5=test5\0t51=t51"), 0, sizeof("\0\0test5=test5\0") - 1, 1, VERR_MORE_DATA }, @@ -174,9 +174,9 @@ int main() { RTTEST hTest; - int rc = RTTestInitAndCreate("tstParseBuffer", &hTest); - if (rc) - return rc; + RTEXITCODE rcExit = RTTestInitAndCreate("tstParseBuffer", &hTest); + if (rcExit != RTEXITCODE_SUCCESS) + return rcExit; RTTestBanner(hTest); RTTestIPrintf(RTTESTLVL_DEBUG, "Initializing COM...\n"); @@ -187,65 +187,42 @@ return RTEXITCODE_FAILURE; } -#ifdef DEBUG_andy - rc = manualTest(); -#endif - - RTTestIPrintf(RTTESTLVL_INFO, "Doing basic tests ...\n"); - - if (sizeof("sizecheck") != 10) - RTTestFailed(hTest, "Basic size test #1 failed (%u <-> 10)", sizeof("sizecheck")); - if (sizeof("off=rab") != 8) - RTTestFailed(hTest, "Basic size test #2 failed (%u <-> 7)", sizeof("off=rab")); - if (sizeof("off=rab\0\0") != 10) - RTTestFailed(hTest, "Basic size test #3 failed (%u <-> 10)", sizeof("off=rab\0\0")); - - RTTestIPrintf(RTTESTLVL_INFO, "Doing line tests ...\n"); - - /* Don't let the assertions trigger here - * -- we rely on the return values in the test(s) below. */ - RTAssertSetQuiet(true); + AssertCompile(sizeof("sizecheck") == 10); + AssertCompile(sizeof("off=rab") == 8); + AssertCompile(sizeof("off=rab\0\0") == 10); - unsigned iTest; - for (iTest = 0; iTest < RT_ELEMENTS(g_aTestBlock); iTest++) + RTTestSub(hTest, "Lines"); + for (unsigned iTest = 0; iTest < RT_ELEMENTS(g_aTestBlocks); iTest++) { RTTestIPrintf(RTTESTLVL_DEBUG, "=> Test #%u\n", iTest); GuestProcessStream stream; - int iResult = stream.AddData((BYTE*)g_aTestBlock[iTest].pbData, g_aTestBlock[iTest].cbData); + if (RT_FAILURE(g_aTestBlocks[iTest].iResult)) + RTTestDisableAssertions(hTest); + int iResult = stream.AddData((BYTE *)g_aTestBlocks[iTest].pbData, g_aTestBlocks[iTest].cbData); + if (RT_FAILURE(g_aTestBlocks[iTest].iResult)) + RTTestRestoreAssertions(hTest); if (RT_SUCCESS(iResult)) { GuestProcessStreamBlock curBlock; iResult = stream.ParseBlock(curBlock); - if (iResult != g_aTestBlock[iTest].iResult) - { - RTTestFailed(hTest, "\tReturned %Rrc, expected %Rrc\n", - iResult, g_aTestBlock[iTest].iResult); - } - else if (stream.GetOffset() != g_aTestBlock[iTest].uOffsetAfter) - { - RTTestFailed(hTest, "\tOffset %zu wrong, expected %u\n", - stream.GetOffset(), g_aTestBlock[iTest].uOffsetAfter); - } + if (iResult != g_aTestBlocks[iTest].iResult) + RTTestFailed(hTest, "Block #%u: Returned %Rrc, expected %Rrc", iTest, iResult, g_aTestBlocks[iTest].iResult); + else if (stream.GetOffset() != g_aTestBlocks[iTest].offAfter) + RTTestFailed(hTest, "Block #%uOffset %zu wrong, expected %u\n", + iTest, stream.GetOffset(), g_aTestBlocks[iTest].offAfter); else if (iResult == VERR_MORE_DATA) - { RTTestIPrintf(RTTESTLVL_DEBUG, "\tMore data (Offset: %zu)\n", stream.GetOffset()); - } - if ( ( RT_SUCCESS(iResult) - || iResult == VERR_MORE_DATA)) - { - if (curBlock.GetCount() != g_aTestBlock[iTest].uMapElements) - { - RTTestFailed(hTest, "\tMap has %u elements, expected %u\n", - curBlock.GetCount(), g_aTestBlock[iTest].uMapElements); - } - } + if (RT_SUCCESS(iResult) || iResult == VERR_MORE_DATA) + if (curBlock.GetCount() != g_aTestBlocks[iTest].cMapElements) + RTTestFailed(hTest, "Block #%u: Map has %u elements, expected %u\n", + iTest, curBlock.GetCount(), g_aTestBlocks[iTest].cMapElements); /* There is remaining data left in the buffer (which needs to be merged * with a following buffer) -- print it. */ size_t off = stream.GetOffset(); - size_t cbToWrite = g_aTestBlock[iTest].cbData - off; + size_t cbToWrite = g_aTestBlocks[iTest].cbData - off; if (cbToWrite) { RTTestIPrintf(RTTESTLVL_DEBUG, "\tRemaining (%u):\n", cbToWrite); @@ -253,14 +230,13 @@ /* How to properly get the current RTTESTLVL (aka IPRT_TEST_MAX_LEVEL) here? * Hack alert: Using RTEnvGet for now. */ if (!RTStrICmp(RTEnvGet("IPRT_TEST_MAX_LEVEL"), "debug")) - RTStrmWriteEx(g_pStdOut, &g_aTestBlock[iTest].pbData[off], cbToWrite - 1, NULL); + RTStrmWriteEx(g_pStdOut, &g_aTestBlocks[iTest].pbData[off], cbToWrite - 1, NULL); } } } - RTTestIPrintf(RTTESTLVL_INFO, "Doing block tests ...\n"); - - for (iTest = 0; iTest < RT_ELEMENTS(g_aTestStream); iTest++) + RTTestSub(hTest, "Blocks"); + for (unsigned iTest = 0; iTest < RT_ELEMENTS(g_aTestStream); iTest++) { RTTestIPrintf(RTTESTLVL_DEBUG, "=> Block test #%u\n", iTest); @@ -268,36 +244,30 @@ int iResult = stream.AddData((BYTE*)g_aTestStream[iTest].pbData, g_aTestStream[iTest].cbData); if (RT_SUCCESS(iResult)) { - uint32_t uNumBlocks = 0; + uint32_t cBlocks = 0; uint8_t uSafeCouunter = 0; do { GuestProcessStreamBlock curBlock; iResult = stream.ParseBlock(curBlock); - RTTestIPrintf(RTTESTLVL_DEBUG, "\tReturned with %Rrc\n", iResult); + RTTestIPrintf(RTTESTLVL_DEBUG, "Block #%u: Returned with %Rrc", iTest, iResult); if (RT_SUCCESS(iResult)) { /* Only count block which have at least one pair. */ if (curBlock.GetCount()) - uNumBlocks++; + cBlocks++; } if (uSafeCouunter++ > 32) break; } while (RT_SUCCESS(iResult)); if (iResult != g_aTestStream[iTest].iResult) - { - RTTestFailed(hTest, "\tReturned %Rrc, expected %Rrc\n", - iResult, g_aTestStream[iTest].iResult); - } - else if (uNumBlocks != g_aTestStream[iTest].uNumBlocks) - { - RTTestFailed(hTest, "\tReturned %u blocks, expected %u\n", - uNumBlocks, g_aTestStream[iTest].uNumBlocks); - } + RTTestFailed(hTest, "Block #%uReturned %Rrc, expected %Rrc", iTest, iResult, g_aTestStream[iTest].iResult); + else if (cBlocks != g_aTestStream[iTest].cBlocks) + RTTestFailed(hTest, "Block #%uReturned %u blocks, expected %u", iTest, cBlocks, g_aTestStream[iTest].cBlocks); } else - RTTestFailed(hTest, "\tAdding data failed with %Rrc", iResult); + RTTestFailed(hTest, "Block #%u: Adding data failed with %Rrc", iTest, iResult); } RTTestIPrintf(RTTESTLVL_DEBUG, "Shutting down COM...\n"); diff -Nru virtualbox-hwe-6.1.34-dfsg/src/VBox/Main/testcase/tstOVF.cpp virtualbox-hwe-6.1.38-dfsg/src/VBox/Main/testcase/tstOVF.cpp --- virtualbox-hwe-6.1.34-dfsg/src/VBox/Main/testcase/tstOVF.cpp 2022-03-22 23:45:10.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/src/VBox/Main/testcase/tstOVF.cpp 2022-09-01 13:28:35.000000000 +0000 @@ -194,6 +194,10 @@ pcszType = "scsi"; break; + case VirtualSystemDescriptionType_HardDiskControllerVirtioSCSI: + pcszType = "virtio-scsi"; + break; + case VirtualSystemDescriptionType_HardDiskImage: pcszType = "hd"; break; diff -Nru virtualbox-hwe-6.1.34-dfsg/src/VBox/Main/webservice/Makefile.kmk virtualbox-hwe-6.1.38-dfsg/src/VBox/Main/webservice/Makefile.kmk --- virtualbox-hwe-6.1.34-dfsg/src/VBox/Main/webservice/Makefile.kmk 2022-03-22 23:45:10.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/src/VBox/Main/webservice/Makefile.kmk 2022-09-01 13:28:35.000000000 +0000 @@ -220,7 +220,8 @@ vboxsoap_CXXFLAGS.win += -bigobj vboxsoap_CXXFLAGS.win += -wd4702 # soapc-4.cpp(16) : warning C4702: unreachable code ifn1of ($(KBUILD_TARGET), win) - vboxsoap_CXXFLAGS += -Wno-shadow -Wno-parentheses $(VBOX_GCC_Wno-literal-suffix) $(VBOX_GCC_Wno-stringop-overflow) $(VBOX_GCC_Wno-stringop-truncation) + vboxsoap_CXXFLAGS += -Wno-shadow -Wno-parentheses $(VBOX_GCC_Wno-literal-suffix) \ + $(VBOX_GCC_Wno-stringop-overflow) $(VBOX_GCC_Wno-stringop-truncation) $(VBOX_GCC_fno-printf-return-value) ifn1of ($(KBUILD_TYPE), debug) # Save time+memory by using -O0 instead of -O2. vboxsoap_CXXFLAGS += -O0 ## @todo this could be interesting for g++ (not clang++): -fcprop-registers endif diff -Nru virtualbox-hwe-6.1.34-dfsg/src/VBox/Main/xml/ovfreader.cpp virtualbox-hwe-6.1.38-dfsg/src/VBox/Main/xml/ovfreader.cpp --- virtualbox-hwe-6.1.34-dfsg/src/VBox/Main/xml/ovfreader.cpp 2022-03-22 23:45:11.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/src/VBox/Main/xml/ovfreader.cpp 2022-09-01 13:28:36.000000000 +0000 @@ -661,6 +661,15 @@ vsys.mapControllers[i.ulInstanceID] = hdc; } + else if ( i.strResourceSubType.compare("VirtioSCSI", RTCString::CaseInsensitive) == 0 ) + { + HardDiskController hdc; + hdc.system = HardDiskController::VIRTIOSCSI; + hdc.idController = i.ulInstanceID; + //VirtioSCSI + hdc.strControllerType = i.strResourceSubType; + vsys.mapControllers[i.ulInstanceID] = hdc; + } else throw OVFLogicError(N_("Error reading \"%s\": Host resource of type \"Other Storage Device (%d)\" is supported with SATA AHCI controllers only, line %d (subtype:%s)"), m_strPath.c_str(), diff -Nru virtualbox-hwe-6.1.34-dfsg/src/VBox/Main/xml/Settings.cpp virtualbox-hwe-6.1.38-dfsg/src/VBox/Main/xml/Settings.cpp --- virtualbox-hwe-6.1.34-dfsg/src/VBox/Main/xml/Settings.cpp 2022-03-22 23:45:11.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/src/VBox/Main/xml/Settings.cpp 2022-09-01 13:28:36.000000000 +0000 @@ -2587,7 +2587,8 @@ && strNVRAMPath == d.strNVRAMPath); } -RecordingScreenSettings::RecordingScreenSettings(void) +RecordingScreenSettings::RecordingScreenSettings(uint32_t a_idScreen /* = UINT32_MAX */) + : idScreen(a_idScreen) { applyDefaults(); } @@ -2598,6 +2599,18 @@ } /** + * Returns the default options string for screen recording settings. + * + * @returns Default options string for a given screen. + */ +/* static */ +const char *RecordingScreenSettings::getDefaultOptions(void) +{ + /* Note: Needs to be kept in sync with FE/Qt's UIMachineSettingsDisplay::putToCache()! */ + return "vc_enabled=true,ac_enabled=false,ac_profile=med"; +} + +/** * Applies the default settings. */ void RecordingScreenSettings::applyDefaults(void) @@ -2606,21 +2619,27 @@ * Set sensible defaults. */ - fEnabled = false; - enmDest = RecordingDestination_File; - ulMaxTimeS = 0; - strOptions = ""; - File.ulMaxSizeMB = 0; - File.strName = ""; - Video.enmCodec = RecordingVideoCodec_VP8; - Video.ulWidth = 1024; - Video.ulHeight = 768; - Video.ulRate = 512; - Video.ulFPS = 25; - Audio.enmAudioCodec = RecordingAudioCodec_Opus; - Audio.cBits = 16; - Audio.cChannels = 2; - Audio.uHz = 22050; + /* + * Enable screen 0 by default. + * Otherwise enabling recording without any screen enabled at all makes no sense. + * + * Note: When tweaking this, make sure to also alter RecordingScreenSettings::areDefaultSettings(). + */ + fEnabled = idScreen == 0 ? true : false; + enmDest = RecordingDestination_File; + ulMaxTimeS = 0; + strOptions = RecordingScreenSettings::getDefaultOptions(); + File.ulMaxSizeMB = 0; + File.strName = ""; + Video.enmCodec = RecordingVideoCodec_VP8; + Video.ulWidth = 1024; + Video.ulHeight = 768; + Video.ulRate = 512; + Video.ulFPS = 25; + Audio.enmAudioCodec = RecordingAudioCodec_Opus; + Audio.cBits = 16; + Audio.cChannels = 2; + Audio.uHz = 22050; featureMap[RecordingFeature_Video] = true; featureMap[RecordingFeature_Audio] = false; /** @todo Audio is not yet enabled by default. */ @@ -2628,24 +2647,32 @@ /** * Check if all settings have default values. + * + * @returns \c true if default, \c false if not. */ bool RecordingScreenSettings::areDefaultSettings(void) const { - return fEnabled == false - && enmDest == RecordingDestination_File - && ulMaxTimeS == 0 - && strOptions == "" - && File.ulMaxSizeMB == 0 - && File.strName == "" - && Video.enmCodec == RecordingVideoCodec_VP8 - && Video.ulWidth == 1024 - && Video.ulHeight == 768 - && Video.ulRate == 512 - && Video.ulFPS == 25 - && Audio.enmAudioCodec == RecordingAudioCodec_Opus - && Audio.cBits == 16 - && Audio.cChannels == 2 - && Audio.uHz == 22050; + return ( fEnabled == false + /* Screen 0 is special: There we ALWAYS enable recording by default. */ + || ( idScreen == 0 + && fEnabled == true) + ) + && enmDest == RecordingDestination_File + && ulMaxTimeS == 0 + && strOptions == RecordingScreenSettings::getDefaultOptions() + && File.ulMaxSizeMB == 0 + && File.strName == "" + && Video.enmCodec == RecordingVideoCodec_VP8 + && Video.ulWidth == 1024 + && Video.ulHeight == 768 + && Video.ulRate == 512 + && Video.ulFPS == 25 + && Audio.enmAudioCodec == RecordingAudioCodec_Opus + && Audio.cBits == 16 + && Audio.cChannels == 2 + && Audio.uHz == 22050 + && featureMap.find(RecordingFeature_Video)->second == true + && featureMap.find(RecordingFeature_Audio)->second == false; } /** @@ -2675,6 +2702,7 @@ && featureMap == d.featureMap && ulMaxTimeS == d.ulMaxTimeS && strOptions == d.strOptions + && File.strName == d.File.strName && File.ulMaxSizeMB == d.File.ulMaxSizeMB && Video.enmCodec == d.Video.enmCodec && Video.ulWidth == d.Video.ulWidth @@ -2684,7 +2712,45 @@ && Audio.enmAudioCodec == d.Audio.enmAudioCodec && Audio.cBits == d.Audio.cBits && Audio.cChannels == d.Audio.cChannels - && Audio.uHz == d.Audio.uHz; + && Audio.uHz == d.Audio.uHz + && featureMap == d.featureMap; +} + +/** + * Constructor. Needs to set sane defaults which stand the test of time. + */ +RecordingCommonSettings::RecordingCommonSettings() +{ + applyDefaults(); +} + +/** + * Applies the default settings. + */ +void RecordingCommonSettings::applyDefaults(void) +{ + fEnabled = false; +} + +/** + * Check if all settings have default values. + */ +bool RecordingCommonSettings::areDefaultSettings(void) const +{ + return fEnabled == false; +} + +/** + * Comparison operator. This gets called from MachineConfigFile::operator==, + * which in turn gets called from Machine::saveSettings to figure out whether + * machine settings have really changed and thus need to be written out to disk. + */ +bool RecordingCommonSettings::operator==(const RecordingCommonSettings &d) const +{ + if (this == &d) + return true; + + return fEnabled == d.fEnabled; } /** @@ -2700,16 +2766,16 @@ */ void RecordingSettings::applyDefaults(void) { - fEnabled = false; + common.applyDefaults(); mapScreens.clear(); try { /* Always add screen 0 to the default configuration. */ - RecordingScreenSettings screenSettings; /* Apply default settings for screen 0. */ - screenSettings.fEnabled = true; /* Enabled by default. */ - mapScreens[0] = screenSettings; + RecordingScreenSettings screenSettings(0 /* Screen ID */); + + mapScreens[0 /* Screen ID */] = screenSettings; } catch (std::bad_alloc &) { @@ -2720,16 +2786,22 @@ /** * Check if all settings have default values. */ -bool RecordingSettings::areDefaultSettings() const +bool RecordingSettings::areDefaultSettings(void) const { - const bool fDefault = fEnabled == false - && mapScreens.size() == 1; - if (!fDefault) + AssertReturn(mapScreens.size() >= 1, false); /* The first screen always must be present. */ + + if (!common.areDefaultSettings()) return false; - RecordingScreenMap::const_iterator itScreen = mapScreens.begin(); - return itScreen->first == 0 - && itScreen->second.areDefaultSettings(); + RecordingScreenSettingsMap::const_iterator itScreen = mapScreens.begin(); + while (itScreen != mapScreens.end()) + { + if (!itScreen->second.areDefaultSettings()) + return false; + ++itScreen; + } + + return true; } /** @@ -2737,20 +2809,26 @@ * which in turn gets called from Machine::saveSettings to figure out whether * machine settings have really changed and thus need to be written out to disk. */ -bool RecordingSettings::operator==(const RecordingSettings &d) const +bool RecordingSettings::operator==(const RecordingSettings &that) const { - if (this == &d) + if (this == &that) /* If pointers match, take a shortcut. */ return true; - if ( fEnabled != d.fEnabled - || mapScreens.size() != d.mapScreens.size()) + if (common == that.common) + { + /* Too lazy for a != operator. */ + } + else return false; - RecordingScreenMap::const_iterator itScreen = mapScreens.begin(); - uint32_t i = 0; - while (itScreen != mapScreens.end()) + if (mapScreens.size() != that.mapScreens.size()) + return false; + + RecordingScreenSettingsMap::const_iterator itScreen = mapScreens.begin(); + RecordingScreenSettingsMap::const_iterator itScreenThat = that.mapScreens.begin(); + while ( itScreen != mapScreens.end() + && itScreenThat != that.mapScreens.end()) { - RecordingScreenMap::const_iterator itScreenThat = d.mapScreens.find(i); if (itScreen->second == itScreenThat->second) { /* Nothing to do in here (yet). */ @@ -2759,7 +2837,7 @@ return false; ++itScreen; - ++i; + ++itScreenThat; } return true; @@ -3659,6 +3737,7 @@ && RTTimeSpecIsEqual(×tamp, &s.timestamp) && strStateFile == s.strStateFile && hardware == s.hardware // deep compare + && recordingSettings == s.recordingSettings // deep compare && llChildSnapshots == s.llChildSnapshots // deep compare && debugging == s.debugging && autostart == s.autostart); @@ -3818,7 +3897,8 @@ && hardwareMachine == c.hardwareMachine // this one's deep && mediaRegistry == c.mediaRegistry // this one's deep // skip mapExtraDataItems! there is no old state available as it's always forced - && llFirstSnapshot == c.llFirstSnapshot); // this one's deep + && llFirstSnapshot == c.llFirstSnapshot // this one's deep + && recordingSettings == c.recordingSettings); // this one's deep); } /** @@ -4294,6 +4374,12 @@ aa.driverType = AudioDriverType_CoreAudio; else if (strTemp == "MMPM") aa.driverType = AudioDriverType_MMPM; + else if (strTemp == "DEFAULT") /* Kludge for setttings >= 1.19 (VBox 7.0). */ + { + /* We don't have AudioDriverType_Default in 6.1, so just use the default audio driver here. + * The default driver will be serialized the next time the settings will be written out. */ + aa.driverType = getHostDefaultAudioDriver(); + } else throw ConfigFileError(this, &elmAudioAdapter, N_("Invalid value '%s' in AudioAdapter/@driver attribute"), strTemp.c_str()); @@ -4348,8 +4434,8 @@ * For legacy pre-1.7 settings we also need a storage structure because * the IDE and SATA controllers used to be defined under \. * - * @param elmHardware - * @param hw + * @param elmHardware Hardware node to read from. + * @param hw Where to store the hardware settings. */ void MachineConfigFile::readHardware(const xml::ElementNode &elmHardware, Hardware &hw) @@ -4689,38 +4775,6 @@ pelmHwChild->getAttributeValue("Accelerate3D", hw.graphicsAdapter.fAccelerate3D); // pre-v1.5 variant pelmHwChild->getAttributeValue("accelerate2DVideo", hw.graphicsAdapter.fAccelerate2DVideo); } - else if (pelmHwChild->nameEquals("VideoCapture")) - { - pelmHwChild->getAttributeValue("enabled", hw.recordingSettings.fEnabled); - - /* Right now I don't want to bump the settings version, so just convert the enabled - * screens to the former uint64t_t bit array and vice versa. */ - uint64_t u64VideoCaptureScreens; - pelmHwChild->getAttributeValue("screens", u64VideoCaptureScreens); - - /* At the moment we only support one capturing configuration, that is, all screens - * have the same configuration. So load/save to/from screen 0. */ - Assert(hw.recordingSettings.mapScreens.size()); /* At least screen must be present. */ - RecordingScreenSettings &screen0Settings = hw.recordingSettings.mapScreens[0]; - - pelmHwChild->getAttributeValue("maxTime", screen0Settings.ulMaxTimeS); - pelmHwChild->getAttributeValue("options", screen0Settings.strOptions); - pelmHwChild->getAttributeValuePath("file", screen0Settings.File.strName); - pelmHwChild->getAttributeValue("maxSize", screen0Settings.File.ulMaxSizeMB); - pelmHwChild->getAttributeValue("horzRes", screen0Settings.Video.ulWidth); - pelmHwChild->getAttributeValue("vertRes", screen0Settings.Video.ulHeight); - pelmHwChild->getAttributeValue("rate", screen0Settings.Video.ulRate); - pelmHwChild->getAttributeValue("fps", screen0Settings.Video.ulFPS); - - for (unsigned i = 0; i < hw.graphicsAdapter.cMonitors; i++) /* Don't add more settings than we have monitors configured. */ - { - /* Add screen i to config in any case. */ - hw.recordingSettings.mapScreens[i] = screen0Settings; - - if (u64VideoCaptureScreens & RT_BIT_64(i)) /* Screen i enabled? */ - hw.recordingSettings.mapScreens[i].fEnabled = true; - } - } else if (pelmHwChild->nameEquals("RemoteDisplay")) { pelmHwChild->getAttributeValue("enabled", hw.vrdeSettings.fEnabled); @@ -5528,6 +5582,44 @@ } /** + * Called for reading the \ element under \, + * or \ under \, + */ +void MachineConfigFile::readRecordingSettings(const xml::ElementNode &elmRecording, uint32_t cMonitors, RecordingSettings &recording) +{ + if (cMonitors > 64) + throw ConfigFileError(this, &elmRecording, N_("Invalid monitor count given")); + + elmRecording.getAttributeValue("enabled", recording.common.fEnabled); + + RecordingScreenSettings &screen0 = recording.mapScreens[0]; + + elmRecording.getAttributeValue("maxTime", screen0.ulMaxTimeS); + elmRecording.getAttributeValue("options", screen0.strOptions); + elmRecording.getAttributeValuePath("file", screen0.File.strName); + elmRecording.getAttributeValue("maxSize", screen0.File.ulMaxSizeMB); + elmRecording.getAttributeValue("horzRes", screen0.Video.ulWidth); + elmRecording.getAttributeValue("vertRes", screen0.Video.ulHeight); + elmRecording.getAttributeValue("rate", screen0.Video.ulRate); + elmRecording.getAttributeValue("fps", screen0.Video.ulFPS); + + /* Convert the enabled screens to the former uint64_t bit array and vice versa. */ + uint64_t uScreensBitmap = 0; + elmRecording.getAttributeValue("screens", uScreensBitmap); + + /* Note: For settings < 1.19 the "screens" attribute is a bit field for all screens + * which are ENABLED for recording. The settings for recording are for all the same though. */ + for (unsigned i = 0; i < cMonitors; i++) + { + /* Apply settings of screen 0 to screen i and enable it. */ + recording.mapScreens[i] = screen0; + + /* Screen i enabled? */ + recording.mapScreens[i].fEnabled = RT_BOOL(uScreensBitmap & RT_BIT_64(i)); + } +} + +/** * Called for reading the \ element under \. */ void MachineConfigFile::readGroups(const xml::ElementNode *pElmGroups, StringsList *pllGroups) @@ -5601,6 +5693,10 @@ throw ConfigFileError(this, &elmSnapshot, N_("Required Snapshot/@Hardware element is missing")); readHardware(*pelmHardware, snap.hardware); + const xml::ElementNode *pelmVideoCapture = elmSnapshot.findChildElement("VideoCapture"); + if (pelmVideoCapture) + readRecordingSettings(*pelmVideoCapture, snap.hardware.graphicsAdapter.cMonitors, snap.recordingSettings); + xml::NodesLoop nlSnapshotChildren(elmSnapshot); const xml::ElementNode *pelmSnapshotChild; while ((pelmSnapshotChild = nlSnapshotChildren.forAllNodes())) @@ -5801,6 +5897,8 @@ readDebugging(pelmMachineChild, &debugging); else if (pelmMachineChild->nameEquals("Autostart")) readAutostart(pelmMachineChild, &autostart); + else if (pelmMachineChild->nameEquals("VideoCapture")) + readRecordingSettings(*pelmMachineChild, hardwareMachine.graphicsAdapter.cMonitors, recordingSettings); else if (pelmMachineChild->nameEquals("Groups")) readGroups(pelmMachineChild, &machineUserData.llGroups); } @@ -6129,55 +6227,6 @@ } } - if (m->sv >= SettingsVersion_v1_14 && !hw.recordingSettings.areDefaultSettings()) - { - xml::ElementNode *pelmVideoCapture = pelmHardware->createChild("VideoCapture"); - - if (hw.recordingSettings.fEnabled) - pelmVideoCapture->setAttribute("enabled", hw.recordingSettings.fEnabled); - - /* Right now I don't want to bump the settings version, so just convert the enabled - * screens to the former uint64t_t bit array and vice versa. */ - uint64_t u64VideoCaptureScreens = 0; - RecordingScreenMap::const_iterator itScreen = hw.recordingSettings.mapScreens.begin(); - while (itScreen != hw.recordingSettings.mapScreens.end()) - { - if (itScreen->second.fEnabled) - u64VideoCaptureScreens |= RT_BIT_64(itScreen->first); - ++itScreen; - } - - if (u64VideoCaptureScreens) - pelmVideoCapture->setAttribute("screens", u64VideoCaptureScreens); - - /* At the moment we only support one capturing configuration, that is, all screens - * have the same configuration. So load/save to/from screen 0. */ - Assert(hw.recordingSettings.mapScreens.size()); - const RecordingScreenMap::const_iterator itScreen0Settings = hw.recordingSettings.mapScreens.find(0); - Assert(itScreen0Settings != hw.recordingSettings.mapScreens.end()); - - if (itScreen0Settings->second.ulMaxTimeS) - pelmVideoCapture->setAttribute("maxTime", itScreen0Settings->second.ulMaxTimeS); - if (itScreen0Settings->second.strOptions.isNotEmpty()) - pelmVideoCapture->setAttributePath("options", itScreen0Settings->second.strOptions); - - if (!itScreen0Settings->second.File.strName.isEmpty()) - pelmVideoCapture->setAttributePath("file", itScreen0Settings->second.File.strName); - if (itScreen0Settings->second.File.ulMaxSizeMB) - pelmVideoCapture->setAttribute("maxSize", itScreen0Settings->second.File.ulMaxSizeMB); - - if ( itScreen0Settings->second.Video.ulWidth != 1024 - || itScreen0Settings->second.Video.ulHeight != 768) - { - pelmVideoCapture->setAttribute("horzRes", itScreen0Settings->second.Video.ulWidth); - pelmVideoCapture->setAttribute("vertRes", itScreen0Settings->second.Video.ulHeight); - } - if (itScreen0Settings->second.Video.ulRate != 512) - pelmVideoCapture->setAttribute("rate", itScreen0Settings->second.Video.ulRate); - if (itScreen0Settings->second.Video.ulFPS) - pelmVideoCapture->setAttribute("fps", itScreen0Settings->second.Video.ulFPS); - } - if (!hw.vrdeSettings.areDefaultSettings(m->sv)) { xml::ElementNode *pelmVRDE = pelmHardware->createChild("RemoteDisplay"); @@ -7298,6 +7347,58 @@ pElmAutostart->setAttribute("autostop", pcszAutostop); } +void MachineConfigFile::buildRecordingXML(xml::ElementNode &elmParent, const RecordingSettings &recording) +{ + if (recording.areDefaultSettings()) /* Omit branch if we still have the default settings (i.e. nothing to save). */ + return; + + AssertReturnVoid(recording.mapScreens.size() <= 64); /* Make sure we never exceed the bitmap of 64 monitors. */ + + /* Note: elmParent is Hardware or Snapshot. */ + xml::ElementNode *pelmVideoCapture = elmParent.createChild("VideoCapture"); + + if (recording.common.fEnabled) + pelmVideoCapture->setAttribute("enabled", recording.common.fEnabled); + + /* Convert the enabled screens to the former uint64_t bit array and vice versa. */ + uint64_t uScreensBitmap = 0; + RecordingScreenSettingsMap::const_iterator itScreen = recording.mapScreens.begin(); + while (itScreen != recording.mapScreens.end()) + { + if (itScreen->second.fEnabled) + uScreensBitmap |= RT_BIT_64(itScreen->first); + ++itScreen; + } + + if (uScreensBitmap) + pelmVideoCapture->setAttribute("screens", uScreensBitmap); + + Assert(recording.mapScreens.size()); + const RecordingScreenSettingsMap::const_iterator itScreen0Settings = recording.mapScreens.find(0); + Assert(itScreen0Settings != recording.mapScreens.end()); + + if (itScreen0Settings->second.ulMaxTimeS) + pelmVideoCapture->setAttribute("maxTime", itScreen0Settings->second.ulMaxTimeS); + if (itScreen0Settings->second.strOptions.isNotEmpty()) + pelmVideoCapture->setAttributePath("options", itScreen0Settings->second.strOptions); + + if (!itScreen0Settings->second.File.strName.isEmpty()) + pelmVideoCapture->setAttributePath("file", itScreen0Settings->second.File.strName); + if (itScreen0Settings->second.File.ulMaxSizeMB) + pelmVideoCapture->setAttribute("maxSize", itScreen0Settings->second.File.ulMaxSizeMB); + + if ( itScreen0Settings->second.Video.ulWidth != 1024 + || itScreen0Settings->second.Video.ulHeight != 768) + { + pelmVideoCapture->setAttribute("horzRes", itScreen0Settings->second.Video.ulWidth); + pelmVideoCapture->setAttribute("vertRes", itScreen0Settings->second.Video.ulHeight); + } + if (itScreen0Settings->second.Video.ulRate != 512) + pelmVideoCapture->setAttribute("rate", itScreen0Settings->second.Video.ulRate); + if (itScreen0Settings->second.Video.ulFPS) + pelmVideoCapture->setAttribute("fps", itScreen0Settings->second.Video.ulFPS); +} + /** * Creates a \ node under elmParent and then writes out the XML * keys under that. Called for the \ node only. @@ -7354,6 +7455,7 @@ buildHardwareXML(*pelmSnapshot, snap.hardware, 0 /* fl */, NULL /* pllElementsWithUuidAttributes */); buildDebuggingXML(pelmSnapshot, &snap.debugging); buildAutostartXML(pelmSnapshot, &snap.autostart); + buildRecordingXML(*pelmSnapshot, snap.recordingSettings); // note: Groups exist only for Machine, not for Snapshot if (snap.llChildSnapshots.size()) @@ -7505,6 +7607,7 @@ buildHardwareXML(elmMachine, hardwareMachine, fl, pllElementsWithUuidAttributes); buildDebuggingXML(&elmMachine, &debugging); buildAutostartXML(&elmMachine, &autostart); + buildRecordingXML(elmMachine, recordingSettings); buildGroupsXML(&elmMachine, &machineUserData.llGroups); } @@ -7810,7 +7913,7 @@ || hardwareMachine.graphicsAdapter.graphicsControllerType != GraphicsControllerType_VBoxVGA || hardwareMachine.enmLongMode != Hardware::LongMode_Legacy || machineUserData.ovIcon.size() > 0 - || hardwareMachine.recordingSettings.fEnabled) + || recordingSettings.common.fEnabled) { m->sv = SettingsVersion_v1_14; return; diff -Nru virtualbox-hwe-6.1.34-dfsg/src/VBox/Runtime/common/asn1/asn1-encode.cpp virtualbox-hwe-6.1.38-dfsg/src/VBox/Runtime/common/asn1/asn1-encode.cpp --- virtualbox-hwe-6.1.34-dfsg/src/VBox/Runtime/common/asn1/asn1-encode.cpp 2022-03-22 23:45:17.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/src/VBox/Runtime/common/asn1/asn1-encode.cpp 2022-09-01 13:28:43.000000000 +0000 @@ -35,6 +35,7 @@ #include #include #include +#include #include #include @@ -474,3 +475,51 @@ return RTAsn1EncodeWrite(pRoot, fFlags, rtAsn1EncodeToBufferCallback, &Args, pErrInfo); } + +RTDECL(int) RTAsn1EncodeQueryRawBits(PRTASN1CORE pRoot, const uint8_t **ppbRaw, uint32_t *pcbRaw, + void **ppvFree, PRTERRINFO pErrInfo) +{ + /* + * ASSUME that if we've got pointers here, they are valid... + */ + if ( pRoot->uData.pv + && !(pRoot->fFlags & RTASN1CORE_F_INDEFINITE_LENGTH) /* BER, not DER. */ + && (pRoot->fFlags & RTASN1CORE_F_DECODED_CONTENT) ) + { + /** @todo Check that it's DER encoding. */ + *ppbRaw = RTASN1CORE_GET_RAW_ASN1_PTR(pRoot); + *pcbRaw = RTASN1CORE_GET_RAW_ASN1_SIZE(pRoot); + *ppvFree = NULL; + return VINF_SUCCESS; + } + + /* + * Encode it into a temporary heap buffer. + */ + uint32_t cbEncoded = 0; + int rc = RTAsn1EncodePrepare(pRoot, RTASN1ENCODE_F_DER, &cbEncoded, pErrInfo); + if (RT_SUCCESS(rc)) + { + void *pvEncoded = RTMemTmpAllocZ(cbEncoded); + if (pvEncoded) + { + rc = RTAsn1EncodeToBuffer(pRoot, RTASN1ENCODE_F_DER, pvEncoded, cbEncoded, pErrInfo); + if (RT_SUCCESS(rc)) + { + *ppvFree = pvEncoded; + *ppbRaw = (unsigned char *)pvEncoded; + *pcbRaw = cbEncoded; + return VINF_SUCCESS; + } + RTMemTmpFree(pvEncoded); + } + else + rc = RTErrInfoSetF(pErrInfo, VERR_NO_TMP_MEMORY, "RTMemTmpAllocZ(%u)", cbEncoded); + } + + *ppvFree = NULL; + *ppbRaw = NULL; + *pcbRaw = 0; + return rc; +} + diff -Nru virtualbox-hwe-6.1.34-dfsg/src/VBox/Runtime/common/asn1/asn1-ut-bitstring.cpp virtualbox-hwe-6.1.38-dfsg/src/VBox/Runtime/common/asn1/asn1-ut-bitstring.cpp --- virtualbox-hwe-6.1.34-dfsg/src/VBox/Runtime/common/asn1/asn1-ut-bitstring.cpp 2022-03-22 23:45:18.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/src/VBox/Runtime/common/asn1/asn1-ut-bitstring.cpp 2022-09-01 13:28:43.000000000 +0000 @@ -344,6 +344,26 @@ } +RTDECL(int) RTAsn1BitString_InitWithData(PRTASN1BITSTRING pThis, void const *pvSrc, uint32_t cSrcBits, + PCRTASN1ALLOCATORVTABLE pAllocator) +{ + RTAsn1BitString_Init(pThis, pAllocator); + Assert(pThis->pEncapsulated == NULL); + + uint32_t cbToCopy = (cSrcBits + 7) / 8; + int rc = RTAsn1ContentAllocZ(&pThis->Asn1Core, cbToCopy + 1, pAllocator); + if (RT_SUCCESS(rc)) + { + pThis->cBits = cSrcBits; + uint8_t *pbDst = (uint8_t *)pThis->Asn1Core.uData.pu8; + pThis->uBits.pv = pbDst + 1; + *pbDst = 8 - (cSrcBits & 7); /* unused bits */ + memcpy(pbDst + 1, pvSrc, cbToCopy); + } + return rc; +} + + RTDECL(int) RTAsn1BitString_Clone(PRTASN1BITSTRING pThis, PCRTASN1BITSTRING pSrc, PCRTASN1ALLOCATORVTABLE pAllocator) { AssertPtr(pSrc); AssertPtr(pThis); AssertPtr(pAllocator); diff -Nru virtualbox-hwe-6.1.34-dfsg/src/VBox/Runtime/common/asn1/asn1-ut-core.cpp virtualbox-hwe-6.1.38-dfsg/src/VBox/Runtime/common/asn1/asn1-ut-core.cpp --- virtualbox-hwe-6.1.34-dfsg/src/VBox/Runtime/common/asn1/asn1-ut-core.cpp 2022-03-22 23:45:18.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/src/VBox/Runtime/common/asn1/asn1-ut-core.cpp 2022-09-01 13:28:43.000000000 +0000 @@ -136,13 +136,13 @@ RTDECL(int) RTAsn1Core_CloneContent(PRTASN1CORE pThis, PCRTASN1CORE pSrc, PCRTASN1ALLOCATORVTABLE pAllocator) { - return rtAsn1Core_CloneEx(pThis, pSrc, pAllocator, true /*fConpyContent*/); + return rtAsn1Core_CloneEx(pThis, pSrc, pAllocator, true /*fCopyContent*/); } RTDECL(int) RTAsn1Core_CloneNoContent(PRTASN1CORE pThis, PCRTASN1CORE pSrc) { - return rtAsn1Core_CloneEx(pThis, pSrc, NULL, false /*fConpyContent*/); + return rtAsn1Core_CloneEx(pThis, pSrc, NULL, false /*fCopyContent*/); } diff -Nru virtualbox-hwe-6.1.34-dfsg/src/VBox/Runtime/common/asn1/asn1-ut-dyntype.cpp virtualbox-hwe-6.1.38-dfsg/src/VBox/Runtime/common/asn1/asn1-ut-dyntype.cpp --- virtualbox-hwe-6.1.34-dfsg/src/VBox/Runtime/common/asn1/asn1-ut-dyntype.cpp 2022-03-22 23:45:18.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/src/VBox/Runtime/common/asn1/asn1-ut-dyntype.cpp 2022-09-01 13:28:43.000000000 +0000 @@ -102,6 +102,14 @@ } +RTDECL(int) RTAsn1DynType_SetToNull(PRTASN1DYNTYPE pThis) +{ + RTAsn1DynType_Delete(pThis); + pThis->enmType = RTASN1TYPE_NULL; + return RTAsn1Null_Init(&pThis->u.Asn1Null, NULL /*pAllocator*/); +} + + RTDECL(int) RTAsn1DynType_Enum(PRTASN1DYNTYPE pThis, PFNRTASN1ENUMCALLBACK pfnCallback, uint32_t uDepth, void *pvUser) { if ( pThis diff -Nru virtualbox-hwe-6.1.34-dfsg/src/VBox/Runtime/common/asn1/asn1-ut-integer.cpp virtualbox-hwe-6.1.38-dfsg/src/VBox/Runtime/common/asn1/asn1-ut-integer.cpp --- virtualbox-hwe-6.1.34-dfsg/src/VBox/Runtime/common/asn1/asn1-ut-integer.cpp 2022-03-22 23:45:18.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/src/VBox/Runtime/common/asn1/asn1-ut-integer.cpp 2022-09-01 13:28:43.000000000 +0000 @@ -339,7 +339,7 @@ } -RTDECL(int) RTAsn1Integer_ToString(PRTASN1INTEGER pThis, char *pszBuf, size_t cbBuf, uint32_t fFlags, size_t *pcbActual) +RTDECL(int) RTAsn1Integer_ToString(PCRTASN1INTEGER pThis, char *pszBuf, size_t cbBuf, uint32_t fFlags, size_t *pcbActual) { AssertReturn(RTAsn1Integer_IsPresent(pThis), VERR_INVALID_PARAMETER); AssertReturn(fFlags == 0, VERR_INVALID_FLAGS); diff -Nru virtualbox-hwe-6.1.34-dfsg/src/VBox/Runtime/common/asn1/asn1-ut-objid.cpp virtualbox-hwe-6.1.38-dfsg/src/VBox/Runtime/common/asn1/asn1-ut-objid.cpp --- virtualbox-hwe-6.1.34-dfsg/src/VBox/Runtime/common/asn1/asn1-ut-objid.cpp 2022-03-22 23:45:18.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/src/VBox/Runtime/common/asn1/asn1-ut-objid.cpp 2022-09-01 13:28:43.000000000 +0000 @@ -336,6 +336,16 @@ } +RTDECL(int) RTAsn1ObjId_SetFromString(PRTASN1OBJID pThis, const char *pszObjId, PCRTASN1ALLOCATORVTABLE pAllocator) +{ + RTAsn1ObjId_Delete(pThis); + int rc = RTAsn1ObjId_InitFromString(pThis, pszObjId, pAllocator); + if (RT_FAILURE(rc)) + RTAsn1ObjId_Init(pThis, pAllocator); + return rc; +} + + RTDECL(int) RTAsn1ObjId_CompareWithString(PCRTASN1OBJID pThis, const char *pszRight) { return strcmp(pThis->szObjId, pszRight); diff -Nru virtualbox-hwe-6.1.34-dfsg/src/VBox/Runtime/common/asn1/asn1-ut-octetstring.cpp virtualbox-hwe-6.1.38-dfsg/src/VBox/Runtime/common/asn1/asn1-ut-octetstring.cpp --- virtualbox-hwe-6.1.34-dfsg/src/VBox/Runtime/common/asn1/asn1-ut-octetstring.cpp 2022-03-22 23:45:18.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/src/VBox/Runtime/common/asn1/asn1-ut-octetstring.cpp 2022-09-01 13:28:43.000000000 +0000 @@ -126,6 +126,27 @@ } +RTDECL(int) RTAsn1OctetString_AllocContent(PRTASN1OCTETSTRING pThis, void const *pvSrc, size_t cb, + PCRTASN1ALLOCATORVTABLE pAllocator) +{ + AssertReturn(!pThis->pEncapsulated, VERR_INVALID_STATE); + int rc; + if (pvSrc) + rc = RTAsn1ContentDup(&pThis->Asn1Core, pvSrc, cb, pAllocator); + else + rc = RTAsn1ContentAllocZ(&pThis->Asn1Core, cb, pAllocator); + return rc; +} + + +RTDECL(int) RTAsn1OctetString_SetContent(PRTASN1OCTETSTRING pThis, void const *pvSrc, size_t cbSrc, + PCRTASN1ALLOCATORVTABLE pAllocator) +{ + AssertPtrReturn(pvSrc, VERR_INVALID_POINTER); + return RTAsn1OctetString_AllocContent(pThis, pvSrc, cbSrc, pAllocator); +} + + RTDECL(bool) RTAsn1OctetString_AreContentBytesValid(PCRTASN1OCTETSTRING pThis, uint32_t fFlags) { if (pThis->pEncapsulated) diff -Nru virtualbox-hwe-6.1.34-dfsg/src/VBox/Runtime/common/asn1/asn1-ut-time.cpp virtualbox-hwe-6.1.38-dfsg/src/VBox/Runtime/common/asn1/asn1-ut-time.cpp --- virtualbox-hwe-6.1.34-dfsg/src/VBox/Runtime/common/asn1/asn1-ut-time.cpp 2022-03-22 23:45:18.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/src/VBox/Runtime/common/asn1/asn1-ut-time.cpp 2022-09-01 13:28:43.000000000 +0000 @@ -71,10 +71,94 @@ pThis->Asn1Core.cb = sizeof(g_szEpochGeneralized) - 1; pThis->Asn1Core.uData.pv = &g_szEpochGeneralized[0]; } + + RTTIMESPEC EpochTimeSpec; + RTTimeExplode(&pThis->Time, RTTimeSpecSetSeconds(&EpochTimeSpec, 0)); + return VINF_SUCCESS; } +RTDECL(int) RTAsn1Time_InitWithTime(PRTASN1TIME pThis, uint32_t uTag, PCRTASN1ALLOCATORVTABLE pAllocator, PCRTTIME pTime) +{ + int rc = RTAsn1Time_InitEx(pThis, uTag, pAllocator); /* this doens't leave any state needing deletion */ + if (RT_SUCCESS(rc) && pTime) + rc = RTAsn1Time_SetTime(pThis, pAllocator, pTime); + return rc; +} + + +RTDECL(int) RTAsn1Time_SetTime(PRTASN1TIME pThis, PCRTASN1ALLOCATORVTABLE pAllocator, PCRTTIME pTime) +{ + /* + * Validate input. + */ + AssertReturn(RTAsn1Time_IsPresent(pThis), VERR_INVALID_STATE); /* Use RTAsn1Time_InitWithTime. */ + + RTTIMESPEC TmpTimeSpec; + AssertReturn(RTTimeImplode(&TmpTimeSpec, pTime), VERR_INVALID_PARAMETER); + RTTIME NormalizedTime; + RTTimeExplode(&NormalizedTime, &TmpTimeSpec); + + uint32_t const uTag = RTASN1CORE_GET_TAG(&pThis->Asn1Core); + if (uTag == ASN1_TAG_UTC_TIME) + { + AssertReturn(NormalizedTime.i32Year >= 1950, VERR_INVALID_PARAMETER); + AssertReturn(NormalizedTime.i32Year < 2050, VERR_INVALID_PARAMETER); + } + else + { + AssertReturn(uTag == ASN1_TAG_GENERAL_STRING, VERR_INVALID_STATE); + AssertReturn(NormalizedTime.i32Year >= 0, VERR_INVALID_PARAMETER); + AssertReturn(NormalizedTime.i32Year < 9999, VERR_INVALID_PARAMETER); + } + + /* + * Format the string to a temporary buffer, since the ASN.1 content isn't + * zero terminated and we cannot use RTStrPrintf directly on it. + */ + char szTmp[64]; + uint32_t cchTime; + if (uTag == ASN1_TAG_UTC_TIME) + cchTime = (uint32_t)RTStrPrintf(szTmp, sizeof(szTmp), "%02u%02u%02u%02u%02u%02uZ", + NormalizedTime.i32Year % 100, + NormalizedTime.u8Month, + NormalizedTime.u8MonthDay, + NormalizedTime.u8Hour, + NormalizedTime.u8Minute, + NormalizedTime.u8Second); + else + cchTime = (uint32_t)RTStrPrintf(szTmp, sizeof(szTmp), "%04u%02u%02u%02u%02u%02uZ", + NormalizedTime.i32Year, + NormalizedTime.u8Month, + NormalizedTime.u8MonthDay, + NormalizedTime.u8Hour, + NormalizedTime.u8Minute, + NormalizedTime.u8Second); + AssertReturn(cchTime == (uTag == ASN1_TAG_UTC_TIME ? sizeof(g_szEpochUtc) - 1 : sizeof(g_szEpochGeneralized) - 1), + VERR_INTERNAL_ERROR_3); + + /* + * (Re-)Allocate content buffer, copy over the formatted timestamp and + * set the exploded time member to the new time. + */ + int rc = RTAsn1ContentReallocZ(&pThis->Asn1Core, cchTime, pAllocator); + if (RT_SUCCESS(rc)) + { + memcpy((void *)pThis->Asn1Core.uData.pv, szTmp, cchTime); + pThis->Time = NormalizedTime; + } + return rc; +} + + +RTDECL(int) RTAsn1Time_SetTimeSpec(PRTASN1TIME pThis, PCRTASN1ALLOCATORVTABLE pAllocator, PCRTTIMESPEC pTimeSpec) +{ + RTTIME Time; + return RTAsn1Time_SetTime(pThis, pAllocator, RTTimeExplode(&Time, pTimeSpec)); +} + + RTDECL(int) RTAsn1Time_CompareWithTimeSpec(PCRTASN1TIME pLeft, PCRTTIMESPEC pTsRight) { int iDiff = RTAsn1Time_IsPresent(pLeft) ? 0 : -1; diff -Nru virtualbox-hwe-6.1.34-dfsg/src/VBox/Runtime/common/asn1/oiddb.cfg virtualbox-hwe-6.1.38-dfsg/src/VBox/Runtime/common/asn1/oiddb.cfg --- virtualbox-hwe-6.1.34-dfsg/src/VBox/Runtime/common/asn1/oiddb.cfg 2022-03-22 23:45:18.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/src/VBox/Runtime/common/asn1/oiddb.cfg 2022-09-01 13:28:43.000000000 +0000 @@ -53,6 +53,8 @@ 1.2.840.113549.1.1.12 = pkcs1-Sha384WithRsaEncryption 1.2.840.113549.1.1.13 = pkcs1-Sha512WithRsaEncryption 1.2.840.113549.1.1.14 = pkcs1-Sha224WithRsaEncryption +1.2.840.113549.1.1.15 = pkcs1-Sha512-224WithRsaEncryption +1.2.840.113549.1.1.16 = pkcs1-Sha512-256WithRsaEncryption 1.2.840.113549.1.7 = pkcs7 1.2.840.113549.1.7.1 = pkcs7-data 1.2.840.113549.1.7.2 = pkcs7-signedData @@ -83,6 +85,7 @@ 1.2.840.113549.1.9.16.2 = pkcs9-SMime-id-aa 1.2.840.113549.1.9.16.2.12 = pkcs9-id-aa-SigningCertificate 1.2.840.113549.1.9.16.2.14 = pkcs9-id-aa-Attributes +1.2.840.113549.1.9.16.2.47 = pkcs9-id-aa-signingCertificateV2 1.2.840.113549.1.9.25 = pkcs9-SMime-at 1.2.840.113549.1.9.25.1 = pkcs9-at-Pkcs15Token 1.2.840.113549.1.9.25.2 = pkcs9-at-EncryptedPrivateKeyInfo @@ -121,8 +124,9 @@ 1.3.6.1.4.1.311.2.4 = Ms-??-.2.4 1.3.6.1.4.1.311.2.4.1 = Ms-SpcNestedSignature 1.3.6.1.4.1.311.3 = ms-timestamping +1.3.6.1.4.1.311.3.2.1 = Ms-SpcTimeStampRequest 1.3.6.1.4.1.311.3.3.1 = Ms-CounterSign -1.3.6.1.4.1.311.3.3.2 = Ms-??-3.2 +1.3.6.1.4.1.311.3.3.2 = Ms-?-3.2 1.3.6.1.4.1.311.10.1 = Ms-CertTrustList 1.3.6.1.4.1.311.10.1.1 = Ms-SortedCertTrustList 1.3.6.1.4.1.311.10.3.1 = Ms-kp-CertTrustListSigning @@ -223,10 +227,35 @@ 2.16.840.1.101.3.4 = nist-algorithms 2.16.840.1.101.3.4.1 = nist-aes-algorithms 2.16.840.1.101.3.4.2 = nist-hash-algorithms -2.16.840.1.101.3.4.2.1 = nist-Sha256 -2.16.840.1.101.3.4.2.2 = nist-Sha384 -2.16.840.1.101.3.4.2.3 = nist-Sha512 -2.16.840.1.101.3.4.2.4 = nist-Sha224 +2.16.840.1.101.3.4.2.1 = nist-sha256 +2.16.840.1.101.3.4.2.2 = nist-sha384 +2.16.840.1.101.3.4.2.3 = nist-sha512 +2.16.840.1.101.3.4.2.4 = nist-sha224 +2.16.840.1.101.3.4.2.5 = nist-sha512-224 +2.16.840.1.101.3.4.2.6 = nist-sha512-256 +2.16.840.1.101.3.4.2.7 = nist-sha3-224 +2.16.840.1.101.3.4.2.8 = nist-sha3-256 +2.16.840.1.101.3.4.2.9 = nist-sha3-384 +2.16.840.1.101.3.4.2.10 = nist-sha3-512 +2.16.840.1.101.3.4.2.11 = nist-shake128 +2.16.840.1.101.3.4.2.12 = nist-shake256 +2.16.840.1.101.3.4.3 = nist-sigAlgs +2.16.840.1.101.3.4.3.1 = nist-dsa-with-sha224 +2.16.840.1.101.3.4.3.2 = nist-dsa-with-sha256 +2.16.840.1.101.3.4.3.3 = nist-dsa-with-sha384 +2.16.840.1.101.3.4.3.4 = nist-dsa-with-sha512 +2.16.840.1.101.3.4.3.5 = nist-id-dsa-with-sha224 +2.16.840.1.101.3.4.3.6 = nist-id-dsa-with-sha256 +2.16.840.1.101.3.4.3.7 = nist-id-dsa-with-sha384 +2.16.840.1.101.3.4.3.8 = nist-id-dsa-with-sha512 +2.16.840.1.101.3.4.3.9 = nist-id-ecdsa-with-sha3-224 +2.16.840.1.101.3.4.3.10 = nist-id-ecdsa-with-sha3-256 +2.16.840.1.101.3.4.3.11 = nist-id-ecdsa-with-sha3-384 +2.16.840.1.101.3.4.3.12 = nist-id-ecdsa-with-sha3-512 +2.16.840.1.101.3.4.3.13 = nist-id-rsassa-pkcs1-v1-5-with-sha3-224 +2.16.840.1.101.3.4.3.14 = nist-id-rsassa-pkcs1-v1-5-with-sha3-256 +2.16.840.1.101.3.4.3.15 = nist-id-rsassa-pkcs1-v1-5-with-sha3-384 +2.16.840.1.101.3.4.3.16 = nist-id-rsassa-pkcs1-v1-5-with-sha3-512 2.16.840.1.113730 = netscape 2.16.840.1.113730.1.1 = netscape-cert-type 2.16.840.1.113730.1.2 = netscape-base-url diff -Nru virtualbox-hwe-6.1.34-dfsg/src/VBox/Runtime/common/checksum/alt-sha3.cpp virtualbox-hwe-6.1.38-dfsg/src/VBox/Runtime/common/checksum/alt-sha3.cpp --- virtualbox-hwe-6.1.34-dfsg/src/VBox/Runtime/common/checksum/alt-sha3.cpp 1970-01-01 00:00:00.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/src/VBox/Runtime/common/checksum/alt-sha3.cpp 2022-09-01 13:28:44.000000000 +0000 @@ -0,0 +1,632 @@ +/* $Id: alt-sha3.cpp $ */ +/** @file + * IPRT - SHA-3 hash functions, Alternative Implementation. + */ + +/* + * Copyright (C) 2009-2020 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. + */ + + +/********************************************************************************************************************************* +* Defined Constants And Macros * +*********************************************************************************************************************************/ +/** Number of rounds [3.4]. */ +#define RTSHA3_ROUNDS 24 + +/** @def RTSHA3_FULL_UNROLL + * Do full loop unrolling. + * + * With gcc 10.2.1 on a recent Intel system (10890XE), this results SHA3-512 + * throughput (tstRTDigest-2) increasing from 83532 KiB/s to 194942 KiB/s + * against a text size jump from 5913 to 6929 bytes, i.e. +1016 bytes. + * + * With VS2019 on a half decent AMD system (3990X), this results in SHA3-512 + * speedup from 147676 KiB/s to about 192770 KiB/s. The text cost is +612 bytes + * (4496 to 5108). When disabling the unrolling of Rho+Pi we get a little + * increase 196591 KiB/s (+3821) for some reason, saving 22 bytes of code. + * + * For comparison, openssl 1.1.1g assembly code (AMD64) achives 264915 KiB/s, + * which is only 36% more. Performance is more or less exactly the same as + * KECCAK_2X without ROL optimizations (they improve it to 203493 KiB/s). + */ +#if !defined(IN_SUP_HARDENED_R3) || defined(DOXYGEN_RUNNING) +# define RTSHA3_FULL_UNROLL +#endif + + +/********************************************************************************************************************************* +* Header Files * +*********************************************************************************************************************************/ +#include "internal/iprt.h" +#include +#include +#include +#include + + +/********************************************************************************************************************************* +* Structures and Typedefs * +*********************************************************************************************************************************/ +typedef struct RTSHA3ALTPRIVATECTX +{ + /** The KECCAK state (W=1600). */ + union + { + uint64_t au64[/*1600/64 =*/ 25]; + uint8_t ab[/*1600/8 =*/ 200]; + }; + + /** Current input position. */ + uint8_t offInput; + /** The number of bytes to xor into the state before doing KECCAK. */ + uint8_t cbInput; + /** The digest size in bytes. */ + uint8_t cbDigest; + /** Padding the size up to 208 bytes. */ + uint8_t abPadding[4]; + /** Set if we've finalized the digest. */ + bool fFinal; +} RTSHA3ALTPRIVATECTX; + +#define RT_SHA3_PRIVATE_ALT_CONTEXT +#include + + + +static void rtSha3Keccak(RTSHA3ALTPRIVATECTX *pState) +{ +#ifdef RT_BIG_ENDIAN + /* This sucks a performance wise on big endian systems, sorry. We just + needed something simple that works on AMD64 and x86. */ + for (size_t i = 0; i < RT_ELEMENTS(pState->au64); i++) + pState->au64[i] = RT_LE2H_U64(pState->au64[i]); +#endif + + /* + * Rounds: Rnd(A,idxRound) = Iota(Chi(Pi(Rho(Theta(A)))), idxRount) [3.3] + */ + for (uint32_t idxRound = 0; idxRound < RTSHA3_ROUNDS; idxRound++) + { + /* + * 3.2.1 Theta + */ + { + /* Step 1: */ + const uint64_t au64C[5] = + { + pState->au64[0] ^ pState->au64[5] ^ pState->au64[10] ^ pState->au64[15] ^ pState->au64[20], + pState->au64[1] ^ pState->au64[6] ^ pState->au64[11] ^ pState->au64[16] ^ pState->au64[21], + pState->au64[2] ^ pState->au64[7] ^ pState->au64[12] ^ pState->au64[17] ^ pState->au64[22], + pState->au64[3] ^ pState->au64[8] ^ pState->au64[13] ^ pState->au64[18] ^ pState->au64[23], + pState->au64[4] ^ pState->au64[9] ^ pState->au64[14] ^ pState->au64[19] ^ pState->au64[24], + }; + + /* Step 2 & 3: */ +#ifndef RTSHA3_FULL_UNROLL + for (size_t i = 0; i < RT_ELEMENTS(au64C); i++) + { + uint64_t const u64D = au64C[(i + 4) % RT_ELEMENTS(au64C)] + ^ ASMRotateLeftU64(au64C[(i + 1) % RT_ELEMENTS(au64C)], 1); + pState->au64[ 0 + i] ^= u64D; + pState->au64[ 5 + i] ^= u64D; + pState->au64[10 + i] ^= u64D; + pState->au64[15 + i] ^= u64D; + pState->au64[20 + i] ^= u64D; + } +#else /* RTSHA3_FULL_UNROLL */ +# define THETA_STEP_2_3(a_i, a_idxCLeft, a_idxCRight) do { \ + uint64_t const u64D = au64C[a_idxCLeft] ^ ASMRotateLeftU64(au64C[a_idxCRight], 1); \ + pState->au64[ 0 + a_i] ^= u64D; \ + pState->au64[ 5 + a_i] ^= u64D; \ + pState->au64[10 + a_i] ^= u64D; \ + pState->au64[15 + a_i] ^= u64D; \ + pState->au64[20 + a_i] ^= u64D; \ + } while (0) + THETA_STEP_2_3(0, 4, 1); + THETA_STEP_2_3(1, 0, 2); + THETA_STEP_2_3(2, 1, 3); + THETA_STEP_2_3(3, 2, 4); + THETA_STEP_2_3(4, 3, 0); +#endif /* RTSHA3_FULL_UNROLL */ + } + + /* + * 3.2.2 Rho + 3.2.3 Pi + */ + { +#if !defined(RTSHA3_FULL_UNROLL) || defined(_MSC_VER) /* VS2019 is slightly slow with this section unrolled. go figure */ + static uint8_t const s_aidxState[] = {10,7,11,17,18, 3, 5,16, 8,21, 24, 4,15,23,19, 13,12, 2,20,14, 22, 9, 6, 1}; + static uint8_t const s_acRotate[] = { 1,3, 6,10,15, 21,28,36,45,55, 2,14,27,41,56, 8,25,43,62,18, 39,61,20,44}; + AssertCompile(RT_ELEMENTS(s_aidxState) == 24); AssertCompile(RT_ELEMENTS(s_acRotate) == 24); + uint64_t u64 = pState->au64[1 /*s_aidxState[RT_ELEMENTS(s_aidxState) - 1]*/]; +# if !defined(_MSC_VER) /* This is slower with VS2019 but slightly faster with g++ (10.2.1). */ + for (size_t i = 0; i <= 23 - 1; i++) /*i=t*/ + { + uint64_t const u64Result = ASMRotateLeftU64(u64, s_acRotate[i]); + size_t const idxState = s_aidxState[i]; + u64 = pState->au64[idxState]; + pState->au64[idxState] = u64Result; + } + pState->au64[1 /*s_aidxState[23]*/] = ASMRotateLeftU64(u64, 44 /*s_acRotate[23]*/); +# else + for (size_t i = 0; i <= 23; i++) /*i=t*/ + { + uint64_t const u64Result = ASMRotateLeftU64(u64, s_acRotate[i]); + size_t const idxState = s_aidxState[i]; + u64 = pState->au64[idxState]; + pState->au64[idxState] = u64Result; + } +# endif +#else /* RTSHA3_FULL_UNROLL */ +# define RHO_AND_PI(a_idxState, a_cRotate) do { \ + uint64_t const u64Result = ASMRotateLeftU64(u64, a_cRotate); \ + u64 = pState->au64[a_idxState]; \ + pState->au64[a_idxState] = u64Result; \ + } while (0) + + uint64_t u64 = pState->au64[1 /*s_aidxState[RT_ELEMENTS(s_aidxState) - 1]*/]; + RHO_AND_PI(10, 1); + RHO_AND_PI( 7, 3); + RHO_AND_PI(11, 6); + RHO_AND_PI(17, 10); + RHO_AND_PI(18, 15); + RHO_AND_PI( 3, 21); + RHO_AND_PI( 5, 28); + RHO_AND_PI(16, 36); + RHO_AND_PI( 8, 45); + RHO_AND_PI(21, 55); + RHO_AND_PI(24, 2); + RHO_AND_PI( 4, 14); + RHO_AND_PI(15, 27); + RHO_AND_PI(23, 41); + RHO_AND_PI(19, 56); + RHO_AND_PI(13, 8); + RHO_AND_PI(12, 25); + RHO_AND_PI( 2, 43); + RHO_AND_PI(20, 62); + RHO_AND_PI(14, 18); + RHO_AND_PI(22, 39); + RHO_AND_PI( 9, 61); + RHO_AND_PI( 6, 20); + pState->au64[1 /*s_aidxState[23]*/] = ASMRotateLeftU64(u64, 44 /*s_acRotate[23]*/); + +#endif /* RTSHA3_FULL_UNROLL */ + } + + /* + * 3.2.4 Chi & 3.2.5 Iota. + */ + /* Iota values xor constants (indexed by round). */ + static uint64_t const s_au64RC[] = + { + UINT64_C(0x0000000000000001), UINT64_C(0x0000000000008082), UINT64_C(0x800000000000808a), UINT64_C(0x8000000080008000), + UINT64_C(0x000000000000808b), UINT64_C(0x0000000080000001), UINT64_C(0x8000000080008081), UINT64_C(0x8000000000008009), + UINT64_C(0x000000000000008a), UINT64_C(0x0000000000000088), UINT64_C(0x0000000080008009), UINT64_C(0x000000008000000a), + UINT64_C(0x000000008000808b), UINT64_C(0x800000000000008b), UINT64_C(0x8000000000008089), UINT64_C(0x8000000000008003), + UINT64_C(0x8000000000008002), UINT64_C(0x8000000000000080), UINT64_C(0x000000000000800a), UINT64_C(0x800000008000000a), + UINT64_C(0x8000000080008081), UINT64_C(0x8000000000008080), UINT64_C(0x0000000080000001), UINT64_C(0x8000000080008008), + }; + AssertCompile(RT_ELEMENTS(s_au64RC) == RTSHA3_ROUNDS); +#ifndef RTSHA3_FULL_UNROLL + /* Chi */ + for (size_t i = 0; i < 25; i += 5) + { +# ifndef _MSC_VER /* This is typically slower with VS2019 - go figure. Makes not difference with g++. */ + uint64_t const u0 = pState->au64[i + 0]; + uint64_t const u1 = pState->au64[i + 1]; + uint64_t const u2 = pState->au64[i + 2]; + pState->au64[i + 0] = u0 ^ (~u1 & u2); + uint64_t const u3 = pState->au64[i + 3]; + pState->au64[i + 1] = u1 ^ (~u2 & u3); + uint64_t const u4 = pState->au64[i + 4]; + pState->au64[i + 2] = u2 ^ (~u3 & u4); + pState->au64[i + 3] = u3 ^ (~u4 & u0); + pState->au64[i + 4] = u4 ^ (~u0 & u1); +# else + uint64_t const au64Tmp[] = { pState->au64[i + 0], pState->au64[i + 1], pState->au64[i + 2], + pState->au64[i + 3], pState->au64[i + 4] }; + pState->au64[i + 0] ^= ~au64Tmp[1] & au64Tmp[2]; + pState->au64[i + 1] ^= ~au64Tmp[2] & au64Tmp[3]; + pState->au64[i + 2] ^= ~au64Tmp[3] & au64Tmp[4]; + pState->au64[i + 3] ^= ~au64Tmp[4] & au64Tmp[0]; + pState->au64[i + 4] ^= ~au64Tmp[0] & au64Tmp[1]; +# endif + } + + /* Iota. */ + pState->au64[0] ^= s_au64RC[idxRound]; + +#else /* RTSHA3_FULL_UNROLL */ +# define CHI_AND_IOTA(a_i, a_IotaExpr) do { \ + uint64_t const u0 = pState->au64[a_i + 0]; \ + uint64_t const u1 = pState->au64[a_i + 1]; \ + uint64_t const u2 = pState->au64[a_i + 2]; \ + pState->au64[a_i + 0] = u0 ^ (~u1 & u2) a_IotaExpr; \ + uint64_t const u3 = pState->au64[a_i + 3]; \ + pState->au64[a_i + 1] = u1 ^ (~u2 & u3); \ + uint64_t const u4 = pState->au64[a_i + 4]; \ + pState->au64[a_i + 2] = u2 ^ (~u3 & u4); \ + pState->au64[a_i + 3] = u3 ^ (~u4 & u0); \ + pState->au64[a_i + 4] = u4 ^ (~u0 & u1); \ + } while (0) + CHI_AND_IOTA( 0, ^ s_au64RC[idxRound]); + CHI_AND_IOTA( 5, RT_NOTHING); + CHI_AND_IOTA(10, RT_NOTHING); + CHI_AND_IOTA(15, RT_NOTHING); + CHI_AND_IOTA(20, RT_NOTHING); +#endif /* RTSHA3_FULL_UNROLL */ + } + +#ifdef RT_BIG_ENDIAN + for (size_t i = 0; i < RT_ELEMENTS(pState->au64); i++) + pState->au64[i] = RT_H2LE_U64(pState->au64[i]); +#endif +} + + +static int rtSha3Init(RTSHA3ALTPRIVATECTX *pCtx, unsigned cBitsDigest) +{ + RT_ZERO(pCtx->au64); + pCtx->offInput = 0; + pCtx->cbInput = (uint8_t)(sizeof(pCtx->ab) - (2 * cBitsDigest / 8)); + pCtx->cbDigest = cBitsDigest / 8; + pCtx->fFinal = false; + return VINF_SUCCESS; +} + + +static int rtSha3Update(RTSHA3ALTPRIVATECTX *pCtx, uint8_t const *pbData, size_t cbData) +{ + Assert(!pCtx->fFinal); + size_t const cbInput = pCtx->cbInput; + size_t offState = pCtx->offInput; + Assert(!(cbInput & 7)); +#if 1 + if ( ((uintptr_t)pbData & 7) == 0 + && (offState & 7) == 0 + && (cbData & 7) == 0) + { + uint64_t const cQwordsInput = cbInput / sizeof(uint64_t); + uint64_t const *pu64Data = (uint64_t const *)pbData; + size_t cQwordsData = cbData / sizeof(uint64_t); + size_t offData = 0; + offState /= sizeof(uint64_t); + + /* + * Any catching up to do? + */ + if (offState == 0 || cQwordsData >= cQwordsInput - offState) + { + if (offState > 0) + { + while (offState < cQwordsInput) + pCtx->au64[offState++] ^= pu64Data[offData++]; + rtSha3Keccak(pCtx); + offState = 0; + } + if (offData < cQwordsData) + { + /* + * Do full chunks. + */ +# if 1 + switch (cQwordsInput) + { + case 18: /* ( 200 - (2 * 224/8) = 0x90 (144) ) / 8 = 0x12 (18) */ + { + size_t cFullChunks = (cQwordsData - offData) / 18; + while (cFullChunks-- > 0) + { + pCtx->au64[ 0] ^= pu64Data[offData + 0]; + pCtx->au64[ 1] ^= pu64Data[offData + 1]; + pCtx->au64[ 2] ^= pu64Data[offData + 2]; + pCtx->au64[ 3] ^= pu64Data[offData + 3]; + pCtx->au64[ 4] ^= pu64Data[offData + 4]; + pCtx->au64[ 5] ^= pu64Data[offData + 5]; + pCtx->au64[ 6] ^= pu64Data[offData + 6]; + pCtx->au64[ 7] ^= pu64Data[offData + 7]; + pCtx->au64[ 8] ^= pu64Data[offData + 8]; + pCtx->au64[ 9] ^= pu64Data[offData + 9]; + pCtx->au64[10] ^= pu64Data[offData + 10]; + pCtx->au64[11] ^= pu64Data[offData + 11]; + pCtx->au64[12] ^= pu64Data[offData + 12]; + pCtx->au64[13] ^= pu64Data[offData + 13]; + pCtx->au64[14] ^= pu64Data[offData + 14]; + pCtx->au64[15] ^= pu64Data[offData + 15]; + pCtx->au64[16] ^= pu64Data[offData + 16]; + pCtx->au64[17] ^= pu64Data[offData + 17]; + offData += 18; + rtSha3Keccak(pCtx); + } + break; + } + + case 17: /* ( 200 - (2 * 256/8) = 0x88 (136) ) / 8 = 0x11 (17) */ + { + size_t cFullChunks = (cQwordsData - offData) / 17; + while (cFullChunks-- > 0) + { + pCtx->au64[ 0] ^= pu64Data[offData + 0]; + pCtx->au64[ 1] ^= pu64Data[offData + 1]; + pCtx->au64[ 2] ^= pu64Data[offData + 2]; + pCtx->au64[ 3] ^= pu64Data[offData + 3]; + pCtx->au64[ 4] ^= pu64Data[offData + 4]; + pCtx->au64[ 5] ^= pu64Data[offData + 5]; + pCtx->au64[ 6] ^= pu64Data[offData + 6]; + pCtx->au64[ 7] ^= pu64Data[offData + 7]; + pCtx->au64[ 8] ^= pu64Data[offData + 8]; + pCtx->au64[ 9] ^= pu64Data[offData + 9]; + pCtx->au64[10] ^= pu64Data[offData + 10]; + pCtx->au64[11] ^= pu64Data[offData + 11]; + pCtx->au64[12] ^= pu64Data[offData + 12]; + pCtx->au64[13] ^= pu64Data[offData + 13]; + pCtx->au64[14] ^= pu64Data[offData + 14]; + pCtx->au64[15] ^= pu64Data[offData + 15]; + pCtx->au64[16] ^= pu64Data[offData + 16]; + offData += 17; + rtSha3Keccak(pCtx); + } + break; + } + + case 13: /* ( 200 - (2 * 384/8) = 0x68 (104) ) / 8 = 0x0d (13) */ + { + size_t cFullChunks = (cQwordsData - offData) / 13; + while (cFullChunks-- > 0) + { + pCtx->au64[ 0] ^= pu64Data[offData + 0]; + pCtx->au64[ 1] ^= pu64Data[offData + 1]; + pCtx->au64[ 2] ^= pu64Data[offData + 2]; + pCtx->au64[ 3] ^= pu64Data[offData + 3]; + pCtx->au64[ 4] ^= pu64Data[offData + 4]; + pCtx->au64[ 5] ^= pu64Data[offData + 5]; + pCtx->au64[ 6] ^= pu64Data[offData + 6]; + pCtx->au64[ 7] ^= pu64Data[offData + 7]; + pCtx->au64[ 8] ^= pu64Data[offData + 8]; + pCtx->au64[ 9] ^= pu64Data[offData + 9]; + pCtx->au64[10] ^= pu64Data[offData + 10]; + pCtx->au64[11] ^= pu64Data[offData + 11]; + pCtx->au64[12] ^= pu64Data[offData + 12]; + offData += 13; + rtSha3Keccak(pCtx); + } + break; + } + + case 9: /* ( 200 - (2 * 512/8) = 0x48 (72) ) / 8 = 0x09 (9) */ + { + size_t cFullChunks = (cQwordsData - offData) / 9; + while (cFullChunks-- > 0) + { + pCtx->au64[ 0] ^= pu64Data[offData + 0]; + pCtx->au64[ 1] ^= pu64Data[offData + 1]; + pCtx->au64[ 2] ^= pu64Data[offData + 2]; + pCtx->au64[ 3] ^= pu64Data[offData + 3]; + pCtx->au64[ 4] ^= pu64Data[offData + 4]; + pCtx->au64[ 5] ^= pu64Data[offData + 5]; + pCtx->au64[ 6] ^= pu64Data[offData + 6]; + pCtx->au64[ 7] ^= pu64Data[offData + 7]; + pCtx->au64[ 8] ^= pu64Data[offData + 8]; + offData += 9; + rtSha3Keccak(pCtx); + } + break; + } + + default: + { + AssertFailed(); +# endif + size_t cFullChunks = (cQwordsData - offData) / cQwordsInput; + while (cFullChunks-- > 0) + { + offState = cQwordsInput; + while (offState-- > 0) + pCtx->au64[offState] ^= pu64Data[offData + offState]; + offData += cQwordsInput; + rtSha3Keccak(pCtx); + } +# if 1 + break; + } + } +# endif + offState = 0; + + /* + * Partial last chunk? + */ + if (offData < cQwordsData) + { + Assert(cQwordsData - offData < cQwordsInput); + while (offData < cQwordsData) + pCtx->au64[offState++] ^= pu64Data[offData++]; + offState *= sizeof(uint64_t); + } + } + } + else + { + while (offData < cQwordsData) + pCtx->au64[offState++] ^= pu64Data[offData++]; + offState *= sizeof(uint64_t); + } + Assert(offData == cQwordsData); + } + else +#endif + { + /* + * Misaligned input/state, so just do simpe byte by byte processing. + */ + for (size_t offData = 0; offData < cbData; offData++) + { + pCtx->ab[offState] ^= pbData[offData]; + offState++; + if (offState < cbInput) + { /* likely */ } + else + { + rtSha3Keccak(pCtx); + offState = 0; + } + } + } + pCtx->offInput = (uint8_t)offState; + return VINF_SUCCESS; +} + + +static void rtSha3FinalInternal(RTSHA3ALTPRIVATECTX *pCtx) +{ + Assert(!pCtx->fFinal); + + pCtx->ab[pCtx->offInput] ^= 0x06; + pCtx->ab[pCtx->cbInput - 1] ^= 0x80; + rtSha3Keccak(pCtx); +} + + +static int rtSha3Final(RTSHA3ALTPRIVATECTX *pCtx, uint8_t *pbDigest) +{ + Assert(!pCtx->fFinal); + + rtSha3FinalInternal(pCtx); + + memcpy(pbDigest, pCtx->ab, pCtx->cbDigest); + + /* Wipe non-hash state. */ + RT_BZERO(&pCtx->ab[pCtx->cbDigest], sizeof(pCtx->ab) - pCtx->cbDigest); + pCtx->fFinal = true; + return VINF_SUCCESS; +} + + +static int rtSha3(const void *pvData, size_t cbData, unsigned cBitsDigest, uint8_t *pabHash) +{ + RTSHA3ALTPRIVATECTX Ctx; + rtSha3Init(&Ctx, cBitsDigest); + rtSha3Update(&Ctx, (uint8_t const *)pvData, cbData); + rtSha3Final(&Ctx, pabHash); + return VINF_SUCCESS; +} + + +static bool rtSha3Check(const void *pvData, size_t cbData, unsigned cBitsDigest, const uint8_t *pabHash) +{ + RTSHA3ALTPRIVATECTX Ctx; + rtSha3Init(&Ctx, cBitsDigest); + rtSha3Update(&Ctx, (uint8_t const *)pvData, cbData); + rtSha3FinalInternal(&Ctx); + bool fRet = memcmp(pabHash, &Ctx.ab, cBitsDigest / 8) == 0; + RT_ZERO(Ctx); + return fRet; +} + + +/** Macro for declaring the interface for a SHA3 variation. + * @internal */ +#define RTSHA3_DEFINE_VARIANT(a_cBits) \ +AssertCompile((a_cBits / 8) == RT_CONCAT3(RTSHA3_,a_cBits,_HASH_SIZE)); \ +AssertCompile(sizeof(RT_CONCAT3(RTSHA3T,a_cBits,CONTEXT)) >= sizeof(RTSHA3ALTPRIVATECTX)); \ +\ +RTDECL(int) RT_CONCAT(RTSha3t,a_cBits)(const void *pvBuf, size_t cbBuf, uint8_t pabHash[RT_CONCAT3(RTSHA3_,a_cBits,_HASH_SIZE)]) \ +{ \ + return rtSha3(pvBuf, cbBuf, a_cBits, pabHash); \ +} \ +RT_EXPORT_SYMBOL(RT_CONCAT(RTSha3t,a_cBits)); \ +\ +\ +RTDECL(bool) RT_CONCAT3(RTSha3t,a_cBits,Check)(const void *pvBuf, size_t cbBuf, \ + uint8_t const pabHash[RT_CONCAT3(RTSHA3_,a_cBits,_HASH_SIZE)]) \ +{ \ + return rtSha3Check(pvBuf, cbBuf, a_cBits, pabHash); \ +} \ +RT_EXPORT_SYMBOL(RT_CONCAT3(RTSha3t,a_cBits,Check)); \ +\ +\ +RTDECL(int) RT_CONCAT3(RTSha3t,a_cBits,Init)(RT_CONCAT3(PRTSHA3T,a_cBits,CONTEXT) pCtx) \ +{ \ + AssertCompile(sizeof(pCtx->Sha3.a64Padding) >= sizeof(pCtx->Sha3.AltPrivate)); \ + AssertCompile(sizeof(pCtx->Sha3.a64Padding) == sizeof(pCtx->Sha3.abPadding)); \ + return rtSha3Init(&pCtx->Sha3.AltPrivate, a_cBits); \ +} \ +RT_EXPORT_SYMBOL(RT_CONCAT3(RTSha3t,a_cBits,Init)); \ +\ +\ +RTDECL(int) RT_CONCAT3(RTSha3t,a_cBits,Update)(RT_CONCAT3(PRTSHA3T,a_cBits,CONTEXT) pCtx, const void *pvBuf, size_t cbBuf) \ +{ \ + Assert(pCtx->Sha3.AltPrivate.cbDigest == (a_cBits) / 8); \ + return rtSha3Update(&pCtx->Sha3.AltPrivate, (uint8_t const *)pvBuf, cbBuf); \ +} \ +RT_EXPORT_SYMBOL(RT_CONCAT3(RTSha3t,a_cBits,Update)); \ +\ +\ +RTDECL(int) RT_CONCAT3(RTSha3t,a_cBits,Final)(RT_CONCAT3(PRTSHA3T,a_cBits,CONTEXT) pCtx, \ + uint8_t pabHash[RT_CONCAT3(RTSHA3_,a_cBits,_HASH_SIZE)]) \ +{ \ + Assert(pCtx->Sha3.AltPrivate.cbDigest == (a_cBits) / 8); \ + return rtSha3Final(&pCtx->Sha3.AltPrivate, pabHash); \ +} \ +RT_EXPORT_SYMBOL(RT_CONCAT3(RTSha3t,a_cBits,Final)); \ +\ +\ +RTDECL(int) RT_CONCAT3(RTSha3t,a_cBits,Cleanup)(RT_CONCAT3(PRTSHA3T,a_cBits,CONTEXT) pCtx) \ +{ \ + if (pCtx) \ + { \ + Assert(pCtx->Sha3.AltPrivate.cbDigest == (a_cBits) / 8); \ + RT_ZERO(*pCtx); \ + } \ + return VINF_SUCCESS; \ +} \ +RT_EXPORT_SYMBOL(RT_CONCAT3(RTSha3t,a_cBits,Cleanup)); \ +\ +\ +RTDECL(int) RT_CONCAT3(RTSha3t,a_cBits,Clone)(RT_CONCAT3(PRTSHA3T,a_cBits,CONTEXT) pCtx, \ + RT_CONCAT3(RTSHA3T,a_cBits,CONTEXT) const *pCtxSrc) \ +{ \ + memcpy(pCtx, pCtxSrc, sizeof(*pCtx)); \ + return VINF_SUCCESS; \ +} \ +RT_EXPORT_SYMBOL(RT_CONCAT3(RTSha3t,a_cBits,Clone)); \ +\ +\ +RTDECL(int) RT_CONCAT3(RTSha3t,a_cBits,ToString)(uint8_t const pabHash[RT_CONCAT3(RTSHA3_,a_cBits,_HASH_SIZE)], \ + char *pszDigest, size_t cchDigest) \ +{ \ + return RTStrPrintHexBytes(pszDigest, cchDigest, pabHash, (a_cBits) / 8, 0 /*fFlags*/); \ +} \ +RT_EXPORT_SYMBOL(RT_CONCAT3(RTSha3t,a_cBits,ToString)); \ +\ +\ +RTDECL(int) RT_CONCAT3(RTSha3t,a_cBits,FromString)(char const *pszDigest, uint8_t pabHash[RT_CONCAT3(RTSHA3_,a_cBits,_HASH_SIZE)]) \ +{ \ + return RTStrConvertHexBytes(RTStrStripL(pszDigest), &pabHash[0], (a_cBits) / 8, 0 /*fFlags*/); \ +} \ +RT_EXPORT_SYMBOL(RT_CONCAT3(RTSha3t,a_cBits,FromString)) + + +RTSHA3_DEFINE_VARIANT(224); +RTSHA3_DEFINE_VARIANT(256); +RTSHA3_DEFINE_VARIANT(384); +RTSHA3_DEFINE_VARIANT(512); + diff -Nru virtualbox-hwe-6.1.34-dfsg/src/VBox/Runtime/common/checksum/openssl-sha3.cpp virtualbox-hwe-6.1.38-dfsg/src/VBox/Runtime/common/checksum/openssl-sha3.cpp --- virtualbox-hwe-6.1.34-dfsg/src/VBox/Runtime/common/checksum/openssl-sha3.cpp 1970-01-01 00:00:00.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/src/VBox/Runtime/common/checksum/openssl-sha3.cpp 2022-09-01 13:28:44.000000000 +0000 @@ -0,0 +1,260 @@ +/* $Id: openssl-sha3.cpp $ */ +/** @file + * IPRT - SHA-3 hash functions, OpenSSL based implementation. + */ + +/* + * Copyright (C) 2020 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. + */ + +#if 1 /* For now: */ +# include "alt-sha3.cpp" + +#else + + +/********************************************************************************************************************************* +* Header Files * +*********************************************************************************************************************************/ +#include "internal/iprt.h" +#include +#include +#include + +#include "internal/openssl-pre.h" +#include +#include "internal/openssl-post.h" + + +/********************************************************************************************************************************* +* Defined Constants And Macros * +*********************************************************************************************************************************/ +#define RTSHA3PRIVATECTX_MAGIC UINT64_C(0xb6362d323c56b758) +#define RTSHA3PRIVATECTX_MAGIC_FINAL UINT64_C(0x40890fe0e474215d) +#define RTSHA3PRIVATECTX_MAGIC_DEAD UINT64_C(0xdead7a05081cbeef) + + +/********************************************************************************************************************************* +* Structures and Typedefs * +*********************************************************************************************************************************/ +/* Internal EVP structure that we fake here to avoid lots of casting. */ +struct evp_md_ctx_st +{ + void *apvWhatever[10]; +}; + +/** The OpenSSL private context structure. */ +typedef struct RTSHA3PRIVATECTX +{ + /** RTSHA3PRIVATECTX_MAGIC / RTSHA3PRIVATECTX_MAGIC_FINAL / RTSHA3PRIVATECTX_MAGIC_DEAD */ + uint64_t u64Magic; + /** The OpenSSL context. We cheat to avoid EVP_MD_CTX_new/free. */ + struct evp_md_ctx_st MdCtx; +} RTSHA3PRIVATECTX; + +#define RT_SHA3_PRIVATE_CONTEXT +#include +AssertCompile(RT_SIZEOFMEMB(RTSHA3CONTEXT, abPadding) >= RT_SIZEOFMEMB(RTSHA3CONTEXT, Private)); + + + +static int rtSha3Init(PRTSHA3CONTEXT pCtx, const EVP_MD *pMdType) +{ + RT_ZERO(*pCtx); /* This is what EVP_MD_CTX_new does. */ + pCtx->Private.u64Magic = RTSHA3PRIVATECTX_MAGIC; + + AssertReturnStmt(EVP_DigestInit_ex(&pCtx->Private.MdCtx, pMdType, NULL /*engine*/), + pCtx->Private.u64Magic = RTSHA3PRIVATECTX_MAGIC_DEAD, + VERR_CR_DIGEST_OSSL_DIGEST_INIT_ERROR); + return VINF_SUCCESS; +} + + +static int rtSha3Update(PRTSHA3CONTEXT pCtx, uint8_t const *pbData, size_t cbData) +{ + AssertMsgReturn(pCtx->Private.u64Magic == RTSHA3PRIVATECTX_MAGIC, ("u64Magic=%RX64\n", pCtx->Private.u64Magic), + VERR_INVALID_CONTEXT); + AssertReturn(EVP_DigestUpdate(&pCtx->Private.MdCtx, pbData, cbData), VERR_GENERAL_FAILURE); + return VINF_SUCCESS; +} + + +static int rtSha3Final(PRTSHA3CONTEXT pCtx, uint8_t *pbDigest, size_t cbDigest) +{ + RT_BZERO(pbDigest, cbDigest); + AssertMsgReturn(pCtx->Private.u64Magic == RTSHA3PRIVATECTX_MAGIC, ("u64Magic=%RX64\n", pCtx->Private.u64Magic), + VERR_INVALID_CONTEXT); + AssertReturn(EVP_DigestFinal_ex(&pCtx->Private.MdCtx, pbDigest, NULL), VERR_GENERAL_FAILURE); + + /* Implicit cleanup. */ + EVP_MD_CTX_reset(&pCtx->Private.MdCtx); + pCtx->Private.u64Magic = RTSHA3PRIVATECTX_MAGIC_FINAL; + return VINF_SUCCESS; +} + + +static int rtSha3Cleanup(PRTSHA3CONTEXT pCtx) +{ + if (pCtx) + { + if (pCtx->Private.u64Magic == RTSHA3PRIVATECTX_MAGIC_FINAL) + { /* likely */ } + else if (pCtx->Private.u64Magic == RTSHA3PRIVATECTX_MAGIC) + EVP_MD_CTX_reset(&pCtx->Private.MdCtx); + else + AssertMsgFailedReturn(("u64Magic=%RX64\n", pCtx->Private.u64Magic), VERR_INVALID_CONTEXT); + pCtx->Private.u64Magic = RTSHA3PRIVATECTX_MAGIC_DEAD; + } + return VINF_SUCCESS; +} + + +static int rtSha3Clone(PRTSHA3CONTEXT pCtx, RTSHA3CONTEXT const *pCtxSrc) +{ + Assert(pCtx->Private.u64Magic != RTSHA3PRIVATECTX_MAGIC); + RT_ZERO(*pCtx); /* This is what EVP_MD_CTX_new does. */ + + AssertReturn(pCtxSrc->Private.u64Magic == RTSHA3PRIVATECTX_MAGIC, VERR_INVALID_CONTEXT); + + pCtx->Private.u64Magic = RTSHA3PRIVATECTX_MAGIC; + AssertReturnStmt(EVP_MD_CTX_copy_ex(&pCtx->Private.MdCtx, &pCtxSrc->Private.MdCtx), + pCtx->Private.u64Magic = RTSHA3PRIVATECTX_MAGIC_DEAD, + VERR_CR_DIGEST_OSSL_DIGEST_CTX_COPY_ERROR); + return VINF_SUCCESS; +} + + +static int rtSha3(const void *pvData, size_t cbData, const EVP_MD *pMdType, uint8_t *pabHash, size_t cbHash) +{ + RT_BZERO(pabHash, cbHash); + + int rc; + EVP_MD_CTX *pCtx = EVP_MD_CTX_new(); + if (pCtx) + { + if (EVP_DigestInit_ex(pCtx, pMdType, NULL /*engine*/)) + { + if (EVP_DigestUpdate(pCtx, pvData, cbData)) + { + if (EVP_DigestFinal_ex(pCtx, pabHash, NULL)) + rc = VINF_SUCCESS; + else + AssertFailedStmt(rc = VERR_GENERAL_FAILURE); + } + else + AssertFailedStmt(rc = VERR_GENERAL_FAILURE); + } + else + AssertFailedStmt(rc = VERR_CR_DIGEST_OSSL_DIGEST_INIT_ERROR); + EVP_MD_CTX_free(pCtx); + } + else + AssertFailedStmt(rc = VERR_NO_MEMORY); + return rc; +} + + +static bool rtSha3Check(const void *pvData, size_t cbData, const EVP_MD *pMdType, + const uint8_t *pabHash, uint8_t *pabHashTmp, size_t cbHash) +{ + int rc = rtSha3(pvData, cbData, pMdType, pabHashTmp, cbHash); + return RT_SUCCESS(rc) && memcmp(pabHash, pabHashTmp, cbHash) == 0; +} + + +/** Macro for declaring the interface for a SHA3 variation. + * @internal */ +#define RTSHA3_DEFINE_VARIANT(a_cBits, a_pMdType) \ +AssertCompile((a_cBits / 8) == RT_CONCAT3(RTSHA3_,a_cBits,_HASH_SIZE)); \ +\ +RTDECL(int) RT_CONCAT(RTSha3t,a_cBits)(const void *pvBuf, size_t cbBuf, uint8_t pabHash[RT_CONCAT3(RTSHA3_,a_cBits,_HASH_SIZE)]) \ +{ \ + return rtSha3(pvBuf, cbBuf, a_pMdType, pabHash, (a_cBits) / 8); \ +} \ +RT_EXPORT_SYMBOL(RT_CONCAT(RTSha3t,a_cBits)); \ +\ +\ +RTDECL(bool) RT_CONCAT3(RTSha3t,a_cBits,Check)(const void *pvBuf, size_t cbBuf, \ + uint8_t const pabHash[RT_CONCAT3(RTSHA3_,a_cBits,_HASH_SIZE)]) \ +{ \ + uint8_t abHashTmp[(a_cBits) / 8]; \ + return rtSha3Check(pvBuf, cbBuf, a_pMdType, pabHash, abHashTmp, (a_cBits) / 8); \ +} \ +RT_EXPORT_SYMBOL(RT_CONCAT3(RTSha3t,a_cBits,Check)); \ +\ +\ +RTDECL(int) RT_CONCAT3(RTSha3t,a_cBits,Init)(RT_CONCAT3(PRTSHA3T,a_cBits,CONTEXT) pCtx) \ +{ \ + return rtSha3Init(&pCtx->Sha3, a_pMdType); \ +} \ +RT_EXPORT_SYMBOL(RT_CONCAT3(RTSha3t,a_cBits,Init)); \ +\ +\ +RTDECL(int) RT_CONCAT3(RTSha3t,a_cBits,Update)(RT_CONCAT3(PRTSHA3T,a_cBits,CONTEXT) pCtx, const void *pvBuf, size_t cbBuf) \ +{ \ + return rtSha3Update(&pCtx->Sha3, (uint8_t const *)pvBuf, cbBuf); \ +} \ +RT_EXPORT_SYMBOL(RT_CONCAT3(RTSha3t,a_cBits,Update)); \ +\ +\ +RTDECL(int) RT_CONCAT3(RTSha3t,a_cBits,Final)(RT_CONCAT3(PRTSHA3T,a_cBits,CONTEXT) pCtx, \ + uint8_t pabHash[RT_CONCAT3(RTSHA3_,a_cBits,_HASH_SIZE)]) \ +{ \ + return rtSha3Final(&pCtx->Sha3, pabHash, (a_cBits) / 8); \ +} \ +RT_EXPORT_SYMBOL(RT_CONCAT3(RTSha3t,a_cBits,Final)); \ +\ +\ +RTDECL(int) RT_CONCAT3(RTSha3t,a_cBits,Cleanup)(RT_CONCAT3(PRTSHA3T,a_cBits,CONTEXT) pCtx) \ +{ \ + return rtSha3Cleanup(&pCtx->Sha3); \ +} \ +RT_EXPORT_SYMBOL(RT_CONCAT3(RTSha3t,a_cBits,Cleanup)); \ +\ +\ +RTDECL(int) RT_CONCAT3(RTSha3t,a_cBits,Clone)(RT_CONCAT3(PRTSHA3T,a_cBits,CONTEXT) pCtx, \ + RT_CONCAT3(RTSHA3T,a_cBits,CONTEXT) const *pCtxSrc) \ +{ \ + return rtSha3Clone(&pCtx->Sha3, &pCtxSrc->Sha3); \ +} \ +RT_EXPORT_SYMBOL(RT_CONCAT3(RTSha3t,a_cBits,Clone)); \ +\ +\ +RTDECL(int) RT_CONCAT3(RTSha3t,a_cBits,ToString)(uint8_t const pabHash[RT_CONCAT3(RTSHA3_,a_cBits,_HASH_SIZE)], \ + char *pszDigest, size_t cchDigest) \ +{ \ + return RTStrPrintHexBytes(pszDigest, cchDigest, pabHash, (a_cBits) / 8, 0 /*fFlags*/); \ +} \ +RT_EXPORT_SYMBOL(RT_CONCAT3(RTSha3t,a_cBits,ToString)); \ +\ +\ +RTDECL(int) RT_CONCAT3(RTSha3t,a_cBits,FromString)(char const *pszDigest, uint8_t pabHash[RT_CONCAT3(RTSHA3_,a_cBits,_HASH_SIZE)]) \ +{ \ + return RTStrConvertHexBytes(RTStrStripL(pszDigest), &pabHash[0], (a_cBits) / 8, 0 /*fFlags*/); \ +} \ +RT_EXPORT_SYMBOL(RT_CONCAT3(RTSha3t,a_cBits,FromString)) + + +RTSHA3_DEFINE_VARIANT(224, EVP_sha3_224()); +RTSHA3_DEFINE_VARIANT(256, EVP_sha3_256()); +RTSHA3_DEFINE_VARIANT(384, EVP_sha3_384()); +RTSHA3_DEFINE_VARIANT(512, EVP_sha3_512()); + +#endif /* !alt-sha3.cpp */ diff -Nru virtualbox-hwe-6.1.34-dfsg/src/VBox/Runtime/common/crypto/digest-builtin.cpp virtualbox-hwe-6.1.38-dfsg/src/VBox/Runtime/common/crypto/digest-builtin.cpp --- virtualbox-hwe-6.1.34-dfsg/src/VBox/Runtime/common/crypto/digest-builtin.cpp 2022-03-22 23:45:19.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/src/VBox/Runtime/common/crypto/digest-builtin.cpp 2022-09-01 13:28:45.000000000 +0000 @@ -518,6 +518,7 @@ /** SHA-512/224 alias ODIs. */ static const char * const g_apszSha512t224Aliases[] = { + RTCR_PKCS1_SHA512T224_WITH_RSA_OID, NULL }; @@ -573,6 +574,7 @@ /** SHA-512/256 alias ODIs. */ static const char * const g_apszSha512t256Aliases[] = { + RTCR_PKCS1_SHA512T256_WITH_RSA_OID, NULL }; @@ -598,6 +600,285 @@ }; #endif /* !IPRT_WITHOUT_SHA512T256 */ +#ifndef IPRT_WITHOUT_SHA3 + +/* + * SHA3-224 + */ + +/** @impl_interface_method{RTCRDIGESTDESC::pfnUpdate} */ +static DECLCALLBACK(void) rtCrDigestSha3t224_Update(void *pvState, const void *pvData, size_t cbData) +{ + int rc = RTSha3t224Update((PRTSHA3T224CONTEXT)pvState, pvData, cbData); + AssertRC(rc); +} + +/** @impl_interface_method{RTCRDIGESTDESC::pfnFinal} */ +static DECLCALLBACK(void) rtCrDigestSha3t224_Final(void *pvState, uint8_t *pbHash) +{ + int rc = RTSha3t224Final((PRTSHA3T224CONTEXT)pvState, pbHash); + AssertRC(rc); +} + +/** @impl_interface_method{RTCRDIGESTDESC::pfnInit} */ +static DECLCALLBACK(int) rtCrDigestSha3t224_Init(void *pvState, void *pvOpaque, bool fReInit) +{ + RT_NOREF_PV(pvOpaque); + AssertReturn(pvOpaque == NULL, VERR_INVALID_PARAMETER); + if (fReInit) + RTSha3t224Cleanup((PRTSHA3T224CONTEXT)pvState); + return RTSha3t224Init((PRTSHA3T224CONTEXT)pvState); +} + +/** @impl_interface_method{RTCRDIGESTDESC::pfnDelete} */ +static DECLCALLBACK(void) rtCrDigestSha3t224_Delete(void *pvState) +{ + RTSha3t224Cleanup((PRTSHA3T224CONTEXT)pvState); +} + +/** @impl_interface_method{RTCRDIGESTDESC::pfnDelete} */ +static DECLCALLBACK(int) rtCrDigestSha3t224_Clone(void *pvState, void const *pvSrcState) +{ + return RTSha3t224Clone((PRTSHA3T224CONTEXT)pvState, (PRTSHA3T224CONTEXT)pvSrcState); +} + +/** SHA3-224 alias ODIs. */ +static const char * const g_apszSha3t224Aliases[] = +{ + "2.16.840.1.101.3.4.3.13", + NULL +}; + +/** SHA3-224 descriptor. */ +static RTCRDIGESTDESC const g_rtCrDigestSha3t224Desc = +{ + "sha3-224", + "2.16.840.1.101.3.4.2.7", + g_apszSha3t224Aliases, + RTDIGESTTYPE_SHA3_224, + RTSHA3_224_HASH_SIZE, + sizeof(RTSHA3T224CONTEXT), + 0, + NULL, + NULL, + rtCrDigestSha3t224_Update, + rtCrDigestSha3t224_Final, + rtCrDigestSha3t224_Init, + rtCrDigestSha3t224_Delete, + rtCrDigestSha3t224_Clone, + NULL, + NULL, +}; + + +/* + * SHA3-256 + */ + +/** @impl_interface_method{RTCRDIGESTDESC::pfnUpdate} */ +static DECLCALLBACK(void) rtCrDigestSha3t256_Update(void *pvState, const void *pvData, size_t cbData) +{ + int rc = RTSha3t256Update((PRTSHA3T256CONTEXT)pvState, pvData, cbData); + AssertRC(rc); +} + +/** @impl_interface_method{RTCRDIGESTDESC::pfnFinal} */ +static DECLCALLBACK(void) rtCrDigestSha3t256_Final(void *pvState, uint8_t *pbHash) +{ + int rc = RTSha3t256Final((PRTSHA3T256CONTEXT)pvState, pbHash); + AssertRC(rc); +} + +/** @impl_interface_method{RTCRDIGESTDESC::pfnInit} */ +static DECLCALLBACK(int) rtCrDigestSha3t256_Init(void *pvState, void *pvOpaque, bool fReInit) +{ + RT_NOREF_PV(pvOpaque); + AssertReturn(pvOpaque == NULL, VERR_INVALID_PARAMETER); + if (fReInit) + RTSha3t256Cleanup((PRTSHA3T256CONTEXT)pvState); + return RTSha3t256Init((PRTSHA3T256CONTEXT)pvState); +} + +/** @impl_interface_method{RTCRDIGESTDESC::pfnDelete} */ +static DECLCALLBACK(void) rtCrDigestSha3t256_Delete(void *pvState) +{ + RTSha3t256Cleanup((PRTSHA3T256CONTEXT)pvState); +} + +/** @impl_interface_method{RTCRDIGESTDESC::pfnDelete} */ +static DECLCALLBACK(int) rtCrDigestSha3t256_Clone(void *pvState, void const *pvSrcState) +{ + return RTSha3t256Clone((PRTSHA3T256CONTEXT)pvState, (PRTSHA3T256CONTEXT)pvSrcState); +} + +/** SHA3-256 alias ODIs. */ +static const char * const g_apszSha3t256Aliases[] = +{ + "2.16.840.1.101.3.4.3.14", + NULL +}; + +/** SHA3-256 descriptor. */ +static RTCRDIGESTDESC const g_rtCrDigestSha3t256Desc = +{ + "sha3-256", + "2.16.840.1.101.3.4.2.8", + g_apszSha3t256Aliases, + RTDIGESTTYPE_SHA3_256, + RTSHA3_256_HASH_SIZE, + sizeof(RTSHA3T256CONTEXT), + 0, + NULL, + NULL, + rtCrDigestSha3t256_Update, + rtCrDigestSha3t256_Final, + rtCrDigestSha3t256_Init, + rtCrDigestSha3t256_Delete, + rtCrDigestSha3t256_Clone, + NULL, + NULL, +}; + + +/* + * SHA3-384 + */ + +/** @impl_interface_method{RTCRDIGESTDESC::pfnUpdate} */ +static DECLCALLBACK(void) rtCrDigestSha3t384_Update(void *pvState, const void *pvData, size_t cbData) +{ + int rc = RTSha3t384Update((PRTSHA3T384CONTEXT)pvState, pvData, cbData); + AssertRC(rc); +} + +/** @impl_interface_method{RTCRDIGESTDESC::pfnFinal} */ +static DECLCALLBACK(void) rtCrDigestSha3t384_Final(void *pvState, uint8_t *pbHash) +{ + int rc = RTSha3t384Final((PRTSHA3T384CONTEXT)pvState, pbHash); + AssertRC(rc); +} + +/** @impl_interface_method{RTCRDIGESTDESC::pfnInit} */ +static DECLCALLBACK(int) rtCrDigestSha3t384_Init(void *pvState, void *pvOpaque, bool fReInit) +{ + RT_NOREF_PV(pvOpaque); + AssertReturn(pvOpaque == NULL, VERR_INVALID_PARAMETER); + if (fReInit) + RTSha3t384Cleanup((PRTSHA3T384CONTEXT)pvState); + return RTSha3t384Init((PRTSHA3T384CONTEXT)pvState); +} + +/** @impl_interface_method{RTCRDIGESTDESC::pfnDelete} */ +static DECLCALLBACK(void) rtCrDigestSha3t384_Delete(void *pvState) +{ + RTSha3t384Cleanup((PRTSHA3T384CONTEXT)pvState); +} + +/** @impl_interface_method{RTCRDIGESTDESC::pfnDelete} */ +static DECLCALLBACK(int) rtCrDigestSha3t384_Clone(void *pvState, void const *pvSrcState) +{ + return RTSha3t384Clone((PRTSHA3T384CONTEXT)pvState, (PRTSHA3T384CONTEXT)pvSrcState); +} + +/** SHA3-384 alias ODIs. */ +static const char * const g_apszSha3t384Aliases[] = +{ + "2.16.840.1.101.3.4.3.15", + NULL +}; + +/** SHA3-384 descriptor. */ +static RTCRDIGESTDESC const g_rtCrDigestSha3t384Desc = +{ + "sha3-384", + "2.16.840.1.101.3.4.2.9", + g_apszSha3t384Aliases, + RTDIGESTTYPE_SHA3_384, + RTSHA3_384_HASH_SIZE, + sizeof(RTSHA3T384CONTEXT), + 0, + NULL, + NULL, + rtCrDigestSha3t384_Update, + rtCrDigestSha3t384_Final, + rtCrDigestSha3t384_Init, + rtCrDigestSha3t384_Delete, + rtCrDigestSha3t384_Clone, + NULL, + NULL, +}; + + +/* + * SHA3-512 + */ + +/** @impl_interface_method{RTCRDIGESTDESC::pfnUpdate} */ +static DECLCALLBACK(void) rtCrDigestSha3t512_Update(void *pvState, const void *pvData, size_t cbData) +{ + int rc = RTSha3t512Update((PRTSHA3T512CONTEXT)pvState, pvData, cbData); + AssertRC(rc); +} + +/** @impl_interface_method{RTCRDIGESTDESC::pfnFinal} */ +static DECLCALLBACK(void) rtCrDigestSha3t512_Final(void *pvState, uint8_t *pbHash) +{ + int rc = RTSha3t512Final((PRTSHA3T512CONTEXT)pvState, pbHash); + AssertRC(rc); +} + +/** @impl_interface_method{RTCRDIGESTDESC::pfnInit} */ +static DECLCALLBACK(int) rtCrDigestSha3t512_Init(void *pvState, void *pvOpaque, bool fReInit) +{ + RT_NOREF_PV(pvOpaque); + AssertReturn(pvOpaque == NULL, VERR_INVALID_PARAMETER); + if (fReInit) + RTSha3t512Cleanup((PRTSHA3T512CONTEXT)pvState); + return RTSha3t512Init((PRTSHA3T512CONTEXT)pvState); +} + +/** @impl_interface_method{RTCRDIGESTDESC::pfnDelete} */ +static DECLCALLBACK(void) rtCrDigestSha3t512_Delete(void *pvState) +{ + RTSha3t512Cleanup((PRTSHA3T512CONTEXT)pvState); +} + +/** @impl_interface_method{RTCRDIGESTDESC::pfnDelete} */ +static DECLCALLBACK(int) rtCrDigestSha3t512_Clone(void *pvState, void const *pvSrcState) +{ + return RTSha3t512Clone((PRTSHA3T512CONTEXT)pvState, (PRTSHA3T512CONTEXT)pvSrcState); +} + +/** SHA3-512 alias ODIs. */ +static const char * const g_apszSha3t512Aliases[] = +{ + "2.16.840.1.101.3.4.3.16", + NULL +}; + +/** SHA3-512 descriptor. */ +static RTCRDIGESTDESC const g_rtCrDigestSha3t512Desc = +{ + "sha3-512", + "2.16.840.1.101.3.4.2.10", + g_apszSha3t512Aliases, + RTDIGESTTYPE_SHA3_512, + RTSHA3_512_HASH_SIZE, + sizeof(RTSHA3T512CONTEXT), + 0, + NULL, + NULL, + rtCrDigestSha3t512_Update, + rtCrDigestSha3t512_Final, + rtCrDigestSha3t512_Init, + rtCrDigestSha3t512_Delete, + rtCrDigestSha3t512_Clone, + NULL, + NULL, +}; + +#endif /* !IPRT_WITHOUT_SHA3 */ + /** * Array of built in message digest vtables. @@ -624,6 +905,12 @@ #ifndef IPRT_WITHOUT_SHA512T256 &g_rtCrDigestSha512t256Desc, #endif +#ifndef IPRT_WITHOUT_SHA3 + &g_rtCrDigestSha3t224Desc, + &g_rtCrDigestSha3t256Desc, + &g_rtCrDigestSha3t384Desc, + &g_rtCrDigestSha3t512Desc, +#endif }; diff -Nru virtualbox-hwe-6.1.34-dfsg/src/VBox/Runtime/common/crypto/digest-core.cpp virtualbox-hwe-6.1.38-dfsg/src/VBox/Runtime/common/crypto/digest-core.cpp --- virtualbox-hwe-6.1.34-dfsg/src/VBox/Runtime/common/crypto/digest-core.cpp 2022-03-22 23:45:19.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/src/VBox/Runtime/common/crypto/digest-core.cpp 2022-09-01 13:28:45.000000000 +0000 @@ -425,6 +425,12 @@ case RTDIGESTTYPE_SHA256: return RTCRX509ALGORITHMIDENTIFIERID_SHA256; case RTDIGESTTYPE_SHA384: return RTCRX509ALGORITHMIDENTIFIERID_SHA384; case RTDIGESTTYPE_SHA512: return RTCRX509ALGORITHMIDENTIFIERID_SHA512; + case RTDIGESTTYPE_SHA512T224: return RTCRX509ALGORITHMIDENTIFIERID_SHA512T224; + case RTDIGESTTYPE_SHA512T256: return RTCRX509ALGORITHMIDENTIFIERID_SHA512T256; + case RTDIGESTTYPE_SHA3_224: return RTCRX509ALGORITHMIDENTIFIERID_SHA3_224; + case RTDIGESTTYPE_SHA3_256: return RTCRX509ALGORITHMIDENTIFIERID_SHA3_256; + case RTDIGESTTYPE_SHA3_384: return RTCRX509ALGORITHMIDENTIFIERID_SHA3_384; + case RTDIGESTTYPE_SHA3_512: return RTCRX509ALGORITHMIDENTIFIERID_SHA3_512; default: return NULL; } } @@ -446,6 +452,10 @@ case RTDIGESTTYPE_SHA512: return "SHA-512"; case RTDIGESTTYPE_SHA512T224: return "SHA-512/224"; case RTDIGESTTYPE_SHA512T256: return "SHA-512/256"; + case RTDIGESTTYPE_SHA3_224: return "SHA3-224"; + case RTDIGESTTYPE_SHA3_256: return "SHA3-256"; + case RTDIGESTTYPE_SHA3_384: return "SHA3-384"; + case RTDIGESTTYPE_SHA3_512: return "SHA3-512"; default: return NULL; } } @@ -467,6 +477,10 @@ case RTDIGESTTYPE_SHA512: return 512 / 8; case RTDIGESTTYPE_SHA512T224: return 224 / 8; case RTDIGESTTYPE_SHA512T256: return 256 / 8; + case RTDIGESTTYPE_SHA3_224: return 224 / 8; + case RTDIGESTTYPE_SHA3_256: return 256 / 8; + case RTDIGESTTYPE_SHA3_384: return 384 / 8; + case RTDIGESTTYPE_SHA3_512: return 512 / 8; default: AssertFailed(); return 0; diff -Nru virtualbox-hwe-6.1.34-dfsg/src/VBox/Runtime/common/crypto/iprt-openssl.cpp virtualbox-hwe-6.1.38-dfsg/src/VBox/Runtime/common/crypto/iprt-openssl.cpp --- virtualbox-hwe-6.1.34-dfsg/src/VBox/Runtime/common/crypto/iprt-openssl.cpp 2022-03-22 23:45:19.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/src/VBox/Runtime/common/crypto/iprt-openssl.cpp 2022-09-01 13:28:45.000000000 +0000 @@ -33,6 +33,11 @@ #ifdef IPRT_WITH_OPENSSL /* Whole file. */ # include # include +# include +# include +# include +# include +# include # include "internal/iprt-openssl.h" # include @@ -48,6 +53,24 @@ ERR_load_ERR_strings(); ERR_load_crypto_strings(); + /* Add some OIDs we might possibly want to use. */ + static struct { const char *pszOid, *pszDesc; } const s_aOids[] = + { + { RTCRSPC_PE_IMAGE_HASHES_V1_OID, "Ms-SpcPeImagePageHashesV1" }, + { RTCRSPC_PE_IMAGE_HASHES_V2_OID, "Ms-SpcPeImagePageHashesV2" }, + { RTCRSPC_STMT_TYPE_INDIVIDUAL_CODE_SIGNING, "Ms-SpcIndividualCodeSigning" }, + { RTCRSPCPEIMAGEDATA_OID, "Ms-SpcPeImageData" }, + { RTCRSPCINDIRECTDATACONTENT_OID, "Ms-SpcIndirectDataContext" }, + { RTCR_PKCS9_ID_MS_TIMESTAMP, "Ms-CounterSign" }, + { RTCR_PKCS9_ID_MS_NESTED_SIGNATURE, "Ms-SpcNestedSignature" }, + { RTCR_PKCS9_ID_MS_STATEMENT_TYPE, "Ms-SpcStatementType" }, + { RTCR_PKCS9_ID_MS_SP_OPUS_INFO, "Ms-SpcOpusInfo" }, + { "1.3.6.1.4.1.311.3.2.1", "Ms-SpcTimeStampRequest" }, /** @todo define */ + { "1.3.6.1.4.1.311.10.1", "Ms-CertTrustList" }, /** @todo define */ + }; + for (unsigned i = 0; i < RT_ELEMENTS(s_aOids); i++) + OBJ_create(s_aOids[i].pszOid, s_aOids[i].pszDesc, s_aOids[i].pszDesc); + s_fOssInitalized = true; } } @@ -63,26 +86,105 @@ } -DECLHIDDEN(int) rtCrOpenSslAddX509CertToStack(void *pvOsslStack, PCRTCRX509CERTIFICATE pCert) +DECLHIDDEN(int) rtCrOpenSslConvertX509Cert(void **ppvOsslCert, PCRTCRX509CERTIFICATE pCert, PRTERRINFO pErrInfo) +{ + const unsigned char *pabEncoded; + uint32_t cbEncoded; + void *pvFree; + int rc = RTAsn1EncodeQueryRawBits(RTCrX509Certificate_GetAsn1Core(pCert), + (const uint8_t **)&pabEncoded, &cbEncoded, &pvFree, pErrInfo); + if (RT_SUCCESS(rc)) + { + X509 *pOsslCert = NULL; + X509 *pOsslCertRet = d2i_X509(&pOsslCert, &pabEncoded, cbEncoded); + RTMemTmpFree(pvFree); + if (pOsslCertRet == pOsslCert) + { + *ppvOsslCert = pOsslCert; + return VINF_SUCCESS; + } + rc = RTErrInfoSet(pErrInfo, VERR_CR_X509_OSSL_D2I_FAILED, "d2i_X509"); + + } + *ppvOsslCert = NULL; + return rc; +} + + +DECLHIDDEN(void) rtCrOpenSslFreeConvertedX509Cert(void *pvOsslCert) { - int rc; - const unsigned char *pabEncoded = (const unsigned char *)RTASN1CORE_GET_RAW_ASN1_PTR(&pCert->SeqCore.Asn1Core); - uint32_t cbEncoded = RTASN1CORE_GET_RAW_ASN1_SIZE(&pCert->SeqCore.Asn1Core); - X509 *pOsslCert = NULL; - if (d2i_X509(&pOsslCert, &pabEncoded, cbEncoded) == pOsslCert) + X509_free((X509 *)pvOsslCert); +} + + +DECLHIDDEN(int) rtCrOpenSslAddX509CertToStack(void *pvOsslStack, PCRTCRX509CERTIFICATE pCert, PRTERRINFO pErrInfo) +{ + X509 *pOsslCert = NULL; + int rc = rtCrOpenSslConvertX509Cert((void **)&pOsslCert, pCert, pErrInfo); + if (RT_SUCCESS(rc)) { if (sk_X509_push((STACK_OF(X509) *)pvOsslStack, pOsslCert)) rc = VINF_SUCCESS; else { - rc = VERR_NO_MEMORY; - X509_free(pOsslCert); + rtCrOpenSslFreeConvertedX509Cert(pOsslCert); + rc = RTErrInfoSet(pErrInfo, VERR_NO_MEMORY, "sk_X509_push"); } } - else - rc = VERR_CR_X509_OSSL_D2I_FAILED; return rc; } + +DECLHIDDEN(const void /*EVP_MD*/ *) rtCrOpenSslConvertDigestType(RTDIGESTTYPE enmDigestType, PRTERRINFO pErrInfo) +{ + const char *pszAlgoObjId = RTCrDigestTypeToAlgorithmOid(enmDigestType); + AssertReturnStmt(pszAlgoObjId, RTErrInfoSetF(pErrInfo, VERR_INVALID_PARAMETER, "Invalid type: %d", enmDigestType), NULL); + + int iAlgoNid = OBJ_txt2nid(pszAlgoObjId); + AssertReturnStmt(iAlgoNid != NID_undef, + RTErrInfoSetF(pErrInfo, VERR_CR_DIGEST_OSSL_DIGEST_INIT_ERROR, + "OpenSSL does not know: %s (%s)", pszAlgoObjId, RTCrDigestTypeToName(enmDigestType)), + NULL); + + const char *pszAlgoSn = OBJ_nid2sn(iAlgoNid); + const EVP_MD *pEvpMdType = EVP_get_digestbyname(pszAlgoSn); + AssertReturnStmt(pEvpMdType, + RTErrInfoSetF(pErrInfo, VERR_CR_DIGEST_OSSL_DIGEST_INIT_ERROR, "OpenSSL/EVP does not know: %d (%s; %s; %s)", + iAlgoNid, pszAlgoSn, pszAlgoSn, RTCrDigestTypeToName(enmDigestType)), + NULL); + + return pEvpMdType; +} + +DECLHIDDEN(int) rtCrOpenSslConvertPkcs7Attribute(void **ppvOsslAttrib, PCRTCRPKCS7ATTRIBUTE pAttrib, PRTERRINFO pErrInfo) +{ + const unsigned char *pabEncoded; + uint32_t cbEncoded; + void *pvFree; + int rc = RTAsn1EncodeQueryRawBits(RTCrPkcs7Attribute_GetAsn1Core(pAttrib), + (const uint8_t **)&pabEncoded, &cbEncoded, &pvFree, pErrInfo); + if (RT_SUCCESS(rc)) + { + X509_ATTRIBUTE *pOsslAttrib = NULL; + X509_ATTRIBUTE *pOsslAttribRet = d2i_X509_ATTRIBUTE(&pOsslAttrib, &pabEncoded, cbEncoded); + RTMemTmpFree(pvFree); + if (pOsslAttribRet == pOsslAttrib) + { + *ppvOsslAttrib = pOsslAttrib; + return VINF_SUCCESS; + } + rc = RTErrInfoSet(pErrInfo, VERR_CR_X509_OSSL_D2I_FAILED, "d2i_X509_ATTRIBUTE"); + } + *ppvOsslAttrib = NULL; + return rc; +} + + +DECLHIDDEN(void) rtCrOpenSslFreeConvertedPkcs7Attribute(void *pvOsslAttrib) +{ + X509_ATTRIBUTE_free((X509_ATTRIBUTE *)pvOsslAttrib); +} + + #endif /* IPRT_WITH_OPENSSL */ diff -Nru virtualbox-hwe-6.1.34-dfsg/src/VBox/Runtime/common/crypto/key-openssl.cpp virtualbox-hwe-6.1.38-dfsg/src/VBox/Runtime/common/crypto/key-openssl.cpp --- virtualbox-hwe-6.1.34-dfsg/src/VBox/Runtime/common/crypto/key-openssl.cpp 2022-03-22 23:45:19.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/src/VBox/Runtime/common/crypto/key-openssl.cpp 2022-09-01 13:28:45.000000000 +0000 @@ -59,8 +59,68 @@ * @param ppEvpMdType Where to optionally return the message digest type. * @param pErrInfo Where to optionally return more error details. */ -DECLHIDDEN(int) rtCrKeyToOpenSslKey(RTCRKEY hKey, bool fNeedPublic, const char *pszAlgoObjId, - void /*EVP_PKEY*/ **ppEvpKey, const void /*EVP_MD*/ **ppEvpMdType, PRTERRINFO pErrInfo) +DECLHIDDEN(int) rtCrKeyToOpenSslKey(RTCRKEY hKey, bool fNeedPublic, void /*EVP_PKEY*/ **ppEvpKey, PRTERRINFO pErrInfo) +{ + *ppEvpKey = NULL; + AssertReturn(hKey->u32Magic == RTCRKEYINT_MAGIC, VERR_INVALID_HANDLE); + AssertReturn(fNeedPublic == !(hKey->fFlags & RTCRKEYINT_F_PRIVATE), VERR_WRONG_TYPE); + + rtCrOpenSslInit(); + + /* + * Translate the key type from IPRT to EVP speak. + */ + int idKeyType; + switch (hKey->enmType) + { + case RTCRKEYTYPE_RSA_PRIVATE: + case RTCRKEYTYPE_RSA_PUBLIC: + idKeyType = EVP_PKEY_RSA; + break; + default: + return RTErrInfoSetF(pErrInfo, VERR_NOT_SUPPORTED, "Unsupported key type: %d", hKey->enmType); + } + + /* + * Allocate a new key structure and set its type. + */ + EVP_PKEY *pEvpNewKey = EVP_PKEY_new(); + if (!pEvpNewKey) + return RTErrInfoSetF(pErrInfo, VERR_NO_MEMORY, "EVP_PKEY_new/%d failed", idKeyType); + + /* + * Load the key into the structure. + */ + const unsigned char *puchPublicKey = hKey->pbEncoded; + EVP_PKEY *pRet; + if (fNeedPublic) + *ppEvpKey = pRet = d2i_PublicKey(idKeyType, &pEvpNewKey, &puchPublicKey, hKey->cbEncoded); + else + *ppEvpKey = pRet = d2i_PrivateKey(idKeyType, &pEvpNewKey, &puchPublicKey, hKey->cbEncoded); + if (pRet) + return VINF_SUCCESS; + + /* Bail out: */ + EVP_PKEY_free(pEvpNewKey); + return RTErrInfoSet(pErrInfo, VERR_CR_PKIX_OSSL_D2I_PUBLIC_KEY_FAILED, + fNeedPublic ? "d2i_PublicKey failed" : "d2i_PrivateKey failed"); +} + + +/** + * Creates an OpenSSL key for the given IPRT one, returning the message digest + * algorithm if desired. + * + * @returns IRPT status code. + * @param hKey The key to convert to an OpenSSL key. + * @param fNeedPublic Set if we need the public side of the key. + * @param pszAlgoObjId Alogrithm stuff we currently need. + * @param ppEvpKey Where to return the pointer to the key structure. + * @param ppEvpMdType Where to optionally return the message digest type. + * @param pErrInfo Where to optionally return more error details. + */ +DECLHIDDEN(int) rtCrKeyToOpenSslKeyEx(RTCRKEY hKey, bool fNeedPublic, const char *pszAlgoObjId, + void /*EVP_PKEY*/ **ppEvpKey, const void /*EVP_MD*/ **ppEvpMdType, PRTERRINFO pErrInfo) { *ppEvpKey = NULL; if (ppEvpMdType) diff -Nru virtualbox-hwe-6.1.34-dfsg/src/VBox/Runtime/common/crypto/pemfile.cpp virtualbox-hwe-6.1.38-dfsg/src/VBox/Runtime/common/crypto/pemfile.cpp --- virtualbox-hwe-6.1.34-dfsg/src/VBox/Runtime/common/crypto/pemfile.cpp 2022-03-22 23:45:19.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/src/VBox/Runtime/common/crypto/pemfile.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,652 +0,0 @@ -/* $Id: pemfile.cpp $ */ -/** @file - * IPRT - Crypto - PEM file reader / writer. - * - * See RFC-1341 for the original ideas for the format, but keep in mind - * that the format was hijacked and put to different uses. We're aiming at - * dealing with the different uses rather than anything email related here. - */ - -/* - * Copyright (C) 2006-2020 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 "internal/iprt.h" -#include - -#include -#include -#include -#include -#include -#include -#include -#include - - - -/** - * Looks for a PEM-like marker. - * - * @returns true if found, false if not. - * @param pbContent Start of the content to search thru. - * @param cbContent The size of the content to search. - * @param offStart The offset into pbContent to start searching. - * @param pszLeadWord The lead word (BEGIN/END). - * @param cchLeadWord The length of the lead word. - * @param paMarkers Pointer to an array of markers. - * @param cMarkers Number of markers in the array. - * @param ppMatch Where to return the pointer to the matching - * marker. Optional. - * @param poffBegin Where to return the start offset of the marker. - * Optional. - * @param poffEnd Where to return the end offset of the marker - * (trailing whitespace and newlines will be - * skipped). Optional. - */ -static bool rtCrPemFindMarker(uint8_t const *pbContent, size_t cbContent, size_t offStart, - const char *pszLeadWord, size_t cchLeadWord, PCRTCRPEMMARKER paMarkers, size_t cMarkers, - PCRTCRPEMMARKER *ppMatch, size_t *poffBegin, size_t *poffEnd) -{ - /* Remember the start of the content for the purpose of calculating offsets. */ - uint8_t const * const pbStart = pbContent; - - /* Skip adhead by offStart */ - if (offStart >= cbContent) - return false; - pbContent += offStart; - cbContent -= offStart; - - /* - * Search the content. - */ - while (cbContent > 6) - { - /* - * Look for dashes. - */ - uint8_t const *pbStartSearch = pbContent; - pbContent = (uint8_t const *)memchr(pbContent, '-', cbContent); - if (!pbContent) - break; - - cbContent -= pbContent - pbStartSearch; - if (cbContent < 6) - break; - - /* - * There must be at least three to interest us. - */ - if ( pbContent[1] == '-' - && pbContent[2] == '-') - { - unsigned cDashes = 3; - while (cDashes < cbContent && pbContent[cDashes] == '-') - cDashes++; - - if (poffBegin) - *poffBegin = pbContent - pbStart; - cbContent -= cDashes; - pbContent += cDashes; - - /* - * Match lead word. - */ - if ( cbContent > cchLeadWord - && memcmp(pbContent, pszLeadWord, cchLeadWord) == 0 - && RT_C_IS_BLANK(pbContent[cchLeadWord]) ) - { - pbContent += cchLeadWord; - cbContent -= cchLeadWord; - while (cbContent > 0 && RT_C_IS_BLANK(*pbContent)) - { - pbContent++; - cbContent--; - } - - /* - * Match one of the specified markers. - */ - uint8_t const *pbSavedContent = pbContent; - size_t const cbSavedContent = cbContent; - for (uint32_t iMarker = 0; iMarker < cMarkers; iMarker++) - { - pbContent = pbSavedContent; - cbContent = cbSavedContent; - - uint32_t cWords = paMarkers[iMarker].cWords; - PCRTCRPEMMARKERWORD pWord = paMarkers[iMarker].paWords; - while (cWords > 0) - { - uint32_t const cchWord = pWord->cchWord; - if (cbContent <= cchWord) - break; - if (memcmp(pbContent, pWord->pszWord, cchWord)) - break; - pbContent += cchWord; - cbContent -= cchWord; - - if (!cbContent) - break; - if (RT_C_IS_BLANK(*pbContent)) - do - { - pbContent++; - cbContent--; - } while (cbContent > 0 && RT_C_IS_BLANK(*pbContent)); - else if (cWords > 1 || pbContent[0] != '-') - break; - - cWords--; - if (cWords == 0) - { - /* - * If there are three or more dashes following now, we've got a hit. - */ - if ( cbContent > 3 - && pbContent[0] == '-' - && pbContent[1] == '-' - && pbContent[2] == '-') - { - cDashes = 3; - while (cDashes < cbContent && pbContent[cDashes] == '-') - cDashes++; - cbContent -= cDashes; - pbContent += cDashes; - - /* - * Skip spaces and newline. - */ - while (cbContent > 0 && RT_C_IS_SPACE(*pbContent)) - pbContent++, cbContent--; - if (poffEnd) - *poffEnd = pbContent - pbStart; - if (ppMatch) - *ppMatch = &paMarkers[iMarker]; - return true; - } - break; - } - pWord++; - } /* for each word in marker. */ - } /* for each marker. */ - } - } - else - { - pbContent++; - cbContent--; - } - } - - return false; -} - - -static bool rtCrPemFindMarkerSection(uint8_t const *pbContent, size_t cbContent, size_t offStart, - PCRTCRPEMMARKER paMarkers, size_t cMarkers, - PCRTCRPEMMARKER *ppMatch, size_t *poffBegin, size_t *poffEnd, size_t *poffResume) -{ - /** @todo Detect BEGIN / END mismatch. */ - PCRTCRPEMMARKER pMatch; - if (rtCrPemFindMarker(pbContent, cbContent, offStart, "BEGIN", 5, paMarkers, cMarkers, - &pMatch, NULL /*poffStart*/, poffBegin)) - { - if (rtCrPemFindMarker(pbContent, cbContent, *poffBegin, "END", 3, pMatch, 1, - NULL /*ppMatch*/, poffEnd, poffResume)) - { - *ppMatch = pMatch; - return true; - } - } - *ppMatch = NULL; - return false; -} - - -/** - * Parses any fields the message may contain. - * - * @retval VINF_SUCCESS - * @retval VERR_NO_MEMORY - * @retval VERR_CR_MALFORMED_PEM_HEADER - * - * @param pSection The current section, where we will attach a list of - * fields to the pFieldHead member. - * @param pbContent The content of the PEM message being parsed. - * @param cbContent The length of the PEM message. - * @param pcbFields Where to return the length of the header fields we found. - */ -static int rtCrPemProcessFields(PRTCRPEMSECTION pSection, uint8_t const *pbContent, size_t cbContent, size_t *pcbFields) -{ - uint8_t const * const pbContentStart = pbContent; - - /* - * Work the encapulated header protion field by field. - * - * This is optional, so currently we don't throw errors here but leave that - * to when we work the text portion with the base64 decoder. Also, as a reader - * we don't go all pedanic on confirming to specification (RFC-1421), especially - * given that it's used for crypto certificates, keys and the like not email. :-) - */ - PCRTCRPEMFIELD *ppNext = &pSection->pFieldHead; - while (cbContent > 0) - { - /* Just look for a colon first. */ - const uint8_t *pbColon = (const uint8_t *)memchr(pbContent, ':', cbContent); - if (!pbColon) - break; - size_t offColon = pbColon - pbContent; - - /* Check that the colon is within the first line. */ - if (!memchr(pbContent, '\n', cbContent - offColon)) - return VERR_CR_MALFORMED_PEM_HEADER; - - /* Skip leading spaces (there shouldn't be any, but just in case). */ - while (RT_C_IS_BLANK(*pbContent) && /*paranoia:*/ offColon > 0) - { - offColon--; - cbContent--; - pbContent++; - } - - /* There shouldn't be any spaces before the colon, but just in case */ - size_t cchName = offColon; - while (cchName > 0 && RT_C_IS_BLANK(pbContent[cchName - 1])) - cchName--; - - /* Skip leading value spaces (there typically is at least one). */ - size_t offValue = offColon + 1; - while (offValue < cbContent && RT_C_IS_BLANK(pbContent[offValue])) - offValue++; - - /* Find the newline the field value ends with and where the next iteration should start later on. */ - size_t cbLeft; - uint8_t const *pbNext = (uint8_t const *)memchr(&pbContent[offValue], '\n', cbContent - offValue); - while ( pbNext - && (cbLeft = pbNext - pbContent) < cbContent - && RT_C_IS_BLANK(pbNext[1]) /* next line must start with a space or tab */) - pbNext = (uint8_t const *)memchr(&pbNext[1], '\n', cbLeft - 1); - - size_t cchValue; - if (pbNext) - { - cchValue = pbNext - &pbContent[offValue]; - if (cchValue > 0 && pbNext[-1] == '\r') - cchValue--; - pbNext++; - } - else - { - cchValue = cbContent - offValue; - pbNext = &pbContent[cbContent]; - } - - /* Strip trailing spaces. */ - while (cchValue > 0 && RT_C_IS_BLANK(pbContent[offValue + cchValue - 1])) - cchValue--; - - /* - * Allocate a field instance. - * - * Note! We don't consider field data sensitive at the moment. This - * mainly because the fields are chiefly used to indicate the - * encryption parameters to the body. - */ - PRTCRPEMFIELD pNewField = (PRTCRPEMFIELD)RTMemAllocZVar(sizeof(*pNewField) + cchName + 1 + cchValue + 1); - if (!pNewField) - return VERR_NO_MEMORY; - pNewField->cchName = cchName; - pNewField->cchValue = cchValue; - memcpy(pNewField->szName, pbContent, cchName); - pNewField->szName[cchName] = '\0'; - char *pszDst = (char *)memcpy(&pNewField->szName[cchName + 1], &pbContent[offValue], cchValue); - pNewField->pszValue = pszDst; - pszDst[cchValue] = '\0'; - pNewField->pNext = NULL; - - *ppNext = pNewField; - ppNext = &pNewField->pNext; - - /* - * Advance past the field. - */ - cbContent -= pbNext - pbContent; - pbContent = pbNext; - } - - /* - * Skip blank line(s) before the body. - */ - while (cbContent >= 1) - { - size_t cbSkip; - if (pbContent[0] == '\n') - cbSkip = 1; - else if ( pbContent[0] == '\r' - && cbContent >= 2 - && pbContent[1] == '\n') - cbSkip = 2; - else - break; - pbContent += cbSkip; - cbContent -= cbSkip; - } - - *pcbFields = pbContent - pbContentStart; - return VINF_SUCCESS; -} - - -/** - * Does the decoding of a PEM-like data blob after it has been located. - * - * @returns IPRT status ocde - * @param pbContent The start of the PEM-like content (text). - * @param cbContent The max size of the PEM-like content. - * @param fSensitive Set if the safer allocator should be used. - * @param ppvDecoded Where to return a heap block containing the - * decoded content. - * @param pcbDecoded Where to return the size of the decoded content. - */ -static int rtCrPemDecodeBase64(uint8_t const *pbContent, size_t cbContent, bool fSensitive, - void **ppvDecoded, size_t *pcbDecoded) -{ - ssize_t cbDecoded = RTBase64DecodedSizeEx((const char *)pbContent, cbContent, NULL); - if (cbDecoded < 0) - return VERR_INVALID_BASE64_ENCODING; - - *pcbDecoded = cbDecoded; - void *pvDecoded = !fSensitive ? RTMemAlloc(cbDecoded) : RTMemSaferAllocZ(cbDecoded); - if (!pvDecoded) - return VERR_NO_MEMORY; - - size_t cbActual; - int rc = RTBase64DecodeEx((const char *)pbContent, cbContent, pvDecoded, cbDecoded, &cbActual, NULL); - if (RT_SUCCESS(rc)) - { - if (cbActual == (size_t)cbDecoded) - { - *ppvDecoded = pvDecoded; - return VINF_SUCCESS; - } - - rc = VERR_INTERNAL_ERROR_3; - } - if (!fSensitive) - RTMemFree(pvDecoded); - else - RTMemSaferFree(pvDecoded, cbDecoded); - return rc; -} - - -/** - * Checks if the content of a file looks to be binary or not. - * - * @returns true if likely to be binary, false if not binary. - * @param pbFile The file bytes to scan. - * @param cbFile The number of bytes. - * @param fFlags RTCRPEMREADFILE_F_XXX - */ -static bool rtCrPemIsBinaryBlob(uint8_t const *pbFile, size_t cbFile, uint32_t fFlags) -{ - if (fFlags & RTCRPEMREADFILE_F_ONLY_PEM) - return false; - - /* - * Well formed PEM files should probably only contain 7-bit ASCII and - * restrict thenselfs to the following control characters: - * tab, newline, return, form feed - * - * However, if we want to read PEM files which contains human readable - * certificate details before or after each base-64 section, we can't stick - * to 7-bit ASCII. We could say it must be UTF-8, but that's probably to - * limited as well. So, we'll settle for detecting binary files by control - * characters alone (safe enough for DER encoded stuff, I think). - */ - while (cbFile-- > 0) - { - uint8_t const b = *pbFile++; - if (b < 32 && b != '\t' && b != '\n' && b != '\r' && b != '\f') - { - /* Ignore EOT (4), SUB (26) and NUL (0) at the end of the file. */ - if ( (b == 4 || b == 26) - && ( cbFile == 0 - || ( cbFile == 1 - && *pbFile == '\0'))) - return false; - - if (b == 0 && cbFile == 0) - return false; - - return true; - } - } - return false; -} - - -RTDECL(int) RTCrPemFreeSections(PCRTCRPEMSECTION pSectionHead) -{ - while (pSectionHead != NULL) - { - PRTCRPEMSECTION pFree = (PRTCRPEMSECTION)pSectionHead; - pSectionHead = pSectionHead->pNext; - ASMCompilerBarrier(); /* paranoia */ - - if (pFree->pbData) - { - if (!pFree->fSensitive) - RTMemFree(pFree->pbData); - else - RTMemSaferFree(pFree->pbData, pFree->cbData); - pFree->pbData = NULL; - pFree->cbData = 0; - } - - PRTCRPEMFIELD pField = (PRTCRPEMFIELD)pFree->pFieldHead; - if (pField) - { - pFree->pFieldHead = NULL; - do - { - PRTCRPEMFIELD pFreeField = pField; - pField = (PRTCRPEMFIELD)pField->pNext; - ASMCompilerBarrier(); /* paranoia */ - - pFreeField->pszValue = NULL; - RTMemFree(pFreeField); - } while (pField); - } - - RTMemFree(pFree); - } - return VINF_SUCCESS; -} - - -RTDECL(int) RTCrPemParseContent(void const *pvContent, size_t cbContent, uint32_t fFlags, - PCRTCRPEMMARKER paMarkers, size_t cMarkers, - PCRTCRPEMSECTION *ppSectionHead, PRTERRINFO pErrInfo) -{ - RT_NOREF_PV(pErrInfo); - - /* - * Input validation. - */ - AssertPtr(ppSectionHead); - *ppSectionHead = NULL; - AssertReturn(cbContent, VINF_EOF); - AssertPtr(pvContent); - AssertPtr(paMarkers); - AssertReturn(!(fFlags & ~RTCRPEMREADFILE_F_VALID_MASK), VERR_INVALID_FLAGS); - - /* - * Pre-allocate a section. - */ - int rc = VINF_SUCCESS; - PRTCRPEMSECTION pSection = (PRTCRPEMSECTION)RTMemAllocZ(sizeof(*pSection)); - if (pSection) - { - bool const fSensitive = RT_BOOL(fFlags & RTCRPEMREADFILE_F_SENSITIVE); - - /* - * Try locate the first section. - */ - uint8_t const *pbContent = (uint8_t const *)pvContent; - size_t offBegin, offEnd, offResume; - PCRTCRPEMMARKER pMatch; - if ( !rtCrPemIsBinaryBlob(pbContent, cbContent, fFlags) - && rtCrPemFindMarkerSection(pbContent, cbContent, 0 /*offStart*/, paMarkers, cMarkers, - &pMatch, &offBegin, &offEnd, &offResume) ) - { - PCRTCRPEMSECTION *ppNext = ppSectionHead; - for (;;) - { - //pSection->pNext = NULL; - pSection->pMarker = pMatch; - //pSection->pbData = NULL; - //pSection->cbData = 0; - //pSection->pFieldHead = NULL; - pSection->fSensitive = fSensitive; - - *ppNext = pSection; - ppNext = &pSection->pNext; - - /* - * Decode the section. - */ - size_t cbFields = 0; - int rc2 = rtCrPemProcessFields(pSection, pbContent + offBegin, offEnd - offBegin, &cbFields); - offBegin += cbFields; - if (RT_SUCCESS(rc2)) - rc2 = rtCrPemDecodeBase64(pbContent + offBegin, offEnd - offBegin, fSensitive, - (void **)&pSection->pbData, &pSection->cbData); - if (RT_FAILURE(rc2)) - { - pSection->pbData = NULL; - pSection->cbData = 0; - if ( rc2 == VERR_INVALID_BASE64_ENCODING - && (fFlags & RTCRPEMREADFILE_F_CONTINUE_ON_ENCODING_ERROR)) - rc = -rc2; - else - { - rc = rc2; - break; - } - } - - /* - * More sections? - */ - if ( offResume + 12 >= cbContent - || offResume >= cbContent - || !rtCrPemFindMarkerSection(pbContent, cbContent, offResume, paMarkers, cMarkers, - &pMatch, &offBegin, &offEnd, &offResume) ) - break; /* No. */ - - /* Ok, allocate a new record for it. */ - pSection = (PRTCRPEMSECTION)RTMemAllocZ(sizeof(*pSection)); - if (RT_UNLIKELY(!pSection)) - { - rc = VERR_NO_MEMORY; - break; - } - } - if (RT_SUCCESS(rc)) - return rc; - - RTCrPemFreeSections(*ppSectionHead); - } - else - { - if (!(fFlags & RTCRPEMREADFILE_F_ONLY_PEM)) - { - /* - * No PEM section found. Return the whole file as one binary section. - */ - //pSection->pNext = NULL; - //pSection->pMarker = NULL; - //pSection->pFieldHead = NULL; - pSection->cbData = cbContent; - pSection->fSensitive = fSensitive; - if (!fSensitive) - pSection->pbData = (uint8_t *)RTMemDup(pbContent, cbContent); - else - { - pSection->pbData = (uint8_t *)RTMemSaferAllocZ(cbContent); - if (pSection->pbData) - memcpy(pSection->pbData, pbContent, cbContent); - } - if (pSection->pbData) - { - *ppSectionHead = pSection; - return VINF_SUCCESS; - } - - rc = VERR_NO_MEMORY; - } - else - rc = VWRN_NOT_FOUND; - RTMemFree(pSection); - } - } - else - rc = VERR_NO_MEMORY; - *ppSectionHead = NULL; - return rc; -} - - -RTDECL(int) RTCrPemReadFile(const char *pszFilename, uint32_t fFlags, PCRTCRPEMMARKER paMarkers, size_t cMarkers, - PCRTCRPEMSECTION *ppSectionHead, PRTERRINFO pErrInfo) -{ - *ppSectionHead = NULL; - AssertReturn(!(fFlags & ~RTCRPEMREADFILE_F_VALID_MASK), VERR_INVALID_FLAGS); - - size_t cbContent; - void *pvContent; - int rc = RTFileReadAllEx(pszFilename, 0, 64U*_1M, RTFILE_RDALL_O_DENY_WRITE, &pvContent, &cbContent); - if (RT_SUCCESS(rc)) - { - rc = RTCrPemParseContent(pvContent, cbContent, fFlags, paMarkers, cMarkers, ppSectionHead, pErrInfo); - if (fFlags & RTCRPEMREADFILE_F_SENSITIVE) - RTMemWipeThoroughly(pvContent, cbContent, 3); - RTFileReadAllFree(pvContent, cbContent); - } - else - rc = RTErrInfoSetF(pErrInfo, rc, "RTFileReadAllEx failed with %Rrc on '%s'", rc, pszFilename); - return rc; -} - - -RTDECL(const char *) RTCrPemFindFirstSectionInContent(void const *pvContent, size_t cbContent, - PCRTCRPEMMARKER paMarkers, size_t cMarkers) -{ - size_t offBegin; - if (rtCrPemFindMarker((uint8_t *)pvContent, cbContent, 0, "BEGIN", 5, paMarkers, cMarkers, NULL, &offBegin, NULL)) - return (const char *)pvContent + offBegin; - return NULL; -} diff -Nru virtualbox-hwe-6.1.34-dfsg/src/VBox/Runtime/common/crypto/pemfile-read.cpp virtualbox-hwe-6.1.38-dfsg/src/VBox/Runtime/common/crypto/pemfile-read.cpp --- virtualbox-hwe-6.1.34-dfsg/src/VBox/Runtime/common/crypto/pemfile-read.cpp 1970-01-01 00:00:00.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/src/VBox/Runtime/common/crypto/pemfile-read.cpp 2022-09-01 13:28:45.000000000 +0000 @@ -0,0 +1,653 @@ +/* $Id: pemfile-read.cpp $ */ +/** @file + * IPRT - Crypto - PEM file reader. + * + * See RFC-1341 for the original ideas for the format, but keep in mind + * that the format was hijacked and put to different uses. We're aiming at + * dealing with the different uses rather than anything email related here. + */ + +/* + * Copyright (C) 2006-2020 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 "internal/iprt.h" +#include + +#include +#include +#include +#include +#include +#include +#include +#include + + + +/** + * Looks for a PEM-like marker. + * + * @returns true if found, false if not. + * @param pbContent Start of the content to search thru. + * @param cbContent The size of the content to search. + * @param offStart The offset into pbContent to start searching. + * @param pszLeadWord The lead word (BEGIN/END). + * @param cchLeadWord The length of the lead word. + * @param paMarkers Pointer to an array of markers. + * @param cMarkers Number of markers in the array. + * @param ppMatch Where to return the pointer to the matching + * marker. Optional. + * @param poffBegin Where to return the start offset of the marker. + * Optional. + * @param poffEnd Where to return the end offset of the marker + * (trailing whitespace and newlines will be + * skipped). Optional. + */ +static bool rtCrPemFindMarker(uint8_t const *pbContent, size_t cbContent, size_t offStart, + const char *pszLeadWord, size_t cchLeadWord, PCRTCRPEMMARKER paMarkers, size_t cMarkers, + PCRTCRPEMMARKER *ppMatch, size_t *poffBegin, size_t *poffEnd) +{ + /* Remember the start of the content for the purpose of calculating offsets. */ + uint8_t const * const pbStart = pbContent; + + /* Skip adhead by offStart */ + if (offStart >= cbContent) + return false; + pbContent += offStart; + cbContent -= offStart; + + /* + * Search the content. + */ + while (cbContent > 6) + { + /* + * Look for dashes. + */ + uint8_t const *pbStartSearch = pbContent; + pbContent = (uint8_t const *)memchr(pbContent, '-', cbContent); + if (!pbContent) + break; + + cbContent -= pbContent - pbStartSearch; + if (cbContent < 6) + break; + + /* + * There must be at least three to interest us. + */ + if ( pbContent[1] == '-' + && pbContent[2] == '-') + { + unsigned cDashes = 3; + while (cDashes < cbContent && pbContent[cDashes] == '-') + cDashes++; + + if (poffBegin) + *poffBegin = pbContent - pbStart; + cbContent -= cDashes; + pbContent += cDashes; + + /* + * Match lead word. + */ + if ( cbContent > cchLeadWord + && memcmp(pbContent, pszLeadWord, cchLeadWord) == 0 + && RT_C_IS_BLANK(pbContent[cchLeadWord]) ) + { + pbContent += cchLeadWord; + cbContent -= cchLeadWord; + while (cbContent > 0 && RT_C_IS_BLANK(*pbContent)) + { + pbContent++; + cbContent--; + } + + /* + * Match one of the specified markers. + */ + uint8_t const *pbSavedContent = pbContent; + size_t const cbSavedContent = cbContent; + for (uint32_t iMarker = 0; iMarker < cMarkers; iMarker++) + { + pbContent = pbSavedContent; + cbContent = cbSavedContent; + + uint32_t cWords = paMarkers[iMarker].cWords; + PCRTCRPEMMARKERWORD pWord = paMarkers[iMarker].paWords; + while (cWords > 0) + { + uint32_t const cchWord = pWord->cchWord; + if (cbContent <= cchWord) + break; + if (memcmp(pbContent, pWord->pszWord, cchWord)) + break; + pbContent += cchWord; + cbContent -= cchWord; + + if (!cbContent) + break; + if (RT_C_IS_BLANK(*pbContent)) + do + { + pbContent++; + cbContent--; + } while (cbContent > 0 && RT_C_IS_BLANK(*pbContent)); + else if (cWords > 1 || pbContent[0] != '-') + break; + + cWords--; + if (cWords == 0) + { + /* + * If there are three or more dashes following now, we've got a hit. + */ + if ( cbContent > 3 + && pbContent[0] == '-' + && pbContent[1] == '-' + && pbContent[2] == '-') + { + cDashes = 3; + while (cDashes < cbContent && pbContent[cDashes] == '-') + cDashes++; + cbContent -= cDashes; + pbContent += cDashes; + + /* + * Skip spaces and newline. + */ + while (cbContent > 0 && RT_C_IS_SPACE(*pbContent)) + pbContent++, cbContent--; + if (poffEnd) + *poffEnd = pbContent - pbStart; + if (ppMatch) + *ppMatch = &paMarkers[iMarker]; + return true; + } + break; + } + pWord++; + } /* for each word in marker. */ + } /* for each marker. */ + } + } + else + { + pbContent++; + cbContent--; + } + } + + return false; +} + + +static bool rtCrPemFindMarkerSection(uint8_t const *pbContent, size_t cbContent, size_t offStart, + PCRTCRPEMMARKER paMarkers, size_t cMarkers, + PCRTCRPEMMARKER *ppMatch, size_t *poffBegin, size_t *poffEnd, size_t *poffResume) +{ + /** @todo Detect BEGIN / END mismatch. */ + PCRTCRPEMMARKER pMatch; + if (rtCrPemFindMarker(pbContent, cbContent, offStart, "BEGIN", 5, paMarkers, cMarkers, + &pMatch, NULL /*poffStart*/, poffBegin)) + { + if (rtCrPemFindMarker(pbContent, cbContent, *poffBegin, "END", 3, pMatch, 1, + NULL /*ppMatch*/, poffEnd, poffResume)) + { + *ppMatch = pMatch; + return true; + } + } + *ppMatch = NULL; + return false; +} + + +/** + * Parses any fields the message may contain. + * + * @retval VINF_SUCCESS + * @retval VERR_NO_MEMORY + * @retval VERR_CR_MALFORMED_PEM_HEADER + * + * @param pSection The current section, where we will attach a list of + * fields to the pFieldHead member. + * @param pbContent The content of the PEM message being parsed. + * @param cbContent The length of the PEM message. + * @param pcbFields Where to return the length of the header fields we found. + */ +static int rtCrPemProcessFields(PRTCRPEMSECTION pSection, uint8_t const *pbContent, size_t cbContent, size_t *pcbFields) +{ + uint8_t const * const pbContentStart = pbContent; + + /* + * Work the encapulated header protion field by field. + * + * This is optional, so currently we don't throw errors here but leave that + * to when we work the text portion with the base64 decoder. Also, as a reader + * we don't go all pedanic on confirming to specification (RFC-1421), especially + * given that it's used for crypto certificates, keys and the like not email. :-) + */ + PCRTCRPEMFIELD *ppNext = &pSection->pFieldHead; + while (cbContent > 0) + { + /* Just look for a colon first. */ + const uint8_t *pbColon = (const uint8_t *)memchr(pbContent, ':', cbContent); + if (!pbColon) + break; + size_t offColon = pbColon - pbContent; + + /* Check that the colon is within the first line. */ + if (!memchr(pbContent, '\n', cbContent - offColon)) + return VERR_CR_MALFORMED_PEM_HEADER; + + /* Skip leading spaces (there shouldn't be any, but just in case). */ + while (RT_C_IS_BLANK(*pbContent) && /*paranoia:*/ offColon > 0) + { + offColon--; + cbContent--; + pbContent++; + } + + /* There shouldn't be any spaces before the colon, but just in case */ + size_t cchName = offColon; + while (cchName > 0 && RT_C_IS_BLANK(pbContent[cchName - 1])) + cchName--; + + /* Skip leading value spaces (there typically is at least one). */ + size_t offValue = offColon + 1; + while (offValue < cbContent && RT_C_IS_BLANK(pbContent[offValue])) + offValue++; + + /* Find the newline the field value ends with and where the next iteration should start later on. */ + size_t cbLeft; + uint8_t const *pbNext = (uint8_t const *)memchr(&pbContent[offValue], '\n', cbContent - offValue); + while ( pbNext + && (cbLeft = pbNext - pbContent) < cbContent + && RT_C_IS_BLANK(pbNext[1]) /* next line must start with a space or tab */) + pbNext = (uint8_t const *)memchr(&pbNext[1], '\n', cbLeft - 1); + + size_t cchValue; + if (pbNext) + { + cchValue = pbNext - &pbContent[offValue]; + if (cchValue > 0 && pbNext[-1] == '\r') + cchValue--; + pbNext++; + } + else + { + cchValue = cbContent - offValue; + pbNext = &pbContent[cbContent]; + } + + /* Strip trailing spaces. */ + while (cchValue > 0 && RT_C_IS_BLANK(pbContent[offValue + cchValue - 1])) + cchValue--; + + /* + * Allocate a field instance. + * + * Note! We don't consider field data sensitive at the moment. This + * mainly because the fields are chiefly used to indicate the + * encryption parameters to the body. + */ + PRTCRPEMFIELD pNewField = (PRTCRPEMFIELD)RTMemAllocZVar(sizeof(*pNewField) + cchName + 1 + cchValue + 1); + if (!pNewField) + return VERR_NO_MEMORY; + pNewField->cchName = cchName; + pNewField->cchValue = cchValue; + memcpy(pNewField->szName, pbContent, cchName); + pNewField->szName[cchName] = '\0'; + char *pszDst = (char *)memcpy(&pNewField->szName[cchName + 1], &pbContent[offValue], cchValue); + pNewField->pszValue = pszDst; + pszDst[cchValue] = '\0'; + pNewField->pNext = NULL; + + *ppNext = pNewField; + ppNext = &pNewField->pNext; + + /* + * Advance past the field. + */ + cbContent -= pbNext - pbContent; + pbContent = pbNext; + } + + /* + * Skip blank line(s) before the body. + */ + while (cbContent >= 1) + { + size_t cbSkip; + if (pbContent[0] == '\n') + cbSkip = 1; + else if ( pbContent[0] == '\r' + && cbContent >= 2 + && pbContent[1] == '\n') + cbSkip = 2; + else + break; + pbContent += cbSkip; + cbContent -= cbSkip; + } + + *pcbFields = pbContent - pbContentStart; + return VINF_SUCCESS; +} + + +/** + * Does the decoding of a PEM-like data blob after it has been located. + * + * @returns IPRT status ocde + * @param pbContent The start of the PEM-like content (text). + * @param cbContent The max size of the PEM-like content. + * @param fSensitive Set if the safer allocator should be used. + * @param ppvDecoded Where to return a heap block containing the + * decoded content. + * @param pcbDecoded Where to return the size of the decoded content. + */ +static int rtCrPemDecodeBase64(uint8_t const *pbContent, size_t cbContent, bool fSensitive, + void **ppvDecoded, size_t *pcbDecoded) +{ + ssize_t cbDecoded = RTBase64DecodedSizeEx((const char *)pbContent, cbContent, NULL); + if (cbDecoded < 0) + return VERR_INVALID_BASE64_ENCODING; + + *pcbDecoded = cbDecoded; + void *pvDecoded = !fSensitive ? RTMemAlloc(cbDecoded) : RTMemSaferAllocZ(cbDecoded); + if (!pvDecoded) + return VERR_NO_MEMORY; + + size_t cbActual; + int rc = RTBase64DecodeEx((const char *)pbContent, cbContent, pvDecoded, cbDecoded, &cbActual, NULL); + if (RT_SUCCESS(rc)) + { + if (cbActual == (size_t)cbDecoded) + { + *ppvDecoded = pvDecoded; + return VINF_SUCCESS; + } + + rc = VERR_INTERNAL_ERROR_3; + } + if (!fSensitive) + RTMemFree(pvDecoded); + else + RTMemSaferFree(pvDecoded, cbDecoded); + return rc; +} + + +/** + * Checks if the content of a file looks to be binary or not. + * + * @returns true if likely to be binary, false if not binary. + * @param pbFile The file bytes to scan. + * @param cbFile The number of bytes. + * @param fFlags RTCRPEMREADFILE_F_XXX + */ +static bool rtCrPemIsBinaryBlob(uint8_t const *pbFile, size_t cbFile, uint32_t fFlags) +{ + if (fFlags & RTCRPEMREADFILE_F_ONLY_PEM) + return false; + + /* + * Well formed PEM files should probably only contain 7-bit ASCII and + * restrict thenselfs to the following control characters: + * tab, newline, return, form feed + * + * However, if we want to read PEM files which contains human readable + * certificate details before or after each base-64 section, we can't stick + * to 7-bit ASCII. We could say it must be UTF-8, but that's probably to + * limited as well. So, we'll settle for detecting binary files by control + * characters alone (safe enough for DER encoded stuff, I think). + */ + while (cbFile-- > 0) + { + uint8_t const b = *pbFile++; + if (b < 32 && b != '\t' && b != '\n' && b != '\r' && b != '\f') + { + /* Ignore EOT (4), SUB (26) and NUL (0) at the end of the file. */ + if ( (b == 4 || b == 26) + && ( cbFile == 0 + || ( cbFile == 1 + && *pbFile == '\0'))) + return false; + + if (b == 0 && cbFile == 0) + return false; + + return true; + } + } + return false; +} + + +RTDECL(int) RTCrPemFreeSections(PCRTCRPEMSECTION pSectionHead) +{ + while (pSectionHead != NULL) + { + PRTCRPEMSECTION pFree = (PRTCRPEMSECTION)pSectionHead; + pSectionHead = pSectionHead->pNext; + ASMCompilerBarrier(); /* paranoia */ + + if (pFree->pbData) + { + if (!pFree->fSensitive) + RTMemFree(pFree->pbData); + else + RTMemSaferFree(pFree->pbData, pFree->cbData); + pFree->pbData = NULL; + pFree->cbData = 0; + } + + PRTCRPEMFIELD pField = (PRTCRPEMFIELD)pFree->pFieldHead; + if (pField) + { + pFree->pFieldHead = NULL; + do + { + PRTCRPEMFIELD pFreeField = pField; + pField = (PRTCRPEMFIELD)pField->pNext; + ASMCompilerBarrier(); /* paranoia */ + + pFreeField->pszValue = NULL; + RTMemFree(pFreeField); + } while (pField); + } + + RTMemFree(pFree); + } + return VINF_SUCCESS; +} + + +RTDECL(int) RTCrPemParseContent(void const *pvContent, size_t cbContent, uint32_t fFlags, + PCRTCRPEMMARKER paMarkers, size_t cMarkers, + PCRTCRPEMSECTION *ppSectionHead, PRTERRINFO pErrInfo) +{ + RT_NOREF_PV(pErrInfo); + + /* + * Input validation. + */ + AssertPtr(ppSectionHead); + *ppSectionHead = NULL; + AssertReturn(cbContent, VINF_EOF); + AssertPtr(pvContent); + AssertPtr(paMarkers); + AssertReturn(!(fFlags & ~RTCRPEMREADFILE_F_VALID_MASK), VERR_INVALID_FLAGS); + + /* + * Pre-allocate a section. + */ + int rc = VINF_SUCCESS; + PRTCRPEMSECTION pSection = (PRTCRPEMSECTION)RTMemAllocZ(sizeof(*pSection)); + if (pSection) + { + bool const fSensitive = RT_BOOL(fFlags & RTCRPEMREADFILE_F_SENSITIVE); + + /* + * Try locate the first section. + */ + uint8_t const *pbContent = (uint8_t const *)pvContent; + size_t offBegin, offEnd, offResume; + PCRTCRPEMMARKER pMatch; + if ( !rtCrPemIsBinaryBlob(pbContent, cbContent, fFlags) + && rtCrPemFindMarkerSection(pbContent, cbContent, 0 /*offStart*/, paMarkers, cMarkers, + &pMatch, &offBegin, &offEnd, &offResume) ) + { + PCRTCRPEMSECTION *ppNext = ppSectionHead; + for (;;) + { + //pSection->pNext = NULL; + pSection->pMarker = pMatch; + //pSection->pbData = NULL; + //pSection->cbData = 0; + //pSection->pFieldHead = NULL; + pSection->fSensitive = fSensitive; + + *ppNext = pSection; + ppNext = &pSection->pNext; + + /* + * Decode the section. + */ + size_t cbFields = 0; + int rc2 = rtCrPemProcessFields(pSection, pbContent + offBegin, offEnd - offBegin, &cbFields); + offBegin += cbFields; + if (RT_SUCCESS(rc2)) + rc2 = rtCrPemDecodeBase64(pbContent + offBegin, offEnd - offBegin, fSensitive, + (void **)&pSection->pbData, &pSection->cbData); + if (RT_FAILURE(rc2)) + { + pSection->pbData = NULL; + pSection->cbData = 0; + if ( rc2 == VERR_INVALID_BASE64_ENCODING + && (fFlags & RTCRPEMREADFILE_F_CONTINUE_ON_ENCODING_ERROR)) + rc = -rc2; + else + { + rc = rc2; + break; + } + } + + /* + * More sections? + */ + if ( offResume + 12 >= cbContent + || offResume >= cbContent + || !rtCrPemFindMarkerSection(pbContent, cbContent, offResume, paMarkers, cMarkers, + &pMatch, &offBegin, &offEnd, &offResume) ) + break; /* No. */ + + /* Ok, allocate a new record for it. */ + pSection = (PRTCRPEMSECTION)RTMemAllocZ(sizeof(*pSection)); + if (RT_UNLIKELY(!pSection)) + { + rc = VERR_NO_MEMORY; + break; + } + } + if (RT_SUCCESS(rc)) + return rc; + + RTCrPemFreeSections(*ppSectionHead); + } + else + { + if (!(fFlags & RTCRPEMREADFILE_F_ONLY_PEM)) + { + /* + * No PEM section found. Return the whole file as one binary section. + */ + //pSection->pNext = NULL; + //pSection->pMarker = NULL; + //pSection->pFieldHead = NULL; + pSection->cbData = cbContent; + pSection->fSensitive = fSensitive; + if (!fSensitive) + pSection->pbData = (uint8_t *)RTMemDup(pbContent, cbContent); + else + { + pSection->pbData = (uint8_t *)RTMemSaferAllocZ(cbContent); + if (pSection->pbData) + memcpy(pSection->pbData, pbContent, cbContent); + } + if (pSection->pbData) + { + *ppSectionHead = pSection; + return VINF_SUCCESS; + } + + rc = VERR_NO_MEMORY; + } + else + rc = VWRN_NOT_FOUND; + RTMemFree(pSection); + } + } + else + rc = VERR_NO_MEMORY; + *ppSectionHead = NULL; + return rc; +} + + +RTDECL(int) RTCrPemReadFile(const char *pszFilename, uint32_t fFlags, PCRTCRPEMMARKER paMarkers, size_t cMarkers, + PCRTCRPEMSECTION *ppSectionHead, PRTERRINFO pErrInfo) +{ + *ppSectionHead = NULL; + AssertReturn(!(fFlags & ~RTCRPEMREADFILE_F_VALID_MASK), VERR_INVALID_FLAGS); + + size_t cbContent; + void *pvContent; + int rc = RTFileReadAllEx(pszFilename, 0, 64U*_1M, RTFILE_RDALL_O_DENY_WRITE, &pvContent, &cbContent); + if (RT_SUCCESS(rc)) + { + rc = RTCrPemParseContent(pvContent, cbContent, fFlags, paMarkers, cMarkers, ppSectionHead, pErrInfo); + if (fFlags & RTCRPEMREADFILE_F_SENSITIVE) + RTMemWipeThoroughly(pvContent, cbContent, 3); + RTFileReadAllFree(pvContent, cbContent); + } + else + rc = RTErrInfoSetF(pErrInfo, rc, "RTFileReadAllEx failed with %Rrc on '%s'", rc, pszFilename); + return rc; +} + + +RTDECL(const char *) RTCrPemFindFirstSectionInContent(void const *pvContent, size_t cbContent, + PCRTCRPEMMARKER paMarkers, size_t cMarkers) +{ + size_t offBegin; + if (rtCrPemFindMarker((uint8_t *)pvContent, cbContent, 0, "BEGIN", 5, paMarkers, cMarkers, NULL, &offBegin, NULL)) + return (const char *)pvContent + offBegin; + return NULL; +} + diff -Nru virtualbox-hwe-6.1.34-dfsg/src/VBox/Runtime/common/crypto/pemfile-write.cpp virtualbox-hwe-6.1.38-dfsg/src/VBox/Runtime/common/crypto/pemfile-write.cpp --- virtualbox-hwe-6.1.34-dfsg/src/VBox/Runtime/common/crypto/pemfile-write.cpp 1970-01-01 00:00:00.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/src/VBox/Runtime/common/crypto/pemfile-write.cpp 2022-09-01 13:28:45.000000000 +0000 @@ -0,0 +1,258 @@ +/* $Id: pemfile-write.cpp $ */ +/** @file + * IPRT - Crypto - PEM file writer. + */ + +/* + * Copyright (C) 2006-2020 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 "internal/iprt.h" +#include + +#include +#include +#include +#include +#include + + +/********************************************************************************************************************************* +* Structures and Typedefs * +*********************************************************************************************************************************/ +/** + * Used by rtCrPemWriteAsn1Callback to buffer data before outputting it as + * BASE64. + * + * An encoded line is 64 characters long plus a newline, covering 48 bytes + * of binary data. We want about 4KB of output: + * 4096 / 65 = 63.015384615384615384615384615385 + * 64 * 65 + 1 = 4161 (0x1041) + */ +typedef struct PEMOUTPUTASN1 +{ + size_t cbPending; + PFNRTSTROUTPUT pfnOutput; + void *pvUser; + size_t cchRet; + uint8_t abBlock[0x0c00]; + char szBlock[0x1060]; +} PEMOUTPUTASN1; +typedef PEMOUTPUTASN1 *PPEMOUTPUTASN1; + + + +RTDECL(size_t) RTCrPemWriteBlob(PFNRTSTROUTPUT pfnOutput, void *pvUser, + const void *pvContent, size_t cbContent, const char *pszMarker) +{ + /* + * -----BEGIN XXXXX----- + */ + size_t cchRet = pfnOutput(pvUser, RT_STR_TUPLE("-----BEGIN ")); + size_t const cchMarker = strlen(pszMarker); + cchRet += pfnOutput(pvUser, pszMarker, cchMarker); + cchRet += pfnOutput(pvUser, RT_STR_TUPLE("-----\n")); + + /* + * base64 - in reasonably sized stack blocks. + * An encoded line is 64 characters long plus a newline, covering 48 bytes + * of binary data. We want about 4KB of output: + * 4096 / 65 = 63.015384615384615384615384615385 + * 64 * 65 + 1 = 4161 (0x1041) + */ + const size_t cbMaxBlock = 64 * 48; + while (cbContent > 0) + { + char szBlock[0x1060]; + size_t cbBlock = RT_MIN(cbContent, cbMaxBlock); + size_t cchBlock = 0; + int rc = RTBase64EncodeEx(pvContent, cbBlock, RTBASE64_FLAGS_EOL_LF, + szBlock, sizeof(szBlock), &cchBlock); + AssertRC(rc); + szBlock[cchBlock++] = '\n'; + szBlock[cchBlock] = '\0'; + + cchRet += pfnOutput(pvUser, szBlock, cchBlock); + + pvContent = (uint8_t const *)pvContent + cbBlock; + cbContent -= cbBlock; + } + + /* + * -----END XXXXX----- + */ + cchRet += pfnOutput(pvUser, RT_STR_TUPLE("-----END ")); + cchRet += pfnOutput(pvUser, pszMarker, cchMarker); + cchRet += pfnOutput(pvUser, RT_STR_TUPLE("-----\n")); + + /* termination call */ + cchRet += pfnOutput(pvUser, NULL, 0); + + return cchRet; +} + + +RTDECL(ssize_t) RTCrPemWriteBlobToVfsIoStrm(RTVFSIOSTREAM hVfsIos, const void *pvContent, size_t cbContent, const char *pszMarker) +{ + VFSIOSTRMOUTBUF Buf; + VFSIOSTRMOUTBUF_INIT(&Buf, hVfsIos); + size_t cchRet = RTCrPemWriteBlob(RTVfsIoStrmStrOutputCallback, &Buf, pvContent, cbContent, pszMarker); + Assert(Buf.offBuf == 0); + return RT_SUCCESS(Buf.rc) ? (ssize_t)cchRet : Buf.rc; +} + + +RTDECL(ssize_t) RTCrPemWriteBlobToVfsFile(RTVFSFILE hVfsFile, const void *pvContent, size_t cbContent, const char *pszMarker) +{ + RTVFSIOSTREAM hVfsIos = RTVfsFileToIoStream(hVfsFile); + AssertReturn(hVfsIos != NIL_RTVFSIOSTREAM, VERR_INVALID_HANDLE); + ssize_t cchRet = RTCrPemWriteBlobToVfsIoStrm(hVfsIos, pvContent, cbContent, pszMarker); + RTVfsIoStrmRelease(hVfsIos); + return cchRet; +} + + +/** @callback_method_impl{FNRTASN1ENCODEWRITER} */ +static DECLCALLBACK(int) rtCrPemWriteAsn1Callback(const void *pvBuf, size_t cbToWrite, void *pvUser, PRTERRINFO pErrInfo) +{ + PPEMOUTPUTASN1 pThis = (PPEMOUTPUTASN1)pvUser; + AssertCompile((sizeof(pThis->abBlock) % 48) == 0); + + while (cbToWrite > 0) + { + size_t offDst = pThis->cbPending; + AssertStmt(offDst <= sizeof(pThis->abBlock), offDst = sizeof(pThis->abBlock)); + size_t cbDst = sizeof(pThis->abBlock) - offDst; + if (cbToWrite < cbDst) + { + /* Buffer not full: Append and return. */ + memcpy(&pThis->abBlock[offDst], pvBuf, cbToWrite); + pThis->cbPending = offDst + cbToWrite; + break; + } + + /* Fill the buffer and flush it: */ + memcpy(&pThis->abBlock[offDst], pvBuf, cbDst); + Assert(offDst + cbDst == sizeof(pThis->abBlock)); + + size_t cchBlock = 0; + int rc = RTBase64EncodeEx(pThis->abBlock, sizeof(pThis->abBlock), RTBASE64_FLAGS_EOL_LF, + pThis->szBlock, sizeof(pThis->szBlock), &cchBlock); + AssertRC(rc); + pThis->szBlock[cchBlock++] = '\n'; + pThis->szBlock[cchBlock] = '\0'; + + pThis->cchRet += pThis->pfnOutput(pThis->pvUser, pThis->szBlock, cchBlock); + pThis->cbPending = 0; + + /* Advance. */ + pvBuf = (uint8_t const *)pvBuf + cbDst; + cbToWrite -= cbDst; + } + + RT_NOREF(pErrInfo); + return VINF_SUCCESS; +} + + +RTDECL(ssize_t) RTCrPemWriteAsn1(PFNRTSTROUTPUT pfnOutput, void *pvUser, PRTASN1CORE pRoot, + uint32_t fFlags, const char *pszMarker, PRTERRINFO pErrInfo) +{ + AssertReturn(!fFlags, VERR_INVALID_FLAGS); + + /* + * Prepare the ASN.1 data for DER encoding. + */ + int rc = RTAsn1EncodePrepare(pRoot, RTASN1ENCODE_F_DER, NULL /*pcbEncoded*/, pErrInfo); + AssertRCReturn(rc, rc); + + /* + * -----BEGIN XXXXX----- + */ + size_t cchRet = pfnOutput(pvUser, RT_STR_TUPLE("-----BEGIN ")); + size_t const cchMarker = strlen(pszMarker); + cchRet += pfnOutput(pvUser, pszMarker, cchMarker); + cchRet += pfnOutput(pvUser, RT_STR_TUPLE("-----\n")); + + /* + * BASE64 + */ + PEMOUTPUTASN1 This; + This.pfnOutput = pfnOutput; + This.pvUser = pvUser; + This.cchRet = 0; + This.cbPending = 0; + rc = RTAsn1EncodeWrite(pRoot, RTASN1ENCODE_F_DER, rtCrPemWriteAsn1Callback, &This, pErrInfo); + AssertRCReturn(rc, rc); + cchRet += This.cchRet; + + Assert(This.cbPending <= sizeof(This.abBlock)); + if (This.cbPending) + { + size_t cchBlock = 0; + rc = RTBase64EncodeEx(This.abBlock, This.cbPending, RTBASE64_FLAGS_EOL_LF, + This.szBlock, sizeof(This.szBlock), &cchBlock); + AssertRC(rc); + This.szBlock[cchBlock++] = '\n'; + This.szBlock[cchBlock] = '\0'; + + cchRet += pfnOutput(pvUser, This.szBlock, cchBlock); + } + + /* + * -----END XXXXX----- + */ + cchRet += pfnOutput(pvUser, RT_STR_TUPLE("-----END ")); + cchRet += pfnOutput(pvUser, pszMarker, cchMarker); + cchRet += pfnOutput(pvUser, RT_STR_TUPLE("-----\n")); + + /* termination call */ + cchRet += pfnOutput(pvUser, NULL, 0); + + return cchRet; +} + + +RTDECL(ssize_t) RTCrPemWriteAsn1ToVfsIoStrm(RTVFSIOSTREAM hVfsIos, PRTASN1CORE pRoot, + uint32_t fFlags, const char *pszMarker, PRTERRINFO pErrInfo) +{ + VFSIOSTRMOUTBUF Buf; + VFSIOSTRMOUTBUF_INIT(&Buf, hVfsIos); + ssize_t cchRet = RTCrPemWriteAsn1(RTVfsIoStrmStrOutputCallback, &Buf, pRoot, fFlags, pszMarker, pErrInfo); + Assert(Buf.offBuf == 0); + return RT_SUCCESS(Buf.rc) ? (ssize_t)cchRet : Buf.rc; +} + + +RTDECL(ssize_t) RTCrPemWriteAsn1ToVfsFile(RTVFSFILE hVfsFile, PRTASN1CORE pRoot, + uint32_t fFlags, const char *pszMarker, PRTERRINFO pErrInfo) +{ + RTVFSIOSTREAM hVfsIos = RTVfsFileToIoStream(hVfsFile); + AssertReturn(hVfsIos != NIL_RTVFSIOSTREAM, VERR_INVALID_HANDLE); + ssize_t cchRet = RTCrPemWriteAsn1ToVfsIoStrm(hVfsIos, pRoot, fFlags, pszMarker, pErrInfo); + RTVfsIoStrmRelease(hVfsIos); + return cchRet; +} + + diff -Nru virtualbox-hwe-6.1.34-dfsg/src/VBox/Runtime/common/crypto/pkcs7-core.cpp virtualbox-hwe-6.1.38-dfsg/src/VBox/Runtime/common/crypto/pkcs7-core.cpp --- virtualbox-hwe-6.1.34-dfsg/src/VBox/Runtime/common/crypto/pkcs7-core.cpp 2022-03-22 23:45:19.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/src/VBox/Runtime/common/crypto/pkcs7-core.cpp 2022-09-01 13:28:45.000000000 +0000 @@ -32,14 +32,43 @@ #include #include +#include #include +#include #include #include "pkcs7-internal.h" +/* + * PKCS #7 Attributes + */ + +RTDECL(int) RTCrPkcs7Attributes_HashAttributes(PRTCRPKCS7ATTRIBUTES pAttributes, RTCRDIGEST hDigest, PRTERRINFO pErrInfo) +{ + /* ASSUMES that the attributes are encoded according to DER. */ + uint8_t const *pbData; + uint32_t cbData; + void *pvFree = NULL; + int rc = RTAsn1EncodeQueryRawBits(RTCrPkcs7Attributes_GetAsn1Core(pAttributes), + &pbData, &cbData, &pvFree, pErrInfo); + if (RT_SUCCESS(rc)) + { + uint8_t bSetOfTag = ASN1_TAG_SET | ASN1_TAGCLASS_UNIVERSAL | ASN1_TAGFLAG_CONSTRUCTED; + rc = RTCrDigestUpdate(hDigest, &bSetOfTag, sizeof(bSetOfTag)); /* Replace the implict tag with a SET-OF tag. */ + if (RT_SUCCESS(rc)) + rc = RTCrDigestUpdate(hDigest, pbData + sizeof(bSetOfTag), cbData - sizeof(bSetOfTag)); /* Skip the implicit tag. */ + if (RT_SUCCESS(rc)) + rc = RTCrDigestFinal(hDigest, NULL, 0); + else + RTErrInfoSet(pErrInfo, rc, "RTCrDigestUpdate failed"); + RTMemTmpFree(pvFree); + } + return rc; +} + /* - * PCKS #7 SignerInfo + * PKCS #7 SignerInfo */ RTDECL(PCRTASN1TIME) RTCrPkcs7SignerInfo_GetSigningTime(PCRTCRPKCS7SIGNERINFO pThis, PCRTCRPKCS7SIGNERINFO *ppSignerInfo) @@ -176,7 +205,7 @@ /* - * PCKS #7 ContentInfo. + * PKCS #7 ContentInfo. */ RTDECL(bool) RTCrPkcs7ContentInfo_IsSignedData(PCRTCRPKCS7CONTENTINFO pThis) diff -Nru virtualbox-hwe-6.1.34-dfsg/src/VBox/Runtime/common/crypto/pkcs7-file.cpp virtualbox-hwe-6.1.38-dfsg/src/VBox/Runtime/common/crypto/pkcs7-file.cpp --- virtualbox-hwe-6.1.34-dfsg/src/VBox/Runtime/common/crypto/pkcs7-file.cpp 1970-01-01 00:00:00.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/src/VBox/Runtime/common/crypto/pkcs7-file.cpp 2022-09-01 13:28:45.000000000 +0000 @@ -0,0 +1,109 @@ +/* $Id: pkcs7-file.cpp $ */ +/** @file + * IPRT - Crypto - PKCS\#7/CMS, File related APIs. + */ + +/* + * Copyright (C) 2006-2020 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 "internal/iprt.h" +#include + +#include +#include +#include + + +/********************************************************************************************************************************* +* Global Variables * +*********************************************************************************************************************************/ +static RTCRPEMMARKERWORD const g_aWords_Cms[] = { { RT_STR_TUPLE("CMS") } }; +static RTCRPEMMARKERWORD const g_aWords_Pkcs7[] = { { RT_STR_TUPLE("PKCS7") } }; +/** X509 Certificate markers. */ +RT_DECL_DATA_CONST(RTCRPEMMARKER const) g_aRTCrPkcs7Markers[] = +{ + { g_aWords_Cms, RT_ELEMENTS(g_aWords_Cms) }, + { g_aWords_Pkcs7, RT_ELEMENTS(g_aWords_Pkcs7) } +}; +/** Number of entries in g_aRTCrPkcs7Markers. */ +RT_DECL_DATA_CONST(uint32_t const) g_cRTCrPkcs7Markers = RT_ELEMENTS(g_aRTCrPkcs7Markers); + + +/** @name Flags for RTCrPkcs7ContentInfo_ReadFromBuffer + * @{ */ +/** Only allow PEM certificates, not binary ones. + * @sa RTCRPEMREADFILE_F_ONLY_PEM */ +#define RTCRPKCS7_READ_F_PEM_ONLY RT_BIT(1) +/** @} */ + + +RTDECL(int) RTCrPkcs7_ReadFromBuffer(PRTCRPKCS7CONTENTINFO pContentInfo, const void *pvBuf, size_t cbBuf, + uint32_t fFlags, PCRTASN1ALLOCATORVTABLE pAllocator, + bool *pfCmsLabeled, PRTERRINFO pErrInfo, const char *pszErrorTag) +{ + if (pfCmsLabeled) + *pfCmsLabeled = false; + AssertReturn(!(fFlags & ~RTCRX509CERT_READ_F_PEM_ONLY), VERR_INVALID_FLAGS); + + PCRTCRPEMSECTION pSectionHead; + int rc = RTCrPemParseContent(pvBuf, cbBuf, + fFlags & RTCRX509CERT_READ_F_PEM_ONLY ? RTCRPEMREADFILE_F_ONLY_PEM : 0, + g_aRTCrPkcs7Markers, g_cRTCrPkcs7Markers, + &pSectionHead, pErrInfo); + if (RT_SUCCESS(rc)) + { + if (pSectionHead) + { + if (pfCmsLabeled) + *pfCmsLabeled = pSectionHead->pMarker == &g_aRTCrPkcs7Markers[0]; + + RTASN1CURSORPRIMARY PrimaryCursor; + RTAsn1CursorInitPrimary(&PrimaryCursor, pSectionHead->pbData, (uint32_t)RT_MIN(pSectionHead->cbData, UINT32_MAX), + pErrInfo, pAllocator, RTASN1CURSOR_FLAGS_DER, pszErrorTag); + + RTCRPKCS7CONTENTINFO TmpContentInfo; + rc = RTCrPkcs7ContentInfo_DecodeAsn1(&PrimaryCursor.Cursor, 0, &TmpContentInfo, "CI"); + if (RT_SUCCESS(rc)) + { + rc = RTCrPkcs7ContentInfo_CheckSanity(&TmpContentInfo, 0, pErrInfo, "CI"); + if (RT_SUCCESS(rc)) + { + rc = RTCrPkcs7ContentInfo_Clone(pContentInfo, &TmpContentInfo, pAllocator); + if (RT_SUCCESS(rc)) + { + if (pSectionHead->pNext || PrimaryCursor.Cursor.cbLeft) + rc = VINF_ASN1_MORE_DATA; + } + } + RTCrPkcs7ContentInfo_Delete(&TmpContentInfo); + } + RTCrPemFreeSections(pSectionHead); + } + else + rc = rc != VINF_SUCCESS ? -rc : VERR_INTERNAL_ERROR_2; + } + return rc; +} + diff -Nru virtualbox-hwe-6.1.34-dfsg/src/VBox/Runtime/common/crypto/pkcs7-sanity.cpp virtualbox-hwe-6.1.38-dfsg/src/VBox/Runtime/common/crypto/pkcs7-sanity.cpp --- virtualbox-hwe-6.1.34-dfsg/src/VBox/Runtime/common/crypto/pkcs7-sanity.cpp 2022-03-22 23:45:20.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/src/VBox/Runtime/common/crypto/pkcs7-sanity.cpp 2022-09-01 13:28:45.000000000 +0000 @@ -71,7 +71,8 @@ return RTErrInfoSetF(pErrInfo, VERR_CR_PKCS7_UNKNOWN_DIGEST_ALGORITHM, "%s: SignedData.DigestAlgorithms[%i] is not known: %s", pszErrorTag, i, pSignedData->DigestAlgorithms.papItems[i]->Algorithm.szObjId); - if (pSignedData->DigestAlgorithms.papItems[i]->Parameters.enmType != RTASN1TYPE_NULL) + if ( pSignedData->DigestAlgorithms.papItems[i]->Parameters.enmType != RTASN1TYPE_NULL + && pSignedData->DigestAlgorithms.papItems[i]->Parameters.enmType != RTASN1TYPE_NOT_PRESENT) return RTErrInfoSetF(pErrInfo, VERR_CR_PKCS7_DIGEST_PARAMS_NOT_IMPL, "%s: SignedData.DigestAlgorithms[%i] has parameters: tag=%u", pszErrorTag, i, pSignedData->DigestAlgorithms.papItems[i]->Parameters.u.Core.uTag); diff -Nru virtualbox-hwe-6.1.34-dfsg/src/VBox/Runtime/common/crypto/pkcs7-sign.cpp virtualbox-hwe-6.1.38-dfsg/src/VBox/Runtime/common/crypto/pkcs7-sign.cpp --- virtualbox-hwe-6.1.34-dfsg/src/VBox/Runtime/common/crypto/pkcs7-sign.cpp 1970-01-01 00:00:00.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/src/VBox/Runtime/common/crypto/pkcs7-sign.cpp 2022-09-01 13:28:45.000000000 +0000 @@ -0,0 +1,580 @@ +/* $Id: pkcs7-sign.cpp $ */ +/** @file + * IPRT - Crypto - PKCS \#7, Signing + */ + +/* + * Copyright (C) 2006-2020 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 "internal/iprt.h" +#include + +#include +#include +#include +#include +#include +#include +#include + +#ifdef IPRT_WITH_OPENSSL +# include "internal/iprt-openssl.h" +# include +# include +# include +# include +# include +#endif + + +/********************************************************************************************************************************* +* Structures and Typedefs * +*********************************************************************************************************************************/ +/** + * PKCS\#7 / CMS signing operation instance. + */ +typedef struct RTCRPKCS7SIGNINGJOBINT +{ + /** Magic value (RTCRPKCS7SIGNINGJOBINT). */ + uint32_t u32Magic; + /** Reference counter. */ + uint32_t volatile cRefs; + /** RTCRPKCS7SIGN_F_XXX. */ + uint64_t fFlags; + /** Set if finalized. */ + bool fFinallized; + + //.... +} RTCRPKCS7SIGNINGJOBINT; + +/** Magic value for RTCRPKCS7SIGNINGJOBINT (Jonathan Lethem). */ +#define RTCRPKCS7SIGNINGJOBINT_MAGIC UINT32_C(0x19640219) + +/** Handle to PKCS\#7/CMS signing operation. */ +typedef struct RTCRPKCS7SIGNINGJOBINT *RTCRPKCS7SIGNINGJOB; +/** Pointer to a PKCS\#7/CMS signing operation handle. */ +typedef RTCRPKCS7SIGNINGJOB *PRTCRPKCS7SIGNINGJOB; + +//// CMS_sign +//RTDECL(int) RTCrPkcs7Sign(PRTCRPKCS7SIGNINGJOB *phJob, uint64_t fFlags, PCRTCRX509CERTIFICATE pSigner, RTCRKEY hPrivateKey, +// RTCRSTORE hAdditionalCerts, +// + +#ifdef IPRT_WITH_OPENSSL + +static int rtCrPkcs7SimpleSignSignedDataDoV1TweakContent(PKCS7 *pOsslPkcs7, const char *pszContentId, + const void *pvData, size_t cbData, + PRTERRINFO pErrInfo) +{ + AssertReturn(pszContentId, RTErrInfoSet(pErrInfo, VERR_CR_PKCS7_MISSING_CONTENT_TYPE_ATTRIB, + "RTCRPKCS7SIGN_SD_F_NO_DATA_ENCAP requires content type in additional attribs")); + + /* + * Create a new inner PKCS#7 content container, forcing it to the 'other' type. + */ + PKCS7 *pOsslInnerContent = PKCS7_new(); + if (!pOsslInnerContent) + return RTErrInfoSet(pErrInfo, VERR_NO_MEMORY, "PKCS7_new failed"); + + /* Set the type. */ + int rc; + pOsslInnerContent->type = OBJ_txt2obj(pszContentId, 1); + if (pOsslInnerContent->type) + { + /* Create a dynamic ASN1 type which we set to a sequence. */ + ASN1_TYPE *pOsslOther = pOsslInnerContent->d.other = ASN1_TYPE_new(); + if (pOsslOther) + { + pOsslOther->type = V_ASN1_SEQUENCE; + + /* Create a string and put the data in it. */ + ASN1_STRING *pOsslStr = pOsslOther->value.sequence = ASN1_STRING_new(); + if (pOsslStr) + { + rc = ASN1_STRING_set(pOsslStr, pvData, (int)cbData); /* copies the buffer content */ + if (rc > 0) + { + /* + * Set the content in the PKCS#7 signed data we're constructing. + * This consumes pOsslInnerContent on success. + */ + rc = PKCS7_set_content(pOsslPkcs7, pOsslInnerContent); + if (rc > 0) + return VINF_SUCCESS; + + /* failed */ + rc = RTErrInfoSet(pErrInfo, VERR_NO_MEMORY, "PKCS7_set_content"); + } + else + rc = RTErrInfoSetF(pErrInfo, VERR_NO_MEMORY, "ASN1_STRING_set(,,%#x)", cbData); + } + else + rc = RTErrInfoSet(pErrInfo, VERR_NO_MEMORY, "ASN1_STRING_new"); + } + else + rc = RTErrInfoSet(pErrInfo, VERR_NO_MEMORY, "ASN1_TYPE_new"); + } + else + rc = RTErrInfoSetF(pErrInfo, VERR_NO_MEMORY, "OBJ_txt2obj(%s, 1) failed", pszContentId); + PKCS7_free(pOsslInnerContent); + return rc; +} + + +static int rtCrPkcs7SimpleSignSignedDataDoV1TweakedFinal(PKCS7 *pOsslPkcs7, const char *pszContentId, + const void *pvData, size_t cbData, PRTERRINFO pErrInfo) +{ + AssertReturn(pszContentId, RTErrInfoSet(pErrInfo, VERR_CR_PKCS7_MISSING_CONTENT_TYPE_ATTRIB, + "RTCRPKCS7SIGN_SD_F_NO_DATA_ENCAP requires content type in additional attribs")); + + /* + * Prepare a BIO of what should be hashed with all the hashing filters attached. + */ + BIO *pOsslBio = PKCS7_dataInit(pOsslPkcs7, NULL); + if (!pOsslBio) + return RTErrInfoSet(pErrInfo, VERR_CR_CIPHER_OSSL_ENCRYPT_FINAL_FAILED, "PKCS7_dataInit failed"); + + /* + * Now write the data. + * + * We must skip the outer wrapper here (see RTCrPkcs7VerifySignedData). This + * is probably a bit presumptive about what we're working on, so add an extra + * flag for this later. + */ + uint8_t const *pbToWrite = (uint8_t const *)pvData; + size_t cbToWrite = cbData; + + /** @todo add extra flag for this? */ + RTASN1CURSORPRIMARY SkipCursor; + RTAsn1CursorInitPrimary(&SkipCursor, pvData, (uint32_t)cbData, + pErrInfo,&g_RTAsn1DefaultAllocator, RTASN1CURSOR_FLAGS_DER, "skip"); + RTASN1CORE SkipAsn1Core = { 0 }; + int rc = RTAsn1CursorReadHdr(&SkipCursor.Cursor, &SkipAsn1Core, "skip-core"); + if (RT_SUCCESS(rc)) + { + pbToWrite += SkipAsn1Core.cbHdr; + cbToWrite -= SkipAsn1Core.cbHdr; + + rc = BIO_write(pOsslBio, pbToWrite, (int)cbToWrite); + if (rc == (ssize_t)cbToWrite) + { + BIO_flush(pOsslBio); /** @todo error check this */ + if (true) + { + /* + * Finalize the job - produce the signer info signatures and stuff. + */ + rc = PKCS7_dataFinal(pOsslPkcs7, pOsslBio); + if (rc > 0) + { + /* + * Now tweak the content so we get the desired content type and + * no extra wrappers and stuff. + */ + rc = rtCrPkcs7SimpleSignSignedDataDoV1TweakContent(pOsslPkcs7, pszContentId, pvData, cbData, pErrInfo); + } + else + rc = RTErrInfoSetF(pErrInfo, VERR_CR_CIPHER_OSSL_ENCRYPT_FINAL_FAILED, "PKCS7_dataFinal failed: %d", rc); + } + } + else + rc = RTErrInfoSetF(pErrInfo, VERR_CR_CIPHER_OSSL_ENCRYPT_FINAL_FAILED, + "%zu byte data write failed: %d", cbToWrite, rc); + } + BIO_free_all(pOsslBio); + return rc; +} + + +static int rtCrPkcs7SimpleSignSignedDataDoV1AttribConversion(PKCS7_SIGNER_INFO *pSignerInfo, + PCRTCRPKCS7ATTRIBUTES pAdditionalAuthenticatedAttribs, + const char **ppszContentId, PRTERRINFO pErrInfo) +{ + int rc = VINF_SUCCESS; + *ppszContentId = NULL; + + if (pAdditionalAuthenticatedAttribs) + { + + /* + * Convert each attribute. + */ + STACK_OF(X509_ATTRIBUTE) *pOsslAttributes = sk_X509_ATTRIBUTE_new_null(); + for (uint32_t i = 0; i < pAdditionalAuthenticatedAttribs->cItems && RT_SUCCESS(rc); i++) + { + PCRTCRPKCS7ATTRIBUTE pAttrib = pAdditionalAuthenticatedAttribs->papItems[i]; + + /* Look out for content type, as we will probably need that for + RTCRPKCS7SIGN_SD_F_NO_DATA_ENCAP later. */ + if ( pAttrib->enmType == RTCRPKCS7ATTRIBUTETYPE_OBJ_IDS + && RTAsn1ObjId_CompareWithString(&pAttrib->Type, RTCR_PKCS9_ID_CONTENT_TYPE_OID) == 0) + { + AssertBreakStmt(!*ppszContentId, rc = VERR_CR_PKCS7_BAD_CONTENT_TYPE_ATTRIB); + AssertBreakStmt(pAttrib->uValues.pObjIds && pAttrib->uValues.pObjIds->cItems == 1, + rc = VERR_CR_PKCS7_BAD_CONTENT_TYPE_ATTRIB); + *ppszContentId = pAttrib->uValues.pObjIds->papItems[0]->szObjId; + } + + /* The conversion (IPRT encode, OpenSSL decode). */ + X509_ATTRIBUTE *pOsslAttrib; + rc = rtCrOpenSslConvertPkcs7Attribute((void **)&pOsslAttrib, pAttrib, pErrInfo); + if (RT_SUCCESS(rc)) + { + if (!sk_X509_ATTRIBUTE_push(pOsslAttributes, pOsslAttrib)) + rc = RTErrInfoSet(pErrInfo, VERR_NO_MEMORY, "sk_X509_ATTRIBUTE_push failed"); + } + } + + /* + * If we've successfully converted all the attributes, make a deep copy + * (waste of resource, but whatever) into the signer info we're working on. + */ + if (RT_SUCCESS(rc)) + { + rc = PKCS7_set_signed_attributes(pSignerInfo, pOsslAttributes); /* deep copy */ + if (rc <= 0) + rc = RTErrInfoSet(pErrInfo, VERR_NO_MEMORY, "PKCS7_set_signed_attributes failed"); + } + + /* + * Free the attributes (they were copied). Cannot use X509_ATTRIBUTE_pop_free as + * the callback causes Visual C++ to complain about exceptions on the callback. + */ + for (int i = sk_X509_ATTRIBUTE_num(pOsslAttributes) - 1; i >= 0; i--) + X509_ATTRIBUTE_free(sk_X509_ATTRIBUTE_value(pOsslAttributes, i)); + sk_X509_ATTRIBUTE_free(pOsslAttributes); + } + return rc; +} + +static int rtCrPkcs7SimpleSignSignedDataDoV1(uint32_t fFlags, X509 *pOsslSigner, EVP_PKEY *pEvpPrivateKey, + BIO *pOsslData, const EVP_MD *pEvpMd, STACK_OF(X509) *pOsslAdditionalCerts, + PCRTCRPKCS7ATTRIBUTES pAdditionalAuthenticatedAttribs, + const void *pvData, size_t cbData, + BIO **ppOsslResult, PRTERRINFO pErrInfo) +{ + /* + * Use PKCS7_sign with PKCS7_PARTIAL to start a extended the signing process. + */ + /* Create a ContentInfo we can modify using CMS_sign w/ CMS_PARTIAL. */ + unsigned int fOsslSign = PKCS7_BINARY | PKCS7_PARTIAL; + if (fFlags & RTCRPKCS7SIGN_SD_F_DEATCHED) + fOsslSign |= PKCS7_DETACHED; + if (fFlags & RTCRPKCS7SIGN_SD_F_NO_SMIME_CAP) + fOsslSign |= PKCS7_NOSMIMECAP; + int rc = VINF_SUCCESS; + PKCS7 *pCms = PKCS7_sign(NULL, NULL, pOsslAdditionalCerts, NULL, fOsslSign); + if (pCms != NULL) + { + /* + * Add a signer. + */ + PKCS7_SIGNER_INFO *pSignerInfo = PKCS7_sign_add_signer(pCms, pOsslSigner, pEvpPrivateKey, pEvpMd, fOsslSign); + if (pSignerInfo) + { + /* + * Add additional attributes to the signer. + */ + const char *pszContentId = NULL; + rc = rtCrPkcs7SimpleSignSignedDataDoV1AttribConversion(pSignerInfo, pAdditionalAuthenticatedAttribs, + &pszContentId, pErrInfo); + if (RT_SUCCESS(rc)) + { + /* + * Finalized and actually sign the data. + */ + bool const fTweaked = (fFlags & (RTCRPKCS7SIGN_SD_F_DEATCHED | RTCRPKCS7SIGN_SD_F_NO_DATA_ENCAP)) + == RTCRPKCS7SIGN_SD_F_NO_DATA_ENCAP; + if (fTweaked) + rc = rtCrPkcs7SimpleSignSignedDataDoV1TweakedFinal(pCms, pszContentId, pvData, cbData, pErrInfo); + else + { + rc = PKCS7_final(pCms, pOsslData, fOsslSign); + if (rc > 0) + rc = VINF_SUCCESS; + else + rc = RTErrInfoSet(pErrInfo, VERR_GENERAL_FAILURE, "PKCS7_final"); + /** @todo maybe we want to use rtCrPkcs7SimpleSignSignedDataDoV1TweakContent + * for when the content type isn't 'data'... */ + } + if (RT_SUCCESS(rc)) + { + /* + * Get the output and copy it into the result buffer. + */ + BIO *pOsslResult = BIO_new(BIO_s_mem()); + if (pOsslResult) + { + rc = i2d_PKCS7_bio(pOsslResult, pCms); + if (rc > 0) + { + *ppOsslResult = pOsslResult; + rc = VINF_SUCCESS; + } + else + { + rc = RTErrInfoSet(pErrInfo, VERR_GENERAL_FAILURE, "i2d_PKCS7_bio"); + BIO_free(pOsslResult); + } + } + else + rc = RTErrInfoSet(pErrInfo, VERR_NO_MEMORY, "BIO_new/BIO_s_mem"); + } + } + else + rc = RTErrInfoSet(pErrInfo, VERR_GENERAL_FAILURE, "PKCS7_sign_add_signer"); + } + PKCS7_free(pCms); + } + else + rc = RTErrInfoSet(pErrInfo, VERR_GENERAL_FAILURE, "PKCS7_sign"); + return rc; +} + + +static int rtCrPkcs7SimpleSignSignedDataDoDefault(uint32_t fFlags, X509 *pOsslSigner, EVP_PKEY *pEvpPrivateKey, + BIO *pOsslData, const EVP_MD *pEvpMd, STACK_OF(X509) *pOsslAdditionalCerts, + PCRTCRPKCS7ATTRIBUTES pAdditionalAuthenticatedAttribs, + BIO **ppOsslResult, PRTERRINFO pErrInfo) + +{ + /* + * Use CMS_sign with CMS_PARTIAL to start a extended the signing process. + */ + /* Create a ContentInfo we can modify using CMS_sign w/ CMS_PARTIAL. */ + unsigned int fOsslSign = CMS_BINARY | CMS_PARTIAL; + if (fFlags & RTCRPKCS7SIGN_SD_F_DEATCHED) + fOsslSign |= CMS_DETACHED; + if (fFlags & RTCRPKCS7SIGN_SD_F_NO_SMIME_CAP) + fOsslSign |= CMS_NOSMIMECAP; + int rc = VINF_SUCCESS; + CMS_ContentInfo *pCms = CMS_sign(NULL, NULL, pOsslAdditionalCerts, NULL, fOsslSign); + if (pCms != NULL) + { + /* + * Set encapsulated content type if present in the auth attribs. + */ + uint32_t iAuthAttrSkip = UINT32_MAX; + for (uint32_t i = 0; i < pAdditionalAuthenticatedAttribs->cItems && RT_SUCCESS(rc); i++) + { + PCRTCRPKCS7ATTRIBUTE pAttrib = pAdditionalAuthenticatedAttribs->papItems[i]; + if ( pAttrib->enmType == RTCRPKCS7ATTRIBUTETYPE_OBJ_IDS + && RTAsn1ObjId_CompareWithString(&pAttrib->Type, RTCR_PKCS9_ID_CONTENT_TYPE_OID) == 0) + { + AssertBreakStmt(pAttrib->uValues.pObjIds && pAttrib->uValues.pObjIds->cItems == 1, + rc = VERR_INTERNAL_ERROR_3); + PCRTASN1OBJID pObjId = pAttrib->uValues.pObjIds->papItems[0]; + ASN1_OBJECT *pOsslObjId = OBJ_txt2obj(pObjId->szObjId, 0 /*no_name*/); + if (pOsslObjId) + { + rc = CMS_set1_eContentType(pCms, pOsslObjId); + ASN1_OBJECT_free(pOsslObjId); + if (rc < 0) + rc = RTErrInfoSetF(pErrInfo, VERR_CR_PKIX_GENERIC_ERROR, + "CMS_set1_eContentType(%s)", pObjId->szObjId); + } + else + rc = RTErrInfoSet(pErrInfo, VERR_NO_MEMORY, "OBJ_txt2obj"); + + iAuthAttrSkip = i; + break; + } + } + if (RT_SUCCESS(rc)) + { + /* + * Add a signer. + */ + CMS_SignerInfo *pSignerInfo = CMS_add1_signer(pCms, pOsslSigner, pEvpPrivateKey, pEvpMd, fOsslSign); + if (pSignerInfo) + { + /* + * Add additional attributes, skipping the content type if found above. + */ + if (pAdditionalAuthenticatedAttribs) + for (uint32_t i = 0; i < pAdditionalAuthenticatedAttribs->cItems && RT_SUCCESS(rc); i++) + if (i != iAuthAttrSkip) + { + PCRTCRPKCS7ATTRIBUTE pAttrib = pAdditionalAuthenticatedAttribs->papItems[i]; + X509_ATTRIBUTE *pOsslAttrib; + rc = rtCrOpenSslConvertPkcs7Attribute((void **)&pOsslAttrib, pAttrib, pErrInfo); + if (RT_SUCCESS(rc)) + { + rc = CMS_signed_add1_attr(pSignerInfo, pOsslAttrib); + rtCrOpenSslFreeConvertedPkcs7Attribute((void **)pOsslAttrib); + if (rc <= 0) + rc = RTErrInfoSet(pErrInfo, VERR_NO_MEMORY, "CMS_signed_add1_attr"); + } + } + if (RT_SUCCESS(rc)) + { + /* + * Finalized and actually sign the data. + */ + rc = CMS_final(pCms, pOsslData, NULL /*dcont*/, fOsslSign); + if (rc > 0) + { + /* + * Get the output and copy it into the result buffer. + */ + BIO *pOsslResult = BIO_new(BIO_s_mem()); + if (pOsslResult) + { + rc = i2d_CMS_bio(pOsslResult, pCms); + if (rc > 0) + { + *ppOsslResult = pOsslResult; + rc = VINF_SUCCESS; + } + else + { + rc = RTErrInfoSet(pErrInfo, VERR_GENERAL_FAILURE, "i2d_CMS_bio"); + BIO_free(pOsslResult); + } + } + else + rc = RTErrInfoSet(pErrInfo, VERR_NO_MEMORY, "BIO_new/BIO_s_mem"); + } + else + rc = RTErrInfoSet(pErrInfo, VERR_GENERAL_FAILURE, "CMS_final"); + } + } + else + rc = RTErrInfoSet(pErrInfo, VERR_GENERAL_FAILURE, "CMS_add1_signer"); + } + CMS_ContentInfo_free(pCms); + } + else + rc = RTErrInfoSet(pErrInfo, VERR_GENERAL_FAILURE, "CMS_sign"); + return rc; +} + +#endif /* IPRT_WITH_OPENSSL */ + + + +RTDECL(int) RTCrPkcs7SimpleSignSignedData(uint32_t fFlags, PCRTCRX509CERTIFICATE pSigner, RTCRKEY hPrivateKey, + void const *pvData, size_t cbData, RTDIGESTTYPE enmDigestType, + RTCRSTORE hAdditionalCerts, PCRTCRPKCS7ATTRIBUTES pAdditionalAuthenticatedAttribs, + void *pvResult, size_t *pcbResult, PRTERRINFO pErrInfo) +{ + size_t const cbResultBuf = *pcbResult; + *pcbResult = 0; + AssertReturn(!(fFlags & ~RTCRPKCS7SIGN_SD_F_VALID_MASK), VERR_INVALID_FLAGS); +#ifdef IPRT_WITH_OPENSSL + AssertReturn((int)cbData >= 0 && (unsigned)cbData == cbData, VERR_TOO_MUCH_DATA); + + /* + * Resolve the digest type. + */ + const EVP_MD *pEvpMd = NULL; + if (enmDigestType != RTDIGESTTYPE_UNKNOWN) + { + pEvpMd = (const EVP_MD *)rtCrOpenSslConvertDigestType(enmDigestType, pErrInfo); + AssertReturn(pEvpMd, pErrInfo ? pErrInfo->rc : VERR_INVALID_PARAMETER); + } + + /* + * Convert the private key. + */ + EVP_PKEY *pEvpPrivateKey = NULL; + int rc = rtCrKeyToOpenSslKey(hPrivateKey, false /*fNeedPublic*/, (void **)&pEvpPrivateKey, pErrInfo); + if (RT_SUCCESS(rc)) + { + /* + * Convert the signing certificate. + */ + X509 *pOsslSigner = NULL; + rc = rtCrOpenSslConvertX509Cert((void **)&pOsslSigner, pSigner, pErrInfo); + if (RT_SUCCESS(rc)) + { + /* + * Convert any additional certificates. + */ + STACK_OF(X509) *pOsslAdditionalCerts = NULL; + if (hAdditionalCerts != NIL_RTCRSTORE) + rc = RTCrStoreConvertToOpenSslCertStack(hAdditionalCerts, 0 /*fFlags*/, (void **)&pOsslAdditionalCerts, pErrInfo); + if (RT_SUCCESS(rc)) + { + /* + * Create a BIO for the data buffer. + */ + BIO *pOsslData = BIO_new_mem_buf((void *)pvData, (int)cbData); + if (pOsslData) + { + /* + * Do the work. + */ + BIO *pOsslResult = NULL; + if (!(fFlags & RTCRPKCS7SIGN_SD_F_USE_V1)) + rc = rtCrPkcs7SimpleSignSignedDataDoDefault(fFlags, pOsslSigner, pEvpPrivateKey, pOsslData, pEvpMd, + pOsslAdditionalCerts, pAdditionalAuthenticatedAttribs, + &pOsslResult, pErrInfo); + else + rc = rtCrPkcs7SimpleSignSignedDataDoV1(fFlags, pOsslSigner, pEvpPrivateKey, pOsslData, pEvpMd, + pOsslAdditionalCerts, pAdditionalAuthenticatedAttribs, + pvData, cbData, + &pOsslResult, pErrInfo); + BIO_free(pOsslData); + if (RT_SUCCESS(rc)) + { + /* + * Copy out the result. + */ + BUF_MEM *pBuf = NULL; + rc = (int)BIO_get_mem_ptr(pOsslResult, &pBuf); + if (rc > 0) + { + AssertPtr(pBuf); + size_t const cbResult = pBuf->length; + if ( cbResultBuf >= cbResult + && pvResult != NULL) + { + memcpy(pvResult, pBuf->data, cbResult); + rc = VINF_SUCCESS; + } + else + rc = VERR_BUFFER_OVERFLOW; + *pcbResult = cbResult; + } + else + rc = RTErrInfoSet(pErrInfo, VERR_GENERAL_FAILURE, "BIO_get_mem_ptr"); + BIO_free(pOsslResult); + } + } + } + rtCrOpenSslFreeConvertedX509Cert(pOsslSigner); + } + EVP_PKEY_free(pEvpPrivateKey); + } + return rc; +#else + RT_NOREF(fFlags, pSigner, hPrivateKey, pvData, cbData, enmDigestType, hAdditionalCerts, pAdditionalAuthenticatedAttribs, + pvResult, pErrInfo, cbResultBuf); + *pcbResult = 0; + return VERR_NOT_IMPLEMENTED; +#endif +} + diff -Nru virtualbox-hwe-6.1.34-dfsg/src/VBox/Runtime/common/crypto/pkcs7-template.h virtualbox-hwe-6.1.38-dfsg/src/VBox/Runtime/common/crypto/pkcs7-template.h --- virtualbox-hwe-6.1.34-dfsg/src/VBox/Runtime/common/crypto/pkcs7-template.h 2022-03-22 23:45:20.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/src/VBox/Runtime/common/crypto/pkcs7-template.h 2022-09-01 13:28:45.000000000 +0000 @@ -49,26 +49,26 @@ #define RTASN1TMPL_INT_NAME rtCrPkcs7Attribute RTASN1TMPL_BEGIN_SEQCORE(); RTASN1TMPL_MEMBER( Type, RTASN1OBJID, RTAsn1ObjId); -RTASN1TMPL_MEMBER_DYN_BEGIN(RTCRPKCS7ATTRIBUTETYPE, enmType, Allocation); -RTASN1TMPL_MEMBER_DYN( uValues, pOctetStrings, RTASN1SETOFOCTETSTRINGS, RTAsn1SetOfOctetStrings, Allocation, - enmType, RTCRPKCS7ATTRIBUTETYPE_OCTET_STRINGS, RTAsn1ObjId_CompareWithString(&pThis->Type, RTCR_PKCS9_ID_MESSAGE_DIGEST_OID) == 0); -RTASN1TMPL_MEMBER_DYN( uValues, pObjIds, RTASN1SETOFOBJIDS, RTAsn1SetOfObjIds, Allocation, - enmType, RTCRPKCS7ATTRIBUTETYPE_OBJ_IDS, RTAsn1ObjId_CompareWithString(&pThis->Type, RTCR_PKCS9_ID_CONTENT_TYPE_OID) == 0); -RTASN1TMPL_MEMBER_DYN( uValues, pCounterSignatures, RTCRPKCS7SINGERINFOS, RTCrPkcs7SignerInfos, Allocation, - enmType, RTCRPKCS7ATTRIBUTETYPE_COUNTER_SIGNATURES, RTAsn1ObjId_CompareWithString(&pThis->Type, RTCR_PKCS9_ID_COUNTER_SIGNATURE_OID) == 0); -RTASN1TMPL_MEMBER_DYN( uValues, pSigningTime, RTASN1SETOFTIMES, RTAsn1SetOfTimes, Allocation, - enmType, RTCRPKCS7ATTRIBUTETYPE_SIGNING_TIME, RTAsn1ObjId_CompareWithString(&pThis->Type, RTCR_PKCS9_ID_SIGNING_TIME_OID) == 0); -RTASN1TMPL_MEMBER_DYN( uValues, pContentInfos, RTCRPKCS7SETOFCONTENTINFOS, RTCrPkcs7SetOfContentInfos, Allocation, - enmType, RTCRPKCS7ATTRIBUTETYPE_MS_TIMESTAMP, RTAsn1ObjId_CompareWithString(&pThis->Type, RTCR_PKCS9_ID_MS_TIMESTAMP) == 0); -RTASN1TMPL_MEMBER_DYN( uValues, pContentInfos, RTCRPKCS7SETOFCONTENTINFOS, RTCrPkcs7SetOfContentInfos, Allocation, - enmType, RTCRPKCS7ATTRIBUTETYPE_MS_NESTED_SIGNATURE, RTAsn1ObjId_CompareWithString(&pThis->Type, RTCR_PKCS9_ID_MS_NESTED_SIGNATURE) == 0); -RTASN1TMPL_MEMBER_DYN( uValues, pObjIdSeqs, RTASN1SETOFOBJIDSEQS, RTAsn1SetOfObjIdSeqs, Allocation, - enmType, RTCRPKCS7ATTRIBUTETYPE_MS_STATEMENT_TYPE, RTAsn1ObjId_CompareWithString(&pThis->Type, RTCR_PKCS9_ID_MS_STATEMENT_TYPE) == 0); -RTASN1TMPL_MEMBER_DYN( uValues, pOctetStrings, RTASN1SETOFOCTETSTRINGS, RTAsn1SetOfOctetStrings, Allocation, - enmType, RTCRPKCS7ATTRIBUTETYPE_APPLE_MULTI_CD_PLIST, RTAsn1ObjId_CompareWithString(&pThis->Type, RTCR_PKCS9_ID_APPLE_MULTI_CD_PLIST) == 0); -RTASN1TMPL_MEMBER_DYN_DEFAULT( uValues, pCores, RTASN1SETOFCORES, RTAsn1SetOfCores, Allocation, - enmType, RTCRPKCS7ATTRIBUTETYPE_UNKNOWN); -RTASN1TMPL_MEMBER_DYN_END(RTCRPKCS7ATTRIBUTETYPE, enmType, Allocation); +RTASN1TMPL_MEMBER_DYN_BEGIN(Type, RTCRPKCS7ATTRIBUTETYPE, enmType, Allocation); +RTASN1TMPL_MEMBER_DYN( uValues, pOctetStrings, MessageDigest, RTASN1SETOFOCTETSTRINGS, RTAsn1SetOfOctetStrings, Allocation, + Type, enmType, RTCRPKCS7ATTRIBUTETYPE_OCTET_STRINGS, RTCR_PKCS9_ID_MESSAGE_DIGEST_OID); +RTASN1TMPL_MEMBER_DYN( uValues, pObjIds, ContentType, RTASN1SETOFOBJIDS, RTAsn1SetOfObjIds, Allocation, + Type, enmType, RTCRPKCS7ATTRIBUTETYPE_OBJ_IDS, RTCR_PKCS9_ID_CONTENT_TYPE_OID); +RTASN1TMPL_MEMBER_DYN( uValues, pCounterSignatures,CounterSignatures, RTCRPKCS7SIGNERINFOS, RTCrPkcs7SignerInfos, Allocation, + Type, enmType, RTCRPKCS7ATTRIBUTETYPE_COUNTER_SIGNATURES, RTCR_PKCS9_ID_COUNTER_SIGNATURE_OID); +RTASN1TMPL_MEMBER_DYN( uValues, pSigningTime, SigningTime, RTASN1SETOFTIMES, RTAsn1SetOfTimes, Allocation, + Type, enmType, RTCRPKCS7ATTRIBUTETYPE_SIGNING_TIME, RTCR_PKCS9_ID_SIGNING_TIME_OID); +RTASN1TMPL_MEMBER_DYN( uValues, pContentInfos, MsTimestamp, RTCRPKCS7SETOFCONTENTINFOS, RTCrPkcs7SetOfContentInfos, Allocation, + Type, enmType, RTCRPKCS7ATTRIBUTETYPE_MS_TIMESTAMP, RTCR_PKCS9_ID_MS_TIMESTAMP); +RTASN1TMPL_MEMBER_DYN( uValues, pContentInfos, MsNestedSignature, RTCRPKCS7SETOFCONTENTINFOS, RTCrPkcs7SetOfContentInfos, Allocation, + Type, enmType, RTCRPKCS7ATTRIBUTETYPE_MS_NESTED_SIGNATURE, RTCR_PKCS9_ID_MS_NESTED_SIGNATURE); +RTASN1TMPL_MEMBER_DYN( uValues, pObjIdSeqs, MsStatementType, RTASN1SETOFOBJIDSEQS, RTAsn1SetOfObjIdSeqs, Allocation, + Type, enmType, RTCRPKCS7ATTRIBUTETYPE_MS_STATEMENT_TYPE, RTCR_PKCS9_ID_MS_STATEMENT_TYPE); +RTASN1TMPL_MEMBER_DYN( uValues, pOctetStrings, AppleMultiCdPlist, RTASN1SETOFOCTETSTRINGS, RTAsn1SetOfOctetStrings, Allocation, + Type, enmType, RTCRPKCS7ATTRIBUTETYPE_APPLE_MULTI_CD_PLIST, RTCR_PKCS9_ID_APPLE_MULTI_CD_PLIST); +RTASN1TMPL_MEMBER_DYN_DEFAULT( uValues, pCores, RTASN1SETOFCORES, RTAsn1SetOfCores, Allocation, + Type, enmType, RTCRPKCS7ATTRIBUTETYPE_UNKNOWN); +RTASN1TMPL_MEMBER_DYN_END(Type, RTCRPKCS7ATTRIBUTETYPE, enmType, Allocation); RTASN1TMPL_END_SEQCORE(); #undef RTASN1TMPL_TYPE #undef RTASN1TMPL_EXT_NAME diff -Nru virtualbox-hwe-6.1.34-dfsg/src/VBox/Runtime/common/crypto/pkcs7-verify.cpp virtualbox-hwe-6.1.38-dfsg/src/VBox/Runtime/common/crypto/pkcs7-verify.cpp --- virtualbox-hwe-6.1.34-dfsg/src/VBox/Runtime/common/crypto/pkcs7-verify.cpp 2022-03-22 23:45:20.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/src/VBox/Runtime/common/crypto/pkcs7-verify.cpp 2022-09-01 13:28:45.000000000 +0000 @@ -32,6 +32,7 @@ #include #include +#include #include #include #include @@ -58,16 +59,23 @@ /* * Verify using OpenSSL. ERR_PUT_error */ - int rcOssl; - unsigned char const *pbRawContent = RTASN1CORE_GET_RAW_ASN1_PTR(&pContentInfo->SeqCore.Asn1Core); - uint32_t cbRawContent = RTASN1CORE_GET_RAW_ASN1_SIZE(&pContentInfo->SeqCore.Asn1Core) - + (pContentInfo->SeqCore.Asn1Core.fFlags & RTASN1CORE_F_INDEFINITE_LENGTH ? 2 : 0); - PKCS7 *pOsslPkcs7 = NULL; - if (d2i_PKCS7(&pOsslPkcs7, &pbRawContent, cbRawContent) != NULL) + unsigned char const *pbRawContent; + uint32_t cbRawContent; + void *pvFree; + int rcOssl = RTAsn1EncodeQueryRawBits(RTCrPkcs7ContentInfo_GetAsn1Core(pContentInfo), + (const uint8_t **)&pbRawContent, &cbRawContent, &pvFree, pErrInfo); + AssertRCReturn(rcOssl, rcOssl); + + PKCS7 *pOsslPkcs7 = NULL; + PKCS7 *pOsslPkcs7Ret = d2i_PKCS7(&pOsslPkcs7, &pbRawContent, cbRawContent); + + RTMemTmpFree(pvFree); + + if (pOsslPkcs7Ret != NULL) { STACK_OF(X509) *pAddCerts = NULL; if (hAdditionalCerts != NIL_RTCRSTORE) - rcOssl = RTCrStoreConvertToOpenSslCertStack(hAdditionalCerts, 0, (void **)&pAddCerts); + rcOssl = RTCrStoreConvertToOpenSslCertStack(hAdditionalCerts, 0, (void **)&pAddCerts, pErrInfo); else { pAddCerts = sk_X509_new_null(); @@ -78,11 +86,11 @@ PCRTCRPKCS7SETOFCERTS pCerts = &pContentInfo->u.pSignedData->Certificates; for (uint32_t i = 0; i < pCerts->cItems; i++) if (pCerts->papItems[i]->enmChoice == RTCRPKCS7CERTCHOICE_X509) - rtCrOpenSslAddX509CertToStack(pAddCerts, pCerts->papItems[i]->u.pX509Cert); + rtCrOpenSslAddX509CertToStack(pAddCerts, pCerts->papItems[i]->u.pX509Cert, NULL); X509_STORE *pTrustedCerts = NULL; if (hTrustedCerts != NIL_RTCRSTORE) - rcOssl = RTCrStoreConvertToOpenSslCertStore(hTrustedCerts, 0, (void **)&pTrustedCerts); + rcOssl = RTCrStoreConvertToOpenSslCertStore(hTrustedCerts, 0, (void **)&pTrustedCerts, pErrInfo); if (RT_SUCCESS(rcOssl)) { rtCrOpenSslInit(); @@ -315,15 +323,9 @@ RTCrDigestRelease(*phDigest); *phDigest = hDigest; - /* ASSUMES that the attributes are encoded according to DER. */ - uint8_t const *pbData = (uint8_t const *)RTASN1CORE_GET_RAW_ASN1_PTR(&pSignerInfo->AuthenticatedAttributes.SetCore.Asn1Core); - uint32_t cbData = RTASN1CORE_GET_RAW_ASN1_SIZE(&pSignerInfo->AuthenticatedAttributes.SetCore.Asn1Core); - uint8_t bSetOfTag = ASN1_TAG_SET | ASN1_TAGCLASS_UNIVERSAL | ASN1_TAGFLAG_CONSTRUCTED; - rc = RTCrDigestUpdate(hDigest, &bSetOfTag, sizeof(bSetOfTag)); /* Replace the implict tag with a SET-OF tag. */ - if (RT_SUCCESS(rc)) - rc = RTCrDigestUpdate(hDigest, pbData + sizeof(bSetOfTag), cbData - sizeof(bSetOfTag)); /* Skip the implicit tag. */ - if (RT_SUCCESS(rc)) - rc = RTCrDigestFinal(hDigest, NULL, 0); + /** @todo The encoding step modifies the data, contradicting the const-ness + * of the parameter. */ + rc = RTCrPkcs7Attributes_HashAttributes((PRTCRPKCS7ATTRIBUTES)&pSignerInfo->AuthenticatedAttributes, hDigest, pErrInfo); } return rc; } @@ -424,8 +426,9 @@ * and verify them. If no valid paths are found, this step will fail. */ int rc = VINF_SUCCESS; - if ( hSignerCertSrc == NIL_RTCRSTORE - || hSignerCertSrc != hTrustedCerts) + if ( ( hSignerCertSrc == NIL_RTCRSTORE + || hSignerCertSrc != hTrustedCerts) + && !(fFlags & RTCRPKCS7VERIFY_SD_F_TRUST_ALL_CERTS) ) { RTCRX509CERTPATHS hCertPaths; rc = RTCrX509CertPathsCreate(&hCertPaths, pSignerCert); diff -Nru virtualbox-hwe-6.1.34-dfsg/src/VBox/Runtime/common/crypto/pkix-signature-rsa.cpp virtualbox-hwe-6.1.38-dfsg/src/VBox/Runtime/common/crypto/pkix-signature-rsa.cpp --- virtualbox-hwe-6.1.34-dfsg/src/VBox/Runtime/common/crypto/pkix-signature-rsa.cpp 2022-03-22 23:45:20.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/src/VBox/Runtime/common/crypto/pkix-signature-rsa.cpp 2022-09-01 13:28:45.000000000 +0000 @@ -80,36 +80,60 @@ /** @name Pre-encoded DigestInfo DER sequences. * @{ */ static const uint8_t g_abMd2[] = -{/* { { 1.2.840.113549.2.2 (MD2), NULL }, hash octet-string } */ - 0x30,0x20, 0x30,0x0c, 0x06,0x08,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x02,0x02, 0x05,0x00, 0x04,0x10 +{/* { { 1.2.840.113549.2.2 (MD2), NULL }, hash octet-string } */ + 0x30,0x20, 0x30,0x0c, 0x06,0x08,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x02,0x02, 0x05,0x00, 0x04,0x10 }; static const uint8_t g_abMd4[] = -{/* { { 1.2.840.113549.2.4 (MD4), NULL }, hash octet-string } */ - 0x30,0x20, 0x30,0x0c, 0x06,0x08,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x02,0x04, 0x05,0x00, 0x04,0x10 +{/* { { 1.2.840.113549.2.4 (MD4), NULL }, hash octet-string } */ + 0x30,0x20, 0x30,0x0c, 0x06,0x08,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x02,0x04, 0x05,0x00, 0x04,0x10 }; static const uint8_t g_abMd5[] = -{/* { { 1.2.840.113549.2.5 (MD5), NULL }, hash octet-string } */ - 0x30,0x20, 0x30,0x0c, 0x06,0x08,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x02,0x05, 0x05,0x00, 0x04,0x10 +{/* { { 1.2.840.113549.2.5 (MD5), NULL }, hash octet-string } */ + 0x30,0x20, 0x30,0x0c, 0x06,0x08,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x02,0x05, 0x05,0x00, 0x04,0x10 }; static const uint8_t g_abSha1[] = -{/* { { 1.3.14.3.2.26 (SHA-1), NULL }, hash octet-string } */ - 0x30,0x21, 0x30,0x09, 0x06,0x05,0x2b,0x0e,0x03,0x02,0x1a, 0x05,0x00, 0x04,0x14 +{/* { { 1.3.14.3.2.26 (SHA-1), NULL }, hash octet-string } */ + 0x30,0x21, 0x30,0x09, 0x06,0x05,0x2b,0x0e,0x03,0x02,0x1a, 0x05,0x00, 0x04,0x14 }; static const uint8_t g_abSha256[] = -{/* { { 2.16.840.1.101.3.4.2.1 (SHA-256), NULL }, hash octet-string } */ - 0x30,0x31, 0x30,0x0d, 0x06,0x09,0x60,0x86,0x48,0x01,0x65,0x03,0x04,0x02,0x01, 0x05,0x00, 0x04,0x20 +{/* { { 2.16.840.1.101.3.4.2.1 (SHA-256), NULL }, hash octet-string } */ + 0x30,0x31, 0x30,0x0d, 0x06,0x09,0x60,0x86,0x48,0x01,0x65,0x03,0x04,0x02,0x01, 0x05,0x00, 0x04,0x20 }; static const uint8_t g_abSha384[] = -{/* { { 2.16.840.1.101.3.4.2.2 (SHA-384), NULL }, hash octet-string } */ - 0x30,0x41, 0x30,0x0d, 0x06,0x09,0x60,0x86,0x48,0x01,0x65,0x03,0x04,0x02,0x02, 0x05,0x00, 0x04,0x30 +{/* { { 2.16.840.1.101.3.4.2.2 (SHA-384), NULL }, hash octet-string } */ + 0x30,0x41, 0x30,0x0d, 0x06,0x09,0x60,0x86,0x48,0x01,0x65,0x03,0x04,0x02,0x02, 0x05,0x00, 0x04,0x30 }; static const uint8_t g_abSha512[] = -{/* { { 2.16.840.1.101.3.4.2.3 (SHA-512), NULL }, hash octet-string } */ - 0x30,0x51, 0x30,0x0d, 0x06,0x09,0x60,0x86,0x48,0x01,0x65,0x03,0x04,0x02,0x03, 0x05,0x00, 0x04,0x40 +{/* { { 2.16.840.1.101.3.4.2.3 (SHA-512), NULL }, hash octet-string } */ + 0x30,0x51, 0x30,0x0d, 0x06,0x09,0x60,0x86,0x48,0x01,0x65,0x03,0x04,0x02,0x03, 0x05,0x00, 0x04,0x40 }; static const uint8_t g_abSha224[] = -{/* { { 2.16.840.1.101.3.4.2.4 (SHA-224), NULL }, hash octet-string } */ - 0x30,0x2d, 0x30,0x0d, 0x06,0x09,0x60,0x86,0x48,0x01,0x65,0x03,0x04,0x02,0x04, 0x05,0x00, 0x04,0x1c +{/* { { 2.16.840.1.101.3.4.2.4 (SHA-224), NULL }, hash octet-string } */ + 0x30,0x2d, 0x30,0x0d, 0x06,0x09,0x60,0x86,0x48,0x01,0x65,0x03,0x04,0x02,0x04, 0x05,0x00, 0x04,0x1c +}; +static const uint8_t g_abSha512t224[] = +{/* { { 2.16.840.1.101.3.4.2.5 (SHA-512T224), NULL }, hash octet-string } */ + 0x30,0x2d, 0x30,0x0d, 0x06,0x09,0x60,0x86,0x48,0x01,0x65,0x03,0x04,0x02,0x05, 0x05,0x00, 0x04,0x1c +}; +static const uint8_t g_abSha512t256[] = +{/* { { 2.16.840.1.101.3.4.2.6 (SHA-512T256), NULL }, hash octet-string } */ + 0x30,0x31, 0x30,0x0d, 0x06,0x09,0x60,0x86,0x48,0x01,0x65,0x03,0x04,0x02,0x06, 0x05,0x00, 0x04,0x20 +}; +static const uint8_t g_abSha3t224[] = +{/* { { 2.16.840.1.101.3.4.2.7 (SHA3-224), NULL }, hash octet-string } */ + 0x30,0x2d, 0x30,0x0d, 0x06,0x09,0x60,0x86,0x48,0x01,0x65,0x03,0x04,0x02,0x07, 0x05,0x00, 0x04,0x1c +}; +static const uint8_t g_abSha3t256[] = +{/* { { 2.16.840.1.101.3.4.2.8 (SHA3-256), NULL }, hash octet-string } */ + 0x30,0x31, 0x30,0x0d, 0x06,0x09,0x60,0x86,0x48,0x01,0x65,0x03,0x04,0x02,0x08, 0x05,0x00, 0x04,0x20 +}; +static const uint8_t g_abSha3t384[] = +{/* { { 2.16.840.1.101.3.4.2.9 (SHA3-384), NULL }, hash octet-string } */ + 0x30,0x41, 0x30,0x0d, 0x06,0x09,0x60,0x86,0x48,0x01,0x65,0x03,0x04,0x02,0x09, 0x05,0x00, 0x04,0x30 +}; +static const uint8_t g_abSha3t512[] = +{/* { { 2.16.840.1.101.3.4.2.10 (SHA3-512), NULL }, hash octet-string } */ + 0x30,0x51, 0x30,0x0d, 0x06,0x09,0x60,0x86,0x48,0x01,0x65,0x03,0x04,0x02,0x0a, 0x05,0x00, 0x04,0x40 }; /** @} */ @@ -121,14 +145,20 @@ size_t cb; } const g_aDigestInfos[] = { - { RTDIGESTTYPE_MD2, g_abMd2, sizeof(g_abMd2) }, - { RTDIGESTTYPE_MD4, g_abMd4, sizeof(g_abMd4) }, - { RTDIGESTTYPE_MD5, g_abMd5, sizeof(g_abMd5) }, - { RTDIGESTTYPE_SHA1, g_abSha1, sizeof(g_abSha1) }, - { RTDIGESTTYPE_SHA256, g_abSha256, sizeof(g_abSha256) }, - { RTDIGESTTYPE_SHA384, g_abSha384, sizeof(g_abSha384) }, - { RTDIGESTTYPE_SHA512, g_abSha512, sizeof(g_abSha512) }, - { RTDIGESTTYPE_SHA224, g_abSha224, sizeof(g_abSha224) }, + { RTDIGESTTYPE_SHA1, g_abSha1, sizeof(g_abSha1) }, + { RTDIGESTTYPE_SHA256, g_abSha256, sizeof(g_abSha256) }, + { RTDIGESTTYPE_SHA512, g_abSha512, sizeof(g_abSha512) }, + { RTDIGESTTYPE_MD2, g_abMd2, sizeof(g_abMd2) }, + { RTDIGESTTYPE_MD4, g_abMd4, sizeof(g_abMd4) }, + { RTDIGESTTYPE_MD5, g_abMd5, sizeof(g_abMd5) }, + { RTDIGESTTYPE_SHA384, g_abSha384, sizeof(g_abSha384) }, + { RTDIGESTTYPE_SHA224, g_abSha224, sizeof(g_abSha224) }, + { RTDIGESTTYPE_SHA512T224, g_abSha512t224, sizeof(g_abSha512t224)}, + { RTDIGESTTYPE_SHA512T256, g_abSha512t256, sizeof(g_abSha512t256)}, + { RTDIGESTTYPE_SHA3_224, g_abSha3t224, sizeof(g_abSha3t224) }, + { RTDIGESTTYPE_SHA3_256, g_abSha3t256, sizeof(g_abSha3t256) }, + { RTDIGESTTYPE_SHA3_384, g_abSha3t384, sizeof(g_abSha3t384) }, + { RTDIGESTTYPE_SHA3_512, g_abSha3t512, sizeof(g_abSha3t512) }, }; @@ -436,6 +466,8 @@ RTCR_PKCS1_SHA384_WITH_RSA_OID, RTCR_PKCS1_SHA512_WITH_RSA_OID, RTCR_PKCS1_SHA224_WITH_RSA_OID, + RTCR_PKCS1_SHA512T224_WITH_RSA_OID, + RTCR_PKCS1_SHA512T256_WITH_RSA_OID, /* Note: Note quite sure about these OIW oddballs. */ "1.3.14.3.2.11" /* OIW rsaSignature */, "1.3.14.3.2.14" /* OIW mdc2WithRSASignature */, @@ -463,3 +495,53 @@ rtCrPkixSignatureRsa_Sign, }; + +/** + * Worker for RTCrRsaPublicKey_CanHandleDigestType and + * RTCrRsaPrivateKey_CanHandleDigestType. + * + * We implement these two functions here because we've already got the + * DigestInfo sizes nicely lined up here. + */ +static bool rtCrRsa_CanHandleDigestType(int32_t cModulusBits, RTDIGESTTYPE enmDigestType, PRTERRINFO pErrInfo) +{ + /* + * ASSUME EMSA-PKCS1-v1_5 padding scheme (RFC-8017 section 9.2): + * - 11 byte padding prefix (00, 01, 8 times ff) + * - digest info der sequence for rsaWithXxxxEncryption + * - the hash value. + */ + for (uint32_t i = 0; i < RT_ELEMENTS(g_aDigestInfos); i++) + if (g_aDigestInfos[i].enmDigest == enmDigestType) + { + size_t const cbHash = RTCrDigestTypeToHashSize(enmDigestType); + AssertBreak(cbHash > 0); + + size_t cbMsg = 11 + g_aDigestInfos[i].cb + cbHash; + if ((ssize_t)cbMsg <= cModulusBits / 8) + return true; + RTErrInfoSetF(pErrInfo, VERR_CR_PKIX_INVALID_SIGNATURE_LENGTH, "cModulusBits=%d cbMsg=%u", cModulusBits, cbMsg); + return false; + } + RTErrInfoSetF(pErrInfo, VERR_CR_PKIX_UNKNOWN_DIGEST_TYPE, "%s", RTCrDigestTypeToName(enmDigestType)); + return false; +} + + +RTDECL(bool) RTCrRsaPublicKey_CanHandleDigestType(PCRTCRRSAPUBLICKEY pRsaPublicKey, RTDIGESTTYPE enmDigestType, + PRTERRINFO pErrInfo) +{ + if (RTCrRsaPublicKey_IsPresent(pRsaPublicKey)) + return rtCrRsa_CanHandleDigestType(RTAsn1Integer_UnsignedLastBit(&pRsaPublicKey->Modulus) + 1, enmDigestType, pErrInfo); + return false; +} + + +RTDECL(bool) RTCrRsaPrivateKey_CanHandleDigestType(PCRTCRRSAPRIVATEKEY pRsaPrivateKey, RTDIGESTTYPE enmDigestType, + PRTERRINFO pErrInfo) +{ + if (RTCrRsaPrivateKey_IsPresent(pRsaPrivateKey)) + return rtCrRsa_CanHandleDigestType(RTAsn1Integer_UnsignedLastBit(&pRsaPrivateKey->Modulus) + 1, enmDigestType, pErrInfo); + return false; +} + diff -Nru virtualbox-hwe-6.1.34-dfsg/src/VBox/Runtime/common/crypto/pkix-sign.cpp virtualbox-hwe-6.1.38-dfsg/src/VBox/Runtime/common/crypto/pkix-sign.cpp --- virtualbox-hwe-6.1.34-dfsg/src/VBox/Runtime/common/crypto/pkix-sign.cpp 2022-03-22 23:45:20.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/src/VBox/Runtime/common/crypto/pkix-sign.cpp 2022-09-01 13:28:45.000000000 +0000 @@ -154,8 +154,8 @@ /* Create an EVP private key. */ EVP_PKEY *pEvpPrivateKey = NULL; const EVP_MD *pEvpMdType = NULL; - int rcOssl = rtCrKeyToOpenSslKey(hPrivateKey, false /*fNeedPublic*/, pszAlgObjId, - (void **)&pEvpPrivateKey, (const void **)&pEvpMdType, pErrInfo); + int rcOssl = rtCrKeyToOpenSslKeyEx(hPrivateKey, false /*fNeedPublic*/, pszAlgObjId, + (void **)&pEvpPrivateKey, (const void **)&pEvpMdType, pErrInfo); if (RT_SUCCESS(rcOssl)) { /* Create an EVP Private key context we can use to validate the digest. */ diff -Nru virtualbox-hwe-6.1.34-dfsg/src/VBox/Runtime/common/crypto/pkix-util.cpp virtualbox-hwe-6.1.38-dfsg/src/VBox/Runtime/common/crypto/pkix-util.cpp --- virtualbox-hwe-6.1.34-dfsg/src/VBox/Runtime/common/crypto/pkix-util.cpp 2022-03-22 23:45:20.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/src/VBox/Runtime/common/crypto/pkix-util.cpp 2022-09-01 13:28:45.000000000 +0000 @@ -31,8 +31,11 @@ #include "internal/iprt.h" #include -#include +#include +#include +#include #include +#include #ifdef IPRT_WITH_OPENSSL # include "internal/iprt-openssl.h" @@ -91,3 +94,50 @@ return NULL; } + +RTDECL(bool) RTCrPkixPubKeyCanHandleDigestType(PCRTCRX509SUBJECTPUBLICKEYINFO pPublicKeyInfo, RTDIGESTTYPE enmDigestType, + PRTERRINFO pErrInfo) +{ + bool fRc = false; + if (RTCrX509SubjectPublicKeyInfo_IsPresent(pPublicKeyInfo)) + { + void const * const pvKeyBits = RTASN1BITSTRING_GET_BIT0_PTR(&pPublicKeyInfo->SubjectPublicKey); + uint32_t const cbKeyBits = RTASN1BITSTRING_GET_BYTE_SIZE(&pPublicKeyInfo->SubjectPublicKey); + RTASN1CURSORPRIMARY PrimaryCursor; + union + { + RTCRRSAPUBLICKEY RsaPublicKey; + } u; + + if (RTAsn1ObjId_CompareWithString(&pPublicKeyInfo->Algorithm.Algorithm, RTCR_PKCS1_RSA_OID) == 0) + { + /* + * RSA. + */ + RTAsn1CursorInitPrimary(&PrimaryCursor, pvKeyBits, cbKeyBits, pErrInfo, &g_RTAsn1DefaultAllocator, + RTASN1CURSOR_FLAGS_DER, "rsa"); + + RT_ZERO(u.RsaPublicKey); + int rc = RTCrRsaPublicKey_DecodeAsn1(&PrimaryCursor.Cursor, 0, &u.RsaPublicKey, "PublicKey"); + if (RT_SUCCESS(rc)) + fRc = RTCrRsaPublicKey_CanHandleDigestType(&u.RsaPublicKey, enmDigestType, pErrInfo); + RTCrRsaPublicKey_Delete(&u.RsaPublicKey); + } + else + { + RTErrInfoSetF(pErrInfo, VERR_CR_PKIX_CIPHER_ALGO_NOT_KNOWN, "%s", pPublicKeyInfo->Algorithm.Algorithm.szObjId); + AssertMsgFailed(("unknown key algorithm: %s\n", pPublicKeyInfo->Algorithm.Algorithm.szObjId)); + fRc = true; + } + } + return fRc; +} + + +RTDECL(bool) RTCrPkixCanCertHandleDigestType(PCRTCRX509CERTIFICATE pCertificate, RTDIGESTTYPE enmDigestType, PRTERRINFO pErrInfo) +{ + if (RTCrX509Certificate_IsPresent(pCertificate)) + return RTCrPkixPubKeyCanHandleDigestType(&pCertificate->TbsCertificate.SubjectPublicKeyInfo, enmDigestType, pErrInfo); + return false; +} + diff -Nru virtualbox-hwe-6.1.34-dfsg/src/VBox/Runtime/common/crypto/pkix-verify.cpp virtualbox-hwe-6.1.38-dfsg/src/VBox/Runtime/common/crypto/pkix-verify.cpp --- virtualbox-hwe-6.1.34-dfsg/src/VBox/Runtime/common/crypto/pkix-verify.cpp 2022-03-22 23:45:20.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/src/VBox/Runtime/common/crypto/pkix-verify.cpp 2022-09-01 13:28:45.000000000 +0000 @@ -115,8 +115,8 @@ /* Create an EVP public key. */ EVP_PKEY *pEvpPublicKey = NULL; const EVP_MD *pEvpMdType = NULL; - int rcOssl = rtCrKeyToOpenSslKey(hPublicKey, true /*fNeedPublic*/, pAlgorithm->szObjId, - (void **)&pEvpPublicKey, (const void **)&pEvpMdType, pErrInfo); + int rcOssl = rtCrKeyToOpenSslKeyEx(hPublicKey, true /*fNeedPublic*/, pAlgorithm->szObjId, + (void **)&pEvpPublicKey, (const void **)&pEvpMdType, pErrInfo); if (RT_SUCCESS(rcOssl)) { EVP_MD_CTX *pEvpMdCtx = EVP_MD_CTX_create(); @@ -229,8 +229,8 @@ /* Create an EVP public key. */ EVP_PKEY *pEvpPublicKey = NULL; const EVP_MD *pEvpMdType = NULL; - int rcOssl = rtCrKeyToOpenSslKey(hPublicKey, true /*fNeedPublic*/, pszAlgObjId, - (void **)&pEvpPublicKey, (const void **)&pEvpMdType, pErrInfo); + int rcOssl = rtCrKeyToOpenSslKeyEx(hPublicKey, true /*fNeedPublic*/, pszAlgObjId, + (void **)&pEvpPublicKey, (const void **)&pEvpMdType, pErrInfo); if (RT_SUCCESS(rcOssl)) { /* Create an EVP public key context we can use to validate the digest. */ diff -Nru virtualbox-hwe-6.1.34-dfsg/src/VBox/Runtime/common/crypto/spc-template.h virtualbox-hwe-6.1.38-dfsg/src/VBox/Runtime/common/crypto/spc-template.h --- virtualbox-hwe-6.1.34-dfsg/src/VBox/Runtime/common/crypto/spc-template.h 2022-03-22 23:45:20.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/src/VBox/Runtime/common/crypto/spc-template.h 2022-09-01 13:28:45.000000000 +0000 @@ -51,13 +51,14 @@ #define RTASN1TMPL_INT_NAME rtCrSpcSerializedObjectAttribute RTASN1TMPL_BEGIN_SEQCORE(); RTASN1TMPL_MEMBER( Type, RTASN1OBJID, RTAsn1ObjId); -RTASN1TMPL_MEMBER_DYN_BEGIN( RTCRSPCSERIALIZEDOBJECTATTRIBUTETYPE, enmType, Allocation); -RTASN1TMPL_MEMBER_DYN( u, pPageHashes, RTCRSPCSERIALIZEDPAGEHASHES, RTCrSpcSerializedPageHashes, Allocation, enmType, - RTCRSPCSERIALIZEDOBJECTATTRIBUTETYPE_PAGE_HASHES_V1, RTAsn1ObjId_CompareWithString(&pThis->Type, RTCRSPC_PE_IMAGE_HASHES_V1_OID) == 0); -RTASN1TMPL_MEMBER_DYN( u, pPageHashes, RTCRSPCSERIALIZEDPAGEHASHES, RTCrSpcSerializedPageHashes, Allocation, enmType, - RTCRSPCSERIALIZEDOBJECTATTRIBUTETYPE_PAGE_HASHES_V2, RTAsn1ObjId_CompareWithString(&pThis->Type, RTCRSPC_PE_IMAGE_HASHES_V2_OID) == 0); -RTASN1TMPL_MEMBER_DYN_DEFAULT( u, pCore, RTASN1CORE, RTAsn1Core, Allocation, enmType, RTCRSPCSERIALIZEDOBJECTATTRIBUTETYPE_UNKNOWN); -RTASN1TMPL_MEMBER_DYN_END( RTCRSPCSERIALIZEDOBJECTATTRIBUTETYPE, enmType, Allocation); +RTASN1TMPL_MEMBER_DYN_BEGIN( Type, RTCRSPCSERIALIZEDOBJECTATTRIBUTETYPE, enmType, Allocation); +RTASN1TMPL_MEMBER_DYN( u, pPageHashes, V1Hashes, RTCRSPCSERIALIZEDPAGEHASHES, RTCrSpcSerializedPageHashes, Allocation, + Type, enmType, RTCRSPCSERIALIZEDOBJECTATTRIBUTETYPE_PAGE_HASHES_V1, RTCRSPC_PE_IMAGE_HASHES_V1_OID); +RTASN1TMPL_MEMBER_DYN( u, pPageHashes, V2Hashes, RTCRSPCSERIALIZEDPAGEHASHES, RTCrSpcSerializedPageHashes, Allocation, + Type, enmType, RTCRSPCSERIALIZEDOBJECTATTRIBUTETYPE_PAGE_HASHES_V2, RTCRSPC_PE_IMAGE_HASHES_V2_OID); +RTASN1TMPL_MEMBER_DYN_DEFAULT( u, pCore, RTASN1CORE, RTAsn1Core, Allocation, + Type, enmType, RTCRSPCSERIALIZEDOBJECTATTRIBUTETYPE_UNKNOWN); +RTASN1TMPL_MEMBER_DYN_END( Type, RTCRSPCSERIALIZEDOBJECTATTRIBUTETYPE, enmType, Allocation); RTASN1TMPL_END_SEQCORE(); #undef RTASN1TMPL_TYPE #undef RTASN1TMPL_EXT_NAME @@ -159,11 +160,12 @@ #define RTASN1TMPL_INT_NAME rtCrSpcAttributeTypeAndOptionalValue RTASN1TMPL_BEGIN_SEQCORE(); RTASN1TMPL_MEMBER( Type, RTASN1OBJID, RTAsn1ObjId); -RTASN1TMPL_MEMBER_DYN_BEGIN( RTCRSPCAAOVTYPE, enmType, Allocation); -RTASN1TMPL_MEMBER_DYN( uValue, pPeImage, RTCRSPCPEIMAGEDATA, RTCrSpcPeImageData, Allocation, enmType, - RTCRSPCAAOVTYPE_PE_IMAGE_DATA, RTAsn1ObjId_CompareWithString(&pThis->Type, RTCRSPCPEIMAGEDATA_OID) == 0); -RTASN1TMPL_MEMBER_DYN_DEFAULT( uValue, pCore, RTASN1CORE, RTAsn1Core, Allocation, enmType, RTCRSPCAAOVTYPE_UNKNOWN); -RTASN1TMPL_MEMBER_DYN_END( RTCRSPCAAOVTYPE, enmType, Allocation); +RTASN1TMPL_MEMBER_DYN_BEGIN( Type, RTCRSPCAAOVTYPE, enmType, Allocation); +RTASN1TMPL_MEMBER_DYN( uValue, pPeImage, PeImage, RTCRSPCPEIMAGEDATA, RTCrSpcPeImageData, Allocation, + Type, enmType, RTCRSPCAAOVTYPE_PE_IMAGE_DATA, RTCRSPCPEIMAGEDATA_OID); +RTASN1TMPL_MEMBER_DYN_DEFAULT( uValue, pCore, RTASN1CORE, RTAsn1Core, Allocation, + Type, enmType, RTCRSPCAAOVTYPE_UNKNOWN); +RTASN1TMPL_MEMBER_DYN_END( Type, RTCRSPCAAOVTYPE, enmType, Allocation); RTASN1TMPL_END_SEQCORE(); #undef RTASN1TMPL_TYPE #undef RTASN1TMPL_EXT_NAME diff -Nru virtualbox-hwe-6.1.34-dfsg/src/VBox/Runtime/common/crypto/store.cpp virtualbox-hwe-6.1.38-dfsg/src/VBox/Runtime/common/crypto/store.cpp --- virtualbox-hwe-6.1.34-dfsg/src/VBox/Runtime/common/crypto/store.cpp 2022-03-22 23:45:20.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/src/VBox/Runtime/common/crypto/store.cpp 2022-09-01 13:28:46.000000000 +0000 @@ -36,6 +36,7 @@ #include #include +#include #include #ifdef IPRT_WITH_OPENSSL @@ -96,6 +97,18 @@ } +/** + * For the parent forwarding of the in-memory store. + */ +DECLHIDDEN(PCRTCRSTOREPROVIDER) rtCrStoreGetProvider(RTCRSTORE hStore, void **ppvProvider) +{ + PRTCRSTOREINT pThis = (PRTCRSTOREINT)hStore; + AssertPtrReturn(pThis, NULL); + AssertReturn(pThis->u32Magic == RTCRSTOREINT_MAGIC, NULL); + *ppvProvider = pThis->pvProvider; + return pThis->pProvider; +} + RTDECL(uint32_t) RTCrStoreRetain(RTCRSTORE hStore) { @@ -188,6 +201,80 @@ } +RTDECL(int) RTCrStoreCertAddX509(RTCRSTORE hStore, uint32_t fFlags, PRTCRX509CERTIFICATE pCertificate, PRTERRINFO pErrInfo) +{ + /* + * Validate. + */ + PRTCRSTOREINT pThis = (PRTCRSTOREINT)hStore; + AssertPtrReturn(pThis, VERR_INVALID_HANDLE); + AssertReturn(pThis->u32Magic == RTCRSTOREINT_MAGIC, VERR_INVALID_HANDLE); + + AssertPtrReturn(pCertificate, VERR_INVALID_POINTER); + AssertReturn(RTCrX509Certificate_IsPresent(pCertificate), VERR_INVALID_PARAMETER); + int rc = RTCrX509Certificate_CheckSanity(pCertificate, 0, pErrInfo, "Cert"); + AssertRCReturn(rc, rc); + + AssertReturn(!(fFlags & ~(RTCRCERTCTX_F_ADD_IF_NOT_FOUND | RTCRCERTCTX_F_ENC_MASK)), VERR_INVALID_FLAGS); + AssertCompile(RTCRCERTCTX_F_ENC_X509_DER == 0); + AssertMsgReturn((fFlags & RTCRCERTCTX_F_ENC_MASK) == RTCRCERTCTX_F_ENC_X509_DER, + ("Invalid encoding: %#x\n", fFlags), VERR_INVALID_FLAGS); + + /* + * Encode and add it using pfnCertAddEncoded. + */ + if (pThis->pProvider->pfnCertAddEncoded) + { + PRTASN1CORE pCore = RTCrX509Certificate_GetAsn1Core(pCertificate); + uint32_t cbEncoded = 0; + rc = RTAsn1EncodePrepare(pCore, RTASN1ENCODE_F_DER, &cbEncoded, pErrInfo); + if (RT_SUCCESS(rc)) + { + uint8_t * const pbEncoded = (uint8_t *)RTMemTmpAllocZ(cbEncoded); + if (pbEncoded) + { + rc = RTAsn1EncodeToBuffer(pCore, RTASN1ENCODE_F_DER, pbEncoded, cbEncoded, pErrInfo); + if (RT_SUCCESS(rc)) + rc = pThis->pProvider->pfnCertAddEncoded(pThis->pvProvider, fFlags, pbEncoded, cbEncoded, pErrInfo); + RTMemTmpFree(pbEncoded); + } + else + rc = VERR_NO_TMP_MEMORY; + } + } + else + rc = VERR_WRITE_PROTECT; + + return rc; +} + + +RTDECL(int) RTCrStoreCertAddPkcs7(RTCRSTORE hStore, uint32_t fFlags, PRTCRPKCS7CERT pCertificate, PRTERRINFO pErrInfo) +{ + AssertPtrReturn(pCertificate, VERR_INVALID_POINTER); + AssertReturn(RTCrPkcs7Cert_IsPresent(pCertificate), VERR_INVALID_PARAMETER); + switch (pCertificate->enmChoice) + { + case RTCRPKCS7CERTCHOICE_X509: + return RTCrStoreCertAddX509(hStore, fFlags, pCertificate->u.pX509Cert, pErrInfo); + + case RTCRPKCS7CERTCHOICE_EXTENDED_PKCS6: + return RTErrInfoSetF(pErrInfo, VERR_NOT_IMPLEMENTED, "RTCrStoreCertAddPkcs7 does not implement EXTENDED_PKCS6"); + case RTCRPKCS7CERTCHOICE_AC_V1: + return RTErrInfoSetF(pErrInfo, VERR_NOT_IMPLEMENTED, "RTCrStoreCertAddPkcs7 does not implement AC_V1"); + case RTCRPKCS7CERTCHOICE_AC_V2: + return RTErrInfoSetF(pErrInfo, VERR_NOT_IMPLEMENTED, "RTCrStoreCertAddPkcs7 does not implement AC_V2"); + case RTCRPKCS7CERTCHOICE_OTHER: + return RTErrInfoSetF(pErrInfo, VERR_NOT_IMPLEMENTED, "RTCrStoreCertAddPkcs7 does not implement OTHER"); + case RTCRPKCS7CERTCHOICE_END: + case RTCRPKCS7CERTCHOICE_INVALID: + case RTCRPKCS7CERTCHOICE_32BIT_HACK: + break; + /* no default */ + } + return RTErrInfoSetF(pErrInfo, VERR_INVALID_PARAMETER, "Invalid RTCRPKCS7CERT enmChoice value: %d", pCertificate->enmChoice); +} + /* * Searching. @@ -317,8 +404,9 @@ * OpenSSL helper. */ -RTDECL(int) RTCrStoreConvertToOpenSslCertStore(RTCRSTORE hStore, uint32_t fFlags, void **ppvOpenSslStore) +RTDECL(int) RTCrStoreConvertToOpenSslCertStore(RTCRSTORE hStore, uint32_t fFlags, void **ppvOpenSslStore, PRTERRINFO pErrInfo) { + RT_NOREF(pErrInfo); PRTCRSTOREINT pThis = (PRTCRSTOREINT)hStore; AssertPtrReturn(pThis, VERR_INVALID_HANDLE); AssertReturn(pThis->u32Magic == RTCRSTOREINT_MAGIC, VERR_INVALID_HANDLE); @@ -341,7 +429,8 @@ if (!pCertCtx) break; - if (pCertCtx->fFlags & RTCRCERTCTX_F_ENC_X509_DER) + if ( (pCertCtx->fFlags & RTCRCERTCTX_F_ENC_MASK) == RTCRCERTCTX_F_ENC_X509_DER + && pCertCtx->cbEncoded > 0) { X509 *pOsslCert = NULL; const unsigned char *pabEncoded = (const unsigned char *)pCertCtx->pabEncoded; @@ -371,8 +460,9 @@ } -RTDECL(int) RTCrStoreConvertToOpenSslCertStack(RTCRSTORE hStore, uint32_t fFlags, void **ppvOpenSslStack) +RTDECL(int) RTCrStoreConvertToOpenSslCertStack(RTCRSTORE hStore, uint32_t fFlags, void **ppvOpenSslStack, PRTERRINFO pErrInfo) { + RT_NOREF(pErrInfo); PRTCRSTOREINT pThis = (PRTCRSTOREINT)hStore; AssertPtrReturn(pThis, VERR_INVALID_HANDLE); AssertReturn(pThis->u32Magic == RTCRSTOREINT_MAGIC, VERR_INVALID_HANDLE); @@ -395,7 +485,8 @@ if (!pCertCtx) break; - if (pCertCtx->fFlags & RTCRCERTCTX_F_ENC_X509_DER) + if ( (pCertCtx->fFlags & RTCRCERTCTX_F_ENC_MASK) == RTCRCERTCTX_F_ENC_X509_DER + && pCertCtx->cbEncoded > 0) { X509 *pOsslCert = NULL; const unsigned char *pabEncoded = (const unsigned char *)pCertCtx->pabEncoded; diff -Nru virtualbox-hwe-6.1.34-dfsg/src/VBox/Runtime/common/crypto/store-inmem.cpp virtualbox-hwe-6.1.38-dfsg/src/VBox/Runtime/common/crypto/store-inmem.cpp --- virtualbox-hwe-6.1.34-dfsg/src/VBox/Runtime/common/crypto/store-inmem.cpp 2022-03-22 23:45:20.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/src/VBox/Runtime/common/crypto/store-inmem.cpp 2022-09-01 13:28:46.000000000 +0000 @@ -85,6 +85,13 @@ uint32_t cCertsAlloc; /** Array of certificates. */ PRTCRSTOREINMEMCERT *papCerts; + + /** Parent store. */ + RTCRSTORE hParentStore; + /** The parent store callback table. */ + PCRTCRSTOREPROVIDER pParentProvider; + /** The parent store provider callback argument. */ + void *pvParentProvider; } RTCRSTOREINMEM; /** Pointer to an in-memory crypto store. */ typedef RTCRSTOREINMEM *PRTCRSTOREINMEM; @@ -219,6 +226,13 @@ RTMemFree(pThis->papCerts); pThis->papCerts = NULL; + + if (pThis->hParentStore != NIL_RTCRSTORE) + { + RTCrStoreRelease(pThis->hParentStore); + pThis->hParentStore = NIL_RTCRSTORE; + } + RTMemFree(pThis); } @@ -248,29 +262,57 @@ static DECLCALLBACK(PCRTCRCERTCTX) rtCrStoreInMem_CertSearchNext(void *pvProvider, PRTCRSTORECERTSEARCH pSearch) { PRTCRSTOREINMEM pThis = (PRTCRSTOREINMEM)pvProvider; - AssertReturn(pSearch->auOpaque[0] == ~(uintptr_t)pvProvider, NULL); - - uintptr_t i = pSearch->auOpaque[1]; - if (i < pThis->cCerts) + if (pSearch->auOpaque[0] == ~(uintptr_t)pvProvider) { - pSearch->auOpaque[1] = i + 1; - PRTCRCERTCTXINT pCertCtx = &pThis->papCerts[i]->Core; - ASMAtomicIncU32(&pCertCtx->cRefs); - return &pCertCtx->Public; + uintptr_t i = pSearch->auOpaque[1]; + if (i < pThis->cCerts) + { + pSearch->auOpaque[1] = i + 1; + PRTCRCERTCTXINT pCertCtx = &pThis->papCerts[i]->Core; + ASMAtomicIncU32(&pCertCtx->cRefs); + return &pCertCtx->Public; + } + + /* Do we have a parent store to search? */ + if (pThis->hParentStore == NIL_RTCRSTORE) + return NULL; /* no */ + if ( !pThis->pParentProvider->pfnCertFindAll + || !pThis->pParentProvider->pfnCertSearchNext) + return NULL; + + RTCRSTORECERTSEARCH const SavedSearch = *pSearch; + int rc = pThis->pParentProvider->pfnCertFindAll(pThis->pvParentProvider, pSearch); + AssertRCReturnStmt(rc, *pSearch = SavedSearch, NULL); + + /* Restore the store.cpp specifics: */ + AssertCompile(RT_ELEMENTS(SavedSearch.auOpaque) == 4); + pSearch->auOpaque[2] = SavedSearch.auOpaque[2]; + pSearch->auOpaque[3] = SavedSearch.auOpaque[3]; } - return NULL; + + AssertReturn(pThis->pParentProvider, NULL); + AssertReturn(pThis->pParentProvider->pfnCertSearchNext, NULL); + return pThis->pParentProvider->pfnCertSearchNext(pThis->pvParentProvider, pSearch); } /** @interface_method_impl{RTCRSTOREPROVIDER,pfnCertSearchDestroy} */ static DECLCALLBACK(void) rtCrStoreInMem_CertSearchDestroy(void *pvProvider, PRTCRSTORECERTSEARCH pSearch) { - NOREF(pvProvider); - AssertReturnVoid(pSearch->auOpaque[0] == ~(uintptr_t)pvProvider); - pSearch->auOpaque[0] = 0; - pSearch->auOpaque[1] = 0; - pSearch->auOpaque[2] = 0; - pSearch->auOpaque[3] = 0; + PRTCRSTOREINMEM pThis = (PRTCRSTOREINMEM)pvProvider; + if (pSearch->auOpaque[0] == ~(uintptr_t)pvProvider) + { + pSearch->auOpaque[0] = 0; + pSearch->auOpaque[1] = 0; + pSearch->auOpaque[2] = 0; + pSearch->auOpaque[3] = 0; + } + else + { + AssertReturnVoid(pThis->pParentProvider); + AssertReturnVoid(pThis->pParentProvider->pfnCertSearchDestroy); + pThis->pParentProvider->pfnCertSearchDestroy(pThis->pvParentProvider, pSearch); + } } @@ -346,27 +388,47 @@ * * @returns IPRT status code. * @param ppStore Where to return the store instance. + * @param hParentStore Optional parent store. Consums reference on + * success. */ -static int rtCrStoreInMemCreateInternal(PRTCRSTOREINMEM *ppStore) +static int rtCrStoreInMemCreateInternal(PRTCRSTOREINMEM *ppStore, RTCRSTORE hParentStore) { PRTCRSTOREINMEM pStore = (PRTCRSTOREINMEM)RTMemAlloc(sizeof(*pStore)); if (pStore) { - pStore->cCerts = 0; - pStore->cCertsAlloc = 0; - pStore->papCerts = NULL; + pStore->cCerts = 0; + pStore->cCertsAlloc = 0; + pStore->papCerts = NULL; + pStore->hParentStore = hParentStore; + pStore->pParentProvider = NULL; + pStore->pvParentProvider = NULL; *ppStore = pStore; - return VINF_SUCCESS; + if (hParentStore == NIL_RTCRSTORE) + return VINF_SUCCESS; + if (~(uintptr_t)hParentStore != ~(uintptr_t)pStore) + { + pStore->pParentProvider = rtCrStoreGetProvider(hParentStore, &pStore->pvParentProvider); + if (pStore->pParentProvider) + return VINF_SUCCESS; + AssertFailed(); + } + RTMemFree(pStore); } *ppStore = NULL; /* shut up gcc-maybe-pita warning. */ return VERR_NO_MEMORY; } -RTDECL(int) RTCrStoreCreateInMem(PRTCRSTORE phStore, uint32_t cSizeHint) +RTDECL(int) RTCrStoreCreateInMemEx(PRTCRSTORE phStore, uint32_t cSizeHint, RTCRSTORE hParentStore) { + if (hParentStore != NIL_RTCRSTORE) + { + uint32_t cRefs = RTCrStoreRetain(hParentStore); + AssertReturn(cRefs != UINT32_MAX, VERR_INVALID_HANDLE); + } + PRTCRSTOREINMEM pStore; - int rc = rtCrStoreInMemCreateInternal(&pStore); + int rc = rtCrStoreInMemCreateInternal(&pStore, hParentStore); if (RT_SUCCESS(rc)) { if (cSizeHint) @@ -379,7 +441,16 @@ } RTMemFree(pStore); } + + RTCrStoreRelease(hParentStore); return rc; } +RT_EXPORT_SYMBOL(RTCrStoreCreateInMemEx); + + +RTDECL(int) RTCrStoreCreateInMem(PRTCRSTORE phStore, uint32_t cSizeHint) +{ + return RTCrStoreCreateInMemEx(phStore, cSizeHint, NIL_RTCRSTORE); +} RT_EXPORT_SYMBOL(RTCrStoreCreateInMem); diff -Nru virtualbox-hwe-6.1.34-dfsg/src/VBox/Runtime/common/crypto/store-internal.h virtualbox-hwe-6.1.38-dfsg/src/VBox/Runtime/common/crypto/store-internal.h --- virtualbox-hwe-6.1.34-dfsg/src/VBox/Runtime/common/crypto/store-internal.h 2022-03-22 23:45:20.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/src/VBox/Runtime/common/crypto/store-internal.h 2022-09-01 13:28:46.000000000 +0000 @@ -161,6 +161,7 @@ DECLHIDDEN(int) rtCrStoreCreate(PCRTCRSTOREPROVIDER pProvider, void *pvProvider, PRTCRSTORE phStore); +DECLHIDDEN(PCRTCRSTOREPROVIDER) rtCrStoreGetProvider(RTCRSTORE hStore, void **ppvProvider); #endif /* !IPRT_INCLUDED_SRC_common_crypto_store_internal_h */ diff -Nru virtualbox-hwe-6.1.34-dfsg/src/VBox/Runtime/common/crypto/x509-core.cpp virtualbox-hwe-6.1.38-dfsg/src/VBox/Runtime/common/crypto/x509-core.cpp --- virtualbox-hwe-6.1.34-dfsg/src/VBox/Runtime/common/crypto/x509-core.cpp 2022-03-22 23:45:20.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/src/VBox/Runtime/common/crypto/x509-core.cpp 2022-09-01 13:28:46.000000000 +0000 @@ -82,6 +82,15 @@ return RTDIGESTTYPE_SHA512T224; if (!strcmp(pThis->Algorithm.szObjId, RTCRX509ALGORITHMIDENTIFIERID_SHA512T256)) return RTDIGESTTYPE_SHA512T256; + + if (!strcmp(pThis->Algorithm.szObjId, RTCRX509ALGORITHMIDENTIFIERID_SHA3_224)) + return RTDIGESTTYPE_SHA3_224; + if (!strcmp(pThis->Algorithm.szObjId, RTCRX509ALGORITHMIDENTIFIERID_SHA3_256)) + return RTDIGESTTYPE_SHA3_256; + if (!strcmp(pThis->Algorithm.szObjId, RTCRX509ALGORITHMIDENTIFIERID_SHA3_384)) + return RTDIGESTTYPE_SHA3_384; + if (!strcmp(pThis->Algorithm.szObjId, RTCRX509ALGORITHMIDENTIFIERID_SHA3_512)) + return RTDIGESTTYPE_SHA3_512; return RTDIGESTTYPE_INVALID; } @@ -113,6 +122,14 @@ return 224 / 8; if (!strcmp(pThis->Algorithm.szObjId, RTCRX509ALGORITHMIDENTIFIERID_SHA512T256)) return 256 / 8; + if (!strcmp(pThis->Algorithm.szObjId, RTCRX509ALGORITHMIDENTIFIERID_SHA3_224)) + return 224 / 8; + if (!strcmp(pThis->Algorithm.szObjId, RTCRX509ALGORITHMIDENTIFIERID_SHA3_256)) + return 256 / 8; + if (!strcmp(pThis->Algorithm.szObjId, RTCRX509ALGORITHMIDENTIFIERID_SHA3_384)) + return 384 / 8; + if (!strcmp(pThis->Algorithm.szObjId, RTCRX509ALGORITHMIDENTIFIERID_SHA3_512)) + return 512 / 8; if (!strcmp(pThis->Algorithm.szObjId, RTCRX509ALGORITHMIDENTIFIERID_WHIRLPOOL)) return 512 / 8; @@ -171,6 +188,36 @@ if (!strcmp(pszEncryptedDigestOid, RTCRX509ALGORITHMIDENTIFIERID_SHA224_WITH_RSA)) return 0; } + else if (!strcmp(pszDigestOid, RTCRX509ALGORITHMIDENTIFIERID_SHA512T224)) + { + if (!strcmp(pszEncryptedDigestOid, RTCRX509ALGORITHMIDENTIFIERID_SHA512T224_WITH_RSA)) + return 0; + } + else if (!strcmp(pszDigestOid, RTCRX509ALGORITHMIDENTIFIERID_SHA512T256)) + { + if (!strcmp(pszEncryptedDigestOid, RTCRX509ALGORITHMIDENTIFIERID_SHA512T256_WITH_RSA)) + return 0; + } + else if (!strcmp(pszDigestOid, RTCRX509ALGORITHMIDENTIFIERID_SHA3_224)) + { + if (!strcmp(pszEncryptedDigestOid, RTCRX509ALGORITHMIDENTIFIERID_SHA3_224_WITH_RSA)) + return 0; + } + else if (!strcmp(pszDigestOid, RTCRX509ALGORITHMIDENTIFIERID_SHA3_256)) + { + if (!strcmp(pszEncryptedDigestOid, RTCRX509ALGORITHMIDENTIFIERID_SHA3_256_WITH_RSA)) + return 0; + } + else if (!strcmp(pszDigestOid, RTCRX509ALGORITHMIDENTIFIERID_SHA3_384)) + { + if (!strcmp(pszEncryptedDigestOid, RTCRX509ALGORITHMIDENTIFIERID_SHA3_384_WITH_RSA)) + return 0; + } + else if (!strcmp(pszDigestOid, RTCRX509ALGORITHMIDENTIFIERID_SHA3_512)) + { + if (!strcmp(pszEncryptedDigestOid, RTCRX509ALGORITHMIDENTIFIERID_SHA3_512_WITH_RSA)) + return 0; + } else if (!strcmp(pszDigestOid, RTCRX509ALGORITHMIDENTIFIERID_WHIRLPOOL)) { /* ?? */ @@ -218,6 +265,24 @@ if ( !strcmp(pszDigestOid, RTCRX509ALGORITHMIDENTIFIERID_SHA224) || !strcmp(pszDigestOid, RTCRX509ALGORITHMIDENTIFIERID_SHA224_WITH_RSA)) return RTCRX509ALGORITHMIDENTIFIERID_SHA224_WITH_RSA; + if ( !strcmp(pszDigestOid, RTCRX509ALGORITHMIDENTIFIERID_SHA512T224) + || !strcmp(pszDigestOid, RTCRX509ALGORITHMIDENTIFIERID_SHA512T224_WITH_RSA)) + return RTCRX509ALGORITHMIDENTIFIERID_SHA512T224_WITH_RSA; + if ( !strcmp(pszDigestOid, RTCRX509ALGORITHMIDENTIFIERID_SHA512T256) + || !strcmp(pszDigestOid, RTCRX509ALGORITHMIDENTIFIERID_SHA512T256_WITH_RSA)) + return RTCRX509ALGORITHMIDENTIFIERID_SHA512T256_WITH_RSA; + if ( !strcmp(pszDigestOid, RTCRX509ALGORITHMIDENTIFIERID_SHA3_224) + || !strcmp(pszDigestOid, RTCRX509ALGORITHMIDENTIFIERID_SHA3_224_WITH_RSA)) + return RTCRX509ALGORITHMIDENTIFIERID_SHA3_224_WITH_RSA; + if ( !strcmp(pszDigestOid, RTCRX509ALGORITHMIDENTIFIERID_SHA3_256) + || !strcmp(pszDigestOid, RTCRX509ALGORITHMIDENTIFIERID_SHA3_256_WITH_RSA)) + return RTCRX509ALGORITHMIDENTIFIERID_SHA3_256_WITH_RSA; + if ( !strcmp(pszDigestOid, RTCRX509ALGORITHMIDENTIFIERID_SHA3_384) + || !strcmp(pszDigestOid, RTCRX509ALGORITHMIDENTIFIERID_SHA3_384_WITH_RSA)) + return RTCRX509ALGORITHMIDENTIFIERID_SHA3_384_WITH_RSA; + if ( !strcmp(pszDigestOid, RTCRX509ALGORITHMIDENTIFIERID_SHA3_512) + || !strcmp(pszDigestOid, RTCRX509ALGORITHMIDENTIFIERID_SHA3_512_WITH_RSA)) + return RTCRX509ALGORITHMIDENTIFIERID_SHA3_512_WITH_RSA; /* if (!strcmp(pszDigestOid, RTCRX509ALGORITHMIDENTIFIERID_WHIRLPOOL)) return ???; */ diff -Nru virtualbox-hwe-6.1.34-dfsg/src/VBox/Runtime/common/crypto/x509-verify.cpp virtualbox-hwe-6.1.38-dfsg/src/VBox/Runtime/common/crypto/x509-verify.cpp --- virtualbox-hwe-6.1.34-dfsg/src/VBox/Runtime/common/crypto/x509-verify.cpp 2022-03-22 23:45:21.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/src/VBox/Runtime/common/crypto/x509-verify.cpp 2022-09-01 13:28:46.000000000 +0000 @@ -88,33 +88,15 @@ * that it's already in DER encoding and only does this if there the * encoded bits are missing. */ - if ( pThis->TbsCertificate.SeqCore.Asn1Core.uData.pu8 - && pThis->TbsCertificate.SeqCore.Asn1Core.cb > 0) - rc = RTCrPkixPubKeyVerifySignature(&pThis->SignatureAlgorithm.Algorithm, hPubKey, pParameters, &pThis->SignatureValue, - RTASN1CORE_GET_RAW_ASN1_PTR(&pThis->TbsCertificate.SeqCore.Asn1Core), - RTASN1CORE_GET_RAW_ASN1_SIZE(&pThis->TbsCertificate.SeqCore.Asn1Core), - pErrInfo); - else + const uint8_t *pbRaw; + uint32_t cbRaw; + void *pvFree = NULL; + rc = RTAsn1EncodeQueryRawBits(RTCrX509TbsCertificate_GetAsn1Core(&pThis->TbsCertificate), &pbRaw, &cbRaw, &pvFree, pErrInfo); + if (RT_SUCCESS(rc)) { - uint32_t cbEncoded; - rc = RTAsn1EncodePrepare((PRTASN1CORE)&pThis->TbsCertificate.SeqCore.Asn1Core, RTASN1ENCODE_F_DER, &cbEncoded, pErrInfo); - if (RT_SUCCESS(rc)) - { - void *pvTbsBits = RTMemTmpAlloc(cbEncoded); - if (pvTbsBits) - { - rc = RTAsn1EncodeToBuffer(&pThis->TbsCertificate.SeqCore.Asn1Core, RTASN1ENCODE_F_DER, - pvTbsBits, cbEncoded, pErrInfo); - if (RT_SUCCESS(rc)) - rc = RTCrPkixPubKeyVerifySignature(&pThis->SignatureAlgorithm.Algorithm, hPubKey, pParameters, - &pThis->SignatureValue, pvTbsBits, cbEncoded, pErrInfo); - else - AssertRC(rc); - RTMemTmpFree(pvTbsBits); - } - else - rc = VERR_NO_TMP_MEMORY; - } + rc = RTCrPkixPubKeyVerifySignature(&pThis->SignatureAlgorithm.Algorithm, hPubKey, pParameters, &pThis->SignatureValue, + pbRaw, cbRaw, pErrInfo); + RTMemTmpFree(pvFree); } /* Free the public key. */ diff -Nru virtualbox-hwe-6.1.34-dfsg/src/VBox/Runtime/common/fs/fatvfs.cpp virtualbox-hwe-6.1.38-dfsg/src/VBox/Runtime/common/fs/fatvfs.cpp --- virtualbox-hwe-6.1.34-dfsg/src/VBox/Runtime/common/fs/fatvfs.cpp 2022-03-22 23:45:21.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/src/VBox/Runtime/common/fs/fatvfs.cpp 2022-09-01 13:28:47.000000000 +0000 @@ -915,6 +915,7 @@ uint64_t off = UINT64_MAX; uint64_t offEdge = UINT64_MAX; RTSGSEG aSgSegs[8]; + RT_ZERO(aSgSegs); /* Shut up GCC. */ RTSGBUF SgBuf; RTSgBufInit(&SgBuf, aSgSegs, RT_ELEMENTS(aSgSegs)); SgBuf.cSegs = 0; /** @todo RTSgBuf API is stupid, make it smarter. */ diff -Nru virtualbox-hwe-6.1.34-dfsg/src/VBox/Runtime/common/ldr/ldrEx.cpp virtualbox-hwe-6.1.38-dfsg/src/VBox/Runtime/common/ldr/ldrEx.cpp --- virtualbox-hwe-6.1.34-dfsg/src/VBox/Runtime/common/ldr/ldrEx.cpp 2022-03-22 23:45:22.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/src/VBox/Runtime/common/ldr/ldrEx.cpp 2022-09-01 13:28:48.000000000 +0000 @@ -628,8 +628,14 @@ AssertReturn(cbBuf == sizeof(bool), VERR_INVALID_PARAMETER); break; case RTLDRPROP_PKCS7_SIGNED_DATA: + case RTLDRPROP_SHA1_PAGE_HASHES: + case RTLDRPROP_SHA256_PAGE_HASHES: *pcbRet = 0; break; + case RTLDRPROP_HASHABLE_PAGES: + *pcbRet = sizeof(uint32_t); + AssertReturn(cbBuf >= sizeof(uint32_t), VERR_INVALID_PARAMETER); + break; case RTLDRPROP_SIGNATURE_CHECKS_ENFORCED: *pcbRet = sizeof(bool); AssertReturn(cbBuf == sizeof(bool), VERR_INVALID_PARAMETER); @@ -688,7 +694,7 @@ RT_EXPORT_SYMBOL(RTLdrVerifySignature); -RTDECL(int) RTLdrHashImage(RTLDRMOD hLdrMod, RTDIGESTTYPE enmDigest, char *pszDigest, size_t cbDigest) +RTDECL(int) RTLdrHashImage(RTLDRMOD hLdrMod, RTDIGESTTYPE enmDigest, uint8_t *pabHash, size_t cbHash) { AssertMsgReturn(rtldrIsValid(hLdrMod), ("hLdrMod=%p\n", hLdrMod), VERR_INVALID_HANDLE); PRTLDRMODINTERNAL pMod = (PRTLDRMODINTERNAL)hLdrMod; @@ -699,23 +705,23 @@ */ switch (enmDigest) { - case RTDIGESTTYPE_MD5: AssertReturn(cbDigest >= RTMD5_DIGEST_LEN + 1, VERR_BUFFER_OVERFLOW); break; - case RTDIGESTTYPE_SHA1: AssertReturn(cbDigest >= RTSHA1_DIGEST_LEN + 1, VERR_BUFFER_OVERFLOW); break; - case RTDIGESTTYPE_SHA256: AssertReturn(cbDigest >= RTSHA256_DIGEST_LEN + 1, VERR_BUFFER_OVERFLOW); break; - case RTDIGESTTYPE_SHA512: AssertReturn(cbDigest >= RTSHA512_DIGEST_LEN + 1, VERR_BUFFER_OVERFLOW); break; + case RTDIGESTTYPE_MD5: AssertReturn(cbHash >= RTMD5_HASH_SIZE, VERR_BUFFER_OVERFLOW); break; + case RTDIGESTTYPE_SHA1: AssertReturn(cbHash >= RTSHA1_HASH_SIZE, VERR_BUFFER_OVERFLOW); break; + case RTDIGESTTYPE_SHA256: AssertReturn(cbHash >= RTSHA256_HASH_SIZE, VERR_BUFFER_OVERFLOW); break; + case RTDIGESTTYPE_SHA512: AssertReturn(cbHash >= RTSHA512_HASH_SIZE, VERR_BUFFER_OVERFLOW); break; default: if (enmDigest > RTDIGESTTYPE_INVALID && enmDigest < RTDIGESTTYPE_END) return VERR_NOT_SUPPORTED; AssertFailedReturn(VERR_INVALID_PARAMETER); } - AssertPtrReturn(pszDigest, VERR_INVALID_POINTER); + AssertPtrReturn(pabHash, VERR_INVALID_POINTER); /* * Call the image specific worker, if there is one. */ if (!pMod->pOps->pfnHashImage) return VERR_NOT_SUPPORTED; - return pMod->pOps->pfnHashImage(pMod, enmDigest, pszDigest, cbDigest); + return pMod->pOps->pfnHashImage(pMod, enmDigest, pabHash, cbHash); } RT_EXPORT_SYMBOL(RTLdrHashImage); diff -Nru virtualbox-hwe-6.1.34-dfsg/src/VBox/Runtime/common/ldr/ldrPE.cpp virtualbox-hwe-6.1.38-dfsg/src/VBox/Runtime/common/ldr/ldrPE.cpp --- virtualbox-hwe-6.1.34-dfsg/src/VBox/Runtime/common/ldr/ldrPE.cpp 2022-03-22 23:45:22.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/src/VBox/Runtime/common/ldr/ldrPE.cpp 2022-09-01 13:28:48.000000000 +0000 @@ -45,8 +45,10 @@ #include #include #include +#if !defined(IPRT_WITHOUT_LDR_VERIFY) || !defined(IPRT_WITHOUT_LDR_PAGE_HASHING) +# include +#endif #ifndef IPRT_WITHOUT_LDR_VERIFY -#include # include # include # include @@ -268,6 +270,10 @@ static void rtldrPEConvert32BitOptionalHeaderTo64Bit(PIMAGE_OPTIONAL_HEADER64 pOptHdr); static void rtldrPEConvert32BitLoadConfigTo64Bit(PIMAGE_LOAD_CONFIG_DIRECTORY64 pLoadCfg); static int rtldrPEApplyFixups(PRTLDRMODPE pModPe, const void *pvBitsR, void *pvBitsW, RTUINTPTR BaseAddress, RTUINTPTR OldBaseAddress); +#ifndef IPRT_WITHOUT_LDR_PAGE_HASHING +static int rtLdrPE_QueryPageHashes(PRTLDRMODPE pModPe, RTDIGESTTYPE enmDigest, void *pvBuf, size_t cbBuf, size_t *pcbRet); +static uint32_t rtLdrPE_GetHashablePages(PRTLDRMODPE pModPe); +#endif @@ -2071,6 +2077,19 @@ pModPe->offPkcs7SignedData); } +#ifndef IPRT_WITHOUT_LDR_PAGE_HASHING + case RTLDRPROP_HASHABLE_PAGES: + *pcbRet = sizeof(uint32_t); + *(uint32_t *)pvBuf = rtLdrPE_GetHashablePages(pModPe); + return VINF_SUCCESS; + + case RTLDRPROP_SHA1_PAGE_HASHES: + return rtLdrPE_QueryPageHashes(pModPe, RTDIGESTTYPE_SHA1, pvBuf, cbBuf, pcbRet); + + case RTLDRPROP_SHA256_PAGE_HASHES: + return rtLdrPE_QueryPageHashes(pModPe, RTDIGESTTYPE_SHA256, pvBuf, cbBuf, pcbRet); +#endif + case RTLDRPROP_SIGNATURE_CHECKS_ENFORCED: Assert(cbBuf == sizeof(bool)); Assert(*pcbRet == cbBuf); @@ -2197,7 +2216,6 @@ } -#ifndef IPRT_WITHOUT_LDR_VERIFY /** * Returns the digest size for the given digest type. * @@ -2215,7 +2233,6 @@ default: AssertReleaseFailedReturn(0); } } -#endif /** @@ -2387,6 +2404,239 @@ return VINF_SUCCESS; } +#ifndef IPRT_WITHOUT_LDR_PAGE_HASHING + +/** + * Returns the size of the page hashes, including the terminator entry. + * + * Used for handling RTLDRPROP_HASHABLE_PAGES. + * + * @returns Number of page hashes. + * @param pModPe The PE module. + */ +static uint32_t rtLdrPE_GetHashablePages(PRTLDRMODPE pModPe) +{ + uint32_t const cbPage = _4K; + uint32_t cPages = 1; /* termination entry */ + + /* Add implicit header section: */ + cPages += (pModPe->cbHeaders + cbPage - 1) / cbPage; + + /* Add on disk pages for each section. Each starts with a fresh page and + we ASSUMES that it is page aligned (in memory). */ + for (uint32_t i = 0; i < pModPe->cSections; i++) + { + uint32_t const cbRawData = pModPe->paSections[i].SizeOfRawData; + if (cbRawData > 0) + cPages += (cbRawData + cbPage - 1) / cbPage; + } + + return cPages; +} + + +/** + * Worker for rtLdrPE_QueryPageHashes. + * + * Keep in mind that rtldrPE_VerifyAllPageHashes does similar work, so some + * fixes may apply both places. + */ +static int rtLdrPE_CalcPageHashes(PRTLDRMODPE pModPe, RTDIGESTTYPE const enmDigest, uint32_t const cbHash, + uint8_t *pbDst, uint8_t *pbScratch, uint32_t cbScratch, uint32_t const cbPage) +{ + /* + * Calculate the special places. + */ + RTLDRPEHASHSPECIALS SpecialPlaces = { 0, 0, 0, 0, 0, 0 }; /* shut up gcc */ + int rc = rtldrPe_CalcSpecialHashPlaces(pModPe, &SpecialPlaces, NULL); + if (RT_FAILURE(rc)) + return rc; + + /* + * Walk section table and hash the pages in each. Because the headers are + * in an implicit section, the loop advancing is a little funky. + */ + int32_t const cSections = pModPe->cSections; + int32_t iSection = -1; + uint32_t offRawData = 0; + uint32_t cbRawData = pModPe->cbHeaders; + uint32_t offLastPage = 0; + + uint32_t const cbScratchReadMax = cbScratch / cbPage * cbPage; + uint32_t cbScratchRead = 0; + uint32_t offScratchRead = 0; + + for (;;) + { + /* + * Process the pages in this section. + */ + uint32_t cPagesInSection = (cbRawData + cbPage - 1) / cbPage; + for (uint32_t iPage = 0; iPage < cPagesInSection; iPage++) + { + uint32_t const offPageInSect = iPage * cbPage; + uint32_t const offPageInFile = offRawData + offPageInSect; + uint32_t const cbPageInFile = RT_MIN(cbPage, cbRawData - offPageInSect); + offLastPage = offPageInFile; + + /* Calculate and output the page offset. */ + *(uint32_t *)pbDst = offPageInFile; + pbDst += sizeof(uint32_t); + + /* + * Read/find in the raw page. + */ + /* Did we get a cache hit? */ + uint8_t *pbCur = pbScratch; + if ( offPageInFile + cbPageInFile <= offScratchRead + cbScratchRead + && offPageInFile >= offScratchRead) + pbCur += offPageInFile - offScratchRead; + /* Missed, read more. */ + else + { + offScratchRead = offPageInFile; + cbScratchRead = SpecialPlaces.cbToHash - offPageInFile; + if (cbScratchRead > cbScratchReadMax) + cbScratchRead = cbScratchReadMax; + rc = pModPe->Core.pReader->pfnRead(pModPe->Core.pReader, pbCur, cbScratchRead, offScratchRead); + if (RT_FAILURE(rc)) + return VERR_LDRVI_READ_ERROR_HASH; + } + + /* + * Hash it. + */ + RTLDRPEHASHCTXUNION HashCtx; + rc = rtLdrPE_HashInit(&HashCtx, enmDigest); + AssertRCReturn(rc, rc); + + /* Deal with special places. */ + uint32_t cbLeft = cbPageInFile; + if (offPageInFile < SpecialPlaces.offEndSpecial) + { + uint32_t off = offPageInFile; + if (off < SpecialPlaces.offCksum) + { + /* Hash everything up to the checksum. */ + uint32_t cbChunk = RT_MIN(SpecialPlaces.offCksum - off, cbLeft); + rtLdrPE_HashUpdate(&HashCtx, enmDigest, pbCur, cbChunk); + pbCur += cbChunk; + cbLeft -= cbChunk; + off += cbChunk; + } + + if (off < SpecialPlaces.offCksum + SpecialPlaces.cbCksum && off >= SpecialPlaces.offCksum) + { + /* Skip the checksum */ + uint32_t cbChunk = RT_MIN(SpecialPlaces.offCksum + SpecialPlaces.cbCksum - off, cbLeft); + pbCur += cbChunk; + cbLeft -= cbChunk; + off += cbChunk; + } + + if (off < SpecialPlaces.offSecDir && off >= SpecialPlaces.offCksum + SpecialPlaces.cbCksum) + { + /* Hash everything between the checksum and the data dir entry. */ + uint32_t cbChunk = RT_MIN(SpecialPlaces.offSecDir - off, cbLeft); + rtLdrPE_HashUpdate(&HashCtx, enmDigest, pbCur, cbChunk); + pbCur += cbChunk; + cbLeft -= cbChunk; + off += cbChunk; + } + + if (off < SpecialPlaces.offSecDir + SpecialPlaces.cbSecDir && off >= SpecialPlaces.offSecDir) + { + /* Skip the security data directory entry. */ + uint32_t cbChunk = RT_MIN(SpecialPlaces.offSecDir + SpecialPlaces.cbSecDir - off, cbLeft); + pbCur += cbChunk; + cbLeft -= cbChunk; + off += cbChunk; + } + } + + rtLdrPE_HashUpdate(&HashCtx, enmDigest, pbCur, cbLeft); + if (cbPageInFile < cbPage) + rtLdrPE_HashUpdate(&HashCtx, enmDigest, g_abRTZero4K, cbPage - cbPageInFile); + + /* + * Finish the hash calculation storing it in the table. + */ + rtLdrPE_HashFinalize(&HashCtx, enmDigest, (PRTLDRPEHASHRESUNION)pbDst); + pbDst += cbHash; + } + + /* + * Advance to the next section. + */ + iSection++; + if (iSection >= cSections) + break; + offRawData = pModPe->paSections[iSection].PointerToRawData; + cbRawData = pModPe->paSections[iSection].SizeOfRawData; + } + + /* + * Add the terminator entry. + */ + *(uint32_t *)pbDst = offLastPage + cbPage; + RT_BZERO(&pbDst[sizeof(uint32_t)], cbHash); + + return VINF_SUCCESS; +} + + +/** + * Creates the page hash table for the image. + * + * Used for handling RTLDRPROP_SHA1_PAGE_HASHES and + * RTLDRPROP_SHA256_PAGE_HASHES. + * + * @returns IPRT status code. + * @param pModPe The PE module. + * @param enmDigest The digest to use when hashing the pages. + * @param pvBuf Where to return the page hash table. + * @param cbBuf The size of the buffer @a pvBuf points to. + * @param pcbRet Where to return the output/needed size. + */ +static int rtLdrPE_QueryPageHashes(PRTLDRMODPE pModPe, RTDIGESTTYPE enmDigest, void *pvBuf, size_t cbBuf, size_t *pcbRet) +{ + /* + * Check that we've got enough buffer space. + */ + uint32_t const cbPage = _4K; + uint32_t const cEntries = rtLdrPE_GetHashablePages(pModPe); + uint32_t const cbHash = rtLdrPE_HashGetHashSize(enmDigest); + AssertReturn(cbHash > 0, VERR_INTERNAL_ERROR_3); + + size_t const cbNeeded = (size_t)(cbHash + 4) * cEntries; + *pcbRet = cbNeeded; + if (cbNeeded > cbBuf) + return VERR_BUFFER_OVERFLOW; + + /* + * Allocate a scratch buffer and call worker to do the real job. + */ +# ifdef IN_RING0 + uint32_t cbScratch = _256K - _4K; +# else + uint32_t cbScratch = _1M; +# endif + void *pvScratch = RTMemTmpAlloc(cbScratch); + if (!pvScratch) + { + cbScratch = _4K; + pvScratch = RTMemTmpAlloc(cbScratch); + if (!pvScratch) + return VERR_NO_TMP_MEMORY; + } + + int rc = rtLdrPE_CalcPageHashes(pModPe, enmDigest, cbHash, (uint8_t *)pvBuf, (uint8_t *)pvScratch, cbScratch, cbPage); + + RTMemTmpFree(pvScratch); + return rc; +} + +#endif /* !IPRT_WITHOUT_LDR_PAGE_HASHING */ #ifndef IPRT_WITHOUT_LDR_VERIFY /** @@ -2906,7 +3156,7 @@ rtLdrPE_HashUpdate(&HashCtx, enmDigest, pbCur, cbLeft); if (cbPageInFile < _4K) - rtLdrPE_HashUpdate(&HashCtx, enmDigest, &g_abRTZero4K[cbPageInFile], _4K - cbPageInFile); + rtLdrPE_HashUpdate(&HashCtx, enmDigest, g_abRTZero4K, _4K - cbPageInFile); /* * Finish the hash calculation and compare the result. @@ -3159,7 +3409,7 @@ /** * @interface_method_impl{RTLDROPS,pfnHashImage} */ -static DECLCALLBACK(int) rtldrPE_HashImage(PRTLDRMODINTERNAL pMod, RTDIGESTTYPE enmDigest, char *pszDigest, size_t cbDigest) +static DECLCALLBACK(int) rtldrPE_HashImage(PRTLDRMODINTERNAL pMod, RTDIGESTTYPE enmDigest, uint8_t *pabHash, size_t cbHash) { PRTLDRMODPE pModPe = (PRTLDRMODPE)pMod; @@ -3185,14 +3435,15 @@ if (RT_SUCCESS(rc)) { /* - * Format the digest into as human readable hash string. + * Copy out the result. */ + RT_NOREF(cbHash); /* verified by caller */ switch (enmDigest) { - case RTDIGESTTYPE_SHA512: rc = RTSha512ToString(HashRes.abSha512, pszDigest, cbDigest); break; - case RTDIGESTTYPE_SHA256: rc = RTSha256ToString(HashRes.abSha256, pszDigest, cbDigest); break; - case RTDIGESTTYPE_SHA1: rc = RTSha1ToString(HashRes.abSha1, pszDigest, cbDigest); break; - case RTDIGESTTYPE_MD5: rc = RTMd5ToString(HashRes.abMd5, pszDigest, cbDigest); break; + case RTDIGESTTYPE_SHA512: memcpy(pabHash, HashRes.abSha512, sizeof(HashRes.abSha512)); break; + case RTDIGESTTYPE_SHA256: memcpy(pabHash, HashRes.abSha256, sizeof(HashRes.abSha256)); break; + case RTDIGESTTYPE_SHA1: memcpy(pabHash, HashRes.abSha1, sizeof(HashRes.abSha1)); break; + case RTDIGESTTYPE_MD5: memcpy(pabHash, HashRes.abMd5, sizeof(HashRes.abMd5)); break; default: AssertFailedReturn(VERR_INTERNAL_ERROR_3); } } diff -Nru virtualbox-hwe-6.1.34-dfsg/src/VBox/Runtime/common/misc/json.cpp virtualbox-hwe-6.1.38-dfsg/src/VBox/Runtime/common/misc/json.cpp --- virtualbox-hwe-6.1.34-dfsg/src/VBox/Runtime/common/misc/json.cpp 2022-03-22 23:45:24.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/src/VBox/Runtime/common/misc/json.cpp 2022-09-01 13:28:50.000000000 +0000 @@ -142,7 +142,7 @@ * @param offInput Start offset from the start of the input stream to read from. * @param pvBuf Where to store the read data. * @param cbBuf How much to read. - * @param pcbRead Where to store the amount of data read on succcess. + * @param pcbRead Where to store the amount of data read on success. */ typedef DECLCALLBACK(int) FNRTJSONTOKENIZERREAD(void *pvUser, size_t offInput, void *pvBuf, size_t cbBuf, size_t *pcbRead); diff -Nru virtualbox-hwe-6.1.34-dfsg/src/VBox/Runtime/common/string/base64.cpp virtualbox-hwe-6.1.38-dfsg/src/VBox/Runtime/common/string/base64.cpp --- virtualbox-hwe-6.1.34-dfsg/src/VBox/Runtime/common/string/base64.cpp 2022-03-22 23:45:27.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/src/VBox/Runtime/common/string/base64.cpp 2022-09-01 13:28:52.000000000 +0000 @@ -82,6 +82,25 @@ /** Value to Base64 character. (RFC 2045) */ static const char g_szValToChar[64+1] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; +/** The end-of-line lengths (indexed by style flag value). */ +static const size_t g_acchEolStyles[RTBASE64_FLAGS_EOL_STYLE_MASK + 1] = +{ + /*[RTBASE64_FLAGS_EOL_NATIVE ]:*/ RTBASE64_EOL_SIZE, + /*[RTBASE64_FLAGS_NO_LINE_BREAKS]:*/ 0, + /*[RTBASE64_FLAGS_EOL_LF ]:*/ 1, + /*[RTBASE64_FLAGS_EOL_CRLF ]:*/ 2 +}; + +/** The end-of-line characters (zero, one or two). */ +static const char g_aachEolStyles[RTBASE64_FLAGS_EOL_STYLE_MASK + 1][2] = +{ + /*[RTBASE64_FLAGS_EOL_NATIVE ]:*/ { RTBASE64_EOL_SIZE == 1 ? '\n' : '\r', RTBASE64_EOL_SIZE == 1 ? '\0' : '\n', }, + /*[RTBASE64_FLAGS_NO_LINE_BREAKS]:*/ { '\0', '\0' }, + /*[RTBASE64_FLAGS_EOL_LF ]:*/ { '\n', '\0' }, + /*[RTBASE64_FLAGS_EOL_CRLF ]:*/ { '\r', '\n' }, +}; + + #ifdef RT_STRICT /** @@ -420,6 +439,8 @@ */ RTDECL(size_t) RTBase64EncodedLengthEx(size_t cbData, uint32_t fFlags) { + size_t const cchEol = g_acchEolStyles[fFlags & RTBASE64_FLAGS_EOL_STYLE_MASK]; + if (cbData * 8 / 8 != cbData) { AssertReturn(sizeof(size_t) == sizeof(uint64_t), ~(size_t)0); @@ -427,9 +448,7 @@ while (cch % 24) cch += 8; cch /= 6; - - if ((fFlags & RTBASE64_FLAGS_NO_LINE_BREAKS) == 0) /* add EOLs? */ - cch += ((cch - 1) / RTBASE64_LINE_LEN) * RTBASE64_EOL_SIZE; + cch += ((cch - 1) / RTBASE64_LINE_LEN) * cchEol; return cch; } @@ -437,9 +456,7 @@ while (cch % 24) cch += 8; cch /= 6; - - if ((fFlags & RTBASE64_FLAGS_NO_LINE_BREAKS) == 0) /* add EOLs? */ - cch += ((cch - 1) / RTBASE64_LINE_LEN) * RTBASE64_EOL_SIZE; + cch += ((cch - 1) / RTBASE64_LINE_LEN) * cchEol; return cch; } RT_EXPORT_SYMBOL(RTBase64EncodedLengthEx); @@ -485,6 +502,12 @@ RTDECL(int) RTBase64EncodeEx(const void *pvData, size_t cbData, uint32_t fFlags, char *pszBuf, size_t cbBuf, size_t *pcchActual) { + /* Expand the EOL style flags: */ + size_t const cchEol = g_acchEolStyles[fFlags & RTBASE64_FLAGS_EOL_STYLE_MASK]; + char const chEol0 = g_aachEolStyles[fFlags & RTBASE64_FLAGS_EOL_STYLE_MASK][0]; + char const chEol1 = g_aachEolStyles[fFlags & RTBASE64_FLAGS_EOL_STYLE_MASK][1]; + Assert(cchEol == (chEol0 != '\0' ? 1U : 0U) + (chEol1 != '\0' ? 1U : 0U)); + /* * Process whole "trios" of input data. */ @@ -514,17 +537,17 @@ cbData -= 3; pbSrc += 3; - if ((fFlags & RTBASE64_FLAGS_NO_LINE_BREAKS) == 0) /* add EOLs? */ + if (cchEol > 0) { /* deal out end-of-line */ if (cbBuf == cbLineFeed && cbData) { - if (cbBuf < RTBASE64_EOL_SIZE + 1) + if (cbBuf < cchEol + 1) return VERR_BUFFER_OVERFLOW; - cbBuf -= RTBASE64_EOL_SIZE; - if (RTBASE64_EOL_SIZE == 2) - *pchDst++ = '\r'; - *pchDst++ = '\n'; + cbBuf -= cchEol; + *pchDst++ = chEol0; + if (chEol1) + *pchDst++ = chEol1; cbLineFeed = cbBuf - RTBASE64_LINE_LEN; } } diff -Nru virtualbox-hwe-6.1.34-dfsg/src/VBox/Runtime/common/string/ministring.cpp virtualbox-hwe-6.1.38-dfsg/src/VBox/Runtime/common/string/ministring.cpp --- virtualbox-hwe-6.1.34-dfsg/src/VBox/Runtime/common/string/ministring.cpp 2022-03-22 23:45:27.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/src/VBox/Runtime/common/string/ministring.cpp 2022-09-01 13:28:53.000000000 +0000 @@ -674,6 +674,39 @@ return replaceWorkerNoThrow(offStart, cchLength, pszReplacement, strlen(pszReplacement)); } +RTCString &RTCString::truncate(size_t cchMax) RT_NOEXCEPT +{ + if (cchMax < m_cch) + { + /* + * Make sure the truncated string ends with a correctly encoded + * codepoint and is not missing a few bytes. + */ + if (cchMax > 0) + { + char chTail = m_psz[cchMax]; + if ( (chTail & 0x80) == 0 /* single byte codepoint */ + || (chTail & 0xc0) == 0xc0) /* first byte of codepoint sequence. */ + { /* likely */ } + else + { + /* We need to find the start of the codepoint sequence: */ + do + cchMax -= 1; + while ( cchMax > 0 + && (m_psz[cchMax] & 0xc0) != 0xc0); + } + } + + /* + * Do the truncating. + */ + m_psz[cchMax] = '\0'; + m_cch = cchMax; + } + return *this; +} + RTCString &RTCString::replace(size_t offStart, size_t cchLength, const char *pszReplacement, size_t cchReplacement) { return replaceWorker(offStart, cchLength, pszReplacement, RTStrNLen(pszReplacement, cchReplacement)); diff -Nru virtualbox-hwe-6.1.34-dfsg/src/VBox/Runtime/common/string/RTStrIStartsWith.cpp virtualbox-hwe-6.1.38-dfsg/src/VBox/Runtime/common/string/RTStrIStartsWith.cpp --- virtualbox-hwe-6.1.34-dfsg/src/VBox/Runtime/common/string/RTStrIStartsWith.cpp 2022-03-22 23:45:26.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/src/VBox/Runtime/common/string/RTStrIStartsWith.cpp 2022-09-01 13:28:52.000000000 +0000 @@ -37,12 +37,9 @@ { if (pszString) { - if (*pszString == *pszStart) - { - size_t cchStart = strlen(pszStart); - if (RTStrNICmp(pszString, pszStart, cchStart) == 0) - return true; - } + size_t cchStart = strlen(pszStart); + if (RTStrNICmp(pszString, pszStart, cchStart) == 0) + return true; } return false; } diff -Nru virtualbox-hwe-6.1.34-dfsg/src/VBox/Runtime/common/vfs/vfsprintf.cpp virtualbox-hwe-6.1.38-dfsg/src/VBox/Runtime/common/vfs/vfsprintf.cpp --- virtualbox-hwe-6.1.34-dfsg/src/VBox/Runtime/common/vfs/vfsprintf.cpp 1970-01-01 00:00:00.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/src/VBox/Runtime/common/vfs/vfsprintf.cpp 2022-09-01 13:28:55.000000000 +0000 @@ -0,0 +1,155 @@ +/* $Id: vfsprintf.cpp $ */ +/** @file + * IPRT - Virtual File System, File Printf. + */ + +/* + * Copyright (C) 2010-2020 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 + +#include +#include + + +/** Writes the buffer to the VFS file. */ +static void FlushPrintfBuffer(PVFSIOSTRMOUTBUF pBuf) +{ + if (pBuf->offBuf) + { + int rc = RTVfsIoStrmWrite(pBuf->hVfsIos, pBuf->szBuf, pBuf->offBuf, true /*fBlocking*/, NULL); + if (RT_FAILURE(rc)) + pBuf->rc = rc; + pBuf->offBuf = 0; + pBuf->szBuf[0] = '\0'; + } +} + + +/** + * @callback_method_impl{FNRTSTROUTPUT, + * For use with VFSIOSTRMOUTBUF.} + */ +RTDECL(size_t) RTVfsIoStrmStrOutputCallback(void *pvArg, const char *pachChars, size_t cbChars) +{ + PVFSIOSTRMOUTBUF pBuf = (PVFSIOSTRMOUTBUF)pvArg; + AssertReturn(pBuf->cbSelf == sizeof(*pBuf), 0); + + if (cbChars != 0) + { + if (cbChars <= sizeof(pBuf->szBuf) * 3 / 2) + { + /* + * Small piece of output: Buffer it. + */ + size_t offSrc = 0; + while (offSrc < cbChars) + { + size_t cbLeft = sizeof(pBuf->szBuf) - pBuf->offBuf - 1; + if (cbLeft > 0) + { + size_t cbToCopy = RT_MIN(cbChars - offSrc, cbLeft); + memcpy(&pBuf->szBuf[pBuf->offBuf], &pachChars[offSrc], cbToCopy); + pBuf->offBuf += cbToCopy; + pBuf->szBuf[pBuf->offBuf] = '\0'; + if (cbLeft > cbToCopy) + break; + offSrc += cbToCopy; + } + FlushPrintfBuffer(pBuf); + } + } + else + { + /* + * Large chunk of output: Output it directly. + */ + FlushPrintfBuffer(pBuf); + + int rc = RTVfsIoStrmWrite(pBuf->hVfsIos, pachChars, cbChars, true /*fBlocking*/, NULL); + if (RT_FAILURE(rc)) + pBuf->rc = rc; + } + } + else /* Special zero byte write at the end of the formatting. */ + FlushPrintfBuffer(pBuf); + return cbChars; +} + + +RTDECL(ssize_t) RTVfsIoStrmPrintfV(RTVFSIOSTREAM hVfsIos, const char *pszFormat, va_list va) +{ + VFSIOSTRMOUTBUF Buf; + VFSIOSTRMOUTBUF_INIT(&Buf, hVfsIos); + + size_t cchRet = RTStrFormatV(RTVfsIoStrmStrOutputCallback, &Buf, NULL, NULL, pszFormat, va); + if (RT_SUCCESS(Buf.rc)) + return cchRet; + return Buf.rc; +} + + +RTDECL(ssize_t) RTVfsIoStrmPrintf(RTVFSIOSTREAM hVfsIos, const char *pszFormat, ...) +{ + va_list va; + va_start(va, pszFormat); + ssize_t cchRet = RTVfsIoStrmPrintfV(hVfsIos, pszFormat, va); + va_end(va); + return cchRet; +} + + +RTDECL(ssize_t) RTVfsFilePrintfV(RTVFSFILE hVfsFile, const char *pszFormat, va_list va) +{ + ssize_t cchRet; + RTVFSIOSTREAM hVfsIos = RTVfsFileToIoStream(hVfsFile); + if (hVfsIos != NIL_RTVFSIOSTREAM) + { + cchRet = RTVfsIoStrmPrintfV(hVfsIos, pszFormat, va); + RTVfsIoStrmRelease(hVfsIos); + } + else + cchRet = VERR_INVALID_HANDLE; + return cchRet; +} + + +RTDECL(ssize_t) RTVfsFilePrintf(RTVFSFILE hVfsFile, const char *pszFormat, ...) +{ + ssize_t cchRet; + RTVFSIOSTREAM hVfsIos = RTVfsFileToIoStream(hVfsFile); + if (hVfsIos != NIL_RTVFSIOSTREAM) + { + va_list va; + va_start(va, pszFormat); + cchRet = RTVfsIoStrmPrintfV(hVfsIos, pszFormat, va); + va_end(va); + RTVfsIoStrmRelease(hVfsIos); + } + else + cchRet = VERR_INVALID_HANDLE; + return cchRet; +} + diff -Nru virtualbox-hwe-6.1.34-dfsg/src/VBox/Runtime/include/internal/iprt-openssl.h virtualbox-hwe-6.1.38-dfsg/src/VBox/Runtime/include/internal/iprt-openssl.h --- virtualbox-hwe-6.1.34-dfsg/src/VBox/Runtime/include/internal/iprt-openssl.h 2022-03-22 23:45:33.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/src/VBox/Runtime/include/internal/iprt-openssl.h 2022-09-01 13:28:58.000000000 +0000 @@ -31,6 +31,7 @@ #endif #include +#include RT_C_DECLS_BEGIN struct evp_md_st; @@ -38,10 +39,16 @@ DECLHIDDEN(void) rtCrOpenSslInit(void); DECLHIDDEN(int) rtCrOpenSslErrInfoCallback(const char *pach, size_t cch, void *pvUser); -DECLHIDDEN(int) rtCrOpenSslAddX509CertToStack(void *pvOsslStack, PCRTCRX509CERTIFICATE pCert); - -DECLHIDDEN(int) rtCrKeyToOpenSslKey(RTCRKEY hKey, bool fNeedPublic, const char *pszAlgoObjId, - void /*EVP_PKEY*/ **ppEvpKey, const void /*EVP_MD*/ **ppEvpMdType, PRTERRINFO pErrInfo); +DECLHIDDEN(int) rtCrOpenSslConvertX509Cert(void **ppvOsslCert, PCRTCRX509CERTIFICATE pCert, PRTERRINFO pErrInfo); +DECLHIDDEN(void) rtCrOpenSslFreeConvertedX509Cert(void *pvOsslCert); +DECLHIDDEN(int) rtCrOpenSslAddX509CertToStack(void *pvOsslStack, PCRTCRX509CERTIFICATE pCert, PRTERRINFO pErrInfo); +DECLHIDDEN(const void /*EVP_MD*/ *) rtCrOpenSslConvertDigestType(RTDIGESTTYPE enmDigestType, PRTERRINFO pErrInfo); +DECLHIDDEN(int) rtCrOpenSslConvertPkcs7Attribute(void **ppvOsslAttrib, PCRTCRPKCS7ATTRIBUTE pAttrib, PRTERRINFO pErrInfo); +DECLHIDDEN(void) rtCrOpenSslFreeConvertedPkcs7Attribute(void *pvOsslAttrib); + +DECLHIDDEN(int) rtCrKeyToOpenSslKey(RTCRKEY hKey, bool fNeedPublic, void /*EVP_PKEY*/ **ppEvpKey, PRTERRINFO pErrInfo); +DECLHIDDEN(int) rtCrKeyToOpenSslKeyEx(RTCRKEY hKey, bool fNeedPublic, const char *pszAlgoObjId, + void /*EVP_PKEY*/ **ppEvpKey, const void /*EVP_MD*/ **ppEvpMdType, PRTERRINFO pErrInfo); RT_C_DECLS_END diff -Nru virtualbox-hwe-6.1.34-dfsg/src/VBox/Runtime/include/internal/ldr.h virtualbox-hwe-6.1.38-dfsg/src/VBox/Runtime/include/internal/ldr.h --- virtualbox-hwe-6.1.34-dfsg/src/VBox/Runtime/include/internal/ldr.h 2022-03-22 23:45:33.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/src/VBox/Runtime/include/internal/ldr.h 2022-09-01 13:28:58.000000000 +0000 @@ -509,10 +509,11 @@ * @returns IPRT status code. * @param pMod The module handle. * @param enmDigest Which kind of digest. - * @param pszDigest Where to store the image digest. - * @param cbDigest Size of the buffer @a pszDigest points at. + * @param pabHash Where to store the image hash. + * @param cbHash Size of the buffer @a pabHash points at. This has + * been validated to be at least the required size. */ - DECLCALLBACKMEMBER(int, pfnHashImage)(PRTLDRMODINTERNAL pMod, RTDIGESTTYPE enmDigest, char *pszDigest, size_t cbDigest); + DECLCALLBACKMEMBER(int, pfnHashImage)(PRTLDRMODINTERNAL pMod, RTDIGESTTYPE enmDigest, uint8_t *pabHash, size_t cbHash); /** * Try use unwind information to unwind one frame. diff -Nru virtualbox-hwe-6.1.34-dfsg/src/VBox/Runtime/Makefile.kmk virtualbox-hwe-6.1.38-dfsg/src/VBox/Runtime/Makefile.kmk --- virtualbox-hwe-6.1.34-dfsg/src/VBox/Runtime/Makefile.kmk 2022-03-22 23:45:15.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/src/VBox/Runtime/Makefile.kmk 2022-09-01 13:28:41.000000000 +0000 @@ -295,6 +295,9 @@ ifdef IPRT_WITH_FUTEX_BASED_SEMS RuntimeR3_DEFS.linux += IPRT_WITH_FUTEX_BASED_SEMS endif +ifdef IPRT_WITHOUT_PAM + RuntimeR3_DEFS += IPRT_WITHOUT_PAM +endif RuntimeR3_INCS = \ include \ $(SDK_VBOX_ZLIB_INCS) \ @@ -347,6 +350,7 @@ common/checksum/alt-sha1.cpp \ common/checksum/alt-sha256.cpp \ common/checksum/alt-sha512.cpp \ + common/checksum/alt-sha3.cpp \ common/checksum/md2str.cpp \ common/checksum/md4str.cpp \ common/checksum/md5str.cpp \ @@ -379,11 +383,14 @@ common/crypto/rsa-core.cpp \ common/crypto/rsa-init.cpp \ common/crypto/rsa-sanity.cpp \ - common/crypto/pemfile.cpp \ + common/crypto/pemfile-read.cpp \ + common/crypto/pemfile-write.cpp \ common/crypto/pkcs7-asn1-decoder.cpp \ common/crypto/pkcs7-core.cpp \ + common/crypto/pkcs7-file.cpp \ common/crypto/pkcs7-init.cpp \ common/crypto/pkcs7-sanity.cpp \ + common/crypto/pkcs7-sign.cpp \ common/crypto/pkcs7-verify.cpp \ common/crypto/pkix-sign.cpp \ common/crypto/pkix-signature-builtin.cpp \ @@ -665,6 +672,7 @@ common/vfs/vfsstddir.cpp \ common/vfs/vfsstdfile.cpp \ common/vfs/vfsstdpipe.cpp \ + common/vfs/vfsprintf.cpp \ common/zip/tar.cpp \ common/zip/tarcmd.cpp \ common/zip/tarvfs.cpp \ @@ -913,6 +921,7 @@ r3/win/serialport-win.cpp \ r3/win/shmem-win.cpp \ r3/win/symlink-win.cpp \ + r3/win/system-get-nt-xxx-win.cpp \ r3/win/thread-win.cpp \ r3/win/thread2-win.cpp \ $(if-expr 1,r3/win/time-win.cpp,r3/nt/time-nt.cpp) \ @@ -1659,7 +1668,7 @@ common/checksum/sha256str.cpp \ common/checksum/sha512str.cpp \ common/crypto/digest-core.cpp \ - common/crypto/pemfile.cpp \ + common/crypto/pemfile-read.cpp \ common/crypto/pkcs7-asn1-decoder.cpp \ common/crypto/pkcs7-core.cpp \ common/crypto/pkcs7-init.cpp \ @@ -1976,6 +1985,7 @@ r3/win/semeventmulti-win.cpp \ r3/win/semmutex-win.cpp \ r3/win/symlink-win.cpp \ + r3/win/system-get-nt-xxx-win.cpp \ r3/win/thread-win.cpp \ r3/win/thread2-win.cpp \ $(if-expr 1,r3/win/time-win.cpp,r3/nt/time-nt.cpp) \ @@ -2953,6 +2963,7 @@ common/checksum/alt-sha1.cpp \ common/checksum/alt-sha256.cpp \ common/checksum/alt-sha512.cpp \ + common/checksum/alt-sha3.cpp \ common/checksum/md2str.cpp \ common/checksum/md4str.cpp \ common/checksum/md5str.cpp \ @@ -3103,6 +3114,7 @@ common/checksum/alt-sha1.cpp \ common/checksum/alt-sha256.cpp \ common/checksum/alt-sha512.cpp \ + common/checksum/alt-sha3.cpp \ common/checksum/md2str.cpp \ common/checksum/md4str.cpp \ common/checksum/md5str.cpp \ @@ -3120,6 +3132,7 @@ common/string/memchr.asm \ common/string/mempcpy.asm \ common/string/strpbrk.cpp \ + common/string/strstrip.cpp \ common/string/RTStrPrintHexBytes.cpp \ darwin/RTErrConvertFromDarwin.cpp \ darwin/RTErrConvertFromDarwinIO.cpp \ diff -Nru virtualbox-hwe-6.1.34-dfsg/src/VBox/Runtime/r0drv/linux/the-linux-kernel.h virtualbox-hwe-6.1.38-dfsg/src/VBox/Runtime/r0drv/linux/the-linux-kernel.h --- virtualbox-hwe-6.1.34-dfsg/src/VBox/Runtime/r0drv/linux/the-linux-kernel.h 2022-03-22 23:45:35.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/src/VBox/Runtime/r0drv/linux/the-linux-kernel.h 2022-09-01 13:29:01.000000000 +0000 @@ -184,6 +184,11 @@ # include #endif +/* for kernel_fpu_begin / kernel_fpu_end() */ +#if RTLNX_VER_MIN(4,2,0) +# include +#endif + #if RTLNX_VER_MIN(3,7,0) # include #else diff -Nru virtualbox-hwe-6.1.34-dfsg/src/VBox/Runtime/r0drv/nt/initterm-r0drv-nt.cpp virtualbox-hwe-6.1.38-dfsg/src/VBox/Runtime/r0drv/nt/initterm-r0drv-nt.cpp --- virtualbox-hwe-6.1.34-dfsg/src/VBox/Runtime/r0drv/nt/initterm-r0drv-nt.cpp 2022-03-22 23:45:36.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/src/VBox/Runtime/r0drv/nt/initterm-r0drv-nt.cpp 2022-09-01 13:29:02.000000000 +0000 @@ -251,7 +251,7 @@ } /* - * Got a match, update the global variables and report succcess. + * Got a match, update the global variables and report success. */ g_offrtNtPbQuantumEnd = pSet->KPRCB.offQuantumEnd; g_cbrtNtPbQuantumEnd = pSet->KPRCB.cbQuantumEnd; diff -Nru virtualbox-hwe-6.1.34-dfsg/src/VBox/Runtime/r3/path.cpp virtualbox-hwe-6.1.38-dfsg/src/VBox/Runtime/r3/path.cpp --- virtualbox-hwe-6.1.34-dfsg/src/VBox/Runtime/r3/path.cpp 2022-03-22 23:45:40.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/src/VBox/Runtime/r3/path.cpp 2022-09-01 13:29:05.000000000 +0000 @@ -149,14 +149,7 @@ { "IPRT_TMPDIR" #if defined(RT_OS_WINDOWS) - /* - * Make sure that %LOCALAPPDATA% is preferred over %TMP% / %TEMP%, as those can point - * to generic / old-school temp directories like "C:\WINDOWS\TEMP", which also is writable for unprivileged users - * under some circumstances. - * - * See @bugref{10201} - */ - , "LOCALAPPDATA", "TMP", "TEMP", "USERPROFILE" + , "TMP", "TEMP", "USERPROFILE" #elif defined(RT_OS_OS2) , "TMP", "TEMP", "TMPDIR" #else diff -Nru virtualbox-hwe-6.1.34-dfsg/src/VBox/Runtime/r3/posix/process-creation-posix.cpp virtualbox-hwe-6.1.38-dfsg/src/VBox/Runtime/r3/posix/process-creation-posix.cpp --- virtualbox-hwe-6.1.34-dfsg/src/VBox/Runtime/r3/posix/process-creation-posix.cpp 2022-03-22 23:45:40.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/src/VBox/Runtime/r3/posix/process-creation-posix.cpp 2022-09-01 13:29:06.000000000 +0000 @@ -68,6 +68,9 @@ #if defined(RT_OS_LINUX) || defined(RT_OS_SOLARIS) # include #endif +#if defined(RT_OS_DARWIN) +# include /* for newlocale() */ +#endif #if defined(RT_OS_LINUX) || defined(RT_OS_OS2) /* While Solaris has posix_spawn() of course we don't want to use it as @@ -85,6 +88,7 @@ #endif #if !defined(IPRT_USE_PAM) \ + && !defined(IPRT_WITHOUT_PAM) \ && ( defined(RT_OS_DARWIN) || defined(RT_OS_FREEBSD) || defined(RT_OS_LINUX) || defined(RT_OS_NETBSD) || defined(RT_OS_OPENBSD) ) # define IPRT_USE_PAM #endif @@ -364,48 +368,62 @@ rc = pam_set_item(hPam, PAM_RUSER, pszUser); if (rc == PAM_SUCCESS) { - if (pfMayFallBack) - *pfMayFallBack = false; - rc = pam_authenticate(hPam, 0); + /* We also need to set PAM_TTY (if available) to make PAM stacks work which + * require a secure TTY via pam_securetty (Debian 10 + 11, for example). See @bugref{10225}. */ + char const *pszTTY = RTEnvGet("DISPLAY"); + if (!pszTTY) /* No display set or available? Try the TTY's name instead. */ + pszTTY = ttyname(0); + if (pszTTY) /* Only try using PAM_TTY if we have something to set. */ + rc = pam_set_item(hPam, PAM_TTY, pszTTY); if (rc == PAM_SUCCESS) { - rc = pam_acct_mgmt(hPam, 0); - if ( rc == PAM_SUCCESS - || rc == PAM_AUTHINFO_UNAVAIL /*??*/) + /* From this point on we don't allow falling back to other auth methods. */ + if (pfMayFallBack) + *pfMayFallBack = false; + + rc = pam_authenticate(hPam, 0); + if (rc == PAM_SUCCESS) { - if ( ppapszEnv - && s_pfnPamGetEnvList - && s_pfnPamSetCred) + rc = pam_acct_mgmt(hPam, 0); + if ( rc == PAM_SUCCESS + || rc == PAM_AUTHINFO_UNAVAIL /*??*/) { - /* pam_env.so creates the environment when pam_setcred is called,. */ - int rcSetCred = pam_setcred(hPam, PAM_ESTABLISH_CRED | PAM_SILENT); - /** @todo check pam_setcred status code? */ - - /* Unless it does it during session opening (Ubuntu 21.10). This - unfortunately means we might mount user dir and other crap: */ - /** @todo do session handling properly */ - int rcOpenSession = PAM_ABORT; - if ( s_pfnPamOpenSession - && s_pfnPamCloseSession) - rcOpenSession = pam_open_session(hPam, PAM_SILENT); - - *ppapszEnv = pam_getenvlist(hPam); - LogFlowFunc(("pam_getenvlist -> %p ([0]=%p); rcSetCred=%d rcOpenSession=%d\n", - *ppapszEnv, *ppapszEnv ? **ppapszEnv : NULL, rcSetCred, rcOpenSession)); RT_NOREF(rcSetCred); - - if (rcOpenSession == PAM_SUCCESS) - pam_close_session(hPam, PAM_SILENT); - pam_setcred(hPam, PAM_DELETE_CRED); - } + if ( ppapszEnv + && s_pfnPamGetEnvList + && s_pfnPamSetCred) + { + /* pam_env.so creates the environment when pam_setcred is called,. */ + int rcSetCred = pam_setcred(hPam, PAM_ESTABLISH_CRED | PAM_SILENT); + /** @todo check pam_setcred status code? */ + + /* Unless it does it during session opening (Ubuntu 21.10). This + unfortunately means we might mount user dir and other crap: */ + /** @todo do session handling properly */ + int rcOpenSession = PAM_ABORT; + if ( s_pfnPamOpenSession + && s_pfnPamCloseSession) + rcOpenSession = pam_open_session(hPam, PAM_SILENT); + + *ppapszEnv = pam_getenvlist(hPam); + LogFlowFunc(("pam_getenvlist -> %p ([0]=%p); rcSetCred=%d rcOpenSession=%d\n", + *ppapszEnv, *ppapszEnv ? **ppapszEnv : NULL, rcSetCred, rcOpenSession)); RT_NOREF(rcSetCred); + + if (rcOpenSession == PAM_SUCCESS) + pam_close_session(hPam, PAM_SILENT); + pam_setcred(hPam, PAM_DELETE_CRED); + } - pam_end(hPam, PAM_SUCCESS); - LogFlowFunc(("pam auth (for %s) successful\n", pszPamService)); - return VINF_SUCCESS; + pam_end(hPam, PAM_SUCCESS); + LogFlowFunc(("pam auth (for %s) successful\n", pszPamService)); + return VINF_SUCCESS; + } + LogFunc(("pam_acct_mgmt -> %d\n", rc)); } - LogFunc(("pam_acct_mgmt -> %d\n", rc)); + else + LogFunc(("pam_authenticate -> %d\n", rc)); } else - LogFunc(("pam_authenticate -> %d\n", rc)); + LogFunc(("pam_setitem/PAM_TTY -> %d\n", rc)); } else LogFunc(("pam_set_item/PAM_RUSER -> %d\n", rc)); @@ -1394,56 +1412,95 @@ } else { - /* LC_ALL overrides everything else.*/ - /** @todo I don't recall now if this can do LC_XXX= inside it's value, like - * what setlocale returns on some systems. It's been 15-16 years - * since I last worked on an setlocale implementation... */ + /* + * LC_ALL overrides everything else. The LC_* environment variables are often set + * to the empty string so move on the next variable if that is the case. + */ const char *pszVar; int rc = RTEnvGetEx(hEnvToUse, pszVar = "LC_ALL", szEncoding, sizeof(szEncoding), NULL); - if (rc == VERR_ENV_VAR_NOT_FOUND) + if (rc == VERR_ENV_VAR_NOT_FOUND || (RT_SUCCESS(rc) && !*szEncoding)) rc = RTEnvGetEx(hEnvToUse, pszVar = "LC_CTYPE", szEncoding, sizeof(szEncoding), NULL); - if (rc == VERR_ENV_VAR_NOT_FOUND) + if (rc == VERR_ENV_VAR_NOT_FOUND || (RT_SUCCESS(rc) && !*szEncoding)) rc = RTEnvGetEx(hEnvToUse, pszVar = "LANG", szEncoding, sizeof(szEncoding), NULL); - if (RT_SUCCESS(rc)) + if (RT_SUCCESS(rc) && *szEncoding) { - const char *pszDot = strchr(szEncoding, '.'); - if (pszDot) - pszDot = RTStrStripL(pszDot + 1); - if (pszDot && *pszDot) + /* + * LC_ALL can contain a composite locale consisting of the locales of each of the + * categories in two different formats depending on the OS. On Solaris, macOS, and + * *BSD composite locale names use slash ('/') as the separator and the following + * order for the categories: + * LC_CTYPE/LC_NUMERIC/LC_TIME/LC_COLLATE/LC_MONETARY/LC_MESSAGES + * e.g.: + * en_US.UTF-8/POSIX/el_GR.UTF-8/el_CY.UTF-8/en_GB.UTF-8/es_ES.UTF-8 + * N.B. On Solaris there is also a leading slash. + * On Linux the composite locale format is made up of key-value pairs of category + * names and locales of the form 'name=value' with each element separated by a + * semicolon in the same order as above with following additional categories + * included as well: + * LC_PAPER/LC_NAME/LC_ADDRESS/LC_TELEPHONE/LC_MEASUREMENT/LC_IDENTIFICATION + * e.g. + * LC_CTYPE=fr_BE;LC_NUMERIC=fr_BE@euro;LC_TIME=fr_BE.utf8;LC_COLLATE=fr_CA;\ + * LC_MONETARY=fr_CA.utf8;LC_MESSAGES=fr_CH;LC_PAPER=fr_CH.utf8;LC_NAME=fr_FR;\ + * LC_ADDRESS=fr_FR.utf8;LC_TELEPHONE=fr_LU;LC_MEASUREMENT=fr_LU@euro;\ + * LC_IDENTIFICATION=fr_LU.utf8 + */ +#if !defined(RT_OS_LINUX) +# if defined(RT_OS_SOLARIS) + if (RTPATH_IS_SLASH(*szEncoding)) + (void) memmove(szEncoding, szEncoding + 1, strlen(szEncoding)); +# endif + char *pszSlash = strchr(szEncoding, '/'); + if (pszSlash) + *pszSlash = '\0'; +#else + char *pszSemicolon = strchr(szEncoding, ';'); + if (pszSemicolon) { - pszEncoding = pszDot; - Log2Func(("%s=%s -> %s (simple)\n", pszVar, szEncoding, pszEncoding)); + *pszSemicolon = '\0'; + size_t cchPrefix = strlen("LC_CTYPE="); + if (!RTStrNCmp(szEncoding, "LC_CTYPE=", cchPrefix)) + (void) memmove(szEncoding, szEncoding + cchPrefix, strlen(szEncoding)); } - else - { - /* No charset is given, so the default of the locale should be - used. To get at that we have to use newlocale and nl_langinfo_l, - which is there since ancient days on linux but no necessarily else - where. */ +#endif + /* + * Use newlocale and nl_langinfo_l to determine the default codeset for the locale + * specified in the child's environment. These routines have been around since + * ancient days on Linux and for quite a long time on macOS, Solaris, and *BSD but + * to ensure their availability check that LC_CTYPE_MASK is defined. + */ #ifdef LC_CTYPE_MASK - locale_t hLocale = newlocale(LC_CTYPE_MASK, szEncoding, (locale_t)0); - if (hLocale != (locale_t)0) - { - const char *pszCodeset = nl_langinfo_l(CODESET, hLocale); - Log2Func(("nl_langinfo_l(CODESET, %s=%s) -> %s\n", pszVar, szEncoding, pszCodeset)); - Assert(pszCodeset && *pszCodeset != '\0'); + locale_t hLocale = newlocale(LC_CTYPE_MASK, szEncoding, (locale_t)0); + if (hLocale != (locale_t)0) + { + const char *pszCodeset = nl_langinfo_l(CODESET, hLocale); +# ifdef RT_OS_DARWIN + /* + * The macOS nl_langinfo(3)/nl_langinfo_l(3) routines return a pointer to an + * empty string for "short" locale names like en_NZ, it_IT, el_GR, etc. so + * fallback to UTF-8 in those cases which is the default for short name locales + * on macOS anyhow. + */ + if (pszCodeset && !*pszCodeset) + pszCodeset = "UTF-8"; +# endif + Log2Func(("nl_langinfo_l(CODESET, %s=%s) -> %s\n", pszVar, szEncoding, pszCodeset)); + Assert(pszCodeset && *pszCodeset != '\0'); - rc = RTStrCopy(szEncoding, sizeof(szEncoding), pszCodeset); - AssertRC(rc); /* cannot possibly overflow */ + rc = RTStrCopy(szEncoding, sizeof(szEncoding), pszCodeset); + AssertRC(rc); /* cannot possibly overflow */ - freelocale(hLocale); - pszEncoding = szEncoding; - } - else + freelocale(hLocale); + pszEncoding = szEncoding; + } + else #endif - { - /* This is mostly wrong, but I cannot think of anything better now: */ - pszEncoding = rtStrGetLocaleCodeset(); - LogFunc(("No newlocale or it failed (on '%s=%s', errno=%d), falling back on %s that we're using...\n", - pszVar, szEncoding, errno, pszEncoding)); - } - } - RT_NOREF_PV(pszVar); + { + /* This is mostly wrong, but I cannot think of anything better now: */ + pszEncoding = rtStrGetLocaleCodeset(); + LogFunc(("No newlocale or it failed (on '%s=%s', errno=%d), falling back on %s that we're using...\n", + pszVar, szEncoding, errno, pszEncoding)); + } + RT_NOREF_PV(pszVar); } else #ifdef RT_OS_DARWIN /* @bugref{10153}: Darwin defaults to UTF-8. */ diff -Nru virtualbox-hwe-6.1.34-dfsg/src/VBox/Runtime/r3/stream.cpp virtualbox-hwe-6.1.38-dfsg/src/VBox/Runtime/r3/stream.cpp --- virtualbox-hwe-6.1.34-dfsg/src/VBox/Runtime/r3/stream.cpp 2022-03-22 23:45:41.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/src/VBox/Runtime/r3/stream.cpp 2022-09-01 13:29:07.000000000 +0000 @@ -44,6 +44,7 @@ #include #include #include +#include #include #include #include @@ -99,6 +100,22 @@ } RTSTREAM; +/** + * State for wrapped output (RTStrmWrappedPrintf, RTStrmWrappedPrintfV). + */ +typedef struct RTSTRMWRAPPEDSTATE +{ + PRTSTREAM pStream; /**< The output stream. */ + uint32_t cchWidth; /**< The line width. */ + uint32_t cchLine; /**< The current line length (valid chars in szLine). */ + uint32_t cLines; /**< Number of lines written. */ + uint32_t cchIndent; /**< The indent (determined from the first line). */ + int rcStatus; /**< The output status. */ + uint8_t cchHangingIndent; /**< Hanging indent (from fFlags). */ + char szLine[0x1000+1]; /**< We must buffer output so we can do proper word splitting. */ +} RTSTRMWRAPPEDSTATE; + + /********************************************************************************************************************************* * Global Variables * *********************************************************************************************************************************/ @@ -1290,3 +1307,229 @@ return rc; } + +/** + * Outputs @a cchIndent spaces. + */ +static void rtStrmWrapppedIndent(RTSTRMWRAPPEDSTATE *pState, uint32_t cchIndent) +{ + static const char s_szSpaces[] = " "; + while (cchIndent) + { + uint32_t cchToWrite = RT_MIN(cchIndent, sizeof(s_szSpaces) - 1); + int rc = RTStrmWrite(pState->pStream, s_szSpaces, cchToWrite); + if (RT_SUCCESS(rc)) + cchIndent -= cchToWrite; + else + { + pState->rcStatus = rc; + break; + } + } +} + + +/** + * Flushes the current line. + * + * @param pState The wrapped output state. + * @param fPartial Set if partial flush due to buffer overflow, clear when + * flushing due to '\n'. + */ +static void rtStrmWrappedFlushLine(RTSTRMWRAPPEDSTATE *pState, bool fPartial) +{ + /* + * Check indentation in case we need to split the line later. + */ + uint32_t cchIndent = pState->cchIndent; + if (cchIndent == UINT32_MAX) + { + pState->cchIndent = 0; + cchIndent = pState->cchHangingIndent; + while (RT_C_IS_BLANK(pState->szLine[cchIndent])) + cchIndent++; + } + + /* + * Do the flushing. + */ + uint32_t cchLine = pState->cchLine; + Assert(cchLine < sizeof(pState->szLine)); + while (cchLine >= pState->cchWidth || !fPartial) + { + /* + * Hopefully we don't need to do any wrapping ... + */ + uint32_t offSplit; + if (pState->cchIndent + cchLine <= pState->cchWidth) + { + if (!fPartial) + { + rtStrmWrapppedIndent(pState, pState->cchIndent); + pState->szLine[cchLine] = '\n'; + int rc = RTStrmWrite(pState->pStream, pState->szLine, cchLine + 1); + if (RT_FAILURE(rc)) + pState->rcStatus = rc; + pState->cLines += 1; + pState->cchLine = 0; + pState->cchIndent = UINT32_MAX; + return; + } + + /* + * ... no such luck. + */ + offSplit = cchLine; + } + else + offSplit = pState->cchWidth - pState->cchIndent; + + /* Find the start of the current word: */ + while (offSplit > 0 && !RT_C_IS_BLANK(pState->szLine[offSplit - 1])) + offSplit--; + + /* Skip spaces. */ + while (offSplit > 0 && RT_C_IS_BLANK(pState->szLine[offSplit - 1])) + offSplit--; + uint32_t offNextLine = offSplit; + + /* If the first word + indent is wider than the screen width, so just output it in full. */ + if (offSplit == 0) /** @todo Split words, look for hyphen... This code is currently a bit crude. */ + { + while (offSplit < cchLine && !RT_C_IS_BLANK(pState->szLine[offSplit])) + offSplit++; + offNextLine = offSplit; + } + + while (offNextLine < cchLine && RT_C_IS_BLANK(pState->szLine[offNextLine])) + offNextLine++; + + /* + * Output and advance. + */ + rtStrmWrapppedIndent(pState, pState->cchIndent); + int rc = RTStrmWrite(pState->pStream, pState->szLine, offSplit); + if (RT_SUCCESS(rc)) + rc = RTStrmPutCh(pState->pStream, '\n'); + if (RT_FAILURE(rc)) + pState->rcStatus = rc; + + cchLine -= offNextLine; + pState->cchLine = cchLine; + pState->cLines += 1; + pState->cchIndent = cchIndent; + memmove(&pState->szLine[0], &pState->szLine[offNextLine], cchLine); + } + + /* The indentation level is reset for each '\n' we process, so only save cchIndent if partial. */ + pState->cchIndent = fPartial ? cchIndent : UINT32_MAX; +} + + +/** + * @callback_method_impl{FNRTSTROUTPUT} + */ +static DECLCALLBACK(size_t) rtStrmWrappedOutput(void *pvArg, const char *pachChars, size_t cbChars) +{ + RTSTRMWRAPPEDSTATE *pState = (RTSTRMWRAPPEDSTATE *)pvArg; + size_t const cchRet = cbChars; + while (cbChars > 0) + { + if (*pachChars == '\n') + { + rtStrmWrappedFlushLine(pState, false /*fPartial*/); + pachChars++; + cbChars--; + } + else + { + const char *pszEol = (const char *)memchr(pachChars, '\n', cbChars); + size_t cchToCopy = pszEol ? (size_t)(pszEol - pachChars) : cbChars; + uint32_t cchLine = pState->cchLine; + Assert(cchLine < sizeof(pState->szLine)); + bool const fFlush = cchLine + cchToCopy >= sizeof(pState->szLine); + if (fFlush) + cchToCopy = cchToCopy - sizeof(pState->szLine) - 1; + + pState->cchLine = cchLine + (uint32_t)cchToCopy; + memcpy(&pState->szLine[cchLine], pachChars, cchToCopy); + + pachChars += cchToCopy; + cbChars -= cchToCopy; + + if (fFlush) + rtStrmWrappedFlushLine(pState, true /*fPartial*/); + } + } + return cchRet; +} + + +RTDECL(int32_t) RTStrmWrappedPrintfV(PRTSTREAM pStream, uint32_t fFlags, const char *pszFormat, va_list va) +{ + /* + * Figure the output width and set up the rest of the output state. + */ + RTSTRMWRAPPEDSTATE State; + State.pStream = pStream; + State.cchLine = fFlags & RTSTRMWRAPPED_F_LINE_OFFSET_MASK; + State.cLines = 0; + State.rcStatus = VINF_SUCCESS; + State.cchIndent = UINT32_MAX; + State.cchHangingIndent = 0; + if (fFlags & RTSTRMWRAPPED_F_HANGING_INDENT) + { + State.cchHangingIndent = (fFlags & RTSTRMWRAPPED_F_HANGING_INDENT_MASK) >> RTSTRMWRAPPED_F_HANGING_INDENT_SHIFT; + if (!State.cchHangingIndent) + State.cchHangingIndent = 4; + } + + int rc = RTStrmQueryTerminalWidth(pStream, &State.cchWidth); + if (RT_SUCCESS(rc)) + State.cchWidth = RT_MIN(State.cchWidth, RTSTRMWRAPPED_F_LINE_OFFSET_MASK + 1); + else + { + State.cchWidth = (uint32_t)fFlags & RTSTRMWRAPPED_F_NON_TERMINAL_WIDTH_MASK; + if (!State.cchWidth) + State.cchWidth = 80; + } + if (State.cchWidth < 32) + State.cchWidth = 32; + //State.cchWidth -= 1; /* necessary here? */ + + /* + * Do the formatting. + */ + RTStrFormatV(rtStrmWrappedOutput, &State, NULL, NULL, pszFormat, va); + + /* + * Returning is simple if the buffer is empty. Otherwise we'll have to + * perform a partial flush and write out whatever is left ourselves. + */ + if (RT_SUCCESS(State.rcStatus)) + { + if (State.cchLine == 0) + return State.cLines << 16; + + rtStrmWrappedFlushLine(&State, true /*fPartial*/); + if (RT_SUCCESS(State.rcStatus) && State.cchLine > 0) + { + rtStrmWrapppedIndent(&State, State.cchIndent); + State.rcStatus = RTStrmWrite(State.pStream, State.szLine, State.cchLine); + } + if (RT_SUCCESS(State.rcStatus)) + return RT_MIN(State.cchIndent + State.cchLine, RTSTRMWRAPPED_F_LINE_OFFSET_MASK) | (State.cLines << 16); + } + return State.rcStatus; +} + + +RTDECL(int32_t) RTStrmWrappedPrintf(PRTSTREAM pStream, uint32_t fFlags, const char *pszFormat, ...) +{ + va_list va; + va_start(va, pszFormat); + int32_t rcRet = RTStrmWrappedPrintfV(pStream, fFlags, pszFormat, va); + va_end(va); + return rcRet; +} + diff -Nru virtualbox-hwe-6.1.34-dfsg/src/VBox/Runtime/r3/win/pipe-win.cpp virtualbox-hwe-6.1.38-dfsg/src/VBox/Runtime/r3/win/pipe-win.cpp --- virtualbox-hwe-6.1.34-dfsg/src/VBox/Runtime/r3/win/pipe-win.cpp 2022-03-22 23:45:42.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/src/VBox/Runtime/r3/win/pipe-win.cpp 2022-09-01 13:29:08.000000000 +0000 @@ -37,6 +37,7 @@ #include #include #include +#include #include #include #include @@ -1186,9 +1187,79 @@ if (RT_FAILURE(rc)) return rc; + /** @todo The file size should give the same info and be slightly faster... */ DWORD cbAvailable = 0; if (PeekNamedPipe(pThis->hPipe, NULL, 0, NULL, &cbAvailable, NULL)) + { +#if ARCH_BITS == 32 + /* + * Kludge! + * + * Prior to XP SP1 (?), the returned cbAvailable value was not adjusted + * by the read position in the current message/buffer, so it could + * potentially be too high. This may cause the caller to try read more + * data than what's actually available, which may cause the read to + * block when the caller thought it wouldn't. + * + * To get an accurate readable size, we have to provide an output + * buffer and see how much we actually get back in it, as the data + * peeking works correctly (as you would expect). + */ + if (cbAvailable == 0 || g_enmWinVer >= kRTWinOSType_XP64) + { /* No data available or kernel shouldn't be affected. */ } + else + { + for (unsigned i = 0; ; i++) + { + uint8_t abBufStack[_16K]; + void *pvBufFree = NULL; + void *pvBuf; + DWORD cbBuf = RT_ALIGN_32(cbAvailable + i * 256, 64); + if (cbBuf <= sizeof(abBufStack)) + { + pvBuf = abBufStack; + /* No cbBuf = sizeof(abBufStack) here! PeekNamedPipe bounce buffers the request on the heap. */ + } + else + { + pvBufFree = pvBuf = RTMemTmpAlloc(cbBuf); + if (!pvBuf) + { + rc = VERR_NO_TMP_MEMORY; + cbAvailable = 1; + break; + } + } + + DWORD cbAvailable2 = 0; + DWORD cbRead = 0; + BOOL fRc = PeekNamedPipe(pThis->hPipe, pvBuf, cbBuf, &cbRead, &cbAvailable2, NULL); + Log(("RTPipeQueryReadable: #%u: cbAvailable=%#x cbRead=%#x cbAvailable2=%#x (cbBuf=%#x)\n", + i, cbAvailable, cbRead, cbAvailable2, cbBuf)); + + RTMemTmpFree(pvBufFree); + + if (fRc) + { + if (cbAvailable2 <= cbBuf || i >= 10) + cbAvailable = cbRead; + else + { + cbAvailable = cbAvailable2; + continue; + } + } + else + { + rc = RTErrConvertFromWin32(GetLastError()); + cbAvailable = 1; + } + break; + } + } +#endif *pcbReadable = cbAvailable; + } else rc = RTErrConvertFromWin32(GetLastError()); diff -Nru virtualbox-hwe-6.1.34-dfsg/src/VBox/Runtime/r3/win/RTCrStoreCreateSnapshotById-win.cpp virtualbox-hwe-6.1.38-dfsg/src/VBox/Runtime/r3/win/RTCrStoreCreateSnapshotById-win.cpp --- virtualbox-hwe-6.1.34-dfsg/src/VBox/Runtime/r3/win/RTCrStoreCreateSnapshotById-win.cpp 2022-03-22 23:45:41.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/src/VBox/Runtime/r3/win/RTCrStoreCreateSnapshotById-win.cpp 2022-09-01 13:29:07.000000000 +0000 @@ -56,7 +56,7 @@ DWORD fOpenStore = CERT_STORE_OPEN_EXISTING_FLAG | CERT_STORE_READONLY_FLAG; HCERTSTORE hNativeStore = pfnOpenStore(CERT_STORE_PROV_SYSTEM_W, PKCS_7_ASN_ENCODING | X509_ASN_ENCODING, NULL /* hCryptProv = default */, fStore | fOpenStore, pwszStoreName); - if (hStore) + if (hNativeStore) { PCCERT_CONTEXT pCurCtx = NULL; while ((pCurCtx = pfnEnumCerts(hNativeStore, pCurCtx)) != NULL) @@ -136,16 +136,31 @@ /* * Do the work. */ + DWORD fStore = CERT_SYSTEM_STORE_CURRENT_USER; switch (enmStoreId) { - case RTCRSTOREID_USER_TRUSTED_CAS_AND_CERTIFICATES: case RTCRSTOREID_SYSTEM_TRUSTED_CAS_AND_CERTIFICATES: + case RTCRSTOREID_SYSTEM_INTERMEDIATE_CAS: + fStore = CERT_SYSTEM_STORE_LOCAL_MACHINE; + RT_FALL_THRU(); + case RTCRSTOREID_USER_TRUSTED_CAS_AND_CERTIFICATES: + case RTCRSTOREID_USER_INTERMEDIATE_CAS: { - DWORD fStore = enmStoreId == RTCRSTOREID_USER_TRUSTED_CAS_AND_CERTIFICATES - ? CERT_SYSTEM_STORE_CURRENT_USER : CERT_SYSTEM_STORE_LOCAL_MACHINE; - static PCRTUTF16 const s_apwszStores[] = { L"AuthRoot", L"CA", L"MY", L"Root" }; - for (uint32_t i = 0; i < RT_ELEMENTS(s_apwszStores); i++) - rc = rtCrStoreAddCertsFromNative(hStore, fStore, s_apwszStores[i], pfnOpenStore, pfnCloseStore, + /** @todo CA and MY in s_apwszRootStores are _very_ questionable!!! However, + * curl may need them to work correct and it doesn't seem to have any + * intermediate ca file. :/ */ + static PCRTUTF16 const s_apwszRootStores[] = { L"AuthRoot", L"CA", L"MY", L"Root" }; + static PCRTUTF16 const s_apwszIntermediateStores[] = { L"CA", L"MY" }; + PCRTUTF16 const *papwszStores = s_apwszRootStores; + uint32_t cStores = RT_ELEMENTS(s_apwszRootStores); + if (enmStoreId == RTCRSTOREID_USER_INTERMEDIATE_CAS || enmStoreId == RTCRSTOREID_SYSTEM_INTERMEDIATE_CAS) + { + papwszStores = s_apwszIntermediateStores; + cStores = RT_ELEMENTS(s_apwszIntermediateStores); + } + + for (uint32_t i = 0; i < cStores; i++) + rc = rtCrStoreAddCertsFromNative(hStore, fStore, papwszStores[i], pfnOpenStore, pfnCloseStore, pfnEnumCerts, rc, pErrInfo); break; } diff -Nru virtualbox-hwe-6.1.34-dfsg/src/VBox/Runtime/r3/win/RTSystemQueryOSInfo-win.cpp virtualbox-hwe-6.1.38-dfsg/src/VBox/Runtime/r3/win/RTSystemQueryOSInfo-win.cpp --- virtualbox-hwe-6.1.34-dfsg/src/VBox/Runtime/r3/win/RTSystemQueryOSInfo-win.cpp 2022-03-22 23:45:41.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/src/VBox/Runtime/r3/win/RTSystemQueryOSInfo-win.cpp 2022-09-01 13:29:07.000000000 +0000 @@ -315,7 +315,6 @@ } - RTDECL(int) RTSystemQueryOSInfo(RTSYSOSINFO enmInfo, char *pszInfo, size_t cchInfo) { /* @@ -345,15 +344,3 @@ return VERR_NOT_SUPPORTED; } - -RTDECL(uint32_t) RTSystemGetNtBuildNo(void) -{ - return g_WinOsInfoEx.dwBuildNumber; -} - - -RTDECL(uint64_t) RTSystemGetNtVersion(void) -{ - return RTSYSTEM_MAKE_NT_VERSION(g_WinOsInfoEx.dwMajorVersion, g_WinOsInfoEx.dwMinorVersion, g_WinOsInfoEx.dwBuildNumber); -} - diff -Nru virtualbox-hwe-6.1.34-dfsg/src/VBox/Runtime/r3/win/system-get-nt-xxx-win.cpp virtualbox-hwe-6.1.38-dfsg/src/VBox/Runtime/r3/win/system-get-nt-xxx-win.cpp --- virtualbox-hwe-6.1.34-dfsg/src/VBox/Runtime/r3/win/system-get-nt-xxx-win.cpp 1970-01-01 00:00:00.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/src/VBox/Runtime/r3/win/system-get-nt-xxx-win.cpp 2022-09-01 13:29:08.000000000 +0000 @@ -0,0 +1,58 @@ +/* $Id: system-get-nt-xxx-win.cpp $ */ +/** @file + * IPRT - RTSystemQueryOSInfo, generic stub. + */ + +/* + * Copyright (C) 2008-2020 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 "internal/iprt.h" +#include + +#include "internal-r3-win.h" +#include +#include + + +RTDECL(uint32_t) RTSystemGetNtBuildNo(void) +{ + Assert(g_WinOsInfoEx.dwOSVersionInfoSize > 0); + return g_WinOsInfoEx.dwBuildNumber; +} + + +RTDECL(uint64_t) RTSystemGetNtVersion(void) +{ + Assert(g_WinOsInfoEx.dwOSVersionInfoSize > 0); + return RTSYSTEM_MAKE_NT_VERSION(g_WinOsInfoEx.dwMajorVersion, g_WinOsInfoEx.dwMinorVersion, g_WinOsInfoEx.dwBuildNumber); +} + + +RTDECL(uint8_t) RTSystemGetNtProductType(void) +{ + Assert(g_WinOsInfoEx.dwOSVersionInfoSize > 0); + return g_WinOsInfoEx.wProductType; /* It's a byte, not a word as 'w' normally indicates. (Baka Maikurosofuto!) */ +} + diff -Nru virtualbox-hwe-6.1.34-dfsg/src/VBox/Runtime/testcase/tstRTDigest-2.cpp virtualbox-hwe-6.1.38-dfsg/src/VBox/Runtime/testcase/tstRTDigest-2.cpp --- virtualbox-hwe-6.1.34-dfsg/src/VBox/Runtime/testcase/tstRTDigest-2.cpp 2022-03-22 23:45:44.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/src/VBox/Runtime/testcase/tstRTDigest-2.cpp 2022-09-01 13:29:10.000000000 +0000 @@ -1456,28 +1456,651 @@ } -int main() +static void testSha3_224(void) +{ + RTTestISub("SHA3-224"); + + /* + * Generic API tests. + */ + static TESTRTDIGEST const s_abTests[] = + { + { &g_abRandom72KB[0], 0, "6b4e03423667dbb73b6e15454f0eb1abd4597f9a1b078e3f5b5a6bc7", "SHA3-224 0 bytes" }, + { &g_abRandom72KB[0], 1, "c16ddd47002314077565c004c8a6a335622fb9eebd93a207b3df86f1", "SHA3-224 1 bytes" }, + { &g_abRandom72KB[0], 2, "806c36dcdfa26341648dfcd6dffed6bd17b1bfae7e6cff0ddade2dcd", "SHA3-224 2 bytes" }, + { &g_abRandom72KB[0], 3, "850900b680b3645a715bf4f9a24c939936d5d400cea7e48e27a5a82c", "SHA3-224 3 bytes" }, + { &g_abRandom72KB[0], 4, "03f71d684cd5f38a1508a4a313fa2f099afcf306a9943d8b497b793f", "SHA3-224 4 bytes" }, + { &g_abRandom72KB[0], 5, "188ca424af350902fc377035db1f26e46ebe304ede5ac700ed4262d3", "SHA3-224 5 bytes" }, + { &g_abRandom72KB[0], 6, "6310deb0fd800c59d4116ae8f98137200377e637902904e21f8b1912", "SHA3-224 6 bytes" }, + { &g_abRandom72KB[0], 7, "4aeccabab1c5af03ab038edbf7f293fcc95a5d362c51bad6208ffb2f", "SHA3-224 7 bytes" }, + { &g_abRandom72KB[0], 8, "9349cae62e9198c47ecbd288dc2f92918b8fca2ba9121633d82a4d4a", "SHA3-224 8 bytes" }, + { &g_abRandom72KB[0], 9, "36c1119e49b45c72ab64f81281204f25cda7dcba348347d441f7392e", "SHA3-224 9 bytes" }, + { &g_abRandom72KB[0], 10, "2bdfddbd1ff52d1a55a15e862e1f6740bc09ca2dfb195d756402899b", "SHA3-224 10 bytes" }, + { &g_abRandom72KB[0], 11, "00d28c1f6d6d68b18c102d0c79727b62aff23b534efb2397f628d739", "SHA3-224 11 bytes" }, + { &g_abRandom72KB[0], 12, "037550e18635864203a6aaf2c732ed76dc94f6dd838cd14f0d317dbd", "SHA3-224 12 bytes" }, + { &g_abRandom72KB[0], 13, "d989f92017047e08b8212483a2ce9288aa97b1f07bda29c938d9bc8e", "SHA3-224 13 bytes" }, + { &g_abRandom72KB[0], 14, "ab23e6d5a674c471f2842e81593f42f728056fc2adf4b78b7f91edc2", "SHA3-224 14 bytes" }, + { &g_abRandom72KB[0], 15, "d8470eb158ce88069f057d2c96db04f9bb8d480e4edc239be4d074a5", "SHA3-224 15 bytes" }, + { &g_abRandom72KB[0], 16, "9c446f8b9a4d70ff2aa174ed49910db205622f4735f78c8e756b69d9", "SHA3-224 16 bytes" }, + { &g_abRandom72KB[0], 17, "c873455ce6b16f24d3a437a6397a06215500111f448627929db94ffb", "SHA3-224 17 bytes" }, + { &g_abRandom72KB[0], 18, "1cf8336176b6747bcd1e6bacda5b87d9d299cae74c4eacfc25241523", "SHA3-224 18 bytes" }, + { &g_abRandom72KB[0], 19, "97bea48929cc724f9fb75d132101b8f00c82c8d5790c5e06dc41393f", "SHA3-224 19 bytes" }, + { &g_abRandom72KB[0], 20, "f549bcda80edcaeef5e01047a6429c55babc33407502d332d1a4285d", "SHA3-224 20 bytes" }, + { &g_abRandom72KB[0], 21, "752a317c4527605d6882cf40d833de22cb43eb208f2f265a16795ff6", "SHA3-224 21 bytes" }, + { &g_abRandom72KB[0], 22, "379bc7846ec4736dbe7a69f94e4622cfccba5687694e1c73ed6a1c57", "SHA3-224 22 bytes" }, + { &g_abRandom72KB[0], 23, "f4d7161e2e4dd576f9c67e8212e94f8f6a0348b1760e6009d4d82b8c", "SHA3-224 23 bytes" }, + { &g_abRandom72KB[0], 24, "188b729072e18f920f869809d90270c26991566bbf943c080ee944c7", "SHA3-224 24 bytes" }, + { &g_abRandom72KB[0], 25, "3b65d20cf2717de484574d39656a8684a71e9bc9ed6640e075ccb018", "SHA3-224 25 bytes" }, + { &g_abRandom72KB[0], 26, "0219518dc74ea5829974af838fada6581e611b2909365269bba0b2d6", "SHA3-224 26 bytes" }, + { &g_abRandom72KB[0], 27, "2f4d4afa8dcc6d2bdcbcf148a328b63392c5a6cca40939c243e20832", "SHA3-224 27 bytes" }, + { &g_abRandom72KB[0], 28, "c4fd8e78042ef4a366a7d9bc81c089e7391c93fafa85c48fedad100c", "SHA3-224 28 bytes" }, + { &g_abRandom72KB[0], 29, "ab364ae73034dba102a0c477c3acee20d9ea6a967c49a0361f60e241", "SHA3-224 29 bytes" }, + { &g_abRandom72KB[0], 30, "dfe98cb78941401a9c50fb87659cd6413a2cb13c7ff8ef0823553cde", "SHA3-224 30 bytes" }, + { &g_abRandom72KB[0], 31, "d40afd915348f9b2fd9e6ada40d27859ca1efed9d795eef714f65809", "SHA3-224 31 bytes" }, + { &g_abRandom72KB[0], 32, "2503528850f2f418c7bb029f507766d77fb5be193b66ed74edf24d6b", "SHA3-224 32 bytes" }, + { &g_abRandom72KB[0], 33, "2c13b17427c015049e746cbece772caba6937adac3a5255166b032c0", "SHA3-224 33 bytes" }, + { &g_abRandom72KB[0], 34, "d36fc360863705e3d1c22d1dfe7c3d369ae5445aa835e06046b06236", "SHA3-224 34 bytes" }, + { &g_abRandom72KB[0], 35, "688909a2d656bdc79d9607628c13458668b4a68f418eee4ad40e3797", "SHA3-224 35 bytes" }, + { &g_abRandom72KB[0], 36, "8564656691fb972b8d8462944c4fc95dfb815ead67402dd150310ad9", "SHA3-224 36 bytes" }, + { &g_abRandom72KB[0], 37, "000e42152df4306c46fd86b64abc64061861b535e73c1db755873c92", "SHA3-224 37 bytes" }, + { &g_abRandom72KB[0], 38, "5797e1b6e7738bcbea346d58ed7e82cdf4921c8c7061ad273a652fad", "SHA3-224 38 bytes" }, + { &g_abRandom72KB[0], 39, "d9f70e175a6ec2b87fa53dccd8fe2fe662619d4227e79b020354a8ef", "SHA3-224 39 bytes" }, + { &g_abRandom72KB[0], 40, "a567898565c10d9d233aabacc661b3b534f823ee9144a78b3538c29c", "SHA3-224 40 bytes" }, + { &g_abRandom72KB[0], 41, "f9879abc1aeaa3b93465bf012bb0bca619994d1e38c5d9704a4c4737", "SHA3-224 41 bytes" }, + { &g_abRandom72KB[0], 42, "a947c58c199a49cd27837c7df25bba6d4832eab3f6ad7825481439ef", "SHA3-224 42 bytes" }, + { &g_abRandom72KB[0], 43, "496485839fdd5cc8dc0f0ce1973c2bde663723dfe5eafe539bd96599", "SHA3-224 43 bytes" }, + { &g_abRandom72KB[0], 44, "fcea784f1428967cae93ae58716a1a7cde35ce3d295c65439a4f24ec", "SHA3-224 44 bytes" }, + { &g_abRandom72KB[0], 45, "3a2e32058f0553e706fc1ac804931c809994598d86d74c3a00e88bf9", "SHA3-224 45 bytes" }, + { &g_abRandom72KB[0], 46, "d964782b0fc1743a590efe7f42de8c3c44e8ddcd5a1b7bb343223d56", "SHA3-224 46 bytes" }, + { &g_abRandom72KB[0], 47, "7e4c82f47d77ac4539d25e6fa122d70d2d017f96a971b108c190fa78", "SHA3-224 47 bytes" }, + { &g_abRandom72KB[0], 48, "66393d6e347cbd37e81b3d0c43175ab2a874196bb051391d8ed75353", "SHA3-224 48 bytes" }, + { &g_abRandom72KB[0], 49, "865e7ab710d415c2c291491891f0a076c6064863c49e483fa4e77b80", "SHA3-224 49 bytes" }, + { &g_abRandom72KB[0], 50, "b495da95e14b544f0229788ee6b88dfc7c1b0e809b1c9f89884db075", "SHA3-224 50 bytes" }, + { &g_abRandom72KB[0], 51, "9ce32908772904b4863513044646a89e69493cc6d5d43c3b07afa48b", "SHA3-224 51 bytes" }, + { &g_abRandom72KB[0], 52, "da457f9a263e9b1b73130419c9be8eaa91d9c742b8965c4721fb3a1c", "SHA3-224 52 bytes" }, + { &g_abRandom72KB[0], 53, "86707eb2d9e32b3241740d7c915cfa0216928eeca1c66e4bf61304ae", "SHA3-224 53 bytes" }, + { &g_abRandom72KB[0], 54, "2ed6f9b614341b440107ac9743f202d56698757ec704d051b6b98c09", "SHA3-224 54 bytes" }, + { &g_abRandom72KB[0], 55, "8c6c71dcd399cb83506b6cdf0d58bc07301e674e643fbd28c8510044", "SHA3-224 55 bytes" }, + { &g_abRandom72KB[0], 56, "ee58b4581f368a8530d8c97f568d22d25710279044450d9616b3642e", "SHA3-224 56 bytes" }, + { &g_abRandom72KB[0], 57, "bcfc035caa5b5604221a2eb4fb52ea14f362e719cde6de940409fe36", "SHA3-224 57 bytes" }, + { &g_abRandom72KB[0], 58, "83e3508129d6891269e6e71f25a72143ea106ba6a03fa86fb394a7a5", "SHA3-224 58 bytes" }, + { &g_abRandom72KB[0], 59, "7ac6956c9966581a9fb892c56e798e9fb0f5ef32f417daf015e50826", "SHA3-224 59 bytes" }, + { &g_abRandom72KB[0], 60, "ae689e3347198b48aebc96178dddc52e35e6c54c3cee365e49e0ea69", "SHA3-224 60 bytes" }, + { &g_abRandom72KB[0], 61, "0279f79ba33d32b8214c1133097b9f89fa659b77c44eaf166ed2529e", "SHA3-224 61 bytes" }, + { &g_abRandom72KB[0], 62, "9b27f0538ac8fce31e123ae6ab2ca9569d3fc8e018b7e6fc1eb7c73d", "SHA3-224 62 bytes" }, + { &g_abRandom72KB[0], 63, "7961cc0f6091100760f0b1e2d4db62969320fc1780092576d1dee5be", "SHA3-224 63 bytes" }, + { &g_abRandom72KB[0], 64, "e5740eb1c2c611e2a75fbaf4375be8bb73fe5718d9fddc3bca889c5a", "SHA3-224 64 bytes" }, + { &g_abRandom72KB[0], 65, "54699c4f043f96b065d04af21b8fc0ff21880a4f82c3c32d6a11c1af", "SHA3-224 65 bytes" }, + { &g_abRandom72KB[0], 66, "fcd22829d13a6d7cec11876a1a376afd521c98d29363fd683a58e907", "SHA3-224 66 bytes" }, + { &g_abRandom72KB[0], 67, "02dc82ad08e364cf2571c047de6ceb9cbfa4928e907484497d66fb3b", "SHA3-224 67 bytes" }, + { &g_abRandom72KB[0], 68, "17156cb0b69423dac7e749db311abf4a706b16fee64698c6565e7869", "SHA3-224 68 bytes" }, + { &g_abRandom72KB[0], 69, "42a22855ab3be53983f392f7cbd038164b0eb0d482bfcb4b9f2c3e70", "SHA3-224 69 bytes" }, + { &g_abRandom72KB[0], 70, "0758abc06dcdf81cd6923f1d97246bf24e0bd50f43c4215fde41d25f", "SHA3-224 70 bytes" }, + { &g_abRandom72KB[0], 71, "8fdc4d4d0ee58239eba5bbee83b9e06a3d35ecc45e7ef94428ac5766", "SHA3-224 71 bytes" }, + { &g_abRandom72KB[0], 72, "831289ea7a65354937575adeba26668776640421c44f3619421054b8", "SHA3-224 72 bytes" }, + { &g_abRandom72KB[0], 73, "17e7a1aa6bc9b5a4e6964801c119ceed987406d328902ee37accf277", "SHA3-224 73 bytes" }, + { &g_abRandom72KB[0], 74, "0c79a923e2a3178808f6bb4215357990f5488fbb3793247af84f9bf9", "SHA3-224 74 bytes" }, + { &g_abRandom72KB[0], 75, "c6e157824d65e3880eb35d6b97c26affaf49e323009ccbdf23ec91de", "SHA3-224 75 bytes" }, + { &g_abRandom72KB[0], 76, "a4a2f31afe00a3e7ed111809ca4b36d24aff59fe9515908187c28f2b", "SHA3-224 76 bytes" }, + { &g_abRandom72KB[0], 77, "a427e8644082b21109519306030dd62b48a3913f996b21039b46fb50", "SHA3-224 77 bytes" }, + { &g_abRandom72KB[0], 78, "7d930aca6fef38522af10a132d146325cc30937ae9abb301605c350a", "SHA3-224 78 bytes" }, + { &g_abRandom72KB[0], 79, "da75e1be010a756971d76da39015c34978c6295f77d01dbed4f39028", "SHA3-224 79 bytes" }, + { &g_abRandom72KB[0], 80, "3541d7bce47da0d906fb90fb1d98610dacca9adf79d156337aa22683", "SHA3-224 80 bytes" }, + { &g_abRandom72KB[0], 81, "f79c13e00d5836f6d047d84eebbeb0edf296f8aa72fcfa08b49efc5b", "SHA3-224 81 bytes" }, + { &g_abRandom72KB[0], 82, "63ed5e252ca90d5f83c1f27ec8f658c488e4671a1b18c070d954e2f3", "SHA3-224 82 bytes" }, + { &g_abRandom72KB[0], 83, "653a98bf1b4aed149dd9552aa9e9b5598d52fe6bf777f92e61df850c", "SHA3-224 83 bytes" }, + { &g_abRandom72KB[0], 84, "c685ef068ea79653eb9deb7eb19616421a1a32ad11bd7ac4a3e76bde", "SHA3-224 84 bytes" }, + { &g_abRandom72KB[0], 85, "53d01a556bce8d05e6ead02cd8376dea9abc73051d08165afa4332cb", "SHA3-224 85 bytes" }, + { &g_abRandom72KB[0], 86, "b245082e59d780d00b2f26d99848808b467c8ca00aa9e9be7b6015e1", "SHA3-224 86 bytes" }, + { &g_abRandom72KB[0], 87, "a43477d9ad4c176a2efb21b970e273270856d5fc212060142c03abaf", "SHA3-224 87 bytes" }, + { &g_abRandom72KB[0], 88, "50d777f861dec127b5a1033f53c18ec3b42c3b7506cac20714f1b840", "SHA3-224 88 bytes" }, + { &g_abRandom72KB[0], 89, "367c94e4553e21f893e50100eef0c73a9c4ece979f15feecffd7ae6e", "SHA3-224 89 bytes" }, + { &g_abRandom72KB[0], 90, "f6b9bb09f5518ec01cc8f1dfa8a15f3956a40699eb306cbd8ee3fd2f", "SHA3-224 90 bytes" }, + { &g_abRandom72KB[0], 91, "87e0ff97b08b82abf918775d9bfae231224046c94d17803ce2891708", "SHA3-224 91 bytes" }, + { &g_abRandom72KB[0], 92, "8ff74e71ac81da91b9333d0da134573616180972656a5c78671eee1f", "SHA3-224 92 bytes" }, + { &g_abRandom72KB[0], 93, "cabd5597a76890d584d639652b3987c7ca0a66508b00d011cc439f8b", "SHA3-224 93 bytes" }, + { &g_abRandom72KB[0], 94, "686774c4d9124325b9643a575964e09c51bd3bc24cb2cc42a9c5061a", "SHA3-224 94 bytes" }, + { &g_abRandom72KB[0], 95, "9cbf2c98dad0ae73735f2cac071129e41ae2585776ded9e2d43d57cf", "SHA3-224 95 bytes" }, + { &g_abRandom72KB[0], 96, "f53faed02f1dfccc0547af35da372774218e2504298a3bf80d05ed97", "SHA3-224 96 bytes" }, + { &g_abRandom72KB[0], 97, "72cd564a08ba595c375197df0158c90b7358a047d6b8f6cf98315b2f", "SHA3-224 97 bytes" }, + { &g_abRandom72KB[0], 98, "afa5d854d139ea9bb8d9ebb58cc593c4b4bea8aa0046427c77ffd5e6", "SHA3-224 98 bytes" }, + { &g_abRandom72KB[0], 99, "fc81822a0155f881431c2432ec4caa9fd4c1ac739a03c30f8b320d53", "SHA3-224 99 bytes" }, + { &g_abRandom72KB[0], 100, "25f2f31b98e6001329a8a5008d3f20479afea8a38a857b4c04c30090", "SHA3-224 100 bytes" }, + { &g_abRandom72KB[0], 101, "7f86d0e097e022b180899413c99360872b733544cc3337172c85b2f9", "SHA3-224 101 bytes" }, + { &g_abRandom72KB[0], 102, "d35db0d601a2e096cb6788a966dfd161ed8f5056ad0e0a7e1e9e717f", "SHA3-224 102 bytes" }, + { &g_abRandom72KB[0], 103, "c5934041c642050bcff5ecc477cd03465a504497dd93f80be9013e68", "SHA3-224 103 bytes" }, + { &g_abRandom72KB[0], 104, "518317aef82651992e5142570beffcdbc74ed18f4b8d594f0541231a", "SHA3-224 104 bytes" }, + { &g_abRandom72KB[0], 105, "dc01a97914e9fa82adc76e1cb544e90d28a746a8e4922bdc3d8c45a9", "SHA3-224 105 bytes" }, + { &g_abRandom72KB[0], 106, "4f38ae5d26757a2c945134106b29302286d252d97c8412e104698364", "SHA3-224 106 bytes" }, + { &g_abRandom72KB[0], 107, "228bac7ab9519c2840485cd89abb6a8ce7168a6c7bada34aa67549e3", "SHA3-224 107 bytes" }, + { &g_abRandom72KB[0], 108, "b4066bbd7b2e50f945bdd8975077ee1ad0bd5dd43ee6de168f5eaf26", "SHA3-224 108 bytes" }, + { &g_abRandom72KB[0], 109, "848724ab14b37effa4f2de9eb7d509c4a67420655a8202aafc2245bb", "SHA3-224 109 bytes" }, + { &g_abRandom72KB[0], 110, "9217bd598153cd6bbf121034d7fe57e461be564dc27096760932c9c5", "SHA3-224 110 bytes" }, + { &g_abRandom72KB[0], 111, "c97bbaf7e7d2c884f8c11cefa049fbeda46385abb3cc3cfe60ee7025", "SHA3-224 111 bytes" }, + { &g_abRandom72KB[0], 112, "e0157bab5712c11296e8497ebaa461eb1117434d849aac9af578259a", "SHA3-224 112 bytes" }, + { &g_abRandom72KB[0], 113, "afec901dce2536c1b4d986816edfbff81ab5ab677cb1c5852de14947", "SHA3-224 113 bytes" }, + { &g_abRandom72KB[0], 114, "c7ffc02bf2c055ee7c6d72deeb19a70538a4ec61845b8d5df16655e8", "SHA3-224 114 bytes" }, + { &g_abRandom72KB[0], 115, "774d505a09932de66f66d20f2ba355cadf36fa143715c747834ebb8b", "SHA3-224 115 bytes" }, + { &g_abRandom72KB[0], 116, "32bd91adeaa38f017696ccadda32445e65f76bc7abc73ebcd35a324d", "SHA3-224 116 bytes" }, + { &g_abRandom72KB[0], 117, "27712acf5577badb6e87fbc519234b795ffa7ce509bc99665b0bc06a", "SHA3-224 117 bytes" }, + { &g_abRandom72KB[0], 118, "56b83dbf7aa7d0b3162a6f0a667ba469370e9a648b59db643172649c", "SHA3-224 118 bytes" }, + { &g_abRandom72KB[0], 119, "e6f35f53bf2df44eeff1dcb3549afa02e6dbec8febe17cd4417ba141", "SHA3-224 119 bytes" }, + { &g_abRandom72KB[0], 120, "8c44941f21d2e863daffc5ad7faee2b5a79475496e95753491345a4d", "SHA3-224 120 bytes" }, + { &g_abRandom72KB[0], 121, "1cb79d12f6eb093469aba8f0f3455389b09f8dd965d05a6cc06fdb21", "SHA3-224 121 bytes" }, + { &g_abRandom72KB[0], 122, "6080d39958b1472f5f4e9bdfcf36df30e074603464a9a242857fbe3d", "SHA3-224 122 bytes" }, + { &g_abRandom72KB[0], 123, "614920d5cffdc929efb38768ab8f6d940dc9488211c550d0526f3839", "SHA3-224 123 bytes" }, + { &g_abRandom72KB[0], 124, "5dd2081e84d1946245e8a58f27be169d26c017fa9ed583c0f29555fc", "SHA3-224 124 bytes" }, + { &g_abRandom72KB[0], 125, "cfe8e9b33a46812f82c6cd72908287afc40e9e77bb3a6cae670b4315", "SHA3-224 125 bytes" }, + { &g_abRandom72KB[0], 126, "7d8d13b5e533456fd67e4b3a674a3c1d83218a77bc47cc3019cd4df1", "SHA3-224 126 bytes" }, + { &g_abRandom72KB[0], 127, "b29f872062dfb9f40b1ae7b40d9eca735c5ec1e2de10f0eb393e638b", "SHA3-224 127 bytes" }, + { &g_abRandom72KB[0], 128, "edd905ef5427ac92cbed887eedee28193cc6ccad967769f112663031", "SHA3-224 128 bytes" }, + { &g_abRandom72KB[0], 129, "eddbb15b21c9edf478ff14c6cf99f5b1d82a92a91de38eaf8756f44c", "SHA3-224 129 bytes" }, + { &g_abRandom72KB[0], 1024, "c200848e295665570e56cd995f51e58289e1e6398c9c9f326d757bab", "SHA3-224 1024 bytes" }, + { &g_abRandom72KB[0], 73001, "95a8479d32047490841a03c0c2152554c40e4b470cac18777b96e245", "SHA3-224 73001 bytes" }, + { &g_abRandom72KB[0], 73728, "1acd8a512e1ea38402b16ae7fb796d2a195106078b65a77f28d517a1", "SHA3-224 73728 bytes" }, + { &g_abRandom72KB[0x20c9], 9991, "e2d5e6c023bb4a663c0958eef8b4ef4de953fe94d1b45c3cdc51fe8e", "SHA3-224 8393 bytes @9991" }, + }; + testGeneric("2.16.840.1.101.3.4.2.7", s_abTests, RT_ELEMENTS(s_abTests), "SHA3-224", RTDIGESTTYPE_SHA3_512, VINF_SUCCESS); +} + + +static void testSha3_256(void) +{ + RTTestISub("SHA3-256"); + + /* + * Generic API tests. + */ + static TESTRTDIGEST const s_abTests[] = + { + { &g_abRandom72KB[0], 0, "a7ffc6f8bf1ed76651c14756a061d662f580ff4de43b49fa82d80a4b80f8434a", "SHA3-256 0 bytes" }, + { &g_abRandom72KB[0], 1, "afcd9d4977b545e10872d720975b66368e9388866420da61b967d84d6791819b", "SHA3-256 1 bytes" }, + { &g_abRandom72KB[0], 2, "b390b8f8ab7d1dd1570d9583c5536a09896836f78bfa6e146b2caa217fb03282", "SHA3-256 2 bytes" }, + { &g_abRandom72KB[0], 3, "6714921795665b34839a95593f20981a85f0bd84d079baff97419d6803303b05", "SHA3-256 3 bytes" }, + { &g_abRandom72KB[0], 4, "430bfb151ddae9b7c16e2ad9cbd33b6722ae1eda83f2b6bb6933e8fd3da56755", "SHA3-256 4 bytes" }, + { &g_abRandom72KB[0], 5, "9cf2b6d2627900be1174bebf23e705664eb4c08904430daefe537c6493a29d8e", "SHA3-256 5 bytes" }, + { &g_abRandom72KB[0], 6, "871549e51b212f4d63d0c7a55b13555ade1d73cd4002eb79144bcc4b97937cb4", "SHA3-256 6 bytes" }, + { &g_abRandom72KB[0], 7, "ae27b315124cc7b003ab1aaf2c108591fe2f31f807ea1b970799c3598e101204", "SHA3-256 7 bytes" }, + { &g_abRandom72KB[0], 8, "181674cc927edc7466c9408055d43a554448175edb5f3a3484a92c9d7344d81c", "SHA3-256 8 bytes" }, + { &g_abRandom72KB[0], 9, "a75aae88c58895fdb97ca7e26121d73ee2ad76bf084bcb3d5d7663efed5d918c", "SHA3-256 9 bytes" }, + { &g_abRandom72KB[0], 10, "1e7cc10a8cd646a063284960e443a83b36ca50d6c9429d0e4f2d098fbf20a850", "SHA3-256 10 bytes" }, + { &g_abRandom72KB[0], 11, "e05c7bf58b23cd04f390fd805ebd11d5e4f373382dd3f4fc065e3b5d36986f37", "SHA3-256 11 bytes" }, + { &g_abRandom72KB[0], 12, "362e87c0856768db0cde2c6a9edfc3ce513a021420d93b15669c18972ffbaa01", "SHA3-256 12 bytes" }, + { &g_abRandom72KB[0], 13, "c7a99d13b7da44be0565b3b726ed8948e425ae1c43adbf7145c715c7f725f60a", "SHA3-256 13 bytes" }, + { &g_abRandom72KB[0], 14, "0ffa1ed9b160cd0adc964f42834f6b18f65c6a5d12883594ad1b3ee53562585a", "SHA3-256 14 bytes" }, + { &g_abRandom72KB[0], 15, "dfc04b284a6e4db24ab307700269b25b4400242c0dd4773b851d7c24106f9e3d", "SHA3-256 15 bytes" }, + { &g_abRandom72KB[0], 16, "f567d888fec188b3a85600a4f31e3842e4b46fa3efad941b2e720f186a080e93", "SHA3-256 16 bytes" }, + { &g_abRandom72KB[0], 17, "a6d07d11cb3d6de6976ba487892c50c9bb73fe234827b224c92c70a950eb955c", "SHA3-256 17 bytes" }, + { &g_abRandom72KB[0], 18, "a494c5307e6210c405e990992ded702460a967e82e680d3c07db2a61a64d9565", "SHA3-256 18 bytes" }, + { &g_abRandom72KB[0], 19, "5c6eadddcd686959bffd39d1311c4e9ea71ec63d532d87cba38136fb9c156db6", "SHA3-256 19 bytes" }, + { &g_abRandom72KB[0], 20, "eef8fd8e01b47dbb4650f09e5306eb48a477e0f38170c3242e755f0bcc44d574", "SHA3-256 20 bytes" }, + { &g_abRandom72KB[0], 21, "c93e8811b3e7a2409c96d4a738c2c20658cc7740d971e9c7d12044bdd9abad81", "SHA3-256 21 bytes" }, + { &g_abRandom72KB[0], 22, "6c78e40e3f570e4e7ff22b47f4cadee3f0007aafefff83e42d04cec20b4d9de5", "SHA3-256 22 bytes" }, + { &g_abRandom72KB[0], 23, "ef35d85cdd3b7e0cf364c3d19d28a3c6e187052a92a4085e014b5b89b1a94e18", "SHA3-256 23 bytes" }, + { &g_abRandom72KB[0], 24, "1e6d74bfd46200dbb0ba76c536004118da36350a8fabdacdf33405e969964d76", "SHA3-256 24 bytes" }, + { &g_abRandom72KB[0], 25, "a03c0e30ec83406b0a9987cf9d4355b45f26a9f97190df193886d576e335cd0f", "SHA3-256 25 bytes" }, + { &g_abRandom72KB[0], 26, "8df121000eb2c38c9cab237e8e098b6e021ba6ad514da55ca1c1a62f8caaaa9f", "SHA3-256 26 bytes" }, + { &g_abRandom72KB[0], 27, "568b200871d9586bad5912369703c0e89954e063246ca7a778e1ce5e33794302", "SHA3-256 27 bytes" }, + { &g_abRandom72KB[0], 28, "e84cb03accae1b85e27bf7ffcf25c88902a911478823c37713ab2b9aedc79a67", "SHA3-256 28 bytes" }, + { &g_abRandom72KB[0], 29, "94df7a85582b1ed59724d0390851e7b2bf62b99dbb2b03ce0edb660003469a31", "SHA3-256 29 bytes" }, + { &g_abRandom72KB[0], 30, "d8b23f6aecc5824335c5982aa9e02157d97ce719e416184bcc86e101b9c196b8", "SHA3-256 30 bytes" }, + { &g_abRandom72KB[0], 31, "93a281f2175a8da699e0822f8b5ff64035a40d1d3f7de4d52eebca43bc793f87", "SHA3-256 31 bytes" }, + { &g_abRandom72KB[0], 32, "f61d85fc0c2bb5df6992d3c06ee0104be88d8ad9ed4a3d76dd2dd1e8600bbe78", "SHA3-256 32 bytes" }, + { &g_abRandom72KB[0], 33, "eeea3fc3344187d0fc85a2e92d4bb30ac60ab71bd04ef8dd26b6de2821af3e5f", "SHA3-256 33 bytes" }, + { &g_abRandom72KB[0], 34, "5606fae500a3d14548ae4d87ac76cc5b039b430db2c52e85838f3752f90899ab", "SHA3-256 34 bytes" }, + { &g_abRandom72KB[0], 35, "698fc06075518e6bc6ae19518fef105536693ae66e449ae1654737f74d7be978", "SHA3-256 35 bytes" }, + { &g_abRandom72KB[0], 36, "d14d4e67cca9eecda54e575ac70189fcba7ff6a192baec5ed1b49cb31f0798c7", "SHA3-256 36 bytes" }, + { &g_abRandom72KB[0], 37, "26e139c6ee4441251e88fa9140494630dc1330e5986638fd358a1cc43222a1cd", "SHA3-256 37 bytes" }, + { &g_abRandom72KB[0], 38, "22264dc5858425ef089803019321a6e892f7d65e8290ec9d1d14950c69e57ff9", "SHA3-256 38 bytes" }, + { &g_abRandom72KB[0], 39, "a5a7f8b33538b0fd66efa56656801a61f97c12d6fdf145c6a121eb03417e9e69", "SHA3-256 39 bytes" }, + { &g_abRandom72KB[0], 40, "32f01debb886b3792de6be774be4ad24fd29aa023aa73a79912ce2dbe58213ee", "SHA3-256 40 bytes" }, + { &g_abRandom72KB[0], 41, "6db83652a8ace783bf009cc45699e13eaee316554ea746c4ed75628e69698b54", "SHA3-256 41 bytes" }, + { &g_abRandom72KB[0], 42, "af81c002afaa1ce4c06728cdacff430598c434ca7e019b5cc783965d881b257c", "SHA3-256 42 bytes" }, + { &g_abRandom72KB[0], 43, "c3d030e8dcc15924f60982e353c1c59079fae57a42fb064b979c5da78ff1fc5b", "SHA3-256 43 bytes" }, + { &g_abRandom72KB[0], 44, "d33b4edbf75dddcacaf2a547714a934cd001eb9ecd5a2a7f4633ba2868ad5d04", "SHA3-256 44 bytes" }, + { &g_abRandom72KB[0], 45, "a7fc1974dd18dad78c5fe4b649a3e634106f0ea2e8fd1a5488cc9e395618e5cf", "SHA3-256 45 bytes" }, + { &g_abRandom72KB[0], 46, "269fafc4016c68275994c6a48411fa06e97e754374f79084f81a6a3b2afbe2a9", "SHA3-256 46 bytes" }, + { &g_abRandom72KB[0], 47, "d2e95c6b46381bf506af9845af4ad5c34b0a046c745e80a1eac9dbd20ce7464a", "SHA3-256 47 bytes" }, + { &g_abRandom72KB[0], 48, "35024a13cf9b8487e0a1c76815cf085beef986509a07ecb179ebb73db727e999", "SHA3-256 48 bytes" }, + { &g_abRandom72KB[0], 49, "d4012893df1482cdf74dabc4b3394395e9eb11d638e69818c14bb6783575112d", "SHA3-256 49 bytes" }, + { &g_abRandom72KB[0], 50, "b8e4231b19c6ceb78c07dca93131d9dcae75dc263ca5bb00fa857b3863b21ee9", "SHA3-256 50 bytes" }, + { &g_abRandom72KB[0], 51, "f831e375922ceafd5478a277e2c35cef17210a941dc82266e3e0b29a08ece983", "SHA3-256 51 bytes" }, + { &g_abRandom72KB[0], 52, "d54c127b8fd298247c6d31afb17b2849e63b8931527d687e3fc71dd22cd4463d", "SHA3-256 52 bytes" }, + { &g_abRandom72KB[0], 53, "54ac308411c45e3a3b921e027bf4a64d738bcae1aef174cc28fedc5d9e10807f", "SHA3-256 53 bytes" }, + { &g_abRandom72KB[0], 54, "17dd8c4ebba743005f76e97ceab0632ee39b85e4fcf143b343e2ecd159bd9284", "SHA3-256 54 bytes" }, + { &g_abRandom72KB[0], 55, "258e0ff160dee3cfb01c9db942b7cc43388ca4459873251a8f1963ee0d85b4dd", "SHA3-256 55 bytes" }, + { &g_abRandom72KB[0], 56, "0d5dddf6e30c93f508b34987c2747b32d5dad3ea222bf03147fd483a9c65329f", "SHA3-256 56 bytes" }, + { &g_abRandom72KB[0], 57, "01d6132d90233f2b6ae40d4881ef2cb5d908283fcb413482759aa89a14d45374", "SHA3-256 57 bytes" }, + { &g_abRandom72KB[0], 58, "1416bf31ac8140f47135c78ad9ceb01c84ce8c31330c63846cc4234f982d1335", "SHA3-256 58 bytes" }, + { &g_abRandom72KB[0], 59, "5605bb41089bccd61bfa9b4dbbb87043f501a5417f3d93f515693f29ab0701cc", "SHA3-256 59 bytes" }, + { &g_abRandom72KB[0], 60, "108bcf872c5b226c70b4323d1ad61f60a94b2fd1e002c96c4f592cf5f0cc95a9", "SHA3-256 60 bytes" }, + { &g_abRandom72KB[0], 61, "1b0339f2b871802a7a7038cf8825192f84346ee55c04deea5db87f98648c19e8", "SHA3-256 61 bytes" }, + { &g_abRandom72KB[0], 62, "52a82b911a628797ed8071c41a349e09be92b49320b360b2a220dab8fb923d55", "SHA3-256 62 bytes" }, + { &g_abRandom72KB[0], 63, "b043822070550ab5a18340c950bf5676274b4442c770ef5c4301d25b5307cfb4", "SHA3-256 63 bytes" }, + { &g_abRandom72KB[0], 64, "d57eea9e407e20c5a5af4bef5319330c2c06a936bf9d6943ca3cadf3e276c30c", "SHA3-256 64 bytes" }, + { &g_abRandom72KB[0], 65, "e6a1a67b5c72926a91316c81f78e60cff33d90d78f5772b7324a99926d01721f", "SHA3-256 65 bytes" }, + { &g_abRandom72KB[0], 66, "6eb286ad53f1b84d24eb69b4350368ca6630fb381c9f9915442b1fcf0dbad04c", "SHA3-256 66 bytes" }, + { &g_abRandom72KB[0], 67, "ac9f8eae18862b36df72387d31b713fa0c38040e13496f1743081ebd36847cfc", "SHA3-256 67 bytes" }, + { &g_abRandom72KB[0], 68, "1b083e91d0d67d491fe71f87429834606758602a1f3b3a8c6ff9d554fac19d03", "SHA3-256 68 bytes" }, + { &g_abRandom72KB[0], 69, "c3dbdcbad247ae031b7dc1f5800b8857d2a7038f582cd530a8dfbb4634c32322", "SHA3-256 69 bytes" }, + { &g_abRandom72KB[0], 70, "604dbd1b9f6c3a9fcb598ddc9113ef1cc4e38f9f711f1ed6444f71b286a507b3", "SHA3-256 70 bytes" }, + { &g_abRandom72KB[0], 71, "bf2372cbc8fb128c2a4ac54e9acc51c37f73a8d64994f62924cae9c60a9724e9", "SHA3-256 71 bytes" }, + { &g_abRandom72KB[0], 72, "b27584e3b982cd937b73442e9b1626cd7c5e305a2f6d0a5aee11d6a2f1d49f20", "SHA3-256 72 bytes" }, + { &g_abRandom72KB[0], 73, "40caa6117a773cd12bb121a6fcd15015548a7273c0b02bdbf411cab4fc1004d3", "SHA3-256 73 bytes" }, + { &g_abRandom72KB[0], 74, "4e92df398fd4372832411aad4cc97607b56437c41454381a1448052fa951cda9", "SHA3-256 74 bytes" }, + { &g_abRandom72KB[0], 75, "47bbe0d5cfb501764956def15b83c8a8a29f12c20d1e0f50a47226046fd5e2e1", "SHA3-256 75 bytes" }, + { &g_abRandom72KB[0], 76, "905bce96097d868e7b52c77df101afb9003ccd158603cc87c2e73d3aa3e7089b", "SHA3-256 76 bytes" }, + { &g_abRandom72KB[0], 77, "fc69a2b6c2640d657bd9bfcf4d578078dcb13521be073eca0f4c3690573198ea", "SHA3-256 77 bytes" }, + { &g_abRandom72KB[0], 78, "4f6a2ac1ef0ad1a065f48aebd20a13fa1e531f5f0d413fbdf95affe066186eb9", "SHA3-256 78 bytes" }, + { &g_abRandom72KB[0], 79, "57ac8ba842322f02b01d8f0e59a8ffaee945d8f2959712c9a3756b84a40a4a74", "SHA3-256 79 bytes" }, + { &g_abRandom72KB[0], 80, "57870b5575b8849dbcdb16f69c8ad47161f84052c92267b5f24b07a25681aecd", "SHA3-256 80 bytes" }, + { &g_abRandom72KB[0], 81, "ae26a9496fec4d6caa862ffc8948f8e70bd5c59f23b6ce7594a0a2d43a554665", "SHA3-256 81 bytes" }, + { &g_abRandom72KB[0], 82, "21f2317c9c6e10396b03f98696a6c060289323afde658c44e1943c154d4b0e4c", "SHA3-256 82 bytes" }, + { &g_abRandom72KB[0], 83, "d3a8a809aafc9852e44acd88f87a66b4376fa226e2c084ebcddd5a89b59aaa53", "SHA3-256 83 bytes" }, + { &g_abRandom72KB[0], 84, "7222c4a3dc927db4f8b10c2d4b7c4a14315a73f344146f83781e5679e0a4386d", "SHA3-256 84 bytes" }, + { &g_abRandom72KB[0], 85, "5e2bed3edf023680143d4c2ad0fa361e6d1f41842094cf4df908311b54529041", "SHA3-256 85 bytes" }, + { &g_abRandom72KB[0], 86, "13adbdd8f6b753f3c32c896240f043834a15ded83931418f163b5c8201ecaccc", "SHA3-256 86 bytes" }, + { &g_abRandom72KB[0], 87, "fd9c24db36b84a0054bb9f752663b5d5ca77bfff5441c6ceaa65948fc521826f", "SHA3-256 87 bytes" }, + { &g_abRandom72KB[0], 88, "d05fc925bea2dc42d0b10a8100dc746dc7590bc4d15b6f4c0b4ab364d69a81d0", "SHA3-256 88 bytes" }, + { &g_abRandom72KB[0], 89, "256f7f16eabc63b3a080c702737518060e83bf62169ec4f2d84febb1122031cd", "SHA3-256 89 bytes" }, + { &g_abRandom72KB[0], 90, "cdc601dedb0627e8ba5b5a9e53230b8421c4776ffec7e53d0fee0adec104418d", "SHA3-256 90 bytes" }, + { &g_abRandom72KB[0], 91, "c9cc24d55dccaf7b9e5b0de3116d8a25d9f564aab207a07b26c0191502bc1e94", "SHA3-256 91 bytes" }, + { &g_abRandom72KB[0], 92, "f3994256c1745b761b929da74cdf987109b29ee5c3bd6436786bcfdb5358a32e", "SHA3-256 92 bytes" }, + { &g_abRandom72KB[0], 93, "d2881b2c298c424e4e1a478f20f36ab8c55a24c79b9329104bafd024b12f51ee", "SHA3-256 93 bytes" }, + { &g_abRandom72KB[0], 94, "5d2d97b27a328df73a1528d6d955bbae6498f6ef9f3364acdf1f7b83e4a6dee4", "SHA3-256 94 bytes" }, + { &g_abRandom72KB[0], 95, "cfa103153e3746324df951b2d89ca1ccdee67e8e3d97a8196b2581ee3060668f", "SHA3-256 95 bytes" }, + { &g_abRandom72KB[0], 96, "344e10910c51c9486caaaf7550f0687c4b6d5fdbaf66dfe67d6383844104e21e", "SHA3-256 96 bytes" }, + { &g_abRandom72KB[0], 97, "e37ce426d69ed6c9b7acb78bda6a59c08ae1243d5a6cfceaa6adb78f3eca2b0d", "SHA3-256 97 bytes" }, + { &g_abRandom72KB[0], 98, "5c9e2a53a2dd0098e62c47b4a1b22fb64004d65aeb0828030e33be77e828b273", "SHA3-256 98 bytes" }, + { &g_abRandom72KB[0], 99, "5cd4c97198591bf91c6565429ed28f89e53815f7e4dad39be6a215a1c2c4cc69", "SHA3-256 99 bytes" }, + { &g_abRandom72KB[0], 100, "ca908c8aa585538640742c2baa10785e4a5daaf128cc94087bd9f880344660f4", "SHA3-256 100 bytes" }, + { &g_abRandom72KB[0], 101, "6011ab054563f201cdb70229cab8bf19372c47321c3d567af535315c08b6f341", "SHA3-256 101 bytes" }, + { &g_abRandom72KB[0], 102, "99e6a8b95d22e796368f48752b49e2c1760629369e8c1d2fd273bf2b81b7b1c4", "SHA3-256 102 bytes" }, + { &g_abRandom72KB[0], 103, "f708c03570a45f25b9abc9764d7b974fe9fe97b0a418194eaa5003eadaa6d428", "SHA3-256 103 bytes" }, + { &g_abRandom72KB[0], 104, "84619f8a92cbbedeaf50712874f228ad3cd9c9045aa60732a3555901ccdafe2d", "SHA3-256 104 bytes" }, + { &g_abRandom72KB[0], 105, "31af9794fa3ad4614d34eca3727f19814db9edd74bdee043482a2d3ae5590368", "SHA3-256 105 bytes" }, + { &g_abRandom72KB[0], 106, "0bf3834a655045ba00e2b0967a643bce3fa89fc2e5f201dcd5b000b52fad4cce", "SHA3-256 106 bytes" }, + { &g_abRandom72KB[0], 107, "784acc66db73d12a8e49f0319db17e10a0667bafd58576076bd009a629dddf12", "SHA3-256 107 bytes" }, + { &g_abRandom72KB[0], 108, "02f7c426f430b3d082ee899ca85112d3e5286f88bfe0e90f0c623634c7e03c98", "SHA3-256 108 bytes" }, + { &g_abRandom72KB[0], 109, "b438b0781a78ef42a40f680f117b65a592128a197536d115e8b9ed9037f08134", "SHA3-256 109 bytes" }, + { &g_abRandom72KB[0], 110, "6380cd9e9e93dbf931efdbf84ca60560b9d2d18b517485a0ae0199db55e830b2", "SHA3-256 110 bytes" }, + { &g_abRandom72KB[0], 111, "de89367fb625762274b37f205a9318730168616c153400f2d3e6460e49b56dba", "SHA3-256 111 bytes" }, + { &g_abRandom72KB[0], 112, "514a48d1734e4a4ba0d555a72fe48125efd7f0adba027ffa52c722a7911fa806", "SHA3-256 112 bytes" }, + { &g_abRandom72KB[0], 113, "4ae2bf547fcd3610199b96431d634696400c9c139ce813a567da50a71037ebf1", "SHA3-256 113 bytes" }, + { &g_abRandom72KB[0], 114, "84bc4a36d34c6637c470872be38154d31d493d9470b075a0383ddd28cdbe9eb2", "SHA3-256 114 bytes" }, + { &g_abRandom72KB[0], 115, "b863d5691e4c89063e2c2851d992c7f5324ad62e79f68350bbaa8b0025e15f61", "SHA3-256 115 bytes" }, + { &g_abRandom72KB[0], 116, "29a8b23a03b1ddba9a7bf2e95cbd8414ffe8dd20bef6c4895989bc5b98fe409c", "SHA3-256 116 bytes" }, + { &g_abRandom72KB[0], 117, "1d89fe8bad953887b7e9b1d0f356f34b8c6f4961dcc27b634843ff7702635a92", "SHA3-256 117 bytes" }, + { &g_abRandom72KB[0], 118, "60f5bc20e290c189677f4c91ce97a3334c21cda5196c670cd84c076518536f29", "SHA3-256 118 bytes" }, + { &g_abRandom72KB[0], 119, "9ef5150c77dc16e8bbd04386ec076065dd5fb6d77af39e41740d861ad52f9bf1", "SHA3-256 119 bytes" }, + { &g_abRandom72KB[0], 120, "235ebf0c8b52c19986e1a63ca0ef63e88e83343ccd286a09a8e893c9d2530707", "SHA3-256 120 bytes" }, + { &g_abRandom72KB[0], 121, "27666c10e02ac3d3ab7a84a46b6e82edd7610403fdb4fb69527057d05531cfb1", "SHA3-256 121 bytes" }, + { &g_abRandom72KB[0], 122, "5200ffb7dfb207ae1fd3dfa76ca47368f2f72895a4ae91eda4c226d059a28b5e", "SHA3-256 122 bytes" }, + { &g_abRandom72KB[0], 123, "b04bf4eae46d4372ea481637a110c716aa2fe077adba5652ad195c58fe9bdb30", "SHA3-256 123 bytes" }, + { &g_abRandom72KB[0], 124, "dc84dfefe157486e2f705a572af10f73a840f92a6eb55261a776966b046f7645", "SHA3-256 124 bytes" }, + { &g_abRandom72KB[0], 125, "c7fc5d07ae481a3a2c70d7ac1df5973301f416ec427919a1cb1552a07e31ceb6", "SHA3-256 125 bytes" }, + { &g_abRandom72KB[0], 126, "f155c1dd830afeff3964fae4a0944017b8557bbc3304a33e629accf0eb66dbde", "SHA3-256 126 bytes" }, + { &g_abRandom72KB[0], 127, "d31cad30dffc49ae149d3cd369df776a58ac2f5d1deee03a869eb2e8ffcbb1c5", "SHA3-256 127 bytes" }, + { &g_abRandom72KB[0], 128, "6c42f5ff3377b65bceefb5b16bd5048fd7a605b3c538b7215b1c7b6e0126041c", "SHA3-256 128 bytes" }, + { &g_abRandom72KB[0], 129, "b7f894e617320ec30587f0b678f5cc6c238b6f94ef16f1e90935c4f41755acb1", "SHA3-256 129 bytes" }, + { &g_abRandom72KB[0], 1024, "753ba264db6e163510a9f464b231a3eb9284d077f3785e527aaa4e33049f9e5c", "SHA3-256 1024 bytes" }, + { &g_abRandom72KB[0], 73001, "7411763136254c7c9846ba64be8df5797da17d8412ab064f7a2b3ef669e138ea", "SHA3-256 73001 bytes" }, + { &g_abRandom72KB[0], 73728, "8736966ca1364256f5db9cfc1803f3989f5e0a2517cead959788cfb34053ccbd", "SHA3-256 73728 bytes" }, + { &g_abRandom72KB[0x20c9], 9991, "4f343c7135ba2023b9bc918e8926fd55386c9f7d33138cb31f30b89c00b22e5e", "SHA3-256 8393 bytes @9991" }, + }; + testGeneric("2.16.840.1.101.3.4.2.8", s_abTests, RT_ELEMENTS(s_abTests), "SHA3-256", RTDIGESTTYPE_SHA3_512, VINF_SUCCESS); +} + + +static void testSha3_384(void) +{ + RTTestISub("SHA3-384"); + + /* + * Generic API tests. + */ + static TESTRTDIGEST const s_abTests[] = + { + { &g_abRandom72KB[0], 0, "0c63a75b845e4f7d01107d852e4c2485c51a50aaaa94fc61995e71bbee983a2ac3713831264adb47fb6bd1e058d5f004", "SHA3-384 0 bytes" }, + { &g_abRandom72KB[0], 1, "351a6f908eae0c58a7bc6a9baff7778ffe794b2056dec37b5564fcdf5e5aba3fa7739c5032ad7e1fecb7b8764928f002", "SHA3-384 1 bytes" }, + { &g_abRandom72KB[0], 2, "52805f0b7fdf522da3f138d3a1bef821b31383721eeb10de12d503d3359eeb491693cbb9cee4cdb0d3d21122b7e5c582", "SHA3-384 2 bytes" }, + { &g_abRandom72KB[0], 3, "73c573da6e0fe95bf52c74ca90a840f2c7313e1551fea63ce4d52dcb3a1de4d6eaf93bd00e632646bcd073165b37e56d", "SHA3-384 3 bytes" }, + { &g_abRandom72KB[0], 4, "f225dd6b5ca7551c90dd02e8b6cb2897de0d94e51f82122386cee7c9dcf626bd51fe221624a0e1c6f8670ca033ca211d", "SHA3-384 4 bytes" }, + { &g_abRandom72KB[0], 5, "70e82b29ef43e63d66aa750afc62c9a7a50fafb43de8ad25ee2ec48d310a71fe36996cf01ec4a7d0b6eba74a2c9a7814", "SHA3-384 5 bytes" }, + { &g_abRandom72KB[0], 6, "a987f80ad4dd0fd315529233a33233b34af4030e4a3be6ef27992d5e04ee1669a1c7799075a7cc514243f6a05e7b6303", "SHA3-384 6 bytes" }, + { &g_abRandom72KB[0], 7, "b80eb8e14d5a0547c7296376d08af26b3b9bdb4366b355408ad2e8f869a312006ef5489208cad08374c36879be01e54e", "SHA3-384 7 bytes" }, + { &g_abRandom72KB[0], 8, "ab74e8ee36754243b7261d68f82956a70c0e4b3e2a98579b92ebd1c9123c37907760012a8bca8da41ed6bc60c1dcdd5e", "SHA3-384 8 bytes" }, + { &g_abRandom72KB[0], 9, "2d48b90f6b595fb44cccd5926d4877f0a4a31a9d3055d57435ded8fdf97e2b235db849a73406aa8a02708f3fafd94670", "SHA3-384 9 bytes" }, + { &g_abRandom72KB[0], 10, "7540111d23ff8305deba8c60a739da70ca0e78e57a9fe07075f9bca229a13fbec6329916ff4697e7bcac9dc148738791", "SHA3-384 10 bytes" }, + { &g_abRandom72KB[0], 11, "31a3fdafc1a057e487d40cbd5e65d8152d90cfb7362707a2f374851beae1e42f32755001d96848e728afe3cf88a5dde7", "SHA3-384 11 bytes" }, + { &g_abRandom72KB[0], 12, "3f581f6a75f2cf5702a879a3beb2b424e40c066c1bac767d8cfdcd2d4b967f52cfa3d0f7e47b7bc03a50c75ce56080a6", "SHA3-384 12 bytes" }, + { &g_abRandom72KB[0], 13, "ec49f22fc85a6b813f7222c9799e9fc220838462e8948ff46ededd73b888c874f0ddeb2a85dd0c9c3a848f822be06522", "SHA3-384 13 bytes" }, + { &g_abRandom72KB[0], 14, "bae3eb3815b0eec7f834292a21d5de705657a9345e7029599758e509ef2c0fbfc35c13a2c88605d505373a213fc4e37a", "SHA3-384 14 bytes" }, + { &g_abRandom72KB[0], 15, "75bf52c9a95f795a97571e8734c368d023b850dbcae9e33f38b7135a941675914be511e8a3d49292e2073ea7acd1ccb8", "SHA3-384 15 bytes" }, + { &g_abRandom72KB[0], 16, "ec0d76053f71ff3c78f3a35161cc50e90515398597d265f80f0519beec5829783874453661d6c5387fe6b92b63948060", "SHA3-384 16 bytes" }, + { &g_abRandom72KB[0], 17, "75bff0a4214cfc36fdcbf1dc4a156a1ff014c8337b63a97cf4a95edf0ff940e31820e5b618261fb93ad506eec600518b", "SHA3-384 17 bytes" }, + { &g_abRandom72KB[0], 18, "08eec95e0109eaeb5a152e43a96dc4568c02580b0da6f4772dfbb6b93a6fec38db201597ea5dc9cc64c39c190dddb671", "SHA3-384 18 bytes" }, + { &g_abRandom72KB[0], 19, "0797dd6277689061f5590cfb6fc2331c0f0e6d197301b1ffea2b1d87d5bb146cbed54de3dd907c03bf36c2d66b09188f", "SHA3-384 19 bytes" }, + { &g_abRandom72KB[0], 20, "0976f1e66c6e22ac5c42bce96f6fcd0f80ca2c1360ac55d22be5b65cb042a0b226b9c69c38a8221ff9ad15468af3d114", "SHA3-384 20 bytes" }, + { &g_abRandom72KB[0], 21, "efa2a237fa24bfa349f026b49e38243b18dc9a67ab812c802115bf4be4f4d2d38f8982ae17fe2b95e429ead2617b81e2", "SHA3-384 21 bytes" }, + { &g_abRandom72KB[0], 22, "c8fd4c651d40550fa11b25b2e5beb4c82e0b8deb35cbf15774a60ccb59c1e49663ce003d9b9b716ef55e7e9f9698c4a5", "SHA3-384 22 bytes" }, + { &g_abRandom72KB[0], 23, "a3ff1d39e935e7ad9db2006f407aae652101684046d05933a6625e9b41f11365754f79bdeb8c448aa186994360fb5d8c", "SHA3-384 23 bytes" }, + { &g_abRandom72KB[0], 24, "ef3a883129fbe6a3a484c1cf402d6ac4bfa403d9976940643a4e3d3d0aa08dad6f2f1b129b95d9509db392ac1783db4a", "SHA3-384 24 bytes" }, + { &g_abRandom72KB[0], 25, "c38974c59f2d39826f277358aaffd08d96e9a17057b7040ffa996dc0ae9b3ee2c8f99a40de8b14da6668cd48bd290ae4", "SHA3-384 25 bytes" }, + { &g_abRandom72KB[0], 26, "e4342539692f426b15dba992704745e685b1df1442b63c2e23efd725e3fe2580982106af450d640f8fd53dc6e21cd666", "SHA3-384 26 bytes" }, + { &g_abRandom72KB[0], 27, "c0f7bddf4ce882387d733ee4bb61c55f7e85066c13e68bde2d457b6734dde13c1d2970aa24ab1fd9d755f2a4534ad72c", "SHA3-384 27 bytes" }, + { &g_abRandom72KB[0], 28, "66d1e453556618070cdf1d27364296ea8f12b64986250b4dc3491da2c9908c15d3eb731e48d77c9a2ff5ff985312e750", "SHA3-384 28 bytes" }, + { &g_abRandom72KB[0], 29, "e1ececffae0e3e58d2dd4e834edb6365830e28c1fa37046c2368fc3c7a1adf5da4ec9437a9b526db1834e53e409764bf", "SHA3-384 29 bytes" }, + { &g_abRandom72KB[0], 30, "b86f6e5485cd773ac37ed59a06e44d2f68553f2235695988024b84d9ea311db1634124a23021d9879d70f3104ba92bd5", "SHA3-384 30 bytes" }, + { &g_abRandom72KB[0], 31, "853e6213578f7324056b05eec706c976346667051b50ea4f7dbfe8a3752a40c93af76e517b4ae3e849d50b2c41d06b42", "SHA3-384 31 bytes" }, + { &g_abRandom72KB[0], 32, "8d12a1665736d1f197de900387597965701029b3c898e3b4cbe81fe3838b457c9116eec6fd3ede7baa5aa88509af42e1", "SHA3-384 32 bytes" }, + { &g_abRandom72KB[0], 33, "c014fcfa6c0c02f83dd88a2be34f57ef5ba711319f974468a3835b36dc65c8c2a1a6a9f7a58c068d57807228989c64d8", "SHA3-384 33 bytes" }, + { &g_abRandom72KB[0], 34, "d82b000e22fd142f9bbefe67514f05b8b3a59fac3c393a335f12899ad8d60445dfe644c7638e164d08acfe6ebc1477d7", "SHA3-384 34 bytes" }, + { &g_abRandom72KB[0], 35, "6fe7de0e226cbfed362b33f3f2281ec3943a7caec2e824829c24f23a31e3fca9d9e375f55d6a1f64d7b495a4be652bd0", "SHA3-384 35 bytes" }, + { &g_abRandom72KB[0], 36, "b5c28e85b4ce16b6fa15e08290910941e7a3e6db49debaaaea4ac1616e38362daa73974a88b7e058738608f8f7e850f2", "SHA3-384 36 bytes" }, + { &g_abRandom72KB[0], 37, "3a1f8c9a52272e8b167d7df37a40b470820b5ae455b89290740fc02085212aa6e56f874edec5c9026a933a21c4e5b249", "SHA3-384 37 bytes" }, + { &g_abRandom72KB[0], 38, "d1c1b8aa38cb26a57cc31f9e4409a9fbde4f345b85c1c5d0b5237f61aeb9e19aa676b3a58abf5a484d66b83cc7635220", "SHA3-384 38 bytes" }, + { &g_abRandom72KB[0], 39, "81cad2561d80d5278635f1ecccf7e60550fb1276041c18e386fa78392106c000c5f946b0963f176b920f8ed5b2d51e88", "SHA3-384 39 bytes" }, + { &g_abRandom72KB[0], 40, "18d87d1e74d4eedf4ba7816dbc4d0249f69869d4d2a73af5558b7678179344ec89dd3afe4b71171ffe43fcaeed6f6780", "SHA3-384 40 bytes" }, + { &g_abRandom72KB[0], 41, "be04c4f1b70fdbb8741b9f1fe3712e60b56ac1cc3d157856e7dbaa47d0dab9c9ed3677bbd5b38deeb89c805befb00b2f", "SHA3-384 41 bytes" }, + { &g_abRandom72KB[0], 42, "945c8c93784f3bbdb625866bdbc506e20bea661d87de978005a97bf68178c55a4faac033f38d0231cf35af57c3b13c23", "SHA3-384 42 bytes" }, + { &g_abRandom72KB[0], 43, "3c2fff20cc9405f022d4571d30c9cbf2768dc48e95d8eefdf16bd1f5a6d07027baa0a898245dda935efd01226f239fcd", "SHA3-384 43 bytes" }, + { &g_abRandom72KB[0], 44, "9fa1bae02937e2799e4c053814203391991e9492217166c5d525c245f1f898d86ac0c93a6aab4c26159004be867e108b", "SHA3-384 44 bytes" }, + { &g_abRandom72KB[0], 45, "3d05fc09ec76cad99b43b9576d44d4852dbf26a58c7ae6af2d4f211493ff8ce3b6da71e05e60096a8f7d23b9acc795f2", "SHA3-384 45 bytes" }, + { &g_abRandom72KB[0], 46, "54650f8665809f950b92cd1449ed63633d96dff84b349cbca281dc7547d2c2ae554decf114fe32c066608c27553778b1", "SHA3-384 46 bytes" }, + { &g_abRandom72KB[0], 47, "6122ab61add284f058ee45f0aaa209813e0b6503f907259a968e0b0fd706b6bcdd376a37a62e3dcb31e2e5a45e940522", "SHA3-384 47 bytes" }, + { &g_abRandom72KB[0], 48, "5e2aa542591d5148e2b975c41e606de6877ebfcab832a89d4781a91688e76b5a2f30d6d289521d06363c1321975d1cf2", "SHA3-384 48 bytes" }, + { &g_abRandom72KB[0], 49, "6dd1d9bbe2cab7d4ba8756a18a5978a3ab54eae07c068be07d6eb0ebf61f67a810281acff3df609821eb998699156503", "SHA3-384 49 bytes" }, + { &g_abRandom72KB[0], 50, "dafa71cf50e1f80e6200b2280ec2a70fbd820783817ec40d811fa0d7dcd3ca80242d374b11b6c43497f943e610135b97", "SHA3-384 50 bytes" }, + { &g_abRandom72KB[0], 51, "2839c75d8751796c680b9be0029eb3395835f87e653625c9954d161cea78c18d35fb96545ed71f8793cdc5153f3462d2", "SHA3-384 51 bytes" }, + { &g_abRandom72KB[0], 52, "899c196d598401a2167ac88e452f76f1d78f039b4edee7e3f0d55bb6c877afa280667d0c6fbb74f6e4138aa6acd417aa", "SHA3-384 52 bytes" }, + { &g_abRandom72KB[0], 53, "03c3d35a19b5f93121851a3aaeac2047c66cd128f55f7cd81eb6f55c79244571f10e0660e9c8f84408b93e3fb7212b55", "SHA3-384 53 bytes" }, + { &g_abRandom72KB[0], 54, "016841b49625dd79f166ed9e9d0ab6628dc20a45ec41edecf8aae506db8059b51a81379ead0347e02f752839d947e8b3", "SHA3-384 54 bytes" }, + { &g_abRandom72KB[0], 55, "b0873afe8b3b4cb37f34b9afd56bc9c879b58438f2dfaab09c6dc7490285db4a9f8261dc2dec9fb7a9b0ec79a663dfe9", "SHA3-384 55 bytes" }, + { &g_abRandom72KB[0], 56, "bdbbac0fe4dd5cfc6a7b7f4bd8d7d4dfea2963ffa7fc5e3d87d71943b9140b65b36db9b91d512ef37031be3f173e45d5", "SHA3-384 56 bytes" }, + { &g_abRandom72KB[0], 57, "c5205b3182b49ef264f97e1fb04dabe0f6c83409799f77d29713771f4335083e0ebee42b66694913c62131149dbfd34b", "SHA3-384 57 bytes" }, + { &g_abRandom72KB[0], 58, "9324d23c2d96c321e9844808afdf82aa9dd2a13d6f850fa20abc942c77e4628f3632dedb25bdc2a7de81e34d0a683781", "SHA3-384 58 bytes" }, + { &g_abRandom72KB[0], 59, "99017701633107f973e51c25d11a5fa3a05138b079901ba9a3ab2150658bb37ddffedbbd66a9788c87e652c0a16ff963", "SHA3-384 59 bytes" }, + { &g_abRandom72KB[0], 60, "a336e96a7e06f6acc63c9f39a89689e71db54a28e69ffb58b88f97b5422be0b95bfc75105a0baf0d0c88ddb5b9b42b27", "SHA3-384 60 bytes" }, + { &g_abRandom72KB[0], 61, "da0bc2c07c2e5d7aa461f335be8df794e13a696a53dd1be654ab3b15edf4289a36b7cd53a811b7366250ff3437b5b011", "SHA3-384 61 bytes" }, + { &g_abRandom72KB[0], 62, "1e7bc6ca22c38de4b3fd17cde00cd98273a04a3cebad3375544954ce226cf7fe49bfe9edbbb3d611a622ed7057049b68", "SHA3-384 62 bytes" }, + { &g_abRandom72KB[0], 63, "9f12eeb4b46c504538d30ca7ee816ad44d2b2ec9287076ed5fba572663100a14223177545c97f172792cc5dcc121734f", "SHA3-384 63 bytes" }, + { &g_abRandom72KB[0], 64, "d5c58d56e3bec6e7c3b99c2bcb99435ea523eb7b2aac01859d0ba496874a3fec6d7ab9b2c1581543ea19f3363e04e161", "SHA3-384 64 bytes" }, + { &g_abRandom72KB[0], 65, "0261d01bb6498f01ad42cd7a624b4f7fbc4dc9bcb1ba4bcaf94084a4b9bd357819c4cf41a60a2e7d90414e3a10b3dfaf", "SHA3-384 65 bytes" }, + { &g_abRandom72KB[0], 66, "b94a286367a68d69d4c77eeaa5b03cafc1209f5ce04b98f6218a71150420da2fa786d8b91ae4f20c320d380830466eab", "SHA3-384 66 bytes" }, + { &g_abRandom72KB[0], 67, "83355d1f784c7c5f5e97cce9427006706720191ed729f576b989a136aed99eebd835d5c934df5094db8e01d3534bc349", "SHA3-384 67 bytes" }, + { &g_abRandom72KB[0], 68, "26895ff45f1d409fca25c169528d880e811b0e2aa57891b783d9606695e040bcbe9b1ec5bfe697bf80711afb075849f3", "SHA3-384 68 bytes" }, + { &g_abRandom72KB[0], 69, "44744ffeee86553383e311a2f3af39e6a6c0e699794af43be2fb69f07ea843b67cbef422ac14fcf23be79e2150e55e53", "SHA3-384 69 bytes" }, + { &g_abRandom72KB[0], 70, "6d8e393588ee37529e989ef4250c5d4d00effcbbe089ac3ed44ee3212f03162823f264ed1ddb2241302f9e3addd438f7", "SHA3-384 70 bytes" }, + { &g_abRandom72KB[0], 71, "1717d8e9793a0b624875dc9e68c36cf3abc0164bfa3e3d291e36663ca144d3298dffe668726e59984b12ff2c28c9c394", "SHA3-384 71 bytes" }, + { &g_abRandom72KB[0], 72, "b67fd24f2684a0353f94e97041ae439edeabf9e8dcb8c2eacd01821085fc31ed9d2d46f678aaec2f12211ee8118d17e7", "SHA3-384 72 bytes" }, + { &g_abRandom72KB[0], 73, "08fbad7996bacab84baaa84783c57be6144fa1e9306865f3157f59e60986c831c50d24ac67a8db1d957db7e98812809d", "SHA3-384 73 bytes" }, + { &g_abRandom72KB[0], 74, "f7dbeb3e8eec8dc93c8f43e7531208a2bc6d6b18bd6bed67aaa81490bf1e334b926c750f254c9c0b1675d69f93612a4b", "SHA3-384 74 bytes" }, + { &g_abRandom72KB[0], 75, "277012f450a023c70e75ef7bac78ce8a6241bda7f4d9f41261aa77625062654c949fa1642867be894eef4c967e4a3f5f", "SHA3-384 75 bytes" }, + { &g_abRandom72KB[0], 76, "f21f4c2110e24f2df77d6d97e8dd2acacb172f8929b78358a9cd1c4826cac04f11b37b4af205b08c5be16188e4ba4e4b", "SHA3-384 76 bytes" }, + { &g_abRandom72KB[0], 77, "d2ff0145b121a78743806a1af5f8fd054d5a0cf86272179754e05e498535fa05733c70b7f70d872429df35c3441c64ac", "SHA3-384 77 bytes" }, + { &g_abRandom72KB[0], 78, "a728f1b1e30a286d31e8736b95284053f76b68367645bbe30f14838732c6b6d24aaef815a9bdc76fb86409c72ebeee2b", "SHA3-384 78 bytes" }, + { &g_abRandom72KB[0], 79, "d509adc96cf2844b9c4df2008205c3a7b1ce8c2c071c225dc34c724eb79f961f29824f20d1bdc2ed9904822b9e7bcf5d", "SHA3-384 79 bytes" }, + { &g_abRandom72KB[0], 80, "92872f5dd6f71ae3aadc4b717679893069ef2e9712d5b1ddb13d8ae70af58d5be0aed753b6e8a5264dbe37f424e848dc", "SHA3-384 80 bytes" }, + { &g_abRandom72KB[0], 81, "00a8805d752e1e7a8c2eee08b7aad773e18e97bb22814189471c5faceaa0be093315c8ca74a5f2e3b847cae1cc521fc6", "SHA3-384 81 bytes" }, + { &g_abRandom72KB[0], 82, "1c91d79d007353e898080e24ccb64d997b83590cc875ddc4e3e264ca160efeb731f04391197e9b3f135fc116461c0a1b", "SHA3-384 82 bytes" }, + { &g_abRandom72KB[0], 83, "669bcf3fa978752a5b7b4199ce6cf5d876a3073519f3a73330f08b392b9aec6f0305ab52f99f634ffa293dbd852cb7c1", "SHA3-384 83 bytes" }, + { &g_abRandom72KB[0], 84, "ac885cfbf0544756a4e6cd77270cfd66edf74dfd25a4f19181ee762a77895d93257193ca1a60000946b682b635ab6044", "SHA3-384 84 bytes" }, + { &g_abRandom72KB[0], 85, "c32073b1b2cf925ba6ebd130a12b98e34826ef5669a5dc1fa8d3320d2533b27b9065e3565a8c0f8dff044421a9bc585f", "SHA3-384 85 bytes" }, + { &g_abRandom72KB[0], 86, "793462351767807335b0844e6d4878b3ccfd4f594ea86ee111c642d19ef08427071caa3ea2d52a53293dd897c4ce9646", "SHA3-384 86 bytes" }, + { &g_abRandom72KB[0], 87, "2287c449b17f68b63412faaf1d74148b86412ab77643dbe227a06327416b51e9b94116df822a52e0839c856c0cbb1ee6", "SHA3-384 87 bytes" }, + { &g_abRandom72KB[0], 88, "6bc32f874a67eac1366456b704a4d0bd2fc611392f6ff339e8a5feaab217b101b827f89cc66647a1ccea4d739552e3d0", "SHA3-384 88 bytes" }, + { &g_abRandom72KB[0], 89, "e322a1eb4c9d65cd25be405228cefabc757c49f1a1e954e6e2c218108449d5ebe5c444144e3d43c96d5736c4162a061a", "SHA3-384 89 bytes" }, + { &g_abRandom72KB[0], 90, "678df2cffd333044f1dd056e257e2bbf99f0daa0f9ee5edcbe8e0c3bde8c9d5b3338939b8cd7de9039d24e873e3a34f6", "SHA3-384 90 bytes" }, + { &g_abRandom72KB[0], 91, "f5487ff2ec0b0db09bffb7994749a76cff97424e5304ddfe650a19145a667e3ea5128b7455015be20b6fa950803299f8", "SHA3-384 91 bytes" }, + { &g_abRandom72KB[0], 92, "a54f6fe4262eef9b24daf0cd9dcd5f49696f4b0b3fdfa7976c24faf04ea7242d65246844bdf9e774b2db9d134176fe98", "SHA3-384 92 bytes" }, + { &g_abRandom72KB[0], 93, "025aebd069a29ff9145831843819875491a7833ecf2cbb9271f8b9075bc7a5601576706f47c45dabf1383aaf267e6406", "SHA3-384 93 bytes" }, + { &g_abRandom72KB[0], 94, "6b3bee378866a5a886241343219459ca25c4092c47e8498632043f6b20a91d7d51a0fbfc92b75ff8d83ed81d1db8517f", "SHA3-384 94 bytes" }, + { &g_abRandom72KB[0], 95, "02adf1f5edebd714c6b4717b212cad4ad80b5ebc0ea9cbee28b2eb2c16142001f829a42e789b56b05a39347afa962bce", "SHA3-384 95 bytes" }, + { &g_abRandom72KB[0], 96, "2f2257518e832826e833619221b721af3940e053b3fdb493143372289aa9687ffa1f0ede725ebde6a46921f7fa25d0e6", "SHA3-384 96 bytes" }, + { &g_abRandom72KB[0], 97, "1638dd76882713a5da153c466b2c8721432b9b1241cc10ea0e2c4f908ea562ef7db4257c7013e85c63b3451467f68f86", "SHA3-384 97 bytes" }, + { &g_abRandom72KB[0], 98, "dc19989c29044e28ec9dc1a15c8a3f9b3ed428f1e24d7d311e399f42e6b9707e8d26e0b83f426944c92f3ecd9fc145fc", "SHA3-384 98 bytes" }, + { &g_abRandom72KB[0], 99, "98fe06676c51ac2daebebc2541366bbaa44d7681b2606282d18ca62432adfba14bf3025657f45487a5e467d62a907923", "SHA3-384 99 bytes" }, + { &g_abRandom72KB[0], 100, "633e3ca7c740c42deb29cdce84b146d403af6467240f414a01d70a01dec4ffefbeedb4fd7f87ea10ef17fa8e2f95839e", "SHA3-384 100 bytes" }, + { &g_abRandom72KB[0], 101, "265fc450e8fe8a939c3d1c3c3adb57f0c2fab198419743249462b9587f963c5b15ebe917ee2870cd5b88b4a22892b2f9", "SHA3-384 101 bytes" }, + { &g_abRandom72KB[0], 102, "c13be9e4720cbd2dec27b15e39cb348fd36278f09d4a809142256ff943c91400c911ddd685b029798103a07e27d13ea1", "SHA3-384 102 bytes" }, + { &g_abRandom72KB[0], 103, "df4b85fac28b97c0a9530f3658b43861426ce9b7178e6d684a7a19e62527e65c7e02e6a21f70bda08cc7d77891cc1e7d", "SHA3-384 103 bytes" }, + { &g_abRandom72KB[0], 104, "dc5d36d735b0db6ceadb6a89ee9fd71348fa92c6c8b6ff5122364e507f0850a8bca5de046dbaeb072ade79ab90ef6554", "SHA3-384 104 bytes" }, + { &g_abRandom72KB[0], 105, "4405f031f7dc2bff4d4edcc19225ca48f87a6d26863293505a4750f08d37b8acb345e81eb7f3720da34badde724eb8a9", "SHA3-384 105 bytes" }, + { &g_abRandom72KB[0], 106, "fc77e20166999b025d11dbfda2ada5ac55e79a13f5a28834c802af316d8d4dc1daabc884e9f4ac28ef71598c44632818", "SHA3-384 106 bytes" }, + { &g_abRandom72KB[0], 107, "c738f15bed5c991816fece164170da1a13623d1ce841a36d03825f52da5b667b359efaea48d98146acfec23e2292c19d", "SHA3-384 107 bytes" }, + { &g_abRandom72KB[0], 108, "05e12cfe915c8cacb57bf65a298f5257d5991af5276eb21d1a71e5209143fabd52ab18488c50d919dff840fb58f9f4ad", "SHA3-384 108 bytes" }, + { &g_abRandom72KB[0], 109, "30d27e43a3e5c8ea5d246e93325768f578b00059b0c83ede760d591543512c58cd879283ec68907c6cf2786fcc51e422", "SHA3-384 109 bytes" }, + { &g_abRandom72KB[0], 110, "ca8020c153045996c1db89b8a9d8715b87725af59d467d4647140cae82a976b911ca5be702119a8006f3c695dbc53133", "SHA3-384 110 bytes" }, + { &g_abRandom72KB[0], 111, "b902694b31ae535f488ee74202348d3c2a69664f416b1751a009831b660a42584c9a13818da8223b4a597776d507becf", "SHA3-384 111 bytes" }, + { &g_abRandom72KB[0], 112, "7a5b4a263964173138ac85fab23e69e3ee43754bc06a92d712773d78bd182642a0d7640bd1efef9f16dd5a3a4c11742f", "SHA3-384 112 bytes" }, + { &g_abRandom72KB[0], 113, "04fe25a667631b12a421c0d059fd632c9f91050fa219307571c95f927f58838a67f92563a256737f0d0667964d6d044f", "SHA3-384 113 bytes" }, + { &g_abRandom72KB[0], 114, "9253e185ad4ccbd6ad51bd4f9b15b972d187be7b13bec3af0830d4f38865c77726a52b0316b6d8b2fc90ace13b456325", "SHA3-384 114 bytes" }, + { &g_abRandom72KB[0], 115, "d4379a4a6f2c5e13e945089d4d02b19d59e4b5f4566e74f491b5dacf6a3b10539daea4d13f53bfa3506ce6ad0436585c", "SHA3-384 115 bytes" }, + { &g_abRandom72KB[0], 116, "a95251f8b89a5b45e61040ce0b6f9705b863f177ba7fec27f02cead8a7e1684ab3f9736fb4d6ac688937a40a1be791fb", "SHA3-384 116 bytes" }, + { &g_abRandom72KB[0], 117, "61ce9c3bc8fd2d2500ae8f6694c66c918facd2cae77b50dc0247cc25e8f1bbdfe6b6d1e92a429dc9f844216e3b8acf17", "SHA3-384 117 bytes" }, + { &g_abRandom72KB[0], 118, "763a1c60a5356ea751ff166e6e9f9a981af3833fedf127cf9db3df2cd4038ebbdbfce2ec6eb1e3a6825a8810d9706952", "SHA3-384 118 bytes" }, + { &g_abRandom72KB[0], 119, "c93f6d4ffa7fca49127f0b3a85555e048bb8984f62f31303614d582757829917292da620a248cf482f18ab61d299e0fc", "SHA3-384 119 bytes" }, + { &g_abRandom72KB[0], 120, "ea255bd5294daf26e46c36333d677a445269e0a5e1cef27a4123c120afb19a6c5ff9273e849c4e0ff41be657ce484293", "SHA3-384 120 bytes" }, + { &g_abRandom72KB[0], 121, "4830fe904db9b4b17766a5fe346720259805e7e02798910c0134377224e4632af0e451e01f1e878554325e203d1650b6", "SHA3-384 121 bytes" }, + { &g_abRandom72KB[0], 122, "99781b361e73d5eacb0dd02f2f87fe4a440b14942756aec6f8afbec276781315782bd20fee1fff2a4f2a77057d797748", "SHA3-384 122 bytes" }, + { &g_abRandom72KB[0], 123, "470d3d508fc216e1a1e6b7d98646a01144175758421b0945e934d7b3fd43963fe61517d99757565868d4e94dbff56cfc", "SHA3-384 123 bytes" }, + { &g_abRandom72KB[0], 124, "8a9c1715fe95519a8f5b3978c581840d0dd1feda450f28163b5c0497111e04771ce90b31d3c786075092d89c167e2007", "SHA3-384 124 bytes" }, + { &g_abRandom72KB[0], 125, "8cfc174c8567f4a7cdc02b11db37dd915a28b3da8099f803a8440b6bf6b11bfd7afbc26b0c0edee50500ba26bd41eae7", "SHA3-384 125 bytes" }, + { &g_abRandom72KB[0], 126, "fb89ee296bb8ce1ff1f787dafaf066aa0543bc154a7b2b5f395150e16d30dd9411fa9a455106e478119f7bf4f3445f04", "SHA3-384 126 bytes" }, + { &g_abRandom72KB[0], 127, "02021f9486fdfedba2b51ea503922f2e4bbb5a0c01b4e0f4c5a7c4a22193c69333eb6f1b4496dc23fe0cdc3f09125cc3", "SHA3-384 127 bytes" }, + { &g_abRandom72KB[0], 128, "bd0b400dd2869c5332a041e8d8264f445f2d8ffc727f5efa38745c5a81981af6acfec6b8287543bf8100aad7cdd0b375", "SHA3-384 128 bytes" }, + { &g_abRandom72KB[0], 129, "9a5282d4d4993ac395462551adc75feb644fb97bf4ea9d5b582fdf98dc0e7b70f9b075d150d11b3c8960629ad46a4de2", "SHA3-384 129 bytes" }, + { &g_abRandom72KB[0], 1024, "f1a46e19369d97b0d3e50a23690d25d95592647d118cf0433d309024d7ffc11a69e172bee516f4e69b4a855c05a0a69c", "SHA3-384 1024 bytes" }, + { &g_abRandom72KB[0], 73001, "6ba059a8af7d72660261347867e5308a80ce4c41159237cf6aabdd03cd86fa9e38a9c93b37ea86c63afb7e3a61348355", "SHA3-384 73001 bytes" }, + { &g_abRandom72KB[0], 73728, "e69e5ab83d5cfc56bd36fc256229344e74d50f04de6c0c6a94adc7ccf674fbbbf8f9694dc1dd958cb41f0a65a78fd8af", "SHA3-384 73728 bytes" }, + { &g_abRandom72KB[0x20c9], 9991, "0a2f284b452e440815778749ce156a666178e771f27b06b44bf55dd10a7ddbdbd0e149dd1112fb61666812ac9a11b213", "SHA3-384 8393 bytes @9991" }, + }; + testGeneric("2.16.840.1.101.3.4.2.9", s_abTests, RT_ELEMENTS(s_abTests), "SHA3-384", RTDIGESTTYPE_SHA3_512, VINF_SUCCESS); +} + + +static void testSha3_512(void) +{ + RTTestISub("SHA3-512"); + + /* + * Generic API tests. + */ + static TESTRTDIGEST const s_abTests[] = + { + { &g_abRandom72KB[0], 0, "a69f73cca23a9ac5c8b567dc185a756e97c982164fe25859e0d1dcc1475c80a615b2123af1f5f94c11e3e9402c3ac558f500199d95b6d3e301758586281dcd26", "SHA3-512 0 bytes" }, + { &g_abRandom72KB[0], 1, "4ee7f324651207f39d805a7316fa5fea29f4b220f0dab62c1b1543e9bf8bcca99f23717cc1a760ef1aa899b81457bbdcc03735dcb77826d888247349454d1db9", "SHA3-512 1 bytes" }, + { &g_abRandom72KB[0], 2, "a37abcdae939bea2fca0098ed2605ce1ee435323afc3b25ce0cd3591e91ed0d14f8b5b472d7b24c6660fd56af8a738848b472f26582fbda90a76c8050d6c2a12", "SHA3-512 2 bytes" }, + { &g_abRandom72KB[0], 3, "990d4cbd76529cbc6eb12e4da80ddafbd3400c4914aa6123aec0afea5620e1bee60b200125219911696abc77d62916c39755247a198084e3fb75252c093bb5c2", "SHA3-512 3 bytes" }, + { &g_abRandom72KB[0], 4, "a4406495c343b9c3b313cba6013294afd81fe23374149906074dfb4b596269e3735c98d7e2b1499a05f6596ea0a7a7e1a82cc85032e94bea71a0e6a775bcd18c", "SHA3-512 4 bytes" }, + { &g_abRandom72KB[0], 5, "f84d7503d3a0ca641b3e095c27afde5a273a1e6e838529d872215b0429a7bf27707b943780957441904395912fafe60b429448759f5dfb3e5ff32fb38dccb099", "SHA3-512 5 bytes" }, + { &g_abRandom72KB[0], 6, "525662195aa6f59c6df3f289f2806d5ae273a173bb1d0c3ea1f81073f75ae79b4771907641e6bf8672c0e84f1b978142fb416ca65c3bba0de351f2b8d848ff53", "SHA3-512 6 bytes" }, + { &g_abRandom72KB[0], 7, "821cef685d761af82b4306e1ae57f94de06c1e447b68eb0f928b50d48efedf36a6d98f0e6af966d94632bf135fccba4afcecce2fb7d96bd556877f8b35826fba", "SHA3-512 7 bytes" }, + { &g_abRandom72KB[0], 8, "7e01e3c096f03241c590f228863ee9c412cc209d0234452f28f5e52d238133fd91795b7a19ba0e6a6187383eb22749b5ea0fdefa327f824bcfe5ded0128abdcd", "SHA3-512 8 bytes" }, + { &g_abRandom72KB[0], 9, "1cb4b2dc7e3bc947c8b99a52e538491e7f05a86877895917db1a24dcfc68822997f2bf1cad9ab63d656b4ef7cacb32109bc2e4befd87755645cdf44e4b177405", "SHA3-512 9 bytes" }, + { &g_abRandom72KB[0], 10, "b5db597d408db3e664422e8723a3f03e42e6302ed6765fded67e35406e73f9edf3610f63287059f1850c57a6d460fda1eead440e67c65ff60f28dbc9fb886225", "SHA3-512 10 bytes" }, + { &g_abRandom72KB[0], 11, "b43ed646049b4d7067af01ea26c922f877cf1bcb83fd42ad7ee02ccd4f79c9bd7fb5c5c9e6538c67ba46f3ef7537f8b7c1465843191c17ced4d59d1a534091be", "SHA3-512 11 bytes" }, + { &g_abRandom72KB[0], 12, "844eb1bdc2bda7a7a142c6769ea7f7c482457e6e025789125b43be6d2a10639ce939c4ec4bb80cf5113e7e3f608b3c3587c262fdba05ffd9c56354e64085d052", "SHA3-512 12 bytes" }, + { &g_abRandom72KB[0], 13, "cfad914dc4738c54fede2b0bc0ba5f0d657d1a120f38c2d4dfa79528c210236a03cbcd277852413ea64d2e5e54659772e69d9b8af6c0df4aece7da71097c17bd", "SHA3-512 13 bytes" }, + { &g_abRandom72KB[0], 14, "d7fadc895847ca55425da98b51cc12c38dac301475a0517cd7ac7b40fa328809e0edc07a3314409df18759dc03f30bbbdd5d78ed6755a761401b19b4c3426a99", "SHA3-512 14 bytes" }, + { &g_abRandom72KB[0], 15, "46c539de6bfe7da9d6e145c8e73f9ad4a117b55a59fd0a913e3f56349f02f1af81736293e55f3439da7d8f7e6799fbbb0d76fd77d2b0acb0acf78ce08f775245", "SHA3-512 15 bytes" }, + { &g_abRandom72KB[0], 16, "81cf0210eb63ec45bbbdb3105ed8ae148452e4989f0910e6ea857ad6beb4f879429ef521d649153c435210aa4edcf9509941460c10a2b9c26173dfb862e8f4ef", "SHA3-512 16 bytes" }, + { &g_abRandom72KB[0], 17, "9cdd116f054627a52a1b323c42d168855520291d91a3dc7fe52ea3d4119d44e7a650b6a27e9041d37057e51a48c183ec0c653d21d5435c6d8cda6de300644b69", "SHA3-512 17 bytes" }, + { &g_abRandom72KB[0], 18, "dc4be84a998b02b19c95d06486fbf02128742a3499adb8b720c4b63483c64ba96b11ac8769138561991f90211b7c0698691a852f949b843db968e481cce9a12a", "SHA3-512 18 bytes" }, + { &g_abRandom72KB[0], 19, "8c156e9abe6337b23af7d82c15b7aef03118faa0b539f0eadef72ab0258f78e6708741d172c4185b420fa8a21b885c32ccdca1543eb9ec35d188b30254e0702e", "SHA3-512 19 bytes" }, + { &g_abRandom72KB[0], 20, "b038a2cea0052814f2c29cf4815211d3d8f006a388c9c166ff20c9b214ffa264f68fde4842bbc773254f8dd4df10e98287cee82c85fdd170ac7ed2999cda0095", "SHA3-512 20 bytes" }, + { &g_abRandom72KB[0], 21, "35ac6d2727b4af76144ac58cdb84f662d78855d76baf22411c75057ca31a86fc11e7c06248ef87661467d394428dfe75f5b88121b7e762920c3cf32a5ba0d6b1", "SHA3-512 21 bytes" }, + { &g_abRandom72KB[0], 22, "7add7d739c6f31fe25b30367853f90c0fd9d7416c20ca2778e527b3d4b876b5676ea1610db6df508e1b6230c67c6e9f5eeb60de65b2f7cea85064eb7ab21771d", "SHA3-512 22 bytes" }, + { &g_abRandom72KB[0], 23, "6dbf5a243571b4c3e03786a1978074d06fe78ba01ee73de50e165bcf461018f96c6eff1d69c44dadae3df2e1d406a207208c684cb04cd38e679bc883bf95e4d4", "SHA3-512 23 bytes" }, + { &g_abRandom72KB[0], 24, "c2d88cd3da3db0883c01e622b40f93060ba176710e1f9988e94748a77a8c5c64cd461b4ad5190ac5a0a66294713d097478b0ea0f49da2f737d9208f4f844a509", "SHA3-512 24 bytes" }, + { &g_abRandom72KB[0], 25, "3a7146eda5a22fdd53535da6706399c74ee9848cd2cd11944575270b994c7713c556d96b38c0b92b8592e8fb48fa79816cca982b56c673f7edc919d4f50b888a", "SHA3-512 25 bytes" }, + { &g_abRandom72KB[0], 26, "23a48b562fa85ad25d08daa2c14bf47f1dab9edb5fca761586b3418c1672aa9297e5681c24822ec29a2e42c54a019d949c2464a52c3456aa5e435d452510730b", "SHA3-512 26 bytes" }, + { &g_abRandom72KB[0], 27, "8aabb979e65d5c332cafb4ae5edb58437cbadeb13d8f7d985cc8dc0108060bca616add6c6be22eecf3059822a9f154471f690f3e1dfebce88c4c42533597ade9", "SHA3-512 27 bytes" }, + { &g_abRandom72KB[0], 28, "0e3bcaae03e672848cb3bbad4f21cae7043a0a0c51c6f6bb0870b9e33f7f8fde86200212d0e5f25a2c5eed1cfcafc76f477a395b712b55071a139ff7726d6815", "SHA3-512 28 bytes" }, + { &g_abRandom72KB[0], 29, "fb5a3094c42e4917388edd335c8c32eb8f1e2f5789329b89a9775ca84cd43f8f4187d8ab334bad952f21e426dca97a9f577a13d21cdbfb92cfb2a53d99c0c530", "SHA3-512 29 bytes" }, + { &g_abRandom72KB[0], 30, "0be32867a3a919e9a2ba2ce700f801e7531e35c38897ca99c915b2796d215817ccdc64efe4a8aeee354ec0c68c1dfb6cdf27922d5340e89d86dc096df3c68dc9", "SHA3-512 30 bytes" }, + { &g_abRandom72KB[0], 31, "33b0b014160167c2e1b893275f6c053156471cabfc20c13456302053aa8d96ba517db68322dabe41d3b990cffb6ed9ec7dc2a9365b92c94094fdc0e4376e4c80", "SHA3-512 31 bytes" }, + { &g_abRandom72KB[0], 32, "0b532c07abc6739767601ddb0798b22bd0c7687a14ccd79bfaaf94276bd9d158c589d99ce845b218fc044ba3aba3f402f21aeec67d1b71fdd962df481701d89e", "SHA3-512 32 bytes" }, + { &g_abRandom72KB[0], 33, "4e4babce8b0e0163388fcd1d3c81375949e9ff42c3ae97452b6c54875a8c5bbd684536991ee68fcc0422c3d892c3fd49ac1ec8938e416db3eac69f3c038709dd", "SHA3-512 33 bytes" }, + { &g_abRandom72KB[0], 34, "bc67eb2b32f4cafbb395cef79781069cca2f15384896f9bce8b82af43073c6446675878c1c8b7bb2a5fbadd5e8296d3f35c02b9135ed4313454ecad603d1d8c8", "SHA3-512 34 bytes" }, + { &g_abRandom72KB[0], 35, "2fb234bcebd0589cdf5cf30fa8d593d21e9734428f166d1c4dcd44c938f70ebbbe7f9d8f7089edfb3925c0d1c45c1b0db1244e2de97646282236f5e8cb517504", "SHA3-512 35 bytes" }, + { &g_abRandom72KB[0], 36, "0d5069bfed5f8c77cff581cbb340239624a55d34123d138e110fe783d648190da2c3a4b2cd5e72d98223670a4435bfd8005b9305d6526fda164a5a7dc115cf8b", "SHA3-512 36 bytes" }, + { &g_abRandom72KB[0], 37, "2c14f8534e40a03e8b4882c2751f818d2a4ff5862d0489c8111ce002f507ed215fa7efaa68293f5b50e8bf73c665bfb8a257a18f82b14809abc6cb03c4190547", "SHA3-512 37 bytes" }, + { &g_abRandom72KB[0], 38, "0351c1c8507264c7a63bf148e7fa7d475f147c148ac9926ad6fd00f92815fc0d0cff79b2a57246757af6de325b186115c0152f89605edc9ed3fb8e74b0bf3c5a", "SHA3-512 38 bytes" }, + { &g_abRandom72KB[0], 39, "2c25e88aad094ca1c65e8b4f4cafd03719a2af9e470e540f454297c245a7d1dc4aa6ddd8daad23ea682d520fc25368f8c58eefe2a977a0856b2fbe69bcfc6802", "SHA3-512 39 bytes" }, + { &g_abRandom72KB[0], 40, "94e315fd9972515fcb737a4aa3131ec6c329d628f5845401d12b34f0b47d767b57aa5e1e1321324d301a18f0a678b9619819548e87d5f5eb7043505ffaa9ea56", "SHA3-512 40 bytes" }, + { &g_abRandom72KB[0], 41, "d3d7fe9f5cab99b9b3d6dae377e6467eb8330ac54248e281a44c2c42877de5e2b63a2c3923d0d2760bbf27837e0646df797f9687cd4a9a7a99047be9681bec13", "SHA3-512 41 bytes" }, + { &g_abRandom72KB[0], 42, "0fb6d3488f202dfa56e37f20269d17e84556c9cb9f28d2c7c5e66ff64f4557d17ca5f67874a97c0f73fdb71698cfa576eeeffc8cee7b499ea1335257102dc5ac", "SHA3-512 42 bytes" }, + { &g_abRandom72KB[0], 43, "6dd66ccbb5c5e95f92d6e55b4bd159a96045d39a87c2c8e3db42abbf01cfe36e92b326aab17d42441a5717da4518884669d0f43d43453dba7a744167cda8f41e", "SHA3-512 43 bytes" }, + { &g_abRandom72KB[0], 44, "afdb2b1b74767e6b26b96d174a89fe5efb3205c3aaceb6e067631a4e5834a067d9d74248556e32661ee50fc7aaaf49482a33a6fba3a24e19a7977c14af092643", "SHA3-512 44 bytes" }, + { &g_abRandom72KB[0], 45, "d68f05c24ec746168af39ea279987643189c239f981173691f462296b682b320bccadc463fc4829668736ba007e47118cbf35b4d957d1758d5a1d3b0b5e3f6aa", "SHA3-512 45 bytes" }, + { &g_abRandom72KB[0], 46, "03651133ed68ee78daae564e84d6749ceb7ebfed83b1db48dd19e37447f3efa0e2e18d844a3ca017c47fbf027460f9a8f37d6014ffdf6aac48f030ba1abc23f3", "SHA3-512 46 bytes" }, + { &g_abRandom72KB[0], 47, "5629f7274311cd562e91ef70dbfdec9f09911ab9808407bb66cb4da61520dbc33f1a4aa1c4e8697e8c78b69d99eccfe1ed85e84420e1c7da492392959a5f3f2b", "SHA3-512 47 bytes" }, + { &g_abRandom72KB[0], 48, "12e3c5cef70c5a6dabc95eee03b892787872f6d32e0d9371d89fced570b4e40d97ee6eb143eb109425ed56f6ee213b86de1ab2a028999fac519c77c3f26b3276", "SHA3-512 48 bytes" }, + { &g_abRandom72KB[0], 49, "7e3941a41eadd11873df6e587275e9023626a3f5f21feac2691c7ffedf3be953bf8e72640d812ff3c286c0c59b1d635af071eceecf40a2501183dd32982e60da", "SHA3-512 49 bytes" }, + { &g_abRandom72KB[0], 50, "e22da00a967377bdef1a65449c30df64847af91aabe4cb9b847066bc2453f8b3feb20614440b1718253ff8121ae0e385dc29c07b096dbb6a9c128660cf2d201d", "SHA3-512 50 bytes" }, + { &g_abRandom72KB[0], 51, "915467a10f3e111ac7c7fde607aba3c9147be30d36516b43d4486344ba459eb20b9aca443b2d0173a0cf2230e9045589369fefab7d6d053048208508ea86ed5b", "SHA3-512 51 bytes" }, + { &g_abRandom72KB[0], 52, "e6f45a0d9346e02b21e4ddef0ec776c65dea326af0b763dffc31eac2449506d723b1425e9b675463c63d4cd8c28533b76d50fbda2a431f8de6de62c1faf98352", "SHA3-512 52 bytes" }, + { &g_abRandom72KB[0], 53, "bf1e3f13b1f26ce8fbb8dc38d4f061765f90845e2fc0527f0f010fd71925a0bef2e31e96b9b2c379a27089c5dad504da161741556c6a6570a0303e71146beb2e", "SHA3-512 53 bytes" }, + { &g_abRandom72KB[0], 54, "5c57863608bc36390c697b82f30ee2c8f2d6f65d024b46b7c74f21203cf720e1a58e1bc8c42e203db4458e323ac3208ee6892ef106f5e2ec04cf89c5a6d04c93", "SHA3-512 54 bytes" }, + { &g_abRandom72KB[0], 55, "65c1543ab3f5354882aa55050bd55f7e9d317e405352dc7ded30ae3dfd92f9b3191ccf0e616c963d4e5ebb45a5de5c880345d890fe3fa5f0695efb749e2b64f0", "SHA3-512 55 bytes" }, + { &g_abRandom72KB[0], 56, "19c31282083102e9ccb901d617d7f676c10e10d93e718732bd0de93a42417cc7b9d30c3c59ff5ae1b39fe3ceff46d4a38be6f8276435c3183a4e2d6f4d062a15", "SHA3-512 56 bytes" }, + { &g_abRandom72KB[0], 57, "9d1cfb089e112b391c20a649827f4e33be7ef24f902f7d7a9e51523df2f77ec80ef29364ac34f74199ff1ab96d276cf1d4f9d39e755221c14f993d1f84b3e5ad", "SHA3-512 57 bytes" }, + { &g_abRandom72KB[0], 58, "2905d9b5f8e24bbee15b576084842ed5d81570369a4fca15f1a588e093d84949edf374e2b25bd845482f93f8d03e92f52d8179c4ac356fbf12bc0591cb8a6217", "SHA3-512 58 bytes" }, + { &g_abRandom72KB[0], 59, "30bbd30b7b90c8c2ef65310a4d0ae0918c8e8f4c3b116305cf5960e5baa2c7d98e763d18993784e277ce6d51345046724626291c76b0293139074c31ad3f60bf", "SHA3-512 59 bytes" }, + { &g_abRandom72KB[0], 60, "50f508336ec07572733d1e725218916d1ecd578891d49ae514e0de3d6175b50c4f5556d8b93cda8743cf37acaf69ff278e2944913d05bd9a13ee959d2616279e", "SHA3-512 60 bytes" }, + { &g_abRandom72KB[0], 61, "e9d0c5b876151523c3cb2364d6c4788f37bfcfde0196c68b626418035929ff6c2a4c470d1d04b47d445b23144a529fc78f4cbc77aa4d04a0ee4b6aa2a699166f", "SHA3-512 61 bytes" }, + { &g_abRandom72KB[0], 62, "b7e3fc3d74d63179b8832383c202e35b2f701e5457729652f7eff37bedc5df0f94548765d0b16d95d0b37c3cac1ecfdba5ca8cbabf2a72bbcb2f3313782976b6", "SHA3-512 62 bytes" }, + { &g_abRandom72KB[0], 63, "0b47cb66418e1c6d41389c2191eadee2376db5db7808a6e2e3245ed7820652da63361c2e65c3801fefa81bcf580477a91b11d2377dfb0c3e5b5f08e49d46cc40", "SHA3-512 63 bytes" }, + { &g_abRandom72KB[0], 64, "cf6365be34524c4bff524832f2d909e442428c90294f71bc6b7b38f26d53e215bfef34b89530e9ab0089c589dde9938bc97d43f9d429aabfee3af95ae1b4cfb3", "SHA3-512 64 bytes" }, + { &g_abRandom72KB[0], 65, "3e4722b8bc5b8e4ed1e10896949cb29fbf6985eec29b4d9e6e4b0c9411996a3c34e9fe5a08bd7c962736d38bdb5aa65d432bc1e35d2f5a66709e9b0cb8cf786b", "SHA3-512 65 bytes" }, + { &g_abRandom72KB[0], 66, "73520db68703a4704ec6a521d5e5aeff2d5dc26963e8ba64db5d2c890ae5cb20a206e4c887659af80436ba592c7451b24c9739ff444831692a89fbbc5663c410", "SHA3-512 66 bytes" }, + { &g_abRandom72KB[0], 67, "83a6eb52acddffb2a4b01e65eb300811bacddc8d0b303cd103ddad85431cc7731b19dfa65404e0012a6776ed904831a273d2a530c181f66e6f1591c10d293916", "SHA3-512 67 bytes" }, + { &g_abRandom72KB[0], 68, "9931cccc3c7e7ef3713b5fdc3c03fadf9c95ca94d03ea36da20d060df7af0e1c1ce985d147547052b2410d582d21552d864a7869f7b25eecccdbd6c044a5112b", "SHA3-512 68 bytes" }, + { &g_abRandom72KB[0], 69, "492d08d8a38c0fa5524979765335585189c113a922481a468e782b2dad23d24415881a2998f46373f1c163cd1ca8a5db6856520e61b1dae443bb2fe95e54e189", "SHA3-512 69 bytes" }, + { &g_abRandom72KB[0], 70, "2b16f2c83901434ca4bb10565b8370e408a7766e7df26ad7c7b6c304bb299654e8e5cc3c4c8fa4a7039f94762dc24f1dfbec782d590780042f5afc6c807da93b", "SHA3-512 70 bytes" }, + { &g_abRandom72KB[0], 71, "923e4055b04dccc21ec30f1234fbd5ca4a917f2a38218119ebf14d664207b31ff706d1979f32e81fb0f9fdbaca8e7f10c255e107bc3f14bf353d9f09d1820ad3", "SHA3-512 71 bytes" }, + { &g_abRandom72KB[0], 72, "4721edf451ffb8c7f367b9c5aef47d32932ae03e497786adcc51fba635148d2e4a9a2ef779700eca36273ac33c7f66ed5ad59090601b4d98f27958b90b195074", "SHA3-512 72 bytes" }, + { &g_abRandom72KB[0], 73, "bb21eb1d4887ea6ed89f1cad785c88dab259567bc3988d85ad1a6cc0bd906d41862f7bc748176e691a79eefa2c679978bbcf7463e1dae772432985e01b713b31", "SHA3-512 73 bytes" }, + { &g_abRandom72KB[0], 74, "9dcdd22af755313131b64b72408bea54b4aca212d2ea7f62763c60f21860bf68bdad60fb80e31dea30a291ec74e8e98db27886b96dee09c0f3a2c555de283cc9", "SHA3-512 74 bytes" }, + { &g_abRandom72KB[0], 75, "73aff791c665b8af2606fb23418cce72cf6093179d7025fc29ea3592122dd9a27fdf85c1179241c28b9b945a5597ba17600342c8025e212b1ff95e571e3fdb63", "SHA3-512 75 bytes" }, + { &g_abRandom72KB[0], 76, "6b81bb06ecd0c10c7ecbb20c303941cc04c2ab56294b1dc22ad0bc0c9dd039ef31aebb10fe9bb13499991bd5742a4887fa220b2e74d91af40998649b24470821", "SHA3-512 76 bytes" }, + { &g_abRandom72KB[0], 77, "8cfacb727fd2ece3601ea7da001ab1c62dd6412c78a79b6960927d90a4daafefca7ceb1f025d05d7fef11ce36402c73c6d41a1fe917ccda47a119f8816a58d6b", "SHA3-512 77 bytes" }, + { &g_abRandom72KB[0], 78, "1f02f1c2eecb7cc1247e09efcc528a151170caa7b45e426dac0c7f7d57201b078c0b2bc461a2585575b0f704e2c048ddc3db19ddf48df7811e6bdccd0d3e5f8b", "SHA3-512 78 bytes" }, + { &g_abRandom72KB[0], 79, "e1a4f3f7d00c2a4b18ccf13ab5fb4ff073db381f6d31e8b82a3d476608e9e4685f0df71e4c59cc44557caae72f32591d5aa49829ad2c2a868c819f71240619a4", "SHA3-512 79 bytes" }, + { &g_abRandom72KB[0], 80, "bc865da84d88fddd29e45b9bbddaded9e9011fb2e5277b3be1bb09b70d90d66e7ea1c57360b8d9defc40538e960adb356308efde38d22ab5eb74db91325c7bb1", "SHA3-512 80 bytes" }, + { &g_abRandom72KB[0], 81, "a505111a146ad2713f6aa57a67a3e73c8f458ed5d943e1f081a9ecc484ab1da2f0157143bfe0e9a0a402e5514d165c76ef2879a772823c5f841805f09840116b", "SHA3-512 81 bytes" }, + { &g_abRandom72KB[0], 82, "409131dd1171d05d96e2013a80ef9d44ffe39b39bb4b630f73d43fa9e0da4b9719add8cacf14406e00e5a14bb181ca7e45ee0264d81e5977dc5a0ede25c5a6c1", "SHA3-512 82 bytes" }, + { &g_abRandom72KB[0], 83, "2930270075ecfdb960ba6696e7c158f56142fc969ffa1b77e89e36a1694b26aec687a12f865cc5c1ea75a0f318d8e7180715848d77d24959d0b428cd50b8db10", "SHA3-512 83 bytes" }, + { &g_abRandom72KB[0], 84, "6a271f6d548c3ea27cdeca450e665c7370617f5309f629c18d1756b26d5546b18dde3af83ef79c1aafa70b0574f4d3b32e6d5d8fae359b810f37a6ed41013990", "SHA3-512 84 bytes" }, + { &g_abRandom72KB[0], 85, "0484e9ddd706b1c13f595824f63ff24df87e61aeb029da69046118f269b247a682ec0106d774e1708c1c6f810bb10be8f6844b10f1f82e03ddcd8634aa72e693", "SHA3-512 85 bytes" }, + { &g_abRandom72KB[0], 86, "414e13451dcc5cd997d384e7fcef8a6b0cb95a5eb75748a97529c424104bf4810fb7618150cff96940e41e1480c47be67d331450d8393760ec07302a674f7fed", "SHA3-512 86 bytes" }, + { &g_abRandom72KB[0], 87, "a7653579f7740919644a229ff3e812be4d52afa49035800e42969d3fcf16f915c1cef0664ea59edbba8643aa84a96040bd2659992733c6c78877b5212164718b", "SHA3-512 87 bytes" }, + { &g_abRandom72KB[0], 88, "f13ed79fe8185f13f3eab7f47ef5f17d1368c86c558ec76f4653c10db4d4eacac6a1adab465d8f8170e37fb1038d34c4238330f2878087116b0011e812e5f13f", "SHA3-512 88 bytes" }, + { &g_abRandom72KB[0], 89, "477f9fd5978cc2b56793dfeedf2001a24c8813c052bc391bfa0991378bddea4d50953083309d5fef8b150a06f2869200858fb0b045d88e94cadb569b74eb4ade", "SHA3-512 89 bytes" }, + { &g_abRandom72KB[0], 90, "c41eff28b115c8121b76cfd9d8410d292e9d8a7e1cfc954334e32ebd1fa1166f0f425e21ff4d5898ef824ce6617ca0509e7515d23e64cc2f4e88e376cf25c8cd", "SHA3-512 90 bytes" }, + { &g_abRandom72KB[0], 91, "710cb43ac749bf771d9c86a4f10c2a137ada8e1ccf18df635149c769954c7dabcfbc37c650fb5e568169f34d5bd4790457d4f8550bb8f0bf2f54a74e1473cdcd", "SHA3-512 91 bytes" }, + { &g_abRandom72KB[0], 92, "32aab1bdeb8d90becf600790aca16f4e7255923ad78e95e1733d3b4b11f51eb7198dedd4368c15647e5748fed5e0d9ada2af098b0b3a7b22fb3075ee48e4dfab", "SHA3-512 92 bytes" }, + { &g_abRandom72KB[0], 93, "cf97dc9c3f51a0ffa92379d33e123e0a2e1849b0107d69ed346d5ff841d7bb39c289ff7f8941200e0a23bb636180eeb9b04942bbf344d877f5306e498fc6ec73", "SHA3-512 93 bytes" }, + { &g_abRandom72KB[0], 94, "3b3dfebb00a8731103b54ce0e04903ab020c857dadd08642e8757c44afaab4b7d94cab2ccb9787f2a874004677d22780cf41c12df1fa0fe1752bdf672261327f", "SHA3-512 94 bytes" }, + { &g_abRandom72KB[0], 95, "12c68fec6ee5748c31e16138a6a2fe6ca84ba55b52abb17b91b1ad40e735a5fe486fcc9033fcd5e306d0da7a1382cb375950de6f05956f7f98465c34f55ea921", "SHA3-512 95 bytes" }, + { &g_abRandom72KB[0], 96, "0729b797cb8bb28274bd83258ccd5fb70ae3b50fff1a02137f8620ed7ed97807094e9735415b9288847eb0652d76bc2225f8c933016ae3e7a6c59283b67427b4", "SHA3-512 96 bytes" }, + { &g_abRandom72KB[0], 97, "e553596d7464f147e7b728eb4cfd176fe68b6a01d1e5c9d436f3ba4f35fc5183dfc40af52cb22682b9e388bda9f5ccacbf3d28fb2751f1840bee01e84c336baf", "SHA3-512 97 bytes" }, + { &g_abRandom72KB[0], 98, "5ff10285538450aac83075504612f99a97ef7d3b3d271af80d089fcb6cf0ba65d3b8627659dce567434f011241dd956fdaa603d3a6a95b183bc21a9e541c5c0b", "SHA3-512 98 bytes" }, + { &g_abRandom72KB[0], 99, "8264ce198a9cf2c0df56ac0e66c4d28f43a538c77b54080a0d623226c360878a7bae213e1e05aad4933e1ec8f50646f3f1abfe2d26b97e879463ec20b1ec7398", "SHA3-512 99 bytes" }, + { &g_abRandom72KB[0], 100, "ec1b9a77eef08fa9f30bfda857a404cea4ad382bef4d6c4468c6561e057396697f1a8d8f1981f369186c0d5302d7ba94dd21bef988934f4cce624e3727880c1d", "SHA3-512 100 bytes" }, + { &g_abRandom72KB[0], 101, "52500498571ed5ff4d274c593017bf958676ce0bd9ad4dc512a79615fa753a9a74f753e29eb230b810b544bb27f6d978f10b10ece4ca20483f0648dc55ef5dec", "SHA3-512 101 bytes" }, + { &g_abRandom72KB[0], 102, "b7e7a4fc48e5ee13a5fb6cb3d6369f16e73499ed689e843db5ef0f4113f5934ec88bbc1d88f644fc940eabe563962ddd253458fe353dd94b84fc0b68f79351cf", "SHA3-512 102 bytes" }, + { &g_abRandom72KB[0], 103, "a36bdca11677f6d00c41480cedb84a61f50badfe139d8e3a614ab4a6dda92b814f4448cc8449fafc48b643eb650acef6a66ae4e1e8c9931e64120f2fca8df3fb", "SHA3-512 103 bytes" }, + { &g_abRandom72KB[0], 104, "a251f1502eea3fd43aae904ee1aff0b710221bb21b934b1e2c8a2cabe865dcc34a1a35e81fd123c62bf007486332e6b33a15b621e94264f056d2388f7f37bd5b", "SHA3-512 104 bytes" }, + { &g_abRandom72KB[0], 105, "ee284dac8cc77a76e2c5da4c51d50e536bd76ce532b2e879904a5dcdb53b8f19da80953728724af49a434d4f55ee22efca95fb64efa6d40b3ef7f2ab9e4e2f2b", "SHA3-512 105 bytes" }, + { &g_abRandom72KB[0], 106, "91e36f3c8dc599d36ba96815b9f7aff30657f9a30554d4b3badf7d664b3f0364d934eb633fa314e71eb9d453ccac4f66b9497fbc329b1ed6a48b416a10e84673", "SHA3-512 106 bytes" }, + { &g_abRandom72KB[0], 107, "2762a46b22f6259e864bb03324d313460e0daa74219787e0596fafc6fef8bb7f723d8375cf5a3097e6ac377c4b13588e978483c21240af30226b6cba043eca53", "SHA3-512 107 bytes" }, + { &g_abRandom72KB[0], 108, "5971c80376d85e61caf25336b9af83aa90e5ae9facee9a36a5a89a889aaf589bf1e03aeb16d6cbfb167d61981b27f40731803385077ec9f427e2e16146afaa11", "SHA3-512 108 bytes" }, + { &g_abRandom72KB[0], 109, "c40906c8ed4101ba4da184eecb09ac96b9196becd39922f859c5fe898aaed15c940c2a662fb5aea1efaa3ec8301a4baa3b44fa37281a06f5480836efc26f0ba8", "SHA3-512 109 bytes" }, + { &g_abRandom72KB[0], 110, "29536834295248ddbbe1c366cb4e391eb0574ebf36fb0e3cbafd285de6d2568944b89a8108b644b48b60bd6e5e766d6472767654c3c36e373341fd5efe8baddb", "SHA3-512 110 bytes" }, + { &g_abRandom72KB[0], 111, "7a6f98d03200f77661686b6d69d5bb48a37c618dff07c0e25fda73a1fb08c1f04312c33971878de46acbb338e4a20dfd09acf1b1133206af57732123f36c3f0a", "SHA3-512 111 bytes" }, + { &g_abRandom72KB[0], 112, "6d46c8fe0f7645029f9a4af5d8a7a0abb2fddfbb1afc5235966df4d26cc4301d26cbf09bef044f264cf80a67a52861e9ddfe88b4a7f3224812750ffacf927449", "SHA3-512 112 bytes" }, + { &g_abRandom72KB[0], 113, "654c3d3b664da1a419443566e8e58be49c1c8d55137a32bdc1e67ca93ce0dca5058c46e4f1c7be260790ee2c58cd9710e1ff0a3b3ff0faccbf66f7e3279830e9", "SHA3-512 113 bytes" }, + { &g_abRandom72KB[0], 114, "232d3a6bb57a2dbf2b287698e7446876b68be7934afb7701553f2eec05b999aaf895d993d6643b1b90ac646698f1fa8b4a8a2c9aca209feee4bcf3ea865b94fe", "SHA3-512 114 bytes" }, + { &g_abRandom72KB[0], 115, "2d8ef7d8cfbf11c02064a1c34df41eb7ae652f076d9608639ad4aaa6949c86819a3752e509ec55d2291561ad5bcbf149b01bf497dd5bf0dbcdfc237536e8f567", "SHA3-512 115 bytes" }, + { &g_abRandom72KB[0], 116, "b1f8dc3aa2f6222c8cef637be1e3c27c6f718cc7747776f5adea6d9e73e8c0f522a7bacefa0dc40c75be982de3ac525eaf5d23d5fc1db5e61d33646211fab42f", "SHA3-512 116 bytes" }, + { &g_abRandom72KB[0], 117, "9d942fb3a3b4b16b42125e5680384541d840729796eb24b2132eea8e4614fe1483191ef33543fe5438d66c2ebd3fbf3baee2886e3665e2e7bbdb3d744fb98a45", "SHA3-512 117 bytes" }, + { &g_abRandom72KB[0], 118, "c9768aa0cc49ec005b17e3977055eb78e979404b5138209adc45a7c293bfd52dfbf442320b2f955fd90b360741be7e1c94f5ed844ac09caf1fa089bc6182ba47", "SHA3-512 118 bytes" }, + { &g_abRandom72KB[0], 119, "29dfb602406ff7c35d6980a31c9c9e4cedb070cdd8fd19427b10daeb7509dce0f52123ddbb4a57f970ed346f338c59af917b8f90d32b3927bf4a2a10efabc647", "SHA3-512 119 bytes" }, + { &g_abRandom72KB[0], 120, "b299a46e17c12dd35d49374c11f91e47d1f8b804c7aaeedf1fb2b84f77fc6247f7203bca813f812a6d062e505db43d03cdfc633fa23b6101dee42856c0485b8c", "SHA3-512 120 bytes" }, + { &g_abRandom72KB[0], 121, "3459aad57f27f2689728b828a8e4eccc991af2e87b2db7b0743d432ecb24c13ddcb2d6bedd09a1c0ae1b178222c0695802e0c14461a123e49fb8ce79d1e2a601", "SHA3-512 121 bytes" }, + { &g_abRandom72KB[0], 122, "2acd3bc4a351fa2c640bfcb73c4ee4c4f078e4621f5c424bfbbb3427b2396a5432ed2adca24bd21c0b9aa70d1d4ce847afe1f40e37c9bb75668994705dcd29ef", "SHA3-512 122 bytes" }, + { &g_abRandom72KB[0], 123, "633166065ebba100f264090981783e223bed71325ca87a609de02b8e23226fee55a6a389a1978df01eaa5cd497ffb3c6d72f6e60033f217fd0cfd6c6ceba468c", "SHA3-512 123 bytes" }, + { &g_abRandom72KB[0], 124, "976c3f3a52a2a13b1437aaad29230f6a64b66caf3fb450c8dea915bb5d3cc9fafc5ba1297cfef6dca1211fa77a737026adc1426cfe84f6bce8cfc071859208a3", "SHA3-512 124 bytes" }, + { &g_abRandom72KB[0], 125, "cc68da46995cc0becdf21d1a6777efef4734ca81f5f079b5de2a394b18c0068e36af49e12ea6e916e954520b72edb15beff51b6b2cad64270099d020758ab05a", "SHA3-512 125 bytes" }, + { &g_abRandom72KB[0], 126, "1c504c2b97f8b1351b32b70836d52d6991188b48b1e714cda5b44ddb51f16d12d644a9703078dff59164acb2b1d5e8d9fe74057e1e54a38e23933c37bb873f63", "SHA3-512 126 bytes" }, + { &g_abRandom72KB[0], 127, "73534fffcd2647f7657cbbfd7b1487e260d79aa6d54cfde74c9cfb042618d20405fb43a2adb2acabf707ee676fd9b2f94d6173fab57b3b4e99e12f34a3396564", "SHA3-512 127 bytes" }, + { &g_abRandom72KB[0], 128, "7fba8d3e8e2bba64fce80aef2010fec041129e2ad559ccc5064544e1bf95a6c51d9dad5c27d4deabc2e103672fdfbe2df25ebffc3b4b4c0c94c7e9320237d97f", "SHA3-512 128 bytes" }, + { &g_abRandom72KB[0], 129, "2f65d51640daf193d089e61afd4fe5094765b75ca6c6d212fd5b18001154b421cb8dab0932aef69b85407fa1efdb0d0dcc638e7e9c2268ac8a5e453984544261", "SHA3-512 129 bytes" }, + { &g_abRandom72KB[0], 1024, "951e0f318804de414f479be226b733e65ca3a686a5c53afbfb7894fa6278bea1d92f9fa5273f542fd892cdae5dae115c5ac62898da49a7f12433cd0462b6df54", "SHA3-512 1024 bytes" }, + { &g_abRandom72KB[0], 73001, "f1275b4fcf0650888f60fee8b1557e5406eafe166d6a7771a4f3b865a5e051edfdc534de29e0773c9cd418c40cf6c9bff18c06a68f0f02d3a2e7caf3c3353f4d", "SHA3-512 73001 bytes" }, + { &g_abRandom72KB[0], 73728, "031700e2323b8d5b7d87eb2e00714ecd0aa9408de3b4ea3328040292f23ff0aa4e29b0b9c3125516e80e522ef228551e2481bd8c0560c12be148306f5379595e", "SHA3-512 73728 bytes" }, + { &g_abRandom72KB[0x20c9], 9991, "c570fa09ebc4157ae9836d09a3c6b41bd1ef028f76c2a72e1a10b6b09deb67bc484c436b51c1338a245ef244be13cd6efc034a66f70c685c49f400830806ebc8", "SHA3-512 8393 bytes @9991" }, + }; + testGeneric("2.16.840.1.101.3.4.2.10", s_abTests, RT_ELEMENTS(s_abTests), "SHA3-512", RTDIGESTTYPE_SHA3_512, VINF_SUCCESS); +} + + +static unsigned checkArgs(int cArgs, char **papszArgs, const char *pszName, const char *pszFamily) +{ + if (cArgs <= 1) + return 1; + size_t const cchName = strlen(pszName); + size_t const cchFamily = strlen(pszFamily); + for (int i = 1; i < cArgs; i++) + { + const char *pszArg = papszArgs[i]; + const char *pszSep = strpbrk(pszArg, ":="); + size_t const cchCur = pszSep ? (size_t)(pszSep - pszArg) : strlen(pszArg); + if ( (cchCur == cchName && RTStrNICmp(pszArg, pszName, cchCur) == 0) + || (cchCur == cchFamily && RTStrNICmp(pszArg, pszFamily, cchCur) == 0) ) + { + if (!pszSep || pszSep[1] == '\0') + return 1; + return RTStrToUInt32(pszSep + 1); + } + } + return 0; +} + + +int main(int argc, char **argv) { RTTEST hTest; - int rc = RTTestInitAndCreate("tstRTDigest-2", &hTest); - if (rc) - return rc; + RTEXITCODE rcExit = RTTestInitExAndCreate(argc, &argv, 0, "tstRTDigest-2", &hTest); + if (rcExit != RTEXITCODE_SUCCESS) + return rcExit; RTTestBanner(hTest); - testMd2(); - testMd4(); - testMd5(); - testSha1(); - testSha256(); - testSha224(); - testSha512(); - testSha384(); +#define DO(a_szName, a_szFamily, a_fnTestExpr) do { \ + unsigned const cTimes = checkArgs(argc, argv, a_szName, a_szFamily); \ + for (unsigned i = 0; i < cTimes; i++) { a_fnTestExpr; } \ + } while (0) + DO("MD2", "MD", testMd2()); + DO("MD4", "MD", testMd4()); + DO("MD5", "MD", testMd5()); + DO("SHA1", "SHA", testSha1()); + DO("SHA256", "SHA2", testSha256()); + DO("SHA224", "SHA2", testSha224()); + DO("SHA512", "SHA2", testSha512()); + DO("SHA384", "SHA2", testSha384()); #ifndef IPRT_WITHOUT_SHA512T224 - testSha512t224(); + DO("SHA512T224", "SHA2", testSha512t224()); #endif #ifndef IPRT_WITHOUT_SHA512T256 - testSha512t256(); + DO("SHA512T256", "SHA2", testSha512t256()); #endif + DO("SHA3-224", "SHA3", testSha3_224()); + DO("SHA3-256", "SHA3", testSha3_256()); + DO("SHA3-384", "SHA3", testSha3_384()); + DO("SHA3-512", "SHA3", testSha3_512()); return RTTestSummaryAndDestroy(hTest); } diff -Nru virtualbox-hwe-6.1.34-dfsg/src/VBox/Runtime/testcase/tstRTDigest.cpp virtualbox-hwe-6.1.38-dfsg/src/VBox/Runtime/testcase/tstRTDigest.cpp --- virtualbox-hwe-6.1.34-dfsg/src/VBox/Runtime/testcase/tstRTDigest.cpp 2022-03-22 23:45:44.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/src/VBox/Runtime/testcase/tstRTDigest.cpp 2022-09-01 13:29:10.000000000 +0000 @@ -197,8 +197,40 @@ else if (!RTStrICmp(ValueUnion.psz, "sha512/256")) { pszDigestType = "SHA-512/256"; - enmDigestType = RTDIGESTTYPE_SHA512T256; + enmDigestType = RTDIGESTTYPE_SHA3_256; } + else if (!RTStrICmp(ValueUnion.psz, "sha3-224")) + { + pszDigestType = "SHA3-224"; + enmDigestType = RTDIGESTTYPE_SHA3_224; + } + else if (!RTStrICmp(ValueUnion.psz, "sha3-256")) + { + pszDigestType = "SHA3-256"; + enmDigestType = RTDIGESTTYPE_SHA3_256; + } + else if (!RTStrICmp(ValueUnion.psz, "sha3-384")) + { + pszDigestType = "SHA3-384"; + enmDigestType = RTDIGESTTYPE_SHA3_384; + } + else if (!RTStrICmp(ValueUnion.psz, "sha3-512")) + { + pszDigestType = "SHA3-512"; + enmDigestType = RTDIGESTTYPE_SHA3_512; + } +#if 0 + else if (!RTStrICmp(ValueUnion.psz, "shake128")) + { + pszDigestType = "SHAKE128"; + enmDigestType = RTDIGESTTYPE_SHAKE128; + } + else if (!RTStrICmp(ValueUnion.psz, "shake256")) + { + pszDigestType = "SHAKE256"; + enmDigestType = RTDIGESTTYPE_SHAKE256; + } +#endif else { Error("Invalid digest type: %s\n", ValueUnion.psz); @@ -235,7 +267,20 @@ break; case 'h': - RTPrintf("usage: tstRTDigest -t [-o ] [-l ] [-x] file [file2 [..]]\n"); + RTPrintf("usage: tstRTDigest -t [-o ] [-l ] [-m method] [-x] file [file2 [..]]\n" + "\n" + "Options:\n" + " -t,--type \n" + " -o,--offset \n" + " -l,--length \n" + " -m,--method \n" + " block: Init+Update+Finalize, data from file(s). Default.\n" + " file: RTSha*DigestFromFile. Only SHA1 and SHA256.\n" + " cvas: NIST test vectors processed by RTCrDigest*.\n" + " full: Not implemented\n" + " -x,--testcase\n" + " For generating C code.\n" + ); return 1; case VINF_GETOPT_NOT_OPTION: @@ -413,8 +458,78 @@ break; } + case RTDIGESTTYPE_SHA3_224: + { + RTSHA3T224CONTEXT Ctx; + RTSha3t224Init(&Ctx); + for (;;) + { + rc = MyReadFile(hFile, abBuf, sizeof(abBuf), &cbRead, &cbMaxLeft); + if (RT_FAILURE(rc) || !cbRead) + break; + RTSha3t224Update(&Ctx, abBuf, cbRead); + } + uint8_t abDigest[RTSHA3_224_HASH_SIZE]; + RTSha3t224Final(&Ctx, abDigest); + RTSha3t224ToString(abDigest, pszDigest, sizeof(abBuf)); + break; + } + + case RTDIGESTTYPE_SHA3_256: + { + RTSHA3T256CONTEXT Ctx; + RTSha3t256Init(&Ctx); + for (;;) + { + rc = MyReadFile(hFile, abBuf, sizeof(abBuf), &cbRead, &cbMaxLeft); + if (RT_FAILURE(rc) || !cbRead) + break; + RTSha3t256Update(&Ctx, abBuf, cbRead); + } + uint8_t abDigest[RTSHA3_256_HASH_SIZE]; + RTSha3t256Final(&Ctx, abDigest); + RTSha3t256ToString(abDigest, pszDigest, sizeof(abBuf)); + break; + } + + case RTDIGESTTYPE_SHA3_384: + { + RTSHA3T384CONTEXT Ctx; + RTSha3t384Init(&Ctx); + for (;;) + { + rc = MyReadFile(hFile, abBuf, sizeof(abBuf), &cbRead, &cbMaxLeft); + if (RT_FAILURE(rc) || !cbRead) + break; + RTSha3t384Update(&Ctx, abBuf, cbRead); + } + uint8_t abDigest[RTSHA3_384_HASH_SIZE]; + RTSha3t384Final(&Ctx, abDigest); + RTSha3t384ToString(abDigest, pszDigest, sizeof(abBuf)); + break; + } + + case RTDIGESTTYPE_SHA3_512: + { + RTSHA3T512CONTEXT Ctx; + RTSha3t512Init(&Ctx); + for (;;) + { + rc = MyReadFile(hFile, abBuf, sizeof(abBuf), &cbRead, &cbMaxLeft); + if (RT_FAILURE(rc) || !cbRead) + break; + RTSha3t512Update(&Ctx, abBuf, cbRead); + } + uint8_t abDigest[RTSHA3_512_HASH_SIZE]; + RTSha3t512Final(&Ctx, abDigest); + RTSha3t512ToString(abDigest, pszDigest, sizeof(abBuf)); + break; + } + + /** @todo SHAKE128 and SHAKE256 */ + default: - return Error("Internal error #1\n"); + return Error("Internal error #1: %d %s\n", enmDigestType, pszDigest); } RTFileClose(hFile); if (RT_FAILURE(rc) && rc != VERR_EOF) @@ -453,7 +568,7 @@ PRTSTREAM pFile; rc = RTStrmOpen(ValueUnion.psz, "r", &pFile); if (RT_FAILURE(rc)) - return Error("Failed to open CVAS file '%s': %Rrc", ValueUnion.psz, rc); + return Error("Failed to open CVAS file '%s': %Rrc\n", ValueUnion.psz, rc); /* * Parse the input file. diff -Nru virtualbox-hwe-6.1.34-dfsg/src/VBox/Runtime/testcase/tstRTLdrVerifyPeImage.cpp virtualbox-hwe-6.1.38-dfsg/src/VBox/Runtime/testcase/tstRTLdrVerifyPeImage.cpp --- virtualbox-hwe-6.1.34-dfsg/src/VBox/Runtime/testcase/tstRTLdrVerifyPeImage.cpp 2022-03-22 23:45:45.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/src/VBox/Runtime/testcase/tstRTLdrVerifyPeImage.cpp 2022-09-01 13:29:11.000000000 +0000 @@ -37,6 +37,9 @@ #include #include +#include +#include + /********************************************************************************************************************************* * Global Variables * @@ -72,20 +75,33 @@ int rc = RTLdrOpen(pszFullName, RTLDR_O_FOR_VALIDATION, RTLDRARCH_WHATEVER, &hLdrMod); if (RT_SUCCESS(rc)) { - char szDigest[512]; + uint8_t abHash[128]; + char szDigest[512]; - RTTESTI_CHECK_RC(rc = RTLdrHashImage(hLdrMod, RTDIGESTTYPE_MD5, szDigest, sizeof(szDigest)), VINF_SUCCESS); + RTTESTI_CHECK_RC(rc = RTLdrHashImage(hLdrMod, RTDIGESTTYPE_MD5, abHash, sizeof(abHash)), VINF_SUCCESS); if (RT_SUCCESS(rc)) + { + RTMd5ToString(abHash, szDigest, sizeof(szDigest)); RTTestPrintf(hTest, RTTESTLVL_ALWAYS, "md5=%s\n", szDigest); - RTTESTI_CHECK_RC(rc = RTLdrHashImage(hLdrMod, RTDIGESTTYPE_SHA1, szDigest, sizeof(szDigest)), VINF_SUCCESS); + } + RTTESTI_CHECK_RC(rc = RTLdrHashImage(hLdrMod, RTDIGESTTYPE_SHA1, abHash, sizeof(abHash)), VINF_SUCCESS); if (RT_SUCCESS(rc)) + { + RTSha1ToString(abHash, szDigest, sizeof(szDigest)); RTTestPrintf(hTest, RTTESTLVL_ALWAYS, "sha1=%s\n", szDigest); - RTTESTI_CHECK_RC(rc = RTLdrHashImage(hLdrMod, RTDIGESTTYPE_SHA256, szDigest, sizeof(szDigest)), VINF_SUCCESS); + } + RTTESTI_CHECK_RC(rc = RTLdrHashImage(hLdrMod, RTDIGESTTYPE_SHA256, abHash, sizeof(abHash)), VINF_SUCCESS); if (RT_SUCCESS(rc)) + { + RTSha256ToString(abHash, szDigest, sizeof(szDigest)); RTTestPrintf(hTest, RTTESTLVL_ALWAYS, "sha256=%s\n", szDigest); - RTTESTI_CHECK_RC(rc = RTLdrHashImage(hLdrMod, RTDIGESTTYPE_SHA512, szDigest, sizeof(szDigest)), VINF_SUCCESS); + } + RTTESTI_CHECK_RC(rc = RTLdrHashImage(hLdrMod, RTDIGESTTYPE_SHA512, abHash, sizeof(abHash)), VINF_SUCCESS); if (RT_SUCCESS(rc)) + { + RTSha512ToString(abHash, szDigest, sizeof(szDigest)); RTTestPrintf(hTest, RTTESTLVL_ALWAYS, "sha512=%s\n", szDigest); + } if (rc != VERR_NOT_SUPPORTED) { diff -Nru virtualbox-hwe-6.1.34-dfsg/src/VBox/Runtime/tools/Makefile.kmk virtualbox-hwe-6.1.38-dfsg/src/VBox/Runtime/tools/Makefile.kmk --- virtualbox-hwe-6.1.34-dfsg/src/VBox/Runtime/tools/Makefile.kmk 2022-03-22 23:45:47.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/src/VBox/Runtime/tools/Makefile.kmk 2022-09-01 13:29:13.000000000 +0000 @@ -73,12 +73,44 @@ if !defined(VBOX_ONLY_EXTPACKS) || "$(KBUILD_TARGET)" == "win" || "$(KBUILD_TARGET)" == "darwin" # RTSignTool - Signing utility - build version. Signed on windows so we can get the certificate from it. BLDPROGS += bldRTSignTool - bldRTSignTool_TEMPLATE = VBoxAdvBldProg - bldRTSignTool_SOURCES = RTSignTool.cpp - bldRTSignTool_DEFS = IPRT_IN_BUILD_TOOL - bldRTSignTool_POST_CMDS.win = $(VBOX_SIGN_IMAGE_CMDS) - if defined(VBOX_WITH_DARWIN_R0_DARWIN_IMAGE_VERIFICATION) && defined(VBOX_SIGNING_MODE) - bldRTSignTool_POST_CMDS.darwin = $(call VBOX_SIGN_MACHO_FN,$(out),org.virtualbox.org.bldtool.$(target)) + bldRTSignTool_TEMPLATE := VBoxAdvBldProg + bldRTSignTool_INCS := ../include + bldRTSignTool_SOURCES := RTSignTool.cpp + bldRTSignTool_DEFS := IPRT_IN_BUILD_TOOL + bldRTSignTool_LIBS.win := Crypt32.lib NCrypt.lib + ifndef VBOX_WITH_BLD_RTSIGNTOOL_SIGNING + bldRTSignTool_DEFS += IPRT_SIGNTOOL_NO_SIGNING + else # RuntimeBldProg is missing a lot and is built w/o IPRT_WITH_OPENSSL. So, include missing and rebuilt openssl deps. + bldRTSignTool_SDKS += VBOX_OPENSSL_BLDPROG + bldRTSignTool_DEFS += IPRT_WITH_OPENSSL + bldRTSignTool_SOURCES += \ + ../common/string/RTStrICmpAscii.cpp \ + ../common/checksum/alt-sha3.cpp \ + ../common/crypto/store-inmem.cpp \ + ../common/crypto/store-cert-add-basic.cpp \ + ../common/crypto/rsa-core.cpp \ + ../common/crypto/rsa-asn1-decoder.cpp \ + ../common/crypto/rsa-init.cpp \ + ../common/crypto/rsa-sanity.cpp \ + ../common/crypto/RTCrStoreCertAddFromJavaKeyStore.cpp \ + ../common/crypto/pkix-signature-core.cpp \ + ../common/crypto/pkix-signature-builtin.cpp \ + ../common/crypto/pkix-signature-rsa.cpp \ + \ + ../common/crypto/store.cpp \ + ../common/crypto/digest-builtin.cpp \ + ../common/crypto/iprt-openssl.cpp\ + ../common/crypto/key.cpp \ + ../common/crypto/key-file.cpp \ + ../common/crypto/key-openssl.cpp \ + ../common/crypto/pkcs7-core.cpp \ + ../common/crypto/pkcs7-sign.cpp \ + ../common/crypto/RTCrRandBytes-openssl.cpp + if1of ($(KBUILD_HOST), darwin win) + bldRTSignTool_SOURCES += ../r3/$(KBUILD_HOST)/RTCrStoreCreateSnapshotById-$(KBUILD_HOST).cpp + else + bldRTSignTool_SOURCES += ../genericc/RTCrStoreCreateSnapshotById-generic.cpp + endif endif endif @@ -202,9 +234,11 @@ # RTSignTool - Signing utility. PROGRAMS += RTSignTool - RTSignTool_TEMPLATE = VBoxR3Tool - RTSignTool_SOURCES = RTSignTool.cpp - RTSignTool_LIBS = $(PATH_STAGE_LIB)/SUPR3$(VBOX_SUFF_LIB) + RTSignTool_TEMPLATE := VBoxR3Tool + RTSignTool_INCS := ../include + RTSignTool_SOURCES := RTSignTool.cpp + RTSignTool_LIBS = $(PATH_STAGE_LIB)/SUPR3$(VBOX_SUFF_LIB) + RTSignTool_LIBS.win = Crypt32.lib NCrypt.lib # RTTraceLogTool - Trace log collection and dissection tool. PROGRAMS += RTTraceLogTool diff -Nru virtualbox-hwe-6.1.34-dfsg/src/VBox/Runtime/tools/RTSignTool.cpp virtualbox-hwe-6.1.38-dfsg/src/VBox/Runtime/tools/RTSignTool.cpp --- virtualbox-hwe-6.1.34-dfsg/src/VBox/Runtime/tools/RTSignTool.cpp 2022-03-22 23:45:47.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/src/VBox/Runtime/tools/RTSignTool.cpp 2022-09-01 13:29:13.000000000 +0000 @@ -30,6 +30,7 @@ *********************************************************************************************************************************/ #include #include +#include #include #include #include @@ -40,24 +41,107 @@ #include #include #include +#ifdef RT_OS_WINDOWS +# include +#endif #include #include +#include +#include #ifndef RT_OS_WINDOWS # include #endif #include #include +#include #include #include #include #include +#include +#include #ifdef VBOX # include /* Certificates */ #endif #ifdef RT_OS_WINDOWS # include # include +# include +# include #endif +#include "internal/ldr.h" /* for IMAGE_XX_SIGNATURE defines */ + + +/********************************************************************************************************************************* +* Defined Constants And Macros * +*********************************************************************************************************************************/ +#define OPT_OFF_CERT_FILE 0 /**< signtool /f file */ +#define OPT_OFF_CERT_SHA1 1 /**< signtool /sha1 thumbprint */ +#define OPT_OFF_CERT_SUBJECT 2 /**< signtool /n name */ +#define OPT_OFF_CERT_STORE 3 /**< signtool /s store */ +#define OPT_OFF_CERT_STORE_MACHINE 4 /**< signtool /sm */ +#define OPT_OFF_KEY_FILE 5 /**< no signtool equivalent, other than maybe /f. */ +#define OPT_OFF_KEY_PASSWORD 6 /**< signtool /p pass */ +#define OPT_OFF_KEY_PASSWORD_FILE 7 /**< no signtool equivalent. */ +#define OPT_OFF_KEY_NAME 8 /**< signtool /kc name */ +#define OPT_OFF_KEY_PROVIDER 9 /**< signtool /csp name (CSP = cryptographic service provider) */ + +#define OPT_CERT_KEY_SWITCH_CASES(a_Instance, a_uBase, a_chOpt, a_ValueUnion, a_rcExit) \ + case (a_uBase) + OPT_OFF_CERT_FILE: \ + case (a_uBase) + OPT_OFF_CERT_SHA1: \ + case (a_uBase) + OPT_OFF_CERT_SUBJECT: \ + case (a_uBase) + OPT_OFF_CERT_STORE: \ + case (a_uBase) + OPT_OFF_CERT_STORE_MACHINE: \ + case (a_uBase) + OPT_OFF_KEY_FILE: \ + case (a_uBase) + OPT_OFF_KEY_PASSWORD: \ + case (a_uBase) + OPT_OFF_KEY_PASSWORD_FILE: \ + case (a_uBase) + OPT_OFF_KEY_NAME: \ + case (a_uBase) + OPT_OFF_KEY_PROVIDER: \ + a_rcExit = a_Instance.handleOption((a_chOpt) - (a_uBase), &(a_ValueUnion)); \ + break + +#define OPT_CERT_KEY_GETOPTDEF_ENTRIES(a_szPrefix, a_uBase) \ + { a_szPrefix "cert-file", (a_uBase) + OPT_OFF_CERT_FILE, RTGETOPT_REQ_STRING }, \ + { a_szPrefix "cert-sha1", (a_uBase) + OPT_OFF_CERT_SHA1, RTGETOPT_REQ_STRING }, \ + { a_szPrefix "cert-subject", (a_uBase) + OPT_OFF_CERT_SUBJECT, RTGETOPT_REQ_STRING }, \ + { a_szPrefix "cert-store", (a_uBase) + OPT_OFF_CERT_STORE, RTGETOPT_REQ_STRING }, \ + { a_szPrefix "cert-machine-store", (a_uBase) + OPT_OFF_CERT_STORE_MACHINE, RTGETOPT_REQ_NOTHING }, \ + { a_szPrefix "key-file", (a_uBase) + OPT_OFF_KEY_FILE, RTGETOPT_REQ_STRING }, \ + { a_szPrefix "key-password", (a_uBase) + OPT_OFF_KEY_PASSWORD, RTGETOPT_REQ_STRING }, \ + { a_szPrefix "key-password-file", (a_uBase) + OPT_OFF_KEY_PASSWORD_FILE, RTGETOPT_REQ_STRING }, \ + { a_szPrefix "key-name", (a_uBase) + OPT_OFF_KEY_NAME, RTGETOPT_REQ_STRING }, \ + { a_szPrefix "key-provider", (a_uBase) + OPT_OFF_KEY_PROVIDER, RTGETOPT_REQ_STRING } + +#define OPT_CERT_KEY_GETOPTDEF_COMPAT_ENTRIES(a_uBase) \ + { "/f", (a_uBase) + OPT_OFF_CERT_FILE, RTGETOPT_REQ_STRING }, \ + { "/sha1", (a_uBase) + OPT_OFF_CERT_SHA1, RTGETOPT_REQ_STRING }, \ + { "/n", (a_uBase) + OPT_OFF_CERT_SUBJECT, RTGETOPT_REQ_STRING }, \ + { "/s", (a_uBase) + OPT_OFF_CERT_STORE, RTGETOPT_REQ_STRING }, \ + { "/sm", (a_uBase) + OPT_OFF_CERT_STORE_MACHINE, RTGETOPT_REQ_NOTHING }, \ + { "/p", (a_uBase) + OPT_OFF_KEY_PASSWORD, RTGETOPT_REQ_STRING }, \ + { "/kc", (a_uBase) + OPT_OFF_KEY_NAME, RTGETOPT_REQ_STRING }, \ + { "/csp", (a_uBase) + OPT_OFF_KEY_PROVIDER, RTGETOPT_REQ_STRING } + +#define OPT_CERT_KEY_SYNOPSIS(a_szPrefix) \ + "[" a_szPrefix "cert-file ] " \ + "[" a_szPrefix "cert-sha1 ] " \ + "[" a_szPrefix "cert-subject ] " \ + "[" a_szPrefix "cert-store ] " \ + "[" a_szPrefix "cert-machine-store] " \ + "[" a_szPrefix "key-file ] " \ + "[" a_szPrefix "key-password ] " \ + "[" a_szPrefix "key-password-file |stdin] " \ + "[" a_szPrefix "key-name ] " \ + "[" a_szPrefix "key-provider ] " + +#define OPT_HASH_PAGES 1040 +#define OPT_NO_HASH_PAGES 1041 +#define OPT_ADD_CERT 1042 +#define OPT_TIMESTAMP_TYPE 1043 +#define OPT_TIMESTAMP_OVERRIDE 1044 +#define OPT_NO_SIGNING_TIME 1045 +#define OPT_FILE_TYPE 1046 +#define OPT_IGNORED 1047 /********************************************************************************************************************************* @@ -71,11 +155,25 @@ } RTSIGNTOOLHELP; +/** Filetypes. */ +typedef enum RTSIGNTOOLFILETYPE +{ + RTSIGNTOOLFILETYPE_INVALID = 0, + RTSIGNTOOLFILETYPE_DETECT, + RTSIGNTOOLFILETYPE_EXE, + RTSIGNTOOLFILETYPE_CAT, + RTSIGNTOOLFILETYPE_UNKNOWN, + RTSIGNTOOLFILETYPE_END +} RTSIGNTOOLFILETYPE; + + /** * PKCS\#7 signature data. */ typedef struct SIGNTOOLPKCS7 { + /** The file type. */ + RTSIGNTOOLFILETYPE enmType; /** The raw signature. */ uint8_t *pbBuf; /** Size of the raw signature. */ @@ -129,10 +227,719 @@ static RTEXITCODE HandleHelp(int cArgs, char **papszArgs); static RTEXITCODE HelpHelp(PRTSTREAM pStrm, RTSIGNTOOLHELP enmLevel); static RTEXITCODE HandleVersion(int cArgs, char **papszArgs); +static int HandleShowExeWorkerPkcs7DisplaySignerInfo(PSHOWEXEPKCS7 pThis, size_t offPrefix, PCRTCRPKCS7SIGNERINFO pSignerInfo); static int HandleShowExeWorkerPkcs7Display(PSHOWEXEPKCS7 pThis, PRTCRPKCS7SIGNEDDATA pSignedData, size_t offPrefix, PCRTCRPKCS7CONTENTINFO pContentInfo); +/********************************************************************************************************************************* +* Certificate and Private Key Handling (options, ++). * +*********************************************************************************************************************************/ +#ifdef RT_OS_WINDOWS + +/** @todo create a better fake certificate. */ +const unsigned char g_abFakeCertificate[] = +{ + 0x30, 0x82, 0x03, 0xb2, 0x30, 0x82, 0x02, 0x9a, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x10, 0x31, /* 0x00000000: 0...0..........1 */ + 0xba, 0xd6, 0xbc, 0x5d, 0x9a, 0xe0, 0xb0, 0x4e, 0xd4, 0xfa, 0xcc, 0xfb, 0x47, 0x00, 0x5c, 0x30, /* 0x00000010: ...]...N....G.\0 */ + 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x30, 0x71, /* 0x00000020: ...*.H........0q */ + 0x31, 0x1c, 0x30, 0x1a, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, 0x13, 0x54, 0x69, 0x6d, 0x65, 0x73, /* 0x00000030: 1.0...U....Times */ + 0x74, 0x61, 0x6d, 0x70, 0x20, 0x53, 0x69, 0x67, 0x6e, 0x69, 0x6e, 0x67, 0x20, 0x32, 0x31, 0x0c, /* 0x00000040: tamp Signing 21. */ + 0x30, 0x0a, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x0c, 0x03, 0x44, 0x65, 0x76, 0x31, 0x15, 0x30, 0x13, /* 0x00000050: 0...U....Dev1.0. */ + 0x06, 0x03, 0x55, 0x04, 0x0a, 0x0c, 0x0c, 0x54, 0x65, 0x73, 0x74, 0x20, 0x43, 0x6f, 0x6d, 0x70, /* 0x00000060: ..U....Test Comp */ + 0x61, 0x6e, 0x79, 0x31, 0x12, 0x30, 0x10, 0x06, 0x03, 0x55, 0x04, 0x07, 0x0c, 0x09, 0x53, 0x74, /* 0x00000070: any1.0...U....St */ + 0x75, 0x74, 0x74, 0x67, 0x61, 0x72, 0x74, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x08, /* 0x00000080: uttgart1.0...U.. */ + 0x0c, 0x02, 0x42, 0x42, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x44, /* 0x00000090: ..BB1.0...U....D */ + 0x45, 0x30, 0x1e, 0x17, 0x0d, 0x30, 0x30, 0x30, 0x31, 0x30, 0x31, 0x30, 0x30, 0x30, 0x31, 0x30, /* 0x000000a0: E0...00010100010 */ + 0x31, 0x5a, 0x17, 0x0d, 0x33, 0x36, 0x31, 0x32, 0x33, 0x31, 0x32, 0x32, 0x35, 0x39, 0x35, 0x39, /* 0x000000b0: 1Z..361231225959 */ + 0x5a, 0x30, 0x71, 0x31, 0x1c, 0x30, 0x1a, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, 0x13, 0x54, 0x69, /* 0x000000c0: Z0q1.0...U....Ti */ + 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x20, 0x53, 0x69, 0x67, 0x6e, 0x69, 0x6e, 0x67, 0x20, /* 0x000000d0: mestamp Signing */ + 0x32, 0x31, 0x0c, 0x30, 0x0a, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x0c, 0x03, 0x44, 0x65, 0x76, 0x31, /* 0x000000e0: 21.0...U....Dev1 */ + 0x15, 0x30, 0x13, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x0c, 0x0c, 0x54, 0x65, 0x73, 0x74, 0x20, 0x43, /* 0x000000f0: .0...U....Test C */ + 0x6f, 0x6d, 0x70, 0x61, 0x6e, 0x79, 0x31, 0x12, 0x30, 0x10, 0x06, 0x03, 0x55, 0x04, 0x07, 0x0c, /* 0x00000100: ompany1.0...U... */ + 0x09, 0x53, 0x74, 0x75, 0x74, 0x74, 0x67, 0x61, 0x72, 0x74, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, /* 0x00000110: .Stuttgart1.0... */ + 0x55, 0x04, 0x08, 0x0c, 0x02, 0x42, 0x42, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, /* 0x00000120: U....BB1.0...U.. */ + 0x13, 0x02, 0x44, 0x45, 0x30, 0x82, 0x01, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, /* 0x00000130: ..DE0.."0...*.H. */ + 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, 0x0f, 0x00, 0x30, 0x82, 0x01, 0x0a, /* 0x00000140: ............0... */ + 0x02, 0x82, 0x01, 0x01, 0x00, 0xdb, 0x18, 0x63, 0x33, 0xf2, 0x08, 0x90, 0x5a, 0xab, 0xda, 0x88, /* 0x00000150: .......c3...Z... */ + 0x73, 0x86, 0x49, 0xea, 0x8b, 0xaf, 0xcf, 0x67, 0x15, 0xa5, 0x39, 0xe6, 0xa2, 0x94, 0x0c, 0x3f, /* 0x00000160: s.I....g..9....? */ + 0xa1, 0x2e, 0x6c, 0xd2, 0xdf, 0x01, 0x65, 0x6d, 0xed, 0x6c, 0x4c, 0xac, 0xe7, 0x77, 0x7a, 0x45, /* 0x00000170: ..l...em.lL..wzE */ + 0x05, 0x6b, 0x24, 0xf3, 0xaf, 0x45, 0x35, 0x6e, 0x64, 0x0a, 0xac, 0x1d, 0x37, 0xe1, 0x33, 0xa4, /* 0x00000180: .k$..E5nd...7.3. */ + 0x92, 0xec, 0x45, 0xe8, 0x99, 0xc1, 0xde, 0x6f, 0xab, 0x7c, 0xf0, 0xdc, 0xe2, 0xc5, 0x42, 0xa3, /* 0x00000190: ..E....o.|....B. */ + 0xea, 0xf5, 0x8a, 0xf9, 0x0e, 0xe7, 0xb3, 0x35, 0xa2, 0x75, 0x5e, 0x87, 0xd2, 0x2a, 0xd1, 0x27, /* 0x000001a0: .......5.u^..*.' */ + 0xa6, 0x79, 0x9e, 0xfe, 0x90, 0xbf, 0x97, 0xa4, 0xa1, 0xd8, 0xf7, 0xd7, 0x05, 0x59, 0x44, 0x27, /* 0x000001b0: .y...........YD' */ + 0x39, 0x6e, 0x33, 0x01, 0x2e, 0x46, 0x92, 0x47, 0xbe, 0x50, 0x91, 0x26, 0x27, 0xe5, 0x4b, 0x3a, /* 0x000001c0: 9n3..F.G.P.&'.K: */ + 0x76, 0x26, 0x64, 0x92, 0x0c, 0xa0, 0x54, 0x43, 0x6f, 0x56, 0xcc, 0x7b, 0xd0, 0xe3, 0xd8, 0x39, /* 0x000001d0: v&d...TCoV.{...9 */ + 0x5f, 0xb9, 0x41, 0xda, 0x1c, 0x62, 0x88, 0x0c, 0x45, 0x03, 0x63, 0xf8, 0xff, 0xe5, 0x3e, 0x87, /* 0x000001e0: _.A..b..E.c...>. */ + 0x0c, 0x75, 0xc9, 0xdd, 0xa2, 0xc0, 0x1b, 0x63, 0x19, 0xeb, 0x09, 0x9d, 0xa1, 0xbb, 0x0f, 0x63, /* 0x000001f0: .u.....c.......c */ + 0x67, 0x1c, 0xa3, 0xfd, 0x2f, 0xd1, 0x2a, 0xda, 0xd8, 0x93, 0x66, 0x45, 0x54, 0xef, 0x8b, 0x6d, /* 0x00000200: g.....*...fET..m */ + 0x12, 0x15, 0x0f, 0xd4, 0xb5, 0x04, 0x17, 0x30, 0x5b, 0xfa, 0x12, 0x96, 0x48, 0x5b, 0x38, 0x65, /* 0x00000210: .......0[...H[8e */ + 0xfd, 0x8f, 0x0c, 0xa3, 0x11, 0x46, 0x49, 0xe0, 0x62, 0xc3, 0xcc, 0x34, 0xe6, 0xfb, 0xab, 0x51, /* 0x00000220: .....FI.b..4...Q */ + 0xc3, 0xd4, 0x0b, 0xdc, 0x39, 0x93, 0x87, 0x90, 0x10, 0x9f, 0xce, 0x43, 0x27, 0x31, 0xd5, 0x4e, /* 0x00000230: ....9......C'1.N */ + 0x52, 0x60, 0xf1, 0x93, 0xd5, 0x06, 0xc4, 0x4e, 0x65, 0xb6, 0x35, 0x4a, 0x64, 0x15, 0xf8, 0xaf, /* 0x00000240: R`.....Ne.5Jd... */ + 0x71, 0xb2, 0x42, 0x50, 0x89, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x46, 0x30, 0x44, 0x30, 0x0e, /* 0x00000250: q.BP.......F0D0. */ + 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04, 0x04, 0x03, 0x02, 0x07, 0x80, 0x30, 0x13, /* 0x00000260: ..U...........0. */ + 0x06, 0x03, 0x55, 0x1d, 0x25, 0x04, 0x0c, 0x30, 0x0a, 0x06, 0x08, 0x2b, 0x06, 0x01, 0x05, 0x05, /* 0x00000270: ..U.%..0...+.... */ + 0x07, 0x03, 0x08, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0x52, 0x9d, /* 0x00000280: ...0...U......R. */ + 0x4d, 0xcd, 0x41, 0xe1, 0xd2, 0x68, 0x22, 0xd3, 0x10, 0x33, 0x01, 0xca, 0xff, 0x00, 0x1d, 0x27, /* 0x00000290: M.A..h"..3.....' */ + 0xa4, 0x01, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, /* 0x000002a0: ..0...*.H....... */ + 0x00, 0x03, 0x82, 0x01, 0x01, 0x00, 0xc5, 0x5a, 0x51, 0x83, 0x68, 0x3f, 0x06, 0x39, 0x79, 0x13, /* 0x000002b0: .......ZQ.h?.9y. */ + 0xa6, 0xf0, 0x1a, 0xf9, 0x29, 0x16, 0x2d, 0xa2, 0x07, 0xaa, 0x9b, 0xc3, 0x13, 0x88, 0x39, 0x69, /* 0x000002c0: ....).-.......9i */ + 0xba, 0xf7, 0x0d, 0xfb, 0xc0, 0x6e, 0x3a, 0x0b, 0x49, 0x10, 0xd1, 0xbe, 0x36, 0x91, 0x3f, 0x9d, /* 0x000002d0: .....n:.I...6.?. */ + 0xa1, 0xe8, 0xc4, 0x91, 0xf9, 0x02, 0xe1, 0xf1, 0x01, 0x15, 0x09, 0xb7, 0xa1, 0xf1, 0xec, 0x43, /* 0x000002e0: ...............C */ + 0x0d, 0x73, 0xd1, 0x31, 0x02, 0x4a, 0xce, 0x21, 0xf2, 0xa7, 0x99, 0x7c, 0xee, 0x85, 0x54, 0xc0, /* 0x000002f0: .s.1.J.!...|..T. */ + 0x55, 0x9b, 0x19, 0x37, 0xe8, 0xcf, 0x94, 0x41, 0x10, 0x6e, 0x67, 0xdd, 0x86, 0xaf, 0xb7, 0xfe, /* 0x00000300: U..7...A.ng..... */ + 0x50, 0x05, 0xf6, 0xfb, 0x0a, 0xdf, 0x88, 0xb5, 0x59, 0x69, 0x98, 0x27, 0xf8, 0x81, 0x6a, 0x4a, /* 0x00000310: P.......Yi.'..jJ */ + 0x7c, 0xf3, 0x63, 0xa9, 0x41, 0x78, 0x76, 0x12, 0xdb, 0x0e, 0x94, 0x0a, 0xdb, 0x1d, 0x3c, 0x87, /* 0x00000320: |.c.Axv.......<. */ + 0x35, 0xca, 0x28, 0xeb, 0xb0, 0x62, 0x27, 0x69, 0xe2, 0xf3, 0x84, 0x48, 0xa2, 0x2d, 0xd7, 0x0e, /* 0x00000330: 5.(..b'i...H.-.. */ + 0x4b, 0x6d, 0x39, 0xa7, 0x3e, 0x04, 0x94, 0x8e, 0xb6, 0x4b, 0x91, 0x01, 0x68, 0xf9, 0xd2, 0x75, /* 0x00000340: Km9.>....K..h..u */ + 0x1b, 0xac, 0x42, 0x3b, 0x85, 0xfc, 0x5b, 0x48, 0x3a, 0x13, 0xe7, 0x1c, 0x17, 0xcd, 0x84, 0x89, /* 0x00000350: ..B;..[H:....... */ + 0x9e, 0x5f, 0xe3, 0x77, 0xc0, 0xae, 0x34, 0xc3, 0x87, 0x76, 0x4a, 0x23, 0x30, 0xa0, 0xe1, 0x45, /* 0x00000360: ._.w..4..vJ#0..E */ + 0x94, 0x2a, 0x5b, 0x6b, 0x5a, 0xf0, 0x1a, 0x7e, 0xa6, 0xc4, 0xed, 0xe4, 0xac, 0x5d, 0xdf, 0x87, /* 0x00000370: .*[kZ..~.....].. */ + 0x8f, 0xc5, 0xb4, 0x8c, 0xbc, 0x70, 0xc1, 0xf7, 0xb2, 0x72, 0xbd, 0x73, 0xc9, 0x4e, 0xed, 0x8d, /* 0x00000380: .....p...r.s.N.. */ + 0x29, 0x33, 0xe9, 0x14, 0xc1, 0x5e, 0xff, 0x39, 0xa8, 0xe7, 0x9a, 0x3b, 0x7a, 0x3c, 0xce, 0x5d, /* 0x00000390: )3...^.9...;z<.] */ + 0x0f, 0x3c, 0x82, 0x90, 0xff, 0x81, 0x82, 0x00, 0x82, 0x5f, 0xba, 0x08, 0x79, 0xb1, 0x97, 0xc3, /* 0x000003a0: .<......._..y... */ + 0x09, 0x75, 0xc0, 0x04, 0x9b, 0x67, /* 0x000003b0: .u...g */ +}; + +const unsigned char g_abFakeRsaKey[] = +{ + 0x30, 0x82, 0x04, 0xa4, 0x02, 0x01, 0x00, 0x02, 0x82, 0x01, 0x01, 0x00, 0xdb, 0x18, 0x63, 0x33, /* 0x00000000: 0.............c3 */ + 0xf2, 0x08, 0x90, 0x5a, 0xab, 0xda, 0x88, 0x73, 0x86, 0x49, 0xea, 0x8b, 0xaf, 0xcf, 0x67, 0x15, /* 0x00000010: ...Z...s.I....g. */ + 0xa5, 0x39, 0xe6, 0xa2, 0x94, 0x0c, 0x3f, 0xa1, 0x2e, 0x6c, 0xd2, 0xdf, 0x01, 0x65, 0x6d, 0xed, /* 0x00000020: .9....?..l...em. */ + 0x6c, 0x4c, 0xac, 0xe7, 0x77, 0x7a, 0x45, 0x05, 0x6b, 0x24, 0xf3, 0xaf, 0x45, 0x35, 0x6e, 0x64, /* 0x00000030: lL..wzE.k$..E5nd */ + 0x0a, 0xac, 0x1d, 0x37, 0xe1, 0x33, 0xa4, 0x92, 0xec, 0x45, 0xe8, 0x99, 0xc1, 0xde, 0x6f, 0xab, /* 0x00000040: ...7.3...E....o. */ + 0x7c, 0xf0, 0xdc, 0xe2, 0xc5, 0x42, 0xa3, 0xea, 0xf5, 0x8a, 0xf9, 0x0e, 0xe7, 0xb3, 0x35, 0xa2, /* 0x00000050: |....B........5. */ + 0x75, 0x5e, 0x87, 0xd2, 0x2a, 0xd1, 0x27, 0xa6, 0x79, 0x9e, 0xfe, 0x90, 0xbf, 0x97, 0xa4, 0xa1, /* 0x00000060: u^..*.'.y....... */ + 0xd8, 0xf7, 0xd7, 0x05, 0x59, 0x44, 0x27, 0x39, 0x6e, 0x33, 0x01, 0x2e, 0x46, 0x92, 0x47, 0xbe, /* 0x00000070: ....YD'9n3..F.G. */ + 0x50, 0x91, 0x26, 0x27, 0xe5, 0x4b, 0x3a, 0x76, 0x26, 0x64, 0x92, 0x0c, 0xa0, 0x54, 0x43, 0x6f, /* 0x00000080: P.&'.K:v&d...TCo */ + 0x56, 0xcc, 0x7b, 0xd0, 0xe3, 0xd8, 0x39, 0x5f, 0xb9, 0x41, 0xda, 0x1c, 0x62, 0x88, 0x0c, 0x45, /* 0x00000090: V.{...9_.A..b..E */ + 0x03, 0x63, 0xf8, 0xff, 0xe5, 0x3e, 0x87, 0x0c, 0x75, 0xc9, 0xdd, 0xa2, 0xc0, 0x1b, 0x63, 0x19, /* 0x000000a0: .c...>..u.....c. */ + 0xeb, 0x09, 0x9d, 0xa1, 0xbb, 0x0f, 0x63, 0x67, 0x1c, 0xa3, 0xfd, 0x2f, 0xd1, 0x2a, 0xda, 0xd8, /* 0x000000b0: ......cg.....*.. */ + 0x93, 0x66, 0x45, 0x54, 0xef, 0x8b, 0x6d, 0x12, 0x15, 0x0f, 0xd4, 0xb5, 0x04, 0x17, 0x30, 0x5b, /* 0x000000c0: .fET..m.......0[ */ + 0xfa, 0x12, 0x96, 0x48, 0x5b, 0x38, 0x65, 0xfd, 0x8f, 0x0c, 0xa3, 0x11, 0x46, 0x49, 0xe0, 0x62, /* 0x000000d0: ...H[8e.....FI.b */ + 0xc3, 0xcc, 0x34, 0xe6, 0xfb, 0xab, 0x51, 0xc3, 0xd4, 0x0b, 0xdc, 0x39, 0x93, 0x87, 0x90, 0x10, /* 0x000000e0: ..4...Q....9.... */ + 0x9f, 0xce, 0x43, 0x27, 0x31, 0xd5, 0x4e, 0x52, 0x60, 0xf1, 0x93, 0xd5, 0x06, 0xc4, 0x4e, 0x65, /* 0x000000f0: ..C'1.NR`.....Ne */ + 0xb6, 0x35, 0x4a, 0x64, 0x15, 0xf8, 0xaf, 0x71, 0xb2, 0x42, 0x50, 0x89, 0x02, 0x03, 0x01, 0x00, /* 0x00000100: .5Jd...q.BP..... */ + 0x01, 0x02, 0x82, 0x01, 0x01, 0x00, 0xd0, 0x5e, 0x09, 0x3a, 0xc5, 0xdc, 0xcf, 0x2c, 0xec, 0x74, /* 0x00000110: .......^.:...,.t */ + 0x11, 0x81, 0x8d, 0x1d, 0x8f, 0x2a, 0xfa, 0x31, 0x4d, 0xe0, 0x90, 0x1a, 0xd8, 0xf5, 0x95, 0xc7, /* 0x00000120: .....*.1M....... */ + 0x70, 0x5c, 0x62, 0x42, 0xac, 0xe9, 0xd9, 0xf2, 0x14, 0xf1, 0xd0, 0x25, 0xbb, 0xeb, 0x06, 0xfe, /* 0x00000130: p\bB.......%.... */ + 0x09, 0xd6, 0x75, 0x67, 0xd7, 0x39, 0xc1, 0xa0, 0x67, 0x34, 0x4d, 0xd2, 0x12, 0x97, 0xaa, 0x5d, /* 0x00000140: ..ug.9..g4M....] */ + 0xeb, 0x0e, 0xb0, 0x16, 0x6c, 0x78, 0x8e, 0xa0, 0x75, 0xa3, 0xaa, 0x57, 0x88, 0x3b, 0x43, 0x4f, /* 0x00000150: ....lx..u..W.;CO */ + 0x75, 0x85, 0x67, 0xb0, 0x9b, 0xdd, 0x49, 0x0e, 0x6e, 0xdb, 0xea, 0xb3, 0xd4, 0x88, 0x54, 0xa0, /* 0x00000160: u.g...I.n.....T. */ + 0x46, 0x0d, 0x55, 0x6d, 0x98, 0xbd, 0x20, 0xf9, 0x9f, 0x61, 0x2d, 0x6f, 0xc7, 0xd7, 0x16, 0x66, /* 0x00000170: F.Um.. ..a-o...f */ + 0x72, 0xc7, 0x73, 0xbe, 0x9e, 0x48, 0xdc, 0x65, 0x12, 0x46, 0x35, 0x69, 0x55, 0xd8, 0x6b, 0x81, /* 0x00000180: r.s..H.e.F5iU.k. */ + 0x78, 0x40, 0x15, 0x93, 0x60, 0x31, 0x4e, 0x87, 0x15, 0x2a, 0x74, 0x74, 0x7b, 0xa0, 0x1f, 0x59, /* 0x00000190: x@..`1N..*tt{..Y */ + 0x8d, 0xc8, 0x3f, 0xdd, 0xf0, 0x13, 0x88, 0x2a, 0x4a, 0xf2, 0xf5, 0xf1, 0x9e, 0xf3, 0x2d, 0x9c, /* 0x000001a0: ..?....*J.....-. */ + 0x8e, 0xbc, 0xb1, 0x21, 0x45, 0xc7, 0x44, 0x0c, 0x6a, 0xfe, 0x4c, 0x20, 0xdc, 0x73, 0xda, 0x62, /* 0x000001b0: ...!E.D.j.L .s.b */ + 0x21, 0xcb, 0xdf, 0x06, 0xfc, 0x90, 0xc2, 0xbd, 0xd6, 0xde, 0xfb, 0xf6, 0x08, 0x69, 0x5d, 0xea, /* 0x000001c0: !............i]. */ + 0xb3, 0x7f, 0x93, 0x61, 0xf2, 0xc1, 0xd0, 0x61, 0x4f, 0xd5, 0x5b, 0x63, 0xba, 0xb0, 0x3b, 0x07, /* 0x000001d0: ...a...aO.[c..;. */ + 0x7a, 0x55, 0xcd, 0xa1, 0xae, 0x8a, 0x92, 0x21, 0xcc, 0x2f, 0x5b, 0xf8, 0x40, 0x6a, 0xcd, 0xd5, /* 0x000001e0: zU.....!..[.@j.. */ + 0x5f, 0x15, 0xf4, 0xb6, 0xbd, 0xe5, 0x91, 0xb9, 0xa8, 0xcc, 0x2a, 0xa8, 0xa6, 0x67, 0x57, 0x2b, /* 0x000001f0: _.........*..gW+ */ + 0x4b, 0xe9, 0x88, 0xe0, 0xbb, 0x58, 0xac, 0x69, 0x5f, 0x3c, 0x76, 0x28, 0xa6, 0x9d, 0xbc, 0x71, /* 0x00000200: K....X.i_......; */ + 0xd6, 0x4b, 0x38, 0x69, 0x9b, 0x71, 0x29, 0x89, 0xd4, 0x6d, 0x8c, 0x41, 0xee, 0xe2, 0x4d, 0xfc, /* 0x000002a0: .K8i.q)..m.A..M. */ + 0xf0, 0x9a, 0x73, 0xf1, 0x15, 0x94, 0xac, 0x1b, 0x68, 0x5f, 0x79, 0x15, 0x3a, 0x41, 0x55, 0x09, /* 0x000002b0: ..s.....h_y.:AU. */ + 0xc7, 0x1e, 0xec, 0x27, 0x67, 0xe2, 0xdc, 0x54, 0xa8, 0x09, 0xe6, 0x46, 0x92, 0x92, 0x03, 0x8d, /* 0x000002c0: ...'g..T...F.... */ + 0xe5, 0x96, 0xfb, 0x1a, 0xdd, 0x59, 0x6f, 0x92, 0xf1, 0xf6, 0x8f, 0x76, 0xb0, 0xc5, 0xe6, 0xd7, /* 0x000002d0: .....Yo....v.... */ + 0x1b, 0x25, 0xaf, 0x04, 0x9f, 0xd8, 0x71, 0x27, 0x97, 0x99, 0x23, 0x09, 0x7d, 0xef, 0x06, 0x13, /* 0x000002e0: .%....q'..#.}... */ + 0xab, 0xdc, 0xa2, 0xd8, 0x5f, 0xc5, 0xec, 0xf3, 0x62, 0x20, 0x72, 0x7b, 0xa8, 0xc7, 0x09, 0x24, /* 0x000002f0: ...._...b r{...$ */ + 0xaf, 0x72, 0xc9, 0xea, 0xb8, 0x2d, 0xda, 0x00, 0xc8, 0xfe, 0xb4, 0x9f, 0x9f, 0xc7, 0xa9, 0xf7, /* 0x00000300: .r...-.......... */ + 0x1d, 0xce, 0xb1, 0xdb, 0xc5, 0x8a, 0x4e, 0xe8, 0x88, 0x77, 0x68, 0xdd, 0xf8, 0x77, 0x02, 0x81, /* 0x00000310: ......N..wh..w.. */ + 0x80, 0x5b, 0xa5, 0x8e, 0x98, 0x01, 0xa8, 0xd3, 0x37, 0x33, 0x37, 0x11, 0x7e, 0xbe, 0x02, 0x07, /* 0x00000320: .[......737.~... */ + 0xf4, 0x56, 0x3f, 0xe9, 0x9f, 0xf1, 0x20, 0xc3, 0xf0, 0x4f, 0xdc, 0xf9, 0xfe, 0x40, 0xd3, 0x30, /* 0x00000330: .V?... ..O...@.0 */ + 0xc7, 0xe3, 0x2a, 0x92, 0xec, 0x56, 0xf8, 0x17, 0xa5, 0x7b, 0x4a, 0x37, 0x11, 0xcd, 0x27, 0x26, /* 0x00000340: ..*..V...{J7..'& */ + 0x8a, 0xba, 0x43, 0xda, 0x96, 0xc6, 0x0b, 0x6c, 0xe8, 0x78, 0x30, 0xea, 0x30, 0x4e, 0x7a, 0xd3, /* 0x00000350: ..C....l.x0.0Nz. */ + 0xd8, 0xd2, 0xd8, 0xca, 0x3d, 0xe2, 0xad, 0xa2, 0x74, 0x73, 0x1e, 0xbe, 0xb7, 0xad, 0x41, 0x61, /* 0x00000360: ....=...ts....Aa */ + 0x9b, 0xaa, 0xc9, 0xf9, 0xa4, 0xf1, 0x79, 0x4f, 0x42, 0x10, 0xc7, 0x36, 0x03, 0x4b, 0x0d, 0xdc, /* 0x00000370: ......yOB..6.K.. */ + 0xef, 0x3a, 0xa3, 0xab, 0x09, 0xe4, 0xe8, 0xdd, 0xc4, 0x3f, 0x06, 0x21, 0xa0, 0x23, 0x5a, 0x76, /* 0x00000380: .:.......?.!.#Zv */ + 0xea, 0xd0, 0xcf, 0x8b, 0x85, 0x5f, 0x16, 0x4b, 0x03, 0x62, 0x21, 0x3a, 0xcc, 0x2d, 0xa8, 0xd0, /* 0x00000390: ....._.K.b!:.-.. */ + 0x15, 0x02, 0x81, 0x80, 0x51, 0xf6, 0x89, 0xbb, 0xa6, 0x6b, 0xb4, 0xcb, 0xd0, 0xc1, 0x27, 0xda, /* 0x000003a0: ....Q....k....'. */ + 0xdb, 0x6e, 0xf9, 0xd6, 0xf7, 0x62, 0x81, 0xae, 0xc5, 0x72, 0x36, 0x3e, 0x66, 0x17, 0x99, 0xb0, /* 0x000003b0: .n...b...r6>f... */ + 0x14, 0xad, 0x52, 0x96, 0x03, 0xf2, 0x1e, 0x41, 0x76, 0x61, 0xb6, 0x3c, 0x02, 0x7d, 0x2a, 0x98, /* 0x000003c0: ..R....Ava.<.}*. */ + 0xb4, 0x18, 0x75, 0x38, 0x6b, 0x1d, 0x2b, 0x7f, 0x3a, 0xcf, 0x96, 0xb1, 0xc4, 0xa7, 0xd2, 0x9b, /* 0x000003d0: ..u8k.+.:....... */ + 0xd8, 0x1f, 0xb3, 0x64, 0xda, 0x15, 0x9d, 0xca, 0x91, 0x39, 0x48, 0x67, 0x00, 0x9c, 0xd4, 0x99, /* 0x000003e0: ...d.....9Hg.... */ + 0xc3, 0x45, 0x5d, 0xf0, 0x09, 0x32, 0xba, 0x21, 0x1e, 0xe2, 0x64, 0xb8, 0x50, 0x03, 0x17, 0xbe, /* 0x000003f0: .E]..2.!..d.P... */ + 0xd5, 0xda, 0x6b, 0xce, 0x34, 0xbe, 0x16, 0x03, 0x65, 0x1b, 0x2f, 0xa0, 0xa1, 0x95, 0xc6, 0x8b, /* 0x00000400: ..k.4...e....... */ + 0xc2, 0x3c, 0x59, 0x26, 0xbf, 0xb6, 0x07, 0x85, 0x53, 0x2d, 0xb6, 0x36, 0xa3, 0x91, 0xb9, 0xbb, /* 0x00000410: .3._....`u */ + 0x02, 0x57, 0x71, 0xb5, 0xed, 0x47, 0x77, 0xda, 0x1a, 0x40, 0x38, 0xab, 0x82, 0xd2, 0x0d, 0xf5, /* 0x00000470: .Wq..Gw..@8..... */ + 0x0e, 0x8e, 0xa9, 0x24, 0xdc, 0x30, 0xc9, 0x98, 0xa2, 0x05, 0xcd, 0xca, 0x01, 0xcf, 0xae, 0x1d, /* 0x00000480: ...$.0.......... */ + 0xe9, 0x02, 0x47, 0x0e, 0x46, 0x1d, 0x52, 0x02, 0x9a, 0x99, 0x22, 0x23, 0x7f, 0xf8, 0x9e, 0xc2, /* 0x00000490: ..G.F.R..."#.... */ + 0x16, 0x86, 0xca, 0xa0, 0xa7, 0x34, 0xfb, 0xbc, /* 0x000004a0: .....4.. */ +}; + +#endif /* RT_OS_WINDOWS */ + + +/** + * Certificate w/ public key + private key pair for signing. + */ +class SignToolKeyPair +{ +protected: + /* Context: */ + const char *m_pszWhat; + bool m_fMandatory; + + /* Parameters kept till finalizing parsing: */ + const char *m_pszCertFile; + const char *m_pszCertSha1; + uint8_t m_abCertSha1[RTSHA1_HASH_SIZE]; + const char *m_pszCertSubject; + const char *m_pszCertStore; + bool m_fMachineStore; /**< false = personal store */ + + const char *m_pszKeyFile; + const char *m_pszKeyPassword; + const char *m_pszKeyName; + const char *m_pszKeyProvider; + + /** String buffer for m_pszKeyPassword when read from file. */ + RTCString m_strPassword; + /** Storage for pCertificate when it's loaded from a file. */ + RTCRX509CERTIFICATE m_DecodedCert; +#ifdef RT_OS_WINDOWS + /** For the fake certificate */ + RTCRX509CERTIFICATE m_DecodedFakeCert; + /** The certificate store. */ + HCERTSTORE m_hStore; + /** The windows certificate context. */ + PCCERT_CONTEXT m_pCertCtx; + /** Whether hNCryptPrivateKey/hLegacyPrivateKey needs freeing or not. */ + BOOL m_fFreePrivateHandle; +#endif + + /** Set if already finalized. */ + bool m_fFinalized; + + /** Store containing the intermediate certificates available to the host. + * */ + static RTCRSTORE s_hStoreIntermediate; + /** Instance counter for helping cleaning up m_hStoreIntermediate. */ + static uint32_t s_cInstances; + +public: /* used to be a struct, thus not prefix either. */ + /* Result: */ + PCRTCRX509CERTIFICATE pCertificate; + RTCRKEY hPrivateKey; +#ifdef RT_OS_WINDOWS + PCRTCRX509CERTIFICATE pCertificateReal; + NCRYPT_KEY_HANDLE hNCryptPrivateKey; + HCRYPTPROV hLegacyPrivateKey; +#endif + +public: + SignToolKeyPair(const char *a_pszWhat, bool a_fMandatory = false) + : m_pszWhat(a_pszWhat) + , m_fMandatory(a_fMandatory) + , m_pszCertFile(NULL) + , m_pszCertSha1(NULL) + , m_pszCertSubject(NULL) + , m_pszCertStore("MY") + , m_fMachineStore(false) + , m_pszKeyFile(NULL) + , m_pszKeyPassword(NULL) + , m_pszKeyName(NULL) + , m_pszKeyProvider(NULL) +#ifdef RT_OS_WINDOWS + , m_hStore(NULL) + , m_pCertCtx(NULL) + , m_fFreePrivateHandle(FALSE) +#endif + , m_fFinalized(false) + , pCertificate(NULL) + , hPrivateKey(NIL_RTCRKEY) +#ifdef RT_OS_WINDOWS + , pCertificateReal(NULL) + , hNCryptPrivateKey(0) + , hLegacyPrivateKey(0) +#endif + { + RT_ZERO(m_DecodedCert); +#ifdef RT_OS_WINDOWS + RT_ZERO(m_DecodedFakeCert); +#endif + s_cInstances++; + } + + ~SignToolKeyPair() + { + if (hPrivateKey != NIL_RTCRKEY) + { + RTCrKeyRelease(hPrivateKey); + hPrivateKey = NIL_RTCRKEY; + } + if (pCertificate == &m_DecodedCert) + { + RTCrX509Certificate_Delete(&m_DecodedCert); + pCertificate = NULL; + } +#ifdef RT_OS_WINDOWS + if (pCertificate == &m_DecodedFakeCert) + { + RTCrX509Certificate_Delete(&m_DecodedFakeCert); + RTCrX509Certificate_Delete(&m_DecodedCert); + pCertificate = NULL; + pCertificateReal = NULL; + } +#endif +#ifdef RT_OS_WINDOWS + if (m_pCertCtx != NULL) + { + CertFreeCertificateContext(m_pCertCtx); + m_pCertCtx = NULL; + } + if (m_hStore != NULL) + { + CertCloseStore(m_hStore, 0); + m_hStore = NULL; + } +#endif + s_cInstances--; + if (s_cInstances == 0) + { + RTCrStoreRelease(s_hStoreIntermediate); + s_hStoreIntermediate = NIL_RTCRSTORE; + } + } + + bool isComplete(void) const + { + return pCertificate && hPrivateKey != NIL_RTCRKEY; + } + + bool isNull(void) const + { + return pCertificate == NULL && hPrivateKey == NIL_RTCRKEY; + } + + RTEXITCODE handleOption(unsigned offOpt, PRTGETOPTUNION pValueUnion) + { + AssertReturn(!m_fFinalized, RTMsgErrorExitFailure("Cannot handle options after finalizeOptions was called!")); + switch (offOpt) + { + case OPT_OFF_CERT_FILE: + m_pszCertFile = pValueUnion->psz; + m_pszCertSha1 = NULL; + m_pszCertSubject = NULL; + break; + case OPT_OFF_CERT_SHA1: + { + /* Crude normalization of input separators to colons, since it's likely + to use spaces and our conversion function only does colons or nothing. */ + char szDigest[RTSHA1_DIGEST_LEN * 3 + 1]; + int rc = RTStrCopy(szDigest, sizeof(szDigest), pValueUnion->psz); + if (RT_SUCCESS(rc)) + { + char *pszDigest = RTStrStrip(szDigest); + size_t offDst = 0; + size_t offSrc = 0; + char ch; + while ((ch = pszDigest[offSrc++]) != '\0') + { + if (ch == ' ' || ch == '\t' || ch == ':') + { + while ((ch = pszDigest[offSrc]) == ' ' || ch == '\t' || ch == ':') + offSrc++; + ch = ch ? ':' : '\0'; + } + pszDigest[offDst++] = ch; + } + pszDigest[offDst] = '\0'; + + /** @todo add a more relaxed input mode to RTStrConvertHexBytes that can deal + * with spaces as well as multi-byte cluster of inputs. */ + rc = RTStrConvertHexBytes(pszDigest, m_abCertSha1, RTSHA1_HASH_SIZE, RTSTRCONVERTHEXBYTES_F_SEP_COLON); + if (RT_SUCCESS(rc)) + { + m_pszCertFile = NULL; + m_pszCertSha1 = pValueUnion->psz; + m_pszCertSubject = NULL; + break; + } + } + return RTMsgErrorExitFailure("malformed SHA-1 certificate fingerprint (%Rrc): %s", rc, pValueUnion->psz); + } + case OPT_OFF_CERT_SUBJECT: + m_pszCertFile = NULL; + m_pszCertSha1 = NULL; + m_pszCertSubject = pValueUnion->psz; + break; + case OPT_OFF_CERT_STORE: + m_pszCertStore = pValueUnion->psz; + break; + case OPT_OFF_CERT_STORE_MACHINE: + m_fMachineStore = true; + break; + + case OPT_OFF_KEY_FILE: + m_pszKeyFile = pValueUnion->psz; + m_pszKeyName = NULL; + break; + case OPT_OFF_KEY_NAME: + m_pszKeyFile = NULL; + m_pszKeyName = pValueUnion->psz; + break; + case OPT_OFF_KEY_PROVIDER: + m_pszKeyProvider = pValueUnion->psz; + break; + case OPT_OFF_KEY_PASSWORD: + m_pszKeyPassword = pValueUnion->psz; + break; + case OPT_OFF_KEY_PASSWORD_FILE: + { + m_pszKeyPassword = NULL; + + size_t const cchMax = 512; + int rc = m_strPassword.reserveNoThrow(cchMax + 1); + if (RT_FAILURE(rc)) + return RTMsgErrorExitFailure("out of memory"); + + PRTSTREAM pStrm = g_pStdIn; + bool const fClose = strcmp(pValueUnion->psz, "stdin") != 0; + if (fClose) + { + rc = RTStrmOpen(pValueUnion->psz, "r", &pStrm); + if (RT_FAILURE(rc)) + return RTMsgErrorExitFailure("Failed to open password file '%s' for reading: %Rrc", pValueUnion->psz, rc); + } + rc = RTStrmGetLine(pStrm, m_strPassword.mutableRaw(), cchMax); + if (fClose) + RTStrmClose(pStrm); + if (rc == VERR_BUFFER_OVERFLOW || rc == VINF_BUFFER_OVERFLOW) + return RTMsgErrorExitFailure("Password from '%s' is too long (max %zu)", pValueUnion->psz, cchMax); + if (RT_FAILURE(rc)) + return RTMsgErrorExitFailure("Error reading password from '%s': %Rrc", pValueUnion->psz, rc); + + m_strPassword.jolt(); + m_strPassword.stripRight(); + m_pszKeyPassword = m_strPassword.c_str(); + break; + } + default: + AssertFailedReturn(RTMsgErrorExitFailure("Invalid offOpt=%u!\n", offOpt)); + } + return RTEXITCODE_SUCCESS; + } + + RTEXITCODE finalizeOptions(unsigned cVerbosity) + { + RT_NOREF(cVerbosity); + + /* Only do this once. */ + if (m_fFinalized) + return RTEXITCODE_SUCCESS; + m_fFinalized = true; + + /* + * Got a cert? Is it required? + */ + bool const fHasKey = ( m_pszKeyFile != NULL + || m_pszKeyName != NULL); + bool const fHasCert = ( m_pszCertFile != NULL + || m_pszCertSha1 != NULL + || m_pszCertSubject != NULL); + if (!fHasCert) + { + if (m_fMandatory) + return RTMsgErrorExit(RTEXITCODE_SYNTAX, "Specifying a %s certificiate is required.", m_pszWhat); + return RTEXITCODE_SUCCESS; + } + + /* + * Get the certificate. + */ + RTERRINFOSTATIC ErrInfo; + /* From file: */ + if (m_pszCertFile) + { + int rc = RTCrX509Certificate_ReadFromFile(&m_DecodedCert, m_pszCertFile, 0, &g_RTAsn1DefaultAllocator, + RTErrInfoInitStatic(&ErrInfo)); + if (RT_FAILURE(rc)) + return RTMsgErrorExitFailure("Error reading %s certificate from '%s': %Rrc%#RTeim", + m_pszWhat, m_pszCertFile, rc, &ErrInfo.Core); + pCertificate = &m_DecodedCert; + } + /* From certificate store by name (substring) or fingerprint: */ + else + { +#ifdef RT_OS_WINDOWS + m_hStore = CertOpenStore(CERT_STORE_PROV_SYSTEM_A, X509_ASN_ENCODING, NULL, + CERT_STORE_DEFER_CLOSE_UNTIL_LAST_FREE_FLAG | CERT_STORE_READONLY_FLAG + | CERT_STORE_OPEN_EXISTING_FLAG | CERT_STORE_ENUM_ARCHIVED_FLAG + | (m_fMachineStore ? CERT_SYSTEM_STORE_LOCAL_MACHINE : CERT_SYSTEM_STORE_CURRENT_USER), + m_pszCertStore); + if (m_hStore == NULL) + return RTMsgErrorExitFailure("Failed to open %s store '%s': %Rwc (%u)", m_fMachineStore ? "machine" : "user", + m_pszCertStore, GetLastError(), GetLastError()); + + CRYPT_HASH_BLOB Thumbprint = { RTSHA1_HASH_SIZE, m_abCertSha1 }; + PRTUTF16 pwszSubject = NULL; + void const *pvFindParam = &Thumbprint; + DWORD fFind = CERT_FIND_SHA1_HASH; + if (!m_pszCertSha1) + { + int rc = RTStrToUtf16(m_pszCertSubject, &pwszSubject); + if (RT_FAILURE(rc)) + return RTMsgErrorExitFailure("RTStrToUtf16 failed: %Rrc, input %.*Rhxs", + rc, strlen(m_pszCertSubject), m_pszCertSubject); + pvFindParam = pwszSubject; + fFind = CERT_FIND_SUBJECT_STR; + } + + while ((m_pCertCtx = CertFindCertificateInStore(m_hStore, X509_ASN_ENCODING | PKCS_7_ASN_ENCODING, 0 /*fFlags*/, + fFind, pvFindParam, m_pCertCtx)) != NULL) + { + if (m_pCertCtx->dwCertEncodingType & X509_ASN_ENCODING) + { + RTASN1CURSORPRIMARY PrimaryCursor; + RTAsn1CursorInitPrimary(&PrimaryCursor, m_pCertCtx->pbCertEncoded, m_pCertCtx->cbCertEncoded, + RTErrInfoInitStatic(&ErrInfo), + &g_RTAsn1DefaultAllocator, RTASN1CURSOR_FLAGS_DER, "CurCtx"); + int rc = RTCrX509Certificate_DecodeAsn1(&PrimaryCursor.Cursor, 0, &m_DecodedCert, "Cert"); + if (RT_SUCCESS(rc)) + { + pCertificate = &m_DecodedCert; + break; + } + RTMsgError("failed to decode certificate %p: %Rrc%#RTeim", m_pCertCtx, rc, &ErrInfo.Core); + } + } + + RTUtf16Free(pwszSubject); + if (!m_pCertCtx) + return RTMsgErrorExitFailure("No certificate found matching %s '%s' (%Rwc / %u)", + m_pszCertSha1 ? "thumbprint" : "subject substring", + m_pszCertSha1 ? m_pszCertSha1 : m_pszCertSubject, GetLastError(), GetLastError()); + + /* Use this for private key too? */ + if (!fHasKey) + { + HCRYPTPROV_OR_NCRYPT_KEY_HANDLE hTmpPrivateKey = 0; + DWORD dwKeySpec = 0; + if (CryptAcquireCertificatePrivateKey(m_pCertCtx, + CRYPT_ACQUIRE_SILENT_FLAG | CRYPT_ACQUIRE_COMPARE_KEY_FLAG + | CRYPT_ACQUIRE_ALLOW_NCRYPT_KEY_FLAG + | CRYPT_ACQUIRE_ONLY_NCRYPT_KEY_FLAG, + NULL, &hTmpPrivateKey, &dwKeySpec, &m_fFreePrivateHandle)) + { + if (cVerbosity > 1) + RTMsgInfo("hTmpPrivateKey=%p m_fFreePrivateHandle=%d dwKeySpec=%#x", + hTmpPrivateKey, m_fFreePrivateHandle, dwKeySpec); + Assert(dwKeySpec == CERT_NCRYPT_KEY_SPEC); + if (dwKeySpec == CERT_NCRYPT_KEY_SPEC) + hNCryptPrivateKey = hTmpPrivateKey; + else + hLegacyPrivateKey = hTmpPrivateKey; /** @todo remove or drop CRYPT_ACQUIRE_ONLY_NCRYPT_KEY_FLAG */ + return loadFakePrivateKeyAndCert(); + } + return RTMsgErrorExitFailure("CryptAcquireCertificatePrivateKey failed: %Rwc (%d)", GetLastError(), GetLastError()); + } +#else + return RTMsgErrorExitFailure("Certificate store support is missing on this host"); +#endif + } + + /* + * Get hold of the private key (if someone above already did, they'd returned already). + */ + Assert(hPrivateKey == NIL_RTCRKEY); + /* Use cert file if nothing else specified. */ + if (!fHasKey && m_pszCertFile) + m_pszKeyFile = m_pszCertFile; + + /* Load from file:*/ + if (m_pszKeyFile) + { + int rc = RTCrKeyCreateFromFile(&hPrivateKey, 0 /*fFlags*/, m_pszKeyFile, m_pszKeyPassword, + RTErrInfoInitStatic(&ErrInfo)); + if (RT_FAILURE(rc)) + return RTMsgErrorExitFailure("Error reading the %s private key from '%s': %Rrc%#RTeim", + m_pszWhat, m_pszKeyFile, rc, &ErrInfo.Core); + } + /* From key store: */ + else + { + return RTMsgErrorExitFailure("Key store support is missing on this host"); + } + + return RTEXITCODE_SUCCESS; + } + + /** Returns the real certificate. */ + PCRTCRX509CERTIFICATE getRealCertificate() const + { +#ifdef RT_OS_WINDOWS + if (pCertificateReal) + return pCertificateReal; +#endif + return pCertificate; + } + +#ifdef RT_OS_WINDOWS + RTEXITCODE loadFakePrivateKeyAndCert() + { + int rc = RTCrX509Certificate_ReadFromBuffer(&m_DecodedFakeCert, g_abFakeCertificate, sizeof(g_abFakeCertificate), + 0 /*fFlags*/, &g_RTAsn1DefaultAllocator, NULL, NULL); + if (RT_FAILURE(rc)) + return RTMsgErrorExitFailure("RTCrX509Certificate_ReadFromBuffer/g_abFakeCertificate failed: %Rrc", rc); + pCertificateReal = pCertificate; + pCertificate = &m_DecodedFakeCert; + + rc = RTCrKeyCreateFromBuffer(&hPrivateKey, 0 /*fFlags*/, g_abFakeRsaKey, sizeof(g_abFakeRsaKey), NULL, NULL, NULL); + if (RT_FAILURE(rc)) + return RTMsgErrorExitFailure("RTCrKeyCreateFromBuffer/g_abFakeRsaKey failed: %Rrc", rc); + return RTEXITCODE_SUCCESS; + } + +#endif + + /** + * Search for intermediate CA. + * + * Currently this only do a single certificate path, so this may go south if + * there are multiple paths available. It may work fine for a cross signing + * path, as long as the cross over is at the level immediately below the root. + */ + PCRTCRCERTCTX findNextIntermediateCert(PCRTCRCERTCTX pPrev) + { + /* + * Make sure the store is loaded before we start. + */ + if (s_hStoreIntermediate == NIL_RTCRSTORE) + { + Assert(!pPrev); + RTERRINFOSTATIC ErrInfo; + int rc = RTCrStoreCreateSnapshotById(&s_hStoreIntermediate, + !m_fMachineStore + ? RTCRSTOREID_USER_INTERMEDIATE_CAS : RTCRSTOREID_SYSTEM_INTERMEDIATE_CAS, + RTErrInfoInitStatic(&ErrInfo)); + if (RT_FAILURE(rc)) + { + RTMsgError("RTCrStoreCreateSnapshotById/%s-intermediate-CAs failed: %Rrc%#RTeim", + m_fMachineStore ? "user" : "machine", rc, &ErrInfo.Core); + return NULL; + } + } + + /* + * Open the search handle for the parent of the previous/end certificate. + * + * We don't need to consider RTCRCERTCTX::pTaInfo here as we're not + * after trust anchors, only intermediate certificates. + */ +#ifdef RT_OS_WINDOWS + PCRTCRX509CERTIFICATE pChildCert = pPrev ? pPrev->pCert : pCertificateReal ? pCertificateReal : pCertificate; +#else + PCRTCRX509CERTIFICATE pChildCert = pPrev ? pPrev->pCert : pCertificate; +#endif + AssertReturnStmt(pChildCert, RTCrCertCtxRelease(pPrev), NULL); + + RTCRSTORECERTSEARCH Search; + int rc = RTCrStoreCertFindBySubjectOrAltSubjectByRfc5280(s_hStoreIntermediate, &pChildCert->TbsCertificate.Issuer, + &Search); + if (RT_FAILURE(rc)) + { + RTMsgError("RTCrStoreCertFindBySubjectOrAltSubjectByRfc5280 failed: %Rrc", rc); + return NULL; + } + + /* + * We only gave the subject so, we have to check the serial number our selves. + */ + PCRTCRCERTCTX pCertCtx; + while ((pCertCtx = RTCrStoreCertSearchNext(s_hStoreIntermediate, &Search)) != NULL) + { + if ( pCertCtx->pCert + && RTAsn1BitString_Compare(&pCertCtx->pCert->TbsCertificate.T1.IssuerUniqueId, + &pChildCert->TbsCertificate.T1.IssuerUniqueId) == 0 /* compares presentness too */ + && !RTCrX509Certificate_IsSelfSigned(pCertCtx->pCert)) + { + break; /** @todo compare valid periode too and keep a best match when outside the desired period? */ + } + RTCrCertCtxRelease(pCertCtx); + } + + RTCrStoreCertSearchDestroy(s_hStoreIntermediate, & Search); + RTCrCertCtxRelease(pPrev); + return pCertCtx; + } + + /** + * Merges the user specified certificates with the signing certificate and any + * intermediate CAs we can find in the system store. + * + * @returns Merged store, NIL_RTCRSTORE on failure (messaged). + * @param hUserSpecifiedCertificates The user certificate store. + */ + RTCRSTORE assembleAllAdditionalCertificates(RTCRSTORE hUserSpecifiedCertificates) + { + RTCRSTORE hRetStore; + int rc = RTCrStoreCreateInMemEx(&hRetStore, 0, hUserSpecifiedCertificates); + if (RT_SUCCESS(rc)) + { + /* Add the signing certificate: */ + RTERRINFOSTATIC ErrInfo; + rc = RTCrStoreCertAddX509(hRetStore, RTCRCERTCTX_F_ENC_X509_DER | RTCRCERTCTX_F_ADD_IF_NOT_FOUND, +#ifdef RT_OS_WINDOWS + (PRTCRX509CERTIFICATE)(pCertificateReal ? pCertificateReal : pCertificate), +#else + (PRTCRX509CERTIFICATE)pCertificate, +#endif + RTErrInfoInitStatic(&ErrInfo)); + if (RT_SUCCESS(rc)) + { + /* Add all intermediate CAs certificates we can find. */ + PCRTCRCERTCTX pInterCaCert = NULL; + while ((pInterCaCert = findNextIntermediateCert(pInterCaCert)) != NULL) + { + rc = RTCrStoreCertAddEncoded(hRetStore, RTCRCERTCTX_F_ENC_X509_DER | RTCRCERTCTX_F_ADD_IF_NOT_FOUND, + pInterCaCert->pabEncoded, pInterCaCert->cbEncoded, + RTErrInfoInitStatic(&ErrInfo)); + if (RT_FAILURE(rc)) + { + RTMsgError("RTCrStoreCertAddEncoded/InterCA failed: %Rrc%#RTeim", rc, &ErrInfo.Core); + RTCrCertCtxRelease(pInterCaCert); + break; + } + } + if (RT_SUCCESS(rc)) + return hRetStore; + } + else + RTMsgError("RTCrStoreCertAddX509/signer failed: %Rrc%#RTeim", rc, &ErrInfo.Core); + RTCrStoreRelease(hRetStore); + } + else + RTMsgError("RTCrStoreCreateInMemEx failed: %Rrc", rc); + return NIL_RTCRSTORE; + } + +}; + +/*static*/ RTCRSTORE SignToolKeyPair::s_hStoreIntermediate = NIL_RTCRSTORE; +/*static*/ uint32_t SignToolKeyPair::s_cInstances = 0; + + + +/********************************************************************************************************************************* +* Workers. * +*********************************************************************************************************************************/ + + /** * Deletes the structure. * @@ -252,6 +1059,7 @@ */ RT_ZERO(*pThis); pThis->pszFilename = pszFilename; + pThis->enmType = RTSIGNTOOLFILETYPE_CAT; /* * Lazy bird uses RTFileReadAll and duplicates the allocation. @@ -333,6 +1141,40 @@ /** + * Helper that makes sure the UnauthenticatedAttributes are present in the given + * SignerInfo structure. + * + * Call this before trying to modify the array. + * + * @returns RTEXITCODE_SUCCESS on success, RTEXITCODE_FAILURE with error already + * displayed on failure. + * @param pSignerInfo The SignerInfo structure in question. + */ +static RTEXITCODE SignToolPkcs7_EnsureUnauthenticatedAttributesPresent(PRTCRPKCS7SIGNERINFO pSignerInfo) +{ + if (pSignerInfo->UnauthenticatedAttributes.cItems == 0) + { + /* HACK ALERT! Invent ASN.1 setters/whatever for members to replace this mess. */ + + if (pSignerInfo->AuthenticatedAttributes.cItems == 0) + return RTMsgErrorExit(RTEXITCODE_FAILURE, "No authenticated or unauthenticated attributes! Sorry, no can do."); + + Assert(pSignerInfo->UnauthenticatedAttributes.SetCore.Asn1Core.uTag == 0); + int rc = RTAsn1SetCore_Init(&pSignerInfo->UnauthenticatedAttributes.SetCore, + pSignerInfo->AuthenticatedAttributes.SetCore.Asn1Core.pOps); + if (RT_FAILURE(rc)) + return RTMsgErrorExit(RTEXITCODE_FAILURE, "RTAsn1SetCore_Init failed: %Rrc", rc); + pSignerInfo->UnauthenticatedAttributes.SetCore.Asn1Core.uTag = 1; + pSignerInfo->UnauthenticatedAttributes.SetCore.Asn1Core.fClass = ASN1_TAGCLASS_CONTEXT | ASN1_TAGFLAG_CONSTRUCTED; + RTAsn1MemInitArrayAllocation(&pSignerInfo->UnauthenticatedAttributes.Allocation, + pSignerInfo->AuthenticatedAttributes.Allocation.pAllocator, + sizeof(**pSignerInfo->UnauthenticatedAttributes.papItems)); + } + return RTEXITCODE_SUCCESS; +} + + +/** * Adds the @a pSrc signature as a nested signature. * * @returns RTEXITCODE_SUCCESS on success, RTEXITCODE_FAILURE with error message @@ -347,34 +1189,18 @@ unsigned cVerbosity, bool fPrepend) { PRTCRPKCS7SIGNERINFO pSignerInfo = pThis->pSignedData->SignerInfos.papItems[0]; - int rc; /* * Deal with UnauthenticatedAttributes being absent before trying to append to the array. */ - if (pSignerInfo->UnauthenticatedAttributes.cItems == 0) - { - /* HACK ALERT! Invent ASN.1 setters/whatever for members to replace this mess. */ - - if (pSignerInfo->AuthenticatedAttributes.cItems == 0) - return RTMsgErrorExit(RTEXITCODE_FAILURE, "No authenticated or unauthenticated attributes! Sorry, no can do."); - - Assert(pSignerInfo->UnauthenticatedAttributes.SetCore.Asn1Core.uTag == 0); - rc = RTAsn1SetCore_Init(&pSignerInfo->UnauthenticatedAttributes.SetCore, - pSignerInfo->AuthenticatedAttributes.SetCore.Asn1Core.pOps); - if (RT_FAILURE(rc)) - return RTMsgErrorExit(RTEXITCODE_FAILURE, "RTAsn1SetCore_Init failed: %Rrc", rc); - pSignerInfo->UnauthenticatedAttributes.SetCore.Asn1Core.uTag = 1; - pSignerInfo->UnauthenticatedAttributes.SetCore.Asn1Core.fClass = ASN1_TAGCLASS_CONTEXT | ASN1_TAGFLAG_CONSTRUCTED; - RTAsn1MemInitArrayAllocation(&pSignerInfo->UnauthenticatedAttributes.Allocation, - pSignerInfo->AuthenticatedAttributes.Allocation.pAllocator, - sizeof(**pSignerInfo->UnauthenticatedAttributes.papItems)); - } + RTEXITCODE rcExit = SignToolPkcs7_EnsureUnauthenticatedAttributesPresent(pSignerInfo); + if (rcExit != RTEXITCODE_SUCCESS) + return rcExit; /* * Find or add an unauthenticated attribute for nested signatures. */ - rc = VERR_NOT_FOUND; + int rc = VERR_NOT_FOUND; PRTCRPKCS7ATTRIBUTE pAttr = NULL; int32_t iPos = pSignerInfo->UnauthenticatedAttributes.cItems; while (iPos-- > 0) @@ -494,13 +1320,14 @@ /** * Worker for recursively searching for MS nested signatures and signer infos. * - * @returns Pointer to the signer info corresponding to @a iSignature. NULL if - * not found. + * @returns Pointer to the signer info corresponding to @a iReqSignature. NULL + * if not found. * @param pSignedData The signature to search. * @param piNextSignature Pointer to the variable keeping track of the next * signature number. * @param iReqSignature The request signature number. * @param ppSignedData Where to return the signature data structure. + * Optional. */ static PRTCRPKCS7SIGNERINFO SignToolPkcs7_FindNestedSignatureByIndexWorker(PRTCRPKCS7SIGNEDDATA pSignedData, uint32_t *piNextSignature, @@ -513,7 +1340,8 @@ PRTCRPKCS7SIGNERINFO pSignerInfo = pSignedData->SignerInfos.papItems[iSignerInfo]; if (*piNextSignature == iReqSignature) { - *ppSignedData = pSignedData; + if (ppSignedData) + *ppSignedData = pSignedData; return pSignerInfo; } *piNextSignature += 1; @@ -545,8 +1373,8 @@ /** * Locates the given nested signature. * - * @returns Pointer to the signer info corresponding to @a iSignature. NULL if - * not found. + * @returns Pointer to the signer info corresponding to @a iReqSignature. NULL + * if not found. * @param pThis The PKCS\#7 structure to search. * @param iReqSignature The requested signature number. * @param ppSignedData Where to return the pointer to the signed data that @@ -564,7 +1392,7 @@ /** - * Reads and decodes PKCS\#7 signature from the given executable. + * Reads and decodes PKCS\#7 signature from the given executable, if it has one. * * @returns RTEXITCODE_SUCCESS on success, RTEXITCODE_FAILURE with error message * on failure. @@ -572,16 +1400,18 @@ * @param pszFilename The executable filename. * @param cVerbosity The verbosity. * @param enmLdrArch For FAT binaries. + * @param fAllowUnsigned Whether to allow unsigned binaries. */ -static RTEXITCODE SignToolPkcs7Exe_InitFromFile(PSIGNTOOLPKCS7EXE pThis, const char *pszFilename, - unsigned cVerbosity, RTLDRARCH enmLdrArch = RTLDRARCH_WHATEVER) +static RTEXITCODE SignToolPkcs7Exe_InitFromFile(PSIGNTOOLPKCS7EXE pThis, const char *pszFilename, unsigned cVerbosity, + RTLDRARCH enmLdrArch = RTLDRARCH_WHATEVER, bool fAllowUnsigned = false) { /* * Init the return structure. */ RT_ZERO(*pThis); - pThis->hLdrMod = NIL_RTLDRMOD; + pThis->hLdrMod = NIL_RTLDRMOD; pThis->pszFilename = pszFilename; + pThis->enmType = RTSIGNTOOLFILETYPE_EXE; /* * Open the image and check if it's signed. @@ -641,7 +1471,12 @@ RTMsgError("RTLdrQueryPropEx/RTLDRPROP_PKCS7_SIGNED_DATA failed on '%s': %Rrc\n", pszFilename, rc); } else if (RT_SUCCESS(rc)) - RTMsgInfo("'%s': not signed\n", pszFilename); + { + if (!fAllowUnsigned || cVerbosity >= 2) + RTMsgInfo("'%s': not signed\n", pszFilename); + if (fAllowUnsigned) + return RTEXITCODE_SUCCESS; + } else RTMsgError("RTLdrQueryProp/RTLDRPROP_IS_SIGNED failed on '%s': %Rrc\n", pszFilename, rc); } @@ -675,9 +1510,9 @@ pfnMapFileAndCheckSumW = (decltype(MapFileAndCheckSumW) *)RTLdrGetSystemSymbol("IMAGEHLP.DLL", "MapFileAndCheckSumW"); if (pfnMapFileAndCheckSumW) { - DWORD uHeaderSum = UINT32_MAX; - DWORD uCheckSum = UINT32_MAX; - DWORD dwRc = pfnMapFileAndCheckSumW(pwszPath, &uHeaderSum, &uCheckSum); + DWORD uOldSum = UINT32_MAX; + DWORD uCheckSum = UINT32_MAX; + DWORD dwRc = pfnMapFileAndCheckSumW(pwszPath, &uOldSum, &uCheckSum); if (dwRc == CHECKSUM_SUCCESS) { *puCheckSum = uCheckSum; @@ -770,7 +1605,7 @@ if (RT_FAILURE(rc)) RTMsgError("Error truncating file to %#x bytes: %Rrc", pSecDir->VirtualAddress, rc); } - else + else if (pSecDir->Size != 0 && pSecDir->VirtualAddress == 0) rc = RTMsgErrorRc(VERR_BAD_EXE_FORMAT, "Bad security directory entry: VA=%#x Size=%#x", pSecDir->VirtualAddress, pSecDir->Size); if (RT_SUCCESS(rc)) @@ -880,39 +1715,1505 @@ return RTEXITCODE_FAILURE; } +#ifndef IPRT_SIGNTOOL_NO_SIGNING - -/* - * The 'extract-exe-signer-cert' command. - */ -static RTEXITCODE HelpExtractExeSignerCert(PRTSTREAM pStrm, RTSIGNTOOLHELP enmLevel) +static PRTCRPKCS7ATTRIBUTE SignToolPkcs7_AuthAttribAppend(PRTCRPKCS7ATTRIBUTES pAuthAttribs) +{ + int32_t iPos = RTCrPkcs7Attributes_Append(pAuthAttribs); + if (iPos >= 0) + return pAuthAttribs->papItems[iPos]; + RTMsgError("RTCrPkcs7Attributes_Append failed: %Rrc", iPos); + return NULL; +} + + +static RTEXITCODE SignToolPkcs7_AuthAttribsAddSigningTime(PRTCRPKCS7ATTRIBUTES pAuthAttribs, RTTIMESPEC SigningTime) +{ + /* + * Signing time. For the old-style timestamps, Symantec used ASN.1 UTC TIME. + * start -vv vv=ASN1_TAG_UTC_TIME + * 00000187d6a65fd0/23b0: 0d 01 09 05 31 0f 17 0d-31 36 31 30 30 35 30 37 ....1...16100507 + * 00000187d6a65fe0/23c0: 35 30 33 30 5a 30 23 06-09 2a 86 48 86 f7 0d 01 5030Z0#..*.H.... + * ^^- end 2016-10-05T07:50:30.000000000Z (161005075030Z) + */ + PRTCRPKCS7ATTRIBUTE pAttr = SignToolPkcs7_AuthAttribAppend(pAuthAttribs); + if (!pAttr) + return RTEXITCODE_FAILURE; + + int rc = RTCrPkcs7Attribute_SetSigningTime(pAttr, NULL, pAuthAttribs->Allocation.pAllocator); + if (RT_FAILURE(rc)) + return RTMsgErrorExitFailure("RTCrPkcs7Attribute_SetSigningTime failed: %Rrc", rc); + + /* Create the timestamp. */ + int32_t iPos = RTAsn1SetOfTimes_Append(pAttr->uValues.pSigningTime); + if (iPos < 0) + return RTMsgErrorExitFailure("RTAsn1SetOfTimes_Append failed: %Rrc", iPos); + + PRTASN1TIME pTime = pAttr->uValues.pSigningTime->papItems[iPos]; + rc = RTAsn1Time_SetTimeSpec(pTime, pAttr->Allocation.pAllocator, &SigningTime); + if (RT_FAILURE(rc)) + return RTMsgErrorExitFailure("RTAsn1Time_SetTimeSpec failed: %Rrc", rc); + + return RTEXITCODE_SUCCESS; +} + + +static RTEXITCODE SignToolPkcs7_AuthAttribsAddSpcOpusInfo(PRTCRPKCS7ATTRIBUTES pAuthAttribs, void *pvInfo) +{ + /** @todo The OpusInfo is a structure with an optional SpcString and an + * optional SpcLink (url). The two attributes can be set using the /d and /du + * options of MS signtool.exe, I think. We shouldn't be using them atm. */ + + PRTCRPKCS7ATTRIBUTE pAttr = SignToolPkcs7_AuthAttribAppend(pAuthAttribs); + if (!pAttr) + return RTEXITCODE_FAILURE; + + int rc = RTCrPkcs7Attribute_SetMsStatementType(pAttr, NULL, pAuthAttribs->Allocation.pAllocator); + if (RT_FAILURE(rc)) + return RTMsgErrorExitFailure("RTCrPkcs7Attribute_SetMsStatementType failed: %Rrc", rc); + + /* Override the ID. */ + rc = RTAsn1ObjId_SetFromString(&pAttr->Type, RTCR_PKCS9_ID_MS_SP_OPUS_INFO, pAuthAttribs->Allocation.pAllocator); + if (RT_FAILURE(rc)) + return RTMsgErrorExitFailure("RTAsn1ObjId_SetFromString failed: %Rrc", rc); + + /* Add attribute value entry. */ + int32_t iPos = RTAsn1SetOfObjIdSeqs_Append(pAttr->uValues.pObjIdSeqs); + if (iPos < 0) + return RTMsgErrorExitFailure("RTAsn1SetOfObjIdSeqs_Append failed: %Rrc", iPos); + + RT_NOREF(pvInfo); Assert(!pvInfo); + return RTEXITCODE_SUCCESS; +} + + +static RTEXITCODE SignToolPkcs7_AuthAttribsAddMsStatementType(PRTCRPKCS7ATTRIBUTES pAuthAttribs, const char *pszTypeId) +{ + PRTCRPKCS7ATTRIBUTE pAttr = SignToolPkcs7_AuthAttribAppend(pAuthAttribs); + if (!pAttr) + return RTEXITCODE_FAILURE; + + int rc = RTCrPkcs7Attribute_SetMsStatementType(pAttr, NULL, pAuthAttribs->Allocation.pAllocator); + if (RT_FAILURE(rc)) + return RTMsgErrorExitFailure("RTCrPkcs7Attribute_SetMsStatementType failed: %Rrc", rc); + + /* Add attribute value entry. */ + int32_t iPos = RTAsn1SetOfObjIdSeqs_Append(pAttr->uValues.pObjIdSeqs); + if (iPos < 0) + return RTMsgErrorExitFailure("RTAsn1SetOfObjIdSeqs_Append failed: %Rrc", iPos); + PRTASN1SEQOFOBJIDS pSeqObjIds = pAttr->uValues.pObjIdSeqs->papItems[iPos]; + + /* Add a object id to the value. */ + RTASN1OBJID ObjIdValue; + rc = RTAsn1ObjId_InitFromString(&ObjIdValue, pszTypeId, &g_RTAsn1DefaultAllocator); + if (RT_FAILURE(rc)) + return RTMsgErrorExitFailure("RTAsn1ObjId_InitFromString/%s failed: %Rrc", pszTypeId, rc); + + rc = RTAsn1SeqOfObjIds_InsertEx(pSeqObjIds, 0 /*iPos*/, &ObjIdValue, &g_RTAsn1DefaultAllocator, NULL); + RTAsn1ObjId_Delete(&ObjIdValue); + if (RT_FAILURE(rc)) + return RTMsgErrorExitFailure("RTAsn1SeqOfObjIds_InsertEx failed: %Rrc", rc); + + return RTEXITCODE_SUCCESS; +} + + +static RTEXITCODE SignToolPkcs7_AuthAttribsAddContentType(PRTCRPKCS7ATTRIBUTES pAuthAttribs, const char *pszContentTypeId) +{ + PRTCRPKCS7ATTRIBUTE pAttr = SignToolPkcs7_AuthAttribAppend(pAuthAttribs); + if (!pAttr) + return RTEXITCODE_FAILURE; + + int rc = RTCrPkcs7Attribute_SetContentType(pAttr, NULL, pAuthAttribs->Allocation.pAllocator); + if (RT_FAILURE(rc)) + return RTMsgErrorExitFailure("RTCrPkcs7Attribute_SetContentType failed: %Rrc", rc); + + /* Add a object id to the value. */ + RTASN1OBJID ObjIdValue; + rc = RTAsn1ObjId_InitFromString(&ObjIdValue, pszContentTypeId, pAuthAttribs->Allocation.pAllocator); + if (RT_FAILURE(rc)) + return RTMsgErrorExitFailure("RTAsn1ObjId_InitFromString/%s failed: %Rrc", pszContentTypeId, rc); + + rc = RTAsn1SetOfObjIds_InsertEx(pAttr->uValues.pObjIds, 0 /*iPos*/, &ObjIdValue, pAuthAttribs->Allocation.pAllocator, NULL); + RTAsn1ObjId_Delete(&ObjIdValue); + if (RT_FAILURE(rc)) + return RTMsgErrorExitFailure("RTAsn1SetOfObjIds_InsertEx failed: %Rrc", rc); + + return RTEXITCODE_SUCCESS; +} + + +static RTEXITCODE SignToolPkcs7_AddAuthAttribsForTimestamp(PRTCRPKCS7ATTRIBUTES pAuthAttribs, bool fTimestampTypeOld, + RTTIMESPEC SigningTime, PCRTCRX509CERTIFICATE pTimestampCert) +{ + /* + * Add content type. + */ + RTEXITCODE rcExit = SignToolPkcs7_AuthAttribsAddContentType(pAuthAttribs, + fTimestampTypeOld ? RTCR_PKCS7_DATA_OID : RTCRTSPTSTINFO_OID); + if (rcExit != RTEXITCODE_SUCCESS) + return rcExit; + + /* + * Add signing time. + */ + rcExit = SignToolPkcs7_AuthAttribsAddSigningTime(pAuthAttribs, SigningTime); + if (rcExit != RTEXITCODE_SUCCESS) + return rcExit; + + /* + * More later if we want to support fTimestampTypeOld = false perhaps? + */ + Assert(fTimestampTypeOld); + RT_NOREF(fTimestampTypeOld, pTimestampCert); + + return RTEXITCODE_SUCCESS; +} + + +static RTEXITCODE SignToolPkcs7_AddAuthAttribsForImageOrCatSignature(PRTCRPKCS7ATTRIBUTES pAuthAttribs, RTTIMESPEC SigningTime, + bool fNoSigningTime, const char *pszContentTypeId) +{ + /* + * Add SpcOpusInfo. No attribute values. + * SEQ start -vv vv- Type ObjId + * 1c60: 0e 03 02 1a 05 00 a0 70-30 10 06 0a 2b 06 01 04 .......p0...+... + * 1c70: 01 82 37 02 01 0c 31 02-30 00 30 19 06 09 2a 86 ..7...1.0.0...*. + * Set Of -^^ ^^- Empty Sequence. + */ + RTEXITCODE rcExit = SignToolPkcs7_AuthAttribsAddSpcOpusInfo(pAuthAttribs, NULL /*pvInfo - none*/); + if (rcExit != RTEXITCODE_SUCCESS) + return rcExit; + + /* + * Add ContentType = Ms-SpcIndirectDataContext? + * SEQ start -vv vv- Type ObjId + * 1c70: 01 82 37 02 01 0c 31 02-30 00 30 19 06 09 2a 86 ..7...1.0.0...*. + * 1c80: 48 86 f7 0d 01 09 03 31-0c 06 0a 2b 06 01 04 01 H......1...+.... + * 1c90: 82 37 02 01 04 ^^- ^^- ObjId + * ^- Set Of + */ + rcExit = SignToolPkcs7_AuthAttribsAddContentType(pAuthAttribs, pszContentTypeId); + if (rcExit != RTEXITCODE_SUCCESS) + return rcExit; + + /* + * Add Ms-SpcStatementType = Ms-SpcIndividualCodeSigning. + * SEQ start -vv vv- Type ObjId + * 1c90: 82 37 02 01 04 30 1c 06-0a 2b 06 01 04 01 82 37 .7...0...+.....7 + * 1ca0: 02 01 0b 31 0e 30 0c 06-0a 2b 06 01 04 01 82 37 ...1.0...+.....7 + * 1cb0: 02 01 15 ^^ ^^ ^^- ObjId + * Set Of -^^ ^^- Sequence Of + */ + rcExit = SignToolPkcs7_AuthAttribsAddMsStatementType(pAuthAttribs, RTCRSPC_STMT_TYPE_INDIVIDUAL_CODE_SIGNING); + if (rcExit != RTEXITCODE_SUCCESS) + return rcExit; + + /* + * Add signing time. We add this, even if signtool.exe, since OpenSSL will always do it otherwise. + */ + if (!fNoSigningTime) /** @todo requires disabling the code in do_pkcs7_signed_attrib that adds it when absent */ + { + rcExit = SignToolPkcs7_AuthAttribsAddSigningTime(pAuthAttribs, SigningTime); + if (rcExit != RTEXITCODE_SUCCESS) + return rcExit; + } + + /** @todo more? Some certificate stuff? */ + + return RTEXITCODE_SUCCESS; +} + + +static RTEXITCODE SignToolPkcs7_PrependCounterSignature(PRTCRPKCS7SIGNERINFO pSignerInfo, + PCRTCRPKCS7SIGNERINFO pCounterSignerInfo, unsigned cVerbosity) +{ + /* Make sure the UnauthenticatedAttributes member is there. */ + RTEXITCODE rcExit = SignToolPkcs7_EnsureUnauthenticatedAttributesPresent(pSignerInfo); + if (rcExit != RTEXITCODE_SUCCESS) + return rcExit; + + /* Append an entry to UnauthenticatedAttributes. */ + uint32_t iPos; + int rc = RTCrPkcs7Attributes_InsertEx(&pSignerInfo->UnauthenticatedAttributes, 0 /*iPosition*/, NULL /*pToClone*/, + &g_RTAsn1DefaultAllocator, &iPos); + if (RT_FAILURE(rc)) + return RTMsgErrorExitFailure("RTCrPkcs7Attributes_Append failed: %Rrc", rc); + Assert(iPos < pSignerInfo->UnauthenticatedAttributes.cItems); Assert(iPos == 0); + PRTCRPKCS7ATTRIBUTE pAttr = pSignerInfo->UnauthenticatedAttributes.papItems[iPos]; + + if (cVerbosity >= 2) + RTMsgInfo("Adding UnauthenticatedAttribute #%u...", iPos); + + /* Create the attrib and its sub-set of counter signatures. */ + rc = RTCrPkcs7Attribute_SetCounterSignatures(pAttr, NULL, pAttr->Allocation.pAllocator); + if (RT_FAILURE(rc)) + return RTMsgErrorExitFailure("RTCrPkcs7Attribute_SetCounterSignatures failed: %Rrc", rc); + + /* Insert the counter signature. */ + rc = RTCrPkcs7SignerInfos_InsertEx(pAttr->uValues.pCounterSignatures, 0 /*iPosition*/, pCounterSignerInfo, + pAttr->Allocation.pAllocator, NULL); + if (RT_FAILURE(rc)) + return RTMsgErrorExitFailure("RTCrPkcs7SignerInfos_InsertEx failed: %Rrc", rc); + + return RTEXITCODE_SUCCESS; +} + + +static RTEXITCODE SignToolPkcs7_AppendCertificate(PRTCRPKCS7SIGNEDDATA pSignedData, PCRTCRX509CERTIFICATE pCertToAppend) +{ + if (pSignedData->Certificates.cItems == 0 && !RTCrPkcs7SetOfCerts_IsPresent(&pSignedData->Certificates)) + return RTMsgErrorExitFailure("PKCS#7 signature includes no certificates! Didn't expect that"); + + /* Already there? */ + PCRTCRX509CERTIFICATE pExisting + = RTCrPkcs7SetOfCerts_FindX509ByIssuerAndSerialNumber(&pSignedData->Certificates, &pCertToAppend->TbsCertificate.Issuer, + &pCertToAppend->TbsCertificate.SerialNumber); + if (!pExisting || RTCrX509Certificate_Compare(pExisting, pCertToAppend) != 0) + { + /* Prepend a RTCRPKCS7CERT entry. */ + uint32_t iPos; + int rc = RTCrPkcs7SetOfCerts_InsertEx(&pSignedData->Certificates, 0 /*iPosition*/, NULL /*pToClone*/, + &g_RTAsn1DefaultAllocator, &iPos); + if (RT_FAILURE(rc)) + return RTMsgErrorExitFailure("RTCrPkcs7SetOfCerts_Append failed: %Rrc", rc); + PRTCRPKCS7CERT pCertEntry = pSignedData->Certificates.papItems[iPos]; + + /* Set (clone) the certificate. */ + rc = RTCrPkcs7Cert_SetX509Cert(pCertEntry, pCertToAppend, pCertEntry->Allocation.pAllocator); + if (RT_FAILURE(rc)) + return RTMsgErrorExitFailure("RTCrPkcs7Cert_X509Cert failed: %Rrc", rc); + } + return RTEXITCODE_SUCCESS; +} + +#ifdef RT_OS_WINDOWS + +static PCRTUTF16 GetBCryptNameFromCrDigest(RTCRDIGEST hDigest) +{ + switch (RTCrDigestGetType(hDigest)) + { + case RTDIGESTTYPE_MD2: return BCRYPT_MD2_ALGORITHM; + case RTDIGESTTYPE_MD4: return BCRYPT_MD4_ALGORITHM; + case RTDIGESTTYPE_SHA1: return BCRYPT_SHA1_ALGORITHM; + case RTDIGESTTYPE_SHA256: return BCRYPT_SHA256_ALGORITHM; + case RTDIGESTTYPE_SHA384: return BCRYPT_SHA384_ALGORITHM; + case RTDIGESTTYPE_SHA512: return BCRYPT_SHA512_ALGORITHM; + default: + RTMsgError("No BCrypt translation for %s/%d!", RTCrDigestGetAlgorithmOid(hDigest), RTCrDigestGetType(hDigest)); + return L"No BCrypt translation"; + } +} + +static RTEXITCODE +SignToolPkcs7_Pkcs7SignStuffAgainWithReal(const char *pszWhat, SignToolKeyPair *pCertKeyPair, unsigned cVerbosity, + PRTCRPKCS7CONTENTINFO pContentInfo, void **ppvSigned, size_t *pcbSigned) + +{ + RT_NOREF(cVerbosity); + + /* + * First remove the fake certificate from the PKCS7 structure and insert the real one. + */ + PRTCRPKCS7SIGNEDDATA pSignedData = pContentInfo->u.pSignedData; + unsigned iCert = pSignedData->Certificates.cItems; + unsigned cErased = 0; + while (iCert-- > 0) + { + PCRTCRPKCS7CERT pCert = pSignedData->Certificates.papItems[iCert]; + if ( pCert->enmChoice == RTCRPKCS7CERTCHOICE_X509 + && RTCrX509Certificate_MatchIssuerAndSerialNumber(pCert->u.pX509Cert, + &pCertKeyPair->pCertificate->TbsCertificate.Issuer, + &pCertKeyPair->pCertificate->TbsCertificate.SerialNumber)) + { + RTCrPkcs7SetOfCerts_Erase(&pSignedData->Certificates, iCert); + cErased++; + } + } + if (cErased == 0) + return RTMsgErrorExitFailure("(%s) Failed to find temporary signing certificate in PKCS#7 from OpenSSL: %u certs", + pszWhat, pSignedData->Certificates.cItems); + + /* Then insert the real signing certificate. */ + PCRTCRX509CERTIFICATE const pRealCertificate = pCertKeyPair->getRealCertificate(); + RTEXITCODE rcExit = SignToolPkcs7_AppendCertificate(pSignedData, pRealCertificate); + if (rcExit != RTEXITCODE_SUCCESS) + return rcExit; + + /* + * Modify the signer info to reflect the real certificate. + */ + PRTCRPKCS7SIGNERINFO pSignerInfo = pSignedData->SignerInfos.papItems[0]; + RTCrX509Name_Delete(&pSignerInfo->IssuerAndSerialNumber.Name); + int rc = RTCrX509Name_Clone(&pSignerInfo->IssuerAndSerialNumber.Name, + &pRealCertificate->TbsCertificate.Issuer, &g_RTAsn1DefaultAllocator); + if (RT_FAILURE(rc)) + return RTMsgErrorExitFailure("(%s) RTCrX509Name_Clone failed: %Rrc", pszWhat, rc); + + RTAsn1Integer_Delete(&pSignerInfo->IssuerAndSerialNumber.SerialNumber); + rc = RTAsn1Integer_Clone(&pSignerInfo->IssuerAndSerialNumber.SerialNumber, + &pRealCertificate->TbsCertificate.SerialNumber, &g_RTAsn1DefaultAllocator); + if (RT_FAILURE(rc)) + return RTMsgErrorExitFailure("(%s) RTAsn1Integer_Clone failed: %Rrc", pszWhat, rc); + + /* There shouldn't be anything in the authenticated attributes that + we need to modify... */ + + /* + * Now a create a new signature using the real key. Since we haven't modified + * the authenticated attributes, we can just hash them as-is. + */ + /* Create the hash to sign. */ + RTCRDIGEST hDigest; + rc = RTCrDigestCreateByObjId(&hDigest, &pSignerInfo->DigestAlgorithm.Algorithm); + if (RT_FAILURE(rc)) + return RTMsgErrorExitFailure("(%s) RTCrDigestCreateByObjId failed on '%s': %Rrc", + pszWhat, pSignerInfo->DigestAlgorithm.Algorithm.szObjId, rc); + + rcExit = RTEXITCODE_FAILURE; + RTERRINFOSTATIC ErrInfo; + rc = RTCrPkcs7Attributes_HashAttributes(&pSignerInfo->AuthenticatedAttributes, hDigest, RTErrInfoInitStatic(&ErrInfo)); + if (RT_SUCCESS(rc)) + { + BCRYPT_PKCS1_PADDING_INFO PaddingInfo = { GetBCryptNameFromCrDigest(hDigest) }; + DWORD cbSignature = 0; + SECURITY_STATUS rcNCrypt = NCryptSignHash(pCertKeyPair->hNCryptPrivateKey, &PaddingInfo, + (PBYTE)RTCrDigestGetHash(hDigest), RTCrDigestGetHashSize(hDigest), + NULL, 0, &cbSignature, NCRYPT_SILENT_FLAG | BCRYPT_PAD_PKCS1); + if (rcNCrypt == ERROR_SUCCESS) + { + if (cVerbosity) + RTMsgInfo("PaddingInfo: '%ls' cb=%#x, was %#zx\n", + PaddingInfo.pszAlgId, cbSignature, pSignerInfo->EncryptedDigest.Asn1Core.cb); + + rc = RTAsn1OctetString_AllocContent(&pSignerInfo->EncryptedDigest, NULL /*pvSrc*/, cbSignature, + &g_RTAsn1DefaultAllocator); + if (RT_SUCCESS(rc)) + { + Assert(pSignerInfo->EncryptedDigest.Asn1Core.uData.pv); + rcNCrypt = NCryptSignHash(pCertKeyPair->hNCryptPrivateKey, &PaddingInfo, + (PBYTE)RTCrDigestGetHash(hDigest), RTCrDigestGetHashSize(hDigest), + (PBYTE)pSignerInfo->EncryptedDigest.Asn1Core.uData.pv, cbSignature, &cbSignature, + /*NCRYPT_SILENT_FLAG |*/ BCRYPT_PAD_PKCS1); + if (rcNCrypt == ERROR_SUCCESS) + { + /* + * Now we need to re-encode the whole thing and decode it again. + */ + PRTASN1CORE pRoot = RTCrPkcs7ContentInfo_GetAsn1Core(pContentInfo); + uint32_t cbRealSigned; + rc = RTAsn1EncodePrepare(pRoot, RTASN1ENCODE_F_DER, &cbRealSigned, RTErrInfoInitStatic(&ErrInfo)); + if (RT_SUCCESS(rc)) + { + void *pvRealSigned = RTMemAllocZ(cbRealSigned); + if (pvRealSigned) + { + rc = RTAsn1EncodeToBuffer(pRoot, RTASN1ENCODE_F_DER, pvRealSigned, cbRealSigned, + RTErrInfoInitStatic(&ErrInfo)); + if (RT_SUCCESS(rc)) + { + /* Decode it */ + RTCrPkcs7ContentInfo_Delete(pContentInfo); + + RTASN1CURSORPRIMARY PrimaryCursor; + RTAsn1CursorInitPrimary(&PrimaryCursor, pvRealSigned, cbRealSigned, RTErrInfoInitStatic(&ErrInfo), + &g_RTAsn1DefaultAllocator, 0, pszWhat); + rc = RTCrPkcs7ContentInfo_DecodeAsn1(&PrimaryCursor.Cursor, 0, pContentInfo, "CI"); + if (RT_SUCCESS(rc)) + { + Assert(RTCrPkcs7ContentInfo_IsSignedData(pContentInfo)); + + /* Almost done! Just replace output buffer. */ + RTMemFree(*ppvSigned); + *ppvSigned = pvRealSigned; + *pcbSigned = cbRealSigned; + pvRealSigned = NULL; + rcExit = RTEXITCODE_SUCCESS; + } + else + RTMsgError("(%s) RTCrPkcs7ContentInfo_DecodeAsn1 failed: %Rrc%#RTeim", + pszWhat, rc, &ErrInfo.Core); + } + else + RTMsgError("(%s) RTAsn1EncodeToBuffer failed: %Rrc%#RTeim", pszWhat, rc, &ErrInfo.Core); + + RTMemFree(pvRealSigned); + } + else + RTMsgError("(%s) Failed to allocate %u bytes!", pszWhat, cbRealSigned); + } + else + RTMsgError("(%s) RTAsn1EncodePrepare failed: %Rrc%#RTeim", pszWhat, rc, &ErrInfo.Core); + } + else + RTMsgError("(%s) NCryptSignHash/2 failed: %Rwc %#x (%u)", pszWhat, rcNCrypt, rcNCrypt, rcNCrypt); + } + else + RTMsgError("(%s) RTAsn1OctetString_AllocContent(,,%#x) failed: %Rrc", pszWhat, cbSignature, rc); + } + else + RTMsgError("(%s) NCryptSignHash/1 failed: %Rwc %#x (%u)", pszWhat, rcNCrypt, rcNCrypt, rcNCrypt); + } + else + RTMsgError("(%s) RTCrPkcs7Attributes_HashAttributes failed: %Rrc%#RTeim", pszWhat, rc, &ErrInfo.Core); + RTCrDigestRelease(hDigest); + return rcExit; +} + +#endif /* RT_OS_WINDOWS */ + +static RTEXITCODE SignToolPkcs7_Pkcs7SignStuffInner(const char *pszWhat, const void *pvToDataToSign, size_t cbToDataToSign, + PCRTCRPKCS7ATTRIBUTES pAuthAttribs, RTCRSTORE hAdditionalCerts, + uint32_t fExtraFlags, RTDIGESTTYPE enmDigestType, + SignToolKeyPair *pCertKeyPair, unsigned cVerbosity, + void **ppvSigned, size_t *pcbSigned, PRTCRPKCS7CONTENTINFO pContentInfo, + PRTCRPKCS7SIGNEDDATA *ppSignedData) +{ + *ppvSigned = NULL; + if (pcbSigned) + *pcbSigned = 0; + if (ppSignedData) + *ppSignedData = NULL; + + /* Figure out how large the signature will be. */ + uint32_t const fSignFlags = RTCRPKCS7SIGN_SD_F_USE_V1 | RTCRPKCS7SIGN_SD_F_NO_SMIME_CAP | fExtraFlags; + size_t cbSigned = 1024; + RTERRINFOSTATIC ErrInfo; + int rc = RTCrPkcs7SimpleSignSignedData(fSignFlags, pCertKeyPair->pCertificate, pCertKeyPair->hPrivateKey, + pvToDataToSign, cbToDataToSign,enmDigestType, hAdditionalCerts, pAuthAttribs, + NULL, &cbSigned, RTErrInfoInitStatic(&ErrInfo)); + if (rc != VERR_BUFFER_OVERFLOW) + return RTMsgErrorExitFailure("(%s) RTCrPkcs7SimpleSignSignedData failed: %Rrc%#RTeim", pszWhat, rc, &ErrInfo.Core); + + /* Allocate memory for it and do the actual signing. */ + void *pvSigned = RTMemAllocZ(cbSigned); + if (!pvSigned) + return RTMsgErrorExitFailure("(%s) Failed to allocate %#zx bytes for %s signature", pszWhat, cbSigned, pszWhat); + rc = RTCrPkcs7SimpleSignSignedData(fSignFlags, pCertKeyPair->pCertificate, pCertKeyPair->hPrivateKey, + pvToDataToSign, cbToDataToSign, enmDigestType, hAdditionalCerts, pAuthAttribs, + pvSigned, &cbSigned, RTErrInfoInitStatic(&ErrInfo)); + if (RT_SUCCESS(rc)) + { + if (cVerbosity > 2) + RTMsgInfo("%s signature: %#zx bytes\n%.*Rhxd\n", pszWhat, cbSigned, cbSigned, pvSigned); + + /* + * Decode the signature and check that it is SignedData. + */ + RTASN1CURSORPRIMARY PrimaryCursor; + RTAsn1CursorInitPrimary(&PrimaryCursor, pvSigned, (uint32_t)cbSigned, RTErrInfoInitStatic(&ErrInfo), + &g_RTAsn1DefaultAllocator, 0, pszWhat); + rc = RTCrPkcs7ContentInfo_DecodeAsn1(&PrimaryCursor.Cursor, 0, pContentInfo, "CI"); + if (RT_SUCCESS(rc)) + { + if (RTCrPkcs7ContentInfo_IsSignedData(pContentInfo)) + { +#ifdef RT_OS_WINDOWS + /* + * If we're using a fake key+cert, we now have to re-do the signing using the real + * key+cert and the windows crypto API. This kludge is necessary because we can't + * typically get that the encoded private key, so it isn't possible to feed it to + * openssl. + */ + RTEXITCODE rcExit = RTEXITCODE_SUCCESS; + if (pCertKeyPair->pCertificateReal) + rcExit = SignToolPkcs7_Pkcs7SignStuffAgainWithReal(pszWhat, pCertKeyPair, cVerbosity, pContentInfo, + &pvSigned, &cbSigned); + if (rcExit == RTEXITCODE_SUCCESS) +#endif + { + /* + * Set returns and maybe display the result before returning. + */ + *ppvSigned = pvSigned; + if (pcbSigned) + *pcbSigned = cbSigned; + if (ppSignedData) + *ppSignedData = pContentInfo->u.pSignedData; + + if (cVerbosity) + { + SHOWEXEPKCS7 ShowExe; + RT_ZERO(ShowExe); + ShowExe.cVerbosity = cVerbosity; + HandleShowExeWorkerPkcs7Display(&ShowExe, pContentInfo->u.pSignedData, 0, pContentInfo); + } + return RTEXITCODE_SUCCESS; + } + } + + RTMsgError("(%s) RTCrPkcs7SimpleSignSignedData did not create SignedData: %s", + pszWhat, pContentInfo->ContentType.szObjId); + } + else + RTMsgError("(%s) RTCrPkcs7ContentInfo_DecodeAsn1 failed: %Rrc%#RTeim", pszWhat, rc, &ErrInfo.Core); + RTCrPkcs7ContentInfo_Delete(pContentInfo); + } + RTMemFree(pvSigned); + return RTEXITCODE_FAILURE; +} + + +static RTEXITCODE SignToolPkcs7_Pkcs7SignStuff(const char *pszWhat, const void *pvToDataToSign, size_t cbToDataToSign, + PCRTCRPKCS7ATTRIBUTES pAuthAttribs, RTCRSTORE hAdditionalCerts, + uint32_t fExtraFlags, RTDIGESTTYPE enmDigestType, SignToolKeyPair *pCertKeyPair, + unsigned cVerbosity, void **ppvSigned, size_t *pcbSigned, + PRTCRPKCS7CONTENTINFO pContentInfo, PRTCRPKCS7SIGNEDDATA *ppSignedData) +{ + /* + * Gather all additional certificates before doing the actual work. + */ + RTCRSTORE hAllAdditionalCerts = pCertKeyPair->assembleAllAdditionalCertificates(hAdditionalCerts); + if (hAllAdditionalCerts == NIL_RTCRSTORE) + return RTEXITCODE_FAILURE; + RTEXITCODE rcExit = SignToolPkcs7_Pkcs7SignStuffInner(pszWhat, pvToDataToSign, cbToDataToSign, pAuthAttribs, + hAllAdditionalCerts, fExtraFlags, enmDigestType, pCertKeyPair, + cVerbosity, ppvSigned, pcbSigned, pContentInfo, ppSignedData); + RTCrStoreRelease(hAllAdditionalCerts); + return rcExit; +} + + +static RTEXITCODE SignToolPkcs7_AddTimestampSignatureEx(PRTCRPKCS7SIGNERINFO pSignerInfo, PRTCRPKCS7SIGNEDDATA pSignedData, + unsigned cVerbosity, bool fReplaceExisting, bool fTimestampTypeOld, + RTTIMESPEC SigningTime, SignToolKeyPair *pTimestampPair) +{ + AssertReturn(fTimestampTypeOld, RTMsgErrorExitFailure("New style signatures not supported yet")); + + /* + * Create a set of attributes we need to include in the AuthenticatedAttributes + * of the timestamp signature. + */ + RTCRPKCS7ATTRIBUTES AuthAttribs; + int rc = RTCrPkcs7Attributes_Init(&AuthAttribs, &g_RTAsn1DefaultAllocator); + if (RT_FAILURE(rc)) + return RTMsgErrorExitFailure("RTCrPkcs7SetOfAttributes_Init failed: %Rrc", rc); + + RTEXITCODE rcExit = SignToolPkcs7_AddAuthAttribsForTimestamp(&AuthAttribs, fTimestampTypeOld, SigningTime, + pTimestampPair->getRealCertificate()); + if (rcExit == RTEXITCODE_SUCCESS) + { + /* + * Now create a PKCS#7 signature of the encrypted signature from the selected signer info. + */ + void *pvSigned = NULL; + PRTCRPKCS7SIGNEDDATA pTsSignedData = NULL; + RTCRPKCS7CONTENTINFO TsContentInfo; + rcExit = SignToolPkcs7_Pkcs7SignStuffInner("timestamp", pSignerInfo->EncryptedDigest.Asn1Core.uData.pv, + pSignerInfo->EncryptedDigest.Asn1Core.cb, &AuthAttribs, + NIL_RTCRSTORE /*hAdditionalCerts*/, RTCRPKCS7SIGN_SD_F_DEATCHED, + RTDIGESTTYPE_SHA1, pTimestampPair, cVerbosity, + &pvSigned, NULL /*pcbSigned*/, &TsContentInfo, &pTsSignedData); + if (rcExit == RTEXITCODE_SUCCESS) + { + + /* + * If we're replacing existing timestamp signatures, remove old ones now. + */ + if ( fReplaceExisting + && RTCrPkcs7Attributes_IsPresent(&pSignerInfo->UnauthenticatedAttributes)) + { + uint32_t iItem = pSignerInfo->UnauthenticatedAttributes.cItems; + while (iItem-- > 0) + { + PRTCRPKCS7ATTRIBUTE pAttr = pSignerInfo->UnauthenticatedAttributes.papItems[iItem]; + if (pAttr->enmType == RTCRPKCS7ATTRIBUTETYPE_COUNTER_SIGNATURES) /* ASSUMES all counter sigs are timstamps */ + { + if (cVerbosity > 1) + RTMsgInfo("Removing counter signature in attribute #%u\n", iItem); + rc = RTCrPkcs7Attributes_Erase(&pSignerInfo->UnauthenticatedAttributes, iItem); + if (RT_FAILURE(rc)) + rcExit = RTMsgErrorExitFailure("RTCrPkcs7Attributes_Erase failed on #%u: %Rrc", iItem, rc); + } + } + } + + /* + * Add the new one. + */ + if (rcExit == RTEXITCODE_SUCCESS) + rcExit = SignToolPkcs7_PrependCounterSignature(pSignerInfo, pTsSignedData->SignerInfos.papItems[0], cVerbosity); + + /* + * Make sure the signing certificate is included. + */ + if (rcExit == RTEXITCODE_SUCCESS) + { + rcExit = SignToolPkcs7_AppendCertificate(pSignedData, pTimestampPair->getRealCertificate()); + + PCRTCRCERTCTX pInterCaCtx = NULL; + while ((pInterCaCtx = pTimestampPair->findNextIntermediateCert(pInterCaCtx)) != NULL) + if (rcExit == RTEXITCODE_SUCCESS) + rcExit = SignToolPkcs7_AppendCertificate(pSignedData, pInterCaCtx->pCert); + } + + /* + * Clean up. + */ + RTCrPkcs7ContentInfo_Delete(&TsContentInfo); + RTMemFree(pvSigned); + } + } + RTCrPkcs7Attributes_Delete(&AuthAttribs); + return rcExit; +} + + +static RTEXITCODE SignToolPkcs7_AddTimestampSignature(SIGNTOOLPKCS7EXE *pThis, unsigned cVerbosity, unsigned iSignature, + bool fReplaceExisting, bool fTimestampTypeOld, RTTIMESPEC SigningTime, + SignToolKeyPair *pTimestampPair) +{ + AssertReturn(fTimestampTypeOld, RTMsgErrorExitFailure("New style signatures not supported yet")); + + /* + * Locate the signature specified by iSignature and add a timestamp to it. + */ + PRTCRPKCS7SIGNEDDATA pSignedData = NULL; + PRTCRPKCS7SIGNERINFO pSignerInfo = SignToolPkcs7_FindNestedSignatureByIndex(pThis, iSignature, &pSignedData); + if (!pSignerInfo) + return RTMsgErrorExitFailure("No signature #%u in %s", iSignature, pThis->pszFilename); + + return SignToolPkcs7_AddTimestampSignatureEx(pSignerInfo, pSignedData, cVerbosity, fReplaceExisting, fTimestampTypeOld, + SigningTime, pTimestampPair); +} + + +typedef enum SIGNDATATWEAK +{ + kSignDataTweak_NoTweak = 1, + kSignDataTweak_RootIsParent +} SIGNDATATWEAK; + +static RTEXITCODE SignToolPkcs7_SignData(SIGNTOOLPKCS7 *pThis, PRTASN1CORE pToSignRoot, SIGNDATATWEAK enmTweak, + const char *pszContentTypeId, unsigned cVerbosity, uint32_t fExtraFlags, + RTDIGESTTYPE enmSigType, bool fReplaceExisting, bool fNoSigningTime, + SignToolKeyPair *pSigningCertKey, RTCRSTORE hAddCerts, + bool fTimestampTypeOld, RTTIMESPEC SigningTime, SignToolKeyPair *pTimestampCertKey) +{ + /* + * Encode it. + */ + RTERRINFOSTATIC ErrInfo; + uint32_t cbEncoded = 0; + int rc = RTAsn1EncodePrepare(pToSignRoot, RTASN1ENCODE_F_DER, &cbEncoded, RTErrInfoInitStatic(&ErrInfo)); + if (RT_FAILURE(rc)) + return RTMsgErrorExitFailure("RTAsn1EncodePrepare failed: %Rrc%RTeim", rc, &ErrInfo.Core); + + if (cVerbosity >= 4) + RTAsn1Dump(pToSignRoot, 0, 0, RTStrmDumpPrintfV, g_pStdOut); + + uint8_t *pbEncoded = (uint8_t *)RTMemTmpAllocZ(cbEncoded ); + if (!pbEncoded) + return RTMsgErrorExitFailure("Failed to allocate %#z bytes for encoding data we're signing (%s)", + cbEncoded, pszContentTypeId); + + RTEXITCODE rcExit = RTEXITCODE_FAILURE; + rc = RTAsn1EncodeToBuffer(pToSignRoot, RTASN1ENCODE_F_DER, pbEncoded, cbEncoded, RTErrInfoInitStatic(&ErrInfo)); + if (RT_SUCCESS(rc)) + { + size_t const cbToSign = cbEncoded - (enmTweak == kSignDataTweak_RootIsParent ? pToSignRoot->cbHdr : 0); + void const *pvToSign = pbEncoded + (enmTweak == kSignDataTweak_RootIsParent ? pToSignRoot->cbHdr : 0); + + /* + * Create additional authenticated attributes. + */ + RTCRPKCS7ATTRIBUTES AuthAttribs; + rc = RTCrPkcs7Attributes_Init(&AuthAttribs, &g_RTAsn1DefaultAllocator); + if (RT_SUCCESS(rc)) + { + rcExit = SignToolPkcs7_AddAuthAttribsForImageOrCatSignature(&AuthAttribs, SigningTime, fNoSigningTime, + pszContentTypeId); + if (rcExit == RTEXITCODE_SUCCESS) + { + /* + * Ditch the old signature if so desired. + * (It is okay to do this in the CAT case too, as we've already + * encoded the data and won't touch pToSignRoot any more.) + */ + pToSignRoot = NULL; /* (may become invalid if replacing) */ + if (fReplaceExisting && pThis->pSignedData) + { + RTCrPkcs7ContentInfo_Delete(&pThis->ContentInfo); + pThis->pSignedData = NULL; + RTMemFree(pThis->pbBuf); + pThis->pbBuf = NULL; + pThis->cbBuf = 0; + } + + /* + * Do the actual signing. + */ + SIGNTOOLPKCS7 Src = { RTSIGNTOOLFILETYPE_DETECT, NULL, 0, NULL }; + PSIGNTOOLPKCS7 pSigDst = !pThis->pSignedData ? pThis : &Src; + rcExit = SignToolPkcs7_Pkcs7SignStuff("image", pvToSign, cbToSign, &AuthAttribs, hAddCerts, + fExtraFlags | RTCRPKCS7SIGN_SD_F_NO_DATA_ENCAP, enmSigType /** @todo ?? */, + pSigningCertKey, cVerbosity, + (void **)&pSigDst->pbBuf, &pSigDst->cbBuf, + &pSigDst->ContentInfo, &pSigDst->pSignedData); + if (rcExit == RTEXITCODE_SUCCESS) + { + /* + * Add a timestamp signature if requested. + */ + if (pTimestampCertKey->isComplete()) + rcExit = SignToolPkcs7_AddTimestampSignatureEx(pSigDst->pSignedData->SignerInfos.papItems[0], + pSigDst->pSignedData, + cVerbosity, false /*fReplaceExisting*/, + fTimestampTypeOld, SigningTime, pTimestampCertKey); + + /* + * Append the signature to the existing one, if that's what we're doing. + */ + if (rcExit == RTEXITCODE_SUCCESS && pSigDst == &Src) + rcExit = SignToolPkcs7_AddNestedSignature(pThis, &Src, cVerbosity, true /*fPrepend*/); /** @todo prepend/append option */ + + /* cleanup */ + if (pSigDst == &Src) + SignToolPkcs7_Delete(&Src); + } + + } + RTCrPkcs7Attributes_Delete(&AuthAttribs); + } + else + RTMsgError("RTCrPkcs7SetOfAttributes_Init failed: %Rrc", rc); + } + else + RTMsgError("RTAsn1EncodeToBuffer failed: %Rrc", rc); + RTMemTmpFree(pbEncoded); + return rcExit; +} + + +static RTEXITCODE SignToolPkcs7_SpcCompleteWithoutPageHashes(RTCRSPCINDIRECTDATACONTENT *pSpcIndData) +{ + PCRTASN1ALLOCATORVTABLE const pAllocator = &g_RTAsn1DefaultAllocator; + PRTCRSPCPEIMAGEDATA const pPeImage = pSpcIndData->Data.uValue.pPeImage; + Assert(pPeImage); + + /* + * Set it to File with an empty name. + * RTCRSPCPEIMAGEDATA::Flags -vv + * RTCRSPCPEIMAGEDATA::SeqCore -vv T0 -vv vv- pT2/CtxTag2 + * 0040: 04 01 82 37 02 01 0f 30-09 03 01 00 a0 04 a2 02 ...7...0........ + * 0050: 80 00 30 21 30 09 06 05-2b 0e 03 02 1a 05 00 04 ..0!0...+....... + * ^^- pUcs2 / empty string + */ + + /* Create an empty BMP string. */ + RTASN1STRING EmptyStr; + int rc = RTAsn1BmpString_Init(&EmptyStr, pAllocator); + if (RT_FAILURE(rc)) + return RTMsgErrorExitFailure("RTAsn1BmpString_Init/Ucs2 failed: %Rrc", rc); + + /* Create an SPC string and use the above empty string with the Ucs2 setter. */ + RTEXITCODE rcExit = RTEXITCODE_FAILURE; + RTCRSPCSTRING SpcString; + rc = RTCrSpcString_Init(&SpcString, pAllocator); + if (RT_SUCCESS(rc)) + { + rc = RTCrSpcString_SetUcs2(&SpcString, &EmptyStr, pAllocator); + if (RT_SUCCESS(rc)) + { + /* Create a temporary SpcLink with the empty SpcString. */ + RTCRSPCLINK SpcLink; + rc = RTCrSpcLink_Init(&SpcLink, pAllocator); + if (RT_SUCCESS(rc)) + { + /* Use the setter on the SpcLink object to copy the SpcString to it. */ + rc = RTCrSpcLink_SetFile(&SpcLink, &SpcString, pAllocator); + if (RT_SUCCESS(rc)) + { + /* Use the setter to copy SpcLink to the PeImage structure. */ + rc = RTCrSpcPeImageData_SetFile(pPeImage, &SpcLink, pAllocator); + if (RT_SUCCESS(rc)) + rcExit = RTEXITCODE_SUCCESS; + else + RTMsgError("RTCrSpcPeImageData_SetFile failed: %Rrc", rc); + } + else + RTMsgError("RTCrSpcLink_SetFile failed: %Rrc", rc); + RTCrSpcLink_Delete(&SpcLink); + } + else + RTMsgError("RTCrSpcLink_Init failed: %Rrc", rc); + } + else + RTMsgError("RTCrSpcString_SetUcs2 failed: %Rrc", rc); + RTCrSpcString_Delete(&SpcString); + } + else + RTMsgError("RTCrSpcString_Init failed: %Rrc", rc); + RTAsn1BmpString_Delete(&EmptyStr); + return rcExit; +} + + +static RTEXITCODE SignToolPkcs7_SpcAddImagePageHashes(SIGNTOOLPKCS7EXE *pThis, RTCRSPCINDIRECTDATACONTENT *pSpcIndData, + RTDIGESTTYPE enmSigType) +{ + PCRTASN1ALLOCATORVTABLE const pAllocator = &g_RTAsn1DefaultAllocator; + PRTCRSPCPEIMAGEDATA const pPeImage = pSpcIndData->Data.uValue.pPeImage; + Assert(pPeImage); + + /* + * The hashes are stored in the 'Moniker' attribute. + */ + /* Create a temporary SpcLink with a default moniker. */ + RTCRSPCLINK SpcLink; + int rc = RTCrSpcLink_Init(&SpcLink, pAllocator); + if (RT_FAILURE(rc)) + return RTMsgErrorExitFailure("RTCrSpcLink_Init failed: %Rrc", rc); + rc = RTCrSpcLink_SetMoniker(&SpcLink, NULL, pAllocator); + if (RT_SUCCESS(rc)) + { + /* Use the setter to copy SpcLink to the PeImage structure. */ + rc = RTCrSpcPeImageData_SetFile(pPeImage, &SpcLink, pAllocator); + if (RT_FAILURE(rc)) + RTMsgError("RTCrSpcLink_SetFile failed: %Rrc", rc); + } + else + RTMsgError("RTCrSpcLink_SetMoniker failed: %Rrc", rc); + RTCrSpcLink_Delete(&SpcLink); + if (RT_FAILURE(rc)) + return RTEXITCODE_FAILURE; + + /* + * Now go to work on the moniker. It doesn't have any autogenerated + * setters, so we must do stuff manually. + */ + PRTCRSPCSERIALIZEDOBJECT pMoniker = pPeImage->T0.File.u.pMoniker; + RTUUID Uuid; + rc = RTUuidFromStr(&Uuid, RTCRSPCSERIALIZEDOBJECT_UUID_STR); + if (RT_FAILURE(rc)) + return RTMsgErrorExitFailure("RTUuidFromStr failed: %Rrc", rc); + + rc = RTAsn1OctetString_AllocContent(&pMoniker->Uuid, &Uuid, sizeof(Uuid), pAllocator); + if (RT_FAILURE(rc)) + return RTMsgErrorExitFailure("RTAsn1String_InitWithValue/UUID failed: %Rrc", rc); + + /* Create a new set of attributes and associate this with the SerializedData member. */ + PRTCRSPCSERIALIZEDOBJECTATTRIBUTES pSpcAttribs; + rc = RTAsn1MemAllocZ(&pMoniker->SerializedData.EncapsulatedAllocation, + (void **)&pSpcAttribs, sizeof(*pSpcAttribs)); + if (RT_FAILURE(rc)) + return RTMsgErrorExitFailure("RTAsn1MemAllocZ/pSpcAttribs failed: %Rrc", rc); + pMoniker->SerializedData.pEncapsulated = RTCrSpcSerializedObjectAttributes_GetAsn1Core(pSpcAttribs); + pMoniker->enmType = RTCRSPCSERIALIZEDOBJECTTYPE_ATTRIBUTES; + pMoniker->u.pData = pSpcAttribs; + + rc = RTCrSpcSerializedObjectAttributes_Init(pSpcAttribs, pAllocator); + if (RT_FAILURE(rc)) + return RTMsgErrorExitFailure("RTCrSpcSerializedObjectAttributes_Init failed: %Rrc", rc); + + /* + * Add a single attribute to the set that we'll use for page hashes. + */ + int32_t iPos = RTCrSpcSerializedObjectAttributes_Append(pSpcAttribs); + if (iPos < 0) + return RTMsgErrorExitFailure("RTCrSpcSerializedObjectAttributes_Append failed: %Rrc", iPos); + PRTCRSPCSERIALIZEDOBJECTATTRIBUTE pSpcObjAttr = pSpcAttribs->papItems[iPos]; + + if (enmSigType == RTDIGESTTYPE_SHA1) + rc = RTCrSpcSerializedObjectAttribute_SetV1Hashes(pSpcObjAttr, NULL, pAllocator); + else if (enmSigType == RTDIGESTTYPE_SHA256) + rc = RTCrSpcSerializedObjectAttribute_SetV2Hashes(pSpcObjAttr, NULL, pAllocator); + else + rc = VERR_CR_DIGEST_NOT_SUPPORTED; + if (RT_FAILURE(rc)) + return RTMsgErrorExitFailure("RTCrSpcSerializedObjectAttribute_SetV1Hashes/SetV2Hashes failed: %Rrc", rc); + PRTCRSPCSERIALIZEDPAGEHASHES pSpcPageHashes = pSpcObjAttr->u.pPageHashes; + Assert(pSpcPageHashes); + + /* + * Now ask the loader for the number of pages in the page hash table + * and calculate its size. + */ + uint32_t cPages = 0; + rc = RTLdrQueryPropEx(pThis->hLdrMod, RTLDRPROP_HASHABLE_PAGES, NULL, &cPages, sizeof(cPages), NULL); + if (RT_FAILURE(rc)) + return RTMsgErrorExitFailure("RTLdrQueryPropEx/RTLDRPROP_HASHABLE_PAGES failed: %Rrc", rc); + + uint32_t const cbHash = RTCrDigestTypeToHashSize(enmSigType); + AssertReturn(cbHash > 0, RTMsgErrorExitFailure("Invalid value: enmSigType=%d", enmSigType)); + uint32_t const cbTable = (sizeof(uint32_t) + cbHash) * cPages; + + /* + * Allocate memory in the octect string. + */ + rc = RTAsn1ContentAllocZ(&pSpcPageHashes->RawData.Asn1Core, cbTable, pAllocator); + if (RT_FAILURE(rc)) + return RTMsgErrorExitFailure("RTAsn1ContentAllocZ failed to allocate %#x bytes for page hashes: %Rrc", cbTable, rc); + pSpcPageHashes->pData = (PCRTCRSPCPEIMAGEPAGEHASHES)pSpcPageHashes->RawData.Asn1Core.uData.pu8; + + RTLDRPROP enmLdrProp; + switch (enmSigType) + { + case RTDIGESTTYPE_SHA1: enmLdrProp = RTLDRPROP_SHA1_PAGE_HASHES; break; + case RTDIGESTTYPE_SHA256: enmLdrProp = RTLDRPROP_SHA256_PAGE_HASHES; break; + default: AssertFailedReturn(RTMsgErrorExitFailure("Invalid value: enmSigType=%d", enmSigType)); + + } + rc = RTLdrQueryPropEx(pThis->hLdrMod, enmLdrProp, NULL, (void *)pSpcPageHashes->RawData.Asn1Core.uData.pv, cbTable, NULL); + if (RT_FAILURE(rc)) + return RTMsgErrorExitFailure("RTLdrQueryPropEx/RTLDRPROP_SHA?_PAGE_HASHES/%#x failed: %Rrc", cbTable, rc); + + return RTEXITCODE_SUCCESS; +} + + +static RTEXITCODE SignToolPkcs7_SpcAddImageHash(SIGNTOOLPKCS7EXE *pThis, RTCRSPCINDIRECTDATACONTENT *pSpcIndData, + RTDIGESTTYPE enmSigType) +{ + uint32_t const cbHash = RTCrDigestTypeToHashSize(enmSigType); + const char * const pszAlgId = RTCrDigestTypeToAlgorithmOid(enmSigType); + + /* + * Ask the loader for the hash. + */ + uint8_t abHash[RTSHA512_HASH_SIZE]; + int rc = RTLdrHashImage(pThis->hLdrMod, enmSigType, abHash, sizeof(abHash)); + if (RT_FAILURE(rc)) + return RTMsgErrorExitFailure("RTLdrHashImage/%s failed: %Rrc", RTCrDigestTypeToName(enmSigType), rc); + + /* + * Set it. + */ + /** @todo no setter, this should be okay, though... */ + rc = RTAsn1ObjId_InitFromString(&pSpcIndData->DigestInfo.DigestAlgorithm.Algorithm, pszAlgId, &g_RTAsn1DefaultAllocator); + if (RT_FAILURE(rc)) + return RTMsgErrorExitFailure("RTAsn1ObjId_InitFromString/%s failed: %Rrc", pszAlgId, rc); + RTAsn1DynType_SetToNull(&pSpcIndData->DigestInfo.DigestAlgorithm.Parameters); /* ASSUMES RSA or similar */ + + rc = RTAsn1ContentDup(&pSpcIndData->DigestInfo.Digest.Asn1Core, abHash, cbHash, &g_RTAsn1DefaultAllocator); + if (RT_FAILURE(rc)) + return RTMsgErrorExitFailure("RTAsn1ContentDup/%#x failed: %Rrc", cbHash, rc); + + return RTEXITCODE_SUCCESS; +} + + +static RTEXITCODE SignToolPkcs7_AddOrReplaceSignature(SIGNTOOLPKCS7EXE *pThis, unsigned cVerbosity, RTDIGESTTYPE enmSigType, + bool fReplaceExisting, bool fHashPages, bool fNoSigningTime, + SignToolKeyPair *pSigningCertKey, + RTCRSTORE hAddCerts, bool fTimestampTypeOld, + RTTIMESPEC SigningTime, SignToolKeyPair *pTimestampCertKey) +{ + AssertReturn(fTimestampTypeOld || pTimestampCertKey->isNull(), + RTMsgErrorExitFailure("New style signatures not supported yet")); + + /* + * We must construct the data to be packed into the PKCS#7 signature + * and signed. + */ + PCRTASN1ALLOCATORVTABLE const pAllocator = &g_RTAsn1DefaultAllocator; + RTCRSPCINDIRECTDATACONTENT SpcIndData; + int rc = RTCrSpcIndirectDataContent_Init(&SpcIndData, pAllocator); + if (RT_FAILURE(rc)) + return RTMsgErrorExitFailure("RTCrSpcIndirectDataContent_Init failed: %Rrc", rc); + + /* Set the data to PE image. */ + /** @todo Generalize the Type + enmType DYN stuff and generate setters. */ + Assert(SpcIndData.Data.enmType == RTCRSPCAAOVTYPE_NOT_PRESENT); + Assert(SpcIndData.Data.uValue.pPeImage == NULL); + RTEXITCODE rcExit; + rc = RTAsn1ObjId_SetFromString(&SpcIndData.Data.Type, RTCRSPCPEIMAGEDATA_OID, pAllocator); + if (RT_SUCCESS(rc)) + { + SpcIndData.Data.enmType = RTCRSPCAAOVTYPE_PE_IMAGE_DATA; + rc = RTAsn1MemAllocZ(&SpcIndData.Data.Allocation, (void **)&SpcIndData.Data.uValue.pPeImage, + sizeof(*SpcIndData.Data.uValue.pPeImage)); + if (RT_SUCCESS(rc)) + { + rc = RTCrSpcPeImageData_Init(SpcIndData.Data.uValue.pPeImage, pAllocator); + if (RT_SUCCESS(rc)) + { + /* Old (SHA1) signatures has a Flags member, it's zero bits, though. */ + if (enmSigType == RTDIGESTTYPE_SHA1) + { + uint8_t bFlags = 0; + RTASN1BITSTRING Flags; + rc = RTAsn1BitString_InitWithData(&Flags, &bFlags, 0, pAllocator); + if (RT_SUCCESS(rc)) + { + rc = RTCrSpcPeImageData_SetFlags(SpcIndData.Data.uValue.pPeImage, &Flags, pAllocator); + RTAsn1BitString_Delete(&Flags); + if (RT_FAILURE(rc)) + rcExit = RTMsgErrorExitFailure("RTCrSpcPeImageData_SetFlags failed: %Rrc", rc); + } + else + rcExit = RTMsgErrorExitFailure("RTAsn1BitString_InitWithData failed: %Rrc", rc); + } + + /* + * Add the hashes. + */ + rcExit = SignToolPkcs7_SpcAddImageHash(pThis, &SpcIndData, enmSigType); + if (rcExit == RTEXITCODE_SUCCESS) + { + if (fHashPages) + rcExit = SignToolPkcs7_SpcAddImagePageHashes(pThis, &SpcIndData, enmSigType); + else + rcExit = SignToolPkcs7_SpcCompleteWithoutPageHashes(&SpcIndData); + + /* + * Encode and sign the SPC data, timestamp it, and line it up for adding to the executable. + */ + if (rcExit == RTEXITCODE_SUCCESS) + rcExit = SignToolPkcs7_SignData(pThis, RTCrSpcIndirectDataContent_GetAsn1Core(&SpcIndData), + kSignDataTweak_NoTweak, RTCRSPCINDIRECTDATACONTENT_OID, cVerbosity, 0, + enmSigType, fReplaceExisting, fNoSigningTime, pSigningCertKey, hAddCerts, + fTimestampTypeOld, SigningTime, pTimestampCertKey); + } + } + else + rcExit = RTMsgErrorExitFailure("RTCrPkcs7SignerInfos_Init failed: %Rrc", rc); + } + else + rcExit = RTMsgErrorExitFailure("RTAsn1MemAllocZ failed for RTCRSPCPEIMAGEDATA: %Rrc", rc); + } + else + rcExit = RTMsgErrorExitFailure("RTAsn1ObjId_SetWithString/SpcPeImageData failed: %Rrc", rc); + + RTCrSpcIndirectDataContent_Delete(&SpcIndData); + return rcExit; +} + + +static RTEXITCODE SignToolPkcs7_AddOrReplaceCatSignature(SIGNTOOLPKCS7 *pThis, unsigned cVerbosity, RTDIGESTTYPE enmSigType, + bool fReplaceExisting, bool fNoSigningTime, + SignToolKeyPair *pSigningCertKey, + RTCRSTORE hAddCerts, bool fTimestampTypeOld, + RTTIMESPEC SigningTime, SignToolKeyPair *pTimestampCertKey) +{ + AssertReturn(fTimestampTypeOld || pTimestampCertKey->isNull(), + RTMsgErrorExitFailure("New style signatures not supported yet")); + AssertReturn(pThis->pSignedData, RTMsgErrorExitFailure("pSignedData is NULL!")); + + /* + * Figure out what to sign first. + */ + uint32_t fExtraFlags = 0; + PRTASN1CORE pToSign = &pThis->pSignedData->ContentInfo.Content.Asn1Core; + const char *pszType = pThis->pSignedData->ContentInfo.ContentType.szObjId; + + if (!fReplaceExisting && pThis->pSignedData->SignerInfos.cItems == 0) + fReplaceExisting = true; + if (!fReplaceExisting) + { + pszType = RTCR_PKCS7_DATA_OID; + fExtraFlags |= RTCRPKCS7SIGN_SD_F_DEATCHED; + } + + /* + * Do the signing. + */ + RTEXITCODE rcExit = SignToolPkcs7_SignData(pThis, pToSign, kSignDataTweak_RootIsParent, + pszType, cVerbosity, fExtraFlags, enmSigType, fReplaceExisting, + fNoSigningTime, pSigningCertKey, hAddCerts, + fTimestampTypeOld, SigningTime, pTimestampCertKey); + + /* probably need to clean up stuff related to nested signatures here later... */ + return rcExit; +} + +#endif /* !IPRT_SIGNTOOL_NO_SIGNING */ + + +/********************************************************************************************************************************* +* The 'extract-exe-signer-cert' command. * +*********************************************************************************************************************************/ + +static RTEXITCODE HelpExtractExeSignerCert(PRTSTREAM pStrm, RTSIGNTOOLHELP enmLevel) +{ + RT_NOREF_PV(enmLevel); + RTStrmWrappedPrintf(pStrm, RTSTRMWRAPPED_F_HANGING_INDENT, + "extract-exe-signer-cert [--ber|--cer|--der] [--signature-index|-i ] [--exe|-e] [--output|-o] \n"); + return RTEXITCODE_SUCCESS; +} + +static RTEXITCODE HandleExtractExeSignerCert(int cArgs, char **papszArgs) +{ + /* + * Parse arguments. + */ + static const RTGETOPTDEF s_aOptions[] = + { + { "--ber", 'b', RTGETOPT_REQ_NOTHING }, + { "--cer", 'c', RTGETOPT_REQ_NOTHING }, + { "--der", 'd', RTGETOPT_REQ_NOTHING }, + { "--exe", 'e', RTGETOPT_REQ_STRING }, + { "--output", 'o', RTGETOPT_REQ_STRING }, + { "--signature-index", 'i', RTGETOPT_REQ_UINT32 }, + { "--force", 'f', RTGETOPT_REQ_NOTHING }, + }; + + const char *pszExe = NULL; + const char *pszOut = NULL; + RTLDRARCH enmLdrArch = RTLDRARCH_WHATEVER; + unsigned cVerbosity = 0; + uint32_t fCursorFlags = RTASN1CURSOR_FLAGS_DER; + uint32_t iSignature = 0; + bool fForce = false; + + RTGETOPTSTATE GetState; + int rc = RTGetOptInit(&GetState, cArgs, papszArgs, s_aOptions, RT_ELEMENTS(s_aOptions), 1, RTGETOPTINIT_FLAGS_OPTS_FIRST); + AssertRCReturn(rc, RTEXITCODE_FAILURE); + RTGETOPTUNION ValueUnion; + int ch; + while ((ch = RTGetOpt(&GetState, &ValueUnion))) + { + switch (ch) + { + case 'e': pszExe = ValueUnion.psz; break; + case 'o': pszOut = ValueUnion.psz; break; + case 'b': fCursorFlags = 0; break; + case 'c': fCursorFlags = RTASN1CURSOR_FLAGS_CER; break; + case 'd': fCursorFlags = RTASN1CURSOR_FLAGS_DER; break; + case 'f': fForce = true; break; + case 'i': iSignature = ValueUnion.u32; break; + case 'V': return HandleVersion(cArgs, papszArgs); + case 'h': return HelpExtractExeSignerCert(g_pStdOut, RTSIGNTOOLHELP_FULL); + + case VINF_GETOPT_NOT_OPTION: + if (!pszExe) + pszExe = ValueUnion.psz; + else if (!pszOut) + pszOut = ValueUnion.psz; + else + return RTMsgErrorExit(RTEXITCODE_FAILURE, "Too many file arguments: %s", ValueUnion.psz); + break; + + default: + return RTGetOptPrintError(ch, &ValueUnion); + } + } + if (!pszExe) + return RTMsgErrorExit(RTEXITCODE_FAILURE, "No executable given."); + if (!pszOut) + return RTMsgErrorExit(RTEXITCODE_FAILURE, "No output file given."); + if (!fForce && RTPathExists(pszOut)) + return RTMsgErrorExit(RTEXITCODE_FAILURE, "The output file '%s' exists.", pszOut); + + /* + * Do it. + */ + /* Read & decode the PKCS#7 signature. */ + SIGNTOOLPKCS7EXE This; + RTEXITCODE rcExit = SignToolPkcs7Exe_InitFromFile(&This, pszExe, cVerbosity, enmLdrArch); + if (rcExit == RTEXITCODE_SUCCESS) + { + /* Find the signing certificate (ASSUMING that the certificate used is shipped in the set of certificates). */ + PRTCRPKCS7SIGNEDDATA pSignedData; + PCRTCRPKCS7SIGNERINFO pSignerInfo = SignToolPkcs7_FindNestedSignatureByIndex(&This, iSignature, &pSignedData); + rcExit = RTEXITCODE_FAILURE; + if (pSignerInfo) + { + PCRTCRPKCS7ISSUERANDSERIALNUMBER pISN = &pSignedData->SignerInfos.papItems[0]->IssuerAndSerialNumber; + PCRTCRX509CERTIFICATE pCert; + pCert = RTCrPkcs7SetOfCerts_FindX509ByIssuerAndSerialNumber(&pSignedData->Certificates, + &pISN->Name, &pISN->SerialNumber); + if (pCert) + { + /* + * Write it out. + */ + RTFILE hFile; + rc = RTFileOpen(&hFile, pszOut, + RTFILE_O_WRITE | RTFILE_O_DENY_WRITE | (fForce ? RTFILE_O_CREATE_REPLACE : RTFILE_O_CREATE)); + if (RT_SUCCESS(rc)) + { + uint32_t cbCert = pCert->SeqCore.Asn1Core.cbHdr + pCert->SeqCore.Asn1Core.cb; + rc = RTFileWrite(hFile, pCert->SeqCore.Asn1Core.uData.pu8 - pCert->SeqCore.Asn1Core.cbHdr, + cbCert, NULL); + if (RT_SUCCESS(rc)) + { + rc = RTFileClose(hFile); + if (RT_SUCCESS(rc)) + { + hFile = NIL_RTFILE; + rcExit = RTEXITCODE_SUCCESS; + RTMsgInfo("Successfully wrote %u bytes to '%s'", cbCert, pszOut); + } + else + RTMsgError("RTFileClose failed: %Rrc", rc); + } + else + RTMsgError("RTFileWrite failed: %Rrc", rc); + RTFileClose(hFile); + } + else + RTMsgError("Error opening '%s' for writing: %Rrc", pszOut, rc); + } + else + RTMsgError("Certificate not found."); + } + else + RTMsgError("Could not locate signature #%u!", iSignature); + + /* Delete the signature data. */ + SignToolPkcs7Exe_Delete(&This); + } + return rcExit; +} + + +/********************************************************************************************************************************* +* The 'extract-exe-signature' command. * +*********************************************************************************************************************************/ + +static RTEXITCODE HelpExtractExeSignature(PRTSTREAM pStrm, RTSIGNTOOLHELP enmLevel) +{ + RT_NOREF_PV(enmLevel); + RTStrmWrappedPrintf(pStrm, RTSTRMWRAPPED_F_HANGING_INDENT, + "extract-exe-signerature [--exe|-e] [--output|-o] \n"); + return RTEXITCODE_SUCCESS; +} + +static RTEXITCODE HandleExtractExeSignature(int cArgs, char **papszArgs) +{ + /* + * Parse arguments. + */ + static const RTGETOPTDEF s_aOptions[] = + { + { "--exe", 'e', RTGETOPT_REQ_STRING }, + { "--output", 'o', RTGETOPT_REQ_STRING }, + { "--force", 'f', RTGETOPT_REQ_NOTHING }, + }; + + const char *pszExe = NULL; + const char *pszOut = NULL; + RTLDRARCH enmLdrArch = RTLDRARCH_WHATEVER; + unsigned cVerbosity = 0; + bool fForce = false; + + RTGETOPTSTATE GetState; + int rc = RTGetOptInit(&GetState, cArgs, papszArgs, s_aOptions, RT_ELEMENTS(s_aOptions), 1, RTGETOPTINIT_FLAGS_OPTS_FIRST); + AssertRCReturn(rc, RTEXITCODE_FAILURE); + RTGETOPTUNION ValueUnion; + int ch; + while ((ch = RTGetOpt(&GetState, &ValueUnion))) + { + switch (ch) + { + case 'e': pszExe = ValueUnion.psz; break; + case 'o': pszOut = ValueUnion.psz; break; + case 'f': fForce = true; break; + case 'V': return HandleVersion(cArgs, papszArgs); + case 'h': return HelpExtractExeSignerCert(g_pStdOut, RTSIGNTOOLHELP_FULL); + + case VINF_GETOPT_NOT_OPTION: + if (!pszExe) + pszExe = ValueUnion.psz; + else if (!pszOut) + pszOut = ValueUnion.psz; + else + return RTMsgErrorExit(RTEXITCODE_FAILURE, "Too many file arguments: %s", ValueUnion.psz); + break; + + default: + return RTGetOptPrintError(ch, &ValueUnion); + } + } + if (!pszExe) + return RTMsgErrorExit(RTEXITCODE_FAILURE, "No executable given."); + if (!pszOut) + return RTMsgErrorExit(RTEXITCODE_FAILURE, "No output file given."); + if (!fForce && RTPathExists(pszOut)) + return RTMsgErrorExit(RTEXITCODE_FAILURE, "The output file '%s' exists.", pszOut); + + /* + * Do it. + */ + /* Read & decode the PKCS#7 signature. */ + SIGNTOOLPKCS7EXE This; + RTEXITCODE rcExit = SignToolPkcs7Exe_InitFromFile(&This, pszExe, cVerbosity, enmLdrArch); + if (rcExit == RTEXITCODE_SUCCESS) + { + /* + * Write out the PKCS#7 signature. + */ + RTFILE hFile; + rc = RTFileOpen(&hFile, pszOut, + RTFILE_O_WRITE | RTFILE_O_DENY_WRITE | (fForce ? RTFILE_O_CREATE_REPLACE : RTFILE_O_CREATE)); + if (RT_SUCCESS(rc)) + { + rc = RTFileWrite(hFile, This.pbBuf, This.cbBuf, NULL); + if (RT_SUCCESS(rc)) + { + rc = RTFileClose(hFile); + if (RT_SUCCESS(rc)) + { + hFile = NIL_RTFILE; + RTMsgInfo("Successfully wrote %u bytes to '%s'", This.cbBuf, pszOut); + rcExit = RTEXITCODE_SUCCESS; + } + else + RTMsgError("RTFileClose failed: %Rrc", rc); + } + else + RTMsgError("RTFileWrite failed: %Rrc", rc); + RTFileClose(hFile); + } + else + RTMsgError("Error opening '%s' for writing: %Rrc", pszOut, rc); + + /* Delete the signature data. */ + SignToolPkcs7Exe_Delete(&This); + } + return rcExit; +} + + +/********************************************************************************************************************************* +* The 'add-nested-exe-signature' command. * +*********************************************************************************************************************************/ + +static RTEXITCODE HelpAddNestedExeSignature(PRTSTREAM pStrm, RTSIGNTOOLHELP enmLevel) +{ + RT_NOREF_PV(enmLevel); + RTStrmWrappedPrintf(pStrm, RTSTRMWRAPPED_F_HANGING_INDENT, + "add-nested-exe-signature [-v|--verbose] [-d|--debug] [-p|--prepend] \n"); + if (enmLevel == RTSIGNTOOLHELP_FULL) + RTStrmWrappedPrintf(pStrm, 0, + "\n" + "The --debug option allows the source-exe to be omitted in order to test the " + "encoding and PE file modification.\n" + "\n" + "The --prepend option puts the nested signature first rather than appending it " + "to the end of of the nested signature set. Windows reads nested signatures in " + "reverse order, so --prepend will logically putting it last.\n"); + return RTEXITCODE_SUCCESS; +} + + +static RTEXITCODE HandleAddNestedExeSignature(int cArgs, char **papszArgs) +{ + /* + * Parse arguments. + */ + static const RTGETOPTDEF s_aOptions[] = + { + { "--prepend", 'p', RTGETOPT_REQ_NOTHING }, + { "--verbose", 'v', RTGETOPT_REQ_NOTHING }, + { "--debug", 'd', RTGETOPT_REQ_NOTHING }, + }; + + const char *pszDst = NULL; + const char *pszSrc = NULL; + unsigned cVerbosity = 0; + bool fDebug = false; + bool fPrepend = false; + + RTGETOPTSTATE GetState; + int rc = RTGetOptInit(&GetState, cArgs, papszArgs, s_aOptions, RT_ELEMENTS(s_aOptions), 1, RTGETOPTINIT_FLAGS_OPTS_FIRST); + AssertRCReturn(rc, RTEXITCODE_FAILURE); + RTGETOPTUNION ValueUnion; + int ch; + while ((ch = RTGetOpt(&GetState, &ValueUnion))) + { + switch (ch) + { + case 'v': cVerbosity++; break; + case 'd': fDebug = pszSrc == NULL; break; + case 'p': fPrepend = true; break; + case 'V': return HandleVersion(cArgs, papszArgs); + case 'h': return HelpAddNestedExeSignature(g_pStdOut, RTSIGNTOOLHELP_FULL); + + case VINF_GETOPT_NOT_OPTION: + if (!pszDst) + pszDst = ValueUnion.psz; + else if (!pszSrc) + { + pszSrc = ValueUnion.psz; + fDebug = false; + } + else + return RTMsgErrorExit(RTEXITCODE_FAILURE, "Too many file arguments: %s", ValueUnion.psz); + break; + + default: + return RTGetOptPrintError(ch, &ValueUnion); + } + } + if (!pszDst) + return RTMsgErrorExit(RTEXITCODE_FAILURE, "No destination executable given."); + if (!pszSrc && !fDebug) + return RTMsgErrorExit(RTEXITCODE_FAILURE, "No source executable file given."); + + /* + * Do it. + */ + /* Read & decode the source PKCS#7 signature. */ + SIGNTOOLPKCS7EXE Src; + RTEXITCODE rcExit = pszSrc ? SignToolPkcs7Exe_InitFromFile(&Src, pszSrc, cVerbosity) : RTEXITCODE_SUCCESS; + if (rcExit == RTEXITCODE_SUCCESS) + { + /* Ditto for the destination PKCS#7 signature. */ + SIGNTOOLPKCS7EXE Dst; + rcExit = SignToolPkcs7Exe_InitFromFile(&Dst, pszDst, cVerbosity); + if (rcExit == RTEXITCODE_SUCCESS) + { + /* Do the signature manipulation. */ + if (pszSrc) + rcExit = SignToolPkcs7_AddNestedSignature(&Dst, &Src, cVerbosity, fPrepend); + if (rcExit == RTEXITCODE_SUCCESS) + rcExit = SignToolPkcs7_Encode(&Dst, cVerbosity); + + /* Update the destination executable file. */ + if (rcExit == RTEXITCODE_SUCCESS) + rcExit = SignToolPkcs7Exe_WriteSignatureToFile(&Dst, cVerbosity); + + SignToolPkcs7Exe_Delete(&Dst); + } + if (pszSrc) + SignToolPkcs7Exe_Delete(&Src); + } + + return rcExit; +} + + +/********************************************************************************************************************************* +* The 'add-nested-cat-signature' command. * +*********************************************************************************************************************************/ + +static RTEXITCODE HelpAddNestedCatSignature(PRTSTREAM pStrm, RTSIGNTOOLHELP enmLevel) { RT_NOREF_PV(enmLevel); - RTStrmPrintf(pStrm, "extract-exe-signer-cert [--ber|--cer|--der] [--signature-index|-i ] [--exe|-e] [--output|-o] \n"); + RTStrmWrappedPrintf(pStrm, RTSTRMWRAPPED_F_HANGING_INDENT, + "add-nested-cat-signature [-v|--verbose] [-d|--debug] [-p|--prepend] \n"); + if (enmLevel == RTSIGNTOOLHELP_FULL) + RTStrmWrappedPrintf(pStrm, 0, + "\n" + "The --debug option allows the source-cat to be omitted in order to test the " + "ASN.1 re-encoding of the destination catalog file.\n" + "\n" + "The --prepend option puts the nested signature first rather than appending it " + "to the end of of the nested signature set. Windows reads nested signatures in " + "reverse order, so --prepend will logically putting it last.\n"); return RTEXITCODE_SUCCESS; } -static RTEXITCODE HandleExtractExeSignerCert(int cArgs, char **papszArgs) + +static RTEXITCODE HandleAddNestedCatSignature(int cArgs, char **papszArgs) { /* * Parse arguments. */ static const RTGETOPTDEF s_aOptions[] = { - { "--ber", 'b', RTGETOPT_REQ_NOTHING }, - { "--cer", 'c', RTGETOPT_REQ_NOTHING }, - { "--der", 'd', RTGETOPT_REQ_NOTHING }, - { "--exe", 'e', RTGETOPT_REQ_STRING }, - { "--output", 'o', RTGETOPT_REQ_STRING }, - { "--signature-index", 'i', RTGETOPT_REQ_UINT32 }, + { "--prepend", 'p', RTGETOPT_REQ_NOTHING }, + { "--verbose", 'v', RTGETOPT_REQ_NOTHING }, + { "--debug", 'd', RTGETOPT_REQ_NOTHING }, }; - const char *pszExe = NULL; - const char *pszOut = NULL; - RTLDRARCH enmLdrArch = RTLDRARCH_WHATEVER; - unsigned cVerbosity = 0; - uint32_t fCursorFlags = RTASN1CURSOR_FLAGS_DER; - uint32_t iSignature = 0; + const char *pszDst = NULL; + const char *pszSrc = NULL; + unsigned cVerbosity = 0; + bool fDebug = false; + bool fPrepend = false; RTGETOPTSTATE GetState; int rc = RTGetOptInit(&GetState, cArgs, papszArgs, s_aOptions, RT_ELEMENTS(s_aOptions), 1, RTGETOPTINIT_FLAGS_OPTS_FIRST); @@ -923,20 +3224,20 @@ { switch (ch) { - case 'e': pszExe = ValueUnion.psz; break; - case 'o': pszOut = ValueUnion.psz; break; - case 'b': fCursorFlags = 0; break; - case 'c': fCursorFlags = RTASN1CURSOR_FLAGS_CER; break; - case 'd': fCursorFlags = RTASN1CURSOR_FLAGS_DER; break; - case 'i': iSignature = ValueUnion.u32; break; + case 'v': cVerbosity++; break; + case 'd': fDebug = pszSrc == NULL; break; + case 'p': fPrepend = true; break; case 'V': return HandleVersion(cArgs, papszArgs); - case 'h': return HelpExtractExeSignerCert(g_pStdOut, RTSIGNTOOLHELP_FULL); + case 'h': return HelpAddNestedCatSignature(g_pStdOut, RTSIGNTOOLHELP_FULL); case VINF_GETOPT_NOT_OPTION: - if (!pszExe) - pszExe = ValueUnion.psz; - else if (!pszOut) - pszOut = ValueUnion.psz; + if (!pszDst) + pszDst = ValueUnion.psz; + else if (!pszSrc) + { + pszSrc = ValueUnion.psz; + fDebug = false; + } else return RTMsgErrorExit(RTEXITCODE_FAILURE, "Too many file arguments: %s", ValueUnion.psz); break; @@ -945,301 +3246,652 @@ return RTGetOptPrintError(ch, &ValueUnion); } } - if (!pszExe) - return RTMsgErrorExit(RTEXITCODE_FAILURE, "No executable given."); - if (!pszOut) - return RTMsgErrorExit(RTEXITCODE_FAILURE, "No output file given."); - if (RTPathExists(pszOut)) - return RTMsgErrorExit(RTEXITCODE_FAILURE, "The output file '%s' exists.", pszOut); + if (!pszDst) + return RTMsgErrorExit(RTEXITCODE_FAILURE, "No destination catalog file given."); + if (!pszSrc && !fDebug) + return RTMsgErrorExit(RTEXITCODE_FAILURE, "No source catalog file given."); /* * Do it. */ - /* Read & decode the PKCS#7 signature. */ - SIGNTOOLPKCS7EXE This; - RTEXITCODE rcExit = SignToolPkcs7Exe_InitFromFile(&This, pszExe, cVerbosity, enmLdrArch); + /* Read & decode the source PKCS#7 signature. */ + SIGNTOOLPKCS7 Src; + RTEXITCODE rcExit = pszSrc ? SignToolPkcs7_InitFromFile(&Src, pszSrc, cVerbosity) : RTEXITCODE_SUCCESS; if (rcExit == RTEXITCODE_SUCCESS) { - /* Find the signing certificate (ASSUMING that the certificate used is shipped in the set of certificates). */ - PRTCRPKCS7SIGNEDDATA pSignedData; - PCRTCRPKCS7SIGNERINFO pSignerInfo = SignToolPkcs7_FindNestedSignatureByIndex(&This, iSignature, &pSignedData); - rcExit = RTEXITCODE_FAILURE; - if (pSignerInfo) + /* Ditto for the destination PKCS#7 signature. */ + SIGNTOOLPKCS7EXE Dst; + rcExit = SignToolPkcs7_InitFromFile(&Dst, pszDst, cVerbosity); + if (rcExit == RTEXITCODE_SUCCESS) { - PCRTCRPKCS7ISSUERANDSERIALNUMBER pISN = &pSignedData->SignerInfos.papItems[0]->IssuerAndSerialNumber; - PCRTCRX509CERTIFICATE pCert; - pCert = RTCrPkcs7SetOfCerts_FindX509ByIssuerAndSerialNumber(&pSignedData->Certificates, - &pISN->Name, &pISN->SerialNumber); - if (pCert) + /* Do the signature manipulation. */ + if (pszSrc) + rcExit = SignToolPkcs7_AddNestedSignature(&Dst, &Src, cVerbosity, fPrepend); + if (rcExit == RTEXITCODE_SUCCESS) + rcExit = SignToolPkcs7_Encode(&Dst, cVerbosity); + + /* Update the destination executable file. */ + if (rcExit == RTEXITCODE_SUCCESS) + rcExit = SignToolPkcs7_WriteSignatureToFile(&Dst, pszDst, cVerbosity); + + SignToolPkcs7_Delete(&Dst); + } + if (pszSrc) + SignToolPkcs7_Delete(&Src); + } + + return rcExit; +} + + +/********************************************************************************************************************************* +* Option handlers shared by 'sign-exe', 'sign-cat', 'add-timestamp-exe-signature' and others. * +*********************************************************************************************************************************/ +#ifndef IPRT_SIGNTOOL_NO_SIGNING + +static RTEXITCODE HandleOptAddCert(PRTCRSTORE phStore, const char *pszFile) +{ + if (*phStore == NIL_RTCRSTORE) + { + int rc = RTCrStoreCreateInMem(phStore, 2); + if (RT_FAILURE(rc)) + return RTMsgErrorExitFailure("RTCrStoreCreateInMem(,2) failed: %Rrc", rc); + } + RTERRINFOSTATIC ErrInfo; + int rc = RTCrStoreCertAddFromFile(*phStore, RTCRCERTCTX_F_ADD_IF_NOT_FOUND, pszFile, RTErrInfoInitStatic(&ErrInfo)); + if (RT_FAILURE(rc)) + return RTMsgErrorExitFailure("Error reading certificate from '%s': %Rrc%#RTeim", pszFile, rc, &ErrInfo.Core); + return RTEXITCODE_SUCCESS; +} + +static RTEXITCODE HandleOptSignatureType(RTDIGESTTYPE *penmSigType, const char *pszType) +{ + if ( RTStrICmpAscii(pszType, "sha1") == 0 + || RTStrICmpAscii(pszType, "sha-1") == 0) + *penmSigType = RTDIGESTTYPE_SHA1; + else if ( RTStrICmpAscii(pszType, "sha256") == 0 + || RTStrICmpAscii(pszType, "sha-256") == 0) + *penmSigType = RTDIGESTTYPE_SHA256; + else + return RTMsgErrorExit(RTEXITCODE_SYNTAX, "Unknown signature type: %s (expected sha1 or sha256)", pszType); + return RTEXITCODE_SUCCESS; +} + + +static RTEXITCODE HandleOptTimestampType(bool *pfOldType, const char *pszType) +{ + if (strcmp(pszType, "old") == 0) + *pfOldType = true; + else if (strcmp(pszType, "new") == 0) + *pfOldType = false; + else + return RTMsgErrorExit(RTEXITCODE_SYNTAX, "Unknown timestamp type: %s", pszType); + return RTEXITCODE_SUCCESS; +} + +static RTEXITCODE HandleOptTimestampOverride(PRTTIMESPEC pSigningTime, const char *pszPartialTs) +{ + /* + * First try use it as-is. + */ + if (RTTimeSpecFromString(pSigningTime, pszPartialTs) != NULL) + return RTEXITCODE_SUCCESS; + + /* Check the input against a pattern, making sure we've got something that + makes sense before trying to merge. */ + size_t const cchPartialTs = strlen(pszPartialTs); + static char s_szPattern[] = "0000-00-00T00:00:"; + if (cchPartialTs > sizeof(s_szPattern) - 1) /* It is not a partial timestamp if we've got the seconds component. */ + return RTMsgErrorExit(RTEXITCODE_SYNTAX, "Invalid timestamp: %s", pszPartialTs); + + for (size_t off = 0; off < cchPartialTs; off++) + switch (s_szPattern[off]) + { + case '0': + if (!RT_C_IS_DIGIT(pszPartialTs[off])) + return RTMsgErrorExit(RTEXITCODE_SYNTAX, "Invalid timestamp, expected digit at position %u: %s", + off + 1, pszPartialTs); + break; + case '-': + case ':': + if (pszPartialTs[off] != s_szPattern[off]) + return RTMsgErrorExit(RTEXITCODE_SYNTAX, "Invalid timestamp, expected '%c' at position %u: %s", + s_szPattern[off], off + 1, pszPartialTs); + break; + case 'T': + if ( pszPartialTs[off] != 'T' + && pszPartialTs[off] != 't' + && pszPartialTs[off] != ' ') + return RTMsgErrorExit(RTEXITCODE_SYNTAX, "Invalid timestamp, expected 'T' or space at position %u: %s", + off + 1, pszPartialTs); + break; + default: + return RTMsgErrorExit(RTEXITCODE_SYNTAX, "Internal error"); + } + + if (RT_C_IS_DIGIT(s_szPattern[cchPartialTs]) && RT_C_IS_DIGIT(s_szPattern[cchPartialTs - 1])) + return RTMsgErrorExit(RTEXITCODE_SYNTAX, "Incomplete timstamp component: %s", pszPartialTs); + + /* + * Take the current time and merge in the components from pszPartialTs. + */ + char szSigningTime[RTTIME_STR_LEN]; + RTTIMESPEC Now; + RTTimeSpecToString(RTTimeNow(&Now), szSigningTime, sizeof(szSigningTime)); + memcpy(szSigningTime, pszPartialTs, cchPartialTs); + szSigningTime[4+1+2+1+2] = 'T'; + + /* Fix 29th for non-leap override: */ + if (memcmp(&szSigningTime[5], RT_STR_TUPLE("02-29")) == 0) + { + if (!RTTimeIsLeapYear(RTStrToUInt32(szSigningTime))) + szSigningTime[9] = '8'; + } + if (RTTimeSpecFromString(pSigningTime, szSigningTime) == NULL) + return RTMsgErrorExit(RTEXITCODE_SYNTAX, "Invalid timestamp: %s (%s)", pszPartialTs, szSigningTime); + + return RTEXITCODE_SUCCESS; +} + +static RTEXITCODE HandleOptFileType(RTSIGNTOOLFILETYPE *penmFileType, const char *pszType) +{ + if (strcmp(pszType, "detect") == 0 || strcmp(pszType, "auto") == 0) + *penmFileType = RTSIGNTOOLFILETYPE_DETECT; + else if (strcmp(pszType, "exe") == 0) + *penmFileType = RTSIGNTOOLFILETYPE_EXE; + else if (strcmp(pszType, "cat") == 0) + *penmFileType = RTSIGNTOOLFILETYPE_CAT; + else + return RTMsgErrorExit(RTEXITCODE_SYNTAX, "Unknown forced file type: %s", pszType); + return RTEXITCODE_SUCCESS; +} + +/** + * Detects the type of files @a pszFile is (by reading from it). + * + * @returns The file type, or RTSIGNTOOLFILETYPE_UNKNOWN (error displayed). + * @param enmForceFileType Usually set to RTSIGNTOOLFILETYPE_DETECT, but if + * not we'll return this without probing the file. + * @param pszFile The name of the file to detect the type of. + */ +static RTSIGNTOOLFILETYPE DetectFileType(RTSIGNTOOLFILETYPE enmForceFileType, const char *pszFile) +{ + /* + * Forced? + */ + if (enmForceFileType != RTSIGNTOOLFILETYPE_DETECT) + return enmForceFileType; + + /* + * Read the start of the file. + */ + RTFILE hFile = NIL_RTFILE; + int rc = RTFileOpen(&hFile, pszFile, RTFILE_O_READ | RTFILE_O_OPEN | RTFILE_O_DENY_WRITE); + if (RT_FAILURE(rc)) + { + RTMsgError("Error opening '%s' for reading: %Rrc", pszFile, rc); + return RTSIGNTOOLFILETYPE_UNKNOWN; + } + + union + { + uint8_t ab[256]; + uint16_t au16[256/2]; + uint32_t au32[256/4]; + } uBuf; + RT_ZERO(uBuf); + + size_t cbRead = 0; + rc = RTFileRead(hFile, &uBuf, sizeof(uBuf), &cbRead); + if (RT_FAILURE(rc)) + RTMsgError("Error reading from '%s': %Rrc", pszFile, rc); + + uint64_t cbFile; + int rcSize = RTFileQuerySize(hFile, &cbFile); + if (RT_FAILURE(rcSize)) + RTMsgError("Error querying size of '%s': %Rrc", pszFile, rc); + + RTFileClose(hFile); + if (RT_FAILURE(rc) || RT_FAILURE(rcSize)) + return RTSIGNTOOLFILETYPE_UNKNOWN; + + /* + * Try guess the kind of file. + */ + /* All the executable magics we know: */ + if ( uBuf.au16[0] == RT_H2LE_U16_C(IMAGE_DOS_SIGNATURE) + || uBuf.au16[0] == RT_H2LE_U16_C(IMAGE_NE_SIGNATURE) + || uBuf.au16[0] == RT_H2LE_U16_C(IMAGE_LX_SIGNATURE) + || uBuf.au16[0] == RT_H2LE_U16_C(IMAGE_LE_SIGNATURE) + || uBuf.au32[0] == RT_H2LE_U32_C(IMAGE_NT_SIGNATURE) + || uBuf.au32[0] == RT_H2LE_U32_C(IMAGE_ELF_SIGNATURE) + || uBuf.au32[0] == IMAGE_FAT_SIGNATURE + || uBuf.au32[0] == IMAGE_FAT_SIGNATURE_OE + || uBuf.au32[0] == IMAGE_MACHO32_SIGNATURE + || uBuf.au32[0] == IMAGE_MACHO32_SIGNATURE_OE + || uBuf.au32[0] == IMAGE_MACHO64_SIGNATURE + || uBuf.au32[0] == IMAGE_MACHO64_SIGNATURE_OE) + return RTSIGNTOOLFILETYPE_EXE; + + /* + * Catalog files are PKCS#7 SignedData and starts with a ContentInfo, i.e.: + * SEQUENCE { + * contentType OBJECT IDENTIFIER, + * content [0] EXPLICIT ANY DEFINED BY contentType OPTIONAL + * } + * + * We ASSUME that it's DER encoded and doesn't use an indefinite length form + * at the start and that contentType is signedData (1.2.840.113549.1.7.2). + * + * Example of a 10353 (0x2871) byte long file: + * vv-------- contentType -------vv + * 00000000 30 82 28 6D 06 09 2A 86 48 86 F7 0D 01 07 02 A0 + * 00000010 82 28 5E 30 82 28 5A 02 01 01 31 0B 30 09 06 05 + */ + if ( uBuf.ab[0] == (ASN1_TAG_SEQUENCE | ASN1_TAGFLAG_CONSTRUCTED) + && uBuf.ab[1] != 0x80 /* not indefinite form */ + && uBuf.ab[1] > 0x30) + { + size_t off = 1; + uint32_t cbRec = uBuf.ab[1]; + if (cbRec & 0x80) + { + cbRec &= 0x7f; + off += cbRec; + switch (cbRec) { - /* - * Write it out. - */ - RTFILE hFile; - rc = RTFileOpen(&hFile, pszOut, RTFILE_O_WRITE | RTFILE_O_DENY_WRITE | RTFILE_O_CREATE); - if (RT_SUCCESS(rc)) - { - uint32_t cbCert = pCert->SeqCore.Asn1Core.cbHdr + pCert->SeqCore.Asn1Core.cb; - rc = RTFileWrite(hFile, pCert->SeqCore.Asn1Core.uData.pu8 - pCert->SeqCore.Asn1Core.cbHdr, - cbCert, NULL); - if (RT_SUCCESS(rc)) - { - rc = RTFileClose(hFile); - if (RT_SUCCESS(rc)) - { - hFile = NIL_RTFILE; - rcExit = RTEXITCODE_SUCCESS; - RTMsgInfo("Successfully wrote %u bytes to '%s'", cbCert, pszOut); - } - else - RTMsgError("RTFileClose failed: %Rrc", rc); - } - else - RTMsgError("RTFileWrite failed: %Rrc", rc); - RTFileClose(hFile); - } - else - RTMsgError("Error opening '%s' for writing: %Rrc", pszOut, rc); + case 1: cbRec = uBuf.ab[2]; break; + case 2: cbRec = RT_MAKE_U16( uBuf.ab[3], uBuf.ab[2]); break; + case 3: cbRec = RT_MAKE_U32_FROM_U8(uBuf.ab[4], uBuf.ab[3], uBuf.ab[2], 0); break; + case 4: cbRec = RT_MAKE_U32_FROM_U8(uBuf.ab[5], uBuf.ab[4], uBuf.ab[3], uBuf.ab[2]); break; + default: cbRec = UINT32_MAX; break; + } + } + if (off <= 5) + { + off++; + if (off + cbRec == cbFile) + { + /* If the contentType is signedData we're going to treat it as a catalog file, + we don't currently much care about the signed content of a cat file. */ + static const uint8_t s_abSignedDataOid[] = + { ASN1_TAG_OID, 9 /*length*/, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x07, 0x02 }; + if (memcmp(&uBuf.ab[off], s_abSignedDataOid, sizeof(s_abSignedDataOid)) == 0) + return RTSIGNTOOLFILETYPE_CAT; } - else - RTMsgError("Certificate not found."); } - else - RTMsgError("Could not locate signature #%u!", iSignature); - - /* Delete the signature data. */ - SignToolPkcs7Exe_Delete(&This); } - return rcExit; + + RTMsgError("Unable to detect type of '%s'", pszFile); + return RTSIGNTOOLFILETYPE_UNKNOWN; } +#endif /* !IPRT_SIGNTOOL_NO_SIGNING */ -/* - * The 'add-nested-exe-signature' command. - */ -static RTEXITCODE HelpAddNestedExeSignature(PRTSTREAM pStrm, RTSIGNTOOLHELP enmLevel) + +/********************************************************************************************************************************* +* The 'add-timestamp-exe-signature' command. * +*********************************************************************************************************************************/ +#ifndef IPRT_SIGNTOOL_NO_SIGNING + +static RTEXITCODE HelpAddTimestampExeSignature(PRTSTREAM pStrm, RTSIGNTOOLHELP enmLevel) { RT_NOREF_PV(enmLevel); - RTStrmPrintf(pStrm, "add-nested-exe-signature [-v|--verbose] [-d|--debug] [-p|--prepend] \n"); + + RTStrmWrappedPrintf(pStrm, RTSTRMWRAPPED_F_HANGING_INDENT, + "add-timestamp-exe-signature [-v|--verbose] [--signature-index|-i ] " + OPT_CERT_KEY_SYNOPSIS("--timestamp-") + "[--timestamp-type old|new] " + "[--timestamp-override ] " + "[--replace-existing|-r] " + "\n"); if (enmLevel == RTSIGNTOOLHELP_FULL) - RTStrmPrintf(pStrm, - "\n" - "The --debug option allows the source-exe to be omitted in order to test the\n" - "encoding and PE file modification.\n" - "\n" - "The --prepend option puts the nested signature first rather than appending it\n" - "to the end of of the nested signature set. Windows reads nested signatures in\n" - "reverse order, so --prepend will logically putting it last.\n" - ); + RTStrmWrappedPrintf(pStrm, 0, + "This is mainly to test timestamp code.\n" + "\n" + "The --timestamp-override option can take a partial or full ISO timestamp. It is merged " + "with the current time if partial.\n" + "\n"); return RTEXITCODE_SUCCESS; } - -static RTEXITCODE HandleAddNestedExeSignature(int cArgs, char **papszArgs) +static RTEXITCODE HandleAddTimestampExeSignature(int cArgs, char **papszArgs) { /* * Parse arguments. */ static const RTGETOPTDEF s_aOptions[] = { - { "--prepend", 'p', RTGETOPT_REQ_NOTHING }, - { "--verbose", 'v', RTGETOPT_REQ_NOTHING }, - { "--debug", 'd', RTGETOPT_REQ_NOTHING }, + { "--signature-index", 'i', RTGETOPT_REQ_UINT32 }, + OPT_CERT_KEY_GETOPTDEF_ENTRIES("--timestamp-", 1000), + { "--timestamp-type", OPT_TIMESTAMP_TYPE, RTGETOPT_REQ_STRING }, + { "--timestamp-override", OPT_TIMESTAMP_OVERRIDE, RTGETOPT_REQ_STRING }, + { "--replace-existing", 'r', RTGETOPT_REQ_NOTHING }, + { "--verbose", 'v', RTGETOPT_REQ_NOTHING }, }; - const char *pszDst = NULL; - const char *pszSrc = NULL; - unsigned cVerbosity = 0; - bool fDebug = false; - bool fPrepend = false; + unsigned cVerbosity = 0; + unsigned iSignature = 0; + bool fReplaceExisting = false; + bool fTimestampTypeOld = true; + SignToolKeyPair TimestampCertKey("timestamp", true); + RTTIMESPEC SigningTime; + RTTimeNow(&SigningTime); - RTGETOPTSTATE GetState; + RTGETOPTSTATE GetState; int rc = RTGetOptInit(&GetState, cArgs, papszArgs, s_aOptions, RT_ELEMENTS(s_aOptions), 1, RTGETOPTINIT_FLAGS_OPTS_FIRST); AssertRCReturn(rc, RTEXITCODE_FAILURE); - RTGETOPTUNION ValueUnion; - int ch; + + RTEXITCODE rcExit = RTEXITCODE_SUCCESS; + RTGETOPTUNION ValueUnion; + int ch; while ((ch = RTGetOpt(&GetState, &ValueUnion))) { + RTEXITCODE rcExit2 = RTEXITCODE_SUCCESS; switch (ch) { - case 'v': cVerbosity++; break; - case 'd': fDebug = pszSrc == NULL; break; - case 'p': fPrepend = true; break; - case 'V': return HandleVersion(cArgs, papszArgs); - case 'h': return HelpAddNestedExeSignature(g_pStdOut, RTSIGNTOOLHELP_FULL); + OPT_CERT_KEY_SWITCH_CASES(TimestampCertKey, 1000, ch, ValueUnion, rcExit2); + case 'i': iSignature = ValueUnion.u32; break; + case OPT_TIMESTAMP_TYPE: rcExit2 = HandleOptTimestampType(&fTimestampTypeOld, ValueUnion.psz); break; + case OPT_TIMESTAMP_OVERRIDE: rcExit2 = HandleOptTimestampOverride(&SigningTime, ValueUnion.psz); break; + case 'r': fReplaceExisting = true; break; + case 'v': cVerbosity++; break; + case 'V': return HandleVersion(cArgs, papszArgs); + case 'h': return HelpAddTimestampExeSignature(g_pStdOut, RTSIGNTOOLHELP_FULL); case VINF_GETOPT_NOT_OPTION: - if (!pszDst) - pszDst = ValueUnion.psz; - else if (!pszSrc) + /* Do final certificate and key option processing (first file only). */ + rcExit2 = TimestampCertKey.finalizeOptions(cVerbosity); + if (rcExit2 == RTEXITCODE_SUCCESS) { - pszSrc = ValueUnion.psz; - fDebug = false; + /* Do the work: */ + SIGNTOOLPKCS7EXE Exe; + rcExit2 = SignToolPkcs7Exe_InitFromFile(&Exe, ValueUnion.psz, cVerbosity); + if (rcExit2 == RTEXITCODE_SUCCESS) + { + rcExit2 = SignToolPkcs7_AddTimestampSignature(&Exe, cVerbosity, iSignature, fReplaceExisting, + fTimestampTypeOld, SigningTime, &TimestampCertKey); + if (rcExit2 == RTEXITCODE_SUCCESS) + rcExit2 = SignToolPkcs7_Encode(&Exe, cVerbosity); + if (rcExit2 == RTEXITCODE_SUCCESS) + rcExit2 = SignToolPkcs7Exe_WriteSignatureToFile(&Exe, cVerbosity); + SignToolPkcs7Exe_Delete(&Exe); + } + if (rcExit2 != RTEXITCODE_SUCCESS && rcExit == RTEXITCODE_SUCCESS) + rcExit = rcExit2; + rcExit2 = RTEXITCODE_SUCCESS; } - else - return RTMsgErrorExit(RTEXITCODE_FAILURE, "Too many file arguments: %s", ValueUnion.psz); break; default: return RTGetOptPrintError(ch, &ValueUnion); } - } - if (!pszDst) - return RTMsgErrorExit(RTEXITCODE_FAILURE, "No destination executable given."); - if (!pszSrc && !fDebug) - return RTMsgErrorExit(RTEXITCODE_FAILURE, "No source executable file given."); - /* - * Do it. - */ - /* Read & decode the source PKCS#7 signature. */ - SIGNTOOLPKCS7EXE Src; - RTEXITCODE rcExit = pszSrc ? SignToolPkcs7Exe_InitFromFile(&Src, pszSrc, cVerbosity) : RTEXITCODE_SUCCESS; - if (rcExit == RTEXITCODE_SUCCESS) - { - /* Ditto for the destination PKCS#7 signature. */ - SIGNTOOLPKCS7EXE Dst; - rcExit = SignToolPkcs7Exe_InitFromFile(&Dst, pszDst, cVerbosity); - if (rcExit == RTEXITCODE_SUCCESS) + if (rcExit2 != RTEXITCODE_SUCCESS) { - /* Do the signature manipulation. */ - if (pszSrc) - rcExit = SignToolPkcs7_AddNestedSignature(&Dst, &Src, cVerbosity, fPrepend); - if (rcExit == RTEXITCODE_SUCCESS) - rcExit = SignToolPkcs7_Encode(&Dst, cVerbosity); - - /* Update the destination executable file. */ - if (rcExit == RTEXITCODE_SUCCESS) - rcExit = SignToolPkcs7Exe_WriteSignatureToFile(&Dst, cVerbosity); - - SignToolPkcs7Exe_Delete(&Dst); + rcExit = rcExit2; + break; } - if (pszSrc) - SignToolPkcs7Exe_Delete(&Src); } - return rcExit; } +#endif /*!IPRT_SIGNTOOL_NO_SIGNING */ -/* - * The 'add-nested-cat-signature' command. - */ -static RTEXITCODE HelpAddNestedCatSignature(PRTSTREAM pStrm, RTSIGNTOOLHELP enmLevel) + +/********************************************************************************************************************************* +* The 'sign-exe' command. * +*********************************************************************************************************************************/ +#ifndef IPRT_SIGNTOOL_NO_SIGNING + +static RTEXITCODE HelpSign(PRTSTREAM pStrm, RTSIGNTOOLHELP enmLevel) { RT_NOREF_PV(enmLevel); - RTStrmPrintf(pStrm, "add-nested-cat-signature [-v|--verbose] [-d|--debug] [-p|--prepend] \n"); + + RTStrmWrappedPrintf(pStrm, RTSTRMWRAPPED_F_HANGING_INDENT, + "sign [-v|--verbose] " + "[--file-type exe|cat] " + "[--type|/fd sha1|sha256] " + "[--hash-pages|/ph] " + "[--no-hash-pages|/nph] " + "[--append/as] " + "[--no-signing-time] " + "[--add-cert ] " + "[--timestamp-type old|new] " + "[--timestamp-override ] " + "[--verbose|/debug|-v] " + OPT_CERT_KEY_SYNOPSIS("--") + OPT_CERT_KEY_SYNOPSIS("--timestamp-") + "\n"); if (enmLevel == RTSIGNTOOLHELP_FULL) - RTStrmPrintf(pStrm, - "\n" - "The --debug option allows the source-cat to be omitted in order to test the\n" - "ASN.1 re-encoding of the destination catalog file.\n" - "\n" - "The --prepend option puts the nested signature first rather than appending it\n" - "to the end of of the nested signature set. Windows reads nested signatures in\n" - "reverse order, so --prepend will logically putting it last.\n" - ); + RTStrmWrappedPrintf(pStrm, 0, + "\n" + "Create a new code signature for an executable or catalog.\n" + "\n" + "Options:\n" + " --append, /as\n" + " Append the signature if one already exists. The default is to replace any existing signature.\n" + " --type sha1|sha256, /fd sha1|sha256\n" + " Signature type, SHA-1 or SHA-256.\n" + " --hash-pages, /ph, --no-page-hashes, /nph\n" + " Enables or disables page hashing. Ignored for catalog files. Default: --no-page-hashes\n" + " --add-cert , /ac \n" + " Adds (first) certificate from the file to the signature. Both PEM and DER (binary) encodings " + "are accepted. Repeat to add more certiifcates.\n" + " --timestamp-override \n" + " This specifies the signing time as a ISO timestamp. Partial timestamps are merged with the " + "current time. This is applied to any timestamp signature as well as the signingTime attribute of " + "main signature. Higher resolution than seconds is not supported. Default: Current time.\n" + " --no-signing-time\n" + " Don't set the signing time on the main signature, only on the timestamp one. Unfortunately, " + "this doesn't work without modifying OpenSSL a little.\n" + " --timestamp-type old|new\n" + " Selects the timstamp type. 'old' is the old style /t stuff from signtool.exe. " + "'new' means a RTC-3161 timstamp - currently not implemented. Default: old\n" + "\n" + "Certificate and Key Options (--timestamp-cert-name etc for timestamps):\n" + " --cert-subject , /n \n" + " Locate the main signature signing certificate and key, unless anything else is given, " + "by the given name substring. Overrides any previous --cert-sha1 and --cert-file options.\n" + " --cert-sha1 , /sha1 \n" + " Locate the main signature signing certificate and key, unless anything else is given, " + "by the given thumbprint. The hex bytes can be space separated, colon separated, just " + "bunched together, or a mix of these. This overrids any previous --cert-name and --cert-file " + "options.\n" + " --cert-store , /s \n" + " Certificate store to search when using --cert-name or --cert-sha1. Default: MY\n" + " --cert-machine-store, /sm\n" + " Use the machine store rather the ones of the current user.\n" + " --cert-file , /f \n" + " Load the certificate and key, unless anything else is given, from given file. Both PEM and " + "DER (binary) encodings are supported. Keys file can be RSA or PKCS#12 formatted.\n" + " --key-file \n" + " Load the private key from the given file. Support RSA and PKCS#12 formatted files.\n" + " --key-password , /p \n" + " Password to use to decrypt a PKCS#12 password file.\n" + " --key-password-file |stdin\n" + " Load password to decrypt the password file from the given file or from stdin.\n" + " --key-name , /kc \n" + " The private key container name. Not implemented.\n" + " --key-provider , /csp \n" + " The name of the crypto provider where the private key conatiner specified via --key-name " + "can be found.\n" + ); + return RTEXITCODE_SUCCESS; } -static RTEXITCODE HandleAddNestedCatSignature(int cArgs, char **papszArgs) +static RTEXITCODE HandleSign(int cArgs, char **papszArgs) { /* * Parse arguments. */ static const RTGETOPTDEF s_aOptions[] = { - { "--prepend", 'p', RTGETOPT_REQ_NOTHING }, - { "--verbose", 'v', RTGETOPT_REQ_NOTHING }, - { "--debug", 'd', RTGETOPT_REQ_NOTHING }, + { "--append", 'A', RTGETOPT_REQ_NOTHING }, + { "/as", 'A', RTGETOPT_REQ_NOTHING }, + { "/a", OPT_IGNORED, RTGETOPT_REQ_NOTHING }, /* select best cert automatically */ + { "--type", 't', RTGETOPT_REQ_STRING }, + { "/fd", 't', RTGETOPT_REQ_STRING }, + { "--hash-pages", OPT_HASH_PAGES, RTGETOPT_REQ_NOTHING }, + { "/ph", OPT_HASH_PAGES, RTGETOPT_REQ_NOTHING }, + { "--no-hash-pages", OPT_NO_HASH_PAGES, RTGETOPT_REQ_NOTHING }, + { "/nph", OPT_NO_HASH_PAGES, RTGETOPT_REQ_NOTHING }, + { "--add-cert", OPT_ADD_CERT, RTGETOPT_REQ_STRING }, + { "/ac", OPT_ADD_CERT, RTGETOPT_REQ_STRING }, + { "--description", 'd', RTGETOPT_REQ_STRING }, + { "--desc", 'd', RTGETOPT_REQ_STRING }, + { "/d", 'd', RTGETOPT_REQ_STRING }, + { "--description-url", 'D', RTGETOPT_REQ_STRING }, + { "--desc-url", 'D', RTGETOPT_REQ_STRING }, + { "/du", 'D', RTGETOPT_REQ_STRING }, + { "--no-signing-time", OPT_NO_SIGNING_TIME, RTGETOPT_REQ_NOTHING }, + OPT_CERT_KEY_GETOPTDEF_ENTRIES("--", 1000), + OPT_CERT_KEY_GETOPTDEF_COMPAT_ENTRIES( 1000), + OPT_CERT_KEY_GETOPTDEF_ENTRIES("--timestamp-", 1020), + { "--timestamp-type", OPT_TIMESTAMP_TYPE, RTGETOPT_REQ_STRING }, + { "--timestamp-override", OPT_TIMESTAMP_OVERRIDE, RTGETOPT_REQ_STRING }, + { "--file-type", OPT_FILE_TYPE, RTGETOPT_REQ_STRING }, + { "--verbose", 'v', RTGETOPT_REQ_NOTHING }, + { "/v", 'v', RTGETOPT_REQ_NOTHING }, + { "/debug", 'v', RTGETOPT_REQ_NOTHING }, }; - const char *pszDst = NULL; - const char *pszSrc = NULL; - unsigned cVerbosity = 0; - bool fDebug = false; - bool fPrepend = false; + unsigned cVerbosity = 0; + RTDIGESTTYPE enmSigType = RTDIGESTTYPE_SHA1; + bool fReplaceExisting = true; + bool fHashPages = false; + bool fNoSigningTime = false; + RTSIGNTOOLFILETYPE enmForceFileType = RTSIGNTOOLFILETYPE_DETECT; + SignToolKeyPair SigningCertKey("signing", true); + RTCRSTORE hAddCerts = NIL_RTCRSTORE; /* leaked if returning directly (--help, --version) */ + const char *pszDescription = NULL; /** @todo implement putting descriptions into the OpusInfo stuff. */ + const char *pszDescriptionUrl = NULL; + bool fTimestampTypeOld = true; + SignToolKeyPair TimestampCertKey("timestamp"); + RTTIMESPEC SigningTime; + RTTimeNow(&SigningTime); - RTGETOPTSTATE GetState; + RTGETOPTSTATE GetState; int rc = RTGetOptInit(&GetState, cArgs, papszArgs, s_aOptions, RT_ELEMENTS(s_aOptions), 1, RTGETOPTINIT_FLAGS_OPTS_FIRST); AssertRCReturn(rc, RTEXITCODE_FAILURE); - RTGETOPTUNION ValueUnion; - int ch; + + RTEXITCODE rcExit = RTEXITCODE_SUCCESS; + RTGETOPTUNION ValueUnion; + int ch; while ((ch = RTGetOpt(&GetState, &ValueUnion))) { + RTEXITCODE rcExit2 = RTEXITCODE_SUCCESS; switch (ch) { - case 'v': cVerbosity++; break; - case 'd': fDebug = pszSrc == NULL; break; - case 'p': fPrepend = true; break; - case 'V': return HandleVersion(cArgs, papszArgs); - case 'h': return HelpAddNestedCatSignature(g_pStdOut, RTSIGNTOOLHELP_FULL); + OPT_CERT_KEY_SWITCH_CASES(SigningCertKey, 1000, ch, ValueUnion, rcExit2); + OPT_CERT_KEY_SWITCH_CASES(TimestampCertKey, 1020, ch, ValueUnion, rcExit2); + case 't': rcExit2 = HandleOptSignatureType(&enmSigType, ValueUnion.psz); break; + case 'A': fReplaceExisting = false; break; + case 'd': pszDescription = ValueUnion.psz; break; + case 'D': pszDescriptionUrl = ValueUnion.psz; break; + case OPT_HASH_PAGES: fHashPages = true; break; + case OPT_NO_HASH_PAGES: fHashPages = false; break; + case OPT_NO_SIGNING_TIME: fNoSigningTime = true; break; + case OPT_ADD_CERT: rcExit2 = HandleOptAddCert(&hAddCerts, ValueUnion.psz); break; + case OPT_TIMESTAMP_TYPE: rcExit2 = HandleOptTimestampType(&fTimestampTypeOld, ValueUnion.psz); break; + case OPT_TIMESTAMP_OVERRIDE: rcExit2 = HandleOptTimestampOverride(&SigningTime, ValueUnion.psz); break; + case OPT_FILE_TYPE: rcExit2 = HandleOptFileType(&enmForceFileType, ValueUnion.psz); break; + case OPT_IGNORED: break; + case 'v': cVerbosity++; break; + case 'V': return HandleVersion(cArgs, papszArgs); + case 'h': return HelpSign(g_pStdOut, RTSIGNTOOLHELP_FULL); case VINF_GETOPT_NOT_OPTION: - if (!pszDst) - pszDst = ValueUnion.psz; - else if (!pszSrc) + /* + * Do final certificate and key option processing (first file only). + */ + rcExit2 = SigningCertKey.finalizeOptions(cVerbosity); + if (rcExit2 == RTEXITCODE_SUCCESS) + rcExit2 = TimestampCertKey.finalizeOptions(cVerbosity); + if (rcExit2 == RTEXITCODE_SUCCESS) { - pszSrc = ValueUnion.psz; - fDebug = false; + /* + * Detect file type. + */ + RTSIGNTOOLFILETYPE enmFileType = DetectFileType(enmForceFileType, ValueUnion.psz); + if (enmFileType == RTSIGNTOOLFILETYPE_EXE) + { + /* + * Sign executable image. + */ + SIGNTOOLPKCS7EXE Exe; + rcExit2 = SignToolPkcs7Exe_InitFromFile(&Exe, ValueUnion.psz, cVerbosity, + RTLDRARCH_WHATEVER, true /*fAllowUnsigned*/); + if (rcExit2 == RTEXITCODE_SUCCESS) + { + rcExit2 = SignToolPkcs7_AddOrReplaceSignature(&Exe, cVerbosity, enmSigType, fReplaceExisting, + fHashPages, fNoSigningTime, &SigningCertKey, hAddCerts, + fTimestampTypeOld, SigningTime, &TimestampCertKey); + if (rcExit2 == RTEXITCODE_SUCCESS) + rcExit2 = SignToolPkcs7_Encode(&Exe, cVerbosity); + if (rcExit2 == RTEXITCODE_SUCCESS) + rcExit2 = SignToolPkcs7Exe_WriteSignatureToFile(&Exe, cVerbosity); + SignToolPkcs7Exe_Delete(&Exe); + } + } + else if (enmFileType == RTSIGNTOOLFILETYPE_CAT) + { + /* + * Sign catalog file. + */ + SIGNTOOLPKCS7 Cat; + rcExit2 = SignToolPkcs7_InitFromFile(&Cat, ValueUnion.psz, cVerbosity); + if (rcExit2 == RTEXITCODE_SUCCESS) + { + rcExit2 = SignToolPkcs7_AddOrReplaceCatSignature(&Cat, cVerbosity, enmSigType, fReplaceExisting, + fNoSigningTime, &SigningCertKey, hAddCerts, + fTimestampTypeOld, SigningTime, &TimestampCertKey); + if (rcExit2 == RTEXITCODE_SUCCESS) + rcExit2 = SignToolPkcs7_Encode(&Cat, cVerbosity); + if (rcExit2 == RTEXITCODE_SUCCESS) + rcExit2 = SignToolPkcs7_WriteSignatureToFile(&Cat, ValueUnion.psz, cVerbosity); + SignToolPkcs7_Delete(&Cat); + } + } + else + rcExit2 = RTEXITCODE_FAILURE; + if (rcExit2 != RTEXITCODE_SUCCESS && rcExit == RTEXITCODE_SUCCESS) + rcExit = rcExit2; + rcExit2 = RTEXITCODE_SUCCESS; } - else - return RTMsgErrorExit(RTEXITCODE_FAILURE, "Too many file arguments: %s", ValueUnion.psz); break; default: return RTGetOptPrintError(ch, &ValueUnion); } - } - if (!pszDst) - return RTMsgErrorExit(RTEXITCODE_FAILURE, "No destination catalog file given."); - if (!pszSrc && !fDebug) - return RTMsgErrorExit(RTEXITCODE_FAILURE, "No source catalog file given."); - - /* - * Do it. - */ - /* Read & decode the source PKCS#7 signature. */ - SIGNTOOLPKCS7 Src; - RTEXITCODE rcExit = pszSrc ? SignToolPkcs7_InitFromFile(&Src, pszSrc, cVerbosity) : RTEXITCODE_SUCCESS; - if (rcExit == RTEXITCODE_SUCCESS) - { - /* Ditto for the destination PKCS#7 signature. */ - SIGNTOOLPKCS7EXE Dst; - rcExit = SignToolPkcs7_InitFromFile(&Dst, pszDst, cVerbosity); - if (rcExit == RTEXITCODE_SUCCESS) + if (rcExit2 != RTEXITCODE_SUCCESS) { - /* Do the signature manipulation. */ - if (pszSrc) - rcExit = SignToolPkcs7_AddNestedSignature(&Dst, &Src, cVerbosity, fPrepend); - if (rcExit == RTEXITCODE_SUCCESS) - rcExit = SignToolPkcs7_Encode(&Dst, cVerbosity); - - /* Update the destination executable file. */ - if (rcExit == RTEXITCODE_SUCCESS) - rcExit = SignToolPkcs7_WriteSignatureToFile(&Dst, pszDst, cVerbosity); - - SignToolPkcs7_Delete(&Dst); + rcExit = rcExit2; + break; } - if (pszSrc) - SignToolPkcs7_Delete(&Src); } + if (hAddCerts != NIL_RTCRSTORE) + RTCrStoreRelease(hAddCerts); return rcExit; } +#endif /*!IPRT_SIGNTOOL_NO_SIGNING */ + + +/********************************************************************************************************************************* +* The 'verify-exe' command. * +*********************************************************************************************************************************/ #ifndef IPRT_IN_BUILD_TOOL -/* - * The 'verify-exe' command. - */ static RTEXITCODE HelpVerifyExe(PRTSTREAM pStrm, RTSIGNTOOLHELP enmLevel) { RT_NOREF_PV(enmLevel); - RTStrmPrintf(pStrm, - "verify-exe [--verbose|--quiet] [--kernel] [--root ] [--additional ]\n" - " [--type ] [exe2 [..]]\n"); + RTStrmWrappedPrintf(pStrm, RTSTRMWRAPPED_F_HANGING_INDENT, + "verify-exe [--verbose|--quiet] [--kernel] [--root ] [--additional ] " + "[--type ] [exe2 [..]]\n"); return RTEXITCODE_SUCCESS; } @@ -1255,6 +3907,7 @@ uint32_t cBad; uint32_t cOkay; const char *pszFilename; + RTTIMESPEC ValidationTime; } VERIFYEXESTATE; # ifdef VBOX @@ -1425,16 +4078,24 @@ /* * We'll try different alternative timestamps here. */ - struct { RTTIMESPEC TimeSpec; const char *pszDesc; } aTimes[2]; + struct { RTTIMESPEC TimeSpec; const char *pszDesc; } aTimes[3]; unsigned cTimes = 0; + /* The specified timestamp. */ + if (RTTimeSpecGetSeconds(&pState->ValidationTime) != 0) + { + aTimes[cTimes].TimeSpec = pState->ValidationTime; + aTimes[cTimes].pszDesc = "validation time"; + cTimes++; + } + /* Linking timestamp: */ uint64_t uLinkingTime = 0; int rc = RTLdrQueryProp(hLdrMod, RTLDRPROP_TIMESTAMP_SECONDS, &uLinkingTime, sizeof(uLinkingTime)); if (RT_SUCCESS(rc)) { - RTTimeSpecSetSeconds(&aTimes[0].TimeSpec, uLinkingTime); - aTimes[0].pszDesc = "at link time"; + RTTimeSpecSetSeconds(&aTimes[cTimes].TimeSpec, uLinkingTime); + aTimes[cTimes].pszDesc = "at link time"; cTimes++; } else if (rc != VERR_NOT_FOUND) @@ -1552,13 +4213,14 @@ */ static const RTGETOPTDEF s_aOptions[] = { - { "--kernel", 'k', RTGETOPT_REQ_NOTHING }, - { "--root", 'r', RTGETOPT_REQ_STRING }, - { "--additional", 'a', RTGETOPT_REQ_STRING }, - { "--add", 'a', RTGETOPT_REQ_STRING }, - { "--type", 't', RTGETOPT_REQ_STRING }, - { "--verbose", 'v', RTGETOPT_REQ_NOTHING }, - { "--quiet", 'q', RTGETOPT_REQ_NOTHING }, + { "--kernel", 'k', RTGETOPT_REQ_NOTHING }, + { "--root", 'r', RTGETOPT_REQ_STRING }, + { "--additional", 'a', RTGETOPT_REQ_STRING }, + { "--add", 'a', RTGETOPT_REQ_STRING }, + { "--type", 't', RTGETOPT_REQ_STRING }, + { "--validation-time", 'T', RTGETOPT_REQ_STRING }, + { "--verbose", 'v', RTGETOPT_REQ_NOTHING }, + { "--quiet", 'q', RTGETOPT_REQ_NOTHING }, }; VERIFYEXESTATE State = @@ -1574,6 +4236,7 @@ rc = RTCrStoreCreateInMem(&State.hAdditionalStore, 0); if (RT_FAILURE(rc)) return RTMsgErrorExit(RTEXITCODE_FAILURE, "Error creating in-memory certificate store: %Rrc", rc); + RTTimeSpecSetSeconds(&State.ValidationTime, 0); RTGETOPTSTATE GetState; rc = RTGetOptInit(&GetState, cArgs, papszArgs, s_aOptions, RT_ELEMENTS(s_aOptions), 1, RTGETOPTINIT_FLAGS_OPTS_FIRST); @@ -1604,6 +4267,11 @@ return RTMsgErrorExit(RTEXITCODE_SYNTAX, "Unknown signing type: '%s'", ValueUnion.psz); break; + case 'T': + if (!RTTimeSpecFromString(&State.ValidationTime, ValueUnion.psz)) + return RTMsgErrorExit(RTEXITCODE_SYNTAX, "Invalid validation time (%s): %Rrc", ValueUnion.psz, rc); + break; + case 'k': State.fKernel = true; break; case 'v': State.cVerbose++; break; case 'q': State.cVerbose = 0; break; @@ -1758,6 +4426,8 @@ static int HandleShowExeWorkerPkcs7DisplayAttrib(PSHOWEXEPKCS7 pThis, size_t offPrefix, PCRTCRPKCS7ATTRIBUTE pAttr) { HandleShowExeWorkerDisplayObjId(pThis, &pAttr->Type, "", ":\n"); + if (pThis->cVerbosity > 4 && pAttr->SeqCore.Asn1Core.uData.pu8) + RTPrintf("%s uData.pu8=%p cb=%#x\n", pThis->szPrefix, pAttr->SeqCore.Asn1Core.uData.pu8, pAttr->SeqCore.Asn1Core.cb); int rc = VINF_SUCCESS; switch (pAttr->enmType) @@ -1832,8 +4502,21 @@ /* Counter signatures (PKCS \#9), use pCounterSignatures. */ case RTCRPKCS7ATTRIBUTETYPE_COUNTER_SIGNATURES: - RTPrintf("%sTODO: RTCRPKCS7ATTRIBUTETYPE_COUNTER_SIGNATURES! %u bytes\n", - pThis->szPrefix, pAttr->uValues.pCounterSignatures->SetCore.Asn1Core.cb); + RTPrintf("%s%u counter signatures, %u bytes in total\n", pThis->szPrefix, + pAttr->uValues.pCounterSignatures->cItems, pAttr->uValues.pCounterSignatures->SetCore.Asn1Core.cb); + for (uint32_t i = 0; i < pAttr->uValues.pCounterSignatures->cItems; i++) + { + size_t offPrefix2 = offPrefix; + if (pAttr->uValues.pContentInfos->cItems > 1) + offPrefix2 += RTStrPrintf(&pThis->szPrefix[offPrefix], sizeof(pThis->szPrefix) - offPrefix, "CounterSig[%u]: ", i); + else + offPrefix2 += RTStrPrintf(&pThis->szPrefix[offPrefix], sizeof(pThis->szPrefix) - offPrefix, " "); + + int rc2 = HandleShowExeWorkerPkcs7DisplaySignerInfo(pThis, offPrefix2, + pAttr->uValues.pCounterSignatures->papItems[i]); + if (RT_FAILURE(rc2) && RT_SUCCESS(rc)) + rc = rc2; + } break; /* Signing time (PKCS \#9), use pSigningTime. */ @@ -1934,6 +4617,76 @@ /** + * Displays a SignerInfo structure. + * + * @returns IPRT status code. + * @param pThis The show exe instance data. + * @param offPrefix The current prefix offset. + * @param pSignerInfo The structure to display. + */ +static int HandleShowExeWorkerPkcs7DisplaySignerInfo(PSHOWEXEPKCS7 pThis, size_t offPrefix, PCRTCRPKCS7SIGNERINFO pSignerInfo) +{ + int rc = RTAsn1Integer_ToString(&pSignerInfo->IssuerAndSerialNumber.SerialNumber, + pThis->szTmp, sizeof(pThis->szTmp), 0 /*fFlags*/, NULL); + if (RT_FAILURE(rc)) + RTStrPrintf(pThis->szTmp, sizeof(pThis->szTmp), "%Rrc", rc); + RTPrintf("%s Serial No: %s\n", pThis->szPrefix, pThis->szTmp); + + rc = RTCrX509Name_FormatAsString(&pSignerInfo->IssuerAndSerialNumber.Name, pThis->szTmp, sizeof(pThis->szTmp), NULL); + if (RT_FAILURE(rc)) + RTStrPrintf(pThis->szTmp, sizeof(pThis->szTmp), "%Rrc", rc); + RTPrintf("%s Issuer: %s\n", pThis->szPrefix, pThis->szTmp); + + const char *pszType = RTCrDigestTypeToName(RTCrX509AlgorithmIdentifier_QueryDigestType(&pSignerInfo->DigestAlgorithm)); + if (!pszType) + pszType = pSignerInfo->DigestAlgorithm.Algorithm.szObjId; + RTPrintf("%s Digest Algorithm: %s", pThis->szPrefix, pszType); + if (pThis->cVerbosity > 1) + RTPrintf(" (%s)\n", pSignerInfo->DigestAlgorithm.Algorithm.szObjId); + else + RTPrintf("\n"); + + HandleShowExeWorkerDisplayObjId(pThis, &pSignerInfo->DigestEncryptionAlgorithm.Algorithm, + "Digest Encryption Algorithm: ", "\n"); + + if (pSignerInfo->AuthenticatedAttributes.cItems == 0) + RTPrintf("%s Authenticated Attributes: none\n", pThis->szPrefix); + else + { + RTPrintf("%s Authenticated Attributes: %u item%s\n", pThis->szPrefix, + pSignerInfo->AuthenticatedAttributes.cItems, pSignerInfo->AuthenticatedAttributes.cItems > 1 ? "s" : ""); + for (unsigned j = 0; j < pSignerInfo->AuthenticatedAttributes.cItems; j++) + { + PRTCRPKCS7ATTRIBUTE pAttr = pSignerInfo->AuthenticatedAttributes.papItems[j]; + size_t offPrefix3 = offPrefix+ RTStrPrintf(&pThis->szPrefix[offPrefix], sizeof(pThis->szPrefix) - offPrefix, + " AuthAttrib[%u]: ", j); + HandleShowExeWorkerPkcs7DisplayAttrib(pThis, offPrefix3, pAttr); + } + pThis->szPrefix[offPrefix] = '\0'; + } + + if (pSignerInfo->UnauthenticatedAttributes.cItems == 0) + RTPrintf("%s Unauthenticated Attributes: none\n", pThis->szPrefix); + else + { + RTPrintf("%s Unauthenticated Attributes: %u item%s\n", pThis->szPrefix, + pSignerInfo->UnauthenticatedAttributes.cItems, pSignerInfo->UnauthenticatedAttributes.cItems > 1 ? "s" : ""); + for (unsigned j = 0; j < pSignerInfo->UnauthenticatedAttributes.cItems; j++) + { + PRTCRPKCS7ATTRIBUTE pAttr = pSignerInfo->UnauthenticatedAttributes.papItems[j]; + size_t offPrefix3 = offPrefix + RTStrPrintf(&pThis->szPrefix[offPrefix], sizeof(pThis->szPrefix) - offPrefix, + " UnauthAttrib[%u]: ", j); + HandleShowExeWorkerPkcs7DisplayAttrib(pThis, offPrefix3, pAttr); + } + pThis->szPrefix[offPrefix] = '\0'; + } + + /** @todo show the encrypted stuff (EncryptedDigest)? */ + return rc; +} + + +/** * Displays a Microsoft SPC indirect data structure. * * @returns IPRT status code. @@ -2079,6 +4832,28 @@ RTPrintf("%s File: '%s'\n", pThis->szPrefix, pszFile); else RTPrintf("%s File: rc=%Rrc\n", pThis->szPrefix, rc); + if (pThis->cVerbosity > 4 && pPeImage->T0.File.u.pT2 == NULL) + RTPrintf("%s pT2=NULL\n", pThis->szPrefix); + else if (pThis->cVerbosity > 4) + { + PCRTASN1STRING pStr = pPeImage->T0.File.u.pT2->File.u.pAscii; + RTPrintf("%s pT2=%p/%p LB %#x fFlags=%#x pOps=%p (%s)\n" + "%s enmChoice=%d pStr=%p/%p LB %#x fFlags=%#x\n", + pThis->szPrefix, + pPeImage->T0.File.u.pT2, + pPeImage->T0.File.u.pT2->CtxTag2.Asn1Core.uData.pu8, + pPeImage->T0.File.u.pT2->CtxTag2.Asn1Core.cb, + pPeImage->T0.File.u.pT2->CtxTag2.Asn1Core.fFlags, + pPeImage->T0.File.u.pT2->CtxTag2.Asn1Core.pOps, + pPeImage->T0.File.u.pT2->CtxTag2.Asn1Core.pOps + ? pPeImage->T0.File.u.pT2->CtxTag2.Asn1Core.pOps->pszName : "", + pThis->szPrefix, + pPeImage->T0.File.u.pT2->File.enmChoice, + pStr, + pStr ? pStr->Asn1Core.uData.pu8 : NULL, + pStr ? pStr->Asn1Core.cb : 0, + pStr ? pStr->Asn1Core.fFlags : 0); + } break; } @@ -2154,7 +4929,11 @@ pThis->szPrefix[offPrefix] = '\0'; } else + { HandleShowExeWorkerDisplayObjId(pThis, &pSignedData->ContentInfo.ContentType, " ContentType: ", " - not implemented.\n"); + RTPrintf("%s %u (%#x) bytes\n", pThis->szPrefix, + pSignedData->ContentInfo.Content.Asn1Core.cb, pSignedData->ContentInfo.Content.Asn1Core.cb); + } /* * Display certificates (Certificates). @@ -2162,17 +4941,53 @@ if (pSignedData->Certificates.cItems > 0) { RTPrintf("%s Certificates: %u\n", pThis->szPrefix, pSignedData->Certificates.cItems); - if (pThis->cVerbosity >= 2) + for (uint32_t i = 0; i < pSignedData->Certificates.cItems; i++) { - for (uint32_t i = 0; i < pSignedData->Certificates.cItems; i++) + PCRTCRPKCS7CERT pCert = pSignedData->Certificates.papItems[i]; + if (i != 0 && pThis->cVerbosity >= 2) + RTPrintf("\n"); + switch (pCert->enmChoice) { - if (i != 0) - RTPrintf("\n"); - RTPrintf("%s Certificate #%u:\n", pThis->szPrefix, i); + case RTCRPKCS7CERTCHOICE_X509: + { + PCRTCRX509CERTIFICATE pX509Cert = pCert->u.pX509Cert; + int rc2 = RTAsn1QueryObjIdName(&pX509Cert->SignatureAlgorithm.Algorithm, pThis->szTmp, sizeof(pThis->szTmp)); + RTPrintf("%s Certificate #%u: %s\n", pThis->szPrefix, i, + RT_SUCCESS(rc2) ? pThis->szTmp : pX509Cert->SignatureAlgorithm.Algorithm.szObjId); + + rc2 = RTCrX509Name_FormatAsString(&pX509Cert->TbsCertificate.Subject, + pThis->szTmp, sizeof(pThis->szTmp), NULL); + if (RT_FAILURE(rc2)) + RTStrPrintf(pThis->szTmp, sizeof(pThis->szTmp), "%Rrc", rc2); + RTPrintf("%s Subject: %s\n", pThis->szPrefix, pThis->szTmp); + + rc2 = RTCrX509Name_FormatAsString(&pX509Cert->TbsCertificate.Issuer, + pThis->szTmp, sizeof(pThis->szTmp), NULL); + if (RT_FAILURE(rc2)) + RTStrPrintf(pThis->szTmp, sizeof(pThis->szTmp), "%Rrc", rc2); + RTPrintf("%s Issuer: %s\n", pThis->szPrefix, pThis->szTmp); + + + char szNotAfter[RTTIME_STR_LEN]; + RTPrintf("%s Valid: %s thru %s\n", pThis->szPrefix, + RTTimeToString(&pX509Cert->TbsCertificate.Validity.NotBefore.Time, + pThis->szTmp, sizeof(pThis->szTmp)), + RTTimeToString(&pX509Cert->TbsCertificate.Validity.NotAfter.Time, + szNotAfter, sizeof(szNotAfter))); + break; + } + + default: + RTPrintf("%s Certificate #%u: Unsupported type\n", pThis->szPrefix, i); + break; + } + + + if (pThis->cVerbosity >= 2) RTAsn1Dump(RTCrPkcs7Cert_GetAsn1Core(pSignedData->Certificates.papItems[i]), 0, ((uint32_t)offPrefix + 9) / 2, RTStrmDumpPrintfV, g_pStdOut); - } } + /** @todo display certificates properly. */ } @@ -2187,73 +5002,20 @@ RTPrintf("%s SignerInfos: %u signers\n", pThis->szPrefix, cSigInfos); else RTPrintf("%s SignerInfos:\n", pThis->szPrefix); + int rc = VINF_SUCCESS; for (unsigned i = 0; i < cSigInfos; i++) { - PRTCRPKCS7SIGNERINFO pSigInfo = pSignedData->SignerInfos.papItems[i]; size_t offPrefix2 = offPrefix; if (cSigInfos != 1) offPrefix2 += RTStrPrintf(&pThis->szPrefix[offPrefix], sizeof(pThis->szPrefix) - offPrefix, "SignerInfo[%u]: ", i); - int rc = RTAsn1Integer_ToString(&pSigInfo->IssuerAndSerialNumber.SerialNumber, - pThis->szTmp, sizeof(pThis->szTmp), 0 /*fFlags*/, NULL); - if (RT_FAILURE(rc)) - RTStrPrintf(pThis->szTmp, sizeof(pThis->szTmp), "%Rrc", rc); - RTPrintf("%s Serial No: %s\n", pThis->szPrefix, pThis->szTmp); - - rc = RTCrX509Name_FormatAsString(&pSigInfo->IssuerAndSerialNumber.Name, pThis->szTmp, sizeof(pThis->szTmp), NULL); - if (RT_FAILURE(rc)) - RTStrPrintf(pThis->szTmp, sizeof(pThis->szTmp), "%Rrc", rc); - RTPrintf("%s Issuer: %s\n", pThis->szPrefix, pThis->szTmp); - - const char *pszType = RTCrDigestTypeToName(RTCrX509AlgorithmIdentifier_QueryDigestType(&pSigInfo->DigestAlgorithm)); - if (!pszType) - pszType = pSigInfo->DigestAlgorithm.Algorithm.szObjId; - RTPrintf("%s Digest Algorithm: %s", pThis->szPrefix, pszType); - if (pThis->cVerbosity > 1) - RTPrintf(" (%s)\n", pSigInfo->DigestAlgorithm.Algorithm.szObjId); - else - RTPrintf("\n"); - - HandleShowExeWorkerDisplayObjId(pThis, &pSigInfo->DigestEncryptionAlgorithm.Algorithm, - "Digest Encryption Algorithm: ", "\n"); - - if (pSigInfo->AuthenticatedAttributes.cItems == 0) - RTPrintf("%s Authenticated Attributes: none\n", pThis->szPrefix); - else - { - RTPrintf("%s Authenticated Attributes: %u item%s\n", pThis->szPrefix, - pSigInfo->AuthenticatedAttributes.cItems, pSigInfo->AuthenticatedAttributes.cItems > 1 ? "s" : ""); - for (unsigned j = 0; j < pSigInfo->AuthenticatedAttributes.cItems; j++) - { - PRTCRPKCS7ATTRIBUTE pAttr = pSigInfo->AuthenticatedAttributes.papItems[j]; - size_t offPrefix3 = offPrefix2 + RTStrPrintf(&pThis->szPrefix[offPrefix2], sizeof(pThis->szPrefix) - offPrefix2, - " AuthAttrib[%u]: ", j); - HandleShowExeWorkerPkcs7DisplayAttrib(pThis, offPrefix3, pAttr); - } - pThis->szPrefix[offPrefix2] = '\0'; - } - - if (pSigInfo->UnauthenticatedAttributes.cItems == 0) - RTPrintf("%s Unauthenticated Attributes: none\n", pThis->szPrefix); - else - { - RTPrintf("%s Unauthenticated Attributes: %u item%s\n", pThis->szPrefix, - pSigInfo->UnauthenticatedAttributes.cItems, pSigInfo->UnauthenticatedAttributes.cItems > 1 ? "s" : ""); - for (unsigned j = 0; j < pSigInfo->UnauthenticatedAttributes.cItems; j++) - { - PRTCRPKCS7ATTRIBUTE pAttr = pSigInfo->UnauthenticatedAttributes.papItems[j]; - size_t offPrefix3 = offPrefix2 + RTStrPrintf(&pThis->szPrefix[offPrefix2], sizeof(pThis->szPrefix) - offPrefix2, - " UnauthAttrib[%u]: ", j); - HandleShowExeWorkerPkcs7DisplayAttrib(pThis, offPrefix3, pAttr); - } - pThis->szPrefix[offPrefix2] = '\0'; - } - - /** @todo show the encrypted stuff (EncryptedDigest)? */ + int rc2 = HandleShowExeWorkerPkcs7DisplaySignerInfo(pThis, offPrefix2, pSignedData->SignerInfos.papItems[i]); + if (RT_FAILURE(rc2) && RT_SUCCESS(rc)) + rc = rc2; } pThis->szPrefix[offPrefix] = '\0'; - return VINF_SUCCESS; + return rc; } @@ -2263,8 +5025,7 @@ static RTEXITCODE HelpShowExe(PRTSTREAM pStrm, RTSIGNTOOLHELP enmLevel) { RT_NOREF_PV(enmLevel); - RTStrmPrintf(pStrm, - "show-exe [--verbose|-v] [--quiet|-q] [exe2 [..]]\n"); + RTStrmWrappedPrintf(pStrm, RTSTRMWRAPPED_F_HANGING_INDENT, "show-exe [--verbose|-v] [--quiet|-q] [exe2 [..]]\n"); return RTEXITCODE_SUCCESS; } @@ -2341,8 +5102,7 @@ static RTEXITCODE HelpShowCat(PRTSTREAM pStrm, RTSIGNTOOLHELP enmLevel) { RT_NOREF_PV(enmLevel); - RTStrmPrintf(pStrm, - "show-cat [--verbose|-v] [--quiet|-q] [cat2 [..]]\n"); + RTStrmWrappedPrintf(pStrm, RTSTRMWRAPPED_F_HANGING_INDENT, "show-cat [--verbose|-v] [--quiet|-q] [cat2 [..]]\n"); return RTEXITCODE_SUCCESS; } @@ -2420,8 +5180,8 @@ static RTEXITCODE HelpMakeTaInfo(PRTSTREAM pStrm, RTSIGNTOOLHELP enmLevel) { RT_NOREF_PV(enmLevel); - RTStrmPrintf(pStrm, - "make-tainfo [--verbose|--quiet] [--cert ] [-o|--output] \n"); + RTStrmWrappedPrintf(pStrm, RTSTRMWRAPPED_F_HANGING_INDENT, + "make-tainfo [--verbose|--quiet] [--cert ] [-o|--output] \n"); return RTEXITCODE_SUCCESS; } @@ -2674,8 +5434,13 @@ const g_aCommands[] = { { "extract-exe-signer-cert", HandleExtractExeSignerCert, HelpExtractExeSignerCert }, + { "extract-exe-signature", HandleExtractExeSignature, HelpExtractExeSignature }, { "add-nested-exe-signature", HandleAddNestedExeSignature, HelpAddNestedExeSignature }, { "add-nested-cat-signature", HandleAddNestedCatSignature, HelpAddNestedCatSignature }, +#ifndef IPRT_SIGNTOOL_NO_SIGNING + { "add-timestamp-exe-signature", HandleAddTimestampExeSignature, HelpAddTimestampExeSignature }, + { "sign", HandleSign, HelpSign }, +#endif #ifndef IPRT_IN_BUILD_TOOL { "verify-exe", HandleVerifyExe, HelpVerifyExe }, #endif @@ -2705,6 +5470,9 @@ { RTSIGNTOOLHELP enmLevel = cArgs <= 1 ? RTSIGNTOOLHELP_USAGE : RTSIGNTOOLHELP_FULL; uint32_t cShowed = 0; + uint32_t cchWidth; + if (RT_FAILURE(RTStrmQueryTerminalWidth(g_pStdOut, &cchWidth))) + cchWidth = 80; for (uint32_t iCmd = 0; iCmd < RT_ELEMENTS(g_aCommands); iCmd++) { if (g_aCommands[iCmd].pfnHelp) @@ -2713,16 +5481,17 @@ if (cArgs <= 1) fShow = true; else - { for (int iArg = 1; iArg < cArgs; iArg++) if (RTStrSimplePatternMultiMatch(papszArgs[iArg], RTSTR_MAX, g_aCommands[iCmd].pszCmd, RTSTR_MAX, NULL)) { fShow = true; break; } - } if (fShow) { + if (cShowed && enmLevel == RTSIGNTOOLHELP_FULL) + RTPrintf("%.*s\n", RT_MIN(cchWidth, 100), + "- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - "); g_aCommands[iCmd].pfnHelp(g_pStdOut, enmLevel); cShowed++; } diff -Nru virtualbox-hwe-6.1.34-dfsg/src/VBox/Runtime/VBox/RTAssertShouldPanic-vbox.cpp virtualbox-hwe-6.1.38-dfsg/src/VBox/Runtime/VBox/RTAssertShouldPanic-vbox.cpp --- virtualbox-hwe-6.1.34-dfsg/src/VBox/Runtime/VBox/RTAssertShouldPanic-vbox.cpp 2022-03-22 23:45:15.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/src/VBox/Runtime/VBox/RTAssertShouldPanic-vbox.cpp 2022-09-01 13:28:41.000000000 +0000 @@ -39,6 +39,7 @@ #if defined(DOXYGEN_RUNNING) \ || ( !defined(VBOX_RTASSERT_WITH_GDB) \ && !defined(IN_GUEST) \ + && !defined(IN_RT_STATIC) /* valkit too big, sorry */ \ && !defined(RT_OS_OS2) \ && !defined(RT_OS_WINDOWS)) # define VBOX_RTASSERT_WITH_GDB diff -Nru virtualbox-hwe-6.1.34-dfsg/src/VBox/ValidationKit/Config.kmk virtualbox-hwe-6.1.38-dfsg/src/VBox/ValidationKit/Config.kmk --- virtualbox-hwe-6.1.34-dfsg/src/VBox/ValidationKit/Config.kmk 2022-03-22 23:45:58.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/src/VBox/ValidationKit/Config.kmk 2022-09-01 13:29:24.000000000 +0000 @@ -43,7 +43,9 @@ # TEMPLATE_VBoxValidationKitR3Base = VBox Validation Kit ring-3 program base, both guest and host. TEMPLATE_VBoxValidationKitR3Base_EXTENDS = VBoxR3Static -ifn1of ($(KBUILD_TARGET), darwin solaris win) +ifeq ($(KBUILD_TARGET),win) + TEMPLATE_VBoxValidationKitR3Base_LDFLAGS = $(filter-out -IntegrityCheck, $(TEMPLATE_VBoxR3Static_LDFLAGS)) +else ifn1of ($(KBUILD_TARGET), darwin solaris win) TEMPLATE_VBoxValidationKitR3Base_CFLAGS = $(filter-out -static, $(TEMPLATE_VBoxR3Static_CFLAGS)) TEMPLATE_VBoxValidationKitR3Base_CXXFLAGS = $(filter-out -static, $(TEMPLATE_VBoxR3Static_CXXFLAGS)) TEMPLATE_VBoxValidationKitR3Base_OBJCFLAGS = $(filter-out -static, $(TEMPLATE_VBoxR3Static_OBJCFLAGS)) diff -Nru virtualbox-hwe-6.1.34-dfsg/src/VBox/VMM/VMMAll/IEMAllAImpl.asm virtualbox-hwe-6.1.38-dfsg/src/VBox/VMM/VMMAll/IEMAllAImpl.asm --- virtualbox-hwe-6.1.34-dfsg/src/VBox/VMM/VMMAll/IEMAllAImpl.asm 2022-03-22 23:45:50.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/src/VBox/VMM/VMMAll/IEMAllAImpl.asm 2022-09-01 13:29:16.000000000 +0000 @@ -1901,7 +1901,7 @@ fninit fld tword [A3] FPU_LD_FXSTATE_FCW_AND_SAFE_FSW A0 - fisttp dword [A2] + fisttp word [A2] fnstsw word [A1] diff -Nru virtualbox-hwe-6.1.34-dfsg/src/VBox/VMM/VMMAll/IEMAllCImpl.cpp.h virtualbox-hwe-6.1.38-dfsg/src/VBox/VMM/VMMAll/IEMAllCImpl.cpp.h --- virtualbox-hwe-6.1.34-dfsg/src/VBox/VMM/VMMAll/IEMAllCImpl.cpp.h 2022-03-22 23:45:50.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/src/VBox/VMM/VMMAll/IEMAllCImpl.cpp.h 2022-09-01 13:29:16.000000000 +0000 @@ -2308,12 +2308,10 @@ if ((uNewCs & X86_SEL_RPL) != pVCpu->iem.s.uCpl) { /* Read the outer stack pointer stored *after* the parameters. */ - rcStrict = iemMemStackPopContinueSpecial(pVCpu, cbPop + cbRetPtr, &uPtrFrame.pv, &uNewRsp); + rcStrict = iemMemStackPopContinueSpecial(pVCpu, cbPop /*off*/, cbRetPtr, &uPtrFrame.pv, uNewRsp); if (rcStrict != VINF_SUCCESS) return rcStrict; - uPtrFrame.pu8 += cbPop; /* Skip the parameters. */ - uint16_t uNewOuterSs; uint64_t uNewOuterRsp; if (enmEffOpSize == IEMMODE_16BIT) @@ -2331,7 +2329,6 @@ uNewOuterRsp = uPtrFrame.pu64[0]; uNewOuterSs = uPtrFrame.pu16[4]; } - uPtrFrame.pu8 -= cbPop; /* Put uPtrFrame back the way it was. */ rcStrict = iemMemStackPopDoneSpecial(pVCpu, uPtrFrame.pv); if (RT_LIKELY(rcStrict == VINF_SUCCESS)) { /* extremely likely */ } @@ -3017,7 +3014,7 @@ */ VBOXSTRICTRC rcStrict; RTCPTRUNION uFrame; - rcStrict = iemMemStackPopContinueSpecial(pVCpu, 24, &uFrame.pv, &uNewRsp); + rcStrict = iemMemStackPopContinueSpecial(pVCpu, 0 /*off*/, 24 /*cbMem*/, &uFrame.pv, uNewRsp); if (rcStrict != VINF_SUCCESS) return rcStrict; uint32_t uNewEsp = uFrame.pu32[0]; @@ -3256,7 +3253,7 @@ uint32_t uNewESP; if (enmEffOpSize == IEMMODE_32BIT) { - rcStrict = iemMemStackPopContinueSpecial(pVCpu, 8, &uFrame.pv, &uNewRsp); + rcStrict = iemMemStackPopContinueSpecial(pVCpu, 0/*off*/, 8 /*cbMem*/, &uFrame.pv, uNewRsp); if (rcStrict != VINF_SUCCESS) return rcStrict; /** @todo We might be popping a 32-bit ESP from the IRET frame, but whether @@ -3267,7 +3264,7 @@ } else { - rcStrict = iemMemStackPopContinueSpecial(pVCpu, 4, &uFrame.pv, &uNewRsp); + rcStrict = iemMemStackPopContinueSpecial(pVCpu, 0 /*off*/, 4 /*cbMem*/, &uFrame.pv, uNewRsp); if (rcStrict != VINF_SUCCESS) return rcStrict; uNewESP = uFrame.pu16[0]; diff -Nru virtualbox-hwe-6.1.34-dfsg/src/VBox/VMM/VMMAll/IEMAll.cpp virtualbox-hwe-6.1.38-dfsg/src/VBox/VMM/VMMAll/IEMAll.cpp --- virtualbox-hwe-6.1.34-dfsg/src/VBox/VMM/VMMAll/IEMAll.cpp 2022-03-22 23:45:50.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/src/VBox/VMM/VMMAll/IEMAll.cpp 2022-09-01 13:29:16.000000000 +0000 @@ -10733,27 +10733,37 @@ /** - * Continue a special stack pop (used by iret and retf). + * Continue a special stack pop (used by iret and retf), for the purpose of + * retrieving a new stack pointer. * * This will raise \#SS or \#PF if appropriate. * * @returns Strict VBox status code. * @param pVCpu The cross context virtual CPU structure of the calling thread. + * @param off Offset from the top of the stack. This is zero + * except in the retf case. * @param cbMem The number of bytes to pop from the stack. * @param ppvMem Where to return the pointer to the stack memory. - * @param puNewRsp Where to return the new RSP value. This must be - * assigned to CPUMCTX::rsp manually some time - * after iemMemStackPopDoneSpecial() has been - * called. + * @param uCurNewRsp The current uncommitted RSP value. (No need to + * return this because all use of this function is + * to retrieve a new value and anything we return + * here would be discarded.) */ -IEM_STATIC VBOXSTRICTRC iemMemStackPopContinueSpecial(PVMCPUCC pVCpu, size_t cbMem, void const **ppvMem, uint64_t *puNewRsp) +IEM_STATIC VBOXSTRICTRC iemMemStackPopContinueSpecial(PVMCPUCC pVCpu, size_t off, size_t cbMem, + void const **ppvMem, uint64_t uCurNewRsp) { Assert(cbMem < UINT8_MAX); - RTUINT64U NewRsp; - NewRsp.u = *puNewRsp; - RTGCPTR GCPtrTop = iemRegGetRspForPopEx(pVCpu, &NewRsp, 8); - *puNewRsp = NewRsp.u; - return iemMemMap(pVCpu, (void **)ppvMem, cbMem, X86_SREG_SS, GCPtrTop, IEM_ACCESS_STACK_R); + + /* The essense of iemRegGetRspForPopEx and friends: */ /** @todo put this into a inlined function? */ + RTGCPTR GCPtrTop; + if (pVCpu->iem.s.enmCpuMode == IEMMODE_64BIT) + GCPtrTop = uCurNewRsp; + else if (pVCpu->cpum.GstCtx.ss.Attr.n.u1DefBig) + GCPtrTop = (uint32_t)uCurNewRsp; + else + GCPtrTop = (uint16_t)uCurNewRsp; + + return iemMemMap(pVCpu, (void **)ppvMem, cbMem, X86_SREG_SS, GCPtrTop + off, IEM_ACCESS_STACK_R); } diff -Nru virtualbox-hwe-6.1.34-dfsg/src/VBox/VMM/VMMAll/NEMAllNativeTemplate-win.cpp.h virtualbox-hwe-6.1.38-dfsg/src/VBox/VMM/VMMAll/NEMAllNativeTemplate-win.cpp.h --- virtualbox-hwe-6.1.34-dfsg/src/VBox/VMM/VMMAll/NEMAllNativeTemplate-win.cpp.h 2022-03-22 23:45:51.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/src/VBox/VMM/VMMAll/NEMAllNativeTemplate-win.cpp.h 2022-09-01 13:29:16.000000000 +0000 @@ -4164,7 +4164,7 @@ uint8_t bPendingIntr = 0; int rc = APICGetTpr(pVCpu, &bTpr, &fPendingIntr, &bPendingIntr); AssertRC(rc); - *pfInterruptWindows |= (bPendingIntr >> 4) << NEM_WIN_INTW_F_PRIO_SHIFT; + *pfInterruptWindows |= ((bPendingIntr >> 4) << NEM_WIN_INTW_F_PRIO_SHIFT) | NEM_WIN_INTW_F_REGULAR; Log8(("Interrupt window pending on %u: %#x (bTpr=%#x fPendingIntr=%d bPendingIntr=%#x)\n", pVCpu->idCpu, *pfInterruptWindows, bTpr, fPendingIntr, bPendingIntr)); } diff -Nru virtualbox-hwe-6.1.34-dfsg/src/VBox/VMM/VMMR0/CPUMR0.cpp virtualbox-hwe-6.1.38-dfsg/src/VBox/VMM/VMMR0/CPUMR0.cpp --- virtualbox-hwe-6.1.34-dfsg/src/VBox/VMM/VMMR0/CPUMR0.cpp 2022-03-22 23:45:51.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/src/VBox/VMM/VMMR0/CPUMR0.cpp 2022-09-01 13:29:17.000000000 +0000 @@ -440,6 +440,11 @@ Assert(!(pVCpu->cpum.s.fUseFlags & CPUM_USED_FPU_GUEST)); Assert(!(pVCpu->cpum.s.fUseFlags & CPUM_SYNC_FPU_STATE)); + /* Notify the support driver prior to loading the guest-FPU register state. */ + SUPR0FpuBegin(VMMR0ThreadCtxHookIsEnabled(pVCpu)); + /** @todo use return value? Currently skipping that to be on the safe side + * wrt. extended state (linux). */ + if (!pVM->cpum.s.HostFeatures.fLeakyFxSR) { Assert(!(pVCpu->cpum.s.fUseFlags & CPUM_USED_MANUAL_XMM_RESTORE)); @@ -504,6 +509,9 @@ cpumR0SaveGuestRestoreHostFPUState(&pVCpu->cpum.s); pVCpu->cpum.s.fUseFlags &= ~CPUM_USED_MANUAL_XMM_RESTORE; } + + /* Notify the support driver after loading the host-FPU register state. */ + SUPR0FpuEnd(VMMR0ThreadCtxHookIsEnabled(pVCpu)); } else fSavedGuest = false; diff -Nru virtualbox-hwe-6.1.34-dfsg/src/VBox/VMM/VMMR0/HMVMXR0.cpp virtualbox-hwe-6.1.38-dfsg/src/VBox/VMM/VMMR0/HMVMXR0.cpp --- virtualbox-hwe-6.1.34-dfsg/src/VBox/VMM/VMMR0/HMVMXR0.cpp 2022-03-22 23:45:52.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/src/VBox/VMM/VMMR0/HMVMXR0.cpp 2022-09-01 13:29:18.000000000 +0000 @@ -979,7 +979,6 @@ */ PCVMCC pVM = pVCpu->CTX_SUFF(pVM); bool const fFsGsBase = pVM->cpum.ro.GuestFeatures.fFsGsBase; - bool const fXSaveRstor = pVM->cpum.ro.GuestFeatures.fXSaveRstor; bool const fFxSaveRstor = pVM->cpum.ro.GuestFeatures.fFxSaveRstor; /* @@ -987,18 +986,16 @@ * Ensure features exposed to the guest are present on the host. */ Assert(!fFsGsBase || pVM->cpum.ro.HostFeatures.fFsGsBase); - Assert(!fXSaveRstor || pVM->cpum.ro.HostFeatures.fXSaveRstor); Assert(!fFxSaveRstor || pVM->cpum.ro.HostFeatures.fFxSaveRstor); - uint64_t const fGstMask = ( X86_CR4_PVI - | X86_CR4_TSD - | X86_CR4_DE - | X86_CR4_MCE - | X86_CR4_PCE - | X86_CR4_OSXMMEEXCPT - | (fFsGsBase ? X86_CR4_FSGSBASE : 0) - | (fXSaveRstor ? X86_CR4_OSXSAVE : 0) - | (fFxSaveRstor ? X86_CR4_OSFXSR : 0)); + uint64_t const fGstMask = X86_CR4_PVI + | X86_CR4_TSD + | X86_CR4_DE + | X86_CR4_MCE + | X86_CR4_PCE + | X86_CR4_OSXMMEEXCPT + | (fFsGsBase ? X86_CR4_FSGSBASE : 0) + | (fFxSaveRstor ? X86_CR4_OSFXSR : 0); return ~fGstMask; } diff -Nru virtualbox-hwe-6.1.34-dfsg/src/VBox/VMM/VMMR3/CFGM.cpp virtualbox-hwe-6.1.38-dfsg/src/VBox/VMM/VMMR3/CFGM.cpp --- virtualbox-hwe-6.1.34-dfsg/src/VBox/VMM/VMMR3/CFGM.cpp 2022-03-22 23:45:52.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/src/VBox/VMM/VMMR3/CFGM.cpp 2022-09-01 13:29:18.000000000 +0000 @@ -3236,7 +3236,7 @@ if (pLeaf->Value.Integer.u64 > _2G) pHlp->pfnPrintf(pHlp, ", %'lld.%lld GB", pLeaf->Value.Integer.u64 / _1G, - (pLeaf->Value.Integer.u64 % _1G) / (_1G / 10)); + (pLeaf->Value.Integer.u64 % _1G) / _1K * 10 / _1M); } pHlp->pfnPrintf(pHlp, ")\n"); break; diff -Nru virtualbox-hwe-6.1.34-dfsg/src/VBox/VMM/VMMR3/CPUMR3CpuId.cpp virtualbox-hwe-6.1.38-dfsg/src/VBox/VMM/VMMR3/CPUMR3CpuId.cpp --- virtualbox-hwe-6.1.34-dfsg/src/VBox/VMM/VMMR3/CPUMR3CpuId.cpp 2022-03-22 23:45:52.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/src/VBox/VMM/VMMR3/CPUMR3CpuId.cpp 2022-09-01 13:29:18.000000000 +0000 @@ -4634,6 +4634,46 @@ AssertRCReturn(rc, rc); if (fEnable) CPUMR3SetGuestCpuIdFeature(pVM, CPUMCPUIDFEATURE_SPEC_CTRL); + else + { + /* + * Set the "SSBD-not-needed" flag to work around a bug in some Linux kernels when the VIRT_SPEC_CTL + * feature is not exposed on AMD CPUs and there is only 1 vCPU configured. + * This was observed with kernel "4.15.0-29-generic #31~16.04.1-Ubuntu" but more versions are likely affected. + * + * The kernel doesn't initialize a lock and causes a NULL pointer exception later on when configuring SSBD: + * EIP: _raw_spin_lock+0x14/0x30 + * EFLAGS: 00010046 CPU: 0 + * EAX: 00000000 EBX: 00000001 ECX: 00000004 EDX: 00000000 + * ESI: 00000000 EDI: 00000000 EBP: ee023f1c ESP: ee023f18 + * DS: 007b ES: 007b FS: 00d8 GS: 00e0 SS: 0068 + * CR0: 80050033 CR2: 00000004 CR3: 3671c180 CR4: 000006f0 + * Call Trace: + * speculative_store_bypass_update+0x8e/0x180 + * ssb_prctl_set+0xc0/0xe0 + * arch_seccomp_spec_mitigate+0x1d/0x20 + * do_seccomp+0x3cb/0x610 + * SyS_seccomp+0x16/0x20 + * do_fast_syscall_32+0x7f/0x1d0 + * entry_SYSENTER_32+0x4e/0x7c + * + * The lock would've been initialized in process.c:speculative_store_bypass_ht_init() called from two places in smpboot.c. + * First when a secondary CPU is started and second in native_smp_prepare_cpus() which is not called in a single vCPU environment. + * + * As spectre control features are completely disabled anyway when we arrived here there is no harm done in informing the + * guest to not even try. + */ + if ( pVM->cpum.s.GuestFeatures.enmCpuVendor == CPUMCPUVENDOR_AMD + || pVM->cpum.s.GuestFeatures.enmCpuVendor == CPUMCPUVENDOR_HYGON) + { + PCPUMCPUIDLEAF pLeaf = cpumR3CpuIdGetExactLeaf(&pVM->cpum.s, UINT32_C(0x80000008), 0); + if (pLeaf) + { + pLeaf->uEbx |= X86_CPUID_AMD_EFEID_EBX_NO_SSBD_REQUIRED; + LogRel(("CPUM: Set SSBD not required flag for AMD to work around some buggy Linux kernels!\n")); + } + } + } return VINF_SUCCESS; } diff -Nru virtualbox-hwe-6.1.34-dfsg/src/VBox/VMM/VMMR3/PDMDriver.cpp virtualbox-hwe-6.1.38-dfsg/src/VBox/VMM/VMMR3/PDMDriver.cpp --- virtualbox-hwe-6.1.34-dfsg/src/VBox/VMM/VMMR3/PDMDriver.cpp 2022-03-22 23:45:54.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/src/VBox/VMM/VMMR3/PDMDriver.cpp 2022-09-01 13:29:20.000000000 +0000 @@ -1854,6 +1854,20 @@ } +/** @interface_method_impl{PDMDRVHLPR3,pfnTimerDestroy} */ +static DECLCALLBACK(int) pdmR3DrvHlp_TimerDestroy(PPDMDRVINS pDrvIns, TMTIMERHANDLE hTimer) +{ + PDMDRV_ASSERT_DRVINS(pDrvIns); RT_NOREF(pDrvIns); + LogFlow(("pdmR3DrvHlp_TimerDestroy: caller='%s'/%d: hTimer=%RX64\n", + pDrvIns->pReg->szName, pDrvIns->iInstance, hTimer)); + + int rc = TMR3TimerDestroy((PTMTIMERR3)hTimer); + + LogFlow(("pdmR3DrvHlp_TimerDestroy: caller='%s'/%d: returns %Rrc\n", pDrvIns->pReg->szName, pDrvIns->iInstance, rc)); + return rc; +} + + /** * The driver helper structure. */ @@ -1905,7 +1919,7 @@ pdmR3DrvHlp_VMGetResumeReason, pdmR3DrvHlp_TimerSetMillies, pdmR3DrvHlp_STAMDeregisterByPrefix, - NULL, + pdmR3DrvHlp_TimerDestroy, NULL, NULL, NULL, diff -Nru virtualbox-hwe-6.1.34-dfsg/src/VBox/VMM/VMMR3/PGMSavedState.cpp virtualbox-hwe-6.1.38-dfsg/src/VBox/VMM/VMMR3/PGMSavedState.cpp --- virtualbox-hwe-6.1.34-dfsg/src/VBox/VMM/VMMR3/PGMSavedState.cpp 2022-03-22 23:45:54.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/src/VBox/VMM/VMMR3/PGMSavedState.cpp 2022-09-01 13:29:20.000000000 +0000 @@ -465,7 +465,12 @@ && !PGM_PAGE_IS_BALLOONED(pPage)) { void const *pvPage; - rc = pgmPhysPageMapReadOnly(pVM, pPage, GCPhys, &pvPage); +#ifdef VBOX_WITH_PGM_NEM_MODE + if (!PGMROMPROT_IS_ROM(enmProt) && pVM->pgm.s.fNemMode) + pvPage = &pRom->pbR3Alternate[iPage << PAGE_SHIFT]; + else +#endif + rc = pgmPhysPageMapReadOnly(pVM, pPage, GCPhys, &pvPage); if (RT_SUCCESS(rc)) memcpy(abPage, pvPage, PAGE_SIZE); } @@ -551,7 +556,12 @@ if (!fZero) { void const *pvPage; - rc = pgmPhysPageMapReadOnly(pVM, pPage, GCPhys, &pvPage); +#ifdef VBOX_WITH_PGM_NEM_MODE + if (PGMROMPROT_IS_ROM(enmProt) && pVM->pgm.s.fNemMode) + pvPage = &pRom->pbR3Alternate[iPage << PAGE_SHIFT]; + else +#endif + rc = pgmPhysPageMapReadOnly(pVM, pPage, GCPhys, &pvPage); if (RT_SUCCESS(rc)) memcpy(abPage, pvPage, PAGE_SIZE); } @@ -2880,6 +2890,9 @@ default: AssertLogRelFailedReturn(VERR_IPE_NOT_REACHED_DEFAULT_CASE); /* shut up gcc */ } +#ifdef VBOX_WITH_PGM_NEM_MODE + bool const fAltPage = pRealPage != NULL; +#endif if (!pRealPage) { rc = pgmPhysGetPageWithHintEx(pVM, GCPhys, &pRealPage, &pRamHint); @@ -2900,11 +2913,16 @@ RT_FALL_THRU(); case PGM_STATE_REC_ROM_VIRGIN: case PGM_STATE_REC_ROM_SHW_RAW: - { - rc = pgmPhysPageMakeWritableAndMap(pVM, pRealPage, GCPhys, &pvDstPage); - AssertLogRelMsgRCReturn(rc, ("GCPhys=%RGp rc=%Rrc\n", GCPhys, rc), rc); +#ifdef VBOX_WITH_PGM_NEM_MODE + if (fAltPage && pVM->pgm.s.fNemMode) + pvDstPage = &pRom->pbR3Alternate[iPage << PAGE_SHIFT]; + else +#endif + { + rc = pgmPhysPageMakeWritableAndMap(pVM, pRealPage, GCPhys, &pvDstPage); + AssertLogRelMsgRCReturn(rc, ("GCPhys=%RGp rc=%Rrc\n", GCPhys, rc), rc); + } break; - } } /* diff -Nru virtualbox-hwe-6.1.34-dfsg/Version.kmk virtualbox-hwe-6.1.38-dfsg/Version.kmk --- virtualbox-hwe-6.1.34-dfsg/Version.kmk 2022-03-22 23:34:38.000000000 +0000 +++ virtualbox-hwe-6.1.38-dfsg/Version.kmk 2022-09-01 13:17:42.000000000 +0000 @@ -24,7 +24,7 @@ # 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 = 34 +VBOX_VERSION_BUILD = 38 # This can be overridden in LocalConfig.kmk or elsewhere. # For the convention, see checks near the end of Config.kmk. VBOX_BUILD_PUBLISHER = @@ -32,7 +32,7 @@ VBOX_VERSION_PRERELEASE = # Force a release-type build with exactly matching Additions etc, even if # our numbering does not say this is a release build, by setting this non-empty. -VBOX_RELEASE_EXACT_MATCH = +VBOX_RELEASE_EXACT_MATCH = 1 # Fallback revision when there is no other source. See Config.kmk. -VBOX_SVN_REV_VERSION_FALLBACK := $(patsubst %:,, $Rev: 150636 $ ) +VBOX_SVN_REV_VERSION_FALLBACK := $(patsubst %:,, $Rev: 153438 $ )